Rev 3927 | Rev 3931 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3927 | Rev 3928 | ||
---|---|---|---|
Line 39... | Line 39... | ||
39 | #include <genarch/kbd/i8042.h> |
39 | #include <genarch/kbd/i8042.h> |
40 | #include <arch/drivers/kbd.h> |
40 | #include <arch/drivers/kbd.h> |
41 | #include <genarch/kbd/key.h> |
41 | #include <genarch/kbd/key.h> |
42 | #include <genarch/kbd/scanc.h> |
42 | #include <genarch/kbd/scanc.h> |
43 | #include <genarch/kbd/scanc_pc.h> |
43 | #include <genarch/kbd/scanc_pc.h> |
44 | #include <arch/drivers/i8042.h> |
- | |
45 | #include <cpu.h> |
44 | #include <cpu.h> |
46 | #include <arch/asm.h> |
45 | #include <arch/asm.h> |
47 | #include <arch.h> |
46 | #include <arch.h> |
48 | #include <console/chardev.h> |
47 | #include <console/chardev.h> |
49 | #include <console/console.h> |
48 | #include <console/console.h> |
50 | #include <interrupt.h> |
49 | #include <interrupt.h> |
51 | #include <sysinfo/sysinfo.h> |
50 | #include <sysinfo/sysinfo.h> |
52 | #include <ipc/irq.h> |
51 | #include <ipc/irq.h> |
53 | 52 | ||
- | 53 | #define i8042_DATA 0x60 |
|
- | 54 | #define i8042_STATUS 0x64 |
|
- | 55 | ||
54 | /* Keyboard commands. */ |
56 | /* Keyboard commands. */ |
55 | #define KBD_ENABLE 0xf4 |
57 | #define KBD_ENABLE 0xf4 |
56 | #define KBD_DISABLE 0xf5 |
58 | #define KBD_DISABLE 0xf5 |
57 | #define KBD_ACK 0xfa |
59 | #define KBD_ACK 0xfa |
58 | 60 | ||
Line 134... | Line 136... | ||
134 | ipc_irq_send_notif(irq); |
136 | ipc_irq_send_notif(irq); |
135 | else { |
137 | else { |
136 | uint8_t data; |
138 | uint8_t data; |
137 | uint8_t status; |
139 | uint8_t status; |
138 | 140 | ||
139 | while (((status = i8042_status_read()) & i8042_BUFFER_FULL_MASK)) { |
141 | while (((status = pio_read_8(i8042_STATUS)) & |
- | 142 | i8042_BUFFER_FULL_MASK)) { |
|
140 | data = i8042_data_read(); |
143 | data = pio_read_8(i8042_DATA); |
141 | 144 | ||
142 | if ((status & i8042_MOUSE_DATA)) |
145 | if ((status & i8042_MOUSE_DATA)) |
143 | continue; |
146 | continue; |
144 | 147 | ||
145 | if (data & KEY_RELEASE) |
148 | if (data & KEY_RELEASE) |
Line 149... | Line 152... | ||
149 | } |
152 | } |
150 | } |
153 | } |
151 | } |
154 | } |
152 | 155 | ||
153 | /** Initialize i8042. */ |
156 | /** Initialize i8042. */ |
- | 157 | void |
|
154 | void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr) |
158 | i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, |
- | 159 | inr_t mouse_inr) |
|
155 | { |
160 | { |
156 | chardev_initialize("i8042_kbd", &kbrd, &ops); |
161 | chardev_initialize("i8042_kbd", &kbrd, &ops); |
157 | stdin = &kbrd; |
162 | stdin = &kbrd; |
158 | 163 | ||
159 | irq_initialize(&i8042_kbd_irq); |
164 | irq_initialize(&i8042_kbd_irq); |
Line 176... | Line 181... | ||
176 | /* |
181 | /* |
177 | * Clear input buffer. |
182 | * Clear input buffer. |
178 | * Number of iterations is limited to prevent infinite looping. |
183 | * Number of iterations is limited to prevent infinite looping. |
179 | */ |
184 | */ |
180 | int i; |
185 | int i; |
181 | for (i = 0; (i8042_status_read() & i8042_BUFFER_FULL_MASK) && i < 100; i++) { |
186 | for (i = 0; (pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK) && |
- | 187 | i < 100; i++) { |
|
182 | i8042_data_read(); |
188 | (void) pio_read_8(i8042_DATA); |
183 | } |
189 | } |
184 | 190 | ||
185 | sysinfo_set_item_val("kbd", NULL, true); |
191 | sysinfo_set_item_val("kbd", NULL, true); |
186 | sysinfo_set_item_val("kbd.devno", NULL, kbd_devno); |
192 | sysinfo_set_item_val("kbd.devno", NULL, kbd_devno); |
187 | sysinfo_set_item_val("kbd.inr", NULL, kbd_inr); |
193 | sysinfo_set_item_val("kbd.inr", NULL, kbd_inr); |
Line 210... | Line 216... | ||
210 | char ch; |
216 | char ch; |
211 | 217 | ||
212 | while (!(ch = active_read_buff_read())) { |
218 | while (!(ch = active_read_buff_read())) { |
213 | uint8_t x; |
219 | uint8_t x; |
214 | 220 | ||
215 | while (!(i8042_status_read() & i8042_BUFFER_FULL_MASK)); |
221 | while (!(pio_read_8(i8042_STATUS) & i8042_BUFFER_FULL_MASK)) |
- | 222 | ; |
|
216 | 223 | ||
217 | x = i8042_data_read(); |
224 | x = pio_read_8(i8042_STATUS); |
218 | if (x & KEY_RELEASE) |
225 | if (x & KEY_RELEASE) |
219 | key_released(x ^ KEY_RELEASE); |
226 | key_released(x ^ KEY_RELEASE); |
220 | else |
227 | else |
221 | active_read_key_pressed(x); |
228 | active_read_key_pressed(x); |
222 | } |
229 | } |