Ignore:
File:
1 edited

Legend:

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

    r1adbf90 r137691a  
    4444#include <mm/slab.h>
    4545#include <ddi/device.h>
    46 #include <time/delay.h>
    4746
    4847#define i8042_SET_COMMAND  0x60
     
    5251#define i8042_BUFFER_FULL_MASK  0x01
    5352#define i8042_WAIT_MASK         0x02
    54 
    55 #define i8042_TIMEOUT  65536
    5653
    5754static irq_ownership_t i8042_claim(irq_t *irq)
     
    8077static void i8042_clear_buffer(i8042_t *dev)
    8178{
    82         for (uint32_t i = 0; i < i8042_TIMEOUT; i++) {
    83                 if ((pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) == 0)
    84                         break;
    85                
     79        while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK)
    8680                (void) pio_read_8(&dev->data);
    87                 delay(50);  /* 50 us think time */
    88         }
    89 }
    90 
    91 static void i8042_send_command(i8042_t *dev, uint8_t cmd)
    92 {
    93         for (uint32_t i = 0; i < i8042_TIMEOUT; i++) {
    94                 if ((pio_read_8(&dev->status) & i8042_WAIT_MASK) == 0)
    95                         break;
    96                
    97                 delay(50);  /* 50 us think time */
    98         }
    99        
    100         pio_write_8(&dev->status, cmd);
    101         delay(10000);  /* 10 ms think time */
    10281}
    10382
     
    10584i8042_instance_t *i8042_init(i8042_t *dev, inr_t inr)
    10685{
    107         i8042_instance_t *instance =
    108             malloc(sizeof(i8042_instance_t), FRAME_ATOMIC);
     86        i8042_instance_t *instance
     87            = malloc(sizeof(i8042_instance_t), FRAME_ATOMIC);
    10988        if (instance) {
    11089                instance->i8042 = dev;
     
    11796                instance->irq.handler = i8042_irq_handler;
    11897                instance->irq.instance = instance;
     98               
    11999        }
    120100       
     
    127107        ASSERT(kbrdin);
    128108       
    129         i8042_clear_buffer(instance->i8042);
    130        
    131109        instance->kbrdin = kbrdin;
    132110        irq_register(&instance->irq);
     111        i8042_clear_buffer(instance->i8042);
    133112}
    134113
     
    137116{
    138117        interrupts_disable();
     118       
    139119        i8042_clear_buffer(dev);
    140         i8042_send_command(dev, i8042_CPU_RESET);
     120       
     121        /* Reset CPU */
     122        pio_write_8(&dev->status, i8042_CPU_RESET);
    141123}
    142124
Note: See TracChangeset for help on using the changeset viewer.