Commit b7678d96c52b5e902283e538007e7b8e001dbc19

Authored by ths
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 +}
... ...