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