Rev 3022 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3022 | Rev 4055 | ||
---|---|---|---|
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 <ipc/irq.h> |
- | |
37 | #include <arch/asm.h> |
36 | #include <arch/asm.h> |
38 | #include <console/console.h> |
37 | #include <console/console.h> |
39 | #include <console/chardev.h> |
38 | #include <console/chardev.h> |
40 | #include <arch/drivers/pic.h> |
39 | #include <arch/drivers/pic.h> |
41 | #include <sysinfo/sysinfo.h> |
40 | #include <sysinfo/sysinfo.h> |
Line 234... | Line 233... | ||
234 | }; |
233 | }; |
235 | 234 | ||
236 | 235 | ||
237 | int cuda_get_scancode(void) |
236 | int cuda_get_scancode(void) |
238 | { |
237 | { |
- | 238 | if (cuda) { |
|
239 | uint8_t kind; |
239 | uint8_t kind; |
240 | uint8_t data[4]; |
240 | uint8_t data[4]; |
241 | 241 | ||
242 | receive_packet(&kind, 4, data); |
242 | receive_packet(&kind, 4, data); |
243 | 243 | ||
244 | if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c)) |
244 | if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c)) |
245 | return data[2]; |
245 | return data[2]; |
- | 246 | } |
|
246 | 247 | ||
247 | return -1; |
248 | return -1; |
248 | } |
249 | } |
249 | 250 | ||
250 | static void cuda_irq_handler(irq_t *irq, void *arg, ...) |
251 | static void cuda_irq_handler(irq_t *irq) |
251 | { |
252 | { |
252 | if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) |
- | |
253 | ipc_irq_send_notif(irq); |
- | |
254 | else { |
- | |
255 | int scan_code = cuda_get_scancode(); |
253 | int scan_code = cuda_get_scancode(); |
256 | 254 | ||
257 | if (scan_code != -1) { |
255 | if (scan_code != -1) { |
258 | uint8_t scancode = (uint8_t) scan_code; |
256 | uint8_t scancode = (uint8_t) scan_code; |
259 | if ((scancode & 0x80) != 0x80) |
257 | if ((scancode & 0x80) != 0x80) |
260 | chardev_push_character(&kbrd, lchars[scancode & 0x7f]); |
258 | chardev_push_character(&kbrd, lchars[scancode & 0x7f]); |
261 | } |
- | |
262 | } |
259 | } |
263 | } |
260 | } |
264 | 261 | ||
265 | static irq_ownership_t cuda_claim(void) |
262 | static irq_ownership_t cuda_claim(irq_t *irq) |
266 | { |
263 | { |
267 | return IRQ_ACCEPT; |
264 | return IRQ_ACCEPT; |
268 | } |
265 | } |
269 | 266 | ||
270 | - | ||
271 | /** Initialize keyboard and service interrupts using kernel routine */ |
- | |
272 | void cuda_grab(void) |
- | |
273 | { |
- | |
274 | ipl_t ipl = interrupts_disable(); |
- | |
275 | spinlock_lock(&cuda_irq.lock); |
- | |
276 | cuda_irq.notif_cfg.notify = false; |
- | |
277 | spinlock_unlock(&cuda_irq.lock); |
- | |
278 | interrupts_restore(ipl); |
- | |
279 | } |
- | |
280 | - | ||
281 | - | ||
282 | /** Resume the former interrupt vector */ |
- | |
283 | void cuda_release(void) |
- | |
284 | { |
- | |
285 | ipl_t ipl = interrupts_disable(); |
- | |
286 | spinlock_lock(&cuda_irq.lock); |
- | |
287 | if (cuda_irq.notif_cfg.answerbox) |
- | |
288 | cuda_irq.notif_cfg.notify = true; |
- | |
289 | spinlock_unlock(&cuda_irq.unlock); |
- | |
290 | interrupts_restore(ipl); |
- | |
291 | } |
- | |
292 | - | ||
293 | - | ||
294 | void cuda_init(devno_t devno, uintptr_t base, size_t size) |
267 | void cuda_init(devno_t devno, uintptr_t base, size_t size) |
295 | { |
268 | { |
296 | cuda = (uint8_t *) hw_map(base, size); |
269 | cuda = (uint8_t *) hw_map(base, size); |
297 | 270 | ||
298 | chardev_initialize("cuda_kbd", &kbrd, &ops); |
271 | chardev_initialize("cuda_kbd", &kbrd, &ops); |
299 | stdin = &kbrd; |
272 | stdin = &kbrd; |
300 | 273 | ||
301 | irq_initialize(&cuda_irq); |
274 | irq_initialize(&cuda_irq); |
Line 304... | Line 277... | ||
304 | cuda_irq.claim = cuda_claim; |
277 | cuda_irq.claim = cuda_claim; |
305 | cuda_irq.handler = cuda_irq_handler; |
278 | cuda_irq.handler = cuda_irq_handler; |
306 | irq_register(&cuda_irq); |
279 | irq_register(&cuda_irq); |
307 | 280 | ||
308 | pic_enable_interrupt(CUDA_IRQ); |
281 | pic_enable_interrupt(CUDA_IRQ); |
309 | 282 | ||
310 | sysinfo_set_item_val("kbd", NULL, true); |
283 | sysinfo_set_item_val("kbd", NULL, true); |
311 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
284 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
312 | sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ); |
285 | sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ); |
313 | sysinfo_set_item_val("kbd.address.virtual", NULL, base); |
286 | sysinfo_set_item_val("kbd.address.virtual", NULL, base); |
314 | } |
287 | } |
Line 343... | Line 316... | ||
343 | "b 0\n" |
316 | "b 0\n" |
344 | ); |
317 | ); |
345 | } |
318 | } |
346 | 319 | ||
347 | void arch_reboot(void) { |
320 | void arch_reboot(void) { |
- | 321 | if (cuda) |
|
348 | send_packet(PACKET_CUDA, 1, CUDA_RESET); |
322 | send_packet(PACKET_CUDA, 1, CUDA_RESET); |
- | 323 | ||
349 | asm volatile ( |
324 | asm volatile ( |
350 | "b 0\n" |
325 | "b 0\n" |
351 | ); |
326 | ); |
352 | } |
327 | } |
353 | 328 |