Rev 3661 | Rev 3906 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3661 | Rev 3877 | ||
---|---|---|---|
Line 35... | Line 35... | ||
35 | * |
35 | * |
36 | * It takes care of low-level keyboard functions. |
36 | * It takes care of low-level keyboard functions. |
37 | */ |
37 | */ |
38 | 38 | ||
39 | #include <genarch/kbd/i8042.h> |
39 | #include <genarch/kbd/i8042.h> |
40 | #ifdef ia64 |
- | |
41 | #include <arch/drivers/kbd.h> |
40 | #include <arch/drivers/kbd.h> |
42 | #endif |
- | |
43 | #include <genarch/kbd/key.h> |
41 | #include <genarch/kbd/key.h> |
44 | #include <genarch/kbd/scanc.h> |
42 | #include <genarch/kbd/scanc.h> |
45 | #include <genarch/kbd/scanc_pc.h> |
43 | #include <genarch/kbd/scanc_pc.h> |
46 | #include <arch/drivers/i8042.h> |
44 | #include <arch/drivers/i8042.h> |
47 | #include <cpu.h> |
45 | #include <cpu.h> |
Line 169... | Line 167... | ||
169 | i8042_mouse_irq.devno = mouse_devno; |
167 | i8042_mouse_irq.devno = mouse_devno; |
170 | i8042_mouse_irq.inr = mouse_inr; |
168 | i8042_mouse_irq.inr = mouse_inr; |
171 | i8042_mouse_irq.claim = i8042_claim; |
169 | i8042_mouse_irq.claim = i8042_claim; |
172 | i8042_mouse_irq.handler = i8042_irq_handler; |
170 | i8042_mouse_irq.handler = i8042_irq_handler; |
173 | irq_register(&i8042_mouse_irq); |
171 | irq_register(&i8042_mouse_irq); |
174 | #ifndef ia64 |
172 | |
175 | trap_virtual_enable_irqs(1 << kbd_inr); |
173 | trap_virtual_enable_irqs(1 << kbd_inr); |
176 | trap_virtual_enable_irqs(1 << mouse_inr); |
174 | trap_virtual_enable_irqs(1 << mouse_inr); |
177 | #endif |
175 | |
178 | /* |
176 | /* |
179 | * Clear input buffer. |
177 | * Clear input buffer. |
180 | * Number of iterations is limited to prevent infinite looping. |
178 | * Number of iterations is limited to prevent infinite looping. |
181 | */ |
179 | */ |
182 | int i; |
180 | int i; |
Line 187... | Line 185... | ||
187 | sysinfo_set_item_val("kbd", NULL, true); |
185 | sysinfo_set_item_val("kbd", NULL, true); |
188 | sysinfo_set_item_val("kbd.devno", NULL, kbd_devno); |
186 | sysinfo_set_item_val("kbd.devno", NULL, kbd_devno); |
189 | sysinfo_set_item_val("kbd.inr", NULL, kbd_inr); |
187 | sysinfo_set_item_val("kbd.inr", NULL, kbd_inr); |
190 | #ifdef KBD_LEGACY |
188 | #ifdef KBD_LEGACY |
191 | sysinfo_set_item_val("kbd.type", NULL, KBD_LEGACY); |
189 | sysinfo_set_item_val("kbd.type", NULL, KBD_LEGACY); |
192 | #endif |
190 | #endif |
193 | sysinfo_set_item_val("mouse", NULL, true); |
191 | sysinfo_set_item_val("mouse", NULL, true); |
194 | sysinfo_set_item_val("mouse.devno", NULL, mouse_devno); |
192 | sysinfo_set_item_val("mouse.devno", NULL, mouse_devno); |
195 | sysinfo_set_item_val("mouse.inr", NULL, mouse_inr); |
193 | sysinfo_set_item_val("mouse.inr", NULL, mouse_inr); |
196 | 194 | ||
197 | i8042_grab(); |
195 | i8042_grab(); |
Line 207... | Line 205... | ||
207 | { |
205 | { |
208 | } |
206 | } |
209 | 207 | ||
210 | char i8042_key_read(chardev_t *d) |
208 | char i8042_key_read(chardev_t *d) |
211 | { |
209 | { |
212 | char ch; |
210 | char ch; |
213 | 211 | ||
214 | while(!(ch = active_read_buff_read())) { |
212 | while (!(ch = active_read_buff_read())) { |
215 | uint8_t x; |
213 | uint8_t x; |
- | 214 | ||
216 | while (!(i8042_status_read() & i8042_BUFFER_FULL_MASK)) |
215 | while (!(i8042_status_read() & i8042_BUFFER_FULL_MASK)); |
217 | ; |
216 | |
218 | x = i8042_data_read(); |
217 | x = i8042_data_read(); |
219 | if (x & KEY_RELEASE) |
218 | if (x & KEY_RELEASE) |
220 | key_released(x ^ KEY_RELEASE); |
219 | key_released(x ^ KEY_RELEASE); |
221 | else |
220 | else |
222 | active_read_key_pressed(x); |
221 | active_read_key_pressed(x); |
Line 229... | Line 228... | ||
229 | * This function can be used to implement keyboard polling. |
228 | * This function can be used to implement keyboard polling. |
230 | */ |
229 | */ |
231 | void i8042_poll(void) |
230 | void i8042_poll(void) |
232 | { |
231 | { |
233 | uint8_t x; |
232 | uint8_t x; |
234 | 233 | ||
235 | while (((x = i8042_status_read() & i8042_BUFFER_FULL_MASK))) { |
234 | while (((x = i8042_status_read() & i8042_BUFFER_FULL_MASK))) { |
236 | x = i8042_data_read(); |
235 | x = i8042_data_read(); |
237 | if (x & KEY_RELEASE) |
236 | if (x & KEY_RELEASE) |
238 | key_released(x ^ KEY_RELEASE); |
237 | key_released(x ^ KEY_RELEASE); |
239 | else |
238 | else |