Commit b92bb99b80166f76fae32e166b3deaa22fec8687
1 parent
3a607854
Memory-mapped interface for PS/2 controller, by Herve Poussineau.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2685 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
61 additions
and
3 deletions
hw/pckbd.c
| @@ -124,6 +124,7 @@ typedef struct KBDState { | @@ -124,6 +124,7 @@ typedef struct KBDState { | ||
| 124 | 124 | ||
| 125 | qemu_irq irq_kbd; | 125 | qemu_irq irq_kbd; |
| 126 | qemu_irq irq_mouse; | 126 | qemu_irq irq_mouse; |
| 127 | + target_phys_addr_t base; | ||
| 127 | } KBDState; | 128 | } KBDState; |
| 128 | 129 | ||
| 129 | KBDState kbd_state; | 130 | KBDState kbd_state; |
| @@ -140,7 +141,7 @@ static void kbd_update_irq(KBDState *s) | @@ -140,7 +141,7 @@ static void kbd_update_irq(KBDState *s) | ||
| 140 | s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); | 141 | s->status &= ~(KBD_STAT_OBF | KBD_STAT_MOUSE_OBF); |
| 141 | if (s->pending) { | 142 | if (s->pending) { |
| 142 | s->status |= KBD_STAT_OBF; | 143 | s->status |= KBD_STAT_OBF; |
| 143 | - /* kdb data takes priority over aux data. */ | 144 | + /* kbd data takes priority over aux data. */ |
| 144 | if (s->pending == KBD_PENDING_AUX) { | 145 | if (s->pending == KBD_PENDING_AUX) { |
| 145 | s->status |= KBD_STAT_MOUSE_OBF; | 146 | s->status |= KBD_STAT_MOUSE_OBF; |
| 146 | if (s->mode & KBD_MODE_MOUSE_INT) | 147 | if (s->mode & KBD_MODE_MOUSE_INT) |
| @@ -362,7 +363,7 @@ void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base) | @@ -362,7 +363,7 @@ void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base) | ||
| 362 | 363 | ||
| 363 | s->irq_kbd = kbd_irq; | 364 | s->irq_kbd = kbd_irq; |
| 364 | s->irq_mouse = mouse_irq; | 365 | s->irq_mouse = mouse_irq; |
| 365 | - | 366 | + |
| 366 | kbd_reset(s); | 367 | kbd_reset(s); |
| 367 | register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); | 368 | register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); |
| 368 | register_ioport_read(io_base, 1, 1, kbd_read_data, s); | 369 | register_ioport_read(io_base, 1, 1, kbd_read_data, s); |
| @@ -377,3 +378,59 @@ void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base) | @@ -377,3 +378,59 @@ void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base) | ||
| 377 | #endif | 378 | #endif |
| 378 | qemu_register_reset(kbd_reset, s); | 379 | qemu_register_reset(kbd_reset, s); |
| 379 | } | 380 | } |
| 381 | + | ||
| 382 | +/* Memory mapped interface */ | ||
| 383 | +uint32_t kbd_mm_readb (void *opaque, target_phys_addr_t addr) | ||
| 384 | +{ | ||
| 385 | + KBDState *s = opaque; | ||
| 386 | + | ||
| 387 | + if (addr == s->base) | ||
| 388 | + return kbd_read_data(s, 0); | ||
| 389 | + else | ||
| 390 | + return kbd_read_status(s, 0); | ||
| 391 | +} | ||
| 392 | + | ||
| 393 | +void kbd_mm_writeb (void *opaque, | ||
| 394 | + target_phys_addr_t addr, uint32_t value) | ||
| 395 | +{ | ||
| 396 | + KBDState *s = opaque; | ||
| 397 | + | ||
| 398 | + if (addr == s->base) | ||
| 399 | + kbd_write_data(s, 0, value); | ||
| 400 | + else | ||
| 401 | + kbd_write_command(s, 0, value); | ||
| 402 | +} | ||
| 403 | + | ||
| 404 | +static CPUReadMemoryFunc *kbd_mm_read[] = { | ||
| 405 | + &kbd_mm_readb, | ||
| 406 | + &kbd_mm_readb, | ||
| 407 | + &kbd_mm_readb, | ||
| 408 | +}; | ||
| 409 | + | ||
| 410 | +static CPUWriteMemoryFunc *kbd_mm_write[] = { | ||
| 411 | + &kbd_mm_writeb, | ||
| 412 | + &kbd_mm_writeb, | ||
| 413 | + &kbd_mm_writeb, | ||
| 414 | +}; | ||
| 415 | + | ||
| 416 | +void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, int it_shift) | ||
| 417 | +{ | ||
| 418 | + KBDState *s = &kbd_state; | ||
| 419 | + int s_io_memory; | ||
| 420 | + | ||
| 421 | + s->irq_kbd = kbd_irq; | ||
| 422 | + s->irq_mouse = mouse_irq; | ||
| 423 | + s->base = base; | ||
| 424 | + | ||
| 425 | + kbd_reset(s); | ||
| 426 | + register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s); | ||
| 427 | + s_io_memory = cpu_register_io_memory(0, kbd_mm_read, kbd_mm_write, s); | ||
| 428 | + cpu_register_physical_memory(base & ~(TARGET_PAGE_SIZE - 1), TARGET_PAGE_SIZE, s_io_memory); | ||
| 429 | + | ||
| 430 | + s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s); | ||
| 431 | + s->mouse = ps2_mouse_init(kbd_update_aux_irq, s); | ||
| 432 | +#ifdef TARGET_I386 | ||
| 433 | + vmmouse_init(s->mouse); | ||
| 434 | +#endif | ||
| 435 | + qemu_register_reset(kbd_reset, s); | ||
| 436 | +} |
vl.h
| @@ -1035,7 +1035,8 @@ void *vmmouse_init(void *m); | @@ -1035,7 +1035,8 @@ void *vmmouse_init(void *m); | ||
| 1035 | 1035 | ||
| 1036 | /* pckbd.c */ | 1036 | /* pckbd.c */ |
| 1037 | 1037 | ||
| 1038 | -void i8042_init(qemu_irq kdb_irq, qemu_irq mouse_irq, uint32_t io_base); | 1038 | +void i8042_init(qemu_irq kbd_irq, qemu_irq mouse_irq, uint32_t io_base); |
| 1039 | +void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq, target_ulong base, int it_shift); | ||
| 1039 | 1040 | ||
| 1040 | /* mc146818rtc.c */ | 1041 | /* mc146818rtc.c */ |
| 1041 | 1042 |