Changeset 79460ae in mainline


Ignore:
Timestamp:
2006-05-30T10:40:17Z (19 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.

Files:
1 added
16 edited

Legend:

Unmodified
Added
Removed
  • console/Makefile

    rf25b73d6 r79460ae  
    3434include $(LIBC_PREFIX)/Makefile.toolchain
    3535
    36 CFLAGS += -Iinclude -I../kbd/include ../fb
     36CFLAGS += -I. -I../kbd/include -I../fb
    3737
    3838LIBS = $(LIBC_PREFIX)/libc.a
     
    4343OUTPUT = console
    4444GENERIC_SOURCES = \
    45         console.c
     45        console.c \
     46        ../kbd/generic/key_buffer.c
    4647
    4748ARCH_SOURCES =
     
    6364
    6465$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS)
    65         $(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
     66        $(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map
    6667
    6768disasm:
  • console/console.c

    rf25b73d6 r79460ae  
    2929
    3030#include <kbd.h>
     31#include <fb.h>
    3132#include <ipc/ipc.h>
     33#include <ipc/fb.h>
    3234#include <ipc/services.h>
    33 #include <stdio.h>
    3435#include <errno.h>
     36#include <key_buffer.h>
     37#include <console.h>
     38
     39//#define CONSOLE_COUNT VFB_CONNECTIONS
     40#define CONSOLE_COUNT 6
    3541
    3642#define NAME "CONSOLE"
     43
     44typedef struct {
     45        keybuffer_t keybuffer;
     46        int client_phone;
     47        int vfb_number; /* Not used */
     48        int vfb_phone;
     49        int used;
     50} connection_t;
     51
     52connection_t connections[CONSOLE_COUNT];
     53
     54static int find_free_connection()
     55{
     56        int i = 0;
     57       
     58        while (i < CONSOLE_COUNT) {
     59                if (connections[i].used == 0)
     60                        return i;
     61                ++i;
     62        }
     63        return CONSOLE_COUNT;
     64}
     65
     66
     67static int find_connection(int client_phone)
     68{
     69        int i = 0;
     70       
     71        while (i < CONSOLE_COUNT) {
     72                if (connections[i].client_phone == client_phone)
     73                        return i;
     74                ++i;
     75        }
     76        return  CONSOLE_COUNT;
     77}
    3778
    3879int main(int argc, char *argv[])
     
    4182        ipc_call_t call;
    4283        ipc_callid_t callid;
    43         int phone_kbd, phone_fb;
     84        int kbd_phone, fb_phone;
    4485        ipcarg_t retval, arg1 = 0xdead, arg2 = 0xbeef;
    45        
    46         printf("Uspace console service started.\n");
    47        
     86        int i;
     87        int active_client = 0;
    4888       
    4989        /* Connect to keyboard driver */
    5090
    51         while ((phone_kbd = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) < 0) {
     91        while ((kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0)) < 0) {
    5292        };
    5393       
    54         if (ipc_connect_to_me(phone_kbd, SERVICE_CONSOLE, 0, &phonead) != 0) {
    55                 printf("%s: Error: Registering at naming service failed.\n", NAME);
     94        if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, &phonead) != 0) {
    5695                return -1;
    5796        };
     
    5998        /* Connect to framebuffer driver */
    6099       
    61         while ((phone_fb = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) {
    62         };
     100        for (i = 0; i < CONSOLE_COUNT; i++) {
     101                connections[i].used = 0;
     102                keybuffer_init(&(connections[i].keybuffer));
     103                /* TODO: init key_buffer */
     104                while ((connections[i].vfb_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) {
     105                               
     106ipc_call_async_2(connections[i].vfb_phone, FB_PUTCHAR, 'a', 'b', NULL, (void *)NULL);
     107                }
     108        }
    63109       
     110
    64111       
    65         /* Register service at nameserver */
    66         printf("%s: Registering at naming service.\n", NAME);
    67 
    68112        if (ipc_connect_to_me(PHONE_NS, SERVICE_CONSOLE, 0, &phonead) != 0) {
    69                 printf("%s: Error: Registering at naming service failed.\n", NAME);
    70113                return -1;
    71114        };
     
    75118                switch (IPC_GET_METHOD(call)) {
    76119                        case IPC_M_PHONE_HUNGUP:
    77                                 printf("%s: Phone hung up.\n", NAME);
    78                                 retval = 0;
     120                                /*FIXME: if its fb or kbd then panic! */
     121                                /* free connection */
     122                                if (i = find_connection(IPC_GET_ARG3(call)) < CONSOLE_COUNT) {
     123                                        connections[i].used = 0;
     124                                         /*TODO: free connection[i].key_buffer; */
     125                                        /* FIXME: active_connection hungup */
     126                                        retval = 0;
     127                                } else {
     128                                        /*FIXME: No such connection */
     129                                }
    79130                                break;
    80131                        case IPC_M_CONNECT_ME_TO:
    81                                 printf("%s: Connect me (%P) to: %zd\n",NAME, IPC_GET_ARG3(call), IPC_GET_ARG1(call));
     132                               
     133                                /* find first free connection */
     134                               
     135                                if ((i = find_free_connection()) == CONSOLE_COUNT) {
     136                                        retval = ELIMIT;
     137                                        break;
     138                                }
     139                               
     140                                connections[i].used = 1;
     141                                connections[i].client_phone = IPC_GET_ARG3(call);
     142                               
    82143                                retval = 0;
    83144                                break;
    84145                        case KBD_PUSHCHAR:
    85                                 printf("%s: Push char '%c'.\n", NAME, IPC_GET_ARG1(call));
     146                                /* got key from keyboard driver */
     147                                /* find active console */
     148                                /* if client is awaiting key, send it */
     149                                /*FIXME: else store key to its buffer */
    86150                                retval = 0;
     151                                i = IPC_GET_ARG1(call) & 0xff;
     152                                /* switch to another virtual console */
     153                                if ((i >= KBD_KEY_F1) && (i < KBD_KEY_F1 + CONSOLE_COUNT)) {
     154                                        active_client = i - KBD_KEY_F1;
     155                                        break;
     156                                }
     157                               
     158                                keybuffer_push(&(connections[active_client].keybuffer), i);
    87159                               
    88160                                break;
     161                        case CONSOLE_PUTCHAR:
     162                                /* find sender client */
     163                                /* ???
     164                                 * if its active client, send it to vfb
     165                                 **/
     166                                /*FIXME: check, if its from active client, .... */
     167
     168                                if ((i = find_connection(IPC_GET_ARG3(call))) == CONSOLE_COUNT) {
     169                                        break;
     170                                };
     171                               
     172                                /* TODO: send message to fb */
     173                                ipc_call_async_2(connections[i].vfb_phone, FB_PUTCHAR, IPC_GET_ARG1(call), IPC_GET_ARG2(call), NULL, NULL);
     174                               
     175                                break;
     176                        case CONSOLE_GETCHAR:
     177                                /* FIXME: */
     178                                if (!keybuffer_pop(&(connections[active_client].keybuffer), (char *)&arg1)) {
     179                                        /* FIXME: buffer empty -> store request */
     180                                        arg1 = 'X'; /* Only temporary */
     181                                };
     182//ipc_call_async_2(connections[active_client].vfb_phone, FB_PUTCHAR, ' ', arg1, NULL, (void *)NULL);
     183                                break;
    89184                        default:
    90                                 printf("%s: Unknown method: %zd\n", NAME, IPC_GET_METHOD(call));
    91185                                retval = ENOENT;
    92186                                break;
  • fb/fb.c

    rf25b73d6 r79460ae  
    127127        int vfb = vfb_no++;
    128128
    129         if (vfb > 9) {
     129        if (vfb > VFB_CONNECTIONS) {
    130130                ipc_answer_fast(iid, ELIMIT, 0,0);
    131131                return;
     
    536536       
    537537       
    538         if( (graphics_items[item_new]=malloc(sizeof(framebuffer_descriptor_t))) ==NULL)
     538        if( (graphics_items[item_new]=malloc(sizeof(framebuffer_descriptor_t))) == NULL)
    539539        {
    540540                return EFB;
  • fb/fb.h

    rf25b73d6 r79460ae  
    3333#include <arch/types.h>
    3434
     35#define VFB_CONNECTIONS 9
     36
    3537//void fb_init(int item,__address addr, unsigned int x, unsigned int y, unsigned int bpp, unsigned int scan);
    3638
  • 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
  • libc/Makefile

    rf25b73d6 r79460ae  
    3232LIBC_PREFIX = .
    3333SOFTINT_PREFIX = ../softint
     34CONSOLE_PREFIX = ../console
    3435
    3536## Setup toolchain
     
    3738
    3839include $(LIBC_PREFIX)/Makefile.toolchain
     40
     41CFLAGS += -I$(CONSOLE_PREFIX)
    3942
    4043## Sources
  • libc/generic/io/stream.c

    rf25b73d6 r79460ae  
    88#include <ipc/fb.h>
    99#include <ipc/services.h>
     10#include <console.h>
    1011
    1112#define FDS 32
     
    1718} stream_t;
    1819
    19 
    20 typedef struct vfb_descriptor_t {
    21         int phone;
    22         int vfb;
    23 } vfb_descriptor_t;
    24 
     20int console_phone = -1;
    2521
    2622stream_t streams[FDS] = {{0, 0, 0}};
     
    3329}*/
    3430
    35 static void vfb_send_char(vfb_descriptor_t *d, char c)
     31static ssize_t write_stderr(void *param, const void *buf, size_t count)
     32{
     33        return count;
     34        //return (ssize_t) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, (sysarg_t) count);
     35}
     36
     37static char read_stdin(void)
    3638{
    3739        ipcarg_t r0,r1;
    38         ipc_call_sync_2(d->phone, FB_PUTCHAR, d->vfb, c, &r0, &r1);
     40        ipc_call_sync_2(console_phone, CONSOLE_GETCHAR, 0, 0, &r0, &r1);
     41       
     42        return r0;
     43        //return (ssize_t) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, (sysarg_t) count);
    3944}
    40                                
    41 static ssize_t write_vfb(void *param, const void *buf, size_t count)
     45static ssize_t write_stdout(void *param, const void *buf, size_t count)
    4246{
    4347        int i;
     48        ipcarg_t r0,r1;
     49
    4450        for (i = 0; i < count; i++)
    45                 vfb_send_char((vfb_descriptor_t *) param, ((char *) buf)[i]);
     51                ipc_call_sync_2(console_phone, CONSOLE_PUTCHAR, 0, ((const char *)buf)[i], &r0, &r1);
    4652       
    4753        return count;
     
    5056
    5157
    52 static ssize_t write_stderr(void *param, const void *buf, size_t count)
    53 {
    54         return count;
    55         //return (ssize_t) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, (sysarg_t) count);
    56 }
    5758
    58 
    59 stream_t open_vfb(void)
     59static stream_t open_stdin(void)
    6060{
    6161        stream_t stream;
    62         vfb_descriptor_t *vfb;
    6362        int phoneid;
    6463        int res;
    65         ipcarg_t vfb_no;
    6664       
    67         while ((phoneid = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0)) < 0) {
    68                 volatile int a;
    69                
    70                 for (a = 0; a < 1048576; a++);
     65        if (console_phone < 0) {
     66                while ((console_phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) {
     67                        volatile int a;
     68                        for (a = 0; a < 1048576; a++);
     69                }
    7170        }
    7271       
    73         ipc_call_sync(phoneid, FB_GET_VFB, 0, &vfb_no);
    74         vfb = malloc(sizeof(vfb_descriptor_t));
    75        
    76         vfb->phone = phoneid;
    77         vfb->vfb = vfb_no;
    78        
    79         stream.w = write_vfb;
    80         stream.param = vfb;
     72        stream.r = read_stdin;
     73        stream.param = 0;
    8174        return stream;
    8275}
    8376
     77static stream_t open_stdout(void)
     78{
     79        stream_t stream;
     80        int res;
     81       
     82        if (console_phone < 0) {
     83                while ((console_phone = ipc_connect_me_to(PHONE_NS, SERVICE_CONSOLE, 0)) < 0) {
     84                        volatile int a;
     85                        for (a = 0; a < 1048576; a++);
     86                }
     87        }
     88       
     89        stream.w = write_stdout;
     90        stream.param = 0;
     91        return stream;
     92}
    8493
    8594fd_t open(const char *fname, int flags)
     
    93102       
    94103        if (!strcmp(fname, "stdin")) {
    95                 streams[c].r = (preadfn_t)1;
     104                streams[c] = open_stdin();
    96105                return c;
    97106        }
     
    100109                //streams[c].w = write_stdout;
    101110                //return c;
    102                 streams[c] = open_vfb();
     111                streams[c] = open_stdout();
    103112                return c;
    104113        }
  • libc/include/io/stream.h

    rf25b73d6 r79460ae  
    88
    99typedef ssize_t (*pwritefn_t)(void *, const void *, size_t);
    10 typedef ssize_t (*preadfn_t)(void);
     10typedef char (*preadfn_t)(void);
    1111
    1212fd_t open(const char *fname, int flags);
Note: See TracChangeset for help on using the changeset viewer.