Changeset 801579fe in mainline for uspace/kbd/arch/ia32/src/kbd.c


Ignore:
Timestamp:
2006-09-07T19:46:23Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
253f35a1
Parents:
9141377
Message:

Cleanup and reorganize the kbd service a bit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/kbd/arch/ia32/src/kbd.c

    r9141377 r801579fe  
    4242#include <kbd.h>
    4343#include <keys.h>
     44#include <genarch/kbd.h>
    4445
    4546/* Interesting bits for status register */
     
    6364#define MOUSE_ACK       0xfa
    6465
    65 
    66 #define SPECIAL         255
    6766#define KEY_RELEASE     0x80
    68 
    69 /**
    70  * These codes read from i8042 data register are silently ignored.
    71  */
    72 #define IGNORE_CODE     0x7f
    73 
    74 #define PRESSED_SHIFT           (1<<0)
    75 #define PRESSED_CAPSLOCK        (1<<1)
    76 #define LOCKED_CAPSLOCK         (1<<0)
    77 
    78 /** Scancodes. */
    79 #define SC_ESC          0x01
    80 #define SC_BACKSPACE    0x0e
    81 #define SC_LSHIFT       0x2a
    82 #define SC_RSHIFT       0x36
    83 #define SC_CAPSLOCK     0x3a
    84 #define SC_SPEC_ESCAPE  0xe0
    85 #define SC_LEFTARR      0x4b
    86 #define SC_RIGHTARR     0x4d
    87 #define SC_UPARR        0x48
    88 #define SC_DOWNARR      0x50
    89 #define SC_DELETE       0x53
    90 #define SC_HOME         0x47
    91 #define SC_END          0x4f
    92 
    93 #define FUNCTION_KEYS 0x100
    9467
    9568static volatile int keyflags;           /**< Tracking of multiple keypresses. */
    9669static volatile int lockflags;          /**< Tracking of multiple keys lockings. */
    97 
    98 /** Primary meaning of scancodes. */
    99 static int sc_primary_map[] = {
    100         SPECIAL, /* 0x00 */
    101         SPECIAL, /* 0x01 - Esc */
    102         '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=',
    103         '\b', /* 0x0e - Backspace */
    104         '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n',
    105         SPECIAL, /* 0x1d - LCtrl */
    106         'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'',
    107         '`',
    108         SPECIAL, /* 0x2a - LShift */
    109         '\\',
    110         'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/',
    111         SPECIAL, /* 0x36 - RShift */
    112         '*',
    113         SPECIAL, /* 0x38 - LAlt */
    114         ' ',
    115         SPECIAL, /* 0x3a - CapsLock */
    116         (FUNCTION_KEYS | 1), /* 0x3b - F1 */
    117         (FUNCTION_KEYS | 2), /* 0x3c - F2 */
    118         (FUNCTION_KEYS | 3), /* 0x3d - F3 */
    119         (FUNCTION_KEYS | 4), /* 0x3e - F4 */
    120         (FUNCTION_KEYS | 5), /* 0x3f - F5 */
    121         (FUNCTION_KEYS | 6), /* 0x40 - F6 */
    122         (FUNCTION_KEYS | 7), /* 0x41 - F7 */
    123         (FUNCTION_KEYS | 8), /* 0x42 - F8 */
    124         (FUNCTION_KEYS | 9), /* 0x43 - F9 */
    125         (FUNCTION_KEYS | 10), /* 0x44 - F10 */
    126         SPECIAL, /* 0x45 - NumLock */
    127         SPECIAL, /* 0x46 - ScrollLock */
    128         '7', '8', '9', '-',
    129         '4', '5', '6', '+',
    130         '1', '2', '3',
    131         '0', '.',
    132         SPECIAL, /* 0x54 - Alt-SysRq */
    133         SPECIAL, /* 0x55 - F11/F12/PF1/FN */
    134         SPECIAL, /* 0x56 - unlabelled key next to LAlt */
    135         (FUNCTION_KEYS | 11), /* 0x57 - F11 */
    136         (FUNCTION_KEYS | 12), /* 0x58 - F12 */
    137         SPECIAL, /* 0x59 */
    138         SPECIAL, /* 0x5a */
    139         SPECIAL, /* 0x5b */
    140         SPECIAL, /* 0x5c */
    141         SPECIAL, /* 0x5d */
    142         SPECIAL, /* 0x5e */
    143         SPECIAL, /* 0x5f */
    144         SPECIAL, /* 0x60 */
    145         SPECIAL, /* 0x61 */
    146         SPECIAL, /* 0x62 */
    147         SPECIAL, /* 0x63 */
    148         SPECIAL, /* 0x64 */
    149         SPECIAL, /* 0x65 */
    150         SPECIAL, /* 0x66 */
    151         SPECIAL, /* 0x67 */
    152         SPECIAL, /* 0x68 */
    153         SPECIAL, /* 0x69 */
    154         SPECIAL, /* 0x6a */
    155         SPECIAL, /* 0x6b */
    156         SPECIAL, /* 0x6c */
    157         SPECIAL, /* 0x6d */
    158         SPECIAL, /* 0x6e */
    159         SPECIAL, /* 0x6f */
    160         SPECIAL, /* 0x70 */
    161         SPECIAL, /* 0x71 */
    162         SPECIAL, /* 0x72 */
    163         SPECIAL, /* 0x73 */
    164         SPECIAL, /* 0x74 */
    165         SPECIAL, /* 0x75 */
    166         SPECIAL, /* 0x76 */
    167         SPECIAL, /* 0x77 */
    168         SPECIAL, /* 0x78 */
    169         SPECIAL, /* 0x79 */
    170         SPECIAL, /* 0x7a */
    171         SPECIAL, /* 0x7b */
    172         SPECIAL, /* 0x7c */
    173         SPECIAL, /* 0x7d */
    174         SPECIAL, /* 0x7e */
    175         SPECIAL, /* 0x7f */
    176 };
    177 
    178 /** Secondary meaning of scancodes. */
    179 static int sc_secondary_map[] = {
    180         SPECIAL, /* 0x00 */
    181         0x1b, /* 0x01 - Esc */
    182         '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+',
    183         SPECIAL, /* 0x0e - Backspace */
    184         '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n',
    185         SPECIAL, /* 0x1d - LCtrl */
    186         'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"',
    187         '~',
    188         SPECIAL, /* 0x2a - LShift */
    189         '|',
    190         'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?',
    191         SPECIAL, /* 0x36 - RShift */
    192         '*',
    193         SPECIAL, /* 0x38 - LAlt */
    194         ' ',
    195         SPECIAL, /* 0x3a - CapsLock */
    196         SPECIAL, /* 0x3b - F1 */
    197         SPECIAL, /* 0x3c - F2 */
    198         SPECIAL, /* 0x3d - F3 */
    199         SPECIAL, /* 0x3e - F4 */
    200         SPECIAL, /* 0x3f - F5 */
    201         SPECIAL, /* 0x40 - F6 */
    202         SPECIAL, /* 0x41 - F7 */
    203         SPECIAL, /* 0x42 - F8 */
    204         SPECIAL, /* 0x43 - F9 */
    205         SPECIAL, /* 0x44 - F10 */
    206         SPECIAL, /* 0x45 - NumLock */
    207         SPECIAL, /* 0x46 - ScrollLock */
    208         '7', '8', '9', '-',
    209         '4', '5', '6', '+',
    210         '1', '2', '3',
    211         '0', '.',
    212         SPECIAL, /* 0x54 - Alt-SysRq */
    213         SPECIAL, /* 0x55 - F11/F12/PF1/FN */
    214         SPECIAL, /* 0x56 - unlabelled key next to LAlt */
    215         SPECIAL, /* 0x57 - F11 */
    216         SPECIAL, /* 0x58 - F12 */
    217         SPECIAL, /* 0x59 */
    218         SPECIAL, /* 0x5a */
    219         SPECIAL, /* 0x5b */
    220         SPECIAL, /* 0x5c */
    221         SPECIAL, /* 0x5d */
    222         SPECIAL, /* 0x5e */
    223         SPECIAL, /* 0x5f */
    224         SPECIAL, /* 0x60 */
    225         SPECIAL, /* 0x61 */
    226         SPECIAL, /* 0x62 */
    227         SPECIAL, /* 0x63 */
    228         SPECIAL, /* 0x64 */
    229         SPECIAL, /* 0x65 */
    230         SPECIAL, /* 0x66 */
    231         SPECIAL, /* 0x67 */
    232         SPECIAL, /* 0x68 */
    233         SPECIAL, /* 0x69 */
    234         SPECIAL, /* 0x6a */
    235         SPECIAL, /* 0x6b */
    236         SPECIAL, /* 0x6c */
    237         SPECIAL, /* 0x6d */
    238         SPECIAL, /* 0x6e */
    239         SPECIAL, /* 0x6f */
    240         SPECIAL, /* 0x70 */
    241         SPECIAL, /* 0x71 */
    242         SPECIAL, /* 0x72 */
    243         SPECIAL, /* 0x73 */
    244         SPECIAL, /* 0x74 */
    245         SPECIAL, /* 0x75 */
    246         SPECIAL, /* 0x76 */
    247         SPECIAL, /* 0x77 */
    248         SPECIAL, /* 0x78 */
    249         SPECIAL, /* 0x79 */
    250         SPECIAL, /* 0x7a */
    251         SPECIAL, /* 0x7b */
    252         SPECIAL, /* 0x7c */
    253         SPECIAL, /* 0x7d */
    254         SPECIAL, /* 0x7e */
    255         SPECIAL, /* 0x7f */     
    256 };
    25770
    25871irq_cmd_t i8042_cmds[2] = {
     
    26578        i8042_cmds
    26679};
    267 
    268 static void key_released(keybuffer_t *keybuffer, unsigned char key)
    269 {
    270         switch (key) {
    271                 case SC_LSHIFT:
    272                 case SC_RSHIFT:
    273                         keyflags &= ~PRESSED_SHIFT;
    274                         break;
    275                 case SC_CAPSLOCK:
    276                         keyflags &= ~PRESSED_CAPSLOCK;
    277                         if (lockflags & LOCKED_CAPSLOCK)
    278                                 lockflags &= ~LOCKED_CAPSLOCK;
    279                                 else
    280                                 lockflags |= LOCKED_CAPSLOCK;
    281                         break;
    282                 default:
    283                         break;
    284         }
    285 }
    286 
    287 static void key_pressed(keybuffer_t *keybuffer, unsigned char key)
    288 {
    289         int *map = sc_primary_map;
    290         int ascii = sc_primary_map[key];
    291         int shift, capslock;
    292         int letter = 0;
    293 
    294         static int esc_count=0;
    295 
    296        
    297         if ( key == SC_ESC ) {
    298                 esc_count++;
    299                 if ( esc_count == 3 ) {
    300                         __SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE);
    301                 }       
    302         } else {
    303                 esc_count=0;
    304         }
    305        
    306        
    307 
    308         switch (key) {
    309                 case SC_LSHIFT:
    310                 case SC_RSHIFT:
    311                         keyflags |= PRESSED_SHIFT;
    312                         break;
    313                 case SC_CAPSLOCK:
    314                         keyflags |= PRESSED_CAPSLOCK;
    315                         break;
    316                 case SC_SPEC_ESCAPE:
    317                         break;
    318         /*      case SC_LEFTARR:
    319                         if (keybuffer_available(keybuffer) >= 3) {
    320                                 keybuffer_push(keybuffer, 0x1b);       
    321                                 keybuffer_push(keybuffer, 0x5b);       
    322                                 keybuffer_push(keybuffer, 0x44);       
    323                         }
    324                         break;
    325                 case SC_RIGHTARR:
    326                         if (keybuffer_available(keybuffer) >= 3) {
    327                                 keybuffer_push(keybuffer, 0x1b);       
    328                                 keybuffer_push(keybuffer, 0x5b);       
    329                                 keybuffer_push(keybuffer, 0x43);       
    330                         }
    331                         break;
    332                 case SC_UPARR:
    333                         if (keybuffer_available(keybuffer) >= 3) {
    334                                 keybuffer_push(keybuffer, 0x1b);       
    335                                 keybuffer_push(keybuffer, 0x5b);       
    336                                 keybuffer_push(keybuffer, 0x41);       
    337                         }
    338                         break;
    339                 case SC_DOWNARR:
    340                         if (keybuffer_available(keybuffer) >= 3) {
    341                                 keybuffer_push(keybuffer, 0x1b);       
    342                                 keybuffer_push(keybuffer, 0x5b);       
    343                                 keybuffer_push(keybuffer, 0x42);       
    344                         }
    345                         break;
    346                 case SC_HOME:
    347                         if (keybuffer_available(keybuffer) >= 3) {
    348                                 keybuffer_push(keybuffer, 0x1b);       
    349                                 keybuffer_push(keybuffer, 0x4f);       
    350                                 keybuffer_push(keybuffer, 0x48);       
    351                         }
    352                         break;
    353                 case SC_END:
    354                         if (keybuffer_available(keybuffer) >= 3) {
    355                                 keybuffer_push(keybuffer, 0x1b);       
    356                                 keybuffer_push(keybuffer, 0x4f);       
    357                                 keybuffer_push(keybuffer, 0x46);       
    358                         }
    359                         break;
    360                 case SC_DELETE:
    361                         if (keybuffer_available(keybuffer) >= 4) {
    362                                 keybuffer_push(keybuffer, 0x1b);       
    363                                 keybuffer_push(keybuffer, 0x5b);       
    364                                 keybuffer_push(keybuffer, 0x33);       
    365                                 keybuffer_push(keybuffer, 0x7e);       
    366                         }
    367                         break;
    368         */      default:
    369                         letter = ((ascii >= 'a') && (ascii <= 'z'));
    370                         capslock = (keyflags & PRESSED_CAPSLOCK) || (lockflags & LOCKED_CAPSLOCK);
    371                         shift = keyflags & PRESSED_SHIFT;
    372                         if (letter && capslock)
    373                                 shift = !shift;
    374                         if (shift)
    375                                 map = sc_secondary_map;
    376                         if (map[key] != SPECIAL)
    377                                 keybuffer_push(keybuffer, map[key]);   
    378                         break;
    379         }
    380 }
    381 
    38280
    38381static void wait_ready(void) {
     
    462160        int scan_code = IPC_GET_ARG2(*call);
    463161       
    464         if (scan_code != IGNORE_CODE) {
    465                 if (scan_code & KEY_RELEASE)
    466                         key_released(keybuffer, scan_code ^ KEY_RELEASE);
    467                 else
    468                         key_pressed(keybuffer, scan_code);
    469         }
     162        if (scan_code & KEY_RELEASE)
     163                key_released(keybuffer, scan_code ^ KEY_RELEASE);
     164        else
     165                key_pressed(keybuffer, scan_code);
    470166        return  1;
    471167}
     
    474170 * @}
    475171 */
    476 
Note: See TracChangeset for help on using the changeset viewer.