diff options
Diffstat (limited to 'nx-X11/programs/Xserver/hw/xfree86/os-support/os2/os2_serial.c')
-rw-r--r-- | nx-X11/programs/Xserver/hw/xfree86/os-support/os2/os2_serial.c | 517 |
1 files changed, 0 insertions, 517 deletions
diff --git a/nx-X11/programs/Xserver/hw/xfree86/os-support/os2/os2_serial.c b/nx-X11/programs/Xserver/hw/xfree86/os-support/os2/os2_serial.c deleted file mode 100644 index 6587b1bda..000000000 --- a/nx-X11/programs/Xserver/hw/xfree86/os-support/os2/os2_serial.c +++ /dev/null @@ -1,517 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/os2/os2_serial.c,v 1.3 2000/04/05 18:13:53 dawes Exp $ */ -/* - * (c) Copyright 1999 by Holger Veit - * <Holger.Veit@gmd.de> - * - * 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 - * HOLGER VEIT 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 Holger Veit shall not be - * used in advertising or otherwise to promote the sale, use or other dealings - * in this Software without prior written authorization from Holger Veit. - * - */ -/* $XConsortium$ */ - -#define I_NEED_OS2_H -#ifdef HAVE_XORG_CONFIG_H -#include <xorg-config.h> -#endif - -#include <X11/X.h> -#include <X11/Xmd.h> -#include "input.h" -#include "scrnintstr.h" - -#include "compiler.h" - -#define INCL_DOSDEVIOCTL -#include "xf86.h" -#include "xf86Priv.h" -#include "xf86_OSlib.h" - -static int _set_baudrate(HFILE fd,int baud) -{ - USHORT br = baud; - ULONG plen; - return DosDevIOCtl(fd,IOCTL_ASYNC,ASYNC_SETBAUDRATE, - (PULONG)&br,sizeof(br),&plen,NULL,0,NULL); -} - -#pragma pack(1) -typedef struct _glinectl { - UCHAR databits; - UCHAR parity; - UCHAR stopbits; - UCHAR sendbrk; -} GLINECTL; -typedef struct _slinectl { - UCHAR databits; - UCHAR parity; - UCHAR stopbits; -} SLINECTL; - -#pragma pack() - -static int _get_linectrl(HFILE fd,GLINECTL* linectrl) -{ - ULONG dlen; - return DosDevIOCtl(fd,IOCTL_ASYNC,ASYNC_GETLINECTRL, - NULL,0,NULL,linectrl,sizeof(GLINECTL),&dlen); -} - -static int _set_linectl(HFILE fd,GLINECTL* linectl) -{ - ULONG plen; - return DosDevIOCtl(fd,IOCTL_ASYNC,ASYNC_SETLINECTRL, - (PULONG)&linectl,sizeof(SLINECTL),&plen,NULL,0,NULL); -} - -static int _get_dcb(HFILE fd,DCBINFO* dcb) { - - ULONG dlen; - return DosDevIOCtl(fd,IOCTL_ASYNC,ASYNC_GETDCBINFO, - NULL,0,NULL,(PULONG)dcb,sizeof(DCBINFO),&dlen); -} - -static int _set_dcb(HFILE fd,DCBINFO* dcb) -{ - ULONG plen; - return DosDevIOCtl(fd,IOCTL_ASYNC, ASYNC_SETDCBINFO, - (PULONG)dcb,sizeof(DCBINFO),&plen,NULL,0,NULL); -} - -#pragma pack(1) -typedef struct comsize { - USHORT nqueued; - USHORT qsize; -} COMSIZE; -#pragma pack() - -static int _get_nread(HFILE fd,ULONG* nread) -{ - ULONG dlen; - COMSIZE sz; - APIRET rc = DosDevIOCtl(fd,IOCTL_ASYNC,ASYNC_GETINQUECOUNT, - NULL, 0, NULL, sz,sizeof(COMSIZE),&dlen); - *nread = sz.nqueued; - return rc ? -1 : 0; -} - -int xf86OpenSerial (pointer options) -{ - APIRET rc; - HFILE fd, i; - ULONG action; - GLINECTL linectl; - - char* dev = xf86FindOptionValue (options, "Device"); - xf86MarkOptionUsedByName (options, "Device"); - if (!dev) { - xf86Msg (X_ERROR, "xf86OpenSerial: No Device specified.\n"); - return -1; - } - - rc = DosOpen(dev, &fd, &action, 0, FILE_NORMAL, FILE_OPEN, - OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYNONE, NULL); - if (rc) { - xf86Msg (X_ERROR, - "xf86OpenSerial: Cannot open device %s, rc=%d.\n", - dev, rc); - return -1; - } - - /* check whether it is an async device */ - if (_get_linectrl(fd,&linectl)) { - xf86Msg (X_WARNING, - "xf86OpenSerial: Specified device %s is not a tty\n", - dev); - DosClose(fd); - return -1; - } - - /* set up default port parameters */ - _set_baudrate(fd, 9600); - - linectl.databits = 8; - linectl.parity = 0; - linectl.stopbits = 0; - _set_linectl(fd, &linectl); - - if (xf86SetSerial (fd, options) == -1) { - DosClose(fd); - return -1; - } - - return fd; -} - -int xf86SetSerial (int fd, pointer options) -{ - APIRET rc; - USHORT baud; - ULONG plen,dlen; - char *s; - - GLINECTL linectl; - DCBINFO dcb; - - if ((s = xf86FindOptionValue (options, "BaudRate"))) { - xf86MarkOptionUsedByName (options, "BaudRate"); - if ((rc = _set_baudrate(fd, atoi(s)))) { - xf86Msg (X_ERROR,"Set Baudrate: %s, rc=%d\n", s, rc); - return -1; - } - } - - /* get line parameters */ - if (DosDevIOCtl((HFILE)fd,IOCTL_ASYNC, ASYNC_GETLINECTRL, - NULL,0,NULL, - (PULONG)&linectl,sizeof(GLINECTL),&dlen)) return -1; - - if ((s = xf86FindOptionValue (options, "StopBits"))) { - xf86MarkOptionUsedByName (options, "StopBits"); - switch (atoi (s)) { - case 1: linectl.stopbits = 0; - break; - case 2: linectl.stopbits = 2; - break; - default: xf86Msg (X_ERROR, - "Invalid Option StopBits value: %s\n", s); - return -1; - } - } - - if ((s = xf86FindOptionValue (options, "DataBits"))) { - int db; - xf86MarkOptionUsedByName (options, "DataBits"); - switch (db = atoi (s)) { - case 5: case 6: case 7: case 8: - linectl.databits = db; - break; - default: xf86Msg (X_ERROR, - "Invalid Option DataBits value: %s\n", s); - return -1; - } - } - - if ((s = xf86FindOptionValue (options, "Parity"))) { - xf86MarkOptionUsedByName (options, "Parity"); - if (xf86NameCmp (s, "Odd") == 0) - linectl.parity = 1; /* odd */ - else if (xf86NameCmp (s, "Even") == 0) - linectl.parity = 2; /* even */ - else if (xf86NameCmp (s, "None") == 0) - linectl.parity = 0; /* none */ - else { - xf86Msg (X_ERROR, - "Invalid Option Parity value: %s\n", s); - return -1; - } - } - - /* set line parameters */ - if (_set_linectl(fd,&linectl)) return -1; - - if (xf86FindOptionValue (options, "Vmin")) - xf86Msg (X_ERROR, "Vmin unsupported on this OS\n"); - - if (xf86FindOptionValue (options, "Vtime")) - xf86Msg (X_ERROR, "Vtime unsupported on this OS\n"); - - /* get device parameters */ - if (_get_dcb(fd,&dcb)) return -1; - - if ((s = xf86FindOptionValue (options, "FlowControl"))) { - xf86MarkOptionUsedByName (options, "FlowControl"); - if (xf86NameCmp (s, "XonXoff") == 0) - dcb.fbFlowReplace |= 0x03; - else if (xf86NameCmp (s, "None") == 0) - dcb.fbFlowReplace &= ~0x03; - else { - xf86Msg (X_ERROR, - "Invalid Option FlowControl value: %s\n", s); - return -1; - } - } - - if ((s = xf86FindOptionValue (options, "ClearDTR"))) { - dcb.fbCtlHndShake &= ~0x03; /* DTR=0 */ - xf86MarkOptionUsedByName (options, "ClearDTR"); - } - - if ((s = xf86FindOptionValue (options, "ClearRTS"))) { - dcb.fbFlowReplace &= ~0xc0; /* RTS=0 */ - xf86MarkOptionUsedByName (options, "ClearRTS"); - } - - /* set device parameters */ - return _set_dcb(fd,&dcb) ? -1 : 0; -} - -int xf86ReadSerial (int fd, void *buf, int count) -{ - ULONG nread,nq; - APIRET rc; - - /* emulate non-blocking read */ - if (_get_nread((HFILE)fd,&nq)) return -1; - if (nq==0) return 0; - if (nq < count) count = nq; - - rc = DosRead((HFILE)fd,(PVOID)buf,(ULONG)count,&nread); - return rc ? -1 : (int)nread; -} - -int xf86WriteSerial (int fd, const void *buf, int count) -{ - ULONG nwrite; - APIRET rc = DosWrite((HFILE)fd,(PVOID)buf,(ULONG)count,&nwrite); - return rc ? -1 : (int)nwrite; -} - -int xf86CloseSerial (int fd) -{ - APIRET rc = DosClose((HFILE)fd); - return rc ? -1 : 0; -} - -int xf86WaitForInput (int fd, int timeout) -{ - APIRET rc; - ULONG dlen,nq; - - do { - if (_get_nread((HFILE)fd,&nq)) return -1; - if (nq) return 1; - - DosSleep(10); - timeout -= 10000; /* 10000 usec */ - } while (timeout > 0); - - return 0; -} - -int xf86SerialSendBreak (int fd, int duration) -{ - USHORT data; - ULONG dlen; - APIRET rc; - rc = DosDevIOCtl((HFILE)fd,IOCTL_ASYNC,ASYNC_SETBREAKON, - NULL, 0, NULL, - &data, sizeof(data), &dlen); - if (rc) - return -1; - DosSleep(500); - - rc = DosDevIOCtl((HFILE)fd,IOCTL_ASYNC,ASYNC_SETBREAKOFF, - NULL, 0, NULL, - &data, sizeof(data), &dlen); - return rc ? -1 : 0; -} - -int xf86FlushInput(int fd) -{ - APIRET rc; - UCHAR buf; - ULONG nread,nq; - - if (_get_nread((HFILE)fd,&nq)) return -1; - - /* eat all chars in queue */ - while (nq) { - rc = DosRead((HFILE)fd,&buf,1,&nread); - if (rc) return -1; - nq--; - } - return 0; -} - -static struct states { - int xf; - int os; -} modemStates[] = { - { XF86_M_DTR, 0x01 }, - { XF86_M_RTS, 0x02 }, - { XF86_M_CTS, 0x10 }, - { XF86_M_DSR, 0x20 }, - { XF86_M_RNG, 0x40 }, - { XF86_M_CAR, 0x80 }, -}; - -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; - -static -int _get_modem_state(int fd,ULONG* state) -{ - ULONG state1,len; - - if (DosDevIOCtl((HFILE)fd,IOCTL_ASYNC,ASYNC_GETMODEMOUTPUT, - NULL,0,NULL, state, sizeof(BYTE), &len) != 0 || - DosDevIOCtl((HFILE)fd,IOCTL_ASYNC,ASYNC_GETMODEMINPUT, - NULL,0,NULL, &state1, sizeof(BYTE), &len) != 0) - return -1; - *state |= state1; - *state &= 0xff; - return 0; -} - -static -int _set_modem_state(int fd,ULONG state,ULONG mask) -{ - int len; - struct { - BYTE onmask; - BYTE offmask; - } modemctrl; - modemctrl.onmask = state; - modemctrl.offmask = mask; - - if (DosDevIOCtl((HFILE)fd,IOCTL_ASYNC,ASYNC_SETMODEMCTRL, - NULL,0,NULL, (PULONG)&modemctrl, sizeof(modemctrl), &len) != 0) - return -1; - else - return 0; -} - -int -xf86SetSerialModemState(int fd, int state) -{ - ULONG s; - - if (fd < 0) - return -1; - - /* Don't try to set parameters for non-tty devices. */ - if (!isatty(fd)) - return 0; - - if (!osStateMask) - osStateMask = getOsStateMask(); - - state = xf2osState(state); - - if (_get_modem_state(fd,&s) != 0) - return -1; - - s &= ~osStateMask; - s |= state; - - return _set_modem_state(fd,s,0x03); -} - -int -xf86GetSerialModemState(int fd) -{ - ULONG s; - - if (fd < 0) - return -1; - - /* Don't try to set parameters for non-tty devices. */ - if (!isatty(fd)) - return 0; - - if (_get_modem_state(fd,&s) != 0) - return -1; - - return os2xfState(s); -} - -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; - - s = xf2osState(bits); - return _set_modem_state(fd,s,0x03); -} - -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; - - s = xf2osState(bits); - return _set_modem_state(fd, 0, ~s & 0xff); -} - -int -xf86SetSerialSpeed (int fd, int speed) -{ - if (fd < 0) - return -1; - - /* Don't try to set parameters for non-tty devices. */ - if (!isatty(fd)) - return 0; - - return _set_baudrate(fd,speed); -} |