xenocara/xserver/hw/kdrive/vxworks/vxkbd.c

264 lines
7.0 KiB
C

/*
* Copyright © 1999 Network Computing Devices, Inc. All rights reserved.
*
* Author: Keith Packard
*/
#ifdef HAVE_CONFIG_H
#include <kdrive-config.h>
#endif
#include "kdrive.h"
#include "kkeymap.h"
#include <X11/keysym.h>
#include <inputstr.h>
#define VXWORKS_WIDTH 2
KeySym VxWorksKeymap[] = {
/*7 f1 */ XK_F1, NoSymbol,
/*8 escape */ XK_Escape, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*13 tab */ XK_Tab, NoSymbol,
/*14 ` */ XK_grave, XK_asciitilde,
/*15 f2 */ XK_F2, NoSymbol,
NoSymbol, NoSymbol,
/*17 lctrl */ XK_Control_L, NoSymbol,
/*18 lshift */ XK_Shift_L, NoSymbol,
NoSymbol, NoSymbol,
/*20 lock */ XK_Caps_Lock, NoSymbol,
/*21 q */ XK_Q, NoSymbol,
/*22 1 */ XK_1, XK_exclam,
/*23 f3 */ XK_F3, NoSymbol,
NoSymbol, NoSymbol,
/*25 lalt */ XK_Meta_L, XK_Alt_L,
/*26 z */ XK_Z, NoSymbol,
/*27 s */ XK_S, NoSymbol,
/*28 a */ XK_A, NoSymbol,
/*29 w */ XK_W, NoSymbol,
/*30 2 */ XK_2, XK_at,
/*31 f4 */ XK_F4, NoSymbol,
NoSymbol, NoSymbol,
/*33 c */ XK_C, NoSymbol,
/*34 x */ XK_X, NoSymbol,
/*35 d */ XK_D, NoSymbol,
/*36 e */ XK_E, NoSymbol,
/*37 4 */ XK_4, XK_dollar,
/*38 3 */ XK_3, XK_numbersign,
/*39 f5 */ XK_F5, NoSymbol,
NoSymbol, NoSymbol,
/*41 space */ XK_space, NoSymbol,
/*42 v */ XK_V, NoSymbol,
/*43 f */ XK_F, NoSymbol,
/*44 t */ XK_T, NoSymbol,
/*45 r */ XK_R, NoSymbol,
/*46 5 */ XK_5, XK_percent,
/*47 f6 */ XK_F6, NoSymbol,
NoSymbol, NoSymbol,
/*49 n */ XK_N, NoSymbol,
/*50 b */ XK_B, NoSymbol,
/*51 h */ XK_H, NoSymbol,
/*52 g */ XK_G, NoSymbol,
/*53 y */ XK_Y, NoSymbol,
/*54 6 */ XK_6, XK_asciicircum,
/*55 f7 */ XK_F7, NoSymbol,
NoSymbol, NoSymbol,
/*57 ralt */ XK_Meta_R, XK_Alt_R,
/*58 m */ XK_M, NoSymbol,
/*59 j */ XK_J, NoSymbol,
/*60 u */ XK_U, NoSymbol,
/*61 7 */ XK_7, XK_ampersand,
/*62 8 */ XK_8, XK_asterisk,
/*63 f8 */ XK_F8, NoSymbol,
NoSymbol, NoSymbol,
/*65 , */ XK_comma, XK_less,
/*66 k */ XK_K, NoSymbol,
/*67 i */ XK_I, NoSymbol,
/*68 o */ XK_O, NoSymbol,
/*69 0 */ XK_0, XK_parenright,
/*70 9 */ XK_9, XK_parenleft,
/*71 f9 */ XK_F9, NoSymbol,
NoSymbol, NoSymbol,
/*73 . */ XK_period, XK_greater,
/*74 / */ XK_slash, XK_question,
/*75 l */ XK_L, NoSymbol,
/*76 ; */ XK_semicolon, XK_colon,
/*77 p */ XK_P, NoSymbol,
/*78 - */ XK_minus, XK_underscore,
/*79 f10 */ XK_F10, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*82 ' */ XK_apostrophe, XK_quotedbl,
NoSymbol, NoSymbol,
/*84 [ */ XK_bracketleft, XK_braceleft,
/*85 = */ XK_equal, XK_plus,
/*86 f11 */ XK_F11, NoSymbol,
/*87 sysrq */ XK_Sys_Req, XK_Print,
/*88 rctrl */ XK_Control_R, NoSymbol,
/*89 rshift */ XK_Shift_R, NoSymbol,
/*90 enter */ XK_Return, NoSymbol,
/*91 ] */ XK_bracketright, XK_braceright,
/*92 \ */ XK_backslash, XK_bar,
NoSymbol, NoSymbol,
/*94 f12 */ XK_F12, NoSymbol,
/*95 scrolllock*/ XK_Scroll_Lock, NoSymbol,
/*96 down */ XK_Down, NoSymbol,
/*97 left */ XK_Left, NoSymbol,
/*98 pause */ XK_Break, XK_Pause,
/*99 up */ XK_Up, NoSymbol,
/*100 delete */ XK_Delete, NoSymbol,
/*101 end */ XK_End, NoSymbol,
/*102 bs */ XK_BackSpace, NoSymbol,
/*103 insert */ XK_Insert, NoSymbol,
NoSymbol, NoSymbol,
/*105 np 1 */ XK_KP_End, XK_KP_1,
/*106 right */ XK_Right, NoSymbol,
/*107 np 4 */ XK_KP_Left, XK_KP_4,
/*108 np 7 */ XK_KP_Home, XK_KP_7,
/*109 pgdn */ XK_Page_Down, NoSymbol,
/*110 home */ XK_Home, NoSymbol,
/*111 pgup */ XK_Page_Up, NoSymbol,
/*112 np 0 */ XK_KP_Insert, XK_KP_0,
/*113 np . */ XK_KP_Delete, XK_KP_Decimal,
/*114 np 2 */ XK_KP_Down, XK_KP_2,
/*115 np 5 */ XK_KP_5, NoSymbol,
/*116 np 6 */ XK_KP_Right, XK_KP_6,
/*117 np 8 */ XK_KP_Up, XK_KP_8,
/*118 numlock */ XK_Num_Lock, NoSymbol,
/*119 np / */ XK_KP_Divide, NoSymbol,
NoSymbol, NoSymbol,
/*121 np enter */ XK_KP_Enter, NoSymbol,
/*122 np 3 */ XK_KP_Page_Down, XK_KP_3,
NoSymbol, NoSymbol,
/*124 np + */ XK_KP_Add, NoSymbol,
/*125 np 9 */ XK_KP_Page_Up, XK_KP_9,
/*126 np * */ XK_KP_Multiply, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*132 np - */ XK_KP_Subtract, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
NoSymbol, NoSymbol,
/*139 lwin */ XK_Super_L, NoSymbol,
/*140 rwin */ XK_Super_R, NoSymbol,
/*141 menu */ XK_Menu, NoSymbol,
};
void
VxWorksKeyboardLoad (void)
{
KeySym *k;
kdMinScanCode = 7;
kdKeymapWidth = VXWORKS_WIDTH;
kdMaxScanCode = 141;
memcpy (kdKeymap, VxWorksKeymap, sizeof (VxWorksKeymap));
}
static int kbdFd = -1;
#include <errno.h>
#include <event.h>
#include <kbd_ioctl.h>
extern KeyboardCtrl defaultKeyboardControl;
static void
VxWorksSetAutorepeat (unsigned char *repeats, Bool on)
{
int i;
unsigned char mask;
int scan_code;
int key_code;
unsigned char realkc;
if (on)
{
realkc = 1;
ioctl (kbdFd, KBD_ALL_REPEAT, &realkc);
for (scan_code = 7; scan_code <= 141; scan_code++)
{
key_code = scan_code + 1;
i = key_code >> 3;
mask = 1 << (key_code & 7);
if ((repeats[i] & mask) == 0)
{
realkc = scan_code;
ioctl (kbdFd, KBD_NO_REPEAT, &realkc);
}
}
}
else
{
realkc = 0;
ioctl (kbdFd, KBD_ALL_REPEAT, &realkc);
}
}
int
VxWorksKeyboardInit (void)
{
kbdFd = open ("/dev/kbd", O_RDONLY, 0);
if (kbdFd < 0)
ErrorF ("keyboard open failure %d\n", errno);
VxWorksSetAutorepeat (defaultKeyboardControl.autoRepeats, TRUE);
return -1;
}
void
VxWorksKeyboardFini (int fd)
{
if (kbdFd >= 0)
{
close (kbdFd);
kbdFd = -1;
}
}
void
VxWorksKeyboardRead (int fd)
{
}
void
VxWorksKeyboardLeds (int leds)
{
DeviceIntPtr pKeyboard = inputInfo.keyboard;
KeyboardCtrl *ctrl = &pKeyboard->kbdfeed->ctrl;
led_ioctl_info led_info;
int i;
VxWorksSetAutorepeat (ctrl->autoRepeats, ctrl->autoRepeat);
for (i = 0; i < 3; i++)
{
led_info.bit_n = 1 << i;
led_info.OFF_or_ON = (leds & (1 << i)) != 0;
led_info.reversed = 0;
ioctl (kbdFd, KBD_SET_LED, &led_info);
}
}
void
VxWorksKeyboardBell (int volume, int frequency, int duration)
{
}
KdKeyboardFuncs VxWorksKeyboardFuncs = {
VxWorksKeyboardLoad,
VxWorksKeyboardInit,
VxWorksKeyboardRead,
VxWorksKeyboardLeds,
VxWorksKeyboardBell,
VxWorksKeyboardFini,
3,
};