4 static unsigned char kbd_inj_buffer[128];
 
   5 static int kbd_inj_start = 0;
 
   6 static int kbd_inj_end = 0;
 
   9 static const char scancodes2[][8] = {
 
  10         ['a'] = "\x1e\xf0\x1e",
 
  11         ['b'] = "\x30\xf0\x30",
 
  12         ['c'] = "\x2e\xf0\x2e",
 
  13         ['d'] = "\x20\xf0\x20",
 
  14         ['e'] = "\x12\xf0\x12",
 
  15         ['f'] = "\x21\xf0\x21",
 
  16         ['g'] = "\x22\xf0\x22",
 
  17         ['h'] = "\x23\xf0\x23",
 
  18         ['i'] = "\x17\xf0\x17",
 
  19         ['j'] = "\x24\xf0\x24",
 
  20         ['k'] = "\x25\xf0\x25",
 
  21         ['l'] = "\x26\xf0\x26",
 
  22         ['m'] = "\x32\xf0\x32",
 
  23         ['n'] = "\x31\xf0\x31",
 
  24         ['o'] = "\x18\xf0\x18",
 
  25         ['p'] = "\x19\xf0\x19",
 
  26         ['q'] = "\x10\xf0\x10",
 
  27         ['r'] = "\x13\xf0\x13",
 
  28         ['s'] = "\x1f\xf0\x1f",
 
  29         ['t'] = "\x14\xf0\x14",
 
  30         ['u'] = "\x16\xf0\x16",
 
  31         ['v'] = "\x2f\xf0\x2f",
 
  32         ['w'] = "\x11\xf0\x11",
 
  33         ['x'] = "\x2d\xf0\x2d",
 
  34         ['y'] = "\x15\xf0\x15",
 
  35         ['z'] = "\x2c\xf0\x2c",
 
  36         ['A'] = "\x12\x1e\xf0\x1e\xf0\x12",
 
  37         ['B'] = "\x12\x30\xf0\x30\xf0\x12",
 
  38         ['C'] = "\x12\x2e\xf0\x2e\xf0\x12",
 
  39         ['D'] = "\x12\x20\xf0\x20\xf0\x12",
 
  40         ['E'] = "\x12\x12\xf0\x12\xf0\x12",
 
  41         ['F'] = "\x12\x21\xf0\x21\xf0\x12",
 
  42         ['G'] = "\x12\x22\xf0\x22\xf0\x12",
 
  43         ['H'] = "\x12\x23\xf0\x23\xf0\x12",
 
  44         ['I'] = "\x12\x17\xf0\x17\xf0\x12",
 
  45         ['J'] = "\x12\x24\xf0\x24\xf0\x12",
 
  46         ['K'] = "\x12\x25\xf0\x25\xf0\x12",
 
  47         ['L'] = "\x12\x26\xf0\x26\xf0\x12",
 
  48         ['M'] = "\x12\x32\xf0\x32\xf0\x12",
 
  49         ['N'] = "\x12\x31\xf0\x31\xf0\x12",
 
  50         ['O'] = "\x12\x18\xf0\x18\xf0\x12",
 
  51         ['P'] = "\x12\x19\xf0\x19\xf0\x12",
 
  52         ['Q'] = "\x12\x10\xf0\x10\xf0\x12",
 
  53         ['R'] = "\x12\x13\xf0\x13\xf0\x12",
 
  54         ['S'] = "\x12\x1f\xf0\x1f\xf0\x12",
 
  55         ['T'] = "\x12\x14\xf0\x14\xf0\x12",
 
  56         ['U'] = "\x12\x16\xf0\x16\xf0\x12",
 
  57         ['V'] = "\x12\x2f\xf0\x2f\xf0\x12",
 
  58         ['W'] = "\x12\x11\xf0\x11\xf0\x12",
 
  59         ['X'] = "\x12\x2d\xf0\x2d\xf0\x12",
 
  60         ['Y'] = "\x12\x15\xf0\x15\xf0\x12",
 
  61         ['Z'] = "\x12\x2c\xf0\x2c\xf0\x12",
 
  62         ['`'] = "\x0e\xf0\x0e",
 
  63         ['~'] = "\x12\x0e\xf0\x0e\xf0\x12",
 
  64         ['1'] = "\x16\xf0\x16",
 
  65         ['!'] = "\x12\x16\xf0\x16\xf0\x12",
 
  66         ['2'] = "\x1e\xf0\x1e",
 
  67         ['@'] = "\x12\x1e\xf0\x1e\xf0\x12",
 
  68         ['3'] = "\x26\xf0\x26",
 
  69         ['#'] = "\x12\x26\xf0\x26\xf0\x12",
 
  70         ['4'] = "\x25\xf0\x25",
 
  71         ['$'] = "\x12\x25\xf0\x25\xf0\x12",
 
  72         ['5'] = "\x2e\xf0\x2e",
 
  73         ['%'] = "\x12\x2e\xf0\x2e\xf0\x12",
 
  74         ['6'] = "\x36\xf0\x36",
 
  75         ['^'] = "\x12\x36\xf0\x36\xf0\x12",
 
  76         ['7'] = "\x3d\xf0\x3d",
 
  77         ['&'] = "\x12\x3d\xf0\x3d\xf0\x12",
 
  78         ['8'] = "\x3e\xf0\x3e",
 
  79         ['*'] = "\x12\x3e\xf0\x3e\xf0\x12",
 
  80         ['9'] = "\x46\xf0\x46",
 
  81         ['('] = "\x12\x46\xf0\x46\xf0\x12",
 
  82         ['0'] = "\x45\xf0\x45",
 
  83         [')'] = "\x12\x45\xf0\x45\xf0\x12",
 
  84         ['-'] = "\x4e\xf0\x4e",
 
  85         ['_'] = "\x12\x4e\xf0\x4e\xf0\x12",
 
  86         ['='] = "\x55\xf0\x55",
 
  87         ['+'] = "\x12\x55\xf0\x55\xf0\x12",
 
  88         ['['] = "\x54\xf0\x54",
 
  89         ['{'] = "\x12\x54\xf0\x54\xf0\x12",
 
  90         [']'] = "\x5b\xf0\x5b",
 
  91         ['}'] = "\x12\x5b\xf0\x5b\xf0\x12",
 
  92         ['\\'] = "\x5d\xf0\x5d",
 
  93         ['|'] = "\x12\x5d\xf0\x5d\xf0\x12",
 
  94         [';'] = "\x4c\xf0\x4c",
 
  95         [':'] = "\x12\x4c\xf0\x4c\xf0\x12",
 
  96         ['\''] = "\x52\xf0\x52",
 
  97         ['"'] = "\x12\x52\xf0\x52\xf0\x12",
 
  98         [','] = "\x41\xf0\x41",
 
  99         ['<'] = "\x12\x41\xf0\x41\xf0\x12",
 
 100         ['.'] = "\x49\xf0\x49",
 
 101         ['>'] = "\x12\x49\xf0\x49\xf0\x12",
 
 102         ['/'] = "\x4a\xf0\x4a",
 
 103         ['?'] = "\x12\x4a\xf0\x4a\xf0\x12",
 
 106 const unsigned char convert_table[] = {
 
 107         0xff, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44, 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59,
 
 108         0x65, 0x38, 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, 0x66, 0x71, 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b,
 
 109         0x67, 0x2e, 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, 0x68, 0x39, 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d,
 
 110         0x69, 0x31, 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, 0x6a, 0x72, 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f,
 
 111         0x6b, 0x33, 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, 0x6c, 0x34, 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61,
 
 112         0x6d, 0x73, 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, 0x3a, 0x36, 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76,
 
 113         0x55, 0x56, 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, 0x7c, 0x4f, 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f,
 
 114         0x52, 0x53, 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, 0x57, 0x4e, 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54,
 
 115         0x80, 0x81, 0x82, 0x41, 0x54, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
 
 116         0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
 
 117         0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
 
 118         0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
 
 119         0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
 
 120         0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
 
 121         0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
 
 122         0x00, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
 
 125 unsigned char sc_convert_1(unsigned char in) {
 
 126         static int shifted = 0;
 
 130                 return convert_table[in] | 0x80;
 
 137                 return convert_table[in];
 
 141 void kbd_inject_scancode (unsigned char sc) {
 
 142         outputf("Buffering %02x", sc);
 
 143         kbd_inj_buffer[kbd_inj_end] = sc;
 
 145         kbd_inj_end %= sizeof(kbd_inj_buffer);
 
 148 void kbd_inject_key(unsigned char k) {
 
 151                 const char * c = scancodes2[k];
 
 154                         char cconv = sc_convert_1(*c);
 
 155                         if (cconv) kbd_inject_scancode(cconv);
 
 159                 const char * c = scancodes2[k];
 
 162                         kbd_inject_scancode(*c);
 
 168 unsigned char kbd_get_injected_scancode()
 
 172         if (kbd_inj_end != kbd_inj_start) {
 
 173                 b = kbd_inj_buffer[kbd_inj_start];
 
 175                 kbd_inj_start %= sizeof(kbd_inj_buffer);
 
 176                 outputf("Injecting %02x", b);
 
 179                 outputf("Not injecting");