source: mainline/kernel/arch/ppc32/src/drivers/cuda.c@ d0688a3

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since d0688a3 was d0688a3, checked in by Martin Decky <martin@…>, 17 years ago

bring back kernel HID on ppc32
this concludes the transition from chardev_t to indev_t and outdev_t

  • Property mode set to 100644
File size: 5.7 KB
Line 
1/*
2 * Copyright (c) 2006 Martin Decky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
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.
16 *
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.
27 */
28
29/** @addtogroup ppc32
30 * @{
31 */
32/** @file
33 */
34
35#include <arch/drivers/cuda.h>
36#include <arch/asm.h>
37#include <console/console.h>
38#include <console/chardev.h>
39#include <arch/drivers/pic.h>
40#include <sysinfo/sysinfo.h>
41#include <interrupt.h>
42#include <stdarg.h>
43
44#define CUDA_IRQ 10
45#define SPECIAL '?'
46
47#define PACKET_ADB 0x00
48#define PACKET_CUDA 0x01
49
50#define CUDA_POWERDOWN 0x0a
51#define CUDA_RESET 0x11
52
53#define RS 0x200
54#define B (0 * RS)
55#define A (1 * RS)
56#define SR (10 * RS)
57#define ACR (11 * RS)
58
59#define SR_OUT 0x10
60#define TACK 0x10
61#define TIP 0x20
62
63
64static volatile uint8_t *cuda = NULL;
65static irq_t cuda_irq; /**< Cuda's IRQ. */
66
67static char lchars[0x80] = {
68 'a',
69 's',
70 'd',
71 'f',
72 'h',
73 'g',
74 'z',
75 'x',
76 'c',
77 'v',
78 SPECIAL,
79 'b',
80 'q',
81 'w',
82 'e',
83 'r',
84 'y',
85 't',
86 '1',
87 '2',
88 '3',
89 '4',
90 '6',
91 '5',
92 '=',
93 '9',
94 '7',
95 '-',
96 '8',
97 '0',
98 ']',
99 'o',
100 'u',
101 '[',
102 'i',
103 'p',
104 '\n', /* Enter */
105 'l',
106 'j',
107 '\'',
108 'k',
109 ';',
110 '\\',
111 ',',
112 '/',
113 'n',
114 'm',
115 '.',
116 '\t', /* Tab */
117 ' ',
118 '`',
119 '\b', /* Backspace */
120 SPECIAL,
121 SPECIAL, /* Escape */
122 SPECIAL, /* Ctrl */
123 SPECIAL, /* Alt */
124 SPECIAL, /* Shift */
125 SPECIAL, /* Caps-Lock */
126 SPECIAL, /* RAlt */
127 SPECIAL, /* Left */
128 SPECIAL, /* Right */
129 SPECIAL, /* Down */
130 SPECIAL, /* Up */
131 SPECIAL,
132 SPECIAL,
133 '.', /* Keypad . */
134 SPECIAL,
135 '*', /* Keypad * */
136 SPECIAL,
137 '+', /* Keypad + */
138 SPECIAL,
139 SPECIAL, /* NumLock */
140 SPECIAL,
141 SPECIAL,
142 SPECIAL,
143 '/', /* Keypad / */
144 '\n', /* Keypad Enter */
145 SPECIAL,
146 '-', /* Keypad - */
147 SPECIAL,
148 SPECIAL,
149 SPECIAL,
150 '0', /* Keypad 0 */
151 '1', /* Keypad 1 */
152 '2', /* Keypad 2 */
153 '3', /* Keypad 3 */
154 '4', /* Keypad 4 */
155 '5', /* Keypad 5 */
156 '6', /* Keypad 6 */
157 '7', /* Keypad 7 */
158 SPECIAL,
159 '8', /* Keypad 8 */
160 '9', /* Keypad 9 */
161 SPECIAL,
162 SPECIAL,
163 SPECIAL,
164 SPECIAL, /* F5 */
165 SPECIAL, /* F6 */
166 SPECIAL, /* F7 */
167 SPECIAL, /* F3 */
168 SPECIAL, /* F8 */
169 SPECIAL, /* F9 */
170 SPECIAL,
171 SPECIAL, /* F11 */
172 SPECIAL,
173 SPECIAL, /* F13 */
174 SPECIAL,
175 SPECIAL, /* ScrollLock */
176 SPECIAL,
177 SPECIAL, /* F10 */
178 SPECIAL,
179 SPECIAL, /* F12 */
180 SPECIAL,
181 SPECIAL, /* Pause */
182 SPECIAL, /* Insert */
183 SPECIAL, /* Home */
184 SPECIAL, /* PageUp */
185 SPECIAL, /* Delete */
186 SPECIAL, /* F4 */
187 SPECIAL, /* End */
188 SPECIAL, /* F2 */
189 SPECIAL, /* PageDown */
190 SPECIAL /* F1 */
191};
192
193
194static void receive_packet(uint8_t *kind, index_t count, uint8_t data[])
195{
196 cuda[B] = cuda[B] & ~TIP;
197 *kind = cuda[SR];
198
199 index_t i;
200 for (i = 0; i < count; i++)
201 data[i] = cuda[SR];
202
203 cuda[B] = cuda[B] | TIP;
204}
205
206
207static indev_t kbrd;
208static indev_operations_t ops = {
209 .poll = NULL
210};
211
212
213int cuda_get_scancode(void)
214{
215 if (cuda) {
216 uint8_t kind;
217 uint8_t data[4];
218
219 receive_packet(&kind, 4, data);
220
221 if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c))
222 return data[2];
223 }
224
225 return -1;
226}
227
228static void cuda_irq_handler(irq_t *irq)
229{
230 int scan_code = cuda_get_scancode();
231
232 if (scan_code != -1) {
233 uint8_t scancode = (uint8_t) scan_code;
234 if ((scancode & 0x80) != 0x80)
235 indev_push_character(&kbrd, lchars[scancode & 0x7f]);
236 }
237}
238
239static irq_ownership_t cuda_claim(irq_t *irq)
240{
241 return IRQ_ACCEPT;
242}
243
244void cuda_init(devno_t devno, uintptr_t base, size_t size)
245{
246 cuda = (uint8_t *) hw_map(base, size);
247
248 indev_initialize("cuda_kbd", &kbrd, &ops);
249 stdin = &kbrd;
250
251 irq_initialize(&cuda_irq);
252 cuda_irq.devno = devno;
253 cuda_irq.inr = CUDA_IRQ;
254 cuda_irq.claim = cuda_claim;
255 cuda_irq.handler = cuda_irq_handler;
256 irq_register(&cuda_irq);
257
258 pic_enable_interrupt(CUDA_IRQ);
259
260 sysinfo_set_item_val("kbd", NULL, true);
261 sysinfo_set_item_val("kbd.devno", NULL, devno);
262 sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ);
263 sysinfo_set_item_val("kbd.address.virtual", NULL, base);
264}
265
266
267static void send_packet(const uint8_t kind, count_t count, ...)
268{
269 index_t i;
270 va_list va;
271
272 cuda[B] = cuda[B] | TIP;
273 cuda[ACR] = cuda[ACR] | SR_OUT;
274 cuda[SR] = kind;
275 cuda[B] = cuda[B] & ~TIP;
276
277 va_start(va, count);
278
279 for (i = 0; i < count; i++) {
280 cuda[ACR] = cuda[ACR] | SR_OUT;
281 cuda[SR] = va_arg(va, int);
282 cuda[B] = cuda[B] | TACK;
283 }
284
285 va_end(va);
286
287 cuda[B] = cuda[B] | TIP;
288}
289
290
291void cpu_halt(void) {
292 asm volatile (
293 "b 0\n"
294 );
295}
296
297void arch_reboot(void) {
298 if (cuda)
299 send_packet(PACKET_CUDA, 1, CUDA_RESET);
300
301 asm volatile (
302 "b 0\n"
303 );
304}
305
306/** @}
307 */
Note: See TracBrowser for help on using the repository browser.