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,6 +121,9 @@ typedef struct KBDState { | ||
| 121 | uint8_t pending; | 121 | uint8_t pending; |
| 122 | void *kbd; | 122 | void *kbd; |
| 123 | void *mouse; | 123 | void *mouse; |
| 124 | + | ||
| 125 | + int irq_kbd; | ||
| 126 | + int irq_mouse; | ||
| 124 | } KBDState; | 127 | } KBDState; |
| 125 | 128 | ||
| 126 | KBDState kbd_state; | 129 | KBDState kbd_state; |
| @@ -130,10 +133,10 @@ KBDState kbd_state; | @@ -130,10 +133,10 @@ KBDState kbd_state; | ||
| 130 | incorrect, but it avoids having to simulate exact delays */ | 133 | incorrect, but it avoids having to simulate exact delays */ |
| 131 | static void kbd_update_irq(KBDState *s) | 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 | s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); | 140 | s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); |
| 138 | if (s->pending) { | 141 | if (s->pending) { |
| 139 | s->status |= KBD_STAT_OBF; | 142 | s->status |= KBD_STAT_OBF; |
| @@ -141,15 +144,15 @@ static void kbd_update_irq(KBDState *s) | @@ -141,15 +144,15 @@ static void kbd_update_irq(KBDState *s) | ||
| 141 | if (s->pending == KBD_PENDING_AUX) { | 144 | if (s->pending == KBD_PENDING_AUX) { |
| 142 | s->status |= KBD_STAT_MOUSE_OBF; | 145 | s->status |= KBD_STAT_MOUSE_OBF; |
| 143 | if (s->mode & KBD_MODE_MOUSE_INT) | 146 | if (s->mode & KBD_MODE_MOUSE_INT) |
| 144 | - irq12_level = 1; | 147 | + irq_mouse_level = 1; |
| 145 | } else { | 148 | } else { |
| 146 | if ((s->mode & KBD_MODE_KBD_INT) && | 149 | if ((s->mode & KBD_MODE_KBD_INT) && |
| 147 | !(s->mode & KBD_MODE_DISABLE_KBD)) | 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 | static void kbd_update_kbd_irq(void *opaque, int level) | 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,18 +356,26 @@ static int kbd_load(QEMUFile* f, void* opaque, int version_id) | ||
| 353 | return 0; | 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 | KBDState *s = &kbd_state; | 361 | KBDState *s = &kbd_state; |
| 362 | + | ||
| 363 | + s->irq_kbd = kbd_irq_lvl; | ||
| 364 | + s->irq_mouse = mouse_irq_lvl; | ||
| 359 | 365 | ||
| 360 | kbd_reset(s); | 366 | kbd_reset(s); |
| 361 | register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); | 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 | s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); | 373 | s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); |
| 368 | s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); | 374 | s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); |
| 369 | qemu_register_reset(kbd_reset, s); | 375 | qemu_register_reset(kbd_reset, s); |
| 370 | } | 376 | } |
| 377 | + | ||
| 378 | +void kbd_init(void) | ||
| 379 | +{ | ||
| 380 | + return i8042_init(1, 12, 0x60); | ||
| 381 | +} |