Changeset 4544884 in mainline


Ignore:
Timestamp:
2009-02-19T22:04:20Z (15 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
91825d90
Parents:
5cb223f
Message:

Improve the i8042 kernel driver (phase I).

  • Convert the code to be instance-aware
  • Still using hardcoded initialization from legacy IO address
  • Use elegant i8042 register map for PIO
Location:
kernel/genarch
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/include/kbd/i8042.h

    r5cb223f r4544884  
    3939#include <console/chardev.h>
    4040
     41struct i8042 {
     42        ioport8_t data;
     43        uint8_t pad[3];
     44        ioport8_t status;
     45} __attribute__ ((packed));
     46typedef struct i8042 i8042_t;
     47
     48typedef struct i8042_instance {
     49        i8042_t *i8042;
     50} i8042_instance_t;
     51
    4152extern void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr);
    4253extern void i8042_grab(void);
  • kernel/genarch/src/kbd/i8042.c

    r5cb223f r4544884  
    5151#include <ipc/irq.h>
    5252
    53 #define i8042_DATA      0x60
    54 #define i8042_STATUS    0x64
     53i8042_instance_t lgcy_i8042_instance = {
     54        .i8042 = (i8042_t *) 0x60,
     55};
    5556
    5657/* Keyboard commands. */
     
    128129static irq_ownership_t i8042_claim(void *instance)
    129130{
    130         return IRQ_ACCEPT;
     131        i8042_instance_t *i8042_instance = instance;
     132        i8042_t *dev = i8042_instance->i8042;
     133        if (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
     134                return IRQ_ACCEPT;
     135        else
     136                return IRQ_DECLINE;
    131137}
    132138
    133139static void i8042_irq_handler(irq_t *irq)
    134140{
    135         if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
     141        if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) {
     142                /*
     143                 * This will hopefully go to the IRQ dispatcher code soon.
     144                 */
    136145                ipc_irq_send_notif(irq);
    137         else {
    138                 uint8_t data;
    139                 uint8_t status;
     146                return;
     147        }
     148
     149        i8042_instance_t *instance = irq->instance;
     150        i8042_t *dev = instance->i8042;
     151
     152        uint8_t data;
     153        uint8_t status;
    140154               
    141                 while (((status = pio_read_8(i8042_STATUS)) &
    142                     i8042_BUFFER_FULL_MASK)) {
    143                         data = pio_read_8(i8042_DATA);
     155        if (((status = pio_read_8(&dev->status)) & i8042_BUFFER_FULL_MASK)) {
     156                data = pio_read_8(&dev->data);
    144157                       
    145                         if ((status & i8042_MOUSE_DATA))
    146                                 continue;
    147 
    148                         if (data & KEY_RELEASE)
    149                                 key_released(data ^ KEY_RELEASE);
    150                         else
    151                                 key_pressed(data);
    152                 }
     158                if ((status & i8042_MOUSE_DATA))
     159                        return;
     160
     161                if (data & KEY_RELEASE)
     162                        key_released(data ^ KEY_RELEASE);
     163                else
     164                        key_pressed(data);
    153165        }
    154166}
     
    159171    inr_t mouse_inr)
    160172{
     173        i8042_t *dev = lgcy_i8042_instance.i8042;
     174
    161175        chardev_initialize("i8042_kbd", &kbrd, &ops);
    162176        stdin = &kbrd;
     
    167181        i8042_kbd_irq.claim = i8042_claim;
    168182        i8042_kbd_irq.handler = i8042_irq_handler;
     183        i8042_kbd_irq.instance = &lgcy_i8042_instance;
    169184        irq_register(&i8042_kbd_irq);
    170185       
     
    174189        i8042_mouse_irq.claim = i8042_claim;
    175190        i8042_mouse_irq.handler = i8042_irq_handler;
     191        i8042_mouse_irq.instance = &lgcy_i8042_instance;
    176192        irq_register(&i8042_mouse_irq);
    177193       
     
    184200         */
    185201        int i;
    186         for (i = 0; (pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK) &&
     202        for (i = 0; (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) &&
    187203            i < 100; i++) {
    188                 (void) pio_read_8(i8042_DATA);
     204                (void) pio_read_8(&dev->data);
    189205        }
    190206       
     
    214230char i8042_key_read(chardev_t *d)
    215231{
     232        i8042_t *dev = lgcy_i8042_instance.i8042;
    216233        char ch;
    217234       
     
    219236                uint8_t x;
    220237               
    221                 while (!(pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK))
     238                while (!(pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK))
    222239                        ;
    223240               
    224                 x = pio_read_8(i8042_STATUS);
     241                x = pio_read_8(&dev->data);
    225242                if (x & KEY_RELEASE)
    226243                        key_released(x ^ KEY_RELEASE);
Note: See TracChangeset for help on using the changeset viewer.