00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00037 #include <async.h>
00038 #include <sysinfo.h>
00039 #include <kbd_port.h>
00040 #include <kbd.h>
00041 #include <ddi.h>
00042 #include <errno.h>
00043
00044 irq_cmd_t msim_cmds[] = {
00045 {
00046 .cmd = CMD_PIO_READ_8,
00047 .addr = (void *) 0,
00048 .dstarg = 2
00049 },
00050 {
00051 .cmd = CMD_ACCEPT
00052 }
00053
00054 };
00055
00056 irq_code_t msim_kbd = {
00057 sizeof(msim_cmds) / sizeof(irq_cmd_t),
00058 msim_cmds
00059 };
00060
00061 static void msim_irq_handler(ipc_callid_t iid, ipc_call_t *call);
00062
00063 int kbd_port_init(void)
00064 {
00065 sysarg_t vaddr;
00066 if (sysinfo_get_value("kbd.address.virtual", &vaddr) != EOK)
00067 return -1;
00068
00069 sysarg_t inr;
00070 if (sysinfo_get_value("kbd.inr", &inr) != EOK)
00071 return -1;
00072
00073 msim_cmds[0].addr = (void *) vaddr;
00074 async_set_interrupt_received(msim_irq_handler);
00075 register_irq(inr, device_assign_devno(), 0, &msim_kbd);
00076
00077 return 0;
00078 }
00079
00080 void kbd_port_yield(void)
00081 {
00082 }
00083
00084 void kbd_port_reclaim(void)
00085 {
00086 }
00087
00088 void kbd_port_write(uint8_t data)
00089 {
00090 (void) data;
00091 }
00092
00093 static void msim_irq_handler(ipc_callid_t iid, ipc_call_t *call)
00094 {
00095 int scan_code = IPC_GET_ARG2(*call);
00096 kbd_push_scancode(scan_code);
00097 }
00098