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 | +} | ... | ... |