mirror of
https://github.com/X11Libre/xserver.git
synced 2026-10-08 23:12:27 +00:00
XFree86 4.3.0.1
This commit is contained in:
parent
9508a382f8
commit
d568221710
438 changed files with 42562 additions and 37394 deletions
|
|
@ -34,13 +34,10 @@ have been made in implementation.
|
|||
at build time via Imakefile rules. This is alway
|
||||
preferable to reproducing functions in more than one
|
||||
OS library.
|
||||
amoeba/ OS support for the Amoeba operating system.
|
||||
bsd/ OS support for the 386BSD/NetBSD/FreeBSD operating
|
||||
systems.
|
||||
bsdi/ OS support for the BSD/386 operating system.
|
||||
linux/ OS support for the Linux operating system.
|
||||
mach/ OS support for the Mach and OSF/1 operating systems.
|
||||
minix/ OS support for the Minix operating system.
|
||||
os2/ OS support for OS/2 2.11 and OS/2 Warp
|
||||
sco/ OS support for the SCO SVR3.x operating system.
|
||||
solx86/ OS support for the Solaris x86 operating system.
|
||||
|
|
@ -75,7 +72,7 @@ void xf86OpenConsole(void)
|
|||
{
|
||||
/*
|
||||
* Open console device, activate VTs, etc, etc. Fill in requisite
|
||||
* pieces of x386Info. Most of this code comes from x386Init.c
|
||||
* pieces of xf86Info. Most of this code comes from xf86Init.c
|
||||
*/
|
||||
}
|
||||
|
||||
|
|
@ -124,8 +121,7 @@ Bool xf86LinearVidMem(void)
|
|||
*/
|
||||
}
|
||||
|
||||
pointer xf86MapVidMem(int ScreenNum, int Region, pointer Base,
|
||||
unsigned long Size)
|
||||
pointer xf86MapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
/*
|
||||
* Handle mapping the video memory. Returns (pointer *)0 for
|
||||
|
|
@ -134,8 +130,7 @@ pointer xf86MapVidMem(int ScreenNum, int Region, pointer Base,
|
|||
*/
|
||||
}
|
||||
|
||||
void xf86UnMapVidMem(int ScreenNum, int Region, pointer Base,
|
||||
unsigned long Size)
|
||||
void xf86UnMapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
/*
|
||||
* Handle unmapping the video memory. This should undo what
|
||||
|
|
@ -173,31 +168,11 @@ int xf86ReadBIOS(unsigned long Base, unsigned long Offset,
|
|||
*/
|
||||
}
|
||||
|
||||
void xf86ClearIOPortList(int ScreenNum)
|
||||
{
|
||||
/*
|
||||
* Clears any list of I/O ports that the OS-layer may be maintaining.
|
||||
* Note: the value used for ScreenNum must be the scrnIndex field
|
||||
* of the screenInfoRec, because this is the only index that is
|
||||
* guaranteed to be valid and never change during the life of the
|
||||
* server. It is not the same as the index of pScreen in ScreenInfo.
|
||||
*/
|
||||
}
|
||||
|
||||
void xf86AddIOPorts(int ScreenNum, int NumPorts, unsigned *Ports)
|
||||
{
|
||||
/*
|
||||
* Adds NumPorts I/O ports listed in array Ports to a list that
|
||||
* the OS-layer may be maintaining. Successive calls to this
|
||||
* function are cumulative.
|
||||
*/
|
||||
}
|
||||
|
||||
void xf86EnableIOPorts(int ScreenNum)
|
||||
{
|
||||
/*
|
||||
* Enables I/O permissions. The OS layer can either use a
|
||||
* previously created list of I/O ports to be used, or can
|
||||
* Enables I/O permissions. The OS layer should
|
||||
* enable all I/O port access.
|
||||
*/
|
||||
}
|
||||
|
|
@ -205,16 +180,7 @@ void xf86EnableIOPorts(int ScreenNum)
|
|||
void xf86DisableIOPorts(int ScreenNum)
|
||||
{
|
||||
/*
|
||||
* Disables I/O permissions. Does not clear the list of I/O
|
||||
* ports, if any exists.
|
||||
*/
|
||||
}
|
||||
|
||||
void xf86DisableIOPrivs(void)
|
||||
{
|
||||
/*
|
||||
* Do whatever is necessary to disable I/O permissions after forking
|
||||
* a child process.
|
||||
* Disables I/O permissions.
|
||||
*/
|
||||
}
|
||||
|
||||
|
|
@ -323,7 +289,7 @@ void xf86KbdEvents(void)
|
|||
{
|
||||
/*
|
||||
* Read characters from the keyboard device, and post the events
|
||||
* by calling x386PostKbdEvent(). Read as much as is available
|
||||
* by calling xf86PostKbdEvent(). Read as much as is available
|
||||
* without waiting.
|
||||
*/
|
||||
}
|
||||
|
|
@ -380,7 +346,7 @@ void xf86MouseEvents(void)
|
|||
{
|
||||
/*
|
||||
* Read characters from the mouse device, and post the events
|
||||
* by calling x386PostMseEvent(). Read as much as is available
|
||||
* by calling xf86PostMseEvent(). Read as much as is available
|
||||
* without waiting. If the OS doesn't handle the mouse protocol
|
||||
* translation, xf86MouseProtocol() may be called to do the
|
||||
* translation and event posting. If the OS does handle the protocol
|
||||
|
|
@ -407,7 +373,7 @@ int xf86OsMouseEvents(void)
|
|||
/*
|
||||
* When supporting an OS-based mouse driver (as opposed to the
|
||||
* server's internal mouse driver), read some events from the device
|
||||
* and post them to the DIX layer through x386PostMseEvent().
|
||||
* and post them to the DIX layer through xf86PostMseEvent().
|
||||
*
|
||||
* This function only needs to be implemented if USE_OSMOUSE is
|
||||
* defined for the OS.
|
||||
|
|
@ -427,11 +393,114 @@ void xf86OsMouseOption(int token, pointer lex_ptr)
|
|||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* The following functions are simply wrappers around the OS specific
|
||||
* libc functions
|
||||
*/
|
||||
|
||||
$XFree86: xc/programs/Xserver/hw/xfree86/os-support/README.OS-lib,v 3.2 1996/12/23 06:48:59 dawes Exp $
|
||||
void *
|
||||
xf86memmove(void * dest, const void * src, INT32 n)
|
||||
{
|
||||
return(memmove(dest,src,n));
|
||||
}
|
||||
|
||||
void *
|
||||
xf86memset(void * s, int c, INT32 n)
|
||||
{
|
||||
return(memset(s,c,n));
|
||||
}
|
||||
|
||||
void *
|
||||
xf86memcpy(void * dest, const void * src, INT32 n)
|
||||
{
|
||||
return(memcpy(dest,src,n));
|
||||
}
|
||||
|
||||
int
|
||||
xf86memcmp(const void * s1, const void * s2, INT32 n)
|
||||
{
|
||||
return(memcmp(s1,s2,n));
|
||||
}
|
||||
|
||||
char *
|
||||
xf86strcat(char * dest, const char * src)
|
||||
{
|
||||
return(strcat(dest,src));
|
||||
}
|
||||
|
||||
char *
|
||||
xf86strcpy(char * dest, const char * src)
|
||||
{
|
||||
return(strcpy(dest,src));
|
||||
}
|
||||
|
||||
int
|
||||
xf86strcmp(const char * s1, const char * s2)
|
||||
{
|
||||
return(strcmp(s1,s2));
|
||||
}
|
||||
|
||||
int
|
||||
xf86strncmp(const char * s1, const char * s2, INT32 n)
|
||||
{
|
||||
return(strncmp(s1,s2,n));
|
||||
}
|
||||
|
||||
size_t
|
||||
xf86strlen(const char * s)
|
||||
{
|
||||
return(strlen(s));
|
||||
}
|
||||
|
||||
void
|
||||
xf86getsecs(INT32 * secs, INT32 * usecs)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
*secs = tv.tv_sec;
|
||||
*usecs= tv.tv_usec;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
double
|
||||
xf86exp(double x)
|
||||
{
|
||||
return(exp(x));
|
||||
}
|
||||
|
||||
double
|
||||
xf86log(double x)
|
||||
{
|
||||
return(log(x));
|
||||
}
|
||||
|
||||
double
|
||||
xf86pow(double x, double y)
|
||||
{
|
||||
return(pow(x,y));
|
||||
}
|
||||
|
||||
double
|
||||
xf86sqrt(double x)
|
||||
{
|
||||
return(sqrt(x));
|
||||
}
|
||||
|
||||
double
|
||||
xf86cos(double x)
|
||||
{
|
||||
return(cos(x));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$XFree86: xc/programs/Xserver/hw/xfree86/os-support/README.OS-lib,v 3.10 2001/12/17 20:00:45 dawes Exp $
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$Xorg: README.OS-lib,v 1.3 2000/08/17 19:51:19 cpqbld Exp $
|
||||
$XConsortium: README.OS-lib /main/5 1996/02/21 17:50:28 kaleb $
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/assyntax.h,v 3.7.2.2 1997/05/11 02:56:22 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/assyntax.h,v 3.12 1999/12/27 00:39:46 robin Exp $ */
|
||||
#ifndef __ASSYNTAX_H__
|
||||
#define __ASSYNTAX_H__
|
||||
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
/* $Xorg: assyntax.h,v 1.3 2000/08/17 19:51:19 cpqbld Exp $ */
|
||||
/* $XConsortium: assyntax.h /main/5 1996/02/21 17:50:49 kaleb $ */
|
||||
|
||||
/*
|
||||
* assyntax.h
|
||||
|
|
@ -212,7 +212,7 @@
|
|||
#endif /* ACK_ASSEMBLER */
|
||||
|
||||
|
||||
#if defined(Lynx) || (defined(SYSV) || defined(SVR4)) && !defined(ACK_ASSEMBLER) || (defined(linux) || defined(__OS2ELF__)) && defined(__ELF__)
|
||||
#if defined(__QNX__) || defined(Lynx) || (defined(SYSV) || defined(SVR4)) && !defined(ACK_ASSEMBLER) || defined(__ELF__) || defined(__GNU__)
|
||||
#define GLNAME(a) a
|
||||
#else
|
||||
#define GLNAME(a) CONCAT(_,a)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_VTsw.c,v 3.5 1996/12/23 06:49:35 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_VTsw.c,v 3.6 1998/07/25 16:56:33 dawes Exp $ */
|
||||
/*
|
||||
* Derived from VTsw_usl.c which is
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
|
|
@ -23,12 +23,9 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: bsd_VTsw.c,v 1.3 2000/08/17 19:51:21 cpqbld Exp $ */
|
||||
/* $XConsortium: bsd_VTsw.c /main/4 1996/02/21 17:50:57 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
|
@ -42,8 +39,8 @@
|
|||
* This function is the signal handler for the VT-switching signal. It
|
||||
* is only referenced inside the OS-support layer.
|
||||
*/
|
||||
void xf86VTRequest(sig)
|
||||
int sig;
|
||||
void
|
||||
xf86VTRequest(int sig)
|
||||
{
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) {
|
||||
|
|
@ -53,7 +50,8 @@ int sig;
|
|||
return;
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchPending()
|
||||
Bool
|
||||
xf86VTSwitchPending()
|
||||
{
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) {
|
||||
|
|
@ -63,7 +61,8 @@ Bool xf86VTSwitchPending()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchAway()
|
||||
Bool
|
||||
xf86VTSwitchAway()
|
||||
{
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) {
|
||||
|
|
@ -77,7 +76,8 @@ Bool xf86VTSwitchAway()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchTo()
|
||||
Bool
|
||||
xf86VTSwitchTo()
|
||||
{
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_init.c,v 3.8.2.1 1998/02/06 22:36:49 hohndel Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_init.c,v 3.19 2002/05/05 18:54:02 herrb Exp $ */
|
||||
/*
|
||||
* Copyright 1992 by Rich Murphey <Rich@Rice.edu>
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
|
|
@ -23,24 +23,18 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: bsd_init.c,v 1.3 2000/08/17 19:51:21 cpqbld Exp $ */
|
||||
/* $XConsortium: bsd_init.c /main/8 1996/10/23 13:13:05 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
extern void xf86VTRequest(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
#include <sys/utsname.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static Bool KeepTty = FALSE;
|
||||
static int devConsoleFd = -1;
|
||||
|
|
@ -58,12 +52,6 @@ static int initialVT = -1;
|
|||
#define PCCONS_CONSOLE_MODE O_RDWR|O_NDELAY
|
||||
#endif
|
||||
|
||||
#ifdef CODRV_SUPPORT
|
||||
/* Holger Veit's codrv console driver */
|
||||
#define CODRV_CONSOLE_DEV "/dev/kbd"
|
||||
#define CODRV_CONSOLE_MODE O_RDONLY|O_NDELAY
|
||||
#endif
|
||||
|
||||
#ifdef SYSCONS_SUPPORT
|
||||
/* The FreeBSD 1.1 version syscons driver uses /dev/ttyv0 */
|
||||
#define SYSCONS_CONSOLE_DEV1 "/dev/ttyv0"
|
||||
|
|
@ -81,6 +69,11 @@ static int initialVT = -1;
|
|||
#define PCVT_CONSOLE_MODE O_RDWR|O_NDELAY
|
||||
#endif
|
||||
|
||||
#if defined(WSCONS_SUPPORT) && defined(__NetBSD__)
|
||||
/* NetBSD's new console driver */
|
||||
#define WSCONS_PCVT_COMPAT_CONSOLE_DEV "/dev/ttyE0"
|
||||
#endif
|
||||
|
||||
#define CHECK_DRIVER_MSG \
|
||||
"Check your kernel's console driver configuration and /dev entries"
|
||||
|
||||
|
|
@ -88,15 +81,15 @@ static char *supported_drivers[] = {
|
|||
#ifdef PCCONS_SUPPORT
|
||||
"pccons (with X support)",
|
||||
#endif
|
||||
#ifdef CODRV_SUPPORT
|
||||
"codrv",
|
||||
#endif
|
||||
#ifdef SYSCONS_SUPPORT
|
||||
"syscons",
|
||||
#endif
|
||||
#ifdef PCVT_SUPPORT
|
||||
"pcvt",
|
||||
#endif
|
||||
#ifdef WSCONS_SUPPORT
|
||||
"wscons",
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -108,63 +101,42 @@ static char *supported_drivers[] = {
|
|||
* an X server.
|
||||
*/
|
||||
|
||||
typedef int (*xf86ConsOpen_t)(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
typedef int (*xf86ConsOpen_t)(void);
|
||||
|
||||
#ifdef PCCONS_SUPPORT
|
||||
static int xf86OpenPccons(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
static int xf86OpenPccons(void);
|
||||
#endif /* PCCONS_SUPPORT */
|
||||
|
||||
#ifdef CODRV_SUPPORT
|
||||
static int xf86OpenCodrv(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
#endif /* CODRV_SUPPORT */
|
||||
|
||||
#ifdef SYSCONS_SUPPORT
|
||||
static int xf86OpenSyscons(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
static int xf86OpenSyscons(void);
|
||||
#endif /* SYSCONS_SUPPORT */
|
||||
|
||||
#ifdef PCVT_SUPPORT
|
||||
static int xf86OpenPcvt(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
static int xf86OpenPcvt(void);
|
||||
#endif /* PCVT_SUPPORT */
|
||||
|
||||
#ifdef WSCONS_SUPPORT
|
||||
static int xf86OpenWScons(void);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The sequence of the driver probes is important; start with the
|
||||
* driver that is best distinguishable, and end with the most generic
|
||||
* driver. (Otherwise, pcvt would also probe as syscons, and either
|
||||
* pcvt or syscons might succesfully probe as pccons. Only codrv is
|
||||
* at its own.)
|
||||
* pcvt or syscons might succesfully probe as pccons.)
|
||||
*/
|
||||
static xf86ConsOpen_t xf86ConsTab[] = {
|
||||
#ifdef PCVT_SUPPORT
|
||||
xf86OpenPcvt,
|
||||
#endif
|
||||
#ifdef CODRV_SUPPORT
|
||||
xf86OpenCodrv,
|
||||
#endif
|
||||
#ifdef SYSCONS_SUPPORT
|
||||
xf86OpenSyscons,
|
||||
#endif
|
||||
#ifdef PCCONS_SUPPORT
|
||||
xf86OpenPccons,
|
||||
#endif
|
||||
#ifdef WSCONS_SUPPORT
|
||||
xf86OpenWScons,
|
||||
#endif
|
||||
(xf86ConsOpen_t)NULL
|
||||
};
|
||||
|
|
@ -173,10 +145,9 @@ static xf86ConsOpen_t xf86ConsTab[] = {
|
|||
void
|
||||
xf86OpenConsole()
|
||||
{
|
||||
int i, fd;
|
||||
#ifdef CODRV_SUPPORT
|
||||
int onoff;
|
||||
#endif
|
||||
int i, fd = -1;
|
||||
int result;
|
||||
struct utsname uts;
|
||||
xf86ConsOpen_t *driver;
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
vtmode_t vtmode;
|
||||
|
|
@ -187,10 +158,7 @@ xf86OpenConsole()
|
|||
/* check if we are run with euid==0 */
|
||||
if (geteuid() != 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Server must be running with root "
|
||||
"permissions\n"
|
||||
"You should be using Xwrapper to start the server or xdm.\n"
|
||||
"We strongly advise against making the server SUID root!\n");
|
||||
FatalError("xf86OpenConsole: Server must be suid root\n");
|
||||
}
|
||||
|
||||
if (!KeepTty)
|
||||
|
|
@ -211,7 +179,7 @@ xf86OpenConsole()
|
|||
/* detect which driver we are running on */
|
||||
for (driver = xf86ConsTab; *driver; driver++)
|
||||
{
|
||||
if((fd = (*driver)()) >= 0)
|
||||
if ((fd = (*driver)()) >= 0)
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -231,28 +199,14 @@ xf86OpenConsole()
|
|||
"%s: No console driver found\n\tSupported drivers: %s\n\t%s\n",
|
||||
"xf86OpenConsole", cons_drivers, CHECK_DRIVER_MSG);
|
||||
}
|
||||
#if 0 /* stdin is already closed in OsInit() */
|
||||
fclose(stdin);
|
||||
#endif
|
||||
xf86Info.consoleFd = fd;
|
||||
xf86Info.screenFd = fd;
|
||||
|
||||
xf86Config(FALSE); /* Read XF86Config */
|
||||
|
||||
switch (xf86Info.consType)
|
||||
{
|
||||
#ifdef CODRV_SUPPORT
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
onoff = X_MODE_ON;
|
||||
if (ioctl (xf86Info.consoleFd, CONSOLE_X_MODE, &onoff) < 0)
|
||||
{
|
||||
FatalError("%s: CONSOLE_X_MODE ON failed (%s)\n%s\n",
|
||||
"xf86OpenConsole", strerror(errno),
|
||||
CHECK_DRIVER_MSG);
|
||||
}
|
||||
if (xf86Info.consType == CODRV01X)
|
||||
ioctl(xf86Info.consoleFd, VGATAKECTRL, 0);
|
||||
break;
|
||||
#endif
|
||||
#ifdef PCCONS_SUPPORT
|
||||
case PCCONS:
|
||||
if (ioctl (xf86Info.consoleFd, CONSOLE_X_MODE_ON, 0) < 0)
|
||||
|
|
@ -267,13 +221,24 @@ xf86OpenConsole()
|
|||
*/
|
||||
if ((devConsoleFd = open("/dev/console", O_WRONLY,0)) < 0)
|
||||
{
|
||||
ErrorF("Warning: couldn't open /dev/console (%s)\n",
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING,
|
||||
"xf86OpenConsole: couldn't open /dev/console (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
case SYSCONS:
|
||||
/* as of FreeBSD 2.2.8, syscons driver does not need the #1 vt
|
||||
* switching anymore. Here we check for FreeBSD 3.1 and up.
|
||||
* Add cases for other *BSD that behave the same.
|
||||
*/
|
||||
uname (&uts);
|
||||
if (strcmp(uts.sysname, "FreeBSD") == 0) {
|
||||
i = atof(uts.release) * 100;
|
||||
if (i >= 310) goto acquire_vt;
|
||||
}
|
||||
/* otherwise fall through */
|
||||
case PCVT:
|
||||
/*
|
||||
* First activate the #1 VT. This is a hack to allow a server
|
||||
|
|
@ -284,21 +249,27 @@ xf86OpenConsole()
|
|||
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, 1) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING,
|
||||
"xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
|
||||
acquire_vt:
|
||||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
SYSCALL(result =
|
||||
ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno));
|
||||
if (result != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0)
|
||||
SYSCALL(result =
|
||||
ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno));
|
||||
if (result != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
}
|
||||
|
||||
signal(SIGUSR1, xf86VTRequest);
|
||||
|
|
@ -311,17 +282,25 @@ xf86OpenConsole()
|
|||
{
|
||||
FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
|
||||
}
|
||||
#if !defined(USE_DEV_IO) && !defined(USE_I386_IOPL)
|
||||
if (ioctl(xf86Info.consoleFd, KDENABIO, 0) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: KDENABIO failed (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
#endif
|
||||
if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed\n");
|
||||
}
|
||||
break;
|
||||
#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
|
||||
#ifdef WSCONS_SUPPORT
|
||||
case WSCONS:
|
||||
fprintf(stderr, "xf86OpenConsole\n");
|
||||
/* xf86Info.consoleFd = open("/dev/wskbd0", 0); */
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -332,7 +311,7 @@ xf86OpenConsole()
|
|||
{
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
}
|
||||
#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
|
||||
|
|
@ -363,10 +342,7 @@ xf86OpenPccons()
|
|||
CHECK_DRIVER_MSG);
|
||||
}
|
||||
xf86Info.consType = PCCONS;
|
||||
if (xf86Verbose)
|
||||
{
|
||||
ErrorF("Using pccons driver with X support\n");
|
||||
}
|
||||
xf86Msg(X_PROBED, "Using pccons driver with X support\n");
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
|
@ -383,6 +359,7 @@ xf86OpenSyscons()
|
|||
char vtname[12];
|
||||
struct stat status;
|
||||
long syscons_version;
|
||||
MessageType from;
|
||||
|
||||
/* Check for syscons */
|
||||
if ((fd = open(SYSCONS_CONSOLE_DEV1, SYSCONS_CONSOLE_MODE, 0)) >= 0
|
||||
|
|
@ -397,6 +374,7 @@ xf86OpenSyscons()
|
|||
}
|
||||
|
||||
xf86Info.vtno = VTnum;
|
||||
from = X_CMDLINE;
|
||||
|
||||
#ifdef VT_GETACTIVE
|
||||
if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0)
|
||||
|
|
@ -430,6 +408,7 @@ xf86OpenSyscons()
|
|||
/*
|
||||
* All VTs are in use. If initialVT was found, use it.
|
||||
* Otherwise, if stdin is a VT, use that one.
|
||||
* XXX stdin is already closed, so this won't work.
|
||||
*/
|
||||
if (initialVT != -1)
|
||||
{
|
||||
|
|
@ -458,6 +437,7 @@ xf86OpenSyscons()
|
|||
"or the use of the vtxx server option");
|
||||
}
|
||||
}
|
||||
from = X_PROBED;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
|
@ -476,20 +456,17 @@ xf86OpenSyscons()
|
|||
FatalError("xf86OpenSyscons: VT_GETMODE failed\n");
|
||||
}
|
||||
xf86Info.consType = SYSCONS;
|
||||
if (xf86Verbose)
|
||||
xf86Msg(X_PROBED, "Using syscons driver with X support");
|
||||
if (syscons_version >= 0x100)
|
||||
{
|
||||
ErrorF("Using syscons driver with X support");
|
||||
if (syscons_version >= 0x100)
|
||||
{
|
||||
ErrorF(" (version %d.%d)\n", syscons_version >> 8,
|
||||
xf86ErrorF(" (version %d.%d)\n", syscons_version >> 8,
|
||||
syscons_version & 0xFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
ErrorF(" (version 0.x)\n");
|
||||
}
|
||||
ErrorF("(using VT number %d)\n\n", xf86Info.vtno);
|
||||
}
|
||||
else
|
||||
{
|
||||
xf86ErrorF(" (version 0.x)\n");
|
||||
}
|
||||
xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -504,78 +481,6 @@ xf86OpenSyscons()
|
|||
#endif /* SYSCONS_SUPPORT */
|
||||
|
||||
|
||||
#ifdef CODRV_SUPPORT
|
||||
|
||||
static int
|
||||
xf86OpenCodrv()
|
||||
{
|
||||
int fd = -1, onoff = X_MODE_OFF;
|
||||
struct oldconsinfo ci;
|
||||
|
||||
if ((fd = open(CODRV_CONSOLE_DEV, CODRV_CONSOLE_MODE, 0)) >= 0)
|
||||
{
|
||||
if (ioctl(fd, CONSOLE_X_MODE, &onoff) < 0)
|
||||
{
|
||||
FatalError("%s: CONSOLE_X_MODE on %s failed (%s)\n%s\n%s\n",
|
||||
"xf86OpenCodrv",
|
||||
CODRV_CONSOLE_DEV, strerror(errno),
|
||||
"Was expecting codrv driver",
|
||||
CHECK_DRIVER_MSG);
|
||||
}
|
||||
xf86Info.consType = CODRV011;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (errno == EBUSY)
|
||||
{
|
||||
FatalError("xf86OpenCodrv: %s is already in use (codrv)\n",
|
||||
CODRV_CONSOLE_DEV);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fd = -1;
|
||||
}
|
||||
|
||||
if(fd >= 0)
|
||||
{
|
||||
/*
|
||||
* analyse whether this kernel has sufficient capabilities for
|
||||
* this xserver, if not don't proceed: it won't work. Also
|
||||
* find out which codrv version.
|
||||
*/
|
||||
#define NECESSARY (CONS_HASKBD|CONS_HASKEYNUM|CONS_HASPX386)
|
||||
if ((ioctl(fd, OLDCONSGINFO, &ci) < 0 ||
|
||||
(ci.info1 & NECESSARY) != NECESSARY))
|
||||
{
|
||||
FatalError("xf86OpenCodrv: %s\n%s\n%s\n",
|
||||
"This Xserver has detected the codrv driver, but your",
|
||||
"kernel doesn't appear to have the required facilities",
|
||||
CHECK_DRIVER_MSG);
|
||||
}
|
||||
/* Check for codrv 0.1.2 or later */
|
||||
if (ci.info1 & CONS_CODRV2)
|
||||
{
|
||||
xf86Info.consType = CODRV01X;
|
||||
if (xf86Verbose)
|
||||
{
|
||||
ErrorF("Using codrv 0.1.2 (or later)\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (xf86Verbose)
|
||||
{
|
||||
ErrorF("Using codrv 0.1.1\n");
|
||||
}
|
||||
}
|
||||
#undef NECESSARY
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
#endif /* CODRV_SUPPORT */
|
||||
|
||||
#ifdef PCVT_SUPPORT
|
||||
|
||||
static int
|
||||
|
|
@ -584,11 +489,25 @@ xf86OpenPcvt()
|
|||
/* This looks much like syscons, since pcvt is API compatible */
|
||||
int fd = -1;
|
||||
vtmode_t vtmode;
|
||||
char vtname[12];
|
||||
char vtname[12], *vtprefix;
|
||||
struct stat status;
|
||||
struct pcvtid pcvt_version;
|
||||
|
||||
if ((fd = open(PCVT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0)) >= 0)
|
||||
#ifndef __OpenBSD__
|
||||
vtprefix = "/dev/ttyv";
|
||||
#else
|
||||
vtprefix = "/dev/ttyC";
|
||||
#endif
|
||||
|
||||
fd = open(PCVT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
|
||||
#ifdef WSCONS_PCVT_COMPAT_CONSOLE_DEV
|
||||
if (fd < 0)
|
||||
{
|
||||
fd = open(WSCONS_PCVT_COMPAT_CONSOLE_DEV, PCVT_CONSOLE_MODE, 0);
|
||||
vtprefix = "/dev/ttyE";
|
||||
}
|
||||
#endif
|
||||
if (fd >= 0)
|
||||
{
|
||||
if (ioctl(fd, VGAPCVTID, &pcvt_version) >= 0)
|
||||
{
|
||||
|
|
@ -618,6 +537,7 @@ xf86OpenPcvt()
|
|||
/*
|
||||
* All VTs are in use. If initialVT was found, use it.
|
||||
* Otherwise, if stdin is a VT, use that one.
|
||||
* XXX stdin is already closed, so this won't work.
|
||||
*/
|
||||
if (initialVT != -1)
|
||||
{
|
||||
|
|
@ -639,11 +559,7 @@ xf86OpenPcvt()
|
|||
}
|
||||
|
||||
close(fd);
|
||||
#ifndef __OpenBSD__
|
||||
sprintf(vtname, "/dev/ttyv%01x", xf86Info.vtno - 1);
|
||||
#else
|
||||
sprintf(vtname, "/dev/ttyC%01x", xf86Info.vtno - 1);
|
||||
#endif
|
||||
sprintf(vtname, "%s%01x", vtprefix, xf86Info.vtno - 1);
|
||||
if ((fd = open(vtname, PCVT_CONSOLE_MODE, 0)) < 0)
|
||||
{
|
||||
FatalError("xf86OpenPcvt: Cannot open %s (%s)\n",
|
||||
|
|
@ -654,11 +570,15 @@ xf86OpenPcvt()
|
|||
FatalError("xf86OpenPcvt: VT_GETMODE failed\n");
|
||||
}
|
||||
xf86Info.consType = PCVT;
|
||||
if (xf86Verbose)
|
||||
{
|
||||
ErrorF("Using pcvt driver (version %d.%d)\n",
|
||||
pcvt_version.rmajor, pcvt_version.rminor);
|
||||
}
|
||||
#ifdef WSCONS_SUPPORT
|
||||
xf86Msg(X_PROBED,
|
||||
"Using wscons driver in pcvt compatibility mode "
|
||||
"(version %d.%d)\n",
|
||||
pcvt_version.rmajor, pcvt_version.rminor);
|
||||
#else
|
||||
xf86Msg(X_PROBED, "Using pcvt driver (version %d.%d)\n",
|
||||
pcvt_version.rmajor, pcvt_version.rminor);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -672,30 +592,49 @@ xf86OpenPcvt()
|
|||
|
||||
#endif /* PCVT_SUPPORT */
|
||||
|
||||
#ifdef WSCONS_SUPPORT
|
||||
|
||||
static int
|
||||
xf86OpenWScons()
|
||||
{
|
||||
int fd = -1;
|
||||
int mode = WSDISPLAYIO_MODE_MAPPED;
|
||||
int i;
|
||||
char ttyname[16];
|
||||
|
||||
/* XXX Is this ok? */
|
||||
for (i = 0; i < 8; i++) {
|
||||
#if defined(__NetBSD__)
|
||||
sprintf(ttyname, "/dev/ttyE%d", i);
|
||||
#elif defined(__OpenBSD__)
|
||||
sprintf(ttyname, "/dev/ttyC%d", i);
|
||||
#endif
|
||||
if ((fd = open(ttyname, 2)) != -1)
|
||||
break;
|
||||
}
|
||||
if (fd != -1) {
|
||||
if (ioctl(fd, WSDISPLAYIO_SMODE, &mode) < 0) {
|
||||
FatalError("%s: WSDISPLAYIO_MODE_MAPPED failed (%s)\n%s\n",
|
||||
"xf86OpenConsole", strerror(errno),
|
||||
CHECK_DRIVER_MSG);
|
||||
}
|
||||
xf86Info.consType = WSCONS;
|
||||
xf86Msg(X_PROBED, "Using wscons driver\n");
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
#endif /* WSCONS_SUPPORT */
|
||||
|
||||
void
|
||||
xf86CloseConsole()
|
||||
{
|
||||
#if defined(CODRV_SUPPORT)
|
||||
int onoff;
|
||||
#endif
|
||||
#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)
|
||||
struct vt_mode VT;
|
||||
#endif
|
||||
|
||||
switch (xf86Info.consType)
|
||||
{
|
||||
#ifdef CODRV_SUPPORT
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
onoff = X_MODE_OFF;
|
||||
if (xf86Info.consType == CODRV01X)
|
||||
{
|
||||
ioctl (xf86Info.consoleFd, VGAGIVECTRL, 0);
|
||||
}
|
||||
ioctl (xf86Info.consoleFd, CONSOLE_X_MODE, &onoff);
|
||||
break;
|
||||
#endif /* CODRV_SUPPORT */
|
||||
#ifdef PCCONS_SUPPORT
|
||||
case PCCONS:
|
||||
ioctl (xf86Info.consoleFd, CONSOLE_X_MODE_OFF, 0);
|
||||
|
|
@ -710,15 +649,25 @@ xf86CloseConsole()
|
|||
VT.mode = VT_AUTO;
|
||||
ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* dflt vt handling */
|
||||
}
|
||||
#if !defined(USE_DEV_IO) && !defined(USE_I386_IOPL)
|
||||
if (ioctl(xf86Info.consoleFd, KDDISABIO, 0) < 0)
|
||||
{
|
||||
xf86FatalError("xf86CloseConsole: KDDISABIO failed (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
#endif
|
||||
if (initialVT != -1)
|
||||
ioctl(xf86Info.consoleFd, VT_ACTIVATE, initialVT);
|
||||
break;
|
||||
#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
|
||||
#ifdef WSCONS_SUPPORT
|
||||
case WSCONS:
|
||||
{
|
||||
int mode = WSDISPLAYIO_MODE_EMUL;
|
||||
ioctl(xf86Info.screenFd, WSDISPLAYIO_SMODE, &mode);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (xf86Info.screenFd != xf86Info.consoleFd)
|
||||
|
|
@ -738,10 +687,7 @@ xf86CloseConsole()
|
|||
}
|
||||
|
||||
int
|
||||
xf86ProcessArgument (argc, argv, i)
|
||||
int argc;
|
||||
char *argv[];
|
||||
int i;
|
||||
xf86ProcessArgument(int argc, char *argv[], int i)
|
||||
{
|
||||
/*
|
||||
* Keep server from detaching from controlling tty. This is useful
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_io.c,v 3.12 1996/12/23 06:49:37 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_io.c,v 3.23 2002/10/21 20:38:04 herrb Exp $ */
|
||||
/*
|
||||
* Copyright 1992 by Rich Murphey <Rich@Rice.edu>
|
||||
* Copyright 1993 by David Dawes <dawes@physics.su.oz.au>
|
||||
* Copyright 1993 by David Dawes <dawes@xfree86.org>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
|
|
@ -23,29 +23,30 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: bsd_io.c,v 1.3 2000/08/17 19:51:21 cpqbld Exp $ */
|
||||
/* $XConsortium: bsd_io.c /main/11 1996/10/19 18:06:07 kaleb $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
void xf86SoundKbdBell(loudness, pitch, duration)
|
||||
int loudness;
|
||||
int pitch;
|
||||
int duration;
|
||||
#ifdef WSCONS_SUPPORT
|
||||
#define KBD_FD(i) ((i).kbdFd != -1 ? (i).kbdFd : (i).consoleFd)
|
||||
#endif
|
||||
|
||||
void
|
||||
xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||||
{
|
||||
#ifdef WSCONS_SUPPORT
|
||||
struct wskbd_bell_data wsb;
|
||||
#endif
|
||||
|
||||
if (loudness && pitch)
|
||||
{
|
||||
#ifdef CODRV_SUPPORT
|
||||
struct kbd_sound s;
|
||||
#endif
|
||||
#ifdef PCCONS_SUPPORT
|
||||
int data[2];
|
||||
#endif
|
||||
|
|
@ -59,14 +60,6 @@ int duration;
|
|||
ioctl(xf86Info.consoleFd, CONSOLE_X_BELL, data);
|
||||
break;
|
||||
#endif
|
||||
#ifdef CODRV_SUPPORT
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
s.pitch = pitch;
|
||||
s.duration = (duration * loudness) / 50;
|
||||
ioctl(xf86Info.consoleFd, KBDSETBELL, &s);
|
||||
break;
|
||||
#endif
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
case SYSCONS:
|
||||
case PCVT:
|
||||
|
|
@ -74,35 +67,44 @@ int duration;
|
|||
((1193190 / pitch) & 0xffff) |
|
||||
(((unsigned long)duration*loudness/50)<<16));
|
||||
break;
|
||||
#endif
|
||||
#if defined (WSCONS_SUPPORT)
|
||||
case WSCONS:
|
||||
wsb.which = WSKBD_BELL_DOALL;
|
||||
wsb.pitch = pitch;
|
||||
wsb.period = duration;
|
||||
wsb.volume = loudness;
|
||||
ioctl(KBD_FD(xf86Info), WSKBDIO_COMPLEXBELL,
|
||||
&wsb);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void xf86SetKbdLeds(leds)
|
||||
int leds;
|
||||
void
|
||||
xf86SetKbdLeds(int leds)
|
||||
{
|
||||
switch (xf86Info.consType) {
|
||||
|
||||
case PCCONS:
|
||||
break;
|
||||
#ifdef CODRV_SUPPORT
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
leds = (leds&0x01)<<2 | leds&0x02 | (leds&0x04)>>2;
|
||||
ioctl(xf86Info.consoleFd, KBDSLEDS, &leds);
|
||||
break;
|
||||
#endif
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
case SYSCONS:
|
||||
case PCVT:
|
||||
ioctl(xf86Info.consoleFd, KDSETLED, leds);
|
||||
break;
|
||||
#endif
|
||||
#if defined(WSCONS_SUPPORT)
|
||||
case WSCONS:
|
||||
ioctl(KBD_FD(xf86Info), WSKBDIO_SETLEDS, &leds);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
int xf86GetKbdLeds()
|
||||
int
|
||||
xf86GetKbdLeds()
|
||||
{
|
||||
int leds = 0;
|
||||
|
||||
|
|
@ -110,40 +112,28 @@ int xf86GetKbdLeds()
|
|||
|
||||
case PCCONS:
|
||||
break;
|
||||
#ifdef CODRV_SUPPORT
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
ioctl(xf86Info.consoleFd, KBDGLEDS, &leds);
|
||||
leds = (leds&0x01)<<2 | leds&0x02 | (leds&0x04)>>2;
|
||||
break;
|
||||
#endif
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
case SYSCONS:
|
||||
case PCVT:
|
||||
ioctl(xf86Info.consoleFd, KDGETLED, &leds);
|
||||
break;
|
||||
#endif
|
||||
#if defined(WSCONS_SUPPORT)
|
||||
case WSCONS:
|
||||
ioctl(KBD_FD(xf86Info), WSKBDIO_GETLEDS, &leds);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return(leds);
|
||||
}
|
||||
|
||||
#if NeedFunctionPrototypes
|
||||
void xf86SetKbdRepeat(char rad)
|
||||
#else
|
||||
void xf86SetKbdRepeat(rad)
|
||||
char rad;
|
||||
#endif
|
||||
void
|
||||
xf86SetKbdRepeat(char rad)
|
||||
{
|
||||
switch (xf86Info.consType) {
|
||||
|
||||
case PCCONS:
|
||||
break;
|
||||
#ifdef CODRV_SUPPORT
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
ioctl(xf86Info.consoleFd, KBDSTPMAT, &rad);
|
||||
break;
|
||||
#endif
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
case SYSCONS:
|
||||
case PCVT:
|
||||
|
|
@ -153,35 +143,44 @@ char rad;
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
|
||||
static struct termio kbdtty;
|
||||
#endif
|
||||
|
||||
void xf86KbdInit()
|
||||
void
|
||||
xf86KbdInit()
|
||||
{
|
||||
switch (xf86Info.consType) {
|
||||
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
break;
|
||||
#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
case PCCONS:
|
||||
case SYSCONS:
|
||||
case PCVT:
|
||||
tcgetattr(xf86Info.consoleFd, &kbdtty);
|
||||
break;
|
||||
#endif
|
||||
#if defined WSCONS_SUPPORT
|
||||
case WSCONS:
|
||||
if (xf86Info.kbdFd != -1)
|
||||
xf86FlushInput(xf86Info.kbdFd);
|
||||
else
|
||||
tcgetattr(xf86Info.consoleFd, &kbdtty);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
int xf86KbdOn()
|
||||
int
|
||||
xf86KbdOn()
|
||||
{
|
||||
struct termios nTty;
|
||||
#ifdef WSCONS_SUPPORT
|
||||
int option;
|
||||
#endif
|
||||
|
||||
|
||||
switch (xf86Info.consType) {
|
||||
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
break;
|
||||
|
||||
#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT)
|
||||
case SYSCONS:
|
||||
case PCCONS:
|
||||
|
|
@ -201,18 +200,45 @@ int xf86KbdOn()
|
|||
ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW);
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
#ifdef WSCONS_SUPPORT
|
||||
case WSCONS:
|
||||
if (xf86Info.kbdFd == -1) {
|
||||
nTty = kbdtty;
|
||||
nTty.c_iflag = IGNPAR | IGNBRK;
|
||||
nTty.c_oflag = 0;
|
||||
nTty.c_cflag = CREAD | CS8;
|
||||
nTty.c_lflag = 0;
|
||||
nTty.c_cc[VTIME] = 0;
|
||||
nTty.c_cc[VMIN] = 1;
|
||||
cfsetispeed(&nTty, 9600);
|
||||
cfsetospeed(&nTty, 9600);
|
||||
tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
|
||||
option = WSKBD_RAW;
|
||||
if (ioctl(xf86Info.consoleFd, WSKBDIO_SETMODE,
|
||||
&option) == -1)
|
||||
FatalError("can't switch keyboard to raw mode. "
|
||||
"Enable support for it in the kernel\n"
|
||||
"or use for example:\n\n"
|
||||
"Option \"Protocol\" \"wskbd\"\n"
|
||||
"Option \"Device\" \"/dev/wskbd0\"\n"
|
||||
"\nin your XF86Config(5) file\n");
|
||||
} else {
|
||||
return xf86Info.kbdFd;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
int xf86KbdOff()
|
||||
int
|
||||
xf86KbdOff()
|
||||
{
|
||||
switch (xf86Info.consType) {
|
||||
#ifdef WSCONS_SUPPORT
|
||||
int option;
|
||||
#endif
|
||||
|
||||
case CODRV011:
|
||||
case CODRV01X:
|
||||
break;
|
||||
switch (xf86Info.consType) {
|
||||
|
||||
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
|
||||
case SYSCONS:
|
||||
|
|
@ -225,33 +251,39 @@ int xf86KbdOff()
|
|||
tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
#ifdef WSCONS_SUPPORT
|
||||
case WSCONS:
|
||||
if (xf86Info.kbdFd != -1) {
|
||||
return xf86Info.kbdFd;
|
||||
} else {
|
||||
option = WSKBD_TRANSLATED;
|
||||
ioctl(xf86Info.consoleFd, WSKBDIO_SETMODE, &option);
|
||||
tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
void xf86MouseInit(mouse)
|
||||
MouseDevPtr mouse;
|
||||
#ifdef WSCONS_SUPPORT
|
||||
|
||||
#define NUMEVENTS 64
|
||||
|
||||
void
|
||||
xf86WSKbdEvents(void)
|
||||
{
|
||||
static struct wscons_event events[NUMEVENTS];
|
||||
int n, i;
|
||||
|
||||
n = read(xf86Info.kbdFd, events, sizeof events);
|
||||
if (n <= 0)
|
||||
return;
|
||||
n /= sizeof(struct wscons_event);
|
||||
for (i = 0; i < n; i++)
|
||||
xf86PostWSKbdEvent(&events[i]);
|
||||
}
|
||||
|
||||
int xf86MouseOn(mouse)
|
||||
MouseDevPtr mouse;
|
||||
{
|
||||
if ((mouse->mseFd = open(mouse->mseDevice, O_RDWR | O_NDELAY)) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Cannot open mouse (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return(-2);
|
||||
}
|
||||
FatalError("Cannot open mouse (%s)\n", strerror(errno));
|
||||
}
|
||||
#endif /* WSCONS_SUPPORT */
|
||||
|
||||
xf86SetupMouse(mouse);
|
||||
|
||||
/* Flush any pending input */
|
||||
tcflush(mouse->mseFd, TCIFLUSH);
|
||||
|
||||
return(mouse->mseFd);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,18 +23,22 @@
|
|||
|
||||
/* Modified for FreeBSD by David Dawes <dawes@XFree86.org> */
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_jstk.c,v 3.2 1996/01/12 14:34:41 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_jstk.c,v 3.8 2002/08/06 13:20:47 herrb Exp $ */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <machine/joystick.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define JS_RETURN sizeof(struct joystick)
|
||||
#ifdef XFree86LOADER
|
||||
#include "misc.h"
|
||||
#include "xf86_libc.h"
|
||||
#endif
|
||||
#include "xf86.h"
|
||||
|
||||
extern int errno;
|
||||
extern int xf86Verbose;
|
||||
#define JS_RETURN sizeof(struct joystick)
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
|
|
@ -57,16 +61,16 @@ xf86JoystickOn(char * name, int *timeout, int *centerX, int *centerY)
|
|||
ErrorF("xf86JoystickOn: %s\n", name);
|
||||
#endif
|
||||
|
||||
if ((status = open(name, O_RDWR | O_NDELAY)) < 0)
|
||||
if ((status = open(name, O_RDWR | O_NDELAY, 0)) < 0)
|
||||
{
|
||||
ErrorF("xf86JoystickOn: Cannot open joystick '%s' (%s)\n", name,
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING, "xf86JoystickOn: Cannot open joystick '%s' (%s)\n",
|
||||
name, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (*timeout <= 0) {
|
||||
/* Use the current setting */
|
||||
ioctl(status, JOY_GETTIMEOUT, &timeinmicros);
|
||||
ioctl(status, JOY_GETTIMEOUT, (char *)&timeinmicros);
|
||||
*timeout = timeinmicros / 1000;
|
||||
if (*timeout == 0)
|
||||
*timeout = 1;
|
||||
|
|
@ -78,8 +82,8 @@ xf86JoystickOn(char * name, int *timeout, int *centerX, int *centerY)
|
|||
changed = 1;
|
||||
}
|
||||
|
||||
if (changed && xf86Verbose)
|
||||
ErrorF("(--) Joystick: timeout value = %d\n", *timeout);
|
||||
if (changed)
|
||||
xf86Msg(X_PROBED, "Joystick: timeout value = %d\n", *timeout);
|
||||
|
||||
timeinmicros = *timeout * 1000;
|
||||
|
||||
|
|
@ -87,15 +91,11 @@ xf86JoystickOn(char * name, int *timeout, int *centerX, int *centerY)
|
|||
read(status, &js, JS_RETURN);
|
||||
if (*centerX < 0) {
|
||||
*centerX = js.x;
|
||||
if (xf86Verbose) {
|
||||
ErrorF("(--) Joystick: CenterX set to %d\n", *centerX);
|
||||
}
|
||||
xf86Msg(X_PROBED, "Joystick: CenterX set to %d\n", *centerX);
|
||||
}
|
||||
if (*centerY < 0) {
|
||||
*centerY = js.y;
|
||||
if (xf86Verbose) {
|
||||
ErrorF("(--) Joystick: CenterY set to %d\n", *centerY);
|
||||
}
|
||||
xf86Msg(X_PROBED, "Joystick: CenterY set to %d\n", *centerY);
|
||||
}
|
||||
|
||||
return status;
|
||||
|
|
@ -126,9 +126,7 @@ xf86JoystickInit()
|
|||
*/
|
||||
|
||||
int
|
||||
xf86JoystickOff(fd, doclose)
|
||||
int *fd;
|
||||
int doclose;
|
||||
xf86JoystickOff(int *fd, int doclose)
|
||||
{
|
||||
int oldfd;
|
||||
|
||||
|
|
@ -149,11 +147,7 @@ int doclose;
|
|||
*/
|
||||
|
||||
int
|
||||
xf86JoystickGetState(fd, x, y, buttons)
|
||||
int fd;
|
||||
int *x;
|
||||
int *y;
|
||||
int *buttons;
|
||||
xf86JoystickGetState(int fd, int *x, int *y, int *buttons)
|
||||
{
|
||||
struct joystick js;
|
||||
int status;
|
||||
|
|
@ -177,4 +171,15 @@ int *buttons;
|
|||
return 1;
|
||||
}
|
||||
|
||||
#ifdef XFree86LOADER
|
||||
/*
|
||||
* Entry point for XFree86 Loader
|
||||
*/
|
||||
void
|
||||
bsd_jstkModuleInit(pointer *data, INT32 *magic)
|
||||
{
|
||||
*magic = MAGIC_DONE;
|
||||
*data = NULL;
|
||||
}
|
||||
#endif
|
||||
/* end of bsd_jstk.c */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c,v 3.7.2.3 1998/02/06 22:36:51 hohndel Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c,v 3.14 2001/10/31 22:50:30 tsi Exp $ */
|
||||
/*
|
||||
* Copyright 1992 by Orest Zborowski <obz@Kodak.com>
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
|
|
@ -23,18 +23,17 @@
|
|||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: lnx_init.c,v 1.3 2000/08/17 19:51:23 cpqbld Exp $ */
|
||||
/* $XConsortium: lnx_init.c /main/7 1996/10/23 18:46:30 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "lnx.h"
|
||||
|
||||
#ifdef USE_DEV_FB
|
||||
extern char *getenv(const char *);
|
||||
|
|
@ -46,52 +45,50 @@ static Bool KeepTty = FALSE;
|
|||
static int VTnum = -1;
|
||||
static int activeVT = -1;
|
||||
|
||||
extern void xf86VTRequest(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
|
||||
void xf86OpenConsole()
|
||||
void
|
||||
xf86OpenConsole(void)
|
||||
{
|
||||
int i, fd;
|
||||
int i, fd = -1;
|
||||
int result;
|
||||
struct vt_mode VT;
|
||||
char vtname[11];
|
||||
struct vt_stat vts;
|
||||
MessageType from = X_PROBED;
|
||||
#ifdef USE_DEV_FB
|
||||
struct fb_var_screeninfo var;
|
||||
int fbfd;
|
||||
#endif
|
||||
char *tty0[] = { "/dev/tty0", "/dev/vc/0", NULL };
|
||||
char *vcs[] = { "/dev/vc/%d", "/dev/tty%d", NULL };
|
||||
|
||||
if (serverGeneration == 1)
|
||||
{
|
||||
/* check if we're run with euid==0 */
|
||||
if (geteuid() != 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Server must be running with root "
|
||||
"permissions\n"
|
||||
"You should be using Xwrapper to start the server or xdm.\n"
|
||||
"We strongly advise against making the server SUID root!\n");
|
||||
FatalError("xf86OpenConsole: Server must be suid root\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* setup the virtual terminal manager
|
||||
*/
|
||||
if (VTnum != -1)
|
||||
{
|
||||
if (VTnum != -1) {
|
||||
xf86Info.vtno = VTnum;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((fd = open("/dev/tty0",O_WRONLY,0)) < 0)
|
||||
from = X_CMDLINE;
|
||||
} else {
|
||||
i=0;
|
||||
while (tty0[i] != NULL)
|
||||
{
|
||||
if ((fd = open(tty0[i],O_WRONLY,0)) >= 0)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
if (fd < 0)
|
||||
FatalError(
|
||||
"xf86OpenConsole: Cannot open /dev/tty0 (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) ||
|
||||
(xf86Info.vtno == -1))
|
||||
{
|
||||
(xf86Info.vtno == -1)) {
|
||||
FatalError("xf86OpenConsole: Cannot find a free VT\n");
|
||||
}
|
||||
close(fd);
|
||||
|
|
@ -107,21 +104,24 @@ void xf86OpenConsole()
|
|||
if (ioctl(fbfd, FBIOGET_VSCREENINFO, &var))
|
||||
FatalError("xf86OpenConsole: Unable to get screen info\n");
|
||||
#endif
|
||||
ErrorF("(using VT number %d)\n\n", xf86Info.vtno);
|
||||
xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
|
||||
|
||||
sprintf(vtname,"/dev/tty%d",xf86Info.vtno); /* /dev/tty1-64 */
|
||||
|
||||
xf86Config(FALSE); /* Read XF86Config */
|
||||
|
||||
if (!KeepTty)
|
||||
{
|
||||
if (!KeepTty) {
|
||||
setpgrp();
|
||||
}
|
||||
|
||||
if ((xf86Info.consoleFd = open(vtname, O_RDWR|O_NDELAY, 0)) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Cannot open %s (%s)\n",
|
||||
vtname, strerror(errno));
|
||||
i=0;
|
||||
while (vcs[i] != NULL)
|
||||
{
|
||||
sprintf(vtname, vcs[i], xf86Info.vtno); /* /dev/tty1-64 */
|
||||
if ((xf86Info.consoleFd = open(vtname, O_RDWR|O_NDELAY, 0)) >= 0)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (xf86Info.consoleFd < 0) {
|
||||
FatalError("xf86OpenConsole: Cannot open virtual console %d (%s)\n",
|
||||
xf86Info.vtno, strerror(errno));
|
||||
}
|
||||
|
||||
/* change ownership of the vt */
|
||||
|
|
@ -131,7 +131,7 @@ void xf86OpenConsole()
|
|||
* the current VT device we're running on is not "console", we want
|
||||
* to grab all consoles too
|
||||
*
|
||||
* Why is this needed?
|
||||
* Why is this needed??
|
||||
*/
|
||||
chown("/dev/tty0", getuid(), getgid());
|
||||
|
||||
|
|
@ -159,17 +159,21 @@ void xf86OpenConsole()
|
|||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
SYSCALL(result = ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno));
|
||||
if (result != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0)
|
||||
SYSCALL(result =
|
||||
ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno));
|
||||
if (result != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
|
||||
SYSCALL(result = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT));
|
||||
if (result < 0)
|
||||
{
|
||||
FatalError ("xf86OpenConsole: VT_GETMODE failed\n");
|
||||
FatalError("xf86OpenConsole: VT_GETMODE failed\n");
|
||||
}
|
||||
|
||||
signal(SIGUSR1, xf86VTRequest);
|
||||
|
|
@ -185,6 +189,10 @@ void xf86OpenConsole()
|
|||
{
|
||||
FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed\n");
|
||||
}
|
||||
|
||||
/* we really should have a InitOSInputDevices() function instead
|
||||
* of Init?$#*&Device(). So I just place it here */
|
||||
|
||||
#ifdef USE_DEV_FB
|
||||
/* copy info to new console */
|
||||
var.yoffset=0;
|
||||
|
|
@ -200,19 +208,23 @@ void xf86OpenConsole()
|
|||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
SYSCALL(result = ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno));
|
||||
if (result != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0)
|
||||
SYSCALL(result =
|
||||
ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno));
|
||||
if (result != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86CloseConsole()
|
||||
void
|
||||
xf86CloseConsole()
|
||||
{
|
||||
struct vt_mode VT;
|
||||
|
||||
|
|
@ -238,10 +250,8 @@ void xf86CloseConsole()
|
|||
return;
|
||||
}
|
||||
|
||||
int xf86ProcessArgument (argc, argv, i)
|
||||
int argc;
|
||||
char *argv[];
|
||||
int i;
|
||||
int
|
||||
xf86ProcessArgument(int argc, char *argv[], int i)
|
||||
{
|
||||
/*
|
||||
* Keep server from detaching from controlling tty. This is useful
|
||||
|
|
@ -265,7 +275,8 @@ int i;
|
|||
return(0);
|
||||
}
|
||||
|
||||
void xf86UseMsg()
|
||||
void
|
||||
xf86UseMsg()
|
||||
{
|
||||
ErrorF("vtXX use the specified VT number\n");
|
||||
ErrorF("-keeptty ");
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c,v 3.3 1996/12/23 06:50:01 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c,v 3.24 2002/10/20 21:45:27 tsi Exp $ */
|
||||
/*
|
||||
* Copyright 1992 by Orest Zborowski <obz@Kodak.com>
|
||||
* Copyright 1993 by David Dawes <dawes@physics.su.oz.au>
|
||||
* Copyright 1993 by David Dawes <dawes@xfree86.org>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
|
|
@ -23,23 +23,21 @@
|
|||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: lnx_io.c,v 1.3 2000/08/17 19:51:23 cpqbld Exp $ */
|
||||
/* $XConsortium: lnx_io.c /main/8 1996/10/19 18:06:28 kaleb $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
void xf86SoundKbdBell(loudness, pitch, duration)
|
||||
int loudness;
|
||||
int pitch;
|
||||
int duration;
|
||||
#define KBC_TIMEOUT 250 /* Timeout in ms for sending to keyboard controller */
|
||||
|
||||
void
|
||||
xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||||
{
|
||||
if (loudness && pitch)
|
||||
{
|
||||
|
|
@ -50,20 +48,100 @@ int duration;
|
|||
}
|
||||
}
|
||||
|
||||
void xf86SetKbdLeds(leds)
|
||||
int leds;
|
||||
void
|
||||
xf86SetKbdLeds(int leds)
|
||||
{
|
||||
ioctl(xf86Info.consoleFd, KDSETLED, leds);
|
||||
ioctl(xf86Info.consoleFd, KDSETLED, leds);
|
||||
}
|
||||
|
||||
int xf86GetKbdLeds()
|
||||
int
|
||||
xf86GetKbdLeds()
|
||||
{
|
||||
int leds;
|
||||
int leds = 0;
|
||||
|
||||
ioctl(xf86Info.consoleFd, KDGETLED, &leds);
|
||||
ioctl(xf86Info.consoleFd, KDGETLED, &leds);
|
||||
return(leds);
|
||||
}
|
||||
|
||||
/* kbd rate stuff based on kbdrate.c from Rik Faith <faith@cs.unc.edu> et.al.
|
||||
* from util-linux-2.9t package */
|
||||
|
||||
#include <linux/kd.h>
|
||||
#ifdef __sparc__
|
||||
#include <asm/param.h>
|
||||
#include <asm/kbio.h>
|
||||
#endif
|
||||
|
||||
/* Deal with spurious kernel header change */
|
||||
#if defined(LINUX_VERSION_CODE) && defined(KERNEL_VERSION)
|
||||
# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,42)
|
||||
# define rate period
|
||||
# endif
|
||||
#endif
|
||||
|
||||
static int
|
||||
KDKBDREP_ioctl_ok(int rate, int delay) {
|
||||
#if defined(KDKBDREP) && !defined(__sparc__)
|
||||
/* This ioctl is defined in <linux/kd.h> but is not
|
||||
implemented anywhere - must be in some m68k patches. */
|
||||
struct kbd_repeat kbdrep_s;
|
||||
|
||||
/* don't change, just test */
|
||||
kbdrep_s.rate = -1;
|
||||
kbdrep_s.delay = -1;
|
||||
if (ioctl( 0, KDKBDREP, &kbdrep_s )) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* do the change */
|
||||
if (rate == 0) /* switch repeat off */
|
||||
kbdrep_s.rate = 0;
|
||||
else
|
||||
kbdrep_s.rate = 10000 / rate; /* convert cps to msec */
|
||||
if (kbdrep_s.rate < 1)
|
||||
kbdrep_s.rate = 1;
|
||||
kbdrep_s.delay = delay;
|
||||
if (kbdrep_s.delay < 1)
|
||||
kbdrep_s.delay = 1;
|
||||
|
||||
if (ioctl( 0, KDKBDREP, &kbdrep_s )) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1; /* success! */
|
||||
#else /* no KDKBDREP */
|
||||
return 0;
|
||||
#endif /* KDKBDREP */
|
||||
}
|
||||
|
||||
static int
|
||||
KIOCSRATE_ioctl_ok(int rate, int delay) {
|
||||
#ifdef KIOCSRATE
|
||||
struct kbd_rate kbdrate_s;
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/kbd", O_RDONLY);
|
||||
if (fd == -1)
|
||||
return 0;
|
||||
|
||||
kbdrate_s.rate = (rate + 5) / 10; /* must be integer, so round up */
|
||||
kbdrate_s.delay = delay * HZ / 1000; /* convert ms to Hz */
|
||||
if (kbdrate_s.rate > 50)
|
||||
kbdrate_s.rate = 50;
|
||||
|
||||
if (ioctl( fd, KIOCSRATE, &kbdrate_s ))
|
||||
return 0;
|
||||
|
||||
close( fd );
|
||||
|
||||
return 1;
|
||||
#else /* no KIOCSRATE */
|
||||
return 0;
|
||||
#endif /* KIOCSRATE */
|
||||
}
|
||||
|
||||
#undef rate
|
||||
|
||||
#if NeedFunctionPrototypes
|
||||
void xf86SetKbdRepeat(char rad)
|
||||
#else
|
||||
|
|
@ -71,23 +149,101 @@ void xf86SetKbdRepeat(rad)
|
|||
char rad;
|
||||
#endif
|
||||
{
|
||||
return;
|
||||
#ifdef __sparc__
|
||||
int rate = 500; /* Default rate */
|
||||
int delay = 200; /* Default delay */
|
||||
#else
|
||||
int rate = 300; /* Default rate */
|
||||
int delay = 250; /* Default delay */
|
||||
#endif
|
||||
|
||||
#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
|
||||
int i;
|
||||
int timeout;
|
||||
int value = 0x7f; /* Maximum delay with slowest rate */
|
||||
|
||||
static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
|
||||
133, 120, 109, 100, 92, 86, 80, 75, 67,
|
||||
60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
|
||||
25, 23, 21, 20 };
|
||||
#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
|
||||
|
||||
static int valid_delays[] = { 250, 500, 750, 1000 };
|
||||
#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
|
||||
#endif
|
||||
|
||||
if (xf86Info.kbdRate >= 0)
|
||||
rate = xf86Info.kbdRate * 10;
|
||||
if (xf86Info.kbdDelay >= 0)
|
||||
delay = xf86Info.kbdDelay;
|
||||
|
||||
|
||||
if(KDKBDREP_ioctl_ok(rate, delay)) /* m68k? */
|
||||
return;
|
||||
|
||||
if(KIOCSRATE_ioctl_ok(rate, delay)) /* sparc? */
|
||||
return;
|
||||
|
||||
if (xf86IsPc98())
|
||||
return;
|
||||
|
||||
#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
|
||||
|
||||
/* The ioport way */
|
||||
|
||||
for (i = 0; i < RATE_COUNT; i++)
|
||||
if (rate >= valid_rates[i]) {
|
||||
value &= 0x60;
|
||||
value |= i;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < DELAY_COUNT; i++)
|
||||
if (delay <= valid_delays[i]) {
|
||||
value &= 0x1f;
|
||||
value |= i << 5;
|
||||
break;
|
||||
}
|
||||
|
||||
timeout = KBC_TIMEOUT;
|
||||
while (((inb(0x64) & 2) == 2) && --timeout)
|
||||
usleep(1000); /* wait */
|
||||
|
||||
if (timeout == 0)
|
||||
return;
|
||||
|
||||
outb(0x60, 0xf3); /* set typematic rate */
|
||||
while (((inb(0x64) & 2) == 2) && --timeout)
|
||||
usleep(1000); /* wait */
|
||||
|
||||
usleep(10000);
|
||||
outb(0x60, value);
|
||||
|
||||
#endif /* __alpha__ || __i386__ || __ia64__ */
|
||||
}
|
||||
|
||||
static int kbdtrans;
|
||||
static struct termios kbdtty;
|
||||
|
||||
void xf86KbdInit()
|
||||
void
|
||||
xf86KbdInit()
|
||||
{
|
||||
ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
|
||||
tcgetattr (xf86Info.consoleFd, &kbdtty);
|
||||
}
|
||||
|
||||
int xf86KbdOn()
|
||||
int
|
||||
xf86KbdOn()
|
||||
{
|
||||
struct termios nTty;
|
||||
|
||||
#ifdef __powerpc__
|
||||
if (xf86Info.kbdCustomKeycodes)
|
||||
ioctl(xf86Info.consoleFd, KDSKBMODE, K_MEDIUMRAW);
|
||||
else
|
||||
#endif
|
||||
ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW);
|
||||
|
||||
nTty = kbdtty;
|
||||
nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
|
||||
nTty.c_oflag = 0;
|
||||
|
|
@ -101,36 +257,11 @@ int xf86KbdOn()
|
|||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
int xf86KbdOff()
|
||||
int
|
||||
xf86KbdOff()
|
||||
{
|
||||
ioctl(xf86Info.consoleFd, KDSKBMODE, kbdtrans);
|
||||
tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
void xf86MouseInit(mouse)
|
||||
MouseDevPtr mouse;
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int xf86MouseOn(mouse)
|
||||
MouseDevPtr mouse;
|
||||
{
|
||||
if ((mouse->mseFd = open(mouse->mseDevice, O_RDWR | O_NDELAY)) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Cannot open mouse (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return(-2);
|
||||
}
|
||||
FatalError("Cannot open mouse (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
xf86SetupMouse(mouse);
|
||||
|
||||
/* Flush any pending input */
|
||||
tcflush(mouse->mseFd, TCIFLUSH);
|
||||
|
||||
return(mouse->mseFd);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $Xorg: lnx_jstk.c,v 1.3 2000/08/17 19:51:23 cpqbld Exp $ */
|
||||
/* $XConsortium: lnx_jstk.c /main/7 1996/02/21 17:51:36 kaleb $ */
|
||||
/* Id: lnx_jstk.c,v 1.1 1995/12/20 14:06:09 lepied Exp */
|
||||
/*
|
||||
* Copyright 1995 by Frederic Lepied, France. <fred@sugix.frmug.fr.net>
|
||||
|
|
@ -23,19 +23,31 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_jstk.c,v 3.6 1996/12/23 06:50:02 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_jstk.c,v 3.13 1998/07/25 16:56:43 dawes Exp $ */
|
||||
|
||||
static const char rcs_id[] = "$Xorg: lnx_jstk.c,v 1.1 1995/12/20 14:06:09 lepied Exp";
|
||||
static const char rcs_id[] = "Id: lnx_jstk.c,v 1.1 1995/12/20 14:06:09 lepied Exp";
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#define inline __inline__
|
||||
#include <linux/joystick.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
extern int errno;
|
||||
#ifdef XFree86LOADER
|
||||
#include "xf86.h"
|
||||
#include "xf86_ansic.h"
|
||||
#endif
|
||||
|
||||
#if !defined(JSIOCGTIMELIMIT)
|
||||
/* make 2.1.x joystick.h backward compatable */
|
||||
#define JSIOCGTIMELIMIT JS_GET_TIMELIMIT
|
||||
#define JSIOCSTIMELIMIT JS_SET_TIMELIMIT
|
||||
#define js_status JS_DATA_TYPE
|
||||
#endif
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
|
|
@ -50,33 +62,30 @@ int
|
|||
xf86JoystickOn(char *name, int *timeout, int *centerX, int *centerY)
|
||||
{
|
||||
int fd;
|
||||
struct JS_DATA_TYPE js;
|
||||
extern int xf86Verbose;
|
||||
struct js_status js;
|
||||
|
||||
#ifdef DEBUG
|
||||
ErrorF("xf86JoystickOn %s\n", name);
|
||||
#endif
|
||||
|
||||
if ((fd = open(name, O_RDWR | O_NDELAY)) < 0)
|
||||
if ((fd = open(name, O_RDWR | O_NDELAY, 0)) < 0)
|
||||
{
|
||||
ErrorF("Cannot open joystick '%s' (%s)\n", name,
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING, "Cannot open joystick '%s' (%s)\n", name,
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (*timeout == 0) {
|
||||
if (ioctl (fd, JS_GET_TIMELIMIT, timeout) == -1) {
|
||||
Error("joystick JS_GET_TIMELIMIT ioctl");
|
||||
if (ioctl (fd, JSIOCGTIMELIMIT, timeout) == -1) {
|
||||
Error("joystick JSIOCGTIMELIMIT ioctl");
|
||||
}
|
||||
else {
|
||||
if (xf86Verbose) {
|
||||
ErrorF("(--) Joystick: timeout value = %d\n", *timeout);
|
||||
}
|
||||
xf86Msg(X_CONFIG, "Joystick: timeout value = %d\n", *timeout);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (ioctl(fd, JS_SET_TIMELIMIT, timeout) == -1) {
|
||||
Error("joystick JS_SET_TIMELIMIT ioctl");
|
||||
if (ioctl(fd, JSIOCSTIMELIMIT, timeout) == -1) {
|
||||
Error("joystick JSIOCSTIMELIMIT ioctl");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -84,17 +93,13 @@ xf86JoystickOn(char *name, int *timeout, int *centerX, int *centerY)
|
|||
read(fd, &js, JS_RETURN);
|
||||
if (*centerX < 0) {
|
||||
*centerX = js.x;
|
||||
if (xf86Verbose) {
|
||||
ErrorF("(--) Joystick: CenterX set to %d\n", *centerX);
|
||||
}
|
||||
xf86Msg(X_CONFIG, "Joystick: CenterX set to %d\n", *centerX);
|
||||
}
|
||||
if (*centerY < 0) {
|
||||
*centerY = js.y;
|
||||
if (xf86Verbose) {
|
||||
ErrorF("(--) Joystick: CenterY set to %d\n", *centerY);
|
||||
}
|
||||
xf86Msg(X_CONFIG, "Joystick: CenterY set to %d\n", *centerY);
|
||||
}
|
||||
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
|
@ -123,9 +128,7 @@ xf86JoystickInit()
|
|||
*/
|
||||
|
||||
int
|
||||
xf86JoystickOff(fd, doclose)
|
||||
int *fd;
|
||||
int doclose;
|
||||
xf86JoystickOff(int *fd, int doclose)
|
||||
{
|
||||
int oldfd;
|
||||
|
||||
|
|
@ -146,14 +149,10 @@ int doclose;
|
|||
*/
|
||||
|
||||
int
|
||||
xf86JoystickGetState(fd, x, y, buttons)
|
||||
int fd;
|
||||
int *x;
|
||||
int *y;
|
||||
int *buttons;
|
||||
xf86JoystickGetState(int fd, int *x, int *y, int *buttons)
|
||||
{
|
||||
struct JS_DATA_TYPE js;
|
||||
int status;
|
||||
struct js_status js;
|
||||
int status;
|
||||
|
||||
status = read(fd, &js, JS_RETURN);
|
||||
|
||||
|
|
@ -170,4 +169,16 @@ int *buttons;
|
|||
return 1;
|
||||
}
|
||||
|
||||
#ifdef XFree86LOADER
|
||||
/*
|
||||
* Entry point for XFree86 Loader
|
||||
*/
|
||||
void
|
||||
linux_jstkModuleInit(pointer *data, INT32 *magic)
|
||||
{
|
||||
*magic = MAGIC_DONE;
|
||||
*data = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* end of lnx_jstk.c */
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -22,36 +22,33 @@
|
|||
*/
|
||||
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_init.c,v 3.1.6.1 1998/02/06 22:36:51 hohndel Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_init.c,v 3.3 1998/08/29 05:43:58 dawes Exp $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
static int VTnum = -1;
|
||||
|
||||
void xf86OpenConsole()
|
||||
void
|
||||
xf86OpenConsole()
|
||||
{
|
||||
struct vt_mode VT;
|
||||
char vtname1[11];
|
||||
int i, fd, pgrp;
|
||||
int fd, pgrp;
|
||||
MessageType from = X_PROBED;
|
||||
|
||||
if (serverGeneration == 1)
|
||||
{
|
||||
/* check if we're run with euid==0 */
|
||||
if (geteuid() != 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Server must be running with root "
|
||||
"permissions\n"
|
||||
"You should be using Xwrapper to start the server or xdm.\n"
|
||||
"We strongly advise against making the server SUID root!\n");
|
||||
FatalError("xf86OpenConsole: Server must be suid root\n");
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -67,6 +64,7 @@ void xf86OpenConsole()
|
|||
if (VTnum != -1)
|
||||
{
|
||||
xf86Info.vtno = VTnum;
|
||||
from = X_CMDLINE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -88,7 +86,7 @@ void xf86OpenConsole()
|
|||
}
|
||||
close(fd);
|
||||
}
|
||||
ErrorF("(using VT number %d)\n\n", xf86Info.vtno);
|
||||
xf86Msg(from, "using VT number %d\n", xf86Info.vtno);
|
||||
|
||||
sprintf(vtname1,"/dev/atc%d",xf86Info.vtno);
|
||||
|
||||
|
|
@ -104,19 +102,12 @@ void xf86OpenConsole()
|
|||
/* change ownership of the vt */
|
||||
chown(vtname1, getuid(), getgid());
|
||||
|
||||
/* Reading Config after opening the VT get's rid of */
|
||||
/* problems with LynxOS VT handling (i.e. VT_OPENQUERY */
|
||||
/* without open() leaves the vtxx busy until next */
|
||||
/* open/close) */
|
||||
|
||||
xf86Config(FALSE); /* Read XF86Config */
|
||||
|
||||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
|
||||
{
|
||||
|
|
@ -142,20 +133,21 @@ void xf86OpenConsole()
|
|||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
/*
|
||||
* If the server doesn't have the VT when the reset occurs,
|
||||
* this is to make sure we don't continue until the activate
|
||||
* signal is received.
|
||||
*/
|
||||
if (!xf86VTSema)
|
||||
if (!xf86Screens[0]->vtSema)
|
||||
sleep(5);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86CloseConsole()
|
||||
void
|
||||
xf86CloseConsole()
|
||||
{
|
||||
struct vt_mode VT;
|
||||
|
||||
|
|
@ -172,10 +164,8 @@ void xf86CloseConsole()
|
|||
return;
|
||||
}
|
||||
|
||||
int xf86ProcessArgument (argc, argv, i)
|
||||
int argc;
|
||||
char *argv[];
|
||||
int i;
|
||||
int
|
||||
xf86ProcessArgument(int argc, char *argv[], int i)
|
||||
{
|
||||
if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
|
||||
{
|
||||
|
|
@ -190,7 +180,8 @@ int i;
|
|||
return(0);
|
||||
}
|
||||
|
||||
void xf86UseMsg()
|
||||
void
|
||||
xf86UseMsg()
|
||||
{
|
||||
ErrorF("vtXX use the specified VT number\n");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -21,25 +21,20 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_io.c,v 3.3 1996/08/10 13:07:36 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_io.c,v 3.10 2003/02/17 15:11:57 dawes Exp $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
#if defined(KDMKTONE) || defined(KIOCSOUND)
|
||||
/* Lynx 2.2.1 has sophisticated atc stuff.... */
|
||||
void xf86SoundKbdBell(loudness, pitch, duration)
|
||||
int loudness;
|
||||
int pitch;
|
||||
int duration;
|
||||
void
|
||||
xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||||
{
|
||||
if (loudness && pitch)
|
||||
{
|
||||
|
|
@ -73,10 +68,8 @@ int duration;
|
|||
#define FREQ_LO(f) ((TIMER_CONSTANT / (f)) % 256)
|
||||
#define FREQ_HI(f) ((TIMER_CONSTANT / (f)) / 256)
|
||||
|
||||
void xf86SoundKbdBell(loudness, pitch, duration)
|
||||
int loudness;
|
||||
int pitch;
|
||||
int duration;
|
||||
void
|
||||
xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||||
{
|
||||
int flo = FREQ_LO(pitch);
|
||||
int fhi = FREQ_HI(pitch);
|
||||
|
|
@ -93,28 +86,43 @@ int duration;
|
|||
}
|
||||
#endif
|
||||
|
||||
void xf86SetKbdLeds(leds)
|
||||
int leds;
|
||||
void
|
||||
xf86SetKbdLeds(int leds)
|
||||
{
|
||||
#ifdef KBD_SET_LEDS
|
||||
ioctl(xf86Info.consoleFd, KBD_SET_LEDS, &leds);
|
||||
#endif
|
||||
}
|
||||
|
||||
int xf86GetKbdLeds()
|
||||
int
|
||||
xf86GetKbdLeds()
|
||||
{
|
||||
#ifdef KBD_SET_LEDS
|
||||
int leds;
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, KBD_SET_LEDS, &leds) < 0)
|
||||
return 0;
|
||||
|
||||
return leds;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
void xf86SetKbdRepeat(char rad)
|
||||
void
|
||||
xf86SetKbdRepeat(char rad)
|
||||
{
|
||||
}
|
||||
|
||||
static struct termio kbdtty;
|
||||
|
||||
void xf86KbdInit()
|
||||
void
|
||||
xf86KbdInit()
|
||||
{
|
||||
ioctl(xf86Info.consoleFd, TCGETA, &kbdtty);
|
||||
}
|
||||
|
||||
int xf86KbdOn()
|
||||
int
|
||||
xf86KbdOn()
|
||||
{
|
||||
struct termio nTty;
|
||||
|
||||
|
|
@ -136,7 +144,8 @@ int xf86KbdOn()
|
|||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
int xf86KbdOff()
|
||||
int
|
||||
xf86KbdOff()
|
||||
{
|
||||
/* disable scan mode */
|
||||
ioctl(xf86Info.consoleFd, TIO_DISSCANMODE, NULL);
|
||||
|
|
@ -144,29 +153,10 @@ int xf86KbdOff()
|
|||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
void xf86MouseInit(mouse)
|
||||
MouseDevPtr mouse;
|
||||
#include "xf86OSKbd.h"
|
||||
|
||||
Bool
|
||||
xf86OSKbdPreInit(InputInfoPtr pInfo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int xf86MouseOn(mouse)
|
||||
MouseDevPtr mouse;
|
||||
{
|
||||
if ((mouse->mseFd = open(mouse->mseDevice, O_RDWR | O_NDELAY)) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Cannot open mouse (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return(-2);
|
||||
}
|
||||
FatalError("Cannot open mouse (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
/* assert DTR */
|
||||
ioctl(mouse->mseFd, TIOCSDTR, NULL);
|
||||
|
||||
xf86SetupMouse(mouse);
|
||||
|
||||
return(mouse->mseFd);
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,11 +21,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_mmap.c,v 3.2 1996/09/29 13:38:29 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_mmap.c,v 3.6 2000/02/11 22:36:02 dawes Exp $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
|
|
@ -35,26 +33,30 @@
|
|||
* Read BIOS using smem_create facility
|
||||
*/
|
||||
|
||||
int xf86ReadBIOS(Base, Offset, Buf, Len)
|
||||
unsigned long Base;
|
||||
unsigned long Offset;
|
||||
unsigned char *Buf;
|
||||
int Len;
|
||||
int
|
||||
xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
|
||||
int Len)
|
||||
{
|
||||
#if defined(__powerpc__)
|
||||
xf86Msg(X_WARNING, "xf86ReadBios: no BIOS-probe on PowerPC\n");
|
||||
return(-1);
|
||||
#else
|
||||
char *p;
|
||||
int mlen;
|
||||
|
||||
mlen = (Offset + Len + 4095) & ~4096;
|
||||
mlen = (Offset + Len + 4095) & ~4095;
|
||||
p = smem_create("BIOS-probe", (char *)Base, mlen, SM_READ);
|
||||
if (p == NULL)
|
||||
{
|
||||
/* check if there is a stale segment around */
|
||||
if (smem_remove("BIOS-probe") == 0) {
|
||||
ErrorF("xf86ReadBios: removed stale smem_ segment\n");
|
||||
xf86Msg(X_INFO,
|
||||
"xf86ReadBios: removed stale smem_ segment\n");
|
||||
p = smem_create("BIOS-probe", (char *)Base, mlen, SM_READ);
|
||||
}
|
||||
if (p == NULL) {
|
||||
ErrorF("xf86ReadBios: Failed to smem_create Base %x len %x %s \n",
|
||||
xf86Msg(X_WARNING, "xf86ReadBios: Failed to smem_create "
|
||||
"Base %x len %x %s \n",
|
||||
Base, mlen, strerror(errno));
|
||||
return(-1);
|
||||
}
|
||||
|
|
@ -63,4 +65,5 @@ int Len;
|
|||
smem_create(NULL, p, 0, SM_DETACH);
|
||||
smem_remove("BIOS-probe");
|
||||
return(Len);
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_video.c,v 3.2.4.1 1997/05/09 07:15:24 hohndel Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/lynxos/lynx_video.c,v 3.18 2002/12/14 04:41:14 dawes Exp $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
|
|
@ -30,6 +30,81 @@
|
|||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86OSpriv.h"
|
||||
|
||||
#if defined(__powerpc__)
|
||||
|
||||
# if defined(USE_MACHINE_ABSOLUTE)
|
||||
# include <machine/absolute.h>
|
||||
# else
|
||||
# define __USER_SPACE_INCLUDE
|
||||
# include <hw_absolute.h>
|
||||
# endif
|
||||
|
||||
void ppcPciIoMap(int bus);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#define DEBUG
|
||||
#endif
|
||||
|
||||
#ifdef HAS_MTRR_SUPPORT
|
||||
#include <sys/memrange.h>
|
||||
#define X_MTRR_ID "XFree86"
|
||||
|
||||
static pointer setWC(int, unsigned long, unsigned long, Bool, MessageType);
|
||||
static void undoWC(int, pointer);
|
||||
static Bool cleanMTRR(void);
|
||||
static int devMemFd = -1;
|
||||
#define MTRR_DEVICE "/dev/mtrr"
|
||||
#endif
|
||||
|
||||
|
||||
#if !defined(NO_MMAP)
|
||||
#include <sys/mman.h>
|
||||
|
||||
int smem_remove(char *name)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
char *smem_create(char *name, char *arg_addr, long size, int mode)
|
||||
{
|
||||
int fd;
|
||||
void *addr = 0;
|
||||
char *retval;
|
||||
size_t len = size;
|
||||
int prot = PROT_READ|PROT_WRITE|PROT_UNCACHE;
|
||||
int flags = MAP_SHARED;
|
||||
off_t off = (off_t)arg_addr;
|
||||
|
||||
if ((fd = open("/dev/mem" , O_RDWR)) < 0)
|
||||
{
|
||||
retval = (char *)-1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mode == SM_DETACH)
|
||||
{
|
||||
munmap(arg_addr, len);
|
||||
retval = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((retval = mmap (addr, len, prot, flags, fd, off) ) == MAP_FAILED)
|
||||
{
|
||||
retval = (char *)-1;
|
||||
}
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
return(retval);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/* Video Memory Mapping section */
|
||||
|
|
@ -38,19 +113,24 @@
|
|||
typedef struct
|
||||
{
|
||||
char name[16];
|
||||
pointer Base;
|
||||
long Size;
|
||||
unsigned long Base;
|
||||
unsigned long Size;
|
||||
char *ptr;
|
||||
int RefCnt;
|
||||
}
|
||||
_SMEMS;
|
||||
|
||||
#define MAX_SMEMS 8
|
||||
#define MAX_SMEMS 16
|
||||
|
||||
static _SMEMS smems[MAX_SMEMS];
|
||||
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED ((void *)-1)
|
||||
#endif
|
||||
|
||||
static void
|
||||
smemCleanup()
|
||||
smemCleanup(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -60,18 +140,15 @@ smemCleanup()
|
|||
(void)smem_remove(smems[i].name);
|
||||
*smems[i].name = '\0';
|
||||
smems[i].ptr = NULL;
|
||||
smems[i].Base = NULL;
|
||||
smems[i].Base = 0;
|
||||
smems[i].Size = 0;
|
||||
smems[i].RefCnt = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pointer xf86MapVidMem(ScreenNum, Region, Base, Size)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
pointer Base;
|
||||
unsigned long Size;
|
||||
static pointer
|
||||
MapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
|
||||
{
|
||||
static int once;
|
||||
int free_slot = -1;
|
||||
|
|
@ -86,14 +163,15 @@ unsigned long Size;
|
|||
{
|
||||
if (!*smems[i].name && free_slot == -1)
|
||||
free_slot = i;
|
||||
if (smems[i].Base == Base && smems[i].Size == Size && *smems[i].name) {
|
||||
if (smems[i].Base == Base && smems[i].Size == Size
|
||||
&& *smems[i].name) {
|
||||
smems[i].RefCnt++;
|
||||
return smems[i].ptr;
|
||||
}
|
||||
}
|
||||
if (i == MAX_SMEMS && free_slot == -1)
|
||||
{
|
||||
FatalError("xf86MapVidMem: failed to smem_create Base %x Size %x (out of SMEMS entries)\n",
|
||||
FatalError("MapVidMem: failed to smem_create Base %x Size %x (out of SMEMS entries)\n",
|
||||
Base, Size);
|
||||
}
|
||||
|
||||
|
|
@ -101,53 +179,85 @@ unsigned long Size;
|
|||
sprintf(smems[i].name, "Video-%d", i);
|
||||
smems[i].Base = Base;
|
||||
smems[i].Size = Size;
|
||||
smems[i].ptr = smem_create(smems[i].name, Base, Size, SM_READ|SM_WRITE);
|
||||
|
||||
xf86MsgVerb(X_INFO, 3, "MapVidMem: Base=0x%x Size=0x%x\n",
|
||||
Base, Size);
|
||||
|
||||
#if defined(__powerpc__)
|
||||
if (((unsigned long)Base & PHYS_IO_MEM_START) != PHYS_IO_MEM_START) {
|
||||
Base = Base | PHYS_IO_MEM_START;
|
||||
}
|
||||
#endif
|
||||
|
||||
smems[i].ptr = smem_create(smems[i].name, (char *)Base, Size, SM_READ|SM_WRITE);
|
||||
smems[i].RefCnt = 1;
|
||||
if (smems[i].ptr == NULL)
|
||||
{
|
||||
/* check if there is a stale segment around */
|
||||
if (smem_remove(smems[i].name) == 0) {
|
||||
ErrorF("xf86MapVidMem: removed stale smem_ segment %s\n",
|
||||
smems[i].name);
|
||||
xf86Msg(X_INFO,
|
||||
"MapVidMem: removed stale smem_ segment %s\n",
|
||||
smems[i].name);
|
||||
smems[i].ptr = smem_create(smems[i].name,
|
||||
Base, Size, SM_READ|SM_WRITE);
|
||||
(char *)Base, Size, SM_READ|SM_WRITE);
|
||||
}
|
||||
if (smems[i].ptr == NULL) {
|
||||
*smems[i].name = '\0';
|
||||
FatalError("xf86MapVidMem: failed to smem_create Base %x Size %x (%s)\n",
|
||||
FatalError("MapVidMem: failed to smem_create Base %x Size %x (%s)\n",
|
||||
Base, Size, strerror(errno));
|
||||
}
|
||||
}
|
||||
xf86MsgVerb(X_INFO, 3, "MapVidMem: Base=0x%x Size=0x%x Ptr=0x%x\n",
|
||||
Base, Size, smems[i].ptr);
|
||||
return smems[i].ptr;
|
||||
}
|
||||
|
||||
void xf86UnMapVidMem(ScreenNum, Region, Base, Size)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
pointer Base;
|
||||
unsigned long Size;
|
||||
static void
|
||||
UnMapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
int i;
|
||||
|
||||
xf86MsgVerb(X_INFO, 3, "UnMapVidMem: Base/Ptr=0x%x Size=0x%x\n",
|
||||
Base, Size);
|
||||
for (i = 0; i < MAX_SMEMS; i++)
|
||||
{
|
||||
if (*smems[i].name && smems[i].ptr == Base && smems[i].Size == Size)
|
||||
if (*smems[i].name && smems[i].ptr == Base
|
||||
&& smems[i].Size == Size)
|
||||
{
|
||||
if (--smems[i].RefCnt > 0)
|
||||
return;
|
||||
|
||||
(void)smem_create(NULL, smems[i].ptr, 0, SM_DETACH);
|
||||
xf86MsgVerb(X_INFO, 3,
|
||||
"UnMapVidMem: smem_create(%s, 0x%08x, ... "
|
||||
"SM_DETACH)\n", smems[i].name, smems[i].ptr);
|
||||
(void)smem_remove(smems[i].name);
|
||||
*smems[i].name = '\0';
|
||||
smems[i].RefCnt = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
ErrorF("xf86UnMapVidMem: no SMEM found for Base = %lx Size = %lx\n", Base, Size);
|
||||
xf86MsgVerb(X_WARNING, 2,
|
||||
"UnMapVidMem: no SMEM found for Base = %lx Size = %lx\n",
|
||||
Base, Size);
|
||||
}
|
||||
|
||||
Bool xf86LinearVidMem()
|
||||
|
||||
void
|
||||
xf86OSInitVidMem(VidMemInfoPtr pVidMem)
|
||||
{
|
||||
return(TRUE);
|
||||
pVidMem->linearSupported = TRUE;
|
||||
pVidMem->mapMem = MapVidMem;
|
||||
pVidMem->unmapMem = UnMapVidMem;
|
||||
pVidMem->setWC = 0;
|
||||
pVidMem->undoWC = 0;
|
||||
#ifdef HAS_MTRR_SUPPORT
|
||||
if (cleanMTRR()) {
|
||||
pVidMem->setWC = setWC;
|
||||
pVidMem->undoWC = undoWC;
|
||||
}
|
||||
#endif
|
||||
pVidMem->initialised = TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -155,13 +265,442 @@ Bool xf86LinearVidMem()
|
|||
/* Interrupt Handling section */
|
||||
/***************************************************************************/
|
||||
|
||||
Bool xf86DisableInterrupts()
|
||||
Bool
|
||||
xf86DisableInterrupts()
|
||||
{
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
void xf86EnableInterrupts()
|
||||
void
|
||||
xf86EnableInterrupts()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/* I/O Permissions section for PowerPC */
|
||||
/***************************************************************************/
|
||||
|
||||
#if defined(__powerpc__)
|
||||
|
||||
volatile unsigned char *ioBase = MAP_FAILED;
|
||||
volatile unsigned char *pciConfBase = MAP_FAILED;
|
||||
|
||||
static int IOEnabled;
|
||||
|
||||
|
||||
static void
|
||||
removeIOSmem(void)
|
||||
{
|
||||
smem_create(NULL, (char *) ioBase, 0, SM_DETACH);
|
||||
smem_remove("IOBASE");
|
||||
ioBase = MAP_FAILED;
|
||||
}
|
||||
|
||||
void
|
||||
xf86EnableIO()
|
||||
{
|
||||
if (IOEnabled++ == 0) {
|
||||
ioBase = (unsigned char *) smem_create("IOBASE",
|
||||
(char *)PHYS_ISA_IO_SPACE, 64*1024, SM_READ|SM_WRITE);
|
||||
if (ioBase == MAP_FAILED) {
|
||||
--IOEnabled;
|
||||
FatalError("xf86EnableIO: Failed to map I/O\n");
|
||||
} else {
|
||||
#ifdef DEBUG
|
||||
ErrorF("xf86EnableIO: mapped I/O at vaddr 0x%08x\n",
|
||||
ioBase);
|
||||
#endif
|
||||
atexit(removeIOSmem);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
xf86DisableIO()
|
||||
{
|
||||
if (!IOEnabled)
|
||||
return;
|
||||
|
||||
if (--IOEnabled == 0)
|
||||
removeIOSmem();
|
||||
return;
|
||||
}
|
||||
|
||||
#if 0
|
||||
void
|
||||
xf86DisableIOPrivs(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
void
|
||||
ppcPciIoMap(int bus)
|
||||
{
|
||||
xf86EnableIO();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAS_MTRR_SUPPORT
|
||||
/* memory range (MTRR) support for LynxOS (taken from BSD MTRR support) */
|
||||
|
||||
/*
|
||||
* This code is experimental. Some parts may be overkill, and other parts
|
||||
* may be incomplete.
|
||||
*/
|
||||
|
||||
/*
|
||||
* getAllRanges returns the full list of memory ranges with attributes set.
|
||||
*/
|
||||
|
||||
static struct mem_range_desc *
|
||||
getAllRanges(int *nmr)
|
||||
{
|
||||
struct mem_range_desc *mrd;
|
||||
struct mem_range_op mro;
|
||||
|
||||
/*
|
||||
* Find how many ranges there are. If this fails, then the kernel
|
||||
* probably doesn't have MTRR support.
|
||||
*/
|
||||
mro.mo_arg[0] = 0;
|
||||
if (ioctl(devMemFd, MEMRANGE_GET, &mro))
|
||||
return NULL;
|
||||
*nmr = mro.mo_arg[0];
|
||||
mrd = xnfalloc(*nmr * sizeof(struct mem_range_desc));
|
||||
mro.mo_arg[0] = *nmr;
|
||||
mro.mo_desc = mrd;
|
||||
if (ioctl(devMemFd, MEMRANGE_GET, &mro)) {
|
||||
xfree(mrd);
|
||||
return NULL;
|
||||
}
|
||||
return mrd;
|
||||
}
|
||||
|
||||
/*
|
||||
* cleanMTRR removes any memory attribute that may be left by a previous
|
||||
* X server. Normally there won't be any, but this takes care of the
|
||||
* case where a server crashed without being able finish cleaning up.
|
||||
*/
|
||||
|
||||
static Bool
|
||||
cleanMTRR()
|
||||
{
|
||||
struct mem_range_desc *mrd;
|
||||
struct mem_range_op mro;
|
||||
int nmr, i;
|
||||
|
||||
/* This shouldn't happen */
|
||||
if (devMemFd < 0) {
|
||||
if ((devMemFd = open(MTRR_DEVICE, O_RDONLY)) < 0) {
|
||||
perror("open MTRR");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(mrd = getAllRanges(&nmr)))
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < nmr; i++) {
|
||||
if (strcmp(mrd[i].mr_owner, X_MTRR_ID) == 0 &&
|
||||
(mrd[i].mr_flags & MDF_ACTIVE)) {
|
||||
#ifdef DEBUG
|
||||
ErrorF("Clean for (0x%lx,0x%lx)\n",
|
||||
(unsigned long)mrd[i].mr_base,
|
||||
(unsigned long)mrd[i].mr_len);
|
||||
#endif
|
||||
if (mrd[i].mr_flags & MDF_FIXACTIVE) {
|
||||
mro.mo_arg[0] = MEMRANGE_SET_UPDATE;
|
||||
mrd[i].mr_flags = MDF_UNCACHEABLE;
|
||||
} else {
|
||||
mro.mo_arg[0] = MEMRANGE_SET_REMOVE;
|
||||
}
|
||||
mro.mo_desc = mrd + i;
|
||||
ioctl(devMemFd, MEMRANGE_SET, &mro);
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG
|
||||
sleep(10);
|
||||
#endif
|
||||
xfree(mrd);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
typedef struct x_RangeRec {
|
||||
struct mem_range_desc mrd;
|
||||
Bool wasWC;
|
||||
struct x_RangeRec * next;
|
||||
} RangeRec, *RangePtr;
|
||||
|
||||
static void
|
||||
freeRangeList(RangePtr range)
|
||||
{
|
||||
RangePtr rp;
|
||||
|
||||
while (range) {
|
||||
rp = range;
|
||||
range = rp->next;
|
||||
xfree(rp);
|
||||
}
|
||||
}
|
||||
|
||||
static RangePtr
|
||||
dupRangeList(RangePtr list)
|
||||
{
|
||||
RangePtr new = NULL, rp, p;
|
||||
|
||||
rp = list;
|
||||
while (rp) {
|
||||
p = xnfalloc(sizeof(RangeRec));
|
||||
*p = *rp;
|
||||
p->next = new;
|
||||
new = p;
|
||||
rp = rp->next;
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
static RangePtr
|
||||
sortRangeList(RangePtr list)
|
||||
{
|
||||
RangePtr rp1, rp2, copy, sorted = NULL, minp, prev, minprev;
|
||||
unsigned long minBase;
|
||||
|
||||
/* Sort by base address */
|
||||
rp1 = copy = dupRangeList(list);
|
||||
while (rp1) {
|
||||
minBase = rp1->mrd.mr_base;
|
||||
minp = rp1;
|
||||
minprev = NULL;
|
||||
prev = rp1;
|
||||
rp2 = rp1->next;
|
||||
while (rp2) {
|
||||
if (rp2->mrd.mr_base < minBase) {
|
||||
minBase = rp2->mrd.mr_base;
|
||||
minp = rp2;
|
||||
minprev = prev;
|
||||
}
|
||||
prev = rp2;
|
||||
rp2 = rp2->next;
|
||||
}
|
||||
if (minprev) {
|
||||
minprev->next = minp->next;
|
||||
rp1 = copy;
|
||||
} else {
|
||||
rp1 = minp->next;
|
||||
}
|
||||
minp->next = sorted;
|
||||
sorted = minp;
|
||||
}
|
||||
return sorted;
|
||||
}
|
||||
|
||||
/*
|
||||
* findRanges returns a list of ranges that overlap the specified range.
|
||||
*/
|
||||
|
||||
static void
|
||||
findRanges(unsigned long base, unsigned long size, RangePtr *ucp, RangePtr *wcp)
|
||||
{
|
||||
struct mem_range_desc *mrd;
|
||||
int nmr, i;
|
||||
RangePtr rp, *p;
|
||||
|
||||
if (!(mrd = getAllRanges(&nmr)))
|
||||
return;
|
||||
|
||||
for (i = 0; i < nmr; i++) {
|
||||
if ((mrd[i].mr_flags & MDF_ACTIVE) &&
|
||||
mrd[i].mr_base < base + size &&
|
||||
mrd[i].mr_base + mrd[i].mr_len > base) {
|
||||
if (mrd[i].mr_flags & MDF_WRITECOMBINE)
|
||||
p = wcp;
|
||||
else if (mrd[i].mr_flags & MDF_UNCACHEABLE)
|
||||
p = ucp;
|
||||
else
|
||||
continue;
|
||||
rp = xnfalloc(sizeof(RangeRec));
|
||||
rp->mrd = mrd[i];
|
||||
rp->next = *p;
|
||||
*p = rp;
|
||||
}
|
||||
}
|
||||
xfree(mrd);
|
||||
}
|
||||
|
||||
/*
|
||||
* This checks if the existing overlapping ranges fully cover the requested
|
||||
* range. Is this overkill?
|
||||
*/
|
||||
|
||||
static Bool
|
||||
fullCoverage(unsigned long base, unsigned long size, RangePtr overlap)
|
||||
{
|
||||
RangePtr rp1, sorted = NULL;
|
||||
unsigned long end;
|
||||
|
||||
sorted = sortRangeList(overlap);
|
||||
/* Look for gaps */
|
||||
rp1 = sorted;
|
||||
end = base + size;
|
||||
while (rp1) {
|
||||
if (rp1->mrd.mr_base > base) {
|
||||
freeRangeList(sorted);
|
||||
return FALSE;
|
||||
} else {
|
||||
base = rp1->mrd.mr_base + rp1->mrd.mr_len;
|
||||
}
|
||||
if (base >= end) {
|
||||
freeRangeList(sorted);
|
||||
return TRUE;
|
||||
}
|
||||
rp1 = rp1->next;
|
||||
}
|
||||
freeRangeList(sorted);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static pointer
|
||||
addWC(int screenNum, unsigned long base, unsigned long size, MessageType from)
|
||||
{
|
||||
RangePtr uc = NULL, wc = NULL, retlist = NULL;
|
||||
struct mem_range_desc mrd;
|
||||
struct mem_range_op mro;
|
||||
|
||||
findRanges(base, size, &uc, &wc);
|
||||
|
||||
/* See of the full range is already WC */
|
||||
if (!uc && fullCoverage(base, size, wc)) {
|
||||
xf86DrvMsg(screenNum, from,
|
||||
"Write-combining range (0x%lx,0x%lx) was already set\n",
|
||||
base, size);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Otherwise, try to add the new range */
|
||||
mrd.mr_base = base;
|
||||
mrd.mr_len = size;
|
||||
strcpy(mrd.mr_owner, X_MTRR_ID);
|
||||
mrd.mr_flags = MDF_WRITECOMBINE;
|
||||
mro.mo_desc = &mrd;
|
||||
mro.mo_arg[0] = MEMRANGE_SET_UPDATE;
|
||||
if (ioctl(devMemFd, MEMRANGE_SET, &mro)) {
|
||||
xf86DrvMsg(screenNum, X_WARNING,
|
||||
"Failed to set write-combining range "
|
||||
"(0x%lx,0x%lx)\n", base, size);
|
||||
return NULL;
|
||||
} else {
|
||||
xf86DrvMsg(screenNum, from,
|
||||
"Write-combining range (0x%lx,0x%lx)\n", base, size);
|
||||
retlist = xnfalloc(sizeof(RangeRec));
|
||||
retlist->mrd = mrd;
|
||||
retlist->wasWC = FALSE;
|
||||
retlist->next = NULL;
|
||||
return retlist;
|
||||
}
|
||||
}
|
||||
|
||||
static pointer
|
||||
delWC(int screenNum, unsigned long base, unsigned long size, MessageType from)
|
||||
{
|
||||
RangePtr uc = NULL, wc = NULL, retlist = NULL;
|
||||
struct mem_range_desc mrd;
|
||||
struct mem_range_op mro;
|
||||
|
||||
findRanges(base, size, &uc, &wc);
|
||||
|
||||
/*
|
||||
* See of the full range is already not WC, or if there is full
|
||||
* coverage from UC ranges.
|
||||
*/
|
||||
if (!wc || fullCoverage(base, size, uc)) {
|
||||
xf86DrvMsg(screenNum, from,
|
||||
"Write-combining range (0x%lx,0x%lx) was already clear\n",
|
||||
base, size);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Otherwise, try to add the new range */
|
||||
mrd.mr_base = base;
|
||||
mrd.mr_len = size;
|
||||
strcpy(mrd.mr_owner, X_MTRR_ID);
|
||||
mrd.mr_flags = MDF_UNCACHEABLE;
|
||||
mro.mo_desc = &mrd;
|
||||
mro.mo_arg[0] = MEMRANGE_SET_UPDATE;
|
||||
if (ioctl(devMemFd, MEMRANGE_SET, &mro)) {
|
||||
xf86DrvMsg(screenNum, X_WARNING,
|
||||
"Failed to remove write-combining range "
|
||||
"(0x%lx,0x%lx)\n", base, size);
|
||||
/* XXX Should then remove all of the overlapping WC ranges */
|
||||
return NULL;
|
||||
} else {
|
||||
xf86DrvMsg(screenNum, from,
|
||||
"Removed Write-combining range (0x%lx,0x%lx)\n",
|
||||
base, size);
|
||||
retlist = xnfalloc(sizeof(RangeRec));
|
||||
retlist->mrd = mrd;
|
||||
retlist->wasWC = TRUE;
|
||||
retlist->next = NULL;
|
||||
return retlist;
|
||||
}
|
||||
}
|
||||
|
||||
static pointer
|
||||
setWC(int screenNum, unsigned long base, unsigned long size, Bool enable,
|
||||
MessageType from)
|
||||
{
|
||||
if (enable)
|
||||
return addWC(screenNum, base, size, from);
|
||||
else
|
||||
return delWC(screenNum, base, size, from);
|
||||
}
|
||||
|
||||
static void
|
||||
undoWC(int screenNum, pointer list)
|
||||
{
|
||||
RangePtr rp;
|
||||
struct mem_range_op mro;
|
||||
Bool failed;
|
||||
|
||||
rp = list;
|
||||
while (rp) {
|
||||
#ifdef DEBUG
|
||||
ErrorF("Undo for (0x%lx,0x%lx), %d\n",
|
||||
(unsigned long)rp->mrd.mr_base,
|
||||
(unsigned long)rp->mrd.mr_len, rp->wasWC);
|
||||
#endif
|
||||
failed = FALSE;
|
||||
if (rp->wasWC) {
|
||||
mro.mo_arg[0] = MEMRANGE_SET_UPDATE;
|
||||
rp->mrd.mr_flags = MDF_WRITECOMBINE;
|
||||
strcpy(rp->mrd.mr_owner, "unknown");
|
||||
} else {
|
||||
mro.mo_arg[0] = MEMRANGE_SET_REMOVE;
|
||||
}
|
||||
mro.mo_desc = &rp->mrd;
|
||||
|
||||
if (ioctl(devMemFd, MEMRANGE_SET, &mro)) {
|
||||
if (!rp->wasWC) {
|
||||
mro.mo_arg[0] = MEMRANGE_SET_UPDATE;
|
||||
rp->mrd.mr_flags = MDF_UNCACHEABLE;
|
||||
strcpy(rp->mrd.mr_owner, "unknown");
|
||||
if (ioctl(devMemFd, MEMRANGE_SET, &mro))
|
||||
failed = TRUE;
|
||||
} else
|
||||
failed = TRUE;
|
||||
}
|
||||
if (failed) {
|
||||
xf86DrvMsg(screenNum, X_WARNING,
|
||||
"Failed to restore MTRR range (0x%lx,0x%lx)\n",
|
||||
(unsigned long)rp->mrd.mr_base,
|
||||
(unsigned long)rp->mrd.mr_len);
|
||||
}
|
||||
rp = rp->next;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* HAS_MTRR_SUPPORT */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,14 +1,15 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/misc/xf86_IlHack.c,v 3.4 1996/12/23 06:50:24 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/misc/xf86_IlHack.c,v 3.5 1998/07/25 16:56:51 dawes Exp $ */
|
||||
/*
|
||||
* This file is an incredible crock to get the normally-inline functions
|
||||
* built into the server so that things can be debugged properly.
|
||||
*
|
||||
* Note: this doesn't work when using a compiler other than GCC.
|
||||
*/
|
||||
/* $Xorg: xf86_IlHack.c,v 1.3 2000/08/17 19:51:25 cpqbld Exp $ */
|
||||
/* $XConsortium: xf86_IlHack.c /main/4 1996/02/21 17:52:26 kaleb $ */
|
||||
|
||||
|
||||
#define static /**/
|
||||
#define __inline__ /**/
|
||||
#undef NO_INLINE
|
||||
#define DO_PROTOTYPES
|
||||
#include "compiler.h"
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/misc/xf86_Util.c,v 3.4 1996/12/23 06:50:25 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/misc/xf86_Util.c,v 3.8 2001/10/28 03:34:02 tsi Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
*
|
||||
|
|
@ -21,7 +21,7 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: xf86_Util.c,v 1.3 2000/08/17 19:51:26 cpqbld Exp $ */
|
||||
/* $XConsortium: xf86_Util.c /main/5 1996/10/23 13:13:10 kaleb $ */
|
||||
|
||||
/*
|
||||
* This file is for utility functions that will be shared by other pieces
|
||||
|
|
@ -31,70 +31,34 @@
|
|||
|
||||
#include <ctype.h>
|
||||
|
||||
/*
|
||||
* A portable hack at implementing strcasecmp()
|
||||
* The characters '_', ' ', and '\t' are ignored in the comparison
|
||||
*/
|
||||
int StrCaseCmp(s1, s2)
|
||||
const char *s1, *s2;
|
||||
{
|
||||
char c1, c2;
|
||||
|
||||
if (*s1 == 0)
|
||||
if (*s2 == 0)
|
||||
return(0);
|
||||
else
|
||||
return(1);
|
||||
|
||||
while (*s1 == '_' || *s1 == ' ' || *s1 == '\t')
|
||||
s1++;
|
||||
while (*s2 == '_' || *s2 == ' ' || *s2 == '\t')
|
||||
s2++;
|
||||
c1 = (isupper(*s1) ? tolower(*s1) : *s1);
|
||||
c2 = (isupper(*s2) ? tolower(*s2) : *s2);
|
||||
while (c1 == c2)
|
||||
{
|
||||
if (c1 == '\0')
|
||||
return(0);
|
||||
s1++; s2++;
|
||||
while (*s1 == '_' || *s1 == ' ' || *s1 == '\t')
|
||||
s1++;
|
||||
while (*s2 == '_' || *s2 == ' ' || *s2 == '\t')
|
||||
s2++;
|
||||
c1 = (isupper(*s1) ? tolower(*s1) : *s1);
|
||||
c2 = (isupper(*s2) ? tolower(*s2) : *s2);
|
||||
}
|
||||
return(c1 - c2);
|
||||
}
|
||||
|
||||
/* To prevent empty source file warnings */
|
||||
int _xf86misc;
|
||||
|
||||
#if 0
|
||||
/* For use only with gcc */
|
||||
#ifdef __GNUC__
|
||||
|
||||
#include "os.h"
|
||||
|
||||
char *debug_alloca(file, line, size)
|
||||
char *file;
|
||||
int line;
|
||||
int size;
|
||||
char *
|
||||
debug_alloca(char *file, int line, int size)
|
||||
{
|
||||
char *ptr;
|
||||
|
||||
ptr = (char *)Xalloc(size);
|
||||
ptr = Xalloc(size);
|
||||
ErrorF("Alloc: %s line %d; ptr = 0x%x, length = %d\n", file, line,
|
||||
ptr, size);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void debug_dealloca(file, line, ptr)
|
||||
char *file;
|
||||
int line;
|
||||
char *ptr;
|
||||
void
|
||||
debug_dealloca(char *file, int line, char *ptr)
|
||||
{
|
||||
ErrorF("Dealloc: %s line %d; ptr = 0x%x\n", file, line, ptr);
|
||||
Xfree(ptr);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(ISC) || defined(Lynx)
|
||||
|
||||
|
|
@ -103,13 +67,15 @@ char *ptr;
|
|||
/* Needed for apm_driver.c */
|
||||
/* These functions are modeled after the functions inside gnu's libc */
|
||||
|
||||
static double copysign(double x, double y)
|
||||
static double
|
||||
copysign(double x, double y)
|
||||
{
|
||||
x = fabs(x);
|
||||
return y < 0 ? - x : x;
|
||||
}
|
||||
|
||||
double RInt(double x)
|
||||
double
|
||||
RInt(double x)
|
||||
{
|
||||
double s,t;
|
||||
const double one = 1.0;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* XFree86: $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/VTsw_sco.c,v 1.3 2001/06/30 22:41:49 tsi Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
* Copyright 1993 by David McCullough <davidm@stallion.oz.au>
|
||||
|
|
@ -22,73 +22,93 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: VTsw_sco.c,v 1.3 2000/08/17 19:51:28 cpqbld Exp $ */
|
||||
/* $XConsortium: VTsw_sco.c /main/2 1995/11/13 06:08:36 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
/* For the event driver prototypes */
|
||||
#include <sys/event.h>
|
||||
#include <mouse.h>
|
||||
|
||||
/*
|
||||
* Handle the VT-switching interface for SCO
|
||||
*/
|
||||
|
||||
/*
|
||||
* This function is the signal handler for the VT-switching signal. It
|
||||
* is only referenced inside the OS-support layer.
|
||||
* is only referenced inside the OS-support layer. NOTE: we do NOT need
|
||||
* to re-arm the signal here, since we used sigaction() to set the signal
|
||||
* disposition in sco_init.c. If we had used signal(), we would need to
|
||||
* re-arm the signal here. All we need to do now is record the fact that
|
||||
* we got the signal. XFree86 handles the rest.
|
||||
*/
|
||||
void xf86VTRequest(sig)
|
||||
int sig;
|
||||
void
|
||||
xf86VTRequest(int sig)
|
||||
{
|
||||
signal(sig, (void(*)())xf86VTRequest);
|
||||
xf86Info.vtRequestsPending = TRUE;
|
||||
return;
|
||||
xf86Info.vtRequestsPending = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchPending()
|
||||
Bool
|
||||
xf86VTSwitchPending()
|
||||
{
|
||||
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
||||
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchAway()
|
||||
/*
|
||||
* When we switch away, we need to flush and suspend the event driver
|
||||
* before the VT_RELDISP. We also need to get the current LED status
|
||||
* and preserve it, so that we can restore it when we come back.
|
||||
*/
|
||||
static int sco_ledstatus = -1;
|
||||
static unsigned int sco_ledstate = 0;
|
||||
|
||||
Bool
|
||||
xf86VTSwitchAway()
|
||||
{
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, 1) < 0)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(TRUE);
|
||||
}
|
||||
ev_flush();
|
||||
ev_suspend();
|
||||
sco_ledstatus = ioctl(xf86Info.consoleFd, KDGETLED, &sco_ledstate);
|
||||
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_TRUE) < 0) {
|
||||
return(FALSE);
|
||||
} else {
|
||||
return(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchTo()
|
||||
/*
|
||||
* When we come back to the X server, we need to resume the event driver,
|
||||
* and we need to restore the LED settings to what they were when we
|
||||
* switched away.
|
||||
*/
|
||||
Bool
|
||||
xf86VTSwitchTo()
|
||||
{
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ) < 0)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* make sure the console driver thinks the console is in
|
||||
* graphics mode. Under mono we have to do the two as the
|
||||
* console driver only allows valid modes for the current
|
||||
* video card and Herc or vga are the only devices currently
|
||||
* supported.
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, SW_VGA12, 0) < 0)
|
||||
if (ioctl(xf86Info.consoleFd, SW_HGC_P0, 0) < 0)
|
||||
{
|
||||
ErrorF("Failed to set graphics mode : %s\n",
|
||||
strerror(errno));
|
||||
}
|
||||
ev_resume();
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ) < 0) {
|
||||
return(FALSE);
|
||||
} else {
|
||||
if (sco_ledstatus >= 0) {
|
||||
ioctl (xf86Info.consoleFd, KDSETLED, &sco_ledstate);
|
||||
}
|
||||
sco_ledstatus = -1;
|
||||
|
||||
/*
|
||||
* Convince the console driver this screen is in graphics mode,
|
||||
* otherwise it assumes it can do more to the screen than it should.
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) {
|
||||
ErrorF("Failed to set graphics mode (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,261 +1,324 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_init.c,v 3.10.2.1 1998/02/06 22:36:53 hohndel Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_init.c,v 3.14 2002/11/20 23:00:44 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David McCullough <davidm@stallion.oz.au>
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
* Copyright 2001 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the names of David McCullough and David Wexelblat
|
||||
* not be used in advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission. David McCullough and
|
||||
* David Wexelblat makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express or
|
||||
* implied warranty.
|
||||
*
|
||||
* DAVID MCCULLOUGH AND DAVID WEXELBLAT DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
* TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS, IN NO EVENT SHALL DAVID MCCULLOUGH OR DAVID WEXELBLAT BE
|
||||
* LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
* documentation, and that the name J. Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. J. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
/* $Xorg: sco_init.c,v 1.3 2000/08/17 19:51:28 cpqbld Exp $ */
|
||||
/* $XConsortium$ */
|
||||
|
||||
/* Re-written May 2001 to represent the current state of reality */
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
static Bool KeepTty = FALSE;
|
||||
static int VTnum = -1;
|
||||
static char *vtdevice = NULL;
|
||||
static int sco_console_mode = -1;
|
||||
|
||||
extern void xf86VTRequest(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern Bool mpxLock;
|
||||
|
||||
void xf86OpenConsole()
|
||||
void
|
||||
xf86OpenConsole()
|
||||
{
|
||||
int fd,wc;
|
||||
struct vt_mode VT;
|
||||
struct stat status;
|
||||
char vtname[11];
|
||||
|
||||
if (serverGeneration == 1)
|
||||
{
|
||||
/* check if we're run with euid==0 */
|
||||
if (geteuid() != 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Server must be running with root "
|
||||
"permissions\n"
|
||||
"You should be using Xwrapper to start the server or xdm.\n"
|
||||
"We strongly advise against making the server SUID root!\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* setup the virtual terminal manager
|
||||
*
|
||||
* SCO vts start at tty01 which is vt00, if you could call them VT's.
|
||||
* We use the numbers 1..X as it fits nicer with the device naming
|
||||
* scheme.
|
||||
*
|
||||
* In os/osinit.c we took the precuation of not closing stdin so that
|
||||
* we can use the current vt if no vt was specified on the command line
|
||||
*
|
||||
* Under SCO VT_OPENQRY does nothing at all
|
||||
* if nothing was specified we try to determine the VT from stdin
|
||||
*/
|
||||
if ((VTnum != -1) && (VTnum != 0))
|
||||
{
|
||||
wc = VTnum - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((fstat(0, &status) >= 0) && (status.st_mode & S_IFCHR))
|
||||
{
|
||||
wc = minor(status.st_rdev);
|
||||
}
|
||||
else
|
||||
{
|
||||
ErrorF("%s: Failed to stat stdin, using tty02 (%s)\n",
|
||||
"xf86OpenConsole", strerror(errno));
|
||||
wc = 1; /* tty02 */
|
||||
}
|
||||
}
|
||||
ErrorF("(using VT number %d)\n\n", wc + 1);
|
||||
|
||||
sprintf(vtname,"/dev/tty%02d", wc+1); /* /dev/tty[01-12] */
|
||||
|
||||
if ((xf86Info.consoleFd = open(vtname, O_RDWR | O_NDELAY, 0)) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Cannot open %s (%s)\n",
|
||||
vtname, strerror(errno));
|
||||
}
|
||||
|
||||
/* now we can dispose of stdin */
|
||||
|
||||
if (freopen(vtname, "r+", stdin) == (FILE *) NULL)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Cannot reopen stdin as %s (%s)\n",
|
||||
vtname, strerror(errno));
|
||||
}
|
||||
|
||||
/* now we can fixup stdout */
|
||||
|
||||
if (freopen(vtname, "r+", stdout) == (FILE *) NULL)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Cannot reopen stdout as %s (%s)\n",
|
||||
vtname, strerror(errno));
|
||||
}
|
||||
|
||||
/* We activate the console just in case its not the one we are on */
|
||||
xf86Info.vtno = wc;
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, wc) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
|
||||
xf86Config(FALSE); /* Read XF86Config */
|
||||
|
||||
if (!KeepTty)
|
||||
{
|
||||
setpgrp();
|
||||
}
|
||||
|
||||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if ((sco_console_mode = ioctl(xf86Info.consoleFd, CONS_GET, 0L)) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: VT_GETMODE failed on console (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VGA_IOPRIVL, 1) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: VGA_IOPRIVL failed for VGA acc (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: VT_GETMODE failed (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
signal(SIGUSR1, xf86VTRequest);
|
||||
|
||||
VT.mode = VT_PROCESS;
|
||||
VT.relsig = SIGUSR1;
|
||||
VT.acqsig = SIGUSR1;
|
||||
VT.frsig = SIGUSR1;
|
||||
VT.waitv = 0;
|
||||
if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n");
|
||||
}
|
||||
/*
|
||||
* make sure the console driver thinks the console is in graphics
|
||||
* mode. Under mono we have to do the two as the console driver only
|
||||
* allows valid modes for the current video card and Herc or vga are
|
||||
* the only devices currently supported.
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, SW_VGA12, 0) < 0)
|
||||
if (ioctl(xf86Info.consoleFd, SW_HGC_P0, 0) < 0)
|
||||
{
|
||||
ErrorF("Failed to set graphics mode (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
int fd,i, ioctl_ret;
|
||||
struct vt_mode VT;
|
||||
static char vtname[32];
|
||||
struct vid_info vidinf;
|
||||
struct sigaction sigvtsw;
|
||||
|
||||
if (serverGeneration == 1) {
|
||||
/* check if we're run with euid==0 */
|
||||
if (geteuid() != 0) {
|
||||
FatalError("xf86OpenConsole: Server must be setuid root\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* serverGeneration != 1 */
|
||||
/*
|
||||
* now get the VT
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up the virtual terminal (multiscreen in SCO parlance).
|
||||
* For the actual console itself, screens are numbered from
|
||||
* 1 to (usually) 16. However, it is possible to have a nested
|
||||
* server, and it is also possible to be on a multi-console
|
||||
* system such as MaxSpeed or SunRiver. Therefore, we should
|
||||
* not make any assumptions about the TTY name we are on, and
|
||||
* instead we rely on ttyname() to give us the real TTY name.
|
||||
* Previously, XFree86 tried to determine the TTY name manually.
|
||||
* This is wrong. The only time we need to futz with the TTY name
|
||||
* if if we were given the name of a TTY to run on explicity on
|
||||
* the command line.
|
||||
*/
|
||||
|
||||
if (VTnum == -1) {
|
||||
/*
|
||||
* We can query the current VT number using CONS_GETINFO.
|
||||
*/
|
||||
char *ttn;
|
||||
|
||||
vidinf.size = sizeof(vidinf);
|
||||
if (ioctl (0, CONS_GETINFO, &vidinf) < 0) {
|
||||
FatalError ("xf86OpenConsole: Not on a console device "
|
||||
"or error querying device (%s)\n", strerror (errno));
|
||||
}
|
||||
|
||||
VTnum = vidinf.m_num + 1; /* 0-based */
|
||||
ttn = ttyname (0);
|
||||
|
||||
if (ttn == (char *)0) {
|
||||
ErrorF ("xf86OpenConsole: Error determining TTY name (%s)\n",
|
||||
strerror(errno));
|
||||
snprintf (vtname, sizeof(vtname)-1, "/dev/tty%02d", VTnum);
|
||||
} else {
|
||||
strlcpy (vtname, ttn, sizeof(vtname));
|
||||
}
|
||||
vtdevice = vtname;
|
||||
} else if (VTnum == -2 || VTnum >= 0) {
|
||||
/*
|
||||
* An explicit device was specified. Make sure its a console device.
|
||||
*/
|
||||
if (VTnum != -2) {
|
||||
snprintf (vtname, sizeof(vtname)-1, "/dev/tty%02d", VTnum);
|
||||
vtdevice = vtname;
|
||||
}
|
||||
|
||||
fd = open (vtdevice, O_RDWR | O_NDELAY, 0);
|
||||
if (fd < 0) {
|
||||
FatalError ("xf86OpenConsole: Can not open device '%s' (%s)\n",
|
||||
vtdevice, strerror(errno));
|
||||
}
|
||||
|
||||
vidinf.size = sizeof(vidinf);
|
||||
if (ioctl (fd, CONS_GETINFO, &vidinf) < 0) {
|
||||
FatalError ("xf86OpenConsole: '%s' is not a console device "
|
||||
"or error querying device (%s)\n", vtname, strerror (errno));
|
||||
}
|
||||
VTnum = vidinf.m_num + 1; /* 0-based */
|
||||
close (fd); /* We're done with it for now */
|
||||
}
|
||||
return;
|
||||
|
||||
ErrorF("(using VT%02d device %s)\n\n", VTnum, vtdevice);
|
||||
|
||||
if ((xf86Info.consoleFd = open(vtdevice, O_RDWR | O_NDELAY, 0)) < 0) {
|
||||
FatalError("xf86OpenConsole: Cannot open %s (%s)\n", vtdevice,
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
/* Dispose of stdin and stdout */
|
||||
if (freopen(vtdevice, "r+", stdin) == (FILE *) NULL) {
|
||||
FatalError("xf86OpenConsole: Cannot reopen stdin as %s (%s)\n",
|
||||
vtdevice, strerror(errno));
|
||||
}
|
||||
|
||||
if (freopen(vtname, "r+", stdout) == (FILE *) NULL) {
|
||||
FatalError("xf86OpenConsole: Cannot reopen stdout as %s (%s)\n",
|
||||
vtdevice, strerror(errno));
|
||||
}
|
||||
|
||||
/*
|
||||
* We make 100% sure we use the correct VT number. This can get ugly
|
||||
* where there are multi-consoles in use, so we make sure we query
|
||||
* the kernel for the correct VT number. It knows best, we don't.
|
||||
*/
|
||||
vidinf.size = sizeof(vidinf);
|
||||
if (ioctl (xf86Info.consoleFd, CONS_GETINFO, &vidinf) < 0) {
|
||||
FatalError ("xf86OpenConsole: Failed to query console number (%s)\n",
|
||||
strerror (errno));
|
||||
}
|
||||
xf86Info.vtno = vidinf.m_num;
|
||||
|
||||
/* We activate the console just in case its not the one we are on */
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) {
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
/* Disassociate from controling TTY */
|
||||
if (!KeepTty) {
|
||||
setpgrp();
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we get the current mode that the console device is on. We will
|
||||
* use this later when we close the console device to restore it to
|
||||
* that same mode.
|
||||
*/
|
||||
if ((sco_console_mode = ioctl(xf86Info.consoleFd, CONS_GET, 0L)) < 0) {
|
||||
FatalError("xf86OpenConsole: CONS_GET failed on console (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0) {
|
||||
FatalError("xf86OpenConsole: VT_GETMODE failed (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
sigvtsw.sa_handler = xf86VTRequest;
|
||||
sigfillset(&sigvtsw.sa_mask);
|
||||
sigvtsw.sa_flags = 0;
|
||||
|
||||
/* NOTE: Using sigaction means we dont have to re-arm the signal */
|
||||
sigaction(SIGUSR1, &sigvtsw, NULL);
|
||||
|
||||
VT.mode = VT_PROCESS;
|
||||
VT.relsig = SIGUSR1;
|
||||
VT.acqsig = SIGUSR1;
|
||||
VT.frsig = SIGINT; /* Not implemented */
|
||||
VT.waitv = 0;
|
||||
|
||||
/*
|
||||
* The SCO X server tries the following call 5 times. Lets do the same
|
||||
* thing. It shouldn't really be required but sometimes things take a
|
||||
* while to settle down when switching screens. *helpless shrug* I know
|
||||
* its sucks but ...
|
||||
*/
|
||||
|
||||
ioctl_ret = 0;
|
||||
for (i = 0; i < 5; i++) {
|
||||
ioctl_ret = ioctl(xf86Info.consoleFd, VT_SETMODE, &VT);
|
||||
if (ioctl_ret >= 0)
|
||||
break;
|
||||
usleep(999999); /* Dont use nap() - it forces linking with -lx */
|
||||
}
|
||||
|
||||
if (ioctl_ret < 0) {
|
||||
FatalError("xf86OpenConsole: VT_SETMODE failed (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
/*
|
||||
* Convince the console driver we are in graphics mode.
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) {
|
||||
ErrorF("Failed to set graphics mode (%s)\n", strerror(errno));
|
||||
}
|
||||
} else { /* serverGeneration != 1 */
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) {
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed (%s)\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void xf86CloseConsole()
|
||||
/*
|
||||
* Restore the console to its previous state. This may cause flicker if
|
||||
* the screen was previous in a graphics mode, because we first set it
|
||||
* to text mode. This has the advantage of getting the console driver
|
||||
* to do a soft reset on the card, which really does help settle the
|
||||
* video card down again after coming out of Xfree86.
|
||||
*/
|
||||
void
|
||||
xf86CloseConsole()
|
||||
{
|
||||
struct vt_mode VT;
|
||||
struct vt_mode VT;
|
||||
struct sigaction sigvtsw;
|
||||
|
||||
ioctl(xf86Info.consoleFd, VT_RELDISP, 1);
|
||||
if (sco_console_mode != -1)
|
||||
{
|
||||
ioctl(xf86Info.consoleFd, MODESWITCH | sco_console_mode, 0L);
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1)
|
||||
{
|
||||
VT.mode = VT_AUTO;
|
||||
ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* set dflt vt handling */
|
||||
}
|
||||
close(xf86Info.consoleFd); /* make the vt-manager happy */
|
||||
return;
|
||||
/* Set text mode (possibly briefly) */
|
||||
ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT0);
|
||||
|
||||
/* Restore the original mode */
|
||||
if (sco_console_mode != -1) {
|
||||
ioctl(xf86Info.consoleFd, MODESWITCH | sco_console_mode, 0L);
|
||||
}
|
||||
|
||||
ioctl(xf86Info.consoleFd, VT_RELDISP, 1); /* Release the display */
|
||||
|
||||
sigvtsw.sa_handler = SIG_DFL;
|
||||
sigfillset(&sigvtsw.sa_mask);
|
||||
sigvtsw.sa_flags = 0;
|
||||
|
||||
sigaction(SIGUSR1, &sigvtsw, NULL);
|
||||
|
||||
VT.mode = VT_AUTO;
|
||||
VT.waitv = 0;
|
||||
VT.relsig = SIGUSR1;
|
||||
VT.acqsig = SIGUSR1;
|
||||
VT.frsig = SIGINT;
|
||||
ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* Revert to auto handling */
|
||||
|
||||
close(xf86Info.consoleFd); /* We're done with the device */
|
||||
}
|
||||
|
||||
int xf86ProcessArgument(argc, argv, i)
|
||||
int argc;
|
||||
char *argv[];
|
||||
int i;
|
||||
int
|
||||
xf86ProcessArgument(int argc, char *argv[], int i)
|
||||
{
|
||||
/*
|
||||
* Keep server from detaching from controlling tty. This is useful
|
||||
* when debugging (so the server can receive keyboard signals.
|
||||
*/
|
||||
if (!strcmp(argv[i], "-keeptty"))
|
||||
{
|
||||
KeepTty = TRUE;
|
||||
return(1);
|
||||
}
|
||||
if ((argv[i][0] == 'v') && (argv[i][1] == 't'))
|
||||
{
|
||||
if (sscanf(argv[i], "vt%2d", &VTnum) == 0)
|
||||
{
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
if (!strcmp(argv[i], "-crt"))
|
||||
{
|
||||
if ((++i > argc) ||
|
||||
(sscanf(argv[i], "/dev/tty%2d", &VTnum) == 0))
|
||||
{
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
/*
|
||||
* Keep server from detaching from controlling tty. This is useful
|
||||
* when debugging (so the server can receive keyboard signals).
|
||||
*/
|
||||
if (!strcmp(argv[i], "-keeptty")) {
|
||||
KeepTty = TRUE;
|
||||
return(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* By default, the X server wants to bind itself to CPU 0. This makes
|
||||
* sure that the server has full access to the I/O ports at IOPL 3.
|
||||
* Some SMP systems have trouble with I/O on CPU's other than 0. If,
|
||||
* however, you have a system that is well behaved, you can specify
|
||||
* this argument and let the scheduler decide which CPU the server
|
||||
* should run on.
|
||||
*/
|
||||
if (!strcmp(argv[i], "-nompxlock")) {
|
||||
mpxLock = FALSE;
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Specify the VT number to run on (NOT the device).
|
||||
*/
|
||||
if ((argv[i][0] == 'v') && (argv[i][1] == 't')) {
|
||||
if (sscanf(argv[i], "vt%2d", &VTnum) == 0) {
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
}
|
||||
if (VTnum <= 0) {
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use a device the user specifies.
|
||||
*/
|
||||
if (!strcmp(argv[i], "-crt")) {
|
||||
if (++i > argc) {
|
||||
UseMsg();
|
||||
VTnum = -1;
|
||||
return(0);
|
||||
} else {
|
||||
VTnum = -2;
|
||||
vtdevice = argv[i];
|
||||
return(2);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
void xf86UseMsg()
|
||||
void
|
||||
xf86UseMsg()
|
||||
{
|
||||
ErrorF("vtXX use the specified VT number\n");
|
||||
ErrorF("-crt /dev/ttyXX use the specified VT number\n");
|
||||
ErrorF("-crt DEVICE use the specified VT device\n");
|
||||
ErrorF("-nompxlock dont bind X server to CPU 0\n");
|
||||
ErrorF("-keeptty ");
|
||||
ErrorF("don't detach controlling tty (for debugging only)\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,117 +1,273 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_io.c,v 3.3 1996/12/23 06:50:49 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_io.c,v 3.10 2003/02/17 15:11:59 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David McCullough <davidm@stallion.oz.au>
|
||||
* Copyright 1993 by David Dawes <dawes@physics.su.oz.au>
|
||||
* Copyright 2001 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the names of David McCullough and David Dawes
|
||||
* not be used in advertising or publicity pertaining to distribution of
|
||||
* the software without specific, written prior permission. David McCullough
|
||||
* and David Dawes makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express or
|
||||
* implied warranty.
|
||||
*
|
||||
* DAVID MCCULLOUGH AND DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS, IN NO EVENT SHALL DAVID MCCULLOUGH OR DAVID DAWES BE LIABLE FOR
|
||||
* ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
|
||||
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
|
||||
* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
* documentation, and that the name J. Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. J. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
/* $Xorg: sco_io.c,v 1.3 2000/08/17 19:51:29 cpqbld Exp $ */
|
||||
/* $XConsortium$ */
|
||||
|
||||
/* Re-written May 2001 to represent the current state of reality */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#define _NEED_SYSI86
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86OSpriv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86_Config.h"
|
||||
|
||||
void xf86SoundKbdBell(loudness, pitch, duration)
|
||||
int loudness;
|
||||
int pitch;
|
||||
int duration;
|
||||
#include <sys/param.h>
|
||||
#include <sys/emap.h>
|
||||
#include <sys/nmap.h>
|
||||
|
||||
void
|
||||
xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||||
{
|
||||
if (loudness && pitch)
|
||||
{
|
||||
ioctl(xf86Info.consoleFd, KIOCSOUND, 1193180 / pitch);
|
||||
usleep(duration * loudness * 20);
|
||||
ioctl(xf86Info.consoleFd, KIOCSOUND, 0);
|
||||
}
|
||||
if (loudness && pitch) {
|
||||
ioctl(xf86Info.consoleFd, KIOCSOUND, 1193180 / pitch);
|
||||
usleep(duration * loudness * 20);
|
||||
ioctl(xf86Info.consoleFd, KIOCSOUND, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void xf86SetKbdLeds(leds)
|
||||
int leds;
|
||||
void
|
||||
xf86SetKbdLeds(int leds)
|
||||
{
|
||||
/*
|
||||
* sleep the first time through under SCO. There appears to be a
|
||||
* timing problem in the driver which causes the keyboard to be lost.
|
||||
* This sleep stops it from occurring. The sleep could proably be
|
||||
* a lot shorter as even trace can fix the problem. You may
|
||||
* prefer a usleep(100).
|
||||
*/
|
||||
static int once = 1;
|
||||
/*
|
||||
* sleep the first time through under SCO. There appears to be a
|
||||
* timing problem in the driver which causes the keyboard to be lost.
|
||||
* This usleep stops it from occurring. NOTE: this was in the old code.
|
||||
* I am not convinced it is true any longer, but it doesn't hurt to
|
||||
* leave this in here.
|
||||
*/
|
||||
static int once = 1;
|
||||
|
||||
if (once)
|
||||
{
|
||||
sleep(1);
|
||||
once = 0;
|
||||
}
|
||||
ioctl(xf86Info.consoleFd, KDSETLED, leds );
|
||||
if (once) {
|
||||
usleep(100);
|
||||
once = 0;
|
||||
}
|
||||
|
||||
ioctl(xf86Info.consoleFd, KDSETLED, leds );
|
||||
}
|
||||
|
||||
void xf86MouseInit(mouse)
|
||||
MouseDevPtr mouse;
|
||||
int
|
||||
xf86GetKbdLeds()
|
||||
{
|
||||
if ((mouse->mseFd = open(mouse->mseDevice, O_RDWR | O_NDELAY)) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Cannot open mouse (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return;
|
||||
}
|
||||
FatalError("Cannot open mouse (%s)\n", strerror(errno));
|
||||
}
|
||||
int leds;
|
||||
|
||||
ioctl (xf86Info.consoleFd, KDGETLED, &leds);
|
||||
return leds;
|
||||
}
|
||||
|
||||
int xf86MouseOn(mouse)
|
||||
MouseDevPtr mouse;
|
||||
/*
|
||||
* Much of the code in this function is duplicated from the Linux code
|
||||
* by Orest Zborowski <obz@Kodak.com> and David Dawes <dawes@xfree86.org>.
|
||||
* Please see the file ../linux/lnx_io.c for full copyright information.
|
||||
*
|
||||
* NOTE: Only OpenServer Release 5.0.6 with Release Supplement 5.0.6A
|
||||
* and later have the required ioctl. 5.0.6A or higher is HIGHLY
|
||||
* recommended. The console driver is quite a different beast on that OS.
|
||||
*/
|
||||
void
|
||||
xf86SetKbdRepeat(char rad)
|
||||
{
|
||||
xf86SetupMouse(mouse);
|
||||
#if defined(KBIO_SETRATE)
|
||||
int i;
|
||||
int value = 0x7f; /* Maximum delay with slowest rate */
|
||||
int delay = 250; /* Default delay */
|
||||
int rate = 300; /* Default repeat rate */
|
||||
|
||||
/* Flush any pending input */
|
||||
ioctl(mouse->mseFd, TCFLSH, 0);
|
||||
static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
|
||||
133, 120, 109, 100, 92, 86, 80, 75, 67,
|
||||
60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
|
||||
25, 23, 21, 20 };
|
||||
#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
|
||||
|
||||
return(mouse->mseFd);
|
||||
static int valid_delays[] = { 250, 500, 750, 1000 };
|
||||
#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
|
||||
|
||||
if (xf86Info.kbdRate >= 0)
|
||||
rate = xf86Info.kbdRate * 10;
|
||||
if (xf86Info.kbdDelay >= 0)
|
||||
delay = xf86Info.kbdDelay;
|
||||
|
||||
for (i = 0; i < RATE_COUNT; i++)
|
||||
if (rate >= valid_rates[i]) {
|
||||
value &= 0x60;
|
||||
value |= i;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = 0; i < DELAY_COUNT; i++)
|
||||
if (delay <= valid_delays[i]) {
|
||||
value &= 0x1f;
|
||||
value |= i << 5;
|
||||
break;
|
||||
}
|
||||
|
||||
ioctl (xf86Info.consoleFd, KBIO_SETRATE, value);
|
||||
#endif /* defined(KBIO_SETRATE) */
|
||||
}
|
||||
|
||||
int xf86MouseOff(mouse, doclose)
|
||||
MouseDevPtr mouse;
|
||||
Bool doclose;
|
||||
static Bool use_tcs = TRUE, use_kd = TRUE;
|
||||
static Bool no_nmap = TRUE, no_emap = TRUE;
|
||||
static int orig_getsc, orig_kbm;
|
||||
static struct termios orig_termios;
|
||||
static keymap_t keymap, noledmap;
|
||||
static uchar_t *sc_mapbuf;
|
||||
static uchar_t *sc_mapbuf2;
|
||||
|
||||
void
|
||||
xf86KbdInit()
|
||||
{
|
||||
if (mouse->mseFd >= 0)
|
||||
{
|
||||
if (mouse->mseType == P_LOGI)
|
||||
{
|
||||
write(mouse->mseFd, "U", 1);
|
||||
xf86SetMouseSpeed(mouse, mouse->baudRate,
|
||||
mouse->oldBaudRate,
|
||||
xf86MouseCflags[P_LOGI]);
|
||||
}
|
||||
if (doclose)
|
||||
{
|
||||
close(mouse->mseFd);
|
||||
}
|
||||
}
|
||||
return(mouse->mseFd);
|
||||
orig_getsc = 0;
|
||||
if (ioctl (xf86Info.consoleFd, TCGETSC, &orig_getsc) < 0)
|
||||
use_tcs = FALSE;
|
||||
if (ioctl (xf86Info.consoleFd, KDGKBMODE, &orig_kbm) < 0)
|
||||
use_kd = FALSE;
|
||||
|
||||
if (!use_tcs && !use_kd)
|
||||
FatalError ("xf86KbdInit: Could not determine keyboard mode\n");
|
||||
|
||||
/*
|
||||
* One day this should be fixed to translate normal ASCII characters
|
||||
* back into scancodes or into events that XFree86 wants, but not
|
||||
* now. For the time being, we only support scancode mode screens.
|
||||
*/
|
||||
if (use_tcs && !(orig_getsc & KB_ISSCANCODE))
|
||||
FatalError ("xf86KbdInit: Keyboard can not send scancodes\n");
|
||||
|
||||
/*
|
||||
* We need to get the original keyboard map and NUL out the lock
|
||||
* modifiers. This prevents the scancode API from messing with
|
||||
* the keyboard LED's. We restore the original map when we exit.
|
||||
*/
|
||||
if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &keymap) < 0) {
|
||||
FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &noledmap) < 0) {
|
||||
FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
|
||||
strerror(errno));
|
||||
} else {
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < noledmap.n_keys; i++) {
|
||||
for (j = 0; j < NUM_STATES; j++) {
|
||||
if (IS_SPECIAL(noledmap, i, j) &&
|
||||
((noledmap.key[i].map[j] == K_CLK) ||
|
||||
(noledmap.key[i].map[j] == K_NLK) ||
|
||||
(noledmap.key[i].map[j] == K_SLK))) {
|
||||
noledmap.key[i].map[j] = K_NOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ioctl (xf86Info.consoleFd, XCGETA, &orig_termios) < 0) {
|
||||
FatalError ("xf86KbdInit: Failed to get terminal modes (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
sc_mapbuf = xalloc (10*BSIZE);
|
||||
sc_mapbuf2 = xalloc(10*BSIZE);
|
||||
|
||||
/* Get the emap */
|
||||
if (ioctl (xf86Info.consoleFd, LDGMAP, sc_mapbuf) < 0) {
|
||||
if (errno != ENAVAIL) {
|
||||
FatalError ("xf86KbdInit: Failed to retrieve e-map (%s)\n",
|
||||
strerror (errno));
|
||||
}
|
||||
no_emap = FALSE;
|
||||
}
|
||||
|
||||
/* Get the nmap */
|
||||
if (ioctl (xf86Info.consoleFd, NMGMAP, sc_mapbuf2) < 0) {
|
||||
if (errno != ENAVAIL) {
|
||||
FatalError ("xf86KbdInit: Failed to retrieve n-map (%s)\n",
|
||||
strerror (errno));
|
||||
}
|
||||
no_nmap = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
xf86KbdOn()
|
||||
{
|
||||
struct termios newtio;
|
||||
|
||||
ioctl (xf86Info.consoleFd, LDNMAP); /* Turn e-mapping off */
|
||||
ioctl (xf86Info.consoleFd, NMNMAP); /* Turn n-mapping off */
|
||||
|
||||
newtio = orig_termios; /* structure copy */
|
||||
newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
|
||||
newtio.c_oflag = 0;
|
||||
newtio.c_cflag = CREAD | CS8 | B9600;
|
||||
newtio.c_lflag = 0;
|
||||
newtio.c_cc[VTIME]=0;
|
||||
newtio.c_cc[VMIN]=1;
|
||||
cfsetispeed(&newtio, 9600);
|
||||
cfsetospeed(&newtio, 9600);
|
||||
ioctl(xf86Info.consoleFd, XCSETA, &newtio);
|
||||
|
||||
/* Now tell the keyboard driver to send us raw scancodes */
|
||||
if (use_tcs) {
|
||||
int nm = orig_getsc;
|
||||
nm &= ~KB_XSCANCODE;
|
||||
ioctl (xf86Info.consoleFd, TCSETSC, &nm);
|
||||
}
|
||||
|
||||
if (use_kd)
|
||||
ioctl (xf86Info.consoleFd, KDSKBMODE, K_RAW);
|
||||
|
||||
ioctl (xf86Info.consoleFd, PIO_KEYMAP, &noledmap);
|
||||
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
int
|
||||
xf86KbdOff()
|
||||
{
|
||||
/* Revert back to original translate scancode mode */
|
||||
if (use_tcs)
|
||||
ioctl (xf86Info.consoleFd, TCSETSC, &orig_getsc);
|
||||
if (use_kd)
|
||||
ioctl (xf86Info.consoleFd, KDSKBMODE, orig_kbm);
|
||||
|
||||
ioctl (xf86Info.consoleFd, PIO_KEYMAP, &keymap);
|
||||
|
||||
if (no_emap)
|
||||
ioctl (xf86Info.consoleFd, LDSMAP, sc_mapbuf);
|
||||
if (no_nmap)
|
||||
ioctl (xf86Info.consoleFd, NMSMAP, sc_mapbuf2);
|
||||
|
||||
ioctl(xf86Info.consoleFd, XCSETA, &orig_termios);
|
||||
|
||||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
#include "xf86OSKbd.h"
|
||||
|
||||
Bool
|
||||
xf86OSKbdPreInit(InputInfoPtr pInfo)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,175 +1,265 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_mouse.c,v 3.8 1996/12/23 06:50:50 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_mouse.c,v 3.13 2002/11/20 23:07:50 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 2001 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the name J. Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. J. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $XConsortium$ */
|
||||
|
||||
|
||||
|
||||
|
||||
/* $Xorg: sco_mouse.c,v 1.3 2000/08/17 19:51:29 cpqbld Exp $ */
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSmouse.h"
|
||||
#include "mipointer.h"
|
||||
#include <sys/event.h>
|
||||
#include <mouse.h>
|
||||
|
||||
/******************************************************************************/
|
||||
#ifdef USE_OSMOUSE
|
||||
/******************************************************************************/
|
||||
|
||||
#include <sys/event.h>
|
||||
#include <mouse.h>
|
||||
#include "xf86_Config.h"
|
||||
|
||||
static dmask_t real_mask = (dmask_t) (D_REL | D_BUTTON);
|
||||
static int config_buttons = 0;
|
||||
|
||||
extern int miPointerGetMotionEvents(DeviceIntPtr pPtr, xTimecoord *coords,
|
||||
unsigned long start, unsigned long stop,
|
||||
ScreenPtr pScreen);
|
||||
|
||||
/******************************************************************************/
|
||||
/*
|
||||
* Handle any XF86Config options for "OsMouse", How you treat errors
|
||||
* is up to you, they may or may not be Fatal
|
||||
*/
|
||||
|
||||
void
|
||||
xf86OsMouseOption(lt, lp)
|
||||
int lt; /* type returned by gettoken */
|
||||
pointer lp; /* The lexical return symbol */
|
||||
static int
|
||||
SupportedInterfaces (void)
|
||||
{
|
||||
if (lt != NUMBER) {
|
||||
ErrorF("%s: Invalid Argument to OsMouse, %s\n",
|
||||
"xf86OsMouseOption", "Number of buttons expected");
|
||||
return;
|
||||
}
|
||||
config_buttons = ((LexPtr)lp)->num;
|
||||
/* FIXME: Is this correct? Should we just return MSE_MISC? */
|
||||
return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_MISC | MSE_AUTO;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/*
|
||||
* xf86OsMouseProc --
|
||||
* Handle the initialization, etc. of a mouse
|
||||
*/
|
||||
static const char *internalNames[] = {
|
||||
"OSMouse",
|
||||
NULL
|
||||
};
|
||||
|
||||
int
|
||||
xf86OsMouseProc(pPointer, what)
|
||||
DeviceIntPtr pPointer;
|
||||
int what;
|
||||
static const char **
|
||||
BuiltinNames (void)
|
||||
{
|
||||
unchar *map;
|
||||
int i, err, buttons;
|
||||
struct devinfo *dip;
|
||||
dmask_t dmask;
|
||||
return internalNames;
|
||||
}
|
||||
|
||||
static Bool
|
||||
CheckProtocol (const char *protocol)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; internalNames[i]; i++) {
|
||||
if (xf86NameCmp (protocol, internalNames[i]) == 0)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static const char *
|
||||
DefaultProtocol (void)
|
||||
{
|
||||
return "OSMouse";
|
||||
}
|
||||
|
||||
static const char *
|
||||
evtErrStr (int evterr)
|
||||
{
|
||||
switch (evterr) {
|
||||
case -1: return "error in config files";
|
||||
case -2: return "no mouse devices to attach";
|
||||
case -3: return "unable to open device";
|
||||
case -4: return "unable to open event queue";
|
||||
case -999: return "unable to initialize event driver";
|
||||
default: return "unknown event driver error";
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
OsMouseProc (DeviceIntPtr pPointer, int what)
|
||||
{
|
||||
InputInfoPtr pInfo;
|
||||
MouseDevPtr pMse;
|
||||
unsigned char map[9];
|
||||
dmask_t dmask;
|
||||
MessageType from = X_CONFIG;
|
||||
int evi;
|
||||
|
||||
pInfo = pPointer->public.devicePrivate;
|
||||
pMse = pInfo->private;
|
||||
pMse->device = pPointer;
|
||||
|
||||
switch (what) {
|
||||
case DEVICE_INIT:
|
||||
|
||||
pPointer->public.on = FALSE;
|
||||
case DEVICE_INIT:
|
||||
pPointer->public.on = FALSE;
|
||||
|
||||
if (ev_init() < 0)
|
||||
ErrorF("ev_init: Failed to initialize event driver\n");
|
||||
|
||||
dmask = real_mask;
|
||||
xf86Info.mouseDev->mseFd = ev_open(&dmask);
|
||||
switch (xf86Info.mouseDev->mseFd) {
|
||||
case -1: FatalError("ev_open: Error in Configuration files\n");
|
||||
case -2: FatalError("ev_open: No mouse devices to attach\n");
|
||||
case -3: FatalError("ev_open: Unable to open a found device\n");
|
||||
case -4: FatalError("ev_open: unable to open an event queue\n");
|
||||
default:
|
||||
if (xf86Info.mouseDev->mseFd < 0)
|
||||
FatalError("ev_open: Failed to open device, reason unkown\n");
|
||||
break;
|
||||
}
|
||||
if (dmask != real_mask)
|
||||
FatalError("Could not attach the mouse device (0x%x)\n", dmask);
|
||||
|
||||
dip = (struct devinfo *) NULL;
|
||||
if ((dip = ev_getdev(D_REL, dip)) == (struct devinfo *) NULL)
|
||||
FatalError("Could not find info on mouse device\n");
|
||||
|
||||
buttons = config_buttons > 0 ? config_buttons : ((int) dip->buttons);
|
||||
buttons = buttons > 0 ? buttons : 3; /* just in case */
|
||||
|
||||
ErrorF("%s OsMouse has %d buttons\n",
|
||||
buttons == config_buttons ? XCONFIG_GIVEN : XCONFIG_PROBED,
|
||||
buttons);
|
||||
|
||||
map = (unchar *) xalloc(buttons + 1);
|
||||
if (map == (unchar *) NULL)
|
||||
FatalError("Failed to allocate OsMouse map structure\n");
|
||||
|
||||
for (i = 1; i <= buttons; i++)
|
||||
map[i] = i;
|
||||
|
||||
InitPointerDeviceStruct((DevicePtr)pPointer,
|
||||
map,
|
||||
buttons,
|
||||
miPointerGetMotionEvents,
|
||||
(PtrCtrlProcPtr)xf86MseCtrl,
|
||||
0);
|
||||
xfree(map);
|
||||
ev_suspend(); /* suspend device until its turned on */
|
||||
break;
|
||||
|
||||
case DEVICE_ON:
|
||||
ev_resume();
|
||||
AddEnabledDevice(xf86Info.mouseDev->mseFd);
|
||||
xf86Info.mouseDev->lastButtons = 0;
|
||||
xf86Info.mouseDev->emulateState = 0;
|
||||
pPointer->public.on = TRUE;
|
||||
break;
|
||||
|
||||
case DEVICE_CLOSE:
|
||||
case DEVICE_OFF:
|
||||
pPointer->public.on = FALSE;
|
||||
RemoveEnabledDevice(xf86Info.mouseDev->mseFd);
|
||||
if (what == DEVICE_CLOSE) {
|
||||
ev_close();
|
||||
xf86Info.mouseDev->mseFd = -1;
|
||||
} else
|
||||
ev_suspend();
|
||||
break;
|
||||
dmask = D_REL | D_BUTTON;
|
||||
if ((evi = ev_init()) < 0) {
|
||||
FatalError ("OsMouseProc: Event driver initialization failed (%s)\n",
|
||||
evtErrStr(evi));
|
||||
}
|
||||
|
||||
pInfo->fd = ev_open (&dmask);
|
||||
if (pInfo->fd < 0) {
|
||||
FatalError ("OsMouseProc: DEVICE_INIT failed (%s)\n", evtErrStr(pInfo->fd));
|
||||
}
|
||||
|
||||
pMse->buttons = xf86SetIntOption (pInfo->options, "Buttons", 0);
|
||||
if (pMse->buttons == 0) {
|
||||
pMse->buttons = 8;
|
||||
from = X_DEFAULT;
|
||||
}
|
||||
xf86Msg (from, "%s: Buttons: %d\n", pInfo->name, pMse->buttons);
|
||||
|
||||
map[1] = 1;
|
||||
map[2] = 2;
|
||||
map[3] = 3;
|
||||
map[4] = 6;
|
||||
map[5] = 7;
|
||||
map[6] = 8;
|
||||
map[7] = 4;
|
||||
map[8] = 5; /* Compatibile with SCO X server */
|
||||
|
||||
InitPointerDeviceStruct((DevicePtr)pPointer, map, 8,
|
||||
miPointerGetMotionEvents, pMse->Ctrl,
|
||||
miPointerGetMotionBufferSize());
|
||||
|
||||
/* X valuator */
|
||||
xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
|
||||
xf86InitValuatorDefaults(pPointer, 0);
|
||||
|
||||
/* Y valuator */
|
||||
xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
|
||||
xf86InitValuatorDefaults(pPointer, 1);
|
||||
|
||||
xf86MotionHistoryAllocate(pInfo);
|
||||
|
||||
ev_flush();
|
||||
ev_suspend();
|
||||
break;
|
||||
|
||||
case DEVICE_ON:
|
||||
pMse->lastButtons = 0;
|
||||
pMse->emulateState = 0;
|
||||
pPointer->public.on = TRUE;
|
||||
ev_resume();
|
||||
AddEnabledDevice (pInfo->fd);
|
||||
break;
|
||||
|
||||
case DEVICE_OFF:
|
||||
case DEVICE_CLOSE:
|
||||
pPointer->public.on = TRUE;
|
||||
RemoveEnabledDevice (pInfo->fd);
|
||||
if (what == DEVICE_CLOSE) {
|
||||
ev_close();
|
||||
pInfo->fd = -1;
|
||||
} else {
|
||||
ev_suspend();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
/*
|
||||
* xf86OsMouseEvents --
|
||||
* Get some events from our queue. Process all outstanding events now.
|
||||
*/
|
||||
|
||||
void
|
||||
xf86OsMouseEvents()
|
||||
static void
|
||||
OsMouseReadInput (InputInfoPtr pInfo)
|
||||
{
|
||||
EVENT *evp;
|
||||
static long time = -1;
|
||||
MouseDevPtr pMse;
|
||||
EVENT *evp;
|
||||
|
||||
while ((evp = ev_read()) != (EVENT *) NULL ) {
|
||||
#if DEBUG
|
||||
if (time == -1)
|
||||
time = EV_TIME(*evp);
|
||||
ErrorF("sco_event time(%ld) tag(%d) butts(%d) x(%ld) y(%ld)\n",
|
||||
EV_TIME(*evp) - time, EV_TAG(*evp), EV_BUTTONS(*evp),
|
||||
EV_DX(*evp), EV_DY(*evp));
|
||||
#endif
|
||||
xf86PostMseEvent(xf86Info.pMouse,EV_BUTTONS(*evp), EV_DX(*evp), -(EV_DY(*evp)));
|
||||
ev_pop();
|
||||
}
|
||||
pMse = pInfo->private;
|
||||
|
||||
xf86Info.inputPending = TRUE;
|
||||
while ((evp = ev_read()) != (EVENT *)0) {
|
||||
int buttons = EV_BUTTONS(*evp);
|
||||
int dx = EV_DX(*evp), dy = -(EV_DY(*evp)), dz = 0, dw = 0;
|
||||
|
||||
if (EV_TAG(*evp) & T_WHEEL) {
|
||||
dz = (dy & 0x08) ? (dy & 0x0f) - 16 : (dy & 0x0f);
|
||||
dx = dy = 0;
|
||||
pMse->PostEvent (pInfo, buttons, dx, dy, dz, dw);
|
||||
/* Simulate button release */
|
||||
dz = 0;
|
||||
buttons &= ~(WHEEL_FWD | WHEEL_BACK);
|
||||
}
|
||||
|
||||
pMse->PostEvent (pInfo, buttons, dx, dy, dz, dw);
|
||||
ev_pop();
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
#endif /* USE_OSMOUSE */
|
||||
/******************************************************************************/
|
||||
static Bool
|
||||
OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
|
||||
{
|
||||
MouseDevPtr pMse;
|
||||
|
||||
/* This is called when the protocol is "OSMouse". */
|
||||
|
||||
pMse = pInfo->private;
|
||||
pMse->protocol = protocol;
|
||||
xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
|
||||
|
||||
/* Collect the options, and process the common options. */
|
||||
xf86CollectInputOptions(pInfo, NULL, NULL);
|
||||
xf86ProcessCommonOptions(pInfo, pInfo->options);
|
||||
|
||||
/* Check if the device can be opened. */
|
||||
pInfo->fd = ev_init();
|
||||
if (pInfo->fd != -1) {
|
||||
dmask_t dmask = (D_REL | D_BUTTON);
|
||||
pInfo->fd = ev_open(&dmask);
|
||||
} else {
|
||||
pInfo->fd = -999;
|
||||
}
|
||||
|
||||
if (pInfo->fd < 0) {
|
||||
if (xf86GetAllowMouseOpenFail())
|
||||
xf86Msg(X_WARNING, "%s: cannot open event manager (%s)\n",
|
||||
pInfo->name, evtErrStr(pInfo->fd));
|
||||
else {
|
||||
xf86Msg(X_ERROR, "%s: cannot open event manager (%s)\n",
|
||||
pInfo->name, evtErrStr(pInfo->fd));
|
||||
xfree(pMse);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
ev_close();
|
||||
pInfo->fd = -1;
|
||||
|
||||
/* Process common mouse options (like Emulate3Buttons, etc). */
|
||||
pMse->CommonOptions(pInfo);
|
||||
|
||||
/* Setup the local procs. */
|
||||
pInfo->device_control = OsMouseProc;
|
||||
pInfo->read_input = OsMouseReadInput;
|
||||
|
||||
pInfo->flags |= XI86_CONFIGURED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
OSMouseInfoPtr
|
||||
xf86OSMouseInit (int flags)
|
||||
{
|
||||
OSMouseInfoPtr p;
|
||||
|
||||
p = xcalloc(sizeof(OSMouseInfoRec), 1);
|
||||
if (!p)
|
||||
return NULL;
|
||||
|
||||
p->SupportedInterfaces = SupportedInterfaces;
|
||||
p->BuiltinNames = BuiltinNames;
|
||||
p->DefaultProtocol = DefaultProtocol;
|
||||
p->CheckProtocol = CheckProtocol;
|
||||
p->PreInit = OsMousePreInit;
|
||||
|
||||
return p;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,29 +1,41 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_video.c,v 3.2.2.1 1997/07/19 04:59:31 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sco/sco_video.c,v 3.8 2002/06/03 21:22:10 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David McCullough <davidm@stallion.oz.au>
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
* Copyright 2001 by J. Kean Johnston <jkj@sco.com>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the names of David McCullough and David Wexelblat
|
||||
* not be used in advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission. David McCullough and
|
||||
* David Wexelblat makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express or
|
||||
* implied warranty.
|
||||
*
|
||||
* DAVID MCCULLOUGH AND DAVID WEXELBLAT DISCLAIM ALL WARRANTIES WITH REGARD
|
||||
* TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS, IN NO EVENT SHALL DAVID MCCULLOUGH OR DAVID WEXELBLAT BE
|
||||
* LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
* documentation, and that the name J. Kean Johnston not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. J. Kean Johnston makes no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
||||
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
/* $XConsortium$ */
|
||||
|
||||
/* Re-written May 2001 to represent the current state of reality */
|
||||
|
||||
/*
|
||||
* This file contains the completely re-written SCO OpenServer video
|
||||
* routines for XFree86 4.x. Much of this is based on the SCO X server
|
||||
* code (which is an X11R5 server) and will probably only work on
|
||||
* OpenServer versions 5.0.5, 5.0.6 and later. Please send me (jkj@sco.com)
|
||||
* email if you have any questions.
|
||||
*
|
||||
* Ideally, you should use OSR5.0.6A or later, with the updated console
|
||||
* driver for 5.0.6A (its the default driver in 5.0.7 and later).
|
||||
* However, if you are running on an older system, this code will detect
|
||||
* that and adjust accordingly.
|
||||
*/
|
||||
/* $Xorg: sco_video.c,v 1.3 2000/08/17 19:51:29 cpqbld Exp $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
|
|
@ -32,253 +44,248 @@
|
|||
#define _NEED_SYSI86
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86OSpriv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
#include <sys/ci/ciioctl.h>
|
||||
#define MPXNAME "/dev/atp1"
|
||||
#define BASECPU 1
|
||||
|
||||
Bool mpxLock = TRUE;
|
||||
|
||||
#define USE_VASMETHOD 1
|
||||
|
||||
/***************************************************************************/
|
||||
/* Video Memory Mapping section */
|
||||
/***************************************************************************/
|
||||
|
||||
static struct kd_memloc MapDSC[MAXSCREENS][NUM_REGIONS];
|
||||
static int ver_once = 1;
|
||||
static int sco_mcdone = 0, sco_ismc = 0;
|
||||
|
||||
/***************************************************************************/
|
||||
/*
|
||||
* To map the video-memory, we use the MAP_CLASS ioctl.
|
||||
* Different drivers may have to do another one of these
|
||||
* for their own special registers (ie., ATI). To find
|
||||
* out which strings are valid look in /etc/conf/pack.d/cn/class.h
|
||||
* To map the video memory, we first need to see if we are on a multi-console
|
||||
* system. If we are, we need to try to use an existing video class in the
|
||||
* kernel. We do this by retrieving the list of currently defined classes
|
||||
* (via the new CONS_GETCLASS ioctl()) to see if we have a class that will
|
||||
* match the range of memory we desire. If we can't find one, we have an
|
||||
* error and we abort.
|
||||
*
|
||||
* if we fail to find one of these we try for the dmmap driver
|
||||
* If we are not using a multi-console, we can simply use mmap() to map in
|
||||
* the frame buffer, using the classs-access method as a fall-back only if
|
||||
* the mmap() fails (it shouldn't). We always set the appropriate pointers
|
||||
* in the config structure to point ot the right function to map and unmap
|
||||
* the video memory. An alternative to using mmap() is to use the new
|
||||
* CONS_ADDVAS call, which will use vasmalloc() and vasbind() in the kernel
|
||||
* to map the physical address to a virtual one, which it then returns.
|
||||
* I am not 100% sure if this is faster or not, but it may prove easier to
|
||||
* debug things. Just to be on the safe side, I have included both methods
|
||||
* here, and the mmap() method can be used by setting USE_VASMETHOD to 0
|
||||
* above.
|
||||
*/
|
||||
|
||||
struct {
|
||||
unsigned long base, size;
|
||||
char *class;
|
||||
} SCO_Mapping[] = {
|
||||
{0xA0000, 0x10000, "VGA"},
|
||||
{0xA0000, 0x20000, "SVGA"},
|
||||
{0xB0000, 0x08000, "HGA"},
|
||||
{0x0, 0x0, ""},
|
||||
#if !defined(CONS_ADDVAS)
|
||||
# undef USE_VASMETHOD
|
||||
# define USE_VASMETHOD 0
|
||||
#endif
|
||||
|
||||
static int
|
||||
scoIsMultiConsole (void)
|
||||
{
|
||||
int x;
|
||||
|
||||
if (sco_mcdone)
|
||||
return sco_ismc;
|
||||
x = access ("/usr/lib/vidconf/.multiconsole", F_OK);
|
||||
if (x == 0)
|
||||
sco_ismc = 1;
|
||||
sco_mcdone = 1;
|
||||
return sco_ismc;
|
||||
}
|
||||
|
||||
/*
|
||||
* This maps memory using mmap()
|
||||
*/
|
||||
static pointer
|
||||
mapVidMemMMAP(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
|
||||
{
|
||||
int fd;
|
||||
unsigned long realBase, alignOff;
|
||||
pointer base;
|
||||
|
||||
fd = open (DEV_MEM, O_RDWR);
|
||||
if (fd < 0) {
|
||||
FatalError("xf86MapVidMem: failed to open %s (%s)\n", DEV_MEM,
|
||||
strerror(errno));
|
||||
return 0; /* NOTREACHED */
|
||||
}
|
||||
|
||||
realBase = Base & ~(getpagesize() - 1);
|
||||
alignOff = Base - realBase;
|
||||
|
||||
#ifdef DEBUG
|
||||
ErrorF("base: %lx, realBase: %lx, alignOff: %lx\n", Base,realBase,alignOff);
|
||||
#endif
|
||||
|
||||
base = mmap((caddr_t)0, Size + alignOff, PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED, fd, (off_t)realBase);
|
||||
close(fd);
|
||||
if (base == MAP_FAILED) {
|
||||
FatalError("xf86MapVidMem: Could not mmap framebuffer (0x%08x,0x%x) (%s)\n",
|
||||
Base, Size, strerror(errno));
|
||||
return 0; /* NOTREACHED */
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
ErrorF("base: %lx aligned base: %lx\n",base, base + alignOff);
|
||||
#endif
|
||||
return (pointer)((char *)base + alignOff);
|
||||
}
|
||||
|
||||
#if (USE_VASMETHOD)
|
||||
/*
|
||||
* This maps memory using the virtual address space (VAS) console calls.
|
||||
*/
|
||||
static pointer
|
||||
mapVidMemVAS(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
|
||||
{
|
||||
struct vidvasmem vas;
|
||||
pointer base;
|
||||
|
||||
vas.base = (long)Base;
|
||||
vas.size = (long)Size;
|
||||
|
||||
base = (pointer)ioctl (xf86Info.consoleFd, CONS_ADDVAS, &vas);
|
||||
if (base == (pointer)-1) {
|
||||
return mapVidMemMMAP(ScreenNum, Base, Size, flags);
|
||||
}
|
||||
return base;
|
||||
}
|
||||
#endif /* USE_VASMETHOD */
|
||||
|
||||
struct vidclass vidclasslist[] = {
|
||||
{ "VBE", "", 0xf0000000, 0x2000000, 0 },
|
||||
{ "P9000", "", 0xc0000000, 0x400000, 0 },
|
||||
{ "TULIP", "", 0x80000000, 0x400000, 0 },
|
||||
{ "VIPER", "", 0xa0000000, 0x400000, 0 },
|
||||
{ "S3T", "", 0xa0000000, 0x200000, 0 },
|
||||
{ "S3DT", "", 0x4000000, 0x400000, 0 },
|
||||
{ "MGA", "", 0x2200000, 0x4000, 0 },
|
||||
{ "CLVGA", "", 0xa0000, 0x20000, 0 },
|
||||
{ "OLIVE", "", 0xd8000000, 0x400000, 0 },
|
||||
{ "S3C", "", 0xa0000, 0x10000, 0 },
|
||||
{ "MGAVLB", "", 0xac000, 0x34000, 0 },
|
||||
{ "ATI8514", "", 0xFF000, 0x1000, 0 },
|
||||
{ "GXREGS", "", 0xb0000, 0x10000, 0 },
|
||||
{ "GX", "", 0xa0000, 0x10000, 0 },
|
||||
{ "CT64300", "", 0xa0000000, 0x400000, 0 },
|
||||
{ "SVGA", "", 0xa0000, 0x20000, 0 },
|
||||
{ "S3V", "", 0xa0000000, 0x400000, 0 },
|
||||
{ "8514A", "", 0xFF000, 0x1000, 0 },
|
||||
{ "VGA", "", 0xa0000, 0x10000, 0 },
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
/* ARGSUSED */
|
||||
pointer xf86MapVidMem(ScreenNum, Region, Base, Size)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
pointer Base;
|
||||
unsigned long Size;
|
||||
static pointer
|
||||
mapVidMemVC(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
|
||||
{
|
||||
int i;
|
||||
char *class = (char *)NULL;
|
||||
pointer base;
|
||||
struct vidclass *vcp;
|
||||
char *class = NULL;
|
||||
pointer base;
|
||||
|
||||
for (i=0; SCO_Mapping[i].base != 0; i++)
|
||||
{
|
||||
if (((pointer)SCO_Mapping[i].base == Base) &&
|
||||
(SCO_Mapping[i].size == Size))
|
||||
{
|
||||
class = SCO_Mapping[i].class;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (class == (char *)NULL)
|
||||
{
|
||||
int fd;
|
||||
for (vcp = vidclasslist; vcp->name; vcp++) {
|
||||
if ((vcp->base == Base) && (vcp->size == Size)) {
|
||||
class = vcp->name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(SVR4) || defined(SCO325)
|
||||
if ((fd = open(DEV_MEM, O_RDWR)) < 0)
|
||||
{
|
||||
FatalError("xf86MapVidMem: failed to open %s (%s)\n",
|
||||
DEV_MEM, strerror(errno));
|
||||
}
|
||||
base = (pointer)mmap((caddr_t)0, Size, PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED, fd, (off_t)Base);
|
||||
close(fd);
|
||||
if ((long)base == -1)
|
||||
{
|
||||
FatalError("%s: Could not mmap framebuffer [s=%x,a=%x] (%s)\n",
|
||||
"xf86MapVidMem", Size, Base, strerror(errno));
|
||||
}
|
||||
|
||||
return(base);
|
||||
#else
|
||||
MapDSC[ScreenNum][Region].vaddr = (char *) NULL;
|
||||
MapDSC[ScreenNum][Region].physaddr = (char *) Base;
|
||||
MapDSC[ScreenNum][Region].length = Size;
|
||||
MapDSC[ScreenNum][Region].ioflg = 1;
|
||||
if ((fd = open("/dev/dmmap", O_RDWR)) >= 0) {
|
||||
if (ioctl(fd, KDMAPDISP, &MapDSC[ScreenNum][Region]) == -1)
|
||||
ErrorF("xf86MapVidMem: dmmap KDMAPDISP failed (%s)\n",
|
||||
strerror(errno));
|
||||
else {
|
||||
if (ver_once)
|
||||
ErrorF("Using dmmap version 0x%04x.\n",
|
||||
ioctl(fd, -1));
|
||||
ver_once = 0;
|
||||
close(fd);
|
||||
return(MapDSC[ScreenNum][Region].vaddr);
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
FatalError("xf86MapVidMem:No class map defined for (%x,%x)\n",
|
||||
Base, Size);
|
||||
/* NOTREACHED */
|
||||
if (class == NULL) {
|
||||
/*
|
||||
* As a fall-back, we will try and use the mmap() approach. This may
|
||||
* prove to be the wrong thing to do, but time and testing will tell.
|
||||
*/
|
||||
ErrorF("xf86MapVidMem: No class map defined for (0x%08x,0x%08x)\n", Base, Size);
|
||||
#if USE_VASMETHOD
|
||||
return mapVidMemVAS(ScreenNum, Base, Size, flags);
|
||||
#else /* !USE_VASMETHOD */
|
||||
return mapVidMemMMAP(ScreenNum, Base, Size, flags);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
base = (pointer)ioctl(xf86Info.consoleFd, MAP_CLASS, class);
|
||||
if ((int)base == -1)
|
||||
{
|
||||
FatalError("xf86MapVidMem:Failed to map video mem class %s\n",
|
||||
class);
|
||||
/* NOTREACHED */
|
||||
}
|
||||
return(base);
|
||||
/*
|
||||
* We found a suitable class. Try and use it.
|
||||
*/
|
||||
base = (pointer)ioctl(xf86Info.consoleFd, MAP_CLASS, class);
|
||||
if ((int)base == -1) {
|
||||
FatalError("xf86MapVidMem: Failed to map video memory class `%s'\n", class);
|
||||
return 0; /* NOTREACHED */
|
||||
}
|
||||
|
||||
return base;
|
||||
}
|
||||
|
||||
/*
|
||||
* Nothing to do here if it wasn't mapped using the dmmap driver
|
||||
* Unmapping the video memory is easy. We always call munmap(), as it is
|
||||
* safe to do so even if we haven't actually mapped in any pages via mmap().
|
||||
* In the case where we used the video class, we don't need to do anything
|
||||
* as the kernel will clean up the TSS when we exit, and will undo the
|
||||
* vasbind() that was done when the class was originally mapped. If we used
|
||||
* vasmap, we simply undo the map. Again, it is benign to call vasunmap
|
||||
* even if we got the frame buffer via some other mechanism (like mmap).
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
void xf86UnMapVidMem(ScreenNum, Region, Base, Size)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
pointer Base;
|
||||
unsigned long Size;
|
||||
{
|
||||
int fd;
|
||||
|
||||
#if defined (SVR4) || defined(SCO325)
|
||||
munmap(Base, Size);
|
||||
#else /* SVR4 */
|
||||
if (MapDSC[ScreenNum][Region].vaddr) {
|
||||
if ((fd = open("/dev/dmmap", O_RDWR)) < 0) {
|
||||
if (ioctl(fd, KDUNMAPDISP, &MapDSC[ScreenNum][Region]) == -1)
|
||||
ErrorF("xf86UnMapVidMem: dmmap KDUNMAPDISP failed (%s)\n",
|
||||
strerror(errno));
|
||||
close(fd);
|
||||
}
|
||||
MapDSC[ScreenNum][Region].vaddr = (char *) NULL;
|
||||
MapDSC[ScreenNum][Region].physaddr = (char *) NULL;
|
||||
MapDSC[ScreenNum][Region].length = 0;
|
||||
MapDSC[ScreenNum][Region].ioflg = 0;
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
static void
|
||||
unmapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
#if USE_VASMETHOD
|
||||
struct vidvasmem vas;
|
||||
int x;
|
||||
|
||||
vas.base = (long)Base;
|
||||
vas.size = (long)Size;
|
||||
|
||||
x = ioctl (xf86Info.consoleFd, CONS_DELVAS, &vas);
|
||||
if (x == 0)
|
||||
return;
|
||||
#endif /* USE_VASMETHOD */
|
||||
|
||||
munmap(Base, Size);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
Bool xf86LinearVidMem()
|
||||
/*
|
||||
* Set things up to point to our local functions. When the kernel gets
|
||||
* MTRR support, we will need to add the required functions for that
|
||||
* here too. MTRR support will most likely appear in 5.0.8 or 5.1.0.
|
||||
*
|
||||
* We also want to lock the X server process to the base CPU in an MPX
|
||||
* system, since we will be going to IOPL 3. Most engine drivers can cope
|
||||
* with I/O access on any CPU but there are a few (AST Manhattan I believe)
|
||||
* that can't, so the server needs to be locked to CPU0.
|
||||
*/
|
||||
void
|
||||
xf86OSInitVidMem(VidMemInfoPtr pVidMem)
|
||||
{
|
||||
int fd, ver;
|
||||
int mpx_fd;
|
||||
|
||||
#if defined(SVR4) || defined(SCO325)
|
||||
return TRUE;
|
||||
if (scoIsMultiConsole ()) {
|
||||
pVidMem->mapMem = mapVidMemVC;
|
||||
} else {
|
||||
#if USE_VASMETHOD
|
||||
pVidMem->mapMem = mapVidMemVAS;
|
||||
#else
|
||||
if ((fd = open("/dev/dmmap", O_RDWR)) >= 0) {
|
||||
ver = ioctl(fd, -1);
|
||||
close(fd);
|
||||
if (ver >= 0) {
|
||||
if (ver_once)
|
||||
ErrorF("Using dmmap version 0x%04x.\n", ver);
|
||||
ver_once = 0;
|
||||
return(TRUE);
|
||||
}
|
||||
}
|
||||
return(FALSE);
|
||||
pVidMem->mapMem = mapVidMemMMAP;
|
||||
#endif
|
||||
}
|
||||
|
||||
pVidMem->unmapMem = unmapVidMem;
|
||||
pVidMem->linearSupported = TRUE;
|
||||
pVidMem->initialised = TRUE;
|
||||
|
||||
if (mpxLock && (mpx_fd = open (MPXNAME, O_RDONLY)) > 0) {
|
||||
if (ioctl (mpx_fd, ACPU_XLOCK, BASECPU) < 0)
|
||||
ErrorF ("xf86OSInitVidMem: Can not bind to CPU 0 (%s)\n",
|
||||
strerror(errno));
|
||||
close (mpx_fd);
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/* I/O Permissions section */
|
||||
/***************************************************************************/
|
||||
|
||||
static Bool ScreenEnabled[MAXSCREENS];
|
||||
static Bool IOEnabled = FALSE;
|
||||
static Bool InitDone = FALSE;
|
||||
|
||||
void xf86ClearIOPortList(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!InitDone)
|
||||
{
|
||||
for (i = 0; i < MAXSCREENS; i++)
|
||||
ScreenEnabled[i] = FALSE;
|
||||
InitDone = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void xf86AddIOPorts(ScreenNum, NumPorts, Ports)
|
||||
int ScreenNum;
|
||||
int NumPorts;
|
||||
unsigned *Ports;
|
||||
{
|
||||
}
|
||||
|
||||
void xf86EnableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
ScreenEnabled[ScreenNum] = TRUE;
|
||||
|
||||
if (IOEnabled)
|
||||
return;
|
||||
|
||||
if (sysi86(SI86V86, V86SC_IOPL, PS_IOPL) < 0)
|
||||
FatalError("Failed to set IOPL for extended I/O\n");
|
||||
IOEnabled = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86DisableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
int i;
|
||||
|
||||
ScreenEnabled[ScreenNum] = FALSE;
|
||||
|
||||
if (!IOEnabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < MAXSCREENS; i++)
|
||||
if (ScreenEnabled[i])
|
||||
return;
|
||||
sysi86(SI86V86, V86SC_IOPL, 0);
|
||||
IOEnabled = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86DisableIOPrivs()
|
||||
{
|
||||
if (IOEnabled)
|
||||
sysi86(SI86V86, V86SC_IOPL, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/* Interrupt Handling section */
|
||||
/***************************************************************************/
|
||||
|
||||
Bool xf86DisableInterrupts()
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
__asm__ __volatile__("cli");
|
||||
#else
|
||||
asm("cli");
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
void xf86EnableInterrupts()
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
__asm__ __volatile__("sti");
|
||||
#else
|
||||
asm("sti");
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/VTsw_noop.c,v 3.1 1996/12/23 06:50:56 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/VTsw_noop.c,v 3.2 1998/07/25 16:56:59 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David Wexelblat <dwex@XFree86.org>
|
||||
*
|
||||
|
|
@ -21,11 +21,9 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: VTsw_noop.c,v 1.3 2000/08/17 19:51:29 cpqbld Exp $ */
|
||||
/* $XConsortium: VTsw_noop.c /main/3 1996/02/21 17:53:25 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
|
|
@ -35,17 +33,20 @@
|
|||
* No-op functions for OSs without VTs
|
||||
*/
|
||||
|
||||
Bool xf86VTSwitchPending()
|
||||
Bool
|
||||
xf86VTSwitchPending()
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchAway()
|
||||
Bool
|
||||
xf86VTSwitchAway()
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchTo()
|
||||
Bool
|
||||
xf86VTSwitchTo()
|
||||
{
|
||||
return(TRUE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/VTsw_usl.c,v 3.1 1996/12/23 06:50:57 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/VTsw_usl.c,v 3.4 2002/09/16 18:06:14 eich Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David Wexelblat <dwex@XFree86.org>
|
||||
*
|
||||
|
|
@ -21,11 +21,9 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: VTsw_usl.c,v 1.3 2000/08/17 19:51:30 cpqbld Exp $ */
|
||||
/* $XConsortium: VTsw_usl.c /main/3 1996/02/21 17:53:28 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
|
|
@ -40,20 +38,22 @@
|
|||
* This function is the signal handler for the VT-switching signal. It
|
||||
* is only referenced inside the OS-support layer.
|
||||
*/
|
||||
void xf86VTRequest(sig)
|
||||
int sig;
|
||||
void
|
||||
xf86VTRequest(int sig)
|
||||
{
|
||||
signal(sig, (void(*)())xf86VTRequest);
|
||||
signal(sig, (void(*)(int))xf86VTRequest);
|
||||
xf86Info.vtRequestsPending = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchPending()
|
||||
Bool
|
||||
xf86VTSwitchPending()
|
||||
{
|
||||
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
||||
return(xf86Info.vtRequestsPending ? TRUE : FALSE);
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchAway()
|
||||
Bool
|
||||
xf86VTSwitchAway()
|
||||
{
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, 1) < 0)
|
||||
|
|
@ -66,7 +66,8 @@ Bool xf86VTSwitchAway()
|
|||
}
|
||||
}
|
||||
|
||||
Bool xf86VTSwitchTo()
|
||||
Bool
|
||||
xf86VTSwitchTo()
|
||||
{
|
||||
xf86Info.vtRequestsPending = FALSE;
|
||||
if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ) < 0)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/bios_devmem.c,v 3.3 1996/12/23 06:50:58 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/bios_devmem.c,v 3.7 2000/09/19 12:46:22 eich Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
*
|
||||
|
|
@ -21,12 +21,9 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: bios_devmem.c,v 1.3 2000/08/17 19:51:30 cpqbld Exp $ */
|
||||
/* $XConsortium: bios_devmem.c /main/5 1996/10/19 18:07:41 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
|
@ -40,100 +37,37 @@
|
|||
# define DEV_MEM "/dev/mem"
|
||||
#endif
|
||||
|
||||
int xf86ReadBIOS(Base, Offset, Buf, Len)
|
||||
unsigned long Base;
|
||||
unsigned long Offset;
|
||||
unsigned char *Buf;
|
||||
int Len;
|
||||
int
|
||||
xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
|
||||
int Len)
|
||||
{
|
||||
#ifdef __alpha__
|
||||
/*
|
||||
* The Alpha version uses "mmap" instead of "lseek/read",
|
||||
* because these (currently) don't work for BUS memory.
|
||||
* We trick "mmap" into mapping BUS memory for us via BUS_BASE,
|
||||
* which is the KSEG address of the start of the DENSE memory
|
||||
* area.
|
||||
*/
|
||||
int fd;
|
||||
|
||||
/*
|
||||
* NOTE: there prolly ought to be more validity checks and all
|
||||
* re: boundaries and sizes and such...
|
||||
*/
|
||||
|
||||
/*
|
||||
* The Jensen lacks dense memory, thus we have to address the bus via
|
||||
* the sparse addressing scheme.
|
||||
*
|
||||
* Martin Ostermann (ost@comnets.rwth-aachen.de) - Apr.-Sep. 1996
|
||||
*/
|
||||
|
||||
#ifdef TEST_JENSEN_CODE /* define to test the Sparse addressing on a non-Jensen */
|
||||
#define SPARSE (5)
|
||||
#define isJensen (1)
|
||||
#ifdef __ia64__
|
||||
if ((fd = open(DEV_MEM, O_RDONLY | O_SYNC)) < 0)
|
||||
#else
|
||||
#define isJensen (!_bus_base())
|
||||
#define SPARSE (7)
|
||||
if ((fd = open(DEV_MEM, O_RDONLY)) < 0)
|
||||
#endif
|
||||
|
||||
extern unsigned long _bus_base(void);
|
||||
extern unsigned long _bus_base_sparse(void);
|
||||
#define BUS_BASE (isJensen ? _bus_base_sparse() : _bus_base())
|
||||
#define JENSEN_SHIFT(x) (isJensen ? ((long)x<<SPARSE) : (long)x)
|
||||
|
||||
#define SIZE (64*1024)
|
||||
|
||||
caddr_t base;
|
||||
int fd;
|
||||
|
||||
if ((fd = open(DEV_MEM, O_RDONLY)) < 0)
|
||||
{
|
||||
ErrorF("xf86ReadBios: Failed to open %s (%s)\n", DEV_MEM,
|
||||
strerror(errno));
|
||||
return(-1);
|
||||
}
|
||||
|
||||
base = mmap((caddr_t)0, JENSEN_SHIFT(SIZE), PROT_READ,
|
||||
MAP_SHARED, fd, (off_t)(JENSEN_SHIFT(Base) + BUS_BASE));
|
||||
|
||||
if (base == (caddr_t)-1UL)
|
||||
{
|
||||
ErrorF("xf86ReadBios: Failed to mmap %s (%s)\n", DEV_MEM,
|
||||
strerror(errno));
|
||||
return(-1);
|
||||
}
|
||||
|
||||
SlowBCopyFromBus(base+JENSEN_SHIFT(Offset), Buf, Len);
|
||||
|
||||
munmap((caddr_t)JENSEN_SHIFT(base), JENSEN_SHIFT(SIZE));
|
||||
close(fd);
|
||||
return(Len);
|
||||
|
||||
#else /* __alpha__ */
|
||||
|
||||
int fd;
|
||||
|
||||
if ((fd = open(DEV_MEM, O_RDONLY)) < 0)
|
||||
{
|
||||
ErrorF("xf86ReadBios: Failed to open %s (%s)\n", DEV_MEM,
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING, "xf86ReadBIOS: Failed to open %s (%s)\n",
|
||||
DEV_MEM, strerror(errno));
|
||||
return(-1);
|
||||
}
|
||||
|
||||
if (lseek(fd, (Base+Offset), SEEK_SET) < 0)
|
||||
{
|
||||
ErrorF("xf86ReadBios: %s seek failed (%s)\n", DEV_MEM,
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING, "xf86ReadBIOS: %s seek failed (%s)\n",
|
||||
DEV_MEM, strerror(errno));
|
||||
close(fd);
|
||||
return(-1);
|
||||
}
|
||||
if (read(fd, Buf, Len) != Len)
|
||||
{
|
||||
ErrorF("xf86ReadBios: %s read failed (%s)\n", DEV_MEM,
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING, "xf86ReadBIOS: %s read failed (%s)\n",
|
||||
DEV_MEM, strerror(errno));
|
||||
close(fd);
|
||||
return(-1);
|
||||
}
|
||||
close(fd);
|
||||
return(Len);
|
||||
#endif /* __alpha__ */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/ioperm_noop.c,v 3.1 1996/12/23 06:50:59 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/ioperm_noop.c,v 3.4 2001/07/23 13:15:48 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David Wexelblat <dwex@XFree86.org>
|
||||
*
|
||||
|
|
@ -21,40 +21,27 @@
|
|||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: ioperm_noop.c,v 1.3 2000/08/17 19:51:30 cpqbld Exp $ */
|
||||
/* $XConsortium: ioperm_noop.c /main/3 1996/02/21 17:53:39 kaleb $ */
|
||||
|
||||
/*
|
||||
* Amoeba, Minix and 386BSD don't bother with I/O permissions,
|
||||
* Some platforms don't bother with I/O permissions,
|
||||
* or the permissions are implicit with opening/enabling the console.
|
||||
*/
|
||||
void xf86ClearIOPortList(ScreenNum)
|
||||
int ScreenNum;
|
||||
|
||||
#include "X.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
void
|
||||
xf86EnableIO()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void xf86AddIOPorts(ScreenNum, NumPorts, Ports)
|
||||
int ScreenNum;
|
||||
int NumPorts;
|
||||
unsigned *Ports;
|
||||
void
|
||||
xf86DisableIO()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86EnableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86DisableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86DisableIOPrivs()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,174 +1,690 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/posix_tty.c,v 3.8.2.1 1998/02/07 14:27:25 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/posix_tty.c,v 3.28 2003/02/17 15:11:59 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1993 by David Dawes <dawes@physics.su.oz.au>
|
||||
* Copyright 1993-1999 by The XFree86 Project, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of David Dawes
|
||||
* not be used in advertising or publicity pertaining to distribution of
|
||||
* the software without specific, written prior permission.
|
||||
* David Dawes makes no representations about the suitability of this
|
||||
* software for any purpose. It is provided "as is" without express or
|
||||
* implied warranty.
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS, IN NO EVENT SHALL DAVID DAWES BE LIABLE FOR
|
||||
* ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
|
||||
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
|
||||
* CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the XFree86 Project shall
|
||||
* not be used in advertising or otherwise to promote the sale, use or other
|
||||
* dealings in this Software without prior written authorization from the
|
||||
* XFree86 Project.
|
||||
*/
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1997 Metro Link Incorporated
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the Metro Link shall not be
|
||||
* used in advertising or otherwise to promote the sale, use or other dealings
|
||||
* in this Software without prior written authorization from Metro Link.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: posix_tty.c,v 1.3 2000/08/17 19:51:30 cpqbld Exp $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
/* $XConsortium: posix_tty.c /main/7 1996/10/19 18:07:47 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86_Config.h"
|
||||
|
||||
static Bool not_a_tty = FALSE;
|
||||
|
||||
void xf86SetMouseSpeed(mouse, old, new, cflag)
|
||||
MouseDevPtr mouse;
|
||||
int old;
|
||||
int new;
|
||||
unsigned cflag;
|
||||
static int
|
||||
GetBaud (int baudrate)
|
||||
{
|
||||
struct termios tty;
|
||||
char *c;
|
||||
|
||||
if (not_a_tty)
|
||||
return;
|
||||
|
||||
if (tcgetattr(mouse->mseFd, &tty) < 0)
|
||||
{
|
||||
not_a_tty = TRUE;
|
||||
ErrorF("Warning: %s unable to get status of mouse fd (%s)\n",
|
||||
mouse->mseDevice, strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
/* this will query the initial baudrate only once */
|
||||
if (mouse->oldBaudRate < 0) {
|
||||
switch (cfgetispeed(&tty))
|
||||
{
|
||||
case B9600:
|
||||
mouse->oldBaudRate = 9600;
|
||||
break;
|
||||
case B4800:
|
||||
mouse->oldBaudRate = 4800;
|
||||
break;
|
||||
case B2400:
|
||||
mouse->oldBaudRate = 2400;
|
||||
break;
|
||||
case B1200:
|
||||
default:
|
||||
mouse->oldBaudRate = 1200;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tty.c_iflag = IGNBRK | IGNPAR;
|
||||
tty.c_oflag = 0;
|
||||
tty.c_lflag = 0;
|
||||
tty.c_cflag = (tcflag_t)cflag;
|
||||
tty.c_cc[VTIME] = 0;
|
||||
tty.c_cc[VMIN] = 1;
|
||||
|
||||
switch (old)
|
||||
{
|
||||
case 9600:
|
||||
cfsetispeed(&tty, B9600);
|
||||
cfsetospeed(&tty, B9600);
|
||||
break;
|
||||
case 4800:
|
||||
cfsetispeed(&tty, B4800);
|
||||
cfsetospeed(&tty, B4800);
|
||||
break;
|
||||
case 2400:
|
||||
cfsetispeed(&tty, B2400);
|
||||
cfsetospeed(&tty, B2400);
|
||||
break;
|
||||
case 1200:
|
||||
default:
|
||||
cfsetispeed(&tty, B1200);
|
||||
cfsetospeed(&tty, B1200);
|
||||
}
|
||||
|
||||
if (tcsetattr(mouse->mseFd, TCSADRAIN, &tty) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Unable to set status of mouse fd (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return;
|
||||
}
|
||||
xf86FatalError("Unable to set status of mouse fd (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
|
||||
switch (new)
|
||||
{
|
||||
case 9600:
|
||||
c = "*q";
|
||||
cfsetispeed(&tty, B9600);
|
||||
cfsetospeed(&tty, B9600);
|
||||
break;
|
||||
case 4800:
|
||||
c = "*p";
|
||||
cfsetispeed(&tty, B4800);
|
||||
cfsetospeed(&tty, B4800);
|
||||
break;
|
||||
case 2400:
|
||||
c = "*o";
|
||||
cfsetispeed(&tty, B2400);
|
||||
cfsetospeed(&tty, B2400);
|
||||
break;
|
||||
case 1200:
|
||||
default:
|
||||
c = "*n";
|
||||
cfsetispeed(&tty, B1200);
|
||||
cfsetospeed(&tty, B1200);
|
||||
}
|
||||
|
||||
if (mouse->mseType == P_LOGIMAN || mouse->mseType == P_LOGI)
|
||||
{
|
||||
if (write(mouse->mseFd, c, 2) != 2)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Unable to write to mouse fd (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return;
|
||||
}
|
||||
xf86FatalError("Unable to write to mouse fd (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
}
|
||||
usleep(100000);
|
||||
|
||||
if (tcsetattr(mouse->mseFd, TCSADRAIN, &tty) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Unable to set status of mouse fd (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return;
|
||||
}
|
||||
xf86FatalError("Unable to set status of mouse fd (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
#ifdef B300
|
||||
if (baudrate == 300)
|
||||
return B300;
|
||||
#endif
|
||||
#ifdef B1200
|
||||
if (baudrate == 1200)
|
||||
return B1200;
|
||||
#endif
|
||||
#ifdef B2400
|
||||
if (baudrate == 2400)
|
||||
return B2400;
|
||||
#endif
|
||||
#ifdef B4800
|
||||
if (baudrate == 4800)
|
||||
return B4800;
|
||||
#endif
|
||||
#ifdef B9600
|
||||
if (baudrate == 9600)
|
||||
return B9600;
|
||||
#endif
|
||||
#ifdef B19200
|
||||
if (baudrate == 19200)
|
||||
return B19200;
|
||||
#endif
|
||||
#ifdef B38400
|
||||
if (baudrate == 38400)
|
||||
return B38400;
|
||||
#endif
|
||||
#ifdef B57600
|
||||
if (baudrate == 57600)
|
||||
return B57600;
|
||||
#endif
|
||||
#ifdef B115200
|
||||
if (baudrate == 115200)
|
||||
return B115200;
|
||||
#endif
|
||||
#ifdef B230400
|
||||
if (baudrate == 230400)
|
||||
return B230400;
|
||||
#endif
|
||||
#ifdef B460800
|
||||
if (baudrate == 460800)
|
||||
return B460800;
|
||||
#endif
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
xf86FlushInput(fd)
|
||||
int fd;
|
||||
xf86OpenSerial (pointer options)
|
||||
{
|
||||
return tcflush(fd, TCIFLUSH);
|
||||
#ifdef Lynx
|
||||
struct sgttyb ms_sgtty;
|
||||
#endif
|
||||
struct termios t;
|
||||
int fd, i;
|
||||
char *dev;
|
||||
|
||||
dev = xf86SetStrOption (options, "Device", NULL);
|
||||
if (!dev)
|
||||
{
|
||||
xf86Msg (X_ERROR, "xf86OpenSerial: No Device specified.\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
#ifndef Lynx
|
||||
SYSCALL (fd = open (dev, O_RDWR | O_NONBLOCK | O_EXCL));
|
||||
#else
|
||||
/* O_EXCL yields an EEXIST on LynxOS */
|
||||
SYSCALL (fd = open (dev, O_RDWR | O_NONBLOCK));
|
||||
#endif
|
||||
if (fd == -1)
|
||||
{
|
||||
xf86Msg (X_ERROR,
|
||||
"xf86OpenSerial: Cannot open device %s\n\t%s.\n",
|
||||
dev, strerror (errno));
|
||||
xfree(dev);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (!isatty (fd))
|
||||
{
|
||||
#if 1
|
||||
/* Allow non-tty devices to be opened. */
|
||||
xfree(dev);
|
||||
return (fd);
|
||||
#else
|
||||
xf86Msg (X_WARNING,
|
||||
"xf86OpenSerial: Specified device %s is not a tty\n",
|
||||
dev);
|
||||
SYSCALL (close (fd));
|
||||
errno = EINVAL;
|
||||
xfree(dev);
|
||||
return (-1);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef Lynx
|
||||
/* LynxOS does not assert DTR without this */
|
||||
ioctl (fd, TIOCGETP, (char *) &ms_sgtty);
|
||||
ioctl (fd, TIOCSDTR, (char *) &ms_sgtty);
|
||||
#endif
|
||||
|
||||
/* set up default port parameters */
|
||||
SYSCALL (tcgetattr (fd, &t));
|
||||
t.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR\
|
||||
|IGNCR|ICRNL|IXON);
|
||||
t.c_oflag &= ~OPOST;
|
||||
t.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
|
||||
t.c_cflag &= ~(CSIZE|PARENB);
|
||||
t.c_cflag |= CS8|CLOCAL;
|
||||
|
||||
cfsetispeed (&t, B9600);
|
||||
cfsetospeed (&t, B9600);
|
||||
t.c_cc[VMIN] = 1;
|
||||
t.c_cc[VTIME] = 0;
|
||||
|
||||
SYSCALL (tcsetattr (fd, TCSANOW, &t));
|
||||
|
||||
if (xf86SetSerial (fd, options) == -1)
|
||||
{
|
||||
SYSCALL (close (fd));
|
||||
xfree(dev);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
SYSCALL (i = fcntl (fd, F_GETFL, 0));
|
||||
if (i == -1)
|
||||
{
|
||||
SYSCALL (close (fd));
|
||||
xfree(dev);
|
||||
return (-1);
|
||||
}
|
||||
i &= ~O_NONBLOCK;
|
||||
SYSCALL (i = fcntl (fd, F_SETFL, i));
|
||||
if (i == -1)
|
||||
{
|
||||
SYSCALL (close (fd));
|
||||
xfree(dev);
|
||||
return (-1);
|
||||
}
|
||||
xfree(dev);
|
||||
return (fd);
|
||||
}
|
||||
|
||||
int
|
||||
xf86SetSerial (int fd, pointer options)
|
||||
{
|
||||
struct termios t;
|
||||
int val;
|
||||
const char *s;
|
||||
int baud, r;
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
/* Don't try to set parameters for non-tty devices. */
|
||||
if (!isatty(fd))
|
||||
return 0;
|
||||
|
||||
SYSCALL (tcgetattr (fd, &t));
|
||||
|
||||
if ((val = xf86SetIntOption (options, "BaudRate", 0)))
|
||||
{
|
||||
if ((baud = GetBaud (val)))
|
||||
{
|
||||
cfsetispeed (&t, baud);
|
||||
cfsetospeed (&t, baud);
|
||||
}
|
||||
else
|
||||
{
|
||||
xf86Msg (X_ERROR,
|
||||
"Invalid Option BaudRate value: %d\n", val);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
if ((val = xf86SetIntOption (options, "StopBits", 0)))
|
||||
{
|
||||
switch (val)
|
||||
{
|
||||
case 1:
|
||||
t.c_cflag &= ~(CSTOPB);
|
||||
break;
|
||||
case 2:
|
||||
t.c_cflag |= CSTOPB;
|
||||
break;
|
||||
default:
|
||||
xf86Msg (X_ERROR,
|
||||
"Invalid Option StopBits value: %d\n", val);
|
||||
return (-1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((val = xf86SetIntOption (options, "DataBits", 0)))
|
||||
{
|
||||
switch (val)
|
||||
{
|
||||
case 5:
|
||||
t.c_cflag &= ~(CSIZE);
|
||||
t.c_cflag |= CS5;
|
||||
break;
|
||||
case 6:
|
||||
t.c_cflag &= ~(CSIZE);
|
||||
t.c_cflag |= CS6;
|
||||
break;
|
||||
case 7:
|
||||
t.c_cflag &= ~(CSIZE);
|
||||
t.c_cflag |= CS7;
|
||||
break;
|
||||
case 8:
|
||||
t.c_cflag &= ~(CSIZE);
|
||||
t.c_cflag |= CS8;
|
||||
break;
|
||||
default:
|
||||
xf86Msg (X_ERROR,
|
||||
"Invalid Option DataBits value: %d\n", val);
|
||||
return (-1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((s = xf86SetStrOption (options, "Parity", NULL)))
|
||||
{
|
||||
if (xf86NameCmp (s, "Odd") == 0)
|
||||
{
|
||||
t.c_cflag |= PARENB | PARODD;
|
||||
}
|
||||
else if (xf86NameCmp (s, "Even") == 0)
|
||||
{
|
||||
t.c_cflag |= PARENB;
|
||||
t.c_cflag &= ~(PARODD);
|
||||
}
|
||||
else if (xf86NameCmp (s, "None") == 0)
|
||||
{
|
||||
t.c_cflag &= ~(PARENB);
|
||||
}
|
||||
else
|
||||
{
|
||||
xf86Msg (X_ERROR, "Invalid Option Parity value: %s\n",
|
||||
s);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
if ((val = xf86SetIntOption (options, "Vmin", -1)) != -1)
|
||||
{
|
||||
t.c_cc[VMIN] = val;
|
||||
}
|
||||
if ((val = xf86SetIntOption (options, "Vtime", -1)) != -1)
|
||||
{
|
||||
t.c_cc[VTIME] = val;
|
||||
}
|
||||
|
||||
if ((s = xf86SetStrOption (options, "FlowControl", NULL)))
|
||||
{
|
||||
xf86MarkOptionUsedByName (options, "FlowControl");
|
||||
if (xf86NameCmp (s, "Xoff") == 0)
|
||||
{
|
||||
t.c_iflag |= IXOFF;
|
||||
}
|
||||
else if (xf86NameCmp (s, "Xon") == 0)
|
||||
{
|
||||
t.c_iflag |= IXON;
|
||||
}
|
||||
else if (xf86NameCmp (s, "XonXoff") == 0)
|
||||
{
|
||||
t.c_iflag |= IXON|IXOFF;
|
||||
}
|
||||
else if (xf86NameCmp (s, "None") == 0)
|
||||
{
|
||||
t.c_iflag &= ~(IXON | IXOFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
xf86Msg (X_ERROR,
|
||||
"Invalid Option FlowControl value: %s\n", s);
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
if ((xf86SetBoolOption (options, "ClearDTR", FALSE)))
|
||||
{
|
||||
#ifdef CLEARDTR_SUPPORT
|
||||
# if !defined(Lynx) || defined(TIOCMBIC)
|
||||
val = TIOCM_DTR;
|
||||
SYSCALL (ioctl(fd, TIOCMBIC, &val));
|
||||
# else
|
||||
SYSCALL (ioctl(fd, TIOCCDTR, NULL));
|
||||
# endif
|
||||
#else
|
||||
xf86Msg (X_WARNING,
|
||||
"Option ClearDTR not supported on this OS\n");
|
||||
return (-1);
|
||||
#endif
|
||||
xf86MarkOptionUsedByName (options, "ClearDTR");
|
||||
}
|
||||
|
||||
if ((xf86SetBoolOption (options, "ClearRTS", FALSE)))
|
||||
{
|
||||
#ifdef CLEARRTS_SUPPORT
|
||||
val = TIOCM_RTS;
|
||||
SYSCALL (ioctl(fd, TIOCMBIC, &val));
|
||||
#else
|
||||
xf86Msg (X_WARNING,
|
||||
"Option ClearRTS not supported on this OS\n");
|
||||
return (-1);
|
||||
#endif
|
||||
xf86MarkOptionUsedByName (options, "ClearRTS");
|
||||
}
|
||||
|
||||
SYSCALL (r = tcsetattr (fd, TCSANOW, &t));
|
||||
return (r);
|
||||
}
|
||||
|
||||
int
|
||||
xf86SetSerialSpeed (int fd, int speed)
|
||||
{
|
||||
struct termios t;
|
||||
int baud, r;
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
/* Don't try to set parameters for non-tty devices. */
|
||||
if (!isatty(fd))
|
||||
return 0;
|
||||
|
||||
SYSCALL (tcgetattr (fd, &t));
|
||||
|
||||
if ((baud = GetBaud (speed)))
|
||||
{
|
||||
cfsetispeed (&t, baud);
|
||||
cfsetospeed (&t, baud);
|
||||
}
|
||||
else
|
||||
{
|
||||
xf86Msg (X_ERROR,
|
||||
"Invalid Option BaudRate value: %d\n", speed);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
SYSCALL (r = tcsetattr (fd, TCSANOW, &t));
|
||||
return (r);
|
||||
}
|
||||
|
||||
int
|
||||
xf86ReadSerial (int fd, void *buf, int count)
|
||||
{
|
||||
int r;
|
||||
#ifdef DEBUG
|
||||
int i;
|
||||
#endif
|
||||
SYSCALL (r = read (fd, buf, count));
|
||||
#ifdef DEBUG
|
||||
ErrorF("ReadingSerial: 0x%x",
|
||||
(unsigned char)*(((unsigned char *)buf)));
|
||||
for (i = 1; i < r; i++)
|
||||
ErrorF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
|
||||
ErrorF("\n");
|
||||
#endif
|
||||
return (r);
|
||||
}
|
||||
|
||||
int
|
||||
xf86WriteSerial (int fd, const void *buf, int count)
|
||||
{
|
||||
int r;
|
||||
#ifdef DEBUG
|
||||
int i;
|
||||
|
||||
ErrorF("WritingSerial: 0x%x",(unsigned char)*(((unsigned char *)buf)));
|
||||
for (i = 1; i < count; i++)
|
||||
ErrorF(", 0x%x",(unsigned char)*(((unsigned char *)buf) + i));
|
||||
ErrorF("\n");
|
||||
#endif
|
||||
SYSCALL (r = write (fd, buf, count));
|
||||
return (r);
|
||||
}
|
||||
|
||||
int
|
||||
xf86CloseSerial (int fd)
|
||||
{
|
||||
int r;
|
||||
|
||||
SYSCALL (r = close (fd));
|
||||
return (r);
|
||||
}
|
||||
|
||||
int
|
||||
xf86WaitForInput (int fd, int timeout)
|
||||
{
|
||||
fd_set readfds;
|
||||
struct timeval to;
|
||||
int r;
|
||||
|
||||
FD_ZERO(&readfds);
|
||||
|
||||
if (fd >= 0) {
|
||||
FD_SET(fd, &readfds);
|
||||
}
|
||||
|
||||
to.tv_sec = timeout / 1000000;
|
||||
to.tv_usec = timeout % 1000000;
|
||||
|
||||
if (fd >= 0) {
|
||||
SYSCALL (r = select (FD_SETSIZE, &readfds, NULL, NULL, &to));
|
||||
}
|
||||
else {
|
||||
SYSCALL (r = select (FD_SETSIZE, NULL, NULL, NULL, &to));
|
||||
}
|
||||
xf86ErrorFVerb (9,"select returned %d\n", r);
|
||||
return (r);
|
||||
}
|
||||
|
||||
int
|
||||
xf86SerialSendBreak (int fd, int duration)
|
||||
{
|
||||
int r;
|
||||
|
||||
SYSCALL (r = tcsendbreak (fd, duration));
|
||||
return (r);
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
xf86FlushInput(int fd)
|
||||
{
|
||||
fd_set fds;
|
||||
struct timeval timeout;
|
||||
char c[4];
|
||||
|
||||
#ifdef DEBUG
|
||||
ErrorF("FlushingSerial\n");
|
||||
#endif
|
||||
if (tcflush(fd, TCIFLUSH) == 0)
|
||||
return 0;
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd, &fds);
|
||||
while (select(FD_SETSIZE, &fds, NULL, NULL, &timeout) > 0) {
|
||||
if (read(fd, &c, sizeof(c)) < 1)
|
||||
return 0;
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(fd, &fds);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct states {
|
||||
int xf;
|
||||
int os;
|
||||
} modemStates[] = {
|
||||
#ifdef TIOCM_LE
|
||||
{ XF86_M_LE, TIOCM_LE },
|
||||
#endif
|
||||
#ifdef TIOCM_DTR
|
||||
{ XF86_M_DTR, TIOCM_DTR },
|
||||
#endif
|
||||
#ifdef TIOCM_RTS
|
||||
{ XF86_M_RTS, TIOCM_RTS },
|
||||
#endif
|
||||
#ifdef TIOCM_ST
|
||||
{ XF86_M_ST, TIOCM_ST },
|
||||
#endif
|
||||
#ifdef TIOCM_SR
|
||||
{ XF86_M_SR, TIOCM_SR },
|
||||
#endif
|
||||
#ifdef TIOCM_CTS
|
||||
{ XF86_M_CTS, TIOCM_CTS },
|
||||
#endif
|
||||
#ifdef TIOCM_CAR
|
||||
{ XF86_M_CAR, TIOCM_CAR },
|
||||
#elif defined(TIOCM_CD)
|
||||
{ XF86_M_CAR, TIOCM_CD },
|
||||
#endif
|
||||
#ifdef TIOCM_RNG
|
||||
{ XF86_M_RNG, TIOCM_RNG },
|
||||
#elif defined(TIOCM_RI)
|
||||
{ XF86_M_CAR, TIOCM_RI },
|
||||
#endif
|
||||
#ifdef TIOCM_DSR
|
||||
{ XF86_M_DSR, TIOCM_DSR },
|
||||
#endif
|
||||
};
|
||||
|
||||
static int numStates = sizeof(modemStates) / sizeof(modemStates[0]);
|
||||
|
||||
static int
|
||||
xf2osState(int state)
|
||||
{
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
for (i = 0; i < numStates; i++)
|
||||
if (state & modemStates[i].xf)
|
||||
ret |= modemStates[i].os;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
os2xfState(int state)
|
||||
{
|
||||
int i;
|
||||
int ret = 0;
|
||||
|
||||
for (i = 0; i < numStates; i++)
|
||||
if (state & modemStates[i].os)
|
||||
ret |= modemStates[i].xf;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
getOsStateMask(void)
|
||||
{
|
||||
int i;
|
||||
int ret = 0;
|
||||
for (i = 0; i < numStates; i++)
|
||||
ret |= modemStates[i].os;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int osStateMask = 0;
|
||||
|
||||
int
|
||||
xf86SetSerialModemState(int fd, int state)
|
||||
{
|
||||
int ret;
|
||||
int s;
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
/* Don't try to set parameters for non-tty devices. */
|
||||
if (!isatty(fd))
|
||||
return 0;
|
||||
|
||||
#ifndef TIOCMGET
|
||||
return -1;
|
||||
#else
|
||||
if (!osStateMask)
|
||||
osStateMask = getOsStateMask();
|
||||
|
||||
state = xf2osState(state);
|
||||
SYSCALL((ret = ioctl(fd, TIOCMGET, &s)));
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
s &= ~osStateMask;
|
||||
s |= state;
|
||||
SYSCALL((ret = ioctl(fd, TIOCMSET, &s)));
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
xf86GetSerialModemState(int fd)
|
||||
{
|
||||
int ret;
|
||||
int s;
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
/* Don't try to set parameters for non-tty devices. */
|
||||
if (!isatty(fd))
|
||||
return 0;
|
||||
|
||||
#ifndef TIOCMGET
|
||||
return -1;
|
||||
#else
|
||||
SYSCALL((ret = ioctl(fd, TIOCMGET, &s)));
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
return os2xfState(s);
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
xf86SerialModemSetBits(int fd, int bits)
|
||||
{
|
||||
int ret;
|
||||
int s;
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
/* Don't try to set parameters for non-tty devices. */
|
||||
if (!isatty(fd))
|
||||
return 0;
|
||||
|
||||
#ifndef TIOCMGET
|
||||
return -1;
|
||||
#else
|
||||
s = xf2osState(bits);
|
||||
SYSCALL((ret = ioctl(fd, TIOCMBIS, &s)));
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
xf86SerialModemClearBits(int fd, int bits)
|
||||
{
|
||||
int ret;
|
||||
int s;
|
||||
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
/* Don't try to set parameters for non-tty devices. */
|
||||
if (!isatty(fd))
|
||||
return 0;
|
||||
|
||||
#ifndef TIOCMGET
|
||||
return -1;
|
||||
#else
|
||||
s = xf2osState(bits);
|
||||
SYSCALL((ret = ioctl(fd, TIOCMBIC, &s)));
|
||||
return ret;
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/std_kbdEv.c,v 3.1 1996/12/23 06:51:02 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/std_kbdEv.c,v 3.3 1999/05/07 02:56:23 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Dawes <dawes@physics.su.oz.au>
|
||||
* Copyright 1993 by David Dawes <dawes@xfree86.org>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
|
|
@ -23,18 +23,15 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: std_kbdEv.c,v 1.3 2000/08/17 19:51:30 cpqbld Exp $ */
|
||||
/* $XConsortium: std_kbdEv.c /main/4 1996/03/11 10:47:33 kaleb $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
void xf86KbdEvents()
|
||||
void
|
||||
xf86KbdEvents()
|
||||
{
|
||||
unsigned char rBuf[64];
|
||||
int nBytes, i;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/sysv_kbd.c,v 3.2 1996/12/23 06:51:07 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/shared/sysv_kbd.c,v 3.4 1999/01/14 13:05:11 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Dawes <dawes@XFree86.org>
|
||||
|
|
@ -23,20 +23,18 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: sysv_kbd.c,v 1.3 2000/08/17 19:51:30 cpqbld Exp $ */
|
||||
/* $XConsortium: sysv_kbd.c /main/3 1996/02/21 17:53:59 kaleb $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
int xf86GetKbdLeds()
|
||||
int
|
||||
xf86GetKbdLeds()
|
||||
{
|
||||
int leds;
|
||||
|
||||
|
|
@ -44,12 +42,8 @@ int xf86GetKbdLeds()
|
|||
return(leds);
|
||||
}
|
||||
|
||||
#if NeedFunctionPrototypes
|
||||
void xf86SetKbdRepeat(char rad)
|
||||
#else
|
||||
void xf86SetKbdRepeat(rad)
|
||||
char rad;
|
||||
#endif
|
||||
void
|
||||
xf86SetKbdRepeat(char rad)
|
||||
{
|
||||
#ifdef KDSETRAD
|
||||
ioctl(xf86Info.consoleFd, KDSETRAD, rad);
|
||||
|
|
@ -60,14 +54,15 @@ static int kbdtrans;
|
|||
static struct termio kbdtty;
|
||||
static char *kbdemap = NULL;
|
||||
|
||||
void xf86KbdInit()
|
||||
void
|
||||
xf86KbdInit()
|
||||
{
|
||||
#ifdef KDGKBMODE
|
||||
ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
|
||||
#endif
|
||||
ioctl (xf86Info.consoleFd, TCGETA, &kbdtty);
|
||||
#if defined(E_TABSZ) && !defined(SCO325)
|
||||
kbdemap = (char *)xalloc(E_TABSZ);
|
||||
kbdemap = xalloc(E_TABSZ);
|
||||
if (ioctl(xf86Info.consoleFd, LDGMAP, kbdemap) < 0)
|
||||
{
|
||||
xfree(kbdemap);
|
||||
|
|
@ -76,7 +71,8 @@ void xf86KbdInit()
|
|||
#endif
|
||||
}
|
||||
|
||||
int xf86KbdOn()
|
||||
int
|
||||
xf86KbdOn()
|
||||
{
|
||||
struct termio nTty;
|
||||
|
||||
|
|
@ -93,7 +89,8 @@ int xf86KbdOn()
|
|||
return(xf86Info.consoleFd);
|
||||
}
|
||||
|
||||
int xf86KbdOff()
|
||||
int
|
||||
xf86KbdOff()
|
||||
{
|
||||
if (kbdemap)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/sysv_init.c,v 3.4.2.1 1998/02/06 22:36:54 hohndel Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/sysv_init.c,v 3.5 1998/07/25 16:57:08 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
|
|
@ -23,17 +23,15 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: sysv_init.c,v 1.3 2000/08/17 19:51:32 cpqbld Exp $ */
|
||||
/* $XConsortium: sysv_init.c /main/4 1996/02/21 17:54:31 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "Xmd.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
static Bool KeepTty = FALSE;
|
||||
|
|
@ -42,27 +40,21 @@ static Bool Protect0 = FALSE;
|
|||
#endif
|
||||
static int VTnum = -1;
|
||||
|
||||
extern void xf86VTRequest(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
|
||||
void xf86OpenConsole()
|
||||
void
|
||||
xf86OpenConsole()
|
||||
{
|
||||
int fd;
|
||||
struct vt_mode VT;
|
||||
char vtname1[10],vtname2[10];
|
||||
MessageType from = X_PROBED;
|
||||
|
||||
if (serverGeneration == 1)
|
||||
{
|
||||
/* check if we're run with euid==0 */
|
||||
if (geteuid() != 0)
|
||||
{
|
||||
FatalError("xf86OpenConsole: Server must be running with root "
|
||||
"permissions\n"
|
||||
"You should be using Xwrapper to start the server or xdm.\n"
|
||||
"We strongly advise against making the server SUID root!\n");
|
||||
FatalError("xf86OpenConsole: Server must be suid root\n");
|
||||
}
|
||||
|
||||
#ifdef SVR4
|
||||
|
|
@ -74,16 +66,18 @@ void xf86OpenConsole()
|
|||
|
||||
if ((fd = open("/dev/zero", O_RDONLY, 0)) < 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: cannot open /dev/zero (%s)\n",
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING,
|
||||
"xf86OpenConsole: cannot open /dev/zero (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((int)mmap(0, 0x1000, PROT_NONE,
|
||||
MAP_FIXED | MAP_SHARED, fd, 0) == -1)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: failed to protect page 0 (%s)\n",
|
||||
strerror(errno));
|
||||
xf86Msg(X_WARNING,
|
||||
"xf86OpenConsole: failed to protect page 0 (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
|
|
@ -95,6 +89,7 @@ void xf86OpenConsole()
|
|||
if (VTnum != -1)
|
||||
{
|
||||
xf86Info.vtno = VTnum;
|
||||
from = X_CMDLINE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -111,13 +106,11 @@ void xf86OpenConsole()
|
|||
}
|
||||
close(fd);
|
||||
}
|
||||
ErrorF("(using VT number %d)\n\n", xf86Info.vtno);
|
||||
xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno);
|
||||
|
||||
sprintf(vtname1,"/dev/vc%02d",xf86Info.vtno); /* ESIX */
|
||||
sprintf(vtname2,"/dev/vt%02d",xf86Info.vtno); /* rest of the world */
|
||||
|
||||
xf86Config(FALSE); /* Read XF86Config */
|
||||
|
||||
if (!KeepTty)
|
||||
{
|
||||
setpgrp();
|
||||
|
|
@ -141,11 +134,11 @@ void xf86OpenConsole()
|
|||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0)
|
||||
{
|
||||
|
|
@ -174,24 +167,25 @@ void xf86OpenConsole()
|
|||
*/
|
||||
if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n");
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) != 0)
|
||||
{
|
||||
ErrorF("xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n");
|
||||
}
|
||||
/*
|
||||
* If the server doesn't have the VT when the reset occurs,
|
||||
* this is to make sure we don't continue until the activate
|
||||
* signal is received.
|
||||
*/
|
||||
if (!xf86VTSema)
|
||||
if (!xf86Screens[0]->vtSema)
|
||||
sleep(5);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86CloseConsole()
|
||||
void
|
||||
xf86CloseConsole()
|
||||
{
|
||||
struct vt_mode VT;
|
||||
|
||||
|
|
@ -209,10 +203,8 @@ void xf86CloseConsole()
|
|||
return;
|
||||
}
|
||||
|
||||
int xf86ProcessArgument(argc, argv, i)
|
||||
int argc;
|
||||
char *argv[];
|
||||
int i;
|
||||
int
|
||||
xf86ProcessArgument(int argc, char *argv[], int i)
|
||||
{
|
||||
/*
|
||||
* Keep server from detaching from controlling tty. This is useful
|
||||
|
|
@ -248,7 +240,8 @@ int i;
|
|||
return(0);
|
||||
}
|
||||
|
||||
void xf86UseMsg()
|
||||
void
|
||||
xf86UseMsg()
|
||||
{
|
||||
ErrorF("vtXX use the specified VT number\n");
|
||||
ErrorF("-keeptty ");
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/sysv_io.c,v 3.4 1996/12/23 06:51:26 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/sysv_io.c,v 3.11 2003/02/17 15:12:00 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Dawes <dawes@physics.su.oz.au>
|
||||
* Copyright 1993 by David Dawes <dawes@xfree86.org>
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
|
|
@ -23,23 +23,18 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: sysv_io.c,v 1.3 2000/08/17 19:51:32 cpqbld Exp $ */
|
||||
/* $XConsortium: sysv_io.c /main/8 1996/10/19 18:08:06 kaleb $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
|
||||
void xf86SoundKbdBell(loudness, pitch, duration)
|
||||
int loudness;
|
||||
int pitch;
|
||||
int duration;
|
||||
void
|
||||
xf86SoundKbdBell(int loudness, int pitch, int duration)
|
||||
{
|
||||
if (loudness && pitch)
|
||||
{
|
||||
|
|
@ -60,8 +55,8 @@ int duration;
|
|||
}
|
||||
}
|
||||
|
||||
void xf86SetKbdLeds(leds)
|
||||
int leds;
|
||||
void
|
||||
xf86SetKbdLeds(int leds)
|
||||
{
|
||||
#ifdef KBIO_SETMODE
|
||||
ioctl(xf86Info.consoleFd, KBIO_SETMODE, KBM_AT);
|
||||
|
|
@ -70,29 +65,10 @@ int leds;
|
|||
#endif
|
||||
}
|
||||
|
||||
void xf86MouseInit(mouse)
|
||||
MouseDevPtr mouse;
|
||||
#include "xf86OSKbd.h"
|
||||
|
||||
Bool
|
||||
xf86OSKbdPreInit(InputInfoPtr pInfo)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int xf86MouseOn(mouse)
|
||||
MouseDevPtr mouse;
|
||||
{
|
||||
if ((mouse->mseFd = open(mouse->mseDevice, O_RDWR | O_NDELAY)) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Cannot open mouse (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return(-2);
|
||||
}
|
||||
FatalError("Cannot open mouse (%s)\n", strerror(errno));
|
||||
}
|
||||
|
||||
xf86SetupMouse(mouse);
|
||||
|
||||
/* Flush any pending input */
|
||||
ioctl(mouse->mseFd, TCFLSH, 0);
|
||||
|
||||
return(mouse->mseFd);
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/sysv_video.c,v 3.9 1996/12/23 06:51:27 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/sysv_video.c,v 3.20 2000/10/28 01:42:29 mvojkovi Exp $ */
|
||||
/*
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993 by David Wexelblat <dwex@goblin.org>
|
||||
|
|
@ -23,16 +23,19 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: sysv_video.c,v 1.3 2000/08/17 19:51:33 cpqbld Exp $ */
|
||||
/* $XConsortium: sysv_video.c /main/8 1996/10/25 11:38:09 kaleb $ */
|
||||
|
||||
#include "X.h"
|
||||
#include "input.h"
|
||||
#include "scrnintstr.h"
|
||||
|
||||
#define _NEED_SYSI86
|
||||
#include "xf86.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86OSpriv.h"
|
||||
|
||||
#ifndef MAP_FAILED
|
||||
#define MAP_FAILED ((void *)-1)
|
||||
#endif
|
||||
|
||||
#ifndef SI86IOPL
|
||||
#define SET_IOPL() sysi86(SI86V86,V86SC_IOPL,PS_IOPL)
|
||||
|
|
@ -46,53 +49,96 @@
|
|||
/* Video Memory Mapping section */
|
||||
/***************************************************************************/
|
||||
|
||||
struct kd_memloc MapDSC[MAXSCREENS][NUM_REGIONS];
|
||||
pointer AllocAddress[MAXSCREENS][NUM_REGIONS];
|
||||
#ifndef SVR4
|
||||
static int mmapFd = -2;
|
||||
#endif
|
||||
#if 0
|
||||
/* inserted for DGA support Tue Dec 5 21:33:00 MET 1995 mr */
|
||||
#if defined(SVR4) || defined(HAS_SVR3_MMAPDRV)
|
||||
static struct xf86memMap {
|
||||
int offset;
|
||||
int memSize;
|
||||
} xf86memMaps[MAXSCREENS];
|
||||
#endif
|
||||
/*
|
||||
* XXX Support for SVR3 will need to be reworked if needed. In particular
|
||||
* the Region parameter is no longer passed, and will need to be dealt
|
||||
* with internally if required.
|
||||
* OK, i'll rework that thing ... (clean it up a lot)
|
||||
* SVR3 Support only with SVR3_MMAPDRV (mr)
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef HAS_SVR3_MMAPDRV
|
||||
#ifndef MMAP_DEBUG
|
||||
#define MMAP_DEBUG 3
|
||||
#endif
|
||||
|
||||
Bool xf86LinearVidMem()
|
||||
struct kd_memloc MapDSC;
|
||||
int mmapFd = -2;
|
||||
|
||||
static int
|
||||
mmapStat(pointer Base, unsigned long Size) {
|
||||
|
||||
int nmmreg,i=0,region=-1;
|
||||
mmapinfo_t *ibuf;
|
||||
|
||||
nmmreg = ioctl(mmapFd, GETNMMREG);
|
||||
|
||||
if(nmmreg <= 0)
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"\nNo physical memory mapped currently.\n\n");
|
||||
else {
|
||||
if((ibuf = (mmapinfo_t *)malloc(nmmreg*sizeof(mmapinfo_t))) == NULL)
|
||||
xf86Msg(X_WARNING,
|
||||
"Couldn't allocate memory 4 mmapinfo_t\n");
|
||||
else {
|
||||
if(ioctl(mmapFd, GETMMREG, ibuf) != -1)
|
||||
{
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"# mmapStat: [Size=%x,Base=%x]\n", Size, Base);
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"# Physical Address Size Reference Count\n");
|
||||
for(i = 0; i < nmmreg; i++) {
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"%-4d 0x%08X %5dk %5d ",
|
||||
i, ibuf[i].physaddr, ibuf[i].length/1024, ibuf[i].refcnt);
|
||||
if (ibuf[i].physaddr == Base || ibuf[i].length == Size ) {
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,"MATCH !!!");
|
||||
if (region==-1) region=i;
|
||||
}
|
||||
xf86ErrorFVerb(MMAP_DEBUG, "\n");
|
||||
}
|
||||
xf86ErrorFVerb(MMAP_DEBUG, "\n");
|
||||
}
|
||||
free(ibuf);
|
||||
}
|
||||
}
|
||||
if (region == -1 && nmmreg > 0) region=region * i;
|
||||
return(region);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static Bool
|
||||
linearVidMem()
|
||||
{
|
||||
#ifdef SVR4
|
||||
return TRUE;
|
||||
#else
|
||||
#ifdef HAS_SVR3_MMAPDRV
|
||||
if(mmapFd >= 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
#elif defined(HAS_SVR3_MMAPDRV)
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"# xf86LinearVidMem: MMAP 2.2.2 called\n");
|
||||
|
||||
if(mmapFd >= 0) return TRUE;
|
||||
|
||||
if ((mmapFd = open("/dev/mmap", O_RDWR)) != -1)
|
||||
{
|
||||
if(ioctl(mmapFd, GETVERSION) < 0x0222) {
|
||||
ErrorF("xf86LinearVidMem: MMAP 2.2.2 or above required\n");
|
||||
ErrorF(" linear memory access disabled\n");
|
||||
xf86Msg(X_WARNING,
|
||||
"xf86LinearVidMem: MMAP 2.2.2 or above required\n");
|
||||
xf86ErrorF("\tlinear memory access disabled\n");
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
ErrorF("xf86LinearVidMem: failed to open /dev/mmap (%s)\n",
|
||||
strerror(errno));
|
||||
ErrorF(" linear memory access disabled\n");
|
||||
#endif
|
||||
xf86Msg(X_WARNING, "xf86LinearVidMem: failed to open /dev/mmap (%s)\n",
|
||||
strerror(errno));
|
||||
xf86ErrorF("\tlinear memory access disabled\n");
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
pointer xf86MapVidMem(ScreenNum, Region, Base, Size)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
pointer Base;
|
||||
unsigned long Size;
|
||||
static pointer
|
||||
mapVidMem(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
|
||||
{
|
||||
pointer base;
|
||||
int fd;
|
||||
|
|
@ -103,47 +149,40 @@ unsigned long Size;
|
|||
FatalError("xf86MapVidMem: failed to open %s (%s)\n",
|
||||
DEV_MEM, strerror(errno));
|
||||
}
|
||||
base = (pointer)mmap((caddr_t)0, Size, PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED, fd, (off_t)Base);
|
||||
base = mmap((caddr_t)0, Size, PROT_READ|PROT_WRITE,
|
||||
MAP_SHARED, fd, (off_t)Base);
|
||||
close(fd);
|
||||
if ((long)base == -1)
|
||||
if (base == MAP_FAILED)
|
||||
{
|
||||
FatalError("%s: Could not mmap framebuffer [s=%x,a=%x] (%s)\n",
|
||||
"xf86MapVidMem", Size, Base, strerror(errno));
|
||||
}
|
||||
#else /* SVR4 */
|
||||
#ifdef HAS_SVR3_MMAPDRV
|
||||
if (mmapFd == -2)
|
||||
{
|
||||
mmapFd = open("/dev/mmap", O_RDWR);
|
||||
}
|
||||
#endif
|
||||
if (mmapFd >= 0)
|
||||
{
|
||||
/* To force the MMAP driver to provide the address */
|
||||
base = (pointer)0;
|
||||
}
|
||||
else
|
||||
{
|
||||
AllocAddress[ScreenNum][Region] = (pointer)xalloc(Size + 0x1000);
|
||||
if (AllocAddress[ScreenNum][Region] == (pointer)0)
|
||||
{
|
||||
FatalError("xf86MapVidMem: can't alloc framebuffer space\n");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
base = (pointer)(((unsigned int)AllocAddress[ScreenNum][Region]
|
||||
& ~0xFFF) + 0x1000);
|
||||
}
|
||||
MapDSC[ScreenNum][Region].vaddr = (char *)base;
|
||||
MapDSC[ScreenNum][Region].physaddr = (char *)Base;
|
||||
MapDSC[ScreenNum][Region].length = Size;
|
||||
MapDSC[ScreenNum][Region].ioflg = 1;
|
||||
|
||||
#ifdef HAS_SVR3_MMAPDRV
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG, "# xf86MapVidMem: MMAP 2.2.2 called\n");
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"MMAP_VERSION: 0x%x\n",ioctl(mmapFd, GETVERSION));
|
||||
if (ioctl(mmapFd, GETVERSION) == -1)
|
||||
{
|
||||
xf86LinearVidMem();
|
||||
}
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"MMAP_VERSION: 0x%x\n",ioctl(mmapFd, GETVERSION));
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"xf86MapVidMem: Screen: %d\n", ScreenNum);
|
||||
mmapStat(Base,Size);
|
||||
/* To force the MMAP driver to provide the address */
|
||||
base = (pointer)0;
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"xf86MapVidMem: [s=%x,a=%x]\n", Size, Base);
|
||||
MapDSC.vaddr = (char *)base;
|
||||
MapDSC.physaddr = (char *)Base;
|
||||
MapDSC.length = Size;
|
||||
MapDSC.ioflg = 1;
|
||||
if(mmapFd >= 0)
|
||||
{
|
||||
if((base = (pointer)ioctl(mmapFd, MAP,
|
||||
&(MapDSC[ScreenNum][Region]))) == (pointer)-1)
|
||||
if((base = (pointer)ioctl(mmapFd, MAP, &MapDSC)) == (pointer)-1)
|
||||
{
|
||||
FatalError("%s: Could not mmap framebuffer [s=%x,a=%x] (%s)\n",
|
||||
"xf86MapVidMem", Size, Base, strerror(errno));
|
||||
|
|
@ -151,152 +190,106 @@ unsigned long Size;
|
|||
}
|
||||
|
||||
/* Next time we want the same address! */
|
||||
MapDSC[ScreenNum][Region].vaddr = (char *)base;
|
||||
#if 0
|
||||
/* inserted for DGA support Tue Dec 5 21:33:00 MET 1995 mr */
|
||||
xf86memMaps[ScreenNum].offset = (int) Base;
|
||||
xf86memMaps[ScreenNum].memSize = Size;
|
||||
#endif
|
||||
return((pointer)base);
|
||||
}
|
||||
#endif
|
||||
if (ioctl(xf86Info.consoleFd, KDMAPDISP,
|
||||
&(MapDSC[ScreenNum][Region])) < 0)
|
||||
{
|
||||
FatalError("xf86MapVidMem: Failed to map video mem (%x,%x) (%s)\n",
|
||||
Base, Size, strerror(errno));
|
||||
/* NOTREACHED */
|
||||
MapDSC.vaddr = (char *)base;
|
||||
}
|
||||
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"MapDSC.vaddr : 0x%x\n", MapDSC.vaddr);
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"MapDSC.physaddr: 0x%x\n", MapDSC.physaddr);
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"MapDSC.length : %d\n", MapDSC.length);
|
||||
mmapStat(Base,Size);
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"xf86MapVidMem: [s=%x,a=%x,b=%x]\n", Size, Base, base);
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"xf86MapVidMem: SUCCEED Mapping FrameBuffer \n");
|
||||
#endif /* HAS_SVR3_MMAPDRV */
|
||||
#endif /* SVR4 */
|
||||
#if 0
|
||||
xf86memMaps[ScreenNum].offset = (int) Base;
|
||||
xf86memMaps[ScreenNum].memSize = Size;
|
||||
#endif
|
||||
return((pointer)base);
|
||||
return(base);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* inserted for DGA support Tue Dec 5 21:33:00 MET 1995 mr */
|
||||
#if defined(SVR4) || defined(HAS_SVR3_MMAPDRV)
|
||||
void xf86GetVidMemData(ScreenNum, Base, Size)
|
||||
int ScreenNum;
|
||||
int *Base;
|
||||
int *Size;
|
||||
{
|
||||
*Base = xf86memMaps[ScreenNum].offset;
|
||||
*Size = xf86memMaps[ScreenNum].memSize;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
/* ARGSUSED */
|
||||
void xf86UnMapVidMem(ScreenNum, Region, Base, Size)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
pointer Base;
|
||||
unsigned long Size;
|
||||
static void
|
||||
unmapVidMem(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
#if defined (SVR4)
|
||||
munmap(Base, Size);
|
||||
#else /* SVR4 */
|
||||
#ifdef HAS_SVR3_MMAPDRV
|
||||
if(mmapFd >= 0)
|
||||
{
|
||||
ioctl(mmapFd, UNMAPRM, MapDSC[ScreenNum][Region].vaddr);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/* XXXX This is a problem because it unmaps all regions */
|
||||
ioctl(xf86Info.consoleFd, KDUNMAPDISP, 0);
|
||||
xfree(AllocAddress[ScreenNum][Region]);
|
||||
#endif /* SVR4 */
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void xf86MapDisplay(ScreenNum, Region)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
{
|
||||
#if !defined(SVR4)
|
||||
#ifdef HAS_SVR3_MMAPDRV
|
||||
if(mmapFd >= 0)
|
||||
{
|
||||
ioctl(mmapFd, MAP, &(MapDSC[ScreenNum][Region]));
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
ioctl(xf86Info.consoleFd, KDMAPDISP, &(MapDSC[ScreenNum][Region]));
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"# xf86UnMapVidMem: UNMapping FrameBuffer\n");
|
||||
mmapStat(Base,Size);
|
||||
ioctl(mmapFd, UNMAPRM , Base);
|
||||
mmapStat(Base,Size);
|
||||
xf86MsgVerb(X_INFO, MMAP_DEBUG,
|
||||
"# xf86UnMapVidMem: Screen: %d [v=%x]\n", ScreenNum, Base);
|
||||
#endif /* HAS_SVR3_MMAPDRV */
|
||||
#endif /* SVR4 */
|
||||
return;
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void xf86UnMapDisplay(ScreenNum, Region)
|
||||
int ScreenNum;
|
||||
int Region;
|
||||
{
|
||||
#if !defined(SVR4)
|
||||
#ifdef HAS_SVR3_MMAPDRV
|
||||
if(mmapFd > 0)
|
||||
{
|
||||
ioctl(mmapFd, UNMAP, MapDSC[ScreenNum][Region].vaddr);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
ioctl(xf86Info.consoleFd, KDUNMAPDISP, 0);
|
||||
#endif /* SVR4 */
|
||||
return;
|
||||
}
|
||||
#if defined(SVR4) && defined(i386) && !defined(sun)
|
||||
/*
|
||||
* For some SVR4 versions, a 32-bit read is done for the first location
|
||||
* in each page when the page is first mapped. If this is done while
|
||||
* memory access is enabled for regions that have read side-effects,
|
||||
* this can cause unexpected results, including lockups on some hardware.
|
||||
* This function is called to make sure each page is mapped while it is
|
||||
* safe to do so.
|
||||
*/
|
||||
|
||||
/*
|
||||
* XXX Should get this the correct way (see os/xalloc.c), but since this is
|
||||
* for one platform I'll be lazy.
|
||||
*/
|
||||
#define X_PAGE_SIZE 4096
|
||||
|
||||
static void
|
||||
readSideEffects(int ScreenNum, pointer Base, unsigned long Size)
|
||||
{
|
||||
unsigned long base, end, addr;
|
||||
CARD32 val;
|
||||
|
||||
base = (unsigned long)Base;
|
||||
end = base + Size;
|
||||
|
||||
for (addr = base; addr < end; addr += X_PAGE_SIZE)
|
||||
val = *(volatile CARD32 *)addr;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
xf86OSInitVidMem(VidMemInfoPtr pVidMem)
|
||||
{
|
||||
pVidMem->linearSupported = linearVidMem();
|
||||
pVidMem->mapMem = mapVidMem;
|
||||
pVidMem->unmapMem = unmapVidMem;
|
||||
#if defined(SVR4) && defined(i386) && !defined(sun)
|
||||
pVidMem->readSideEffects = readSideEffects;
|
||||
#endif
|
||||
pVidMem->initialised = TRUE;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/* I/O Permissions section */
|
||||
/***************************************************************************/
|
||||
|
||||
#define ALWAYS_USE_EXTENDED
|
||||
#ifdef ALWAYS_USE_EXTENDED
|
||||
|
||||
static Bool ScreenEnabled[MAXSCREENS];
|
||||
static Bool ExtendedEnabled = FALSE;
|
||||
static Bool InitDone = FALSE;
|
||||
|
||||
void
|
||||
xf86ClearIOPortList(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
if (!InitDone)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MAXSCREENS; i++)
|
||||
ScreenEnabled[i] = FALSE;
|
||||
InitDone = TRUE;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
xf86AddIOPorts(ScreenNum, NumPorts, Ports)
|
||||
int ScreenNum;
|
||||
int NumPorts;
|
||||
unsigned *Ports;
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
xf86EnableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
xf86EnableIO()
|
||||
{
|
||||
int i;
|
||||
|
||||
ScreenEnabled[ScreenNum] = TRUE;
|
||||
|
||||
if (ExtendedEnabled)
|
||||
return;
|
||||
|
||||
if (SET_IOPL() < 0)
|
||||
{
|
||||
FatalError("%s: Failed to set IOPL for extended I/O\n",
|
||||
"xf86EnableIOPorts");
|
||||
FatalError(
|
||||
"xf86EnableIO: Failed to set IOPL for extended I/O\n");
|
||||
}
|
||||
ExtendedEnabled = TRUE;
|
||||
|
||||
|
|
@ -304,245 +297,23 @@ int ScreenNum;
|
|||
}
|
||||
|
||||
void
|
||||
xf86DisableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
xf86DisableIO()
|
||||
{
|
||||
int i;
|
||||
|
||||
ScreenEnabled[ScreenNum] = FALSE;
|
||||
|
||||
if (!ExtendedEnabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < MAXSCREENS; i++)
|
||||
if (ScreenEnabled[i])
|
||||
return;
|
||||
|
||||
RESET_IOPL();
|
||||
ExtendedEnabled = FALSE;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#else /* !ALWAYS_USE_EXTENDED */
|
||||
|
||||
#define DISABLED 0
|
||||
#define NON_EXTENDED 1
|
||||
#define EXTENDED 2
|
||||
|
||||
static unsigned *EnabledPorts[MAXSCREENS];
|
||||
static int NumEnabledPorts[MAXSCREENS];
|
||||
static Bool ScreenEnabled[MAXSCREENS];
|
||||
static Bool ExtendedPorts[MAXSCREENS];
|
||||
static Bool ExtendedEnabled = FALSE;
|
||||
static Bool InitDone = FALSE;
|
||||
static struct kd_disparam OrigParams;
|
||||
|
||||
void xf86ClearIOPortList(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
if (!InitDone)
|
||||
{
|
||||
xf86InitPortLists(EnabledPorts, NumEnabledPorts, ScreenEnabled,
|
||||
ExtendedPorts, MAXSCREENS);
|
||||
if (ioctl(xf86Info.consoleFd, KDDISPTYPE, &OrigParams) < 0)
|
||||
{
|
||||
FatalError("%s: Could not get display parameters\n",
|
||||
"xf86ClearIOPortList");
|
||||
}
|
||||
InitDone = TRUE;
|
||||
return;
|
||||
}
|
||||
ExtendedPorts[ScreenNum] = FALSE;
|
||||
if (EnabledPorts[ScreenNum] != (unsigned *)NULL)
|
||||
xfree(EnabledPorts[ScreenNum]);
|
||||
EnabledPorts[ScreenNum] = (unsigned *)NULL;
|
||||
NumEnabledPorts[ScreenNum] = 0;
|
||||
}
|
||||
|
||||
void xf86AddIOPorts(ScreenNum, NumPorts, Ports)
|
||||
int ScreenNum;
|
||||
int NumPorts;
|
||||
unsigned *Ports;
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!InitDone)
|
||||
{
|
||||
FatalError("xf86AddIOPorts: I/O control lists not initialised\n");
|
||||
}
|
||||
EnabledPorts[ScreenNum] = (unsigned *)xrealloc(EnabledPorts[ScreenNum],
|
||||
(NumEnabledPorts[ScreenNum]+NumPorts)*sizeof(unsigned));
|
||||
for (i = 0; i < NumPorts; i++)
|
||||
{
|
||||
EnabledPorts[ScreenNum][NumEnabledPorts[ScreenNum] + i] =
|
||||
Ports[i];
|
||||
if (Ports[i] > 0x3FF)
|
||||
ExtendedPorts[ScreenNum] = TRUE;
|
||||
}
|
||||
NumEnabledPorts[ScreenNum] += NumPorts;
|
||||
}
|
||||
|
||||
void xf86EnableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
struct kd_disparam param;
|
||||
int i, j;
|
||||
|
||||
if (ScreenEnabled[ScreenNum])
|
||||
return;
|
||||
|
||||
for (i = 0; i < MAXSCREENS; i++)
|
||||
{
|
||||
if (ExtendedPorts[i] && (ScreenEnabled[i] || i == ScreenNum))
|
||||
{
|
||||
if (SET_IOPL() < 0)
|
||||
{
|
||||
FatalError("%s: Failed to set IOPL for extended I/O\n",
|
||||
"xf86EnableIOPorts");
|
||||
}
|
||||
ExtendedEnabled = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* If extended I/O was used, but isn't any more */
|
||||
if (ExtendedEnabled && i == MAXSCREENS)
|
||||
{
|
||||
RESET_IOPL();
|
||||
ExtendedEnabled = FALSE;
|
||||
}
|
||||
/*
|
||||
* Turn on non-extended ports even when using extended I/O
|
||||
* so they are there if extended I/O gets turned off when it's no
|
||||
* longer needed.
|
||||
*/
|
||||
if (ioctl(xf86Info.consoleFd, KDDISPTYPE, ¶m) < 0)
|
||||
{
|
||||
FatalError("%s: Could not get display parameters\n",
|
||||
"xf86EnableIOPorts");
|
||||
}
|
||||
for (i = 0; i < NumEnabledPorts[ScreenNum]; i++)
|
||||
{
|
||||
unsigned port = EnabledPorts[ScreenNum][i];
|
||||
|
||||
if (port > 0x3FF)
|
||||
continue;
|
||||
|
||||
if (!xf86CheckPorts(port, EnabledPorts, NumEnabledPorts,
|
||||
ScreenEnabled, MAXSCREENS))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for (j=0; j < MKDIOADDR; j++)
|
||||
{
|
||||
if (param.ioaddr[j] == port)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == MKDIOADDR)
|
||||
{
|
||||
if (ioctl(xf86Info.consoleFd, KDADDIO, port) < 0)
|
||||
{
|
||||
FatalError("%s: Failed to enable port 0x%x\n",
|
||||
"xf86EnableIOPorts", port);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ioctl(xf86Info.consoleFd, KDENABIO, 0) < 0)
|
||||
{
|
||||
FatalError("xf86EnableIOPorts: I/O port enable failed (%s)\n",
|
||||
strerror(errno));
|
||||
}
|
||||
ScreenEnabled[ScreenNum] = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
void xf86DisableIOPorts(ScreenNum)
|
||||
int ScreenNum;
|
||||
{
|
||||
struct kd_disparam param;
|
||||
int i, j;
|
||||
|
||||
if (!ScreenEnabled[ScreenNum])
|
||||
return;
|
||||
|
||||
ScreenEnabled[ScreenNum] = FALSE;
|
||||
for (i = 0; i < MAXSCREENS; i++)
|
||||
{
|
||||
if (ScreenEnabled[i] && ExtendedPorts[i])
|
||||
break;
|
||||
}
|
||||
if (ExtendedEnabled && i == MAXSCREENS)
|
||||
{
|
||||
RESET_IOPL();
|
||||
ExtendedEnabled = FALSE;
|
||||
}
|
||||
/* Turn off I/O before changing the access list */
|
||||
ioctl(xf86Info.consoleFd, KDDISABIO, 0);
|
||||
if (ioctl(xf86Info.consoleFd, KDDISPTYPE, ¶m) < 0)
|
||||
{
|
||||
ErrorF("%s: Could not get display parameters\n",
|
||||
"xf86DisableIOPorts");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i=0; i < MKDIOADDR; i++)
|
||||
{
|
||||
/* 0 indicates end of list */
|
||||
if (param.ioaddr[i] == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (!xf86CheckPorts(param.ioaddr[i], EnabledPorts,
|
||||
NumEnabledPorts, ScreenEnabled, MAXSCREENS))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
for (j=0; j < MKDIOADDR; j++)
|
||||
{
|
||||
if (param.ioaddr[i] == OrigParams.ioaddr[j])
|
||||
{
|
||||
/*
|
||||
* Port was one of the original ones; don't
|
||||
* touch it.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == MKDIOADDR)
|
||||
{
|
||||
/*
|
||||
* We added this port, so remove it.
|
||||
*/
|
||||
ioctl(xf86Info.consoleFd, KDDELIO, param.ioaddr[i]);
|
||||
}
|
||||
}
|
||||
/* If any other screens are enabled, turn I/O back on */
|
||||
for (i = 0; i < MAXSCREENS; i++)
|
||||
{
|
||||
if (ScreenEnabled[i])
|
||||
{
|
||||
ioctl(xf86Info.consoleFd, KDENABIO, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif /* ALWAYS_USE_EXTENDED */
|
||||
|
||||
void xf86DisableIOPrivs()
|
||||
{
|
||||
if (ExtendedEnabled)
|
||||
RESET_IOPL();
|
||||
return;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/* Interrupt Handling section */
|
||||
/***************************************************************************/
|
||||
|
||||
Bool xf86DisableInterrupts()
|
||||
Bool
|
||||
xf86DisableInterrupts()
|
||||
{
|
||||
if (!ExtendedEnabled)
|
||||
{
|
||||
|
|
@ -565,7 +336,8 @@ Bool xf86DisableInterrupts()
|
|||
return(TRUE);
|
||||
}
|
||||
|
||||
void xf86EnableInterrupts()
|
||||
void
|
||||
xf86EnableInterrupts()
|
||||
{
|
||||
if (!ExtendedEnabled)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,38 +1,38 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/xqueue.c,v 3.8.2.1 1997/07/13 14:45:04 dawes Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/sysv/xqueue.c,v 3.20 2001/03/06 18:20:31 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1993-1999 by The XFree86 Project, Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
* the above copyright notice appear in all copies and that both that
|
||||
* copyright notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of Thomas Roell not be used in
|
||||
* documentation, and that the name of the copyright holders not be used in
|
||||
* advertising or publicity pertaining to distribution of the software without
|
||||
* specific, written prior permission. Thomas Roell makes no representations
|
||||
* about the suitability of this software for any purpose. It is provided
|
||||
* "as is" without express or implied warranty.
|
||||
* specific, written prior permission. The copyright holders make no
|
||||
* representations about the suitability of this software for any purpose.
|
||||
* It is provided "as is" without express or implied warranty.
|
||||
*
|
||||
* THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* THE COPYRIGHT HOLDERS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||
* EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
||||
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: xqueue.c,v 1.3 2000/08/17 19:51:33 cpqbld Exp $ */
|
||||
/* $XConsortium: xqueue.c /main/8 1996/10/19 18:08:11 kaleb $ */
|
||||
|
||||
#define NEED_EVENTS
|
||||
#include "X.h"
|
||||
#include "Xproto.h"
|
||||
#include "inputstr.h"
|
||||
#include "scrnintstr.h"
|
||||
#include "compiler.h"
|
||||
|
||||
#include "xf86.h"
|
||||
#include "xf86Procs.h"
|
||||
#include "xf86Priv.h"
|
||||
#include "xf86_OSlib.h"
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86OSmouse.h"
|
||||
#include "xqueue.h"
|
||||
|
||||
#ifdef XQUEUE
|
||||
|
||||
|
|
@ -43,19 +43,23 @@ static int xquePipe[2];
|
|||
#endif
|
||||
|
||||
#ifdef XKB
|
||||
#include "inputstr.h"
|
||||
#include <X11/extensions/XKB.h>
|
||||
#include <X11/extensions/XKBstr.h>
|
||||
#include <X11/extensions/XKBsrv.h>
|
||||
extern Bool noXkbExtension;
|
||||
#endif
|
||||
|
||||
#ifdef XINPUT
|
||||
#include "xf86_Config.h"
|
||||
#include "xf86Xinput.h"
|
||||
#endif
|
||||
extern int miPointerGetMotionEvents(DeviceIntPtr pPtr, xTimecoord *coords,
|
||||
unsigned long start, unsigned long stop,
|
||||
ScreenPtr pScreen);
|
||||
#include "mipointer.h"
|
||||
|
||||
typedef struct {
|
||||
int xquePending;
|
||||
int xqueSema;
|
||||
} XqInfoRec, *XqInfoPtr;
|
||||
|
||||
InputInfoPtr XqMouse = NULL;
|
||||
InputInfoPtr XqKeyboard = NULL;
|
||||
|
||||
#ifndef XQUEUE_ASYNC
|
||||
/*
|
||||
|
|
@ -67,7 +71,7 @@ extern int miPointerGetMotionEvents(DeviceIntPtr pPtr, xTimecoord *coords,
|
|||
static void
|
||||
xf86XqueSignal(int signum)
|
||||
{
|
||||
xf86Info.mouseDev->xquePending = 1;
|
||||
((XqInfoPtr)(((MouseDevPtr)(XqMouse->private))->mousePriv))->xquePending = 1;
|
||||
/*
|
||||
* This is a hack, but it is the only reliable way I can find of letting
|
||||
* the main select() loop know that there is more input waiting. Receiving
|
||||
|
|
@ -78,233 +82,22 @@ xf86XqueSignal(int signum)
|
|||
* Suggestions for better ways of dealing with this without going back to
|
||||
* asynchronous event processing are welcome.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
ErrorF("xf86XqueSignal\n");
|
||||
#endif
|
||||
write(xquePipe[1], "X", 1);
|
||||
signal(SIGUSR2, xf86XqueSignal);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* xf86XqueRequest --
|
||||
* Notice an i/o request from the xqueue.
|
||||
*/
|
||||
|
||||
void
|
||||
xf86XqueRequest()
|
||||
{
|
||||
xqEvent *XqueEvents = XqueQaddr->xq_events;
|
||||
int XqueHead = XqueQaddr->xq_head;
|
||||
char buf[100];
|
||||
|
||||
while (XqueHead != XqueQaddr->xq_tail)
|
||||
{
|
||||
|
||||
switch(XqueEvents[XqueHead].xq_type) {
|
||||
|
||||
case XQ_BUTTON:
|
||||
xf86PostMseEvent(xf86Info.pMouse,
|
||||
~(XqueEvents[XqueHead].xq_code) & 0x07, 0, 0);
|
||||
break;
|
||||
|
||||
case XQ_MOTION:
|
||||
xf86PostMseEvent(xf86Info.pMouse,
|
||||
~(XqueEvents[XqueHead].xq_code) & 0x07,
|
||||
XqueEvents[XqueHead].xq_x,
|
||||
XqueEvents[XqueHead].xq_y);
|
||||
break;
|
||||
|
||||
case XQ_KEY:
|
||||
xf86PostKbdEvent(XqueEvents[XqueHead].xq_code);
|
||||
break;
|
||||
|
||||
default:
|
||||
ErrorF("Unknown Xque Event: 0x%02x\n", XqueEvents[XqueHead].xq_type);
|
||||
}
|
||||
|
||||
if ((++XqueHead) == XqueQaddr->xq_size) XqueHead = 0;
|
||||
}
|
||||
|
||||
/* reenable the signal-processing */
|
||||
xf86Info.inputPending = TRUE;
|
||||
#ifdef XQUEUE_ASYNC
|
||||
signal(SIGUSR2, (void (*)()) xf86XqueRequest);
|
||||
#else
|
||||
#if 0
|
||||
signal(SIGUSR2, (void (*)()) xf86XqueSignal);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef XQUEUE_ASYNC
|
||||
{
|
||||
int rval;
|
||||
|
||||
while ((rval = read(xquePipe[0], buf, sizeof(buf))) > 0)
|
||||
#ifdef DEBUG
|
||||
ErrorF("Read %d bytes from xquePipe[0]\n", rval);
|
||||
#else
|
||||
;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
XqueQaddr->xq_head = XqueQaddr->xq_tail;
|
||||
xf86Info.mouseDev->xquePending = 0;
|
||||
XqueQaddr->xq_sigenable = 1; /* UNLOCK */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* xf86XqueEnable --
|
||||
* Enable the handling of the Xque
|
||||
*/
|
||||
|
||||
static int
|
||||
xf86XqueEnable()
|
||||
{
|
||||
static struct kd_quemode xqueMode;
|
||||
static Bool was_here = FALSE;
|
||||
|
||||
if (!was_here) {
|
||||
if ((xqueFd = open("/dev/mouse", O_RDONLY|O_NDELAY)) < 0)
|
||||
{
|
||||
if (xf86AllowMouseOpenFail) {
|
||||
ErrorF("Cannot open /dev/mouse (%s) - Continuing...\n",
|
||||
strerror(errno));
|
||||
return (Success);
|
||||
} else {
|
||||
Error ("Cannot open /dev/mouse");
|
||||
return (!Success);
|
||||
}
|
||||
}
|
||||
#ifndef XQUEUE_ASYNC
|
||||
pipe(xquePipe);
|
||||
fcntl(xquePipe[0],F_SETFL,fcntl(xquePipe[0],F_GETFL,0)|O_NDELAY);
|
||||
fcntl(xquePipe[1],F_SETFL,fcntl(xquePipe[1],F_GETFL,0)|O_NDELAY);
|
||||
#endif
|
||||
was_here = TRUE;
|
||||
}
|
||||
|
||||
if (xf86Info.mouseDev->xqueSema++ == 0)
|
||||
{
|
||||
#ifdef XQUEUE_ASYNC
|
||||
(void) signal(SIGUSR2, (void (*)()) xf86XqueRequest);
|
||||
#else
|
||||
(void) signal(SIGUSR2, (void (*)()) xf86XqueSignal);
|
||||
#endif
|
||||
xqueMode.qsize = 64; /* max events */
|
||||
xqueMode.signo = SIGUSR2;
|
||||
ioctl(xf86Info.consoleFd, KDQUEMODE, NULL);
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, KDQUEMODE, &xqueMode) < 0) {
|
||||
Error ("Cannot set KDQUEMODE");
|
||||
/* CONSTCOND */
|
||||
return (!Success);
|
||||
}
|
||||
|
||||
XqueQaddr = (xqEventQueue *)xqueMode.qaddr;
|
||||
XqueQaddr->xq_sigenable = 1; /* UNLOCK */
|
||||
}
|
||||
|
||||
return(Success);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* xf86XqueDisable --
|
||||
* disable the handling of the Xque
|
||||
*/
|
||||
|
||||
static int
|
||||
xf86XqueDisable()
|
||||
{
|
||||
if (xf86Info.mouseDev->xqueSema-- == 1)
|
||||
{
|
||||
|
||||
XqueQaddr->xq_sigenable = 0; /* LOCK */
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, KDQUEMODE, NULL) < 0) {
|
||||
Error ("Cannot unset KDQUEMODE");
|
||||
/* CONSTCOND */
|
||||
return (!Success);
|
||||
}
|
||||
}
|
||||
|
||||
return(Success);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* xf86XqueMseProc --
|
||||
* Handle the initialization, etc. of a mouse
|
||||
*/
|
||||
|
||||
int
|
||||
xf86XqueMseProc(pPointer, what)
|
||||
DeviceIntPtr pPointer;
|
||||
int what;
|
||||
{
|
||||
MouseDevPtr mouse = MOUSE_DEV(pPointer);
|
||||
unchar map[4];
|
||||
int ret;
|
||||
|
||||
mouse->device = pPointer;
|
||||
|
||||
switch (what)
|
||||
{
|
||||
case DEVICE_INIT:
|
||||
|
||||
pPointer->public.on = FALSE;
|
||||
|
||||
map[1] = 1;
|
||||
map[2] = 2;
|
||||
map[3] = 3;
|
||||
InitPointerDeviceStruct((DevicePtr)pPointer,
|
||||
map,
|
||||
3,
|
||||
miPointerGetMotionEvents,
|
||||
(PtrCtrlProcPtr)xf86MseCtrl,
|
||||
miPointerGetMotionBufferSize());
|
||||
break;
|
||||
|
||||
case DEVICE_ON:
|
||||
mouse->lastButtons = 0;
|
||||
mouse->emulateState = 0;
|
||||
pPointer->public.on = TRUE;
|
||||
ret = xf86XqueEnable();
|
||||
#ifndef XQUEUE_ASYNC
|
||||
if (xquePipe[0] != -1)
|
||||
AddEnabledDevice(xquePipe[0]);
|
||||
#endif
|
||||
return(ret);
|
||||
|
||||
case DEVICE_CLOSE:
|
||||
case DEVICE_OFF:
|
||||
pPointer->public.on = FALSE;
|
||||
ret = xf86XqueDisable();
|
||||
#ifndef XQUEUE_ASYNC
|
||||
if (xquePipe[0] != -1)
|
||||
RemoveEnabledDevice(xquePipe[0]);
|
||||
#endif
|
||||
return(ret);
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* xf86XqueKbdProc --
|
||||
* Handle the initialization, etc. of a keyboard.
|
||||
*/
|
||||
|
||||
int
|
||||
xf86XqueKbdProc (pKeyboard, what)
|
||||
DeviceIntPtr pKeyboard; /* Keyboard to manipulate */
|
||||
int what; /* What to do to it */
|
||||
xf86XqueKbdProc(DeviceIntPtr pKeyboard, int what)
|
||||
{
|
||||
KeySymsRec keySyms;
|
||||
CARD8 modMap[MAP_LENGTH];
|
||||
|
|
@ -381,12 +174,12 @@ xf86XqueKbdProc (pKeyboard, what)
|
|||
case DEVICE_ON:
|
||||
pKeyboard->public.on = TRUE;
|
||||
xf86InitKBD(FALSE);
|
||||
return(xf86XqueEnable());
|
||||
break;
|
||||
|
||||
case DEVICE_CLOSE:
|
||||
case DEVICE_OFF:
|
||||
pKeyboard->public.on = FALSE;
|
||||
return(xf86XqueDisable());
|
||||
break;
|
||||
}
|
||||
|
||||
return (Success);
|
||||
|
|
@ -403,4 +196,343 @@ xf86XqueEvents()
|
|||
{
|
||||
}
|
||||
|
||||
|
||||
#ifdef XQUEUE_ASYNC
|
||||
static void XqDoInput(int signum);
|
||||
#endif
|
||||
|
||||
void
|
||||
XqReadInput(InputInfoPtr pInfo)
|
||||
{
|
||||
MouseDevPtr pMse;
|
||||
XqInfoPtr pXq;
|
||||
xqEvent *XqueEvents;
|
||||
int XqueHead;
|
||||
char buf[100];
|
||||
signed char dx, dy;
|
||||
|
||||
if (xqueFd < 0)
|
||||
return;
|
||||
|
||||
pMse = pInfo->private;
|
||||
pXq = pMse->mousePriv;
|
||||
|
||||
XqueEvents = XqueQaddr->xq_events;
|
||||
XqueHead = XqueQaddr->xq_head;
|
||||
|
||||
while (XqueHead != XqueQaddr->xq_tail) {
|
||||
switch (XqueEvents[XqueHead].xq_type) {
|
||||
case XQ_BUTTON:
|
||||
pMse->PostEvent(pInfo, ~(XqueEvents[XqueHead].xq_code) & 0x07,
|
||||
0, 0, 0, 0);
|
||||
#ifdef DEBUG
|
||||
ErrorF("xqueue: buttons: %d\n", ~(XqueEvents[XqueHead].xq_code) & 0x07);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case XQ_MOTION:
|
||||
dx = (signed char)XqueEvents[XqueHead].xq_x;
|
||||
dy = (signed char)XqueEvents[XqueHead].xq_y;
|
||||
pMse->PostEvent(pInfo, ~(XqueEvents[XqueHead].xq_code) & 0x07,
|
||||
(int)dx, (int)dy, 0, 0);
|
||||
#ifdef DEBUG
|
||||
ErrorF("xqueue: Motion: (%d, %d) (buttons: %d)\n", dx, dy, ~(XqueEvents[XqueHead].xq_code) & 0x07);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case XQ_KEY:
|
||||
/* XXX Need to deal with the keyboard part nicely. */
|
||||
#ifdef DEBUG
|
||||
ErrorF("xqueue: key: %d\n", XqueEvents[XqueHead].xq_code);
|
||||
#endif
|
||||
xf86PostKbdEvent(XqueEvents[XqueHead].xq_code);
|
||||
break;
|
||||
default:
|
||||
xf86Msg(X_WARNING, "Unknown Xque Event: 0x%02x\n",
|
||||
XqueEvents[XqueHead].xq_type);
|
||||
}
|
||||
|
||||
if ((++XqueHead) == XqueQaddr->xq_size) XqueHead = 0;
|
||||
xf86Info.inputPending = TRUE;
|
||||
}
|
||||
|
||||
/* reenable the signal-processing */
|
||||
#ifdef XQUEUE_ASYNC
|
||||
signal(SIGUSR2, XqDoInput);
|
||||
#endif
|
||||
|
||||
#ifndef XQUEUE_ASYNC
|
||||
{
|
||||
int rval;
|
||||
|
||||
while ((rval = read(xquePipe[0], buf, sizeof(buf))) > 0)
|
||||
#ifdef DEBUG
|
||||
ErrorF("Read %d bytes from xquePipe[0]\n", rval);
|
||||
#else
|
||||
;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
ErrorF("Leaving XqReadInput()\n");
|
||||
#endif
|
||||
pXq->xquePending = 0;
|
||||
XqueQaddr->xq_head = XqueQaddr->xq_tail;
|
||||
XqueQaddr->xq_sigenable = 1; /* UNLOCK */
|
||||
}
|
||||
|
||||
#ifdef XQUEUE_ASYNC
|
||||
static void
|
||||
XqDoInput(int signum)
|
||||
{
|
||||
if (XqMouse)
|
||||
XqReadInput(XqMouse);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
XqBlock(pointer blockData, OSTimePtr pTimeout, pointer pReadmask)
|
||||
{
|
||||
InputInfoPtr pInfo;
|
||||
MouseDevPtr pMse;
|
||||
XqInfoPtr pXq;
|
||||
/*
|
||||
* On MP SVR4 boxes, a race condition exists because the XQUEUE does
|
||||
* not have anyway to lock it for exclusive access. This results in one
|
||||
* processor putting something on the queue at the same time the other
|
||||
* processor is taking it something off. The count of items in the queue
|
||||
* can get off by 1. This just goes and checks to see if an extra event
|
||||
* was put in the queue a during this period. The signal for this event
|
||||
* was ignored while processing the previous event.
|
||||
*/
|
||||
|
||||
pInfo = blockData;
|
||||
pMse = pInfo->private;
|
||||
pXq = pMse-> mousePriv;
|
||||
if (!pXq->xquePending) {
|
||||
#ifdef DEBUG
|
||||
ErrorF("XqBlock: calling XqReadInput()\n");
|
||||
#endif
|
||||
XqReadInput((InputInfoPtr)blockData);
|
||||
} else {
|
||||
#ifdef DEBUG
|
||||
ErrorF("XqBlock: not calling XqReadInput()\n");
|
||||
#endif
|
||||
;
|
||||
}
|
||||
/*
|
||||
* Make sure that any events that come in here are passed on without.
|
||||
* waiting for the next wakeup.
|
||||
*/
|
||||
if (xf86Info.inputPending) {
|
||||
#ifdef DEBUG
|
||||
ErrorF("XqBlock: calling ProcessInputEvents()\n");
|
||||
#endif
|
||||
ProcessInputEvents();
|
||||
} else {
|
||||
#ifdef DEBUG
|
||||
ErrorF("XqBlock: not calling ProcessInputEvents()\n");
|
||||
#endif
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* XqEnable --
|
||||
* Enable the handling of the Xque
|
||||
*/
|
||||
|
||||
static int
|
||||
XqEnable(InputInfoPtr pInfo)
|
||||
{
|
||||
MouseDevPtr pMse;
|
||||
XqInfoPtr pXq;
|
||||
static struct kd_quemode xqueMode;
|
||||
static Bool was_here = FALSE;
|
||||
|
||||
pMse = pInfo->private;
|
||||
pXq = pMse->mousePriv;
|
||||
|
||||
if (xqueFd < 0) {
|
||||
if ((xqueFd = open("/dev/mouse", O_RDONLY | O_NDELAY)) < 0) {
|
||||
if (xf86GetAllowMouseOpenFail()) {
|
||||
xf86Msg(X_WARNING,
|
||||
"%s: Cannot open /dev/mouse (%s) - Continuing...\n",
|
||||
pInfo->name, strerror(errno));
|
||||
return Success;
|
||||
} else {
|
||||
xf86Msg(X_ERROR, "%s: Cannot open /dev/mouse (%s)\n",
|
||||
pInfo->name, strerror(errno));
|
||||
return !Success;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifndef XQUEUE_ASYNC
|
||||
if (!was_here) {
|
||||
pipe(xquePipe);
|
||||
fcntl(xquePipe[0], F_SETFL, fcntl(xquePipe[0], F_GETFL, 0) | O_NDELAY);
|
||||
fcntl(xquePipe[1], F_SETFL, fcntl(xquePipe[1], F_GETFL, 0) | O_NDELAY);
|
||||
was_here = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (pXq->xqueSema++ == 0) {
|
||||
#ifdef XQUEUE_ASYNC
|
||||
(void) signal(SIGUSR2, XqDoInput);
|
||||
#else
|
||||
(void) signal(SIGUSR2, xf86XqueSignal);
|
||||
#endif
|
||||
xqueMode.qsize = 64; /* max events */
|
||||
xqueMode.signo = SIGUSR2;
|
||||
ioctl(xf86Info.consoleFd, KDQUEMODE, NULL);
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, KDQUEMODE, &xqueMode) < 0) {
|
||||
xf86Msg(X_ERROR, "%s: Cannot set KDQUEMODE", pInfo->name);
|
||||
return !Success;
|
||||
}
|
||||
XqueQaddr = (xqEventQueue *)xqueMode.qaddr;
|
||||
XqueQaddr->xq_sigenable = 1; /* UNLOCK */
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* xf86XqueDisable --
|
||||
* disable the handling of the Xque
|
||||
*/
|
||||
|
||||
static int
|
||||
XqDisable(InputInfoPtr pInfo)
|
||||
{
|
||||
MouseDevPtr pMse;
|
||||
XqInfoPtr pXq;
|
||||
|
||||
pMse = pInfo->private;
|
||||
pXq = pMse->mousePriv;
|
||||
|
||||
if (pXq->xqueSema-- == 1)
|
||||
{
|
||||
XqueQaddr->xq_sigenable = 0; /* LOCK */
|
||||
|
||||
if (ioctl(xf86Info.consoleFd, KDQUEMODE, NULL) < 0) {
|
||||
xf86Msg(X_ERROR, "%s: Cannot unset KDQUEMODE", pInfo->name);
|
||||
return !Success;
|
||||
}
|
||||
}
|
||||
|
||||
if (xqueFd >= 0) {
|
||||
close(xqueFd);
|
||||
xqueFd = -1;
|
||||
}
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
/*
|
||||
* XqMouseProc --
|
||||
* Handle the initialization, etc. of a mouse
|
||||
*/
|
||||
|
||||
static int
|
||||
XqMouseProc(DeviceIntPtr pPointer, int what)
|
||||
{
|
||||
InputInfoPtr pInfo;
|
||||
MouseDevPtr pMse;
|
||||
unchar map[4];
|
||||
int ret;
|
||||
|
||||
pInfo = pPointer->public.devicePrivate;
|
||||
pMse = pInfo->private;
|
||||
pMse->device = pPointer;
|
||||
|
||||
switch (what) {
|
||||
case DEVICE_INIT:
|
||||
pPointer->public.on = FALSE;
|
||||
|
||||
map[1] = 1;
|
||||
map[2] = 2;
|
||||
map[3] = 3;
|
||||
|
||||
InitPointerDeviceStruct((DevicePtr)pPointer,
|
||||
map,
|
||||
3,
|
||||
miPointerGetMotionEvents,
|
||||
pMse->Ctrl,
|
||||
miPointerGetMotionBufferSize());
|
||||
/* X valuator */
|
||||
xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
|
||||
xf86InitValuatorDefaults(pPointer, 0);
|
||||
/* Y valuator */
|
||||
xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
|
||||
xf86InitValuatorDefaults(pPointer, 1);
|
||||
xf86MotionHistoryAllocate(pInfo);
|
||||
RegisterBlockAndWakeupHandlers(XqBlock, (WakeupHandlerProcPtr)NoopDDA,
|
||||
pInfo);
|
||||
break;
|
||||
|
||||
case DEVICE_ON:
|
||||
pMse->lastButtons = 0;
|
||||
pMse->emulateState = 0;
|
||||
pPointer->public.on = TRUE;
|
||||
ret = XqEnable(pInfo);
|
||||
#ifndef XQUEUE_ASYNC
|
||||
if (xquePipe[0] != -1) {
|
||||
pInfo->fd = xquePipe[0];
|
||||
AddEnabledDevice(xquePipe[0]);
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
|
||||
case DEVICE_CLOSE:
|
||||
case DEVICE_OFF:
|
||||
pPointer->public.on = FALSE;
|
||||
ret = XqDisable(pInfo);
|
||||
#ifndef XQUEUE_ASYNC
|
||||
if (xquePipe[0] != -1) {
|
||||
RemoveEnabledDevice(xquePipe[0]);
|
||||
pInfo->fd = -1;
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
return Success;
|
||||
}
|
||||
|
||||
Bool
|
||||
XqueueMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
|
||||
{
|
||||
MouseDevPtr pMse;
|
||||
XqInfoPtr pXq;
|
||||
|
||||
pMse = pInfo->private;
|
||||
pMse->protocol = protocol;
|
||||
xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
|
||||
pXq = pMse->mousePriv = xnfcalloc(sizeof(XqInfoRec), 1);
|
||||
|
||||
/* Collect the options, and process the common options. */
|
||||
xf86CollectInputOptions(pInfo, NULL, NULL);
|
||||
xf86ProcessCommonOptions(pInfo, pInfo->options);
|
||||
|
||||
/* Process common mouse options (like Emulate3Buttons, etc). */
|
||||
pMse->CommonOptions(pInfo);
|
||||
|
||||
/* Setup the local procs. */
|
||||
pInfo->device_control = XqMouseProc;
|
||||
#ifdef XQUEUE_ASYNC
|
||||
pInfo->read_input = NULL;
|
||||
#else
|
||||
pInfo->read_input = XqReadInput;
|
||||
#endif
|
||||
pInfo->fd = -1;
|
||||
|
||||
XqMouse = pInfo;
|
||||
|
||||
pInfo->flags |= XI86_CONFIGURED;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#endif /* XQUEUE */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSlib.h,v 3.36.2.5 1998/02/15 16:09:30 hohndel Exp $ */
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSlib.h,v 3.90 2002/05/31 18:46:00 dawes Exp $ */
|
||||
/*
|
||||
* Copyright 1990, 1991 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1992 by David Dawes <dawes@XFree86.org>
|
||||
|
|
@ -9,7 +9,8 @@
|
|||
* Copyright 1993 by Vrije Universiteit, The Netherlands
|
||||
* Copyright 1993 by David Wexelblat <dwex@XFree86.org>
|
||||
* Copyright 1994, 1996 by Holger Veit <Holger.Veit@gmd.de>
|
||||
* Copyright 1994, 1995 by The XFree86 Project, Inc
|
||||
* Copyright 1997 by Takis Psarogiannakopoulos <takis@dpmms.cam.ac.uk>
|
||||
* Copyright 1994-1998 by The XFree86 Project, Inc
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
|
|
@ -31,7 +32,46 @@
|
|||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
/* $Xorg: xf86_OSlib.h,v 1.3 2000/08/17 19:51:20 cpqbld Exp $ */
|
||||
|
||||
/*
|
||||
* The ARM32 code here carries the following copyright:
|
||||
*
|
||||
* Copyright 1997
|
||||
* Digital Equipment Corporation. All rights reserved.
|
||||
* This software is furnished under license and may be used and copied only in
|
||||
* accordance with the following terms and conditions. Subject to these
|
||||
* conditions, you may download, copy, install, use, modify and distribute
|
||||
* this software in source and/or binary form. No title or ownership is
|
||||
* transferred hereby.
|
||||
*
|
||||
* 1) Any source code used, modified or distributed must reproduce and retain
|
||||
* this copyright notice and list of conditions as they appear in the
|
||||
* source file.
|
||||
*
|
||||
* 2) No right is granted to use any trade name, trademark, or logo of Digital
|
||||
* Equipment Corporation. Neither the "Digital Equipment Corporation"
|
||||
* name nor any trademark or logo of Digital Equipment Corporation may be
|
||||
* used to endorse or promote products derived from this software without
|
||||
* the prior written permission of Digital Equipment Corporation.
|
||||
*
|
||||
* 3) This software is provided "AS-IS" and any express or implied warranties,
|
||||
* including but not limited to, any implied warranties of merchantability,
|
||||
* fitness for a particular purpose, or non-infringement are disclaimed.
|
||||
* In no event shall DIGITAL be liable for any damages whatsoever, and in
|
||||
* particular, DIGITAL shall not be liable for special, indirect,
|
||||
* consequential, or incidental damages or damages for lost profits, loss
|
||||
* of revenue or loss of use, whether such damages arise in contract,
|
||||
* negligence, tort, under statute, in equity, at law or otherwise, even
|
||||
* if advised of the possibility of such damage.
|
||||
*
|
||||
*/
|
||||
|
||||
/* $XConsortium: xf86_OSlib.h /main/22 1996/10/27 11:06:31 kaleb $ */
|
||||
|
||||
/*
|
||||
* This is private, and should not be included by any drivers. Drivers
|
||||
* may include xf86_OSproc.h to get prototypes for public interfaces.
|
||||
*/
|
||||
|
||||
#ifndef _XF86_OSLIB_H
|
||||
#define _XF86_OSLIB_H
|
||||
|
|
@ -39,21 +79,43 @@
|
|||
#include <X11/Xos.h>
|
||||
#include <X11/Xfuncproto.h>
|
||||
|
||||
#include "compiler.h"
|
||||
|
||||
#if defined(MACH386) || defined(__OSF__)
|
||||
# undef NULL
|
||||
#endif /* MACH386 || __OSF__ */
|
||||
/*
|
||||
* Define some things from the "ANSI" C wrappers that are needed in the
|
||||
* the core server.
|
||||
*/
|
||||
#ifndef HAVE_WRAPPER_DECLS
|
||||
#define HAVE_WRAPPER_DECLS
|
||||
#undef usleep
|
||||
#define usleep(a) xf86usleep(a)
|
||||
extern void xf86usleep(unsigned long);
|
||||
extern int xf86getpagesize(void);
|
||||
extern int xf86GetErrno(void);
|
||||
typedef unsigned long xf86size_t;
|
||||
typedef signed long xf86ssize_t;
|
||||
#ifdef NEED_SNPRINTF
|
||||
extern int snprintf(char *str, size_t size, const char *format, ...);
|
||||
extern int vsnprintf(char *str, size_t size, const char *format, va_list ap);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/**************************************************************************/
|
||||
/* SYSV386 (SVR3, SVR4) */
|
||||
/* SYSV386 (SVR3, SVR4) - But not Solaris8 */
|
||||
/**************************************************************************/
|
||||
#if defined(SYSV) || defined(SVR4)
|
||||
#if (defined(SYSV) || defined(SVR4)) && \
|
||||
!defined(DGUX) && \
|
||||
!defined(__SOL8__) && \
|
||||
(!defined(sun) || defined(i386))
|
||||
# ifdef SCO325
|
||||
# define _SVID3
|
||||
# ifndef _SVID3
|
||||
# define _SVID3
|
||||
# endif
|
||||
# ifndef _NO_STATIC
|
||||
# define _NO_STATIC
|
||||
# endif
|
||||
# endif
|
||||
# include <sys/ioctl.h>
|
||||
# include <signal.h>
|
||||
|
|
@ -64,9 +126,20 @@
|
|||
# include <sys/param.h>
|
||||
# endif
|
||||
|
||||
# ifdef ISC
|
||||
# define TIOCMSET (TIOC|26) /* set all modem bits */
|
||||
# define TIOCMBIS (TIOC|27) /* bis modem bits */
|
||||
# define TIOCMBIC (TIOC|28) /* bic modem bits */
|
||||
# define TIOCMGET (TIOC|29) /* get all modem bits */
|
||||
# endif
|
||||
|
||||
# include <errno.h>
|
||||
|
||||
# if defined(_NEED_SYSI86)
|
||||
# if defined(PowerMAX_OS)
|
||||
# define HAS_USL_VTS
|
||||
# include <sys/immu.h>
|
||||
# include <sys/sysmacros.h>
|
||||
# elif defined(_NEED_SYSI86)
|
||||
# include <sys/immu.h>
|
||||
# if !(defined (sun) && defined (i386) && defined (SVR4))
|
||||
# include <sys/region.h>
|
||||
|
|
@ -77,22 +150,30 @@
|
|||
# if defined(SVR4) && !defined(sun)
|
||||
# include <sys/seg.h>
|
||||
# endif /* SVR4 && !sun */
|
||||
# include <sys/v86.h>
|
||||
# if defined(sun) && defined (i386) && defined (SVR4) /* Solaris? */
|
||||
# if !defined(V86SC_IOPL) /* Solaris 7? */
|
||||
# include <sys/v86.h> /* Nope */
|
||||
# endif /* V86SC_IOPL */
|
||||
# else
|
||||
# include <sys/v86.h> /* Not solaris */
|
||||
# endif /* sun && i386 && SVR4 */
|
||||
# if defined(sun) && defined (i386) && defined (SVR4)
|
||||
# include <sys/psw.h>
|
||||
# endif
|
||||
# endif /* _NEED_SYSI86 */
|
||||
|
||||
#if defined(HAS_SVR3_MMAPDRV)
|
||||
# include <sys/sysmacros.h>
|
||||
# if !defined(_NEED_SYSI86)
|
||||
# include <sys/immu.h>
|
||||
# include <sys/region.h>
|
||||
# if defined(HAS_SVR3_MMAPDRV)
|
||||
# include <sys/sysmacros.h>
|
||||
# if !defined(_NEED_SYSI86)
|
||||
# include <sys/immu.h>
|
||||
# include <sys/region.h>
|
||||
# endif
|
||||
# include <sys/mmap.h> /* MMAP driver header */
|
||||
# endif
|
||||
# include <sys/mmap.h> /* MMAP driver header */
|
||||
#endif
|
||||
|
||||
# define HAS_USL_VTS
|
||||
# if !defined(sun) || !defined(sparc)
|
||||
# define HAS_USL_VTS
|
||||
# endif
|
||||
# if !defined(sun)
|
||||
# include <sys/emap.h>
|
||||
# endif
|
||||
|
|
@ -104,7 +185,7 @@
|
|||
# define LED_CAP 0x01
|
||||
# define LED_NUM 0x02
|
||||
# define LED_SCR 0x04
|
||||
# else /* SCO */
|
||||
# elif defined(HAS_USL_VTS)
|
||||
# include <sys/at_ansi.h>
|
||||
# include <sys/kd.h>
|
||||
# include <sys/vt.h>
|
||||
|
|
@ -123,6 +204,8 @@
|
|||
# include <sys/mman.h>
|
||||
# if !(defined(sun) && defined (i386) && defined (SVR4))
|
||||
# define DEV_MEM "/dev/pmem"
|
||||
# elif defined(PowerMAX_OS)
|
||||
# define DEV_MEM "/dev/iomem"
|
||||
# endif
|
||||
# ifdef SCO325
|
||||
# undef DEV_MEM
|
||||
|
|
@ -143,33 +226,115 @@
|
|||
# endif
|
||||
|
||||
# if defined(ATT) && !defined(i386)
|
||||
# define i386 /* note defined in ANSI C mode */
|
||||
# define i386 /* not defined in ANSI C mode */
|
||||
# endif /* ATT && !i386 */
|
||||
|
||||
# if (defined(ATT) || defined(SVR4)) && !(defined(sun) && defined (i386) && defined (SVR4)) && !defined(SCO325)
|
||||
# define XQUEUE
|
||||
# if (defined(ATT) || defined(SVR4)) && !defined(sun) && !defined(SCO325)
|
||||
# ifndef XQUEUE
|
||||
# define XQUEUE
|
||||
# endif
|
||||
# include <sys/xque.h>
|
||||
# endif /* ATT || SVR4 */
|
||||
|
||||
/* Hack on SVR3 and SVR4 to avoid linking in Xenix or BSD support */
|
||||
#if defined (sun) && defined (i386) && defined (SVR4)
|
||||
extern int xf86_solx86usleep(unsigned long);
|
||||
# define usleep(usec) xf86_solx86usleep(usec)
|
||||
#else
|
||||
# define usleep(usec) syscall(3112, (usec) / 1000 + 1)
|
||||
#endif /* sun && i386 && SVR4 */
|
||||
|
||||
# ifdef SYSV
|
||||
# if !defined(ISC) || defined(ISC202) || defined(ISC22)
|
||||
# define NEED_STRERROR
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#ifndef NULL
|
||||
# define NULL 0
|
||||
#endif
|
||||
#endif /* (SYSV || SVR4) && !DGUX */
|
||||
|
||||
#endif /* SYSV || SVR4 */
|
||||
/**********
|
||||
* Good ol' Solaris8, and its lack of VT support
|
||||
***********/
|
||||
|
||||
#if defined(__SOL8__) || (defined(sun) && !defined(i386))
|
||||
# include <sys/mman.h>
|
||||
# include <errno.h>
|
||||
# ifdef i386
|
||||
# include <sys/sysi86.h>
|
||||
# endif
|
||||
# include <sys/psw.h>
|
||||
|
||||
# include <termio.h>
|
||||
# include <sys/fbio.h>
|
||||
# include <sys/kbd.h>
|
||||
# include <sys/kbio.h>
|
||||
|
||||
# define LED_CAP LED_CAPS_LOCK
|
||||
# define LED_NUM LED_NUM_LOCK
|
||||
# define LED_SCR LED_SCROLL_LOCK
|
||||
|
||||
# include <signal.h>
|
||||
|
||||
#endif /* __SOL8__ */
|
||||
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
/* DG/ux R4.20MU03 Intel AViion Machines */
|
||||
/**************************************************************************/
|
||||
#if defined(DGUX) && defined(SVR4)
|
||||
#include <sys/ioctl.h>
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
#include <termios.h> /* Use termios for BSD Flavor ttys */
|
||||
#include <sys/termios.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <errno.h>
|
||||
#include <sys/sysi86.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/map.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#include <sys/mman.h> /* Memory handling */
|
||||
#include <sys/kd.h> /* definitios for KDENABIO KDDISABIO needed for IOPL s */
|
||||
#include <sys/kbd.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <sys/stream.h>
|
||||
#include <sys/ptms.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/stropts.h>
|
||||
#include <sys/sockio.h>
|
||||
|
||||
|
||||
#define POSIX_TTY
|
||||
|
||||
#undef HAS_USL_VTS
|
||||
#undef USE_VT_SYSREQ
|
||||
#undef VT_ACKACQ
|
||||
|
||||
#define LED_CAP KBD_LED_CAPS_LOCK
|
||||
#define LED_NUM KBD_LED_NUM_LOCK
|
||||
#define LED_SCR KBD_LED_SCROLL_LOCK
|
||||
|
||||
#define KDGKBTYPE KBD_GET_LANGUAGE
|
||||
|
||||
|
||||
/* General keyboard types */
|
||||
# define KB_84 2
|
||||
# define KB_101 1 /* Because ioctl(dgkeybdFd,KBD_GET_LANGUAGE,&type) gives 1=US keyboard */
|
||||
# define KB_OTHER 3
|
||||
|
||||
#define KDSETLED KBD_SET_LED
|
||||
#define KDGETLED KBD_GET_STATE
|
||||
#undef KDMKTONE
|
||||
#define KDMKTONE KBD_TONE_HIGH
|
||||
|
||||
|
||||
#undef DEV_MEM
|
||||
#define DEV_MEM "/dev/mem"
|
||||
#define CLEARDTR_SUPPORT
|
||||
|
||||
#undef VT_SYSREQ_DEFAULT
|
||||
#define VT_SYSREQ_DEFAULT FALSE /* Make sure that we dont define any VTs since DG/ux has none */
|
||||
|
||||
#endif /* DGUX && SVR4 */
|
||||
|
||||
/**************************************************************************/
|
||||
/* Linux */
|
||||
|
|
@ -178,9 +343,11 @@ extern int xf86_solx86usleep(unsigned long);
|
|||
# include <sys/ioctl.h>
|
||||
# include <signal.h>
|
||||
# include <termio.h>
|
||||
# ifdef __sparc__
|
||||
# include <sys/param.h>
|
||||
# endif
|
||||
|
||||
# include <errno.h>
|
||||
extern int errno;
|
||||
|
||||
# include <sys/stat.h>
|
||||
|
||||
|
|
@ -228,6 +395,14 @@ extern int errno;
|
|||
|
||||
# include <termios.h>
|
||||
# define POSIX_TTY
|
||||
# define CLEARDTR_SUPPORT
|
||||
|
||||
/* LynxOS 2.5.1 has these */
|
||||
# ifdef LED_NUMLOCK
|
||||
# define LED_CAP LED_CAPSLOCK
|
||||
# define LED_NUM LED_NUMLOCK
|
||||
# define LED_SCR LED_SCROLLOCK
|
||||
# endif
|
||||
|
||||
#endif /* Lynx */
|
||||
|
||||
|
|
@ -241,9 +416,6 @@ extern int errno;
|
|||
|
||||
#ifdef CSRG_BASED
|
||||
# include <sys/ioctl.h>
|
||||
# if defined(__OpenBSD__) && defined(_status)
|
||||
# undef _status
|
||||
# endif
|
||||
# include <signal.h>
|
||||
|
||||
# include <termios.h>
|
||||
|
|
@ -251,7 +423,6 @@ extern int errno;
|
|||
# define POSIX_TTY
|
||||
|
||||
# include <errno.h>
|
||||
extern int errno;
|
||||
|
||||
# if !defined(LINKKIT)
|
||||
/* Don't need this stuff for the Link Kit */
|
||||
|
|
@ -269,30 +440,38 @@ extern int errno;
|
|||
# undef CONSOLE_X_BELL
|
||||
# endif
|
||||
# endif
|
||||
# ifdef CODRV_SUPPORT
|
||||
# define COMPAT_CO011
|
||||
# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
# include <machine/ioctl_pc.h>
|
||||
# else
|
||||
# include <sys/ioctl_pc.h>
|
||||
# endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
|
||||
# endif /* CODRV_SUPPORT */
|
||||
# ifdef SYSCONS_SUPPORT
|
||||
# define COMPAT_SYSCONS
|
||||
# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
# if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
# include <machine/console.h>
|
||||
# else
|
||||
# include <sys/console.h>
|
||||
# endif /* __FreeBSD__ || __NetBSD__ || defined(__OpenBSD__) */
|
||||
# if defined(__FreeBSD__)
|
||||
# include <osreldate.h>
|
||||
# if __FreeBSD_version >= 410000
|
||||
# include <sys/consio.h>
|
||||
# include <sys/kbio.h>
|
||||
# else
|
||||
# include <machine/console.h>
|
||||
# endif /* FreeBSD 4.1 RELEASE or lator */
|
||||
# else
|
||||
# include <sys/console.h>
|
||||
# endif
|
||||
# endif
|
||||
# endif /* SYSCONS_SUPPORT */
|
||||
# if defined(PCVT_SUPPORT)
|
||||
# if !defined(SYSCONS_SUPPORT)
|
||||
/* no syscons, so include pcvt specific header file */
|
||||
# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
# if defined(__FreeBSD__)
|
||||
# include <machine/pcvt_ioctl.h>
|
||||
# else
|
||||
# include <sys/pcvt_ioctl.h>
|
||||
# endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
|
||||
# if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
# if !defined(WSCONS_SUPPORT)
|
||||
# include <machine/pcvt_ioctl.h>
|
||||
# endif /* WSCONS_SUPPORT */
|
||||
# else
|
||||
# include <sys/pcvt_ioctl.h>
|
||||
# endif /* __NetBSD__ */
|
||||
# endif /* __FreeBSD__ || __OpenBSD__ */
|
||||
# else /* pcvt and syscons: hard-code the ID magic */
|
||||
# define VGAPCVTID _IOWR('V',113, struct pcvtid)
|
||||
struct pcvtid {
|
||||
|
|
@ -301,9 +480,18 @@ extern int errno;
|
|||
};
|
||||
# endif /* PCVT_SUPPORT && SYSCONS_SUPPORT */
|
||||
# endif /* PCVT_SUPPORT */
|
||||
# ifdef WSCONS_SUPPORT
|
||||
# include <dev/wscons/wsconsio.h>
|
||||
# include <dev/wscons/wsdisplay_usl_io.h>
|
||||
# endif /* WSCONS_SUPPORT */
|
||||
# if defined(__FreeBSD__)
|
||||
# undef MOUSE_GETINFO
|
||||
# include <machine/mouse.h>
|
||||
# include <osreldate.h>
|
||||
# if __FreeBSD_version >= 500013
|
||||
# include <sys/mouse.h>
|
||||
# else
|
||||
# undef MOUSE_GETINFO
|
||||
# include <machine/mouse.h>
|
||||
# endif
|
||||
# endif
|
||||
/* Include these definitions in case ioctl_pc.h didn't get included */
|
||||
# ifndef CONSOLE_X_MODE_ON
|
||||
|
|
@ -315,6 +503,25 @@ extern int errno;
|
|||
# ifndef CONSOLE_X_BELL
|
||||
# define CONSOLE_X_BELL _IOW('t',123,int[2])
|
||||
# endif
|
||||
# ifndef CONSOLE_X_TV_ON
|
||||
# define CONSOLE_X_TV_ON _IOW('t',155,int)
|
||||
# define XMODE_RGB 0
|
||||
# define XMODE_NTSC 1
|
||||
# define XMODE_PAL 2
|
||||
# define XMODE_SECAM 3
|
||||
# endif
|
||||
# ifndef CONSOLE_X_TV_OFF
|
||||
# define CONSOLE_X_TV_OFF _IO('t',156)
|
||||
# endif
|
||||
#ifndef CONSOLE_GET_LINEAR_INFO
|
||||
# define CONSOLE_GET_LINEAR_INFO _IOR('t',157,struct map_info)
|
||||
#endif
|
||||
#ifndef CONSOLE_GET_IO_INFO
|
||||
# define CONSOLE_GET_IO_INFO _IOR('t',158,struct map_info)
|
||||
#endif
|
||||
#ifndef CONSOLE_GET_MEM_INFO
|
||||
# define CONSOLE_GET_MEM_INFO _IOR('t',159,struct map_info)
|
||||
#endif
|
||||
# endif /* __bsdi__ */
|
||||
# endif /* !LINKKIT */
|
||||
|
||||
|
|
@ -329,111 +536,23 @@ extern int errno;
|
|||
# endif
|
||||
# endif /* __bsdi__ */
|
||||
|
||||
#ifdef USE_I386_IOPL
|
||||
#include <machine/sysarch.h>
|
||||
#endif
|
||||
|
||||
# define CLEARDTR_SUPPORT
|
||||
|
||||
# if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)
|
||||
# if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
|
||||
# define USE_VT_SYSREQ
|
||||
# endif
|
||||
|
||||
# ifndef NULL
|
||||
# define NULL 0
|
||||
# endif
|
||||
|
||||
#endif /* CSRG_BASED */
|
||||
|
||||
/**************************************************************************/
|
||||
/* Mach and OSF/1 */
|
||||
/**************************************************************************/
|
||||
#if defined(MACH386) || defined(__OSF__)
|
||||
# include <sys/ioctl.h>
|
||||
|
||||
# include <signal.h>
|
||||
|
||||
# include <errno.h>
|
||||
extern int errno;
|
||||
|
||||
# if defined(__OSF__)
|
||||
# include <sys/param.h>
|
||||
# include <machine/kd.h>
|
||||
# else /* __OSF__ */
|
||||
# if !defined(__STDC__)
|
||||
# define __STDC__ 1
|
||||
# include <i386at/kd.h>
|
||||
# include <i386at/kd_queue.h>
|
||||
# undef __STDC__
|
||||
# else /* !__STDC__ */
|
||||
# include <i386at/kd.h>
|
||||
# include <i386at/kd_queue.h>
|
||||
# endif /* !__STDC__ */
|
||||
# include <sys/file.h>
|
||||
# define SEEK_SET L_SET
|
||||
# endif /* __OSF__ */
|
||||
|
||||
# ifdef MACH386
|
||||
# define NEED_STRERROR
|
||||
# endif
|
||||
|
||||
# include <sys/mman.h>
|
||||
# include <sys/stat.h>
|
||||
# define MOUSE_PROTOCOL_IN_KERNEL
|
||||
|
||||
#endif /* MACH386 || __OSF__ */
|
||||
|
||||
/**************************************************************************/
|
||||
/* Minix */
|
||||
/**************************************************************************/
|
||||
#if defined(MINIX)
|
||||
# include <sys/ioctl.h>
|
||||
# include <signal.h>
|
||||
|
||||
# include <termios.h>
|
||||
# define termio termios
|
||||
# define POSIX_TTY
|
||||
|
||||
# include <errno.h>
|
||||
|
||||
# include <assert.h>
|
||||
# include <limits.h>
|
||||
# include <sys/memio.h>
|
||||
# include <sys/kbdio.h>
|
||||
|
||||
# include <sys/stat.h>
|
||||
|
||||
#endif /* MINIX */
|
||||
|
||||
/**************************************************************************/
|
||||
/* Amoeba */
|
||||
/**************************************************************************/
|
||||
#if defined(AMOEBA)
|
||||
# define port am_port_t
|
||||
# include <amoeba.h>
|
||||
# include <cmdreg.h>
|
||||
# include <stderr.h>
|
||||
# include <ampolicy.h>
|
||||
# include <proc.h>
|
||||
# include <signal.h>
|
||||
# include <server/iop/iop.h>
|
||||
# include <errno.h>
|
||||
# undef port
|
||||
|
||||
# undef _POSIX_SOURCE /* to get the BSD-compatible symbols */
|
||||
# include <sys/stat.h>
|
||||
|
||||
/* keyboard types */
|
||||
# define KB_84 1
|
||||
# define KB_101 2
|
||||
# define KB_OTHER 3
|
||||
|
||||
extern capability iopcap;
|
||||
# define MOUSE_PROTOCOL_IN_KERNEL
|
||||
|
||||
#endif /* AMOEBA */
|
||||
|
||||
/**************************************************************************/
|
||||
/* OS/2 */
|
||||
/**************************************************************************/
|
||||
/* currently OS/2 with EMX/GCC compiler only */
|
||||
#if defined(__EMX__)
|
||||
/* currently OS/2 with a modified EMX/GCC compiler only */
|
||||
#if defined(__UNIXOS2__)
|
||||
# include <signal.h>
|
||||
# include <errno.h>
|
||||
# include <sys/stat.h>
|
||||
|
|
@ -467,10 +586,100 @@ extern char* __XOS2RedirRoot(char*);
|
|||
|
||||
#endif
|
||||
|
||||
/**************************************************************************/
|
||||
/* QNX4 */
|
||||
/**************************************************************************/
|
||||
/* This is the QNX code for Watcom 10.6 and QNX 4.x */
|
||||
#if defined(QNX4)
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <termios.h>
|
||||
#include <ioctl.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
/* Warning: by default, the fd_set size is 32 in QNX! */
|
||||
#define FD_SETSIZE 256
|
||||
#include <sys/select.h>
|
||||
|
||||
/* keyboard types */
|
||||
# define KB_84 1
|
||||
# define KB_101 2
|
||||
# define KB_OTHER 3
|
||||
|
||||
/* LEDs */
|
||||
# define LED_CAP 0x04
|
||||
# define LED_NUM 0x02
|
||||
# define LED_SCR 0x01
|
||||
|
||||
# define POSIX_TTY
|
||||
# define OSMOUSE_ONLY
|
||||
# define MOUSE_PROTOCOL_IN_KERNEL
|
||||
|
||||
#define TIOCM_DTR 0x0001 /* data terminal ready */
|
||||
#define TIOCM_RTS 0x0002 /* request to send */
|
||||
#define TIOCM_CTS 0x1000 /* clear to send */
|
||||
#define TIOCM_DSR 0x2000 /* data set ready */
|
||||
#define TIOCM_RI 0x4000 /* ring */
|
||||
#define TIOCM_RNG TIOCM_RI
|
||||
#define TIOCM_CD 0x8000 /* carrier detect */
|
||||
#define TIOCM_CAR TIOCM_CD
|
||||
#define TIOCM_LE 0x0100 /* line enable */
|
||||
#define TIOCM_ST 0x0200 /* secondary transmit */
|
||||
#define TIOCM_SR 0x0400 /* secondary receive */
|
||||
|
||||
#endif
|
||||
|
||||
/**************************************************************************/
|
||||
/* QNX/Neutrino */
|
||||
/**************************************************************************/
|
||||
/* This is the Neutrino code for for NTO2.0 and GCC */
|
||||
#if defined(__QNXNTO__)
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include <termios.h>
|
||||
#include <ioctl.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
/* Warning: by default, the fd_set size is 32 in NTO! */
|
||||
#define FD_SETSIZE 256
|
||||
#include <sys/select.h>
|
||||
|
||||
/* keyboard types */
|
||||
# define KB_84 1
|
||||
# define KB_101 2
|
||||
# define KB_OTHER 3
|
||||
|
||||
# define POSIX_TTY
|
||||
|
||||
#endif
|
||||
|
||||
/**************************************************************************/
|
||||
/* GNU/Hurd */
|
||||
/**************************************************************************/
|
||||
#if defined(__GNU__)
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <termios.h>
|
||||
#include <sys/stat.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define POSIX_TTY
|
||||
#define USE_OSMOUSE
|
||||
|
||||
#endif /* __GNU__ */
|
||||
|
||||
/**************************************************************************/
|
||||
/* Generic */
|
||||
/**************************************************************************/
|
||||
|
||||
#include <sys/wait.h> /* May need to adjust this for other OSs */
|
||||
|
||||
/*
|
||||
* Hack originally for ISC 2.2 POSIX headers, but may apply elsewhere,
|
||||
* and it's safe, so just do it.
|
||||
|
|
@ -518,6 +727,10 @@ double RInt(
|
|||
);
|
||||
#endif
|
||||
|
||||
#ifndef DEV_MEM
|
||||
#define DEV_MEM "/dev/mem"
|
||||
#endif
|
||||
|
||||
#ifndef VT_SYSREQ_DEFAULT
|
||||
#define VT_SYSREQ_DEFAULT FALSE
|
||||
#endif
|
||||
|
|
@ -528,6 +741,13 @@ double RInt(
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#define SYSCALL(call) while(((call) == -1) && (errno == EINTR))
|
||||
|
||||
#define XF86_OS_PRIVS
|
||||
#include "xf86_OSproc.h"
|
||||
|
||||
#ifndef NO_COMPILER_H
|
||||
#include "compiler.h"
|
||||
#endif
|
||||
|
||||
#endif /* _XF86_OSLIB_H */
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
/* $Xorg: xf86_OSproc.h,v 1.3 2000/08/17 19:51:20 cpqbld Exp $ */
|
||||
/*
|
||||
* Copyright 1990, 1991 by Thomas Roell, Dinkelscherben, Germany
|
||||
* Copyright 1992 by David Dawes <dawes@XFree86.org>
|
||||
|
|
@ -9,7 +8,7 @@
|
|||
* Copyright 1993 by Vrije Universiteit, The Netherlands
|
||||
* Copyright 1993 by David Wexelblat <dwex@XFree86.org>
|
||||
* Copyright 1994, 1996 by Holger Veit <Holger.Veit@gmd.de>
|
||||
* Copyright 1994, 1995 by The XFree86 Project, Inc
|
||||
* Copyright 1994-1999 by The XFree86 Project, Inc
|
||||
*
|
||||
* Permission to use, copy, modify, distribute, and sell this software and its
|
||||
* documentation for any purpose is hereby granted without fee, provided that
|
||||
|
|
@ -32,36 +31,99 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h,v 3.0.2.1 1998/02/07 14:27:24 dawes Exp $ */
|
||||
/*
|
||||
* The ARM32 code here carries the following copyright:
|
||||
*
|
||||
* Copyright 1997
|
||||
* Digital Equipment Corporation. All rights reserved.
|
||||
* This software is furnished under license and may be used and copied only in
|
||||
* accordance with the following terms and conditions. Subject to these
|
||||
* conditions, you may download, copy, install, use, modify and distribute
|
||||
* this software in source and/or binary form. No title or ownership is
|
||||
* transferred hereby.
|
||||
*
|
||||
* 1) Any source code used, modified or distributed must reproduce and retain
|
||||
* this copyright notice and list of conditions as they appear in the
|
||||
* source file.
|
||||
*
|
||||
* 2) No right is granted to use any trade name, trademark, or logo of Digital
|
||||
* Equipment Corporation. Neither the "Digital Equipment Corporation"
|
||||
* name nor any trademark or logo of Digital Equipment Corporation may be
|
||||
* used to endorse or promote products derived from this software without
|
||||
* the prior written permission of Digital Equipment Corporation.
|
||||
*
|
||||
* 3) This software is provided "AS-IS" and any express or implied warranties,
|
||||
* including but not limited to, any implied warranties of merchantability,
|
||||
* fitness for a particular purpose, or non-infringement are disclaimed.
|
||||
* In no event shall DIGITAL be liable for any damages whatsoever, and in
|
||||
* particular, DIGITAL shall not be liable for special, indirect,
|
||||
* consequential, or incidental damages or damages for lost profits, loss
|
||||
* of revenue or loss of use, whether such damages arise in contract,
|
||||
* negligence, tort, under statute, in equity, at law or otherwise, even
|
||||
* if advised of the possibility of such damage.
|
||||
*
|
||||
*/
|
||||
|
||||
/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86_OSproc.h,v 3.55 2002/01/25 21:56:17 tsi Exp $ */
|
||||
|
||||
#ifndef _XF86_OSPROC_H
|
||||
#define _XF86_OSPROC_H
|
||||
|
||||
#ifdef XF86_OS_PRIVS
|
||||
#include "xf86Pci.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The actual prototypes have been pulled into this seperate file so
|
||||
* that they can can be used without pulling in all of the OS specific
|
||||
* stuff like sys/stat.h, etc. This casues problem for loadable modules.
|
||||
*/
|
||||
|
||||
/* The Region arg to xf86[Un]Map* */
|
||||
#define NUM_REGIONS 4
|
||||
#define VGA_REGION 0
|
||||
#define LINEAR_REGION 1
|
||||
#define EXTENDED_REGION 2
|
||||
#define MMIO_REGION 3
|
||||
/*
|
||||
* Flags for xf86MapVidMem(). Multiple flags can be or'd together. The
|
||||
* flags may be used as hints. For example it would be permissible to
|
||||
* enable write combining for memory marked only for framebuffer use.
|
||||
*/
|
||||
|
||||
#define VIDMEM_FRAMEBUFFER 0x01 /* memory for framebuffer use */
|
||||
#define VIDMEM_MMIO 0x02 /* memory for I/O use */
|
||||
#define VIDMEM_MMIO_32BIT 0x04 /* memory accesses >= 32bit */
|
||||
#define VIDMEM_READSIDEEFFECT 0x08 /* reads can have side-effects */
|
||||
#define VIDMEM_SPARSE 0x10 /* sparse mapping required
|
||||
* assumed when VIDMEM_MMIO is
|
||||
* set. May be used with
|
||||
* VIDMEM_FRAMEBUFFER) */
|
||||
#define VIDMEM_READONLY 0x20 /* read-only mapping
|
||||
* used when reading BIOS images
|
||||
* through xf86MapVidMem() */
|
||||
|
||||
/*
|
||||
* OS-independent modem state flags for xf86SetSerialModemState() and
|
||||
* xf86GetSerialModemState().
|
||||
*/
|
||||
#define XF86_M_LE 0x001 /* line enable */
|
||||
#define XF86_M_DTR 0x002 /* data terminal ready */
|
||||
#define XF86_M_RTS 0x004 /* request to send */
|
||||
#define XF86_M_ST 0x008 /* secondary transmit */
|
||||
#define XF86_M_SR 0x010 /* secondary receive */
|
||||
#define XF86_M_CTS 0x020 /* clear to send */
|
||||
#define XF86_M_CAR 0x040 /* carrier detect */
|
||||
#define XF86_M_RNG 0x080 /* ring */
|
||||
#define XF86_M_DSR 0x100 /* data set ready */
|
||||
|
||||
#ifdef XF86_OS_PRIVS
|
||||
extern void xf86WrapperInit(void);
|
||||
#endif
|
||||
|
||||
#ifndef NO_OSLIB_PROTOTYPES
|
||||
/*
|
||||
* This is to prevent re-entrancy to FatalError() when aborting.
|
||||
* Anything that can be called as a result of AbortDDX() should use this
|
||||
* instead of FatalError(). (xf86Exiting gets set to TRUE the first time
|
||||
* AbortDDX() is called.)
|
||||
* instead of FatalError().
|
||||
*/
|
||||
|
||||
extern Bool xf86Exiting;
|
||||
|
||||
#define xf86FatalError(a, b) \
|
||||
if (xf86Exiting) { \
|
||||
if (dispatchException & DE_TERMINATE) { \
|
||||
ErrorF(a, b); \
|
||||
return; \
|
||||
} else FatalError(a, b)
|
||||
|
|
@ -71,322 +133,134 @@ extern Bool xf86Exiting;
|
|||
/***************************************************************************/
|
||||
|
||||
#include <X11/Xfuncproto.h>
|
||||
#include "opaque.h"
|
||||
|
||||
_XFUNCPROTOBEGIN
|
||||
|
||||
/* xf86_Util.c */
|
||||
extern int StrCaseCmp(
|
||||
#if NeedFunctionPrototypes
|
||||
const char *,
|
||||
const char *
|
||||
/* public functions */
|
||||
extern Bool xf86LinearVidMem(void);
|
||||
extern Bool xf86CheckMTRR(int);
|
||||
extern pointer xf86MapVidMem(int, int, unsigned long, unsigned long);
|
||||
extern void xf86UnMapVidMem(int, pointer, unsigned long);
|
||||
extern void xf86MapReadSideEffects(int, int, pointer, unsigned long);
|
||||
extern int xf86ReadBIOS(unsigned long, unsigned long, unsigned char *, int);
|
||||
extern void xf86EnableIO(void);
|
||||
extern void xf86DisableIO(void);
|
||||
extern Bool xf86DisableInterrupts(void);
|
||||
extern void xf86EnableInterrupts(void);
|
||||
extern void xf86SetTVOut(int);
|
||||
extern void xf86SetRGBOut(void);
|
||||
extern void xf86SoundKbdBell(int, int, int);
|
||||
#if defined(QNX4)
|
||||
#pragma aux xf86BusToMem modify [eax ebx ecx edx esi edi];
|
||||
#pragma aux xf86MemToBus modify [eax ebx ecx edx esi edi];
|
||||
#endif
|
||||
);
|
||||
extern void xf86BusToMem(unsigned char *, unsigned char *, int);
|
||||
extern void xf86MemToBus(unsigned char *, unsigned char *, int);
|
||||
extern void xf86IODelay(void);
|
||||
extern void xf86UDelay(long usec);
|
||||
extern void xf86SlowBcopy(unsigned char *, unsigned char *, int);
|
||||
extern int xf86OpenSerial(pointer options);
|
||||
extern int xf86SetSerial(int fd, pointer options);
|
||||
extern int xf86SetSerialSpeed(int fd, int speed);
|
||||
extern int xf86ReadSerial(int fd, void *buf, int count);
|
||||
extern int xf86WriteSerial(int fd, const void *buf, int count);
|
||||
extern int xf86CloseSerial(int fd);
|
||||
extern int xf86FlushInput(int fd);
|
||||
extern int xf86WaitForInput(int fd, int timeout);
|
||||
extern int xf86SerialSendBreak(int fd, int duration);
|
||||
extern int xf86SetSerialModemState(int fd, int state);
|
||||
extern int xf86GetSerialModemState(int fd);
|
||||
extern int xf86SerialModemSetBits(int fd, int bits);
|
||||
extern int xf86SerialModemClearBits(int fd, int bits);
|
||||
extern int xf86LoadKernelModule(const char *pathname);
|
||||
|
||||
/* OS-support layer */
|
||||
extern void xf86OpenConsole(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern void xf86CloseConsole(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern Bool xf86VTSwitchPending(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern Bool xf86VTSwitchAway(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern Bool xf86VTSwitchTo(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern Bool xf86LinearVidMem(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern pointer xf86MapVidMem(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int,
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern void xf86UnMapVidMem(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int,
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
#if defined(__alpha__)
|
||||
/* entry points for SPARSE memory access routines */
|
||||
extern pointer xf86MapVidMemSparse(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int,
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern void xf86UnMapVidMemSparse(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int,
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern int xf86ReadSparse8(
|
||||
#if NeedFunctionPrototypes
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern int xf86ReadSparse16(
|
||||
#if NeedFunctionPrototypes
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern int xf86ReadSparse32(
|
||||
#if NeedFunctionPrototypes
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern void xf86WriteSparse8(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern void xf86WriteSparse16(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
extern void xf86WriteSparse32(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
pointer,
|
||||
unsigned long
|
||||
#endif
|
||||
);
|
||||
#endif /* __alpha__ */
|
||||
extern void xf86MapDisplay(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern void xf86UnMapDisplay(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern int xf86ReadBIOS(
|
||||
#if NeedFunctionPrototypes
|
||||
unsigned long,
|
||||
unsigned long,
|
||||
unsigned char *,
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern void xf86ClearIOPortList(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern void xf86AddIOPorts(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int,
|
||||
unsigned *
|
||||
#endif
|
||||
);
|
||||
void xf86EnableIOPorts(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
void xf86DisableIOPorts(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
void xf86DisableIOPrivs(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern Bool xf86DisableInterrupts(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern void xf86EnableInterrupts(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern int xf86ProcessArgument(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
char **,
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern void xf86UseMsg(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern void xf86SoundKbdBell(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
int,
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern void xf86SetKbdLeds(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern int xf86GetKbdLeds(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern void xf86SetKbdRepeat(
|
||||
#if NeedFunctionPrototypes
|
||||
char
|
||||
#endif
|
||||
);
|
||||
extern void xf86KbdInit(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern int xf86KbdOn(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern int xf86KbdOff(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern void xf86KbdEvents(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
extern void xf86SetMouseSpeed(
|
||||
#if NeedFunctionPrototypes
|
||||
MouseDevPtr,
|
||||
int,
|
||||
int,
|
||||
unsigned
|
||||
#endif
|
||||
);
|
||||
extern void xf86MouseInit(
|
||||
#if NeedFunctionPrototypes
|
||||
MouseDevPtr
|
||||
#endif
|
||||
);
|
||||
extern int xf86MouseOn(
|
||||
#if NeedFunctionPrototypes
|
||||
MouseDevPtr
|
||||
#endif
|
||||
);
|
||||
extern int xf86MouseOff(
|
||||
#if NeedFunctionPrototypes
|
||||
MouseDevPtr,
|
||||
Bool
|
||||
#endif
|
||||
);
|
||||
extern void xf86MouseEvents(
|
||||
#if NeedFunctionPrototypes
|
||||
MouseDevPtr
|
||||
#endif
|
||||
);
|
||||
extern int xf86FlushInput(
|
||||
#if NeedFunctionPrototypes
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern int xf86XqueKbdProc(
|
||||
#if NeedFunctionPrototypes
|
||||
DeviceIntPtr,
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern int xf86XqueMseProc(
|
||||
#if NeedFunctionPrototypes
|
||||
DeviceIntPtr,
|
||||
int
|
||||
#endif
|
||||
);
|
||||
extern void xf86XqueEvents(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
#endif
|
||||
);
|
||||
/* AGP GART interface */
|
||||
|
||||
typedef struct _AgpInfo {
|
||||
CARD32 bridgeId;
|
||||
CARD32 agpMode;
|
||||
unsigned long base;
|
||||
unsigned long size;
|
||||
unsigned long totalPages;
|
||||
unsigned long systemPages;
|
||||
unsigned long usedPages;
|
||||
} AgpInfo, *AgpInfoPtr;
|
||||
|
||||
/* These are privates */
|
||||
extern void xf86InitPortLists(
|
||||
#if NeedFunctionPrototypes
|
||||
unsigned **,
|
||||
int *,
|
||||
Bool *,
|
||||
Bool *,
|
||||
int
|
||||
extern Bool xf86AgpGARTSupported(void);
|
||||
extern AgpInfoPtr xf86GetAGPInfo(int screenNum);
|
||||
extern Bool xf86AcquireGART(int screenNum);
|
||||
extern Bool xf86ReleaseGART(int screenNum);
|
||||
extern int xf86AllocateGARTMemory(int screenNum, unsigned long size, int type,
|
||||
unsigned long *physical);
|
||||
extern Bool xf86BindGARTMemory(int screenNum, int key, unsigned long offset);
|
||||
extern Bool xf86UnbindGARTMemory(int screenNum, int key);
|
||||
extern Bool xf86EnableAGP(int screenNum, CARD32 mode);
|
||||
extern Bool xf86GARTCloseScreen(int screenNum);
|
||||
|
||||
/* These routines are in shared/sigio.c and are not loaded as part of the
|
||||
module. These routines are small, and the code if very POSIX-signal (or
|
||||
OS-signal) specific, so it seemed better to provide more complex
|
||||
wrappers than to wrap each individual function called. */
|
||||
extern int xf86InstallSIGIOHandler(int fd, void (*f)(int, void *), void *);
|
||||
extern int xf86RemoveSIGIOHandler(int fd);
|
||||
extern int xf86BlockSIGIO (void);
|
||||
extern void xf86UnblockSIGIO (int);
|
||||
#ifdef XFree86Server
|
||||
extern void xf86AssertBlockedSIGIO (char *);
|
||||
#endif
|
||||
);
|
||||
extern Bool xf86CheckPorts(
|
||||
#if NeedFunctionPrototypes
|
||||
unsigned,
|
||||
unsigned **,
|
||||
int *,
|
||||
Bool *,
|
||||
int
|
||||
extern Bool xf86SIGIOSupported (void);
|
||||
|
||||
#ifdef XF86_OS_PRIVS
|
||||
typedef void (*PMClose)(void);
|
||||
extern void xf86OpenConsole(void);
|
||||
extern void xf86CloseConsole(void);
|
||||
extern Bool xf86VTSwitchPending(void);
|
||||
extern Bool xf86VTSwitchAway(void);
|
||||
extern Bool xf86VTSwitchTo(void);
|
||||
extern void xf86VTRequest(int sig);
|
||||
extern int xf86ProcessArgument(int, char **, int);
|
||||
extern void xf86UseMsg(void);
|
||||
extern void xf86SetKbdLeds(int);
|
||||
extern int xf86GetKbdLeds(void);
|
||||
extern void xf86SetKbdRepeat(char);
|
||||
extern void xf86KbdInit(void);
|
||||
extern int xf86KbdOn(void);
|
||||
extern int xf86KbdOff(void);
|
||||
extern void xf86KbdEvents(void);
|
||||
#ifdef XQUEUE
|
||||
extern int xf86XqueKbdProc(DeviceIntPtr, int);
|
||||
extern void xf86XqueEvents(void);
|
||||
#endif
|
||||
);
|
||||
extern int xf86OsMouseProc(
|
||||
#if NeedFunctionPrototypes
|
||||
DeviceIntPtr,
|
||||
int
|
||||
#ifdef WSCONS_SUPPORT
|
||||
extern void xf86WSKbdEvents(void);
|
||||
#endif
|
||||
);
|
||||
extern void xf86OsMouseEvents(
|
||||
#if NeedFunctionPrototypes
|
||||
void
|
||||
extern PMClose xf86OSPMOpen(void);
|
||||
|
||||
#ifdef NEED_OS_RAC_PROTOS
|
||||
/* RAC-related privs */
|
||||
/* internal to os-support layer */
|
||||
resPtr xf86StdBusAccWindowsFromOS(void);
|
||||
resPtr xf86StdPciAccWindowsFromOS(void);
|
||||
resPtr xf86StdIsaAccWindowsFromOS(void);
|
||||
resPtr xf86StdAccResFromOS(resPtr ret);
|
||||
|
||||
/* available to the common layer */
|
||||
resPtr xf86BusAccWindowsFromOS(void);
|
||||
resPtr xf86PciBusAccWindowsFromOS(void);
|
||||
#ifdef INCLUDE_UNUSED
|
||||
resPtr xf86IsaBusAccWindowsFromOS(void);
|
||||
#endif
|
||||
);
|
||||
extern void xf86OsMouseOption(
|
||||
#if NeedFunctionPrototypes
|
||||
int,
|
||||
pointer /* gets cast to LexPtr later, saves include file hassles */
|
||||
#endif
|
||||
);
|
||||
resPtr xf86AccResFromOS(resPtr ret);
|
||||
#endif /* NEED_OS_RAC_PROTOS */
|
||||
|
||||
extern Bool xf86GetPciSizeFromOS(PCITAG tag, int indx, int* bits);
|
||||
|
||||
extern void xf86MakeNewMapping(int, int, unsigned long, unsigned long, pointer);
|
||||
extern void xf86InitVidMem(void);
|
||||
|
||||
#endif /* XF86_OS_PRIVS */
|
||||
|
||||
|
||||
_XFUNCPROTOEND
|
||||
#endif /* NO_OSLIB_PROTOTYPES */
|
||||
|
|
|
|||
Loading…
Reference in a new issue