Changeset 8513ad7 in mainline


Ignore:
Timestamp:
2006-10-17T19:18:49Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4874c2d
Parents:
e60293d
Message:

Add support for IPC notifications even for polled ns16550 based keyboard.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/sparc64/src/console.c

    re60293d r8513ad7  
    106106
    107107#ifdef CONFIG_Z8530
    108         if (kbd_type == KBD_Z8530)
     108        if (kbd_type == KBD_Z8530) {
     109                /*
     110                 * The z8530 driver is interrupt-driven.
     111                 */
    109112                return;
     113        }
    110114#endif
    111115
     
    124128void arch_grab_console(void)
    125129{
     130        switch (kbd_type) {
    126131#ifdef CONFIG_Z8530
    127         if (kbd_type == KBD_Z8530)
     132        case KBD_Z8530:
    128133                z8530_grab();
     134                break;
    129135#endif
     136#ifdef CONFIG_NS16550
     137        case KBD_NS16550:
     138                ns16550_grab();
     139                break;
     140#endif
     141        default:
     142                break;
     143        }
    130144}
    131145
     
    135149void arch_release_console(void)
    136150{
     151        switch (kbd_type) {
    137152#ifdef CONFIG_Z8530
    138         if (kbd_type == KBD_Z8530)
     153        case KBD_Z8530:
    139154                z8530_release();
     155                break;
    140156#endif
     157#ifdef CONFIG_NS16550
     158        case KBD_NS16550:
     159                ns16550_release();
     160                break;
     161#endif
     162        default:
     163                break;
     164        }
    141165}
    142166
  • kernel/genarch/src/kbd/ns16550.c

    re60293d r8513ad7  
    3939#include <genarch/kbd/scanc.h>
    4040#include <genarch/kbd/scanc_sun.h>
     41#include <arch/drivers/kbd.h>
    4142#include <arch/drivers/ns16550.h>
    4243#include <ddi/irq.h>
    43 #include <arch/interrupt.h>
     44#include <ipc/irq.h>
    4445#include <cpu.h>
    4546#include <arch/asm.h>
     
    4950#include <console/console.h>
    5051#include <interrupt.h>
     52#include <arch/interrupt.h>
    5153#include <sysinfo/sysinfo.h>
     54#include <synch/spinlock.h>
    5255
    5356#define LSR_DATA_READY  0x01
     
    5861/** Structure for ns16550's IRQ. */
    5962static irq_t ns16550_irq;
     63
     64static ipc_notif_cfg_t saved_notif_cfg;
    6065
    6166/*
     
    7378};
    7479
    75 void ns16550_interrupt(int n, istate_t *istate);
    76 void ns16550_wait(void);
     80void ns16550_interrupt(void);
    7781
    7882/** Initialize keyboard and service interrupts using kernel routine */
    7983void ns16550_grab(void)
    8084{
    81         /* TODO */
     85        ns16550_ier_write(&ns16550, IER_ERBFI);         /* enable receiver interrupt */
     86       
     87        while (ns16550_lsr_read(&ns16550) & LSR_DATA_READY)
     88                (void) ns16550_rbr_read(&ns16550);
     89
     90        if (ns16550_irq.notif_cfg.answerbox) {
     91                saved_notif_cfg = ns16550_irq.notif_cfg;
     92                ns16550_irq.notif_cfg.answerbox = NULL;
     93                ns16550_irq.notif_cfg.code = NULL;
     94                ns16550_irq.notif_cfg.method = 0;
     95                ns16550_irq.notif_cfg.counter = 0;
     96        }
    8297}
    8398
     
    85100void ns16550_release(void)
    86101{
    87         /* TODO */
     102        if (saved_notif_cfg.answerbox)
     103                ns16550_irq.notif_cfg = saved_notif_cfg;
    88104}
    89105
     
    96112void ns16550_init(devno_t devno, inr_t inr, uintptr_t vaddr)
    97113{
    98         ns16550_grab();
    99114        chardev_initialize("ns16550_kbd", &kbrd, &ops);
    100115        stdin = &kbrd;
     
    111126       
    112127        sysinfo_set_item_val("kbd", NULL, true);
     128        sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550);
    113129        sysinfo_set_item_val("kbd.devno", NULL, devno);
    114130        sysinfo_set_item_val("kbd.inr", NULL, inr);
    115131        sysinfo_set_item_val("kbd.address.virtual", NULL, vaddr);
    116132       
    117         ns16550_ier_write(&ns16550, IER_ERBFI);         /* enable receiver interrupt */
    118        
    119         while (ns16550_lsr_read(&ns16550) & LSR_DATA_READY)
    120                 (void) ns16550_rbr_read(&ns16550);
    121 }
    122 
    123 /** Process ns16550 interrupt.
    124  *
    125  * @param n Interrupt vector.
    126  * @param istate Interrupted state.
    127  */
    128 void ns16550_interrupt(int n, istate_t *istate)
    129 {
    130         /* TODO */
    131 }
    132 
    133 /** Wait until the controller reads its data. */
    134 void ns16550_wait(void)
    135 {
     133        ns16550_grab();
     134}
     135
     136/** Process ns16550 interrupt. */
     137void ns16550_interrupt(void)
     138{
     139        /* TODO
     140         *
     141         * ns16550 works in the polled mode so far.
     142         */
    136143}
    137144
     
    171178void ns16550_poll(void)
    172179{
    173         uint8_t x;
     180        ipl_t ipl;
     181
     182        ipl = interrupts_disable();
     183        spinlock_lock(&ns16550_irq.lock);
     184
     185        if (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) {
     186                if (ns16550_irq.notif_cfg.answerbox) {
     187                        /*
     188                         * Send IPC notification.
     189                         */
     190                        ipc_irq_send_notif(&ns16550_irq);
     191                        spinlock_unlock(&ns16550_irq.lock);
     192                        interrupts_restore(ipl);
     193                        return;
     194                }
     195        }
     196
     197        spinlock_unlock(&ns16550_irq.lock);
     198        interrupts_restore(ipl);
    174199
    175200        while (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) {
     201                uint8_t x;
     202               
    176203                x = ns16550_rbr_read(&ns16550);
    177204                if (x != IGNORE_CODE) {
     
    186213irq_ownership_t ns16550_claim(void)
    187214{
    188         /* TODO */
    189         return IRQ_ACCEPT;
     215        return (ns16550_lsr_read(&ns16550) & LSR_DATA_READY);
    190216}
    191217
    192218void ns16550_irq_handler(irq_t *irq, void *arg, ...)
    193219{
    194         panic("Not yet implemented.\n");
     220        panic("Not yet implemented, ns16550 works in polled mode.\n");
    195221}
    196222
  • kernel/genarch/src/kbd/z8530.c

    re60293d r8513ad7  
    125125
    126126        sysinfo_set_item_val("kbd", NULL, true);
     127        sysinfo_set_item_val("kbd.type", NULL, KBD_Z8530);
    127128        sysinfo_set_item_val("kbd.devno", NULL, devno);
    128129        sysinfo_set_item_val("kbd.inr", NULL, inr);
  • uspace/kbd/arch/sparc64/src/kbd.c

    re60293d r8513ad7  
    4747#define KBD_ALL_KEYS_UP         0x7f
    4848
     49/** Top-half pseudocode for z8530. */
    4950irq_cmd_t z8530_cmds[] = {
    50         { CMD_MEM_READ_1, 0, 0, 1 }
     51        {
     52                CMD_MEM_READ_1,
     53                0,                      /**< Address. Will be patched in run-time. */
     54                0,                      /**< Value. Not used. */
     55                1                       /**< Arg 1 will contain the result. */
     56        }
    5157};
    5258       
     
    5662};
    5763
     64/** Top-half pseudocode for ns16550. */
     65irq_cmd_t ns16550_cmds[] = {
     66        {
     67                CMD_MEM_READ_1,
     68                0,                      /**< Address. Will be patched in run-time. */
     69                0,                      /**< Value. Not used. */
     70                1                       /**< Arg 1 will contain the result. */
     71        }
     72};
     73       
     74irq_code_t ns16550_kbd = {
     75        1,
     76        ns16550_cmds
     77};
     78
     79#define KBD_Z8530       1
     80#define KBD_NS16550     2
     81
    5882int kbd_arch_init(void)
    5983{
    60         z8530_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual") + 6;
    61         ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &z8530_kbd);
     84        int type = sysinfo_value("kbd.type");
     85        switch (type) {
     86        case KBD_Z8530:
     87                z8530_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual") + 6;
     88                ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &z8530_kbd);
     89                break;
     90        case KBD_NS16550:
     91                ns16550_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual");
     92                ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ns16550_kbd);
     93                break;
     94        default:
     95                break;
     96        }
    6297        return 0;
    6398}
Note: See TracChangeset for help on using the changeset viewer.