Rev 534 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 534 | Rev 567 | ||
---|---|---|---|
Line 33... | Line 33... | ||
33 | #include <arch/cp0.h> |
33 | #include <arch/cp0.h> |
34 | #include <putchar.h> |
34 | #include <putchar.h> |
35 | #include <synch/spinlock.h> |
35 | #include <synch/spinlock.h> |
36 | #include <synch/waitq.h> |
36 | #include <synch/waitq.h> |
37 | #include <typedefs.h> |
37 | #include <typedefs.h> |
- | 38 | #include <arch/drivers/arc.h> |
|
38 | 39 | ||
39 | static void keyboard_enable(void); |
40 | static void keyboard_enable(void); |
40 | static void keyboard_disable(void); |
41 | static void keyboard_disable(void); |
- | 42 | static void arc_kb_disable(void); |
|
- | 43 | static void arc_kb_enable(void); |
|
41 | 44 | ||
42 | static chardev_t kbrd; |
45 | static chardev_t kbrd; |
- | 46 | ||
43 | static chardev_operations_t ops = { |
47 | static chardev_operations_t arc_ops = { |
- | 48 | .resume = arc_kb_enable, |
|
- | 49 | .suspend = arc_kb_disable |
|
- | 50 | }; |
|
- | 51 | ||
- | 52 | static chardev_operations_t msim_ops = { |
|
44 | .resume = keyboard_enable, |
53 | .resume = keyboard_enable, |
45 | .suspend = keyboard_disable |
54 | .suspend = keyboard_disable |
46 | }; |
55 | }; |
47 | 56 | ||
- | 57 | static int arc_kb_enabled; |
|
- | 58 | ||
48 | /** Initialize keyboard subsystem. */ |
59 | /** Initialize keyboard subsystem. */ |
49 | void keyboard_init(void) |
60 | void keyboard_init(void) |
50 | { |
61 | { |
- | 62 | if (arc_enabled()) { |
|
- | 63 | chardev_initialize(&kbrd, &arc_ops); |
|
- | 64 | arc_kb_enabled = 1; |
|
- | 65 | } else { |
|
51 | cp0_unmask_int(KEYBOARD_IRQ); |
66 | cp0_unmask_int(KEYBOARD_IRQ); |
52 | chardev_initialize(&kbrd, &ops); |
67 | chardev_initialize(&kbrd, &msim_ops); |
- | 68 | } |
|
53 | stdin = &kbrd; |
69 | stdin = &kbrd; |
54 | } |
70 | } |
55 | 71 | ||
56 | /** Process keyboard interrupt. */ |
72 | /** Process keyboard interrupt. */ |
57 | void keyboard(void) |
73 | void keyboard(void) |
Line 71... | Line 87... | ||
71 | /* Called from getc(). */ |
87 | /* Called from getc(). */ |
72 | void keyboard_disable(void) |
88 | void keyboard_disable(void) |
73 | { |
89 | { |
74 | cp0_mask_int(KEYBOARD_IRQ); |
90 | cp0_mask_int(KEYBOARD_IRQ); |
75 | } |
91 | } |
- | 92 | ||
- | 93 | /*****************************/ |
|
- | 94 | /* Arc keyboard */ |
|
- | 95 | ||
- | 96 | void keyboard_poll(void) |
|
- | 97 | { |
|
- | 98 | int ch; |
|
- | 99 | ||
- | 100 | if (!arc_enabled() || !arc_kb_enabled) |
|
- | 101 | return; |
|
- | 102 | while ((ch = arc_getchar()) != -1) |
|
- | 103 | chardev_push_character(&kbrd, ch); |
|
- | 104 | } |
|
- | 105 | ||
- | 106 | static void arc_kb_enable(void) |
|
- | 107 | { |
|
- | 108 | arc_kb_enabled = 1; |
|
- | 109 | } |
|
- | 110 | ||
- | 111 | /* Called from getc(). */ |
|
- | 112 | static void arc_kb_disable(void) |
|
- | 113 | { |
|
- | 114 | arc_kb_enabled = 0; |
|
- | 115 | } |