/** * Sends a scancode to the keyboard. * * @returns COM status code * @param scancode The scancode to send */ STDMETHODIMP Keyboard::PutScancode(LONG scancode) { com::SafeArray<LONG> scancodes(1); scancodes[0] = scancode; return PutScancodes(ComSafeArrayAsInParam(scancodes), NULL); }
static unsigned char kbd_read_input(void) { int i, j, k, l; unsigned char prev; static unsigned char count = 0; static unsigned char oldcodes[KBD_ROWS][KBD_COLUMNS]={{0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}}; unsigned char inputcode[KBD_ROWS][KBD_COLUMNS]; memset(inputcode, 0, sizeof(unsigned char) * (KBD_ROWS * KBD_COLUMNS)); scancodes(inputcode); for(i = 0; i < KBD_COLUMNS; i++) { for(j = 0; j < KBD_ROWS; j++) { // if(oldcodes[j][i] == 0xe0) // oldcodes[j][i] = if(oldcodes[j][i] != inputcode[j][i]) { // Value of the key before entering this function prev = oldcodes[j][i]; // KEYUP if(inputcode[j][i] == 0 && oldcodes[j][i] != 0 && !(oldcodes[j][i] & KBD_KEYUP)) { oldcodes[j][i] |= KBD_KEYUP; if(mode_ena == KBD_UP_ON) mode_ena = KBD_UP_OFF; if(prev == KBD_MODESCAN) if(mode_ena == KBD_DOWN_HOLD) mode_ena = KBD_UP_OFF; else if(mode_ena == KBD_DOWN) mode_ena = KBD_UP_ON; if(mode_ena == KBD_DOWN) mode_ena = KBD_DOWN_HOLD; } // RESET KEYUP else if(oldcodes[j][i] & KBD_KEYUP) oldcodes[j][i] = 0; // KEY DOWN else { oldcodes[j][i] = inputcode[j][i]; // Parse out mode modifiers before the keyboard interpreter can touch them if(inputcode[j][i] == KBD_MODESCAN) { if(!mode_ena) mode_ena = KBD_DOWN; continue; } if(inputcode[j][i] == KBD_NUMCURSCAN) { numcur_ena = numcur_ena?0:1; continue; } } //printk("Modified: (%#x,%#x), ipv:%#x, To: (%#.2x), From: (%#.2x), Flags:%d,%d,%d\r\n", j, i, inputcode[j][i], oldcodes[j][i], prev, mode_ena, shift_ena, numcur_ena); return oldcodes[j][i]; } } } return (unsigned char)(KBD_NO_DATA); }