Ignore:
Timestamp:
2009-03-12T17:54:24Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3a1c048
Parents:
a0e1b48
Message:

update for the new scheme of wiring device drivers to keyboard/serial modules

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/drivers/ns16550/ns16550.c

    ra0e1b48 r3c79afe  
    2727 */
    2828
    29 /** @addtogroup genarch 
     29/** @addtogroup genarch
    3030 * @{
    3131 */
    3232/**
    3333 * @file
    34  * @brief       NS 16550 serial controller driver.
     34 * @brief NS 16550 serial controller driver.
    3535 */
    3636
     
    4141#include <mm/slab.h>
    4242
    43 #define LSR_DATA_READY  0x01
     43#define LSR_DATA_READY  0x01
     44
     45indev_operations_t kbrdin_ops = {
     46        .poll = NULL
     47};
     48
     49static irq_ownership_t ns16550_claim(irq_t *irq)
     50{
     51        ns16550_instance_t *instance = irq->instance;
     52        ns16550_t *dev = instance->ns16550;
     53       
     54        if (pio_read_8(&dev->lsr) & LSR_DATA_READY)
     55                return IRQ_ACCEPT;
     56        else
     57                return IRQ_DECLINE;
     58}
     59
     60static void ns16550_irq_handler(irq_t *irq)
     61{
     62        ns16550_instance_t *instance = irq->instance;
     63        ns16550_t *dev = instance->ns16550;
     64       
     65        if (pio_read_8(&dev->lsr) & LSR_DATA_READY) {
     66                uint8_t x = pio_read_8(&dev->rbr);
     67                chardev_push_character(&instance->kbrdin, x);
     68        }
     69}
    4470
    4571/** Initialize ns16550.
    4672 *
    47  * @param dev           Addrress of the beginning of the device in I/O space.
    48  * @param devno         Device number.
    49  * @param inr           Interrupt number.
    50  * @param cir           Clear interrupt function.
    51  * @param cir_arg       First argument to cir.
    52  * @param devout        Output character device.
     73 * @param dev      Addrress of the beginning of the device in I/O space.
     74 * @param devno    Device number.
     75 * @param inr      Interrupt number.
     76 * @param cir      Clear interrupt function.
     77 * @param cir_arg  First argument to cir.
    5378 *
    54  * @return              True on success, false on failure.
     79 * @return Keyboard device pointer or NULL on failure.
     80 *
    5581 */
    56 bool
    57 ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg,
    58     chardev_t *devout)
     82indev_t *ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg)
    5983{
    60         ns16550_instance_t *instance;
     84        ns16550_instance_t *instance
     85            = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC);
     86        if (!instance)
     87                return NULL;
    6188       
    62         instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC);
    63         if (!instance)
    64                 return false;
    65 
     89        indev_initialize("ns16550", &instance->kbrdin, &kbrdin_ops);
     90       
    6691        instance->devno = devno;
    6792        instance->ns16550 = dev;
    68         instance->devout = devout;
    6993       
    7094        irq_initialize(&instance->irq);
     
    77101        instance->irq.cir_arg = cir_arg;
    78102        irq_register(&instance->irq);
    79 
     103       
    80104        while ((pio_read_8(&dev->lsr) & LSR_DATA_READY))
    81105                (void) pio_read_8(&dev->rbr);
     
    85109        pio_write_8(&dev->mcr, MCR_OUT2);
    86110       
    87         return true;
    88 }
    89 
    90 irq_ownership_t ns16550_claim(irq_t *irq)
    91 {
    92         ns16550_instance_t *instance = irq->instance;
    93         ns16550_t *dev = instance->ns16550;
    94 
    95         if (pio_read_8(&dev->lsr) & LSR_DATA_READY)
    96                 return IRQ_ACCEPT;
    97         else
    98                 return IRQ_DECLINE;
    99 }
    100 
    101 void ns16550_irq_handler(irq_t *irq)
    102 {
    103         ns16550_instance_t *instance = irq->instance;
    104         ns16550_t *dev = instance->ns16550;
    105 
    106         if (pio_read_8(&dev->lsr) & LSR_DATA_READY) {
    107                 uint8_t x;
    108                
    109                 x = pio_read_8(&dev->rbr);
    110                 if (instance->devout)
    111                         chardev_push_character(instance->devout, x);
    112         }
     111        return &instance->kbrdin;
    113112}
    114113
Note: See TracChangeset for help on using the changeset viewer.