11#include "drivers/keyboard.h"
22
3+ #include <stdbool.h>
4+
35#include "cpu/isr.h"
46#include "cpu/ports.h"
5- #include "libc/signal .h"
7+ #include "libc/proc .h"
68#include "libc/stdio.h"
9+ #include "libc/string.h"
10+
11+ static bool e0_mode ;
12+ static uint32_t keystate [8 ];
13+ static char keyMap [0xFF ] = {0 , 0 , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '0' , '-' , '+' , '\b' , '\t' , 'q' , 'w' , 'e' , 'r' , 't' , 'y' , 'u' , 'i' , 'o' , 'p' , '[' , ']' , '\n' , 0 , 'a' , 's' , 'd' , 'f' , 'g' , 'h' , 'j' , 'k' , 'l' , ';' , '\'' , '`' , 0 , '\\' , 'z' , 'x' , 'c' , 'v' , 'b' , 'n' , 'm' , ',' , '.' , '/' , 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 , 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 , 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 , 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 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
14+ static char shiftKeyMap [0xFF ] = {0 , 0 , '!' , '@' , '#' , '$' , '%' , '^' , '&' , '*' , '(' , ')' , '_' , '+' , '\b' , '\t' , 'Q' , 'W' , 'E' , 'R' , 'T' , 'Y' , 'U' , 'I' , 'O' , 'P' , '{' , '}' , '\n' , 0 , 'A' , 'S' , 'D' , 'F' , 'G' , 'H' , 'J' , 'K' , 'L' , ':' , '"' , '~' , 0 , '|' , 'Z' , 'X' , 'C' , 'V' , 'B' , 'N' , 'M' , '<' , '>' , '?' , 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 , 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 , 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 , 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 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
15+
16+ static void keyboard_callback (registers_t * regs );
17+ static char keyboard_char (uint8_t code , bool shift );
18+ static bool get_key_state (uint8_t keycode );
19+ static void set_key_state (uint8_t keycode , bool state );
20+ static uint8_t get_mods ();
21+
22+ void init_keyboard () {
23+ e0_mode = false;
24+ kmemset (keystate , 0 , sizeof (keystate ));
25+ register_interrupt_handler (IRQ1 , keyboard_callback );
26+ }
27+
28+ static bool get_key_state (uint8_t keycode ) {
29+ int i = keycode / 32 ;
30+ int b = keycode % 32 ;
731
8- static uint8_t last_code = 0 ;
9- static bool lctrl = false;
10- static bool rctrl = false;
11- static bool lalt = false;
12- static bool ralt = false;
13- static bool lshift = false;
14- static bool rshift = false;
15- static bool lsuper = false;
16- static bool rsuper = false;
32+ return keystate [i ] & (1 << b );
33+ }
34+
35+ static void set_key_state (uint8_t keycode , bool state ) {
36+ int i = keycode / 32 ;
37+ int b = keycode % 32 ;
38+
39+ if (state ) {
40+ keystate [i ] |= (1 << b );
41+ }
42+ else {
43+ keystate [i ] &= ~(1 << b );
44+ }
45+ }
46+
47+ static uint8_t get_mods () {
48+ uint8_t mods = 0 ;
49+ // TODO handle 0xE0 to get right ctrl
50+ if (get_key_state (KEY_LCTRL )) {
51+ mods |= KEY_MOD_CTRL ;
52+ }
53+ // TODO handle 0xE0 to get right alt
54+ if (get_key_state (KEY_LALT )) {
55+ mods |= KEY_MOD_ALT ;
56+ }
57+ if (get_key_state (KEY_LSHIFT ) || get_key_state (KEY_RSHIFT )) {
58+ mods |= KEY_MOD_SHIFT ;
59+ }
60+ // TODO handle 0xE0 to get right super
61+ if (get_key_state (KEY_SUPER )) {
62+ mods |= KEY_MOD_SUPER ;
63+ }
64+ return mods ;
65+ }
66+
67+ static char keyboard_char (uint8_t code , bool shift ) {
68+ code = code & 0x7F ;
69+ if (shift ) {
70+ return shiftKeyMap [code ];
71+ }
72+ return keyMap [code ];
73+ }
1774
1875static void keyboard_callback (registers_t * regs ) {
1976 /* The PIC leaves us the scancode in port 0x60 */
20- uint8_t scancode = port_byte_in (0x60 );
77+ uint8_t scancode = port_byte_in (0x60 );
78+ if (scancode == 0xE0 ) {
79+ e0_mode = true;
80+ return ;
81+ }
82+ // printf("%02X ", scancode);
2183 uint8_t keycode = scancode ;
2284 keyboard_event_t key_event = KEY_EVENT_PRESS ;
85+ uint8_t mods = get_mods ();
2386 bool press = keycode < 0x80 ;
2487
2588 if (press ) {
26- if (keycode == last_code ) {
89+ if (get_key_state ( keycode ) ) {
2790 key_event = KEY_EVENT_REPEAT ;
2891 }
29- else {
30- if (keycode == KEY_LSHIFT ) {
31- lshift = true;
32- }
33- if (keycode == KEY_RSHIFT ) {
34- lshift = true;
35- }
36- }
37- last_code = keycode ;
92+ set_key_state (keycode , true);
3893 }
3994
4095 else {
4196 keycode -= 0x80 ;
4297 key_event = KEY_EVENT_RELEASE ;
43- last_code = 0 ;
44-
45- if (keycode == KEY_LSHIFT ) {
46- lshift = false;
47- }
48- if (keycode == KEY_RSHIFT ) {
49- lshift = false;
50- }
98+ set_key_state (keycode , false);
5199 }
52100
53- char c = keyboard_char (keycode , lshift || rshift );
54-
55- keyboard_mod_t mods = 0 ;
56- if (lctrl || rctrl ) {
57- mods |= KEY_MOD_CTRL ;
58- }
59- if (lalt || ralt ) {
60- mods |= KEY_MOD_ALT ;
61- }
62- if (lshift || rshift ) {
63- mods |= KEY_MOD_SHIFT ;
64- }
65- if (lsuper || rsuper ) {
66- mods |= KEY_MOD_SUPER ;
67- }
101+ char c = keyboard_char (keycode , mods & KEY_MOD_SHIFT );
68102
69103 ebus_event_t event ;
70104 event .event_id = EBUS_EVENT_KEY ;
@@ -74,19 +108,5 @@ static void keyboard_callback(registers_t * regs) {
74108 event .key .keycode = keycode ;
75109 event .key .scancode = scancode ;
76110 queue_event (& event );
77- }
78-
79- void init_keyboard () {
80- register_interrupt_handler (IRQ1 , keyboard_callback );
81- }
82-
83- char keyMap [0xFF ] = {0 , 0 , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '0' , '-' , '+' , '\b' , '\t' , 'q' , 'w' , 'e' , 'r' , 't' , 'y' , 'u' , 'i' , 'o' , 'p' , '[' , ']' , '\n' , 0 , 'a' , 's' , 'd' , 'f' , 'g' , 'h' , 'j' , 'k' , 'l' , ';' , '\'' , '`' , 0 , '\\' , 'z' , 'x' , 'c' , 'v' , 'b' , 'n' , 'm' , ',' , '.' , '/' , 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 , 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 , 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 , 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 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
84- char shiftKeyMap [0xFF ] = {0 , 0 , '!' , '@' , '#' , '$' , '%' , '^' , '&' , '*' , '(' , ')' , '_' , '+' , '\b' , '\t' , 'Q' , 'W' , 'E' , 'R' , 'T' , 'Y' , 'U' , 'I' , 'O' , 'P' , '{' , '}' , '\n' , 0 , 'A' , 'S' , 'D' , 'F' , 'G' , 'H' , 'J' , 'K' , 'L' , ':' , '"' , '~' , 0 , '|' , 'Z' , 'X' , 'C' , 'V' , 'B' , 'N' , 'M' , '<' , '>' , '?' , 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 , 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 , 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 , 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 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
85-
86- char keyboard_char (uint8_t code , bool shift ) {
87- code = code & 0x7F ;
88- if (shift ) {
89- return shiftKeyMap [code ];
90- }
91- return keyMap [code ];
111+ e0_mode = false;
92112}
0 commit comments