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 <arch/kbd.h>
00038 #include <ipc/ipc.h>
00039 #include <sysinfo.h>
00040 #include <kbd.h>
00041 #include <keys.h>
00042
00043 irq_cmd_t cuda_cmds[1] = {
00044 { CMD_PPC32_GETCHAR, 0, 0, 2 }
00045 };
00046
00047 irq_code_t cuda_kbd = {
00048 1,
00049 cuda_cmds
00050 };
00051
00052
00053 #define SPECIAL 255
00054 #define FUNCTION_KEYS 0x100
00055
00056
00057 static int lchars[0x80] = {
00058 'a',
00059 's',
00060 'd',
00061 'f',
00062 'h',
00063 'g',
00064 'z',
00065 'x',
00066 'c',
00067 'v',
00068 SPECIAL,
00069 'b',
00070 'q',
00071 'w',
00072 'e',
00073 'r',
00074 'y',
00075 't',
00076 '1',
00077 '2',
00078 '3',
00079 '4',
00080 '6',
00081 '5',
00082 '=',
00083 '9',
00084 '7',
00085 '-',
00086 '8',
00087 '0',
00088 ']',
00089 'o',
00090 'u',
00091 '[',
00092 'i',
00093 'p',
00094 '\n',
00095 'l',
00096 'j',
00097 '\'',
00098 'k',
00099 ';',
00100 '\\',
00101 ',',
00102 '/',
00103 'n',
00104 'm',
00105 '.',
00106 '\t',
00107 ' ',
00108 '`',
00109 '\b',
00110 SPECIAL,
00111 SPECIAL,
00112 SPECIAL,
00113 SPECIAL,
00114 SPECIAL,
00115 SPECIAL,
00116 SPECIAL,
00117 SPECIAL,
00118 SPECIAL,
00119 SPECIAL,
00120 SPECIAL,
00121 SPECIAL,
00122 SPECIAL,
00123 '.',
00124 SPECIAL,
00125 '*',
00126 SPECIAL,
00127 '+',
00128 SPECIAL,
00129 SPECIAL,
00130 SPECIAL,
00131 SPECIAL,
00132 SPECIAL,
00133 '/',
00134 '\n',
00135 SPECIAL,
00136 '-',
00137 SPECIAL,
00138 SPECIAL,
00139 SPECIAL,
00140 '0',
00141 '1',
00142 '2',
00143 '3',
00144 '4',
00145 '5',
00146 '6',
00147 '7',
00148 SPECIAL,
00149 '8',
00150 '9',
00151 SPECIAL,
00152 SPECIAL,
00153 SPECIAL,
00154 (FUNCTION_KEYS | 5),
00155 (FUNCTION_KEYS | 6),
00156 (FUNCTION_KEYS | 7),
00157 (FUNCTION_KEYS | 3),
00158 (FUNCTION_KEYS | 8),
00159 (FUNCTION_KEYS | 9),
00160 SPECIAL,
00161 (FUNCTION_KEYS | 11),
00162 SPECIAL,
00163 (FUNCTION_KEYS | 13),
00164 SPECIAL,
00165 SPECIAL,
00166 SPECIAL,
00167 (FUNCTION_KEYS | 10),
00168 SPECIAL,
00169 (FUNCTION_KEYS | 12),
00170 SPECIAL,
00171 SPECIAL,
00172 SPECIAL,
00173 SPECIAL,
00174 SPECIAL,
00175 SPECIAL,
00176 (FUNCTION_KEYS | 4),
00177 SPECIAL,
00178 (FUNCTION_KEYS | 2),
00179 SPECIAL,
00180 (FUNCTION_KEYS | 1)
00181 };
00182
00183
00184 int kbd_arch_init(void)
00185 {
00186 return ipc_register_irq(sysinfo_value("cuda.irq"), &cuda_kbd);
00187 }
00188
00189
00190 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call)
00191 {
00192 int param = IPC_GET_ARG2(*call);
00193
00194 if (param != -1) {
00195 uint8_t scancode = (uint8_t) param;
00196
00197 if ((scancode & 0x80) != 0x80) {
00198 int key = lchars[scancode & 0x7f];
00199
00200 if (key != SPECIAL)
00201 keybuffer_push(keybuffer, key);
00202 }
00203 }
00204
00205 return 1;
00206 }
00207