Changeset 2677758 in mainline


Ignore:
Timestamp:
2005-11-22T23:44:38Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
607c5f9
Parents:
a7fdfe1
Message:

Add chardev_t.
This type is meant to abstract any input character device such as keyboard, serial port etc.
Add stdin.
Add dummy kconsole.

Files:
6 added
6 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    ra7fdfe1 r2677758  
    9494
    9595GENERIC_SOURCES = \
     96        generic/src/console/chardev.c \
     97        generic/src/console/console.c \
    9698        generic/src/cpu/cpu.c \
    9799        generic/src/main/main.c \
     100        generic/src/main/kconsole.c \
    98101        generic/src/main/kinit.c \
    99102        generic/src/main/uinit.c \
  • arch/mips32/src/drivers/keyboard.c

    ra7fdfe1 r2677758  
    11/*
     2 * Copyright (C) 2003 Josef Cejka
    23 * Copyright (C) 2005 Jakub Jermar
    34 * All rights reserved.
     
    2829
    2930#include <arch/drivers/keyboard.h>
     31#include <console/chardev.h>
     32#include <console/console.h>
    3033#include <arch/cp0.h>
    3134#include <putchar.h>
     35#include <synch/spinlock.h>
     36#include <synch/waitq.h>
     37#include <typedefs.h>
    3238
     39static chardev_t kbrd;
     40
     41static void keyboard_enable(void);
     42
     43/** Initialize keyboard subsystem. */
    3344void keyboard_init(void)
    3445{
    35         /* unmask keyboard interrupt */
     46        cp0_unmask_int(KEYBOARD_IRQ);
     47        chardev_initialize(&kbrd, keyboard_enable);
     48        stdin = &kbrd;
     49}
     50
     51/** Process keyboard interrupt.
     52 *
     53 * This function is called directly from the interrupt handler.
     54 * It feeds the keyboard buffer with characters read. When the buffer
     55 * is full, it simply masks the keyboard interrupt signal.
     56 */
     57void keyboard(void)
     58{
     59        char ch;
     60
     61        spinlock_lock(&kbrd.lock);
     62        kbrd.counter++;
     63        if (kbrd.counter == CHARDEV_BUFLEN - 1) {
     64                /* buffer full => disable keyboard interrupt */
     65                cp0_mask_int(KEYBOARD_IRQ);
     66        }
     67
     68        ch = *((char *) KEYBOARD_ADDRESS);
     69        putchar(ch);
     70        kbrd.buffer[kbrd.index++] = ch;
     71        kbrd.index = kbrd.index % CHARDEV_BUFLEN; /* index modulo size of buffer */
     72        waitq_wakeup(&kbrd.wq, WAKEUP_FIRST);
     73        spinlock_unlock(&kbrd.lock);
     74}
     75
     76/* Called from getc(). */
     77void keyboard_enable(void)
     78{
    3679        cp0_unmask_int(KEYBOARD_IRQ);
    3780}
    38 
    39 void keyboard(void)
    40 {
    41         putchar(*((char *) KEYBOARD_ADDRESS));
    42 }
  • arch/mips32/src/mips32.c

    ra7fdfe1 r2677758  
    3838#include <arch/interrupt.h>
    3939#include <arch/drivers/arc.h>
     40#include <arch/drivers/keyboard.h>
    4041#include <proc/thread.h>
    4142#include <print.h>
     
    8384
    8485        console_init();
     86        keyboard_init();
    8587        arc_print_memory_map();
    8688        arc_print_devices();
  • generic/include/typedefs.h

    ra7fdfe1 r2677758  
    8080typedef struct the the_t;
    8181
     82typedef struct chardev chardev_t;
     83
    8284#endif
  • generic/src/main/kinit.c

    ra7fdfe1 r2677758  
    2727 */
    2828
     29#include <main/kinit.h>
     30#include <main/kconsole.h>
     31#include <main/uinit.h>
    2932#include <config.h>
    3033#include <arch.h>
    31 #include <main/kinit.h>
    32 #include <main/uinit.h>
    3334#include <proc/scheduler.h>
    3435#include <proc/task.h>
     
    8384                        waitq_sleep(&kmp_completion_wq);
    8485                }
    85                 else panic("thread_create/kmp");
     86                else panic("thread_create/kmp\n");
    8687        }
    8788#endif /* CONFIG_SMP */
     
    110111                                thread_ready(t);
    111112                        }
    112                         else panic("thread_create/kcpulb");
     113                        else panic("thread_create/kcpulb\n");
    113114
    114115                }
    115116        }
    116117#endif /* CONFIG_SMP */
     118
     119        /*
     120         * Create kernel console.
     121         */
     122        if (t = thread_create(kconsole, NULL, TASK, 0))
     123                thread_ready(t);
     124        else panic("thread_create/kconsole\n");
    117125
    118126        interrupts_enable();
     
    124132        m = vm_create(NULL);
    125133        if (!m)
    126                 panic("vm_create");
     134                panic("vm_create\n");
    127135        u = task_create(m);
    128136        if (!u)
    129                 panic("task_create");
     137                panic("task_create\n");
    130138        t = thread_create(uinit, NULL, u, THREAD_USER_STACK);
    131139        if (!t)
    132                 panic("thread_create");
     140                panic("thread_create\n");
    133141
    134142        /*
     
    137145        a = vm_area_create(m, VMA_TEXT, 1, UTEXT_ADDRESS);
    138146        if (!a)
    139                 panic("vm_area_create: vm_text");
     147                panic("vm_area_create: vm_text\n");
    140148        vm_area_map(a, m);
    141149        memcpy((void *) PA2KA(a->mapping[0]), (void *) utext, utext_size < PAGE_SIZE ? utext_size : PAGE_SIZE);
     
    146154        a = vm_area_create(m, VMA_STACK, 1, USTACK_ADDRESS);
    147155        if (!a)
    148                 panic("vm_area_create: vm_stack");
     156                panic("vm_area_create: vm_stack\n");
    149157        vm_area_map(a, m);     
    150158       
     
    156164#endif /* CONFIG_TEST */
    157165
    158 
    159166        while (1) {
    160167                thread_sleep(60);
  • generic/src/main/main.c

    ra7fdfe1 r2677758  
    7171        char *revision = "";
    7272#endif
    73 char *copyright = "Copyright (C) 2001-2005 Jakub Jermar\nCopyright (C) 2005 HelenOS project";
     73char *copyright = "Copyright (C) 2001-2005 HelenOS project";
    7474
    7575config_t config;
Note: See TracChangeset for help on using the changeset viewer.