(c) versus (C)
[helenos.git] / uspace / kbd / arch / ia64 / src / kbd.c
blob1db539eba4e857933fc74114082155faba0b2973
1 /*
2 * Copyright (c) 2006 Josef Cejka
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 /** @addtogroup kbdia64 ia64
30 * @brief HelenOS ia64 arch dependent parts of uspace keyboard handler.
31 * @ingroup kbd
32 * @{
33 */
34 /** @file
37 #include <arch/kbd.h>
38 #include <ipc/ipc.h>
39 #include <sysinfo.h>
40 #include <kbd.h>
41 #include <keys.h>
43 #define KEY_F1 0x504f1b
44 #define KEY_F2 0x514f1b
45 #define KEY_F3 0x524f1b
46 #define KEY_F4 0x534f1b
47 #define KEY_F5 0x7e35315b1b
48 #define KEY_F6 0x7e37315b1b
49 #define KEY_F7 0x7e38315b1b
50 #define KEY_F8 0x7e39315b1b
51 #define KEY_F9 0x7e30325b1b
52 #define KEY_F10 0x7e31325b1b
53 #define KEY_F11 0x7e33325b1b
54 #define KEY_F12 0x7e34325b1b
56 #define FUNCTION_KEYS 0x100
58 irq_cmd_t ski_cmds[1] = {
59 { CMD_IA64_GETCHAR, 0, 0, 2 }
62 irq_code_t ski_kbd = {
64 ski_cmds
67 int kbd_arch_init(void)
69 if (sysinfo_value("kbd")) {
70 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ski_kbd);
71 return 0;
73 return 1;
77 * Please preserve this code (it can be used to determine scancodes)
79 int to_hex(int v)
81 return "0123456789ABCDEF"[v];
85 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call)
87 static unsigned long long buf = 0;
88 static int count = 0;
89 static int esc_count = 0;
90 int scan_code = IPC_GET_ARG2(*call);
93 * Please preserve this code (it can be used to determine scancodes)
95 //keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf));
96 //keybuffer_push(keybuffer, to_hex(scan_code&0xf));
97 //keybuffer_push(keybuffer, ' ');
98 //keybuffer_push(keybuffer, ' ');
99 //*/
101 if (scan_code) {
102 buf |= (unsigned long long) scan_code<<(8*(count++));
103 } else {
105 if (buf == 0x1b) {
106 esc_count++;
107 if (esc_count == 3) {
108 __SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE);
110 } else {
111 esc_count = 0;
114 if (!(buf & 0xff00)) {
115 keybuffer_push(keybuffer, buf);
116 } else {
117 switch (buf) {
118 case KEY_F1:
119 keybuffer_push(keybuffer, FUNCTION_KEYS | 1);
120 break;
121 case KEY_F2:
122 keybuffer_push(keybuffer, FUNCTION_KEYS | 2);
123 break;
124 case KEY_F3:
125 keybuffer_push(keybuffer, FUNCTION_KEYS | 3);
126 break;
127 case KEY_F4:
128 keybuffer_push(keybuffer, FUNCTION_KEYS | 4);
129 break;
130 case KEY_F5:
131 keybuffer_push(keybuffer, FUNCTION_KEYS | 5);
132 break;
133 case KEY_F6:
134 keybuffer_push(keybuffer, FUNCTION_KEYS | 6);
135 break;
136 case KEY_F7:
137 keybuffer_push(keybuffer, FUNCTION_KEYS | 7);
138 break;
139 case KEY_F8:
140 keybuffer_push(keybuffer, FUNCTION_KEYS | 8);
141 break;
142 case KEY_F9:
143 keybuffer_push(keybuffer, FUNCTION_KEYS | 9);
144 break;
145 case KEY_F10:
146 keybuffer_push(keybuffer, FUNCTION_KEYS | 10);
147 break;
148 case KEY_F11:
149 keybuffer_push(keybuffer, FUNCTION_KEYS | 11);
150 break;
151 case KEY_F12:
152 keybuffer_push(keybuffer, FUNCTION_KEYS | 12);
153 break;
156 buf = count = 0;
159 return 1;
163 * @}