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 static irq_cmd_t gxemul_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 static irq_code_t gxemul_kbd = {
00056 sizeof(gxemul_cmds) / sizeof(irq_cmd_t),
00057 gxemul_cmds
00058 };
00059
00060 static void gxemul_irq_handler(ipc_callid_t iid, ipc_call_t *call);
00061
00063 int kbd_port_init(void)
00064 {
00065 sysarg_t addr;
00066 if (sysinfo_get_value("kbd.address.virtual", &addr) != EOK)
00067 return -1;
00068
00069 sysarg_t inr;
00070 if (sysinfo_get_value("kbd.inr", &inr) != EOK)
00071 return -1;
00072
00073 async_set_interrupt_received(gxemul_irq_handler);
00074 gxemul_cmds[0].addr = (void *) addr;
00075 register_irq(inr, device_assign_devno(), 0, &gxemul_kbd);
00076 return 0;
00077 }
00078
00079 void kbd_port_yield(void)
00080 {
00081 }
00082
00083 void kbd_port_reclaim(void)
00084 {
00085 }
00086
00087 void kbd_port_write(uint8_t data)
00088 {
00089 (void) data;
00090 }
00091
00099 static void gxemul_irq_handler(ipc_callid_t iid, ipc_call_t *call)
00100 {
00101 int scan_code = IPC_GET_ARG2(*call);
00102
00103 kbd_push_scancode(scan_code);
00104 }
00105