Rev 3958 | Rev 3981 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3958 | Rev 3963 | ||
---|---|---|---|
Line 87... | Line 87... | ||
87 | static chardev_operations_t ops = { |
87 | static chardev_operations_t ops = { |
88 | .suspend = i8042_suspend, |
88 | .suspend = i8042_suspend, |
89 | .resume = i8042_resume, |
89 | .resume = i8042_resume, |
90 | }; |
90 | }; |
91 | 91 | ||
92 | /** Structure for i8042's IRQ. */ |
- | |
93 | static irq_t i8042_kbd_irq; |
- | |
94 | static irq_t i8042_mouse_irq; |
- | |
95 | - | ||
96 | static irq_ownership_t i8042_claim(irq_t *irq) |
92 | static irq_ownership_t i8042_claim(irq_t *irq) |
97 | { |
93 | { |
98 | i8042_instance_t *i8042_instance = irq->instance; |
94 | i8042_instance_t *i8042_instance = irq->instance; |
99 | i8042_t *dev = i8042_instance->i8042; |
95 | i8042_t *dev = i8042_instance->i8042; |
100 | if (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) |
96 | if (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) |
Line 123... | Line 119... | ||
123 | key_pressed(data); |
119 | key_pressed(data); |
124 | } |
120 | } |
125 | } |
121 | } |
126 | 122 | ||
127 | /** Initialize i8042. */ |
123 | /** Initialize i8042. */ |
128 | void |
124 | bool |
129 | i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, |
125 | i8042_init(i8042_t *dev, devno_t devno, inr_t inr) |
130 | inr_t mouse_inr) |
- | |
131 | { |
126 | { |
132 | i8042_t *dev = lgcy_i8042_instance.i8042; |
127 | i8042_instance_t *instance; |
133 | 128 | ||
134 | chardev_initialize("i8042_kbd", &kbrd, &ops); |
129 | chardev_initialize("i8042_kbd", &kbrd, &ops); |
135 | stdin = &kbrd; |
130 | stdin = &kbrd; |
136 | 131 | ||
137 | irq_initialize(&i8042_kbd_irq); |
132 | instance = malloc(sizeof(i8042_instance_t), FRAME_ATOMIC); |
138 | i8042_kbd_irq.devno = kbd_devno; |
- | |
139 | i8042_kbd_irq.inr = kbd_inr; |
133 | if (!instance) |
140 | i8042_kbd_irq.claim = i8042_claim; |
- | |
141 | i8042_kbd_irq.handler = i8042_irq_handler; |
- | |
142 | i8042_kbd_irq.instance = &lgcy_i8042_instance; |
- | |
143 | irq_register(&i8042_kbd_irq); |
134 | return false; |
144 | 135 | ||
145 | irq_initialize(&i8042_mouse_irq); |
- | |
146 | i8042_mouse_irq.devno = mouse_devno; |
136 | instance->devno = devno; |
147 | i8042_mouse_irq.inr = mouse_inr; |
- | |
148 | i8042_mouse_irq.claim = i8042_claim; |
- | |
149 | i8042_mouse_irq.handler = i8042_irq_handler; |
- | |
150 | i8042_mouse_irq.instance = &lgcy_i8042_instance; |
- | |
151 | irq_register(&i8042_mouse_irq); |
137 | instance->i8042 = dev; |
152 | 138 | ||
153 | trap_virtual_enable_irqs(1 << kbd_inr); |
139 | irq_initialize(&instance->irq); |
- | 140 | instance->irq.devno = devno; |
|
- | 141 | instance->irq.inr = inr; |
|
- | 142 | instance->irq.claim = i8042_claim; |
|
- | 143 | instance->irq.handler = i8042_irq_handler; |
|
- | 144 | instance->irq.instance = instance; |
|
- | 145 | irq_register(&instance->irq); |
|
- | 146 | ||
154 | trap_virtual_enable_irqs(1 << mouse_inr); |
147 | trap_virtual_enable_irqs(1 << inr); |
155 | 148 | ||
156 | /* |
149 | /* |
157 | * Clear input buffer. |
150 | * Clear input buffer. |
158 | */ |
151 | */ |
159 | while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) |
152 | while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) |
Line 162... | Line 155... | ||
162 | /* |
155 | /* |
163 | * This is the necessary evil until the userspace driver is entirely |
156 | * This is the necessary evil until the userspace driver is entirely |
164 | * self-sufficient. |
157 | * self-sufficient. |
165 | */ |
158 | */ |
166 | sysinfo_set_item_val("kbd", NULL, true); |
159 | sysinfo_set_item_val("kbd", NULL, true); |
167 | sysinfo_set_item_val("kbd.devno", NULL, kbd_devno); |
160 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
168 | sysinfo_set_item_val("kbd.inr", NULL, kbd_inr); |
161 | sysinfo_set_item_val("kbd.inr", NULL, inr); |
169 | #ifdef KBD_LEGACY |
162 | #ifdef KBD_LEGACY |
170 | sysinfo_set_item_val("kbd.type", NULL, KBD_LEGACY); |
163 | sysinfo_set_item_val("kbd.type", NULL, KBD_LEGACY); |
171 | #endif |
164 | #endif |
- | 165 | ||
172 | sysinfo_set_item_val("mouse", NULL, true); |
166 | return true; |
173 | sysinfo_set_item_val("mouse.devno", NULL, mouse_devno); |
- | |
174 | sysinfo_set_item_val("mouse.inr", NULL, mouse_inr); |
- | |
175 | } |
167 | } |
176 | 168 | ||
177 | /* Called from getc(). */ |
169 | /* Called from getc(). */ |
178 | void i8042_resume(chardev_t *d) |
170 | void i8042_resume(chardev_t *d) |
179 | { |
171 | { |