Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hw/char/i8042/i8042.c

    r385a3d6 r7e752b2  
    4646#include <stdio.h>
    4747#include <errno.h>
     48#include <inttypes.h>
    4849
    4950#include "i8042.h"
     
    6869#define i8042_KBD_TRANSLATE     0x40
    6970
    70 /* Mouse constants */
    71 #define MOUSE_OUT_INIT  0xf4
    72 #define MOUSE_ACK       0xfa
    7371
    7472enum {
     
    148146
    149147                snprintf(name, 16, "%s/ps2%c", NAMESPACE, dchar[i]);
    150                 rc = devmap_device_register(name, &i8042_port[i].dev_handle);
     148                rc = devmap_device_register(name, &i8042_port[i].devmap_handle);
    151149                if (rc != EOK) {
    152150                        devmap_hangup_phone(DEVMAP_DRIVER);
     
    167165static int i8042_init(void)
    168166{
     167        if (sysinfo_get_value("i8042.address.physical", &i8042_physical) != EOK)
     168                return -1;
     169       
     170        if (sysinfo_get_value("i8042.address.kernel", &i8042_kernel) != EOK)
     171                return -1;
     172       
    169173        void *vaddr;
    170 
    171         i8042_physical = sysinfo_value("i8042.address.physical");
    172         i8042_kernel = sysinfo_value("i8042.address.kernel");
    173174        if (pio_enable((void *) i8042_physical, sizeof(i8042_t), &vaddr) != 0)
    174175                return -1;
     176       
    175177        i8042 = vaddr;
    176 
     178       
     179        sysarg_t inr_a;
     180        sysarg_t inr_b;
     181       
     182        if (sysinfo_get_value("i8042.inr_a", &inr_a) != EOK)
     183                return -1;
     184       
     185        if (sysinfo_get_value("i8042.inr_b", &inr_b) != EOK)
     186                return -1;
     187       
    177188        async_set_interrupt_received(i8042_irq_handler);
    178 
    179         /* Disable kbd, enable mouse */
     189       
     190        /* Disable kbd and aux */
     191        wait_ready();
    180192        pio_write_8(&i8042->status, i8042_CMD_WRITE_CMDB);
    181193        wait_ready();
    182         pio_write_8(&i8042->status, i8042_CMD_WRITE_CMDB);
    183         wait_ready();
    184         pio_write_8(&i8042->data, i8042_KBD_DISABLE);
    185         wait_ready();
     194        pio_write_8(&i8042->data, i8042_KBD_DISABLE | i8042_AUX_DISABLE);
    186195
    187196        /* Flush all current IO */
     
    189198                (void) pio_read_8(&i8042->data);
    190199
    191         i8042_port_write(DEVID_AUX, MOUSE_OUT_INIT);
    192 
    193200        i8042_kbd.cmds[0].addr = (void *) &((i8042_t *) i8042_kernel)->status;
    194201        i8042_kbd.cmds[3].addr = (void *) &((i8042_t *) i8042_kernel)->data;
    195         ipc_register_irq(sysinfo_value("i8042.inr_a"), device_assign_devno(), 0, &i8042_kbd);
    196         ipc_register_irq(sysinfo_value("i8042.inr_b"), device_assign_devno(), 0, &i8042_kbd);
    197 
     202        ipc_register_irq(inr_a, device_assign_devno(), 0, &i8042_kbd);
     203        ipc_register_irq(inr_b, device_assign_devno(), 0, &i8042_kbd);
     204        printf("%s: registered for interrupts %" PRIun " and %" PRIun "\n",
     205            NAME, inr_a, inr_b);
     206
     207        wait_ready();
    198208        pio_write_8(&i8042->status, i8042_CMD_WRITE_CMDB);
    199209        wait_ready();
    200210        pio_write_8(&i8042->data, i8042_KBD_IE | i8042_KBD_TRANSLATE |
    201211            i8042_AUX_IE);
    202         wait_ready();
    203212
    204213        return 0;
     
    211220        ipc_call_t call;
    212221        ipcarg_t method;
    213         dev_handle_t dh;
     222        devmap_handle_t dh;
    214223        int retval;
    215224        int dev_id, i;
     
    223232        dev_id = -1;
    224233        for (i = 0; i < MAX_DEVS; i++) {
    225                 if (i8042_port[i].dev_handle == dh)
     234                if (i8042_port[i].devmap_handle == dh)
    226235                        dev_id = i;
    227236        }
     
    255264                        break;
    256265                case IPC_FIRST_USER_METHOD:
    257                         printf(NAME ": write %d to devid %d\n",
     266                        printf(NAME ": write %" PRIun " to devid %d\n",
    258267                            IPC_GET_ARG1(call), dev_id);
    259268                        i8042_port_write(dev_id, IPC_GET_ARG1(call));
     
    271280{
    272281        if (devid == DEVID_AUX) {
     282                wait_ready();
    273283                pio_write_8(&i8042->status, i8042_CMD_WRITE_AUX);
    274                 wait_ready();
    275         }
     284        }
     285        wait_ready();
    276286        pio_write_8(&i8042->data, data);
    277         wait_ready();
    278287}
    279288
Note: See TracChangeset for help on using the changeset viewer.