Ignore:
Timestamp:
2009-04-21T12:46:26Z (15 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/i8042/i8042.c

    r44b7783 rc2417bc  
    4545#include <ddi/device.h>
    4646
    47 static indev_operations_t kbrdin_ops = {
    48         .poll = NULL
    49 };
    50 
    5147#define i8042_SET_COMMAND  0x60
    5248#define i8042_COMMAND      0x69
     
    7571        if (((status = pio_read_8(&dev->status)) & i8042_BUFFER_FULL_MASK)) {
    7672                uint8_t data = pio_read_8(&dev->data);
    77                 indev_push_character(&instance->kbrdin, data);
     73                indev_push_character(instance->kbrdin, data);
    7874        }
    7975}
    8076
     77/**< Clear input buffer. */
     78static void i8042_clear_buffer(i8042_t *dev)
     79{
     80        while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
     81                (void) pio_read_8(&dev->data);
     82}
     83
    8184/** Initialize i8042. */
    82 indev_t *i8042_init(i8042_t *dev, inr_t inr)
     85i8042_instance_t *i8042_init(i8042_t *dev, inr_t inr)
    8386{
    8487        i8042_instance_t *instance
    8588            = malloc(sizeof(i8042_instance_t), FRAME_ATOMIC);
    86         if (!instance)
    87                 return NULL;
     89        if (instance) {
     90                instance->i8042 = dev;
     91                instance->kbrdin = NULL;
     92               
     93                irq_initialize(&instance->irq);
     94                instance->irq.devno = device_assign_devno();
     95                instance->irq.inr = inr;
     96                instance->irq.claim = i8042_claim;
     97                instance->irq.handler = i8042_irq_handler;
     98                instance->irq.instance = instance;
     99               
     100        }
    88101       
    89         indev_initialize("i8042", &instance->kbrdin, &kbrdin_ops);
     102        return instance;
     103}
     104
     105void i8042_wire(i8042_instance_t *instance, indev_t *kbrdin)
     106{
     107        ASSERT(instance);
     108        ASSERT(kbrdin);
    90109       
    91         instance->i8042 = dev;
    92        
    93         irq_initialize(&instance->irq);
    94         instance->irq.devno = device_assign_devno();
    95         instance->irq.inr = inr;
    96         instance->irq.claim = i8042_claim;
    97         instance->irq.handler = i8042_irq_handler;
    98         instance->irq.instance = instance;
     110        instance->kbrdin = kbrdin;
    99111        irq_register(&instance->irq);
    100        
    101         /* Clear input buffer */
    102         while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
    103                 (void) pio_read_8(&dev->data);
    104        
    105         return &instance->kbrdin;
     112        i8042_clear_buffer(instance->i8042);
    106113}
    107114
     
    111118        interrupts_disable();
    112119       
    113         /* Clear input buffer */
    114         while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
    115                 (void) pio_read_8(&dev->data);
     120        i8042_clear_buffer(dev);
    116121       
    117122        /* Reset CPU */
Note: See TracChangeset for help on using the changeset viewer.