Ignore:
Timestamp:
2009-04-21T12:46:26Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f2d2c7ba
Parents:
44b7783
Message:

change the way how input devices are wired together according to ticket #44
(also the proposal http://lists.modry.cz/cgi-bin/private/helenos-devel/2009-March/002507.html)

File:
1 edited

Legend:

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

    r44b7783 rc2417bc  
    4444#define LSR_DATA_READY  0x01
    4545
    46 static indev_operations_t kbrdin_ops = {
    47         .poll = NULL
    48 };
    49 
    5046static irq_ownership_t ns16550_claim(irq_t *irq)
    5147{
     
    6561       
    6662        if (pio_read_8(&dev->lsr) & LSR_DATA_READY) {
    67                 uint8_t x = pio_read_8(&dev->rbr);
    68                 indev_push_character(&instance->kbrdin, x);
     63                uint8_t data = pio_read_8(&dev->rbr);
     64                indev_push_character(instance->kbrdin, data);
    6965        }
     66}
     67
     68/**< Clear input buffer. */
     69static void ns16550_clear_buffer(ns16550_t *dev)
     70{
     71        while ((pio_read_8(&dev->lsr) & LSR_DATA_READY))
     72                (void) pio_read_8(&dev->rbr);
    7073}
    7174
     
    7881 * @param cir_arg  First argument to cir.
    7982 *
    80  * @return Keyboard device pointer or NULL on failure.
     83 * @return Keyboard instance or NULL on failure.
    8184 *
    8285 */
    83 indev_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg)
     86ns16550_instance_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg)
    8487{
    8588        ns16550_instance_t *instance
    8689            = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC);
    87         if (!instance)
    88                 return NULL;
     90        if (instance) {
     91                instance->ns16550 = dev;
     92                instance->kbrdin = NULL;
     93               
     94                irq_initialize(&instance->irq);
     95                instance->irq.devno = device_assign_devno();
     96                instance->irq.inr = inr;
     97                instance->irq.claim = ns16550_claim;
     98                instance->irq.handler = ns16550_irq_handler;
     99                instance->irq.instance = instance;
     100                instance->irq.cir = cir;
     101                instance->irq.cir_arg = cir_arg;
     102        }
    89103       
    90         indev_initialize("ns16550", &instance->kbrdin, &kbrdin_ops);
     104        return instance;
     105}
     106
     107void ns16550_wire(ns16550_instance_t *instance, indev_t *kbrdin)
     108{
     109        ASSERT(instance);
     110        ASSERT(kbrdin);
    91111       
    92         instance->ns16550 = dev;
    93        
    94         irq_initialize(&instance->irq);
    95         instance->irq.devno = device_assign_devno();
    96         instance->irq.inr = inr;
    97         instance->irq.claim = ns16550_claim;
    98         instance->irq.handler = ns16550_irq_handler;
    99         instance->irq.instance = instance;
    100         instance->irq.cir = cir;
    101         instance->irq.cir_arg = cir_arg;
     112        instance->kbrdin = kbrdin;
    102113        irq_register(&instance->irq);
    103114       
    104         while ((pio_read_8(&dev->lsr) & LSR_DATA_READY))
    105                 (void) pio_read_8(&dev->rbr);
     115        ns16550_clear_buffer(instance->ns16550);
    106116       
    107117        /* Enable interrupts */
    108         pio_write_8(&dev->ier, IER_ERBFI);
    109         pio_write_8(&dev->mcr, MCR_OUT2);
    110        
    111         return &instance->kbrdin;
     118        pio_write_8(&instance->ns16550->ier, IER_ERBFI);
     119        pio_write_8(&instance->ns16550->mcr, MCR_OUT2);
    112120}
    113121
Note: See TracChangeset for help on using the changeset viewer.