Changeset 79460ae in mainline for kbd


Ignore:
Timestamp:
2006-05-30T10:40:17Z (20 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
44c6d88d
Parents:
f25b73d6
Message:

Basic support for console driver.
Does not provide separate screens yet.
TODO fix many unhandled states.

Location:
kbd
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • kbd/Makefile

    rf25b73d6 r79460ae  
    6868
    6969$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS)
    70         $(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
     70        $(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
    7171
    7272disasm:
  • kbd/arch/ia32/include/kbd.h

    rf25b73d6 r79460ae  
    3030#define __ia32_KBD_H__
    3131
     32#include <key_buffer.h>
     33
    3234int kbd_arch_init(void);
    33 int kbd_arch_process(int scan_code);
     35int kbd_arch_process(keybuffer_t *keybuffer, int scan_code);
    3436
    3537#endif
  • kbd/arch/ia32/src/kbd.c

    rf25b73d6 r79460ae  
    2929
    3030#include <arch/kbd.h>
    31 #include <key_buffer.h>
    3231#include <ipc/ipc.h>
    3332
     
    8079        ' ',
    8180        SPECIAL, /* 0x3a - CapsLock */
    82         SPECIAL, /* 0x3b - F1 */
    83         SPECIAL, /* 0x3c - F2 */
    84         SPECIAL, /* 0x3d - F3 */
    85         SPECIAL, /* 0x3e - F4 */
    86         SPECIAL, /* 0x3f - F5 */
    87         SPECIAL, /* 0x40 - F6 */
    88         SPECIAL, /* 0x41 - F7 */
    89         SPECIAL, /* 0x42 - F8 */
    90         SPECIAL, /* 0x43 - F9 */
    91         SPECIAL, /* 0x44 - F10 */
     81        0x3b, /* 0x3b - F1 */
     82//      SPECIAL, /* 0x3b - F1 */
     83        0x3c, /* 0x3c - F2 */
     84//      SPECIAL, /* 0x3c - F2 */
     85        0x3d, /* 0x3d - F3 */
     86//      SPECIAL, /* 0x3d - F3 */
     87        0x3e, /* 0x3e - F4 */
     88//      SPECIAL, /* 0x3e - F4 */
     89//      SPECIAL, /* 0x3f - F5 */
     90        0x3f, /* 0x3f - F5 */
     91//      SPECIAL, /* 0x40 - F6 */
     92        0x40, /* 0x40 - F6 */
     93//      SPECIAL, /* 0x41 - F7 */
     94        0x41, /* 0x41 - F7 */
     95//      SPECIAL, /* 0x42 - F8 */
     96        0x42, /* 0x42 - F8 */
     97//      SPECIAL, /* 0x43 - F9 */
     98        0x43, /* 0x43 - F9 */
     99//      SPECIAL, /* 0x44 - F10 */
     100        0x44, /* 0x44 - F10 */
    92101        SPECIAL, /* 0x45 - NumLock */
    93102        SPECIAL, /* 0x46 - ScrollLock */
     
    160169        ' ',
    161170        SPECIAL, /* 0x3a - CapsLock */
    162         SPECIAL, /* 0x3b - F1 */
    163         SPECIAL, /* 0x3c - F2 */
    164         SPECIAL, /* 0x3d - F3 */
    165         SPECIAL, /* 0x3e - F4 */
    166         SPECIAL, /* 0x3f - F5 */
    167         SPECIAL, /* 0x40 - F6 */
    168         SPECIAL, /* 0x41 - F7 */
    169         SPECIAL, /* 0x42 - F8 */
    170         SPECIAL, /* 0x43 - F9 */
    171         SPECIAL, /* 0x44 - F10 */
     171        0x3b, /* 0x3b - F1 */
     172        0x3c, /* 0x3c - F2 */
     173        0x3d, /* 0x3d - F3 */
     174        0x3e, /* 0x3e - F4 */
     175        0x3f, /* 0x3f - F5 */
     176        0x40, /* 0x40 - F6 */
     177        0x41, /* 0x41 - F7 */
     178        0x42, /* 0x42 - F8 */
     179        0x43, /* 0x43 - F9 */
     180        0x44, /* 0x44 - F10 */
     181//      SPECIAL, /* 0x3b - F1 */
     182//      SPECIAL, /* 0x3c - F2 */
     183//      SPECIAL, /* 0x3d - F3 */
     184//      SPECIAL, /* 0x3e - F4 */
     185//      SPECIAL, /* 0x3f - F5 */
     186//      SPECIAL, /* 0x40 - F6 */
     187//      SPECIAL, /* 0x41 - F7 */
     188//      SPECIAL, /* 0x42 - F8 */
     189//      SPECIAL, /* 0x43 - F9 */
     190//      SPECIAL, /* 0x44 - F10 */
    172191        SPECIAL, /* 0x45 - NumLock */
    173192        SPECIAL, /* 0x46 - ScrollLock */
     
    231250};
    232251
    233 static int key_released(unsigned char key)
     252static int key_released(keybuffer_t *keybuffer, unsigned char key)
    234253{
    235254        switch (key) {
     
    250269}
    251270
    252 static int key_pressed(unsigned char key)
     271static int key_pressed(keybuffer_t *keybuffer, unsigned char key)
    253272{
    254273        char *map = sc_primary_map;
     
    268287                        break;
    269288                case SC_LEFTARR:
    270                         if (key_buffer_available() >= 3) {
    271                                 key_buffer_push(0x1b); 
    272                                 key_buffer_push(0x5b); 
    273                                 key_buffer_push(0x44); 
     289                        if (keybuffer_available(keybuffer) >= 3) {
     290                                keybuffer_push(keybuffer, 0x1b);       
     291                                keybuffer_push(keybuffer, 0x5b);       
     292                                keybuffer_push(keybuffer, 0x44);       
    274293                        }
    275294                        break;
    276295                case SC_RIGHTARR:
    277                         if (key_buffer_available() >= 3) {
    278                                 key_buffer_push(0x1b); 
    279                                 key_buffer_push(0x5b); 
    280                                 key_buffer_push(0x43); 
     296                        if (keybuffer_available(keybuffer) >= 3) {
     297                                keybuffer_push(keybuffer, 0x1b);       
     298                                keybuffer_push(keybuffer, 0x5b);       
     299                                keybuffer_push(keybuffer, 0x43);       
    281300                        }
    282301                        break;
    283302                case SC_UPARR:
    284                         if (key_buffer_available() >= 3) {
    285                                 key_buffer_push(0x1b); 
    286                                 key_buffer_push(0x5b); 
    287                                 key_buffer_push(0x41); 
     303                        if (keybuffer_available(keybuffer) >= 3) {
     304                                keybuffer_push(keybuffer, 0x1b);       
     305                                keybuffer_push(keybuffer, 0x5b);       
     306                                keybuffer_push(keybuffer, 0x41);       
    288307                        }
    289308                        break;
    290309                case SC_DOWNARR:
    291                         if (key_buffer_available() >= 3) {
    292                                 key_buffer_push(0x1b); 
    293                                 key_buffer_push(0x5b); 
    294                                 key_buffer_push(0x42); 
     310                        if (keybuffer_available(keybuffer) >= 3) {
     311                                keybuffer_push(keybuffer, 0x1b);       
     312                                keybuffer_push(keybuffer, 0x5b);       
     313                                keybuffer_push(keybuffer, 0x42);       
    295314                        }
    296315                        break;
    297316                case SC_HOME:
    298                         if (key_buffer_available() >= 3) {
    299                                 key_buffer_push(0x1b); 
    300                                 key_buffer_push(0x4f); 
    301                                 key_buffer_push(0x48); 
     317                        if (keybuffer_available(keybuffer) >= 3) {
     318                                keybuffer_push(keybuffer, 0x1b);       
     319                                keybuffer_push(keybuffer, 0x4f);       
     320                                keybuffer_push(keybuffer, 0x48);       
    302321                        }
    303322                        break;
    304323                case SC_END:
    305                         if (key_buffer_available() >= 3) {
    306                                 key_buffer_push(0x1b); 
    307                                 key_buffer_push(0x4f); 
    308                                 key_buffer_push(0x46); 
     324                        if (keybuffer_available(keybuffer) >= 3) {
     325                                keybuffer_push(keybuffer, 0x1b);       
     326                                keybuffer_push(keybuffer, 0x4f);       
     327                                keybuffer_push(keybuffer, 0x46);       
    309328                        }
    310329                        break;
    311330                case SC_DELETE:
    312                         if (key_buffer_available() >= 4) {
    313                                 key_buffer_push(0x1b); 
    314                                 key_buffer_push(0x5b); 
    315                                 key_buffer_push(0x33); 
    316                                 key_buffer_push(0x7e); 
     331                        if (keybuffer_available(keybuffer) >= 4) {
     332                                keybuffer_push(keybuffer, 0x1b);       
     333                                keybuffer_push(keybuffer, 0x5b);       
     334                                keybuffer_push(keybuffer, 0x33);       
     335                                keybuffer_push(keybuffer, 0x7e);       
    317336                        }
    318337                        break;
     
    325344                        if (shift)
    326345                                map = sc_secondary_map;
    327                         key_buffer_push(map[key]);     
     346                        keybuffer_push(keybuffer, map[key]);   
    328347                        break;
    329348        }
     
    338357}
    339358
    340 int kbd_arch_process(int scan_code)
     359int kbd_arch_process(keybuffer_t *keybuffer, int scan_code)
    341360{
    342361        if (scan_code != IGNORE_CODE) {
    343362                if (scan_code & KEY_RELEASE)
    344                         key_released(scan_code ^ KEY_RELEASE);
     363                        key_released(keybuffer, scan_code ^ KEY_RELEASE);
    345364                else
    346                         key_pressed(scan_code);
     365                        key_pressed(keybuffer, scan_code);
    347366        }
    348367        return  1;
  • kbd/arch/mips32/include/kbd.h

    rf25b73d6 r79460ae  
    3030#define __mips32_KBD_H__
    3131
     32#include <key_buffer.h>
     33
    3234int kbd_arch_init(void);
    33 int kbd_arch_process(int scan_code);
     35int kbd_arch_process(keybuffer_t *keybuffer, int scan_code);
    3436
    3537#endif
  • kbd/arch/mips32/src/kbd.c

    rf25b73d6 r79460ae  
    2929#include <arch/kbd.h>
    3030#include <ipc/ipc.h>
    31 #include <key_buffer.h>
    3231
    3332irq_cmd_t msim_cmds[1] = {
     
    4645}
    4746
    48 int kbd_arch_process(int scan_code)
     47int kbd_arch_process(keybuffer_t *keybuffer, int scan_code)
    4948{
    50         key_buffer_push(scan_code);
     49        keybuffer_push(keybuffer, scan_code);
    5150        return  1;
    5251}
  • kbd/generic/kbd.c

    rf25b73d6 r79460ae  
    4949        int phoneid;
    5050        char connected = 0;
    51        
     51        keybuffer_t keybuffer; 
    5252        ipcarg_t retval, arg1, arg2;
    5353
    54         printf("Uspace kbd service started.\n");
     54//      printf("Uspace kbd service started.\n");
    5555
    5656        /* Initialize arch dependent parts */
    5757        if (!(res = kbd_arch_init())) {
    58                         printf("Kbd registration failed with retval %d.\n", res);
     58//                      printf("Kbd registration failed with retval %d.\n", res);
    5959                        return -1;
    6060                        };
    6161       
    6262        /* Initialize key buffer */
    63         key_buffer_init();
     63        keybuffer_init(&keybuffer);
    6464       
    6565        /* Register service at nameserver */
    66         printf("%s: Registering at naming service.\n", NAME);
     66//      printf("%s: Registering at naming service.\n", NAME);
    6767
    6868        if ((res = ipc_connect_to_me(PHONE_NS, SERVICE_KEYBOARD, 0, &phonead)) != 0) {
    69                 printf("%s: Error: Registering at naming service failed.\n", NAME);
     69//              printf("%s: Error: Registering at naming service failed.\n", NAME);
    7070                return -1;
    7171        };
     
    7676                switch (IPC_GET_METHOD(call)) {
    7777                        case IPC_M_PHONE_HUNGUP:
    78                                 printf("%s: Phone hung up.\n", NAME);
     78//                              printf("%s: Phone hung up.\n", NAME);
    7979                                connected = 0;
    8080                                retval = 0;
     
    9898                                if (connected) {
    9999                                        /* recode to ASCII - one interrupt can produce more than one code so result is stored in fifo */
    100                                         kbd_arch_process(IPC_GET_ARG2(call));
     100                                        kbd_arch_process(&keybuffer, IPC_GET_ARG2(call));
    101101
    102102                                        //printf("%s: GOT INTERRUPT: %c\n", NAME, key);
     
    107107                                        retval = 0;
    108108
    109                                         while (!key_buffer_empty()) {
    110                                                 if (!key_buffer_pop((char *)&arg1)) {
    111                                                         printf("%s: KeyBuffer is empty but it should not be.\n");
     109                                        while (!keybuffer_empty(&keybuffer)) {
     110                                                if (!keybuffer_pop(&keybuffer, (char *)&arg1)) {
     111//                                                      printf("%s: KeyBuffer is empty but it should not be.\n");
    112112                                                        break;
    113113                                                }
    114114                                                /*FIXME: detection of closed connection */
    115                                                 ipc_call_async(phoneid, KBD_PUSHCHAR, arg1, 0, NULL);
     115                                                ipc_call_async(phoneid, KBD_PUSHCHAR, arg1, NULL, NULL);
    116116                                        }
    117117
    118118                                }
    119                                 printf("%s: Interrupt processed.\n", NAME);
     119//                              printf("%s: Interrupt processed.\n", NAME);
    120120                                break;
    121121                        default:
    122                                 printf("%s: Unknown method: %zd\n", NAME, IPC_GET_METHOD(call));
     122//                              printf("%s: Unknown method: %zd\n", NAME, IPC_GET_METHOD(call));
    123123                                retval = ENOENT;
    124124                                break;
  • kbd/generic/key_buffer.c

    rf25b73d6 r79460ae  
    2828
    2929#include <key_buffer.h>
    30 #include <libadt/fifo.h>
    31 
    32 #define KBD_BUFFER_SIZE 128 /**< Size of buffer for pressed keys */
    33 
    34 FIFO_INITIALIZE_STATIC(buffer, char, KBD_BUFFER_SIZE);  /**< Fifo for storing pressed keys */
    35 fifo_count_t buffer_items;      /**< Counter of used items for prevent fifo overflow */
    3630
    3731/** Clear key buffer.
    3832 */
    39 void key_buffer_free(void)
     33void keybuffer_free(keybuffer_t *keybuffer)
    4034{
    41         buffer_items = 0;
    42         buffer.head = buffer.tail = 0;
     35
     36        keybuffer->items = 0;
     37        keybuffer->head = keybuffer->tail = keybuffer->items = 0;
    4338}
    4439
     
    4641 *
    4742 */
    48 void key_buffer_init(void)
     43void keybuffer_init(keybuffer_t *keybuffer)
    4944{
    50         key_buffer_free();
     45        keybuffer_free(keybuffer);
    5146}
    5247
     
    5651 * @return empty buffer space
    5752 */
    58 int key_buffer_available(void)
     53int keybuffer_available(keybuffer_t *keybuffer)
    5954{
    60         return KBD_BUFFER_SIZE - buffer_items;
     55        return KEYBUFFER_SIZE - keybuffer->items;
    6156}
    6257
     
    6459 * @return nonzero, if buffer is not empty.
    6560 */
    66 int key_buffer_empty(void)
     61int keybuffer_empty(keybuffer_t *keybuffer)
    6762{
    68         return (buffer_items == 0);
     63        return (keybuffer->items == 0);
    6964}
    7065
     
    7368 * @param key code of stored key
    7469 */
    75 void key_buffer_push(char key)
     70void keybuffer_push(keybuffer_t *keybuffer, char key)
    7671{
    77         if (buffer_items < KBD_BUFFER_SIZE) {
    78                 fifo_push(buffer, key);
    79                 buffer_items++;
     72        if (keybuffer->items < KEYBUFFER_SIZE) {
     73                keybuffer->fifo[keybuffer->tail = (keybuffer->tail + 1) < keybuffer->items ? (keybuffer->tail + 1) : 0] = (key);
     74                keybuffer->items++;
    8075        }
    8176}
     
    8580 * @return zero on empty buffer, nonzero else
    8681 */
    87 int key_buffer_pop(char *c)
     82int keybuffer_pop(keybuffer_t *keybuffer, char *c)
    8883{
    89         if (buffer_items > 0) {
    90                 buffer_items--;
    91                 *c = fifo_pop(buffer);
     84        if (keybuffer->items > 0) {
     85                keybuffer->items--;
     86                *c = keybuffer->fifo[keybuffer->head = (keybuffer->head + 1) < keybuffer->items ? (keybuffer->head + 1) : 0];
    9287                return 1;
    9388        }
  • kbd/include/kbd.h

    rf25b73d6 r79460ae  
    3232#define KBD_PUSHCHAR 1024
    3333
     34#define KBD_KEY_F1      0x3b
     35#define KBD_KEY_F2      0x3c
     36#define KBD_KEY_F3      0x3d
     37#define KBD_KEY_F4      0x3e
     38#define KBD_KEY_F5      0x3f
     39#define KBD_KEY_F6      0x40
     40#define KBD_KEY_F7      0x41
     41#define KBD_KEY_F8      0x42
     42#define KBD_KEY_F9      0x43
     43#define KBD_KEY_F10     0x44
     44#define KBD_KEY_F11     0x45
     45#define KBD_KEY_F12     0x46
     46
    3447#endif
    3548
  • kbd/include/key_buffer.h

    rf25b73d6 r79460ae  
    3232#include <types.h>
    3333
    34 void key_buffer_free(void);
    35 void key_buffer_init(void);
    36 int key_buffer_available(void);
    37 int key_buffer_empty(void);
    38 void key_buffer_push(char key);
    39 int key_buffer_pop(char *c);
     34#define KEYBUFFER_SIZE 128 /**< Size of buffer for pressed keys */
     35
     36typedef struct {
     37        char fifo[KEYBUFFER_SIZE];
     38        unsigned long head;
     39        unsigned long tail;
     40        unsigned long items;
     41} keybuffer_t;
     42
     43void keybuffer_free(keybuffer_t *keybuffer);
     44void keybuffer_init(keybuffer_t *keybuffer);
     45int keybuffer_available(keybuffer_t *keybuffer);
     46int keybuffer_empty(keybuffer_t *keybuffer);
     47void keybuffer_push(keybuffer_t *keybuffer, char key);
     48int keybuffer_pop(keybuffer_t *keybuffer, char *c);
    4049
    4150#endif
Note: See TracChangeset for help on using the changeset viewer.