Rev 1759 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1759 | Rev 1780 | ||
---|---|---|---|
Line 82... | Line 82... | ||
82 | /** |
82 | /** |
83 | * These codes read from i8042 data register are silently ignored. |
83 | * These codes read from i8042 data register are silently ignored. |
84 | */ |
84 | */ |
85 | #define IGNORE_CODE 0x7f |
85 | #define IGNORE_CODE 0x7f |
86 | 86 | ||
87 | static void key_released(__u8 sc); |
87 | static void key_released(uint8_t sc); |
88 | static void key_pressed(__u8 sc); |
88 | static void key_pressed(uint8_t sc); |
89 | static char key_read(chardev_t *d); |
89 | static char key_read(chardev_t *d); |
90 | 90 | ||
91 | #define PRESSED_SHIFT (1<<0) |
91 | #define PRESSED_SHIFT (1<<0) |
92 | #define PRESSED_CAPSLOCK (1<<1) |
92 | #define PRESSED_CAPSLOCK (1<<1) |
93 | #define LOCKED_CAPSLOCK (1<<0) |
93 | #define LOCKED_CAPSLOCK (1<<0) |
94 | 94 | ||
95 | #define ACTIVE_READ_BUFF_SIZE 16 /* Must be power of 2 */ |
95 | #define ACTIVE_READ_BUFF_SIZE 16 /* Must be power of 2 */ |
96 | 96 | ||
97 | static __u8 active_read_buff[ACTIVE_READ_BUFF_SIZE]; |
97 | static uint8_t active_read_buff[ACTIVE_READ_BUFF_SIZE]; |
98 | 98 | ||
99 | SPINLOCK_INITIALIZE(keylock); /**< keylock protects keyflags and lockflags. */ |
99 | SPINLOCK_INITIALIZE(keylock); /**< keylock protects keyflags and lockflags. */ |
100 | static volatile int keyflags; /**< Tracking of multiple keypresses. */ |
100 | static volatile int keyflags; /**< Tracking of multiple keypresses. */ |
101 | static volatile int lockflags; /**< Tracking of multiple keys lockings. */ |
101 | static volatile int lockflags; /**< Tracking of multiple keys lockings. */ |
102 | 102 | ||
Line 320... | Line 320... | ||
320 | * @param n Interrupt vector. |
320 | * @param n Interrupt vector. |
321 | * @param istate Interrupted state. |
321 | * @param istate Interrupted state. |
322 | */ |
322 | */ |
323 | void i8042_interrupt(int n, istate_t *istate) |
323 | void i8042_interrupt(int n, istate_t *istate) |
324 | { |
324 | { |
325 | __u8 x; |
325 | uint8_t x; |
326 | __u8 status; |
326 | uint8_t status; |
327 | 327 | ||
328 | while (((status=i8042_status_read()) & i8042_BUFFER_FULL_MASK)) { |
328 | while (((status=i8042_status_read()) & i8042_BUFFER_FULL_MASK)) { |
329 | x = i8042_data_read(); |
329 | x = i8042_data_read(); |
330 | 330 | ||
331 | if ((status & i8042_MOUSE_DATA)) |
331 | if ((status & i8042_MOUSE_DATA)) |
Line 348... | Line 348... | ||
348 | 348 | ||
349 | /** Process release of key. |
349 | /** Process release of key. |
350 | * |
350 | * |
351 | * @param sc Scancode of the key being released. |
351 | * @param sc Scancode of the key being released. |
352 | */ |
352 | */ |
353 | void key_released(__u8 sc) |
353 | void key_released(uint8_t sc) |
354 | { |
354 | { |
355 | spinlock_lock(&keylock); |
355 | spinlock_lock(&keylock); |
356 | switch (sc) { |
356 | switch (sc) { |
357 | case SC_LSHIFT: |
357 | case SC_LSHIFT: |
358 | case SC_RSHIFT: |
358 | case SC_RSHIFT: |
Line 373... | Line 373... | ||
373 | 373 | ||
374 | /** Process keypress. |
374 | /** Process keypress. |
375 | * |
375 | * |
376 | * @param sc Scancode of the key being pressed. |
376 | * @param sc Scancode of the key being pressed. |
377 | */ |
377 | */ |
378 | void key_pressed(__u8 sc) |
378 | void key_pressed(uint8_t sc) |
379 | { |
379 | { |
380 | char *map = sc_primary_map; |
380 | char *map = sc_primary_map; |
381 | char ascii = sc_primary_map[sc]; |
381 | char ascii = sc_primary_map[sc]; |
382 | bool shift, capslock; |
382 | bool shift, capslock; |
383 | bool letter = false; |
383 | bool letter = false; |
Line 451... | Line 451... | ||
451 | /* Called from getc(). */ |
451 | /* Called from getc(). */ |
452 | void i8042_suspend(chardev_t *d) |
452 | void i8042_suspend(chardev_t *d) |
453 | { |
453 | { |
454 | } |
454 | } |
455 | 455 | ||
456 | static __u8 active_read_buff_read(void) |
456 | static uint8_t active_read_buff_read(void) |
457 | { |
457 | { |
458 | static int i=0; |
458 | static int i=0; |
459 | i &= (ACTIVE_READ_BUFF_SIZE-1); |
459 | i &= (ACTIVE_READ_BUFF_SIZE-1); |
460 | if(!active_read_buff[i]) { |
460 | if(!active_read_buff[i]) { |
461 | return 0; |
461 | return 0; |
462 | } |
462 | } |
463 | return active_read_buff[i++]; |
463 | return active_read_buff[i++]; |
464 | } |
464 | } |
465 | 465 | ||
466 | static void active_read_buff_write(__u8 ch) |
466 | static void active_read_buff_write(uint8_t ch) |
467 | { |
467 | { |
468 | static int i=0; |
468 | static int i=0; |
469 | active_read_buff[i] = ch; |
469 | active_read_buff[i] = ch; |
470 | i++; |
470 | i++; |
471 | i &= (ACTIVE_READ_BUFF_SIZE-1); |
471 | i &= (ACTIVE_READ_BUFF_SIZE-1); |
472 | active_read_buff[i]=0; |
472 | active_read_buff[i]=0; |
473 | } |
473 | } |
474 | 474 | ||
475 | 475 | ||
476 | static void active_read_key_pressed(__u8 sc) |
476 | static void active_read_key_pressed(uint8_t sc) |
477 | { |
477 | { |
478 | char *map = sc_primary_map; |
478 | char *map = sc_primary_map; |
479 | char ascii = sc_primary_map[sc]; |
479 | char ascii = sc_primary_map[sc]; |
480 | bool shift, capslock; |
480 | bool shift, capslock; |
481 | bool letter = false; |
481 | bool letter = false; |
Line 545... | Line 545... | ||
545 | static char key_read(chardev_t *d) |
545 | static char key_read(chardev_t *d) |
546 | { |
546 | { |
547 | char ch; |
547 | char ch; |
548 | 548 | ||
549 | while(!(ch = active_read_buff_read())) { |
549 | while(!(ch = active_read_buff_read())) { |
550 | __u8 x; |
550 | uint8_t x; |
551 | while (!(i8042_status_read() & i8042_BUFFER_FULL_MASK)) |
551 | while (!(i8042_status_read() & i8042_BUFFER_FULL_MASK)) |
552 | ; |
552 | ; |
553 | x = i8042_data_read(); |
553 | x = i8042_data_read(); |
554 | if (x != IGNORE_CODE) { |
554 | if (x != IGNORE_CODE) { |
555 | if (x & KEY_RELEASE) |
555 | if (x & KEY_RELEASE) |
Line 565... | Line 565... | ||
565 | * |
565 | * |
566 | * This function can be used to implement keyboard polling. |
566 | * This function can be used to implement keyboard polling. |
567 | */ |
567 | */ |
568 | void i8042_poll(void) |
568 | void i8042_poll(void) |
569 | { |
569 | { |
570 | __u8 x; |
570 | uint8_t x; |
571 | 571 | ||
572 | while (((x = i8042_status_read() & i8042_BUFFER_FULL_MASK))) { |
572 | while (((x = i8042_status_read() & i8042_BUFFER_FULL_MASK))) { |
573 | x = i8042_data_read(); |
573 | x = i8042_data_read(); |
574 | if (x != IGNORE_CODE) { |
574 | if (x != IGNORE_CODE) { |
575 | if (x & KEY_RELEASE) |
575 | if (x & KEY_RELEASE) |