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 <ddi.h>
00038 #include <libarch/ddi.h>
00039 #include <async.h>
00040 #include <unistd.h>
00041 #include <sysinfo.h>
00042 #include <kbd_port.h>
00043 #include <kbd.h>
00044 #include <ddi.h>
00045 #include <stdio.h>
00046 #include <errno.h>
00047
00048 #define PL050_STAT_RXFULL (1 << 4)
00049
00050 static irq_cmd_t pl050_cmds[] = {
00051 {
00052 .cmd = CMD_PIO_READ_8,
00053 .addr = NULL,
00054 .dstarg = 1
00055 },
00056 {
00057 .cmd = CMD_BTEST,
00058 .value = PL050_STAT_RXFULL,
00059 .srcarg = 1,
00060 .dstarg = 3
00061 },
00062 {
00063 .cmd = CMD_PREDICATE,
00064 .value = 2,
00065 .srcarg = 3
00066 },
00067 {
00068 .cmd = CMD_PIO_READ_8,
00069 .addr = NULL,
00070 .dstarg = 2
00071 },
00072 {
00073 .cmd = CMD_ACCEPT
00074 }
00075 };
00076
00077 static irq_code_t pl050_kbd = {
00078 sizeof(pl050_cmds) / sizeof(irq_cmd_t),
00079 pl050_cmds
00080 };
00081
00082 static void pl050_irq_handler(ipc_callid_t iid, ipc_call_t *call);
00083
00084 int kbd_port_init(void)
00085 {
00086 sysarg_t addr;
00087 if (sysinfo_get_value("kbd.address.status", &addr) != EOK)
00088 return -1;
00089
00090 pl050_kbd.cmds[0].addr = (void *) addr;
00091
00092 if (sysinfo_get_value("kbd.address.data", &addr) != EOK)
00093 return -1;
00094
00095 pl050_kbd.cmds[3].addr = (void *) addr;
00096
00097 sysarg_t inr;
00098 if (sysinfo_get_value("kbd.inr", &inr) != EOK)
00099 return -1;
00100
00101 async_set_interrupt_received(pl050_irq_handler);
00102 register_irq(inr, device_assign_devno(), 0, &pl050_kbd);
00103
00104 return 0;
00105 }
00106
00107 void kbd_port_yield(void)
00108 {
00109 }
00110
00111 void kbd_port_reclaim(void)
00112 {
00113 }
00114
00115 void kbd_port_write(uint8_t data)
00116 {
00117 (void) data;
00118 }
00119
00120 static void pl050_irq_handler(ipc_callid_t iid, ipc_call_t *call)
00121 {
00122 int scan_code = IPC_GET_ARG2(*call);
00123
00124 kbd_push_scancode(scan_code);
00125 return;
00126 }
00127