diff -ubr xc/programs/Xserver/hw/xfree86/common/xf86Config.c xc.2nd/programs/Xserver/hw/xfree86/common/xf86Config.c --- xc/programs/Xserver/hw/xfree86/common/xf86Config.c Wed May 16 17:08:35 2001 +++ xc.2nd/programs/Xserver/hw/xfree86/common/xf86Config.c Mon Aug 20 09:25:03 2001 @@ -985,6 +985,7 @@ s = xf86SetStrOption(inputp->commonOptions, "Protocol", "standard"); if (xf86NameCmp(s, "standard") == 0) { + xf86ConfigError("This Xserver only accepts \"usbev\" as a valid keyboard protocol" ); xf86Info.kbdProc = xf86KbdProc; #if defined(AMOEBA) || defined(__CYGWIN__) xf86Info.kbdEvents = NULL; @@ -1016,6 +1017,16 @@ } xfree(s); #endif + } else if (xf86NameCmp(s, "usbev") == 0) { + xf86Info.kbdProc = xf86KbdProc; + xf86Info.kbdEvents = xf86KbdEvents; + s = xf86SetStrOption(inputp->commonOptions, "Device", NULL); + xf86Msg(X_CONFIG, "Keyboard: Protocol: usbev\n"); + xf86Info.kbdFd = open(s, O_RDWR | O_NONBLOCK | O_EXCL); + if (xf86Info.kbdFd == -1) { + xf86ConfigError("cannot open \"%s\"", s); + return FALSE; + } } else { xf86ConfigError("\"%s\" is not a valid keyboard protocol name", s); xfree(s); diff -ubr xc/programs/Xserver/hw/xfree86/common/xf86Init.c xc.2nd/programs/Xserver/hw/xfree86/common/xf86Init.c --- xc/programs/Xserver/hw/xfree86/common/xf86Init.c Thu May 24 16:43:39 2001 +++ xc.2nd/programs/Xserver/hw/xfree86/common/xf86Init.c Mon Aug 20 09:14:00 2001 @@ -1212,6 +1212,11 @@ xf86ProbeOnly = TRUE; return 1; } + if (!strcmp(argv[i],"-delay")) + { + sleep(10); + return 1; + } if (!strcmp(argv[i],"-flipPixels")) { xf86FlipPixels = TRUE; diff -ubr xc/programs/Xserver/hw/xfree86/common/xf86Privstr.h xc.2nd/programs/Xserver/hw/xfree86/common/xf86Privstr.h --- xc/programs/Xserver/hw/xfree86/common/xf86Privstr.h Fri May 18 13:03:11 2001 +++ xc.2nd/programs/Xserver/hw/xfree86/common/xf86Privstr.h Mon Aug 20 10:01:51 2001 @@ -46,6 +46,7 @@ int bell_pitch; int bell_duration; Bool autoRepeat; + int ledsave; unsigned long leds; unsigned long xleds; char * vtinit; diff -ubr xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c xc.2nd/programs/Xserver/hw/xfree86/common/xf86pciBus.c --- xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c Wed May 16 04:56:06 2001 +++ xc.2nd/programs/Xserver/hw/xfree86/common/xf86pciBus.c Mon Aug 20 10:10:26 2001 @@ -534,9 +534,11 @@ #ifdef DEBUG ErrorF("pciIoAccessDisable: 0x%05lx\n", *(PCITAG *)arg); #endif +#if 0 ((pciArg*)arg)->ctrl &= ~SETBITS; ((pciArg*)arg)->func(((pciArg*)arg)->tag, PCI_CMD_STAT_REG, ((pciArg*)arg)->ctrl); +#endif } #undef SETBITS diff -ubr xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c xc.2nd/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c --- xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c Tue Nov 14 19:59:24 2000 +++ xc.2nd/programs/Xserver/hw/xfree86/os-support/linux/lnx_init.c Mon Aug 20 09:41:42 2001 @@ -48,16 +48,12 @@ 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 }; @@ -87,23 +83,16 @@ FatalError( "xf86OpenConsole: Cannot open /dev/tty0 (%s)\n", strerror(errno)); - if ((ioctl(fd, VT_OPENQRY, &xf86Info.vtno) < 0) || - (xf86Info.vtno == -1)) { - FatalError("xf86OpenConsole: Cannot find a free VT\n"); + + if (ioctl(fd, VT_GETSTATE, &vts) == 0) + { + xf86Info.vtno = vts.v_active; + } else { + FatalError("xf86OpenConsole: Cannot find the current VT\n"); } close(fd); } -#ifdef USE_DEV_FB - fb_dev_name=getenv("FRAMEBUFFER"); - if (!fb_dev_name) - fb_dev_name="/dev/fb0current"; - if ((fbfd = open(fb_dev_name, O_RDONLY)) < 0) - FatalError("xf86OpenConsole: Cannot open %s (%s)\n", - fb_dev_name, strerror(errno)); - if (ioctl(fbfd, FBIOGET_VSCREENINFO, &var)) - FatalError("xf86OpenConsole: Unable to get screen info\n"); -#endif xf86Msg(from, "using VT number %d\n\n", xf86Info.vtno); if (!KeepTty) { @@ -125,7 +114,9 @@ } /* change ownership of the vt */ - chown(vtname, getuid(), getgid()); + /* humm, not a good idea if we don't really use this vt, chowning it would + probably mess with the first XFree instance. Right? i don't know! */ + /* chown(vtname, getuid(), getgid()); */ /* * the current VT device we're running on is not "console", we want @@ -170,37 +161,19 @@ { xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n"); } - SYSCALL(result = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT)); - if (result < 0) - { - FatalError("xf86OpenConsole: VT_GETMODE failed\n"); - } - signal(SIGUSR1, xf86VTRequest); + close(xf86Info.consoleFd); - VT.mode = VT_PROCESS; - VT.relsig = SIGUSR1; - VT.acqsig = SIGUSR1; - if (ioctl(xf86Info.consoleFd, VT_SETMODE, &VT) < 0) - { - FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed\n"); - } - if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) +/* SYSCALL(result = ioctl(xf86Info.consoleFd, VT_GETMODE, &VT)); + if (result < 0) { - FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed\n"); + FatalError("xf86OpenConsole: VT_GETMODE 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; - var.xoffset=0; - if (ioctl(fbfd, FBIOPUT_VSCREENINFO, &var)) - FatalError("Unable to set screen info\n"); - close(fbfd); -#endif } else { @@ -208,6 +181,7 @@ /* * now get the VT */ +/* SYSCALL(result = ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno)); if (result != 0) { @@ -219,6 +193,7 @@ { xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n"); } +*/ } return; } @@ -232,21 +207,17 @@ ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno); ioctl(xf86Info.consoleFd, VT_WAITACTIVE, 0); #endif - ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT); /* Back to text mode ... */ - if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1) - { - VT.mode = VT_AUTO; - ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* set dflt vt handling */ - } /* * Perform a switch back to the active VT when we were started */ +#if 0 if (activeVT >= 0) { ioctl(xf86Info.consoleFd, VT_ACTIVATE, activeVT); activeVT = -1; } close(xf86Info.consoleFd); /* make the vt-manager happy */ +#endif return; } diff -ubr xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c xc.2nd/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c --- xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c Mon Mar 5 17:18:24 2001 +++ xc.2nd/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c Mon Aug 20 10:02:30 2001 @@ -33,32 +33,56 @@ #include "xf86.h" #include "xf86Priv.h" #include "xf86_OSlib.h" +#include +#include void xf86SoundKbdBell(int loudness, int pitch, int duration) { - if (loudness && pitch) + /* i guess it should be safe to beep even on a diferent keyboard (?) */ + /* the beep will be on the system speaker anyway... */ +/* if (loudness && pitch) { ioctl(xf86Info.consoleFd, KDMKTONE, ((1193190 / pitch) & 0xffff) | (((unsigned long)duration * loudness / 50) << 16)); } +*/ } void xf86SetKbdLeds(int leds) { - ioctl(xf86Info.consoleFd, KDSETLED, leds); + struct s_output_event { + struct timeval time; + unsigned short type; + unsigned short code; + unsigned int value; + } output_event; + + output_event.type = EV_LED; + output_event.code = LED_NUML; + output_event.value = (leds&(LED_NUM)) ? 1 : 0; + write( xf86Info.kbdFd, (char *)&output_event, sizeof(output_event)); + + output_event.type = EV_LED; + output_event.code = LED_CAPSL; + output_event.value = (leds&(LED_CAP)) ? 1 : 0; + write( xf86Info.kbdFd, (char *)&output_event, sizeof(output_event)); + + output_event.type = EV_LED; + output_event.code = LED_SCROLLL; + output_event.value = (leds&(LED_SCR)) ? 1 : 0; + write( xf86Info.kbdFd, (char *)&output_event, sizeof(output_event)); + + xf86Info.ledsave = leds; } int xf86GetKbdLeds() { - int leds; - - ioctl(xf86Info.consoleFd, KDGETLED, &leds); - return(leds); + return(xf86Info.ledsave); } /* kbd rate stuff based on kbdrate.c from Rik Faith et.al. @@ -166,6 +190,8 @@ if (xf86Info.kbdDelay >= 0) delay = xf86Info.kbdDelay; +/* FIXME: just returning so we don't mess with any other keyboards... */ + return; if(KDKBDREP_ioctl_ok(rate, delay)) /* m68k? */ return; @@ -209,40 +235,18 @@ void xf86KbdInit() { - ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans); - tcgetattr (xf86Info.consoleFd, &kbdtty); +/* tcgetattr (xf86Info.consoleFd, &kbdtty); */ } 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; - 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); - return(xf86Info.consoleFd); + return(xf86Info.kbdFd); } int xf86KbdOff() { - ioctl(xf86Info.consoleFd, KDSKBMODE, kbdtrans); - tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty); - return(xf86Info.consoleFd); + return(xf86Info.kbdFd); } diff -ubr xc/programs/Xserver/hw/xfree86/os-support/shared/VTsw_usl.c xc.2nd/programs/Xserver/hw/xfree86/os-support/shared/VTsw_usl.c --- xc/programs/Xserver/hw/xfree86/os-support/shared/VTsw_usl.c Fri Dec 3 17:17:45 1999 +++ xc.2nd/programs/Xserver/hw/xfree86/os-support/shared/VTsw_usl.c Mon Aug 20 09:14:00 2001 @@ -41,21 +41,23 @@ void xf86VTRequest(int sig) { - signal(sig, (void(*)(int))xf86VTRequest); +/* signal(sig, (void(*)(int))xf86VTRequest); xf86Info.vtRequestsPending = TRUE; +*/ return; } Bool xf86VTSwitchPending() { - return(xf86Info.vtRequestsPending ? TRUE : FALSE); +/* return(xf86Info.vtRequestsPending ? TRUE : FALSE); */ +return FALSE; } Bool xf86VTSwitchAway() { - xf86Info.vtRequestsPending = FALSE; +/* xf86Info.vtRequestsPending = FALSE; if (ioctl(xf86Info.consoleFd, VT_RELDISP, 1) < 0) { return(FALSE); @@ -64,11 +66,14 @@ { return(TRUE); } +*/ +return FALSE; } Bool xf86VTSwitchTo() { +/* xf86Info.vtRequestsPending = FALSE; if (ioctl(xf86Info.consoleFd, VT_RELDISP, VT_ACKACQ) < 0) { @@ -78,4 +83,6 @@ { return(TRUE); } +*/ +return TRUE; } diff -ubr xc/programs/Xserver/hw/xfree86/os-support/shared/std_kbdEv.c xc.2nd/programs/Xserver/hw/xfree86/os-support/shared/std_kbdEv.c --- xc/programs/Xserver/hw/xfree86/os-support/shared/std_kbdEv.c Thu May 6 23:56:23 1999 +++ xc.2nd/programs/Xserver/hw/xfree86/os-support/shared/std_kbdEv.c Mon Aug 20 09:58:29 2001 @@ -25,22 +25,128 @@ */ /* $XConsortium: std_kbdEv.c /main/4 1996/03/11 10:47:33 kaleb $ */ +/* 2001/01/14 Miguel Freitas + * + * USB Keyboard to PC-AT Keyboard HACK + * + * Included routines from Linux Kernel to handle usb keyboard events. + * I don't know if there are any license issues here. Any code written + * by me in this file is under the terms of the GNU General Public + * License as described below. + * +*/ + +/* + * $Id: keybdev.c,v 1.3 2000/05/28 17:31:36 vojtech Exp $ + * + * Copyright (c) 1999-2000 Vojtech Pavlik + * + * Input driver to keyboard driver binding. + * + * Sponsored by SuSE + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic + */ + + #include "X.h" #include "xf86.h" #include "xf86Priv.h" #include "xf86_OSlib.h" +#include + +static unsigned short x86_keycodes[256] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 43, 85, 86, 87, 88,115,119,120,121,375,123, 90, + 284,285,309,298,312, 91,327,328,329,331,333,335,336,337,338,339, + 367,294,293,286,350, 92,334,512,116,377,109,111,373,347,348,349, + 360, 93, 94, 95, 98,376,100,101,357,316,354,304,289,102,351,355, + 103,104,105,275,281,272,306,106,274,107,288,364,358,363,362,361, + 291,108,381,290,287,292,279,305,280, 99,112,257,258,113,270,114, + 118,117,125,374,379,259,260,261,262,263,264,265,266,267,268,269, + 271,273,276,277,278,282,283,295,296,297,299,300,301,302,303,307, + 308,310,313,314,315,317,318,319,320,321,322,323,324,325,326,330, + 332,340,341,342,343,344,345,346,356,359,365,368,369,370,371,372 }; + +static void handle_scancode(unsigned char scancode, int down) +{ + char up_flag = down ? 0 : 0200; + + xf86PostKbdEvent(scancode | up_flag); +} + +static int emulate_raw(unsigned int keycode, int down) +{ + if (keycode > 255 || !x86_keycodes[keycode]) + return -1; + + if (keycode == KEY_PAUSE) { + handle_scancode(0xe1, 1); + handle_scancode(0x1d, down); + handle_scancode(0x45, down); + return 0; + } + + if (x86_keycodes[keycode] & 0x100) + handle_scancode(0xe0, 1); + + handle_scancode(x86_keycodes[keycode] & 0x7f, down); + + if (keycode == KEY_SYSRQ) { + handle_scancode(0xe0, 1); + handle_scancode(0x37, down); + } + + return 0; +} + + +static void keybdev_event(unsigned int type, unsigned int code, int down) +{ + if (type != EV_KEY) return; + + emulate_raw(code, down); +} + void xf86KbdEvents() { - unsigned char rBuf[64]; + struct s_input_event { + struct timeval time; + unsigned short type; + unsigned short code; + unsigned int value; + } input_event; + int nBytes, i; - if ((nBytes = read( xf86Info.consoleFd, (char *)rBuf, sizeof(rBuf))) + while ((nBytes = read( xf86Info.kbdFd, (char *)&input_event, sizeof(input_event))) > 0) { - for (i = 0; i < nBytes; i++) - xf86PostKbdEvent(rBuf[i]); + keybdev_event( input_event.type, input_event.code, input_event.value ); } }