Commit b7678d96c52b5e902283e538007e7b8e001dbc19
1 parent
5867c88a
PS/2 interface - Allow custom IO ports + IRQ, by Herve Poussineau.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2431 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
23 additions
and
12 deletions
hw/pckbd.c
... | ... | @@ -121,6 +121,9 @@ typedef struct KBDState { |
121 | 121 | uint8_t pending; |
122 | 122 | void *kbd; |
123 | 123 | void *mouse; |
124 | + | |
125 | + int irq_kbd; | |
126 | + int irq_mouse; | |
124 | 127 | } KBDState; |
125 | 128 | |
126 | 129 | KBDState kbd_state; |
... | ... | @@ -130,10 +133,10 @@ KBDState kbd_state; |
130 | 133 | incorrect, but it avoids having to simulate exact delays */ |
131 | 134 | static void kbd_update_irq(KBDState *s) |
132 | 135 | { |
133 | - int irq12_level, irq1_level; | |
136 | + int irq_kbd_level, irq_mouse_level; | |
134 | 137 | |
135 | - irq1_level = 0; | |
136 | - irq12_level = 0; | |
138 | + irq_kbd_level = 0; | |
139 | + irq_mouse_level = 0; | |
137 | 140 | s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); |
138 | 141 | if (s->pending) { |
139 | 142 | s->status |= KBD_STAT_OBF; |
... | ... | @@ -141,15 +144,15 @@ static void kbd_update_irq(KBDState *s) |
141 | 144 | if (s->pending == KBD_PENDING_AUX) { |
142 | 145 | s->status |= KBD_STAT_MOUSE_OBF; |
143 | 146 | if (s->mode & KBD_MODE_MOUSE_INT) |
144 | - irq12_level = 1; | |
147 | + irq_mouse_level = 1; | |
145 | 148 | } else { |
146 | 149 | if ((s->mode & KBD_MODE_KBD_INT) && |
147 | 150 | !(s->mode & KBD_MODE_DISABLE_KBD)) |
148 | - irq1_level = 1; | |
151 | + irq_kbd_level = 1; | |
149 | 152 | } |
150 | 153 | } |
151 | - pic_set_irq(1, irq1_level); | |
152 | - pic_set_irq(12, irq12_level); | |
154 | + pic_set_irq(s->irq_kbd, irq_kbd_level); | |
155 | + pic_set_irq(s->irq_mouse, irq_mouse_level); | |
153 | 156 | } |
154 | 157 | |
155 | 158 | static void kbd_update_kbd_irq(void *opaque, int level) |
... | ... | @@ -353,18 +356,26 @@ static int kbd_load(QEMUFile* f, void* opaque, int version_id) |
353 | 356 | return 0; |
354 | 357 | } |
355 | 358 | |
356 | -void kbd_init(void) | |
359 | +void i8042_init(int kbd_irq_lvl, int mouse_irq_lvl, uint32_t io_base) | |
357 | 360 | { |
358 | 361 | KBDState *s = &kbd_state; |
362 | + | |
363 | + s->irq_kbd = kbd_irq_lvl; | |
364 | + s->irq_mouse = mouse_irq_lvl; | |
359 | 365 | |
360 | 366 | kbd_reset(s); |
361 | 367 | register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); |
362 | - register_ioport_read(0x60, 1, 1, kbd_read_data, s); | |
363 | - register_ioport_write(0x60, 1, 1, kbd_write_data, s); | |
364 | - register_ioport_read(0x64, 1, 1, kbd_read_status, s); | |
365 | - register_ioport_write(0x64, 1, 1, kbd_write_command, s); | |
368 | + register_ioport_read(io_base, 1, 1, kbd_read_data, s); | |
369 | + register_ioport_write(io_base, 1, 1, kbd_write_data, s); | |
370 | + register_ioport_read(io_base + 4, 1, 1, kbd_read_status, s); | |
371 | + register_ioport_write(io_base + 4, 1, 1, kbd_write_command, s); | |
366 | 372 | |
367 | 373 | s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); |
368 | 374 | s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); |
369 | 375 | qemu_register_reset(kbd_reset, s); |
370 | 376 | } |
377 | + | |
378 | +void kbd_init(void) | |
379 | +{ | |
380 | + return i8042_init(1, 12, 0x60); | |
381 | +} | ... | ... |