Rev 1787 | Rev 1932 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1787 | Rev 1928 | ||
---|---|---|---|
Line 31... | Line 31... | ||
31 | */ |
31 | */ |
32 | /** @file |
32 | /** @file |
33 | */ |
33 | */ |
34 | 34 | ||
35 | #include <arch/drivers/cuda.h> |
35 | #include <arch/drivers/cuda.h> |
- | 36 | #include <ddi/irq.h> |
|
36 | #include <arch/asm.h> |
37 | #include <arch/asm.h> |
37 | #include <console/console.h> |
38 | #include <console/console.h> |
38 | #include <console/chardev.h> |
39 | #include <console/chardev.h> |
39 | #include <arch/drivers/pic.h> |
40 | #include <arch/drivers/pic.h> |
40 | #include <sysinfo/sysinfo.h> |
41 | #include <sysinfo/sysinfo.h> |
41 | #include <interrupt.h> |
42 | #include <interrupt.h> |
42 | #include <stdarg.h> |
43 | #include <stdarg.h> |
43 | 44 | ||
- | 45 | #define CUDA_IRQ 10 |
|
44 | #define SPECIAL '?' |
46 | #define SPECIAL '?' |
45 | 47 | ||
46 | #define PACKET_ADB 0x00 |
48 | #define PACKET_ADB 0x00 |
47 | #define PACKET_CUDA 0x01 |
49 | #define PACKET_CUDA 0x01 |
48 | 50 | ||
Line 58... | Line 60... | ||
58 | #define TACK 0x10 |
60 | #define TACK 0x10 |
59 | #define TIP 0x20 |
61 | #define TIP 0x20 |
60 | 62 | ||
61 | 63 | ||
62 | static volatile uint8_t *cuda = NULL; |
64 | static volatile uint8_t *cuda = NULL; |
- | 65 | static irq_t cuda_irq; /**< Cuda's IRQ. */ |
|
- | 66 | ||
63 | static iroutine vector; |
67 | static ipc_notif_cfg_t saved_notif_cfg; |
64 | 68 | ||
65 | 69 | ||
66 | static char lchars[0x80] = { |
70 | static char lchars[0x80] = { |
67 | 'a', |
71 | 'a', |
68 | 's', |
72 | 's', |
Line 246... | Line 250... | ||
246 | return data[2]; |
250 | return data[2]; |
247 | 251 | ||
248 | return -1; |
252 | return -1; |
249 | } |
253 | } |
250 | 254 | ||
251 | static void cuda_irq(int n, istate_t *istate) |
255 | static void cuda_irq_handler(irq_t *irq, void *arg, ...) |
252 | { |
256 | { |
- | 257 | if (irq->notif_cfg.answerbox) |
|
- | 258 | ipc_irq_send_notif(irq); |
|
- | 259 | else { |
|
253 | int scan_code = cuda_get_scancode(); |
260 | int scan_code = cuda_get_scancode(); |
254 | 261 | ||
255 | if (scan_code != -1) { |
262 | if (scan_code != -1) { |
256 | uint8_t scancode = (uint8_t) scan_code; |
263 | uint8_t scancode = (uint8_t) scan_code; |
257 | if ((scancode & 0x80) != 0x80) |
264 | if ((scancode & 0x80) != 0x80) |
258 | chardev_push_character(&kbrd, lchars[scancode & 0x7f]); |
265 | chardev_push_character(&kbrd, lchars[scancode & 0x7f]); |
- | 266 | } |
|
259 | } |
267 | } |
260 | } |
268 | } |
261 | 269 | ||
- | 270 | static irq_ownership_t cuda_claim(void) |
|
- | 271 | { |
|
- | 272 | return IRQ_ACCEPT; |
|
- | 273 | } |
|
- | 274 | ||
262 | 275 | ||
263 | /** Initialize keyboard and service interrupts using kernel routine */ |
276 | /** Initialize keyboard and service interrupts using kernel routine */ |
264 | void cuda_grab(void) |
277 | void cuda_grab(void) |
265 | { |
278 | { |
- | 279 | if (cuda_irq.notif_cfg.answerbox) { |
|
266 | vector = int_register(CUDA_IRQ, "cuda", cuda_irq); |
280 | saved_notif_cfg = cuda_irq.notif_cfg; |
- | 281 | cuda_irq.notif_cfg.answerbox = NULL; |
|
- | 282 | cuda_irq.notif_cfg.code = NULL; |
|
- | 283 | cuda_irq.notif_cfg.method = 0; |
|
- | 284 | cuda_irq.notif_cfg.counter = 0; |
|
- | 285 | } |
|
267 | } |
286 | } |
268 | 287 | ||
269 | 288 | ||
270 | /** Resume the former interrupt vector */ |
289 | /** Resume the former interrupt vector */ |
271 | void cuda_release(void) |
290 | void cuda_release(void) |
272 | { |
291 | { |
273 | if (vector) |
292 | if (saved_notif_cfg.answerbox) |
274 | int_register(CUDA_IRQ, "user_interrupt", vector); |
293 | cuda_irq.notif_cfg = saved_notif_cfg; |
275 | } |
294 | } |
276 | 295 | ||
277 | 296 | ||
278 | void cuda_init(uintptr_t base, size_t size) |
297 | void cuda_init(devno_t devno, uintptr_t base, size_t size) |
279 | { |
298 | { |
280 | cuda = (uint8_t *) hw_map(base, size); |
299 | cuda = (uint8_t *) hw_map(base, size); |
281 | - | ||
282 | int_register(CUDA_IRQ, "cuda", cuda_irq); |
- | |
283 | pic_enable_interrupt(CUDA_IRQ); |
- | |
284 | 300 | ||
285 | chardev_initialize("cuda_kbd", &kbrd, &ops); |
301 | chardev_initialize("cuda_kbd", &kbrd, &ops); |
286 | stdin = &kbrd; |
302 | stdin = &kbrd; |
287 | 303 | ||
- | 304 | irq_initialize(&cuda_irq); |
|
- | 305 | cuda_irq.devno = devno; |
|
- | 306 | cuda_irq.inr = CUDA_IRQ; |
|
- | 307 | cuda_irq.claim = cuda_claim; |
|
- | 308 | cuda_irq.handler = cuda_irq_handler; |
|
- | 309 | irq_register(&cuda_irq); |
|
- | 310 | ||
- | 311 | pic_enable_interrupt(CUDA_IRQ); |
|
- | 312 | ||
288 | sysinfo_set_item_val("cuda", NULL, true); |
313 | sysinfo_set_item_val("kbd", NULL, true); |
- | 314 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
|
289 | sysinfo_set_item_val("cuda.irq", NULL, CUDA_IRQ); |
315 | sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ); |
- | 316 | sysinfo_set_item_val("kbd.address.virtual", NULL, base); |
|
- | 317 | ||
- | 318 | cuda_grab(); |
|
290 | } |
319 | } |
291 | 320 | ||
292 | 321 | ||
293 | void send_packet(const uint8_t kind, index_t count, ...) |
322 | void send_packet(const uint8_t kind, index_t count, ...) |
294 | { |
323 | { |