125 |
125 |
|
126 |
126 |
qemu_irq irq_kbd;
|
127 |
127 |
qemu_irq irq_mouse;
|
128 |
|
int it_shift;
|
|
128 |
target_phys_addr_t mask;
|
129 |
129 |
} KBDState;
|
130 |
130 |
|
131 |
131 |
static KBDState kbd_state;
|
... | ... | |
391 |
391 |
{
|
392 |
392 |
KBDState *s = opaque;
|
393 |
393 |
|
394 |
|
switch (addr >> s->it_shift) {
|
395 |
|
case 0:
|
396 |
|
return kbd_read_data(s, 0) & 0xff;
|
397 |
|
case 1:
|
|
394 |
if (addr & s->mask)
|
398 |
395 |
return kbd_read_status(s, 0) & 0xff;
|
399 |
|
default:
|
400 |
|
return 0xff;
|
401 |
|
}
|
|
396 |
else
|
|
397 |
return kbd_read_data(s, 0) & 0xff;
|
402 |
398 |
}
|
403 |
399 |
|
404 |
400 |
static void kbd_mm_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
|
405 |
401 |
{
|
406 |
402 |
KBDState *s = opaque;
|
407 |
403 |
|
408 |
|
switch (addr >> s->it_shift) {
|
409 |
|
case 0:
|
410 |
|
kbd_write_data(s, 0, value & 0xff);
|
411 |
|
break;
|
412 |
|
case 1:
|
|
404 |
if (addr & s->mask)
|
413 |
405 |
kbd_write_command(s, 0, value & 0xff);
|
414 |
|
break;
|
415 |
|
}
|
|
406 |
else
|
|
407 |
kbd_write_data(s, 0, value & 0xff);
|
416 |
408 |
}
|
417 |
409 |
|
418 |
410 |
static CPUReadMemoryFunc *kbd_mm_read[] = {
|
... | ... | |
428 |
420 |
};
|
429 |
421 |
|
430 |
422 |
void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
|
431 |
|
target_phys_addr_t base, int it_shift)
|
|
423 |
target_phys_addr_t base, ram_addr_t size,
|
|
424 |
target_phys_addr_t mask)
|
432 |
425 |
{
|
433 |
426 |
KBDState *s = &kbd_state;
|
434 |
427 |
int s_io_memory;
|
435 |
428 |
|
436 |
429 |
s->irq_kbd = kbd_irq;
|
437 |
430 |
s->irq_mouse = mouse_irq;
|
438 |
|
s->it_shift = it_shift;
|
|
431 |
s->mask = mask;
|
439 |
432 |
|
440 |
433 |
kbd_reset(s);
|
441 |
434 |
register_savevm("pckbd", 0, 3, kbd_save, kbd_load, s);
|
442 |
435 |
s_io_memory = cpu_register_io_memory(0, kbd_mm_read, kbd_mm_write, s);
|
443 |
|
cpu_register_physical_memory(base, 2 << it_shift, s_io_memory);
|
|
436 |
cpu_register_physical_memory(base, size, s_io_memory);
|
444 |
437 |
|
445 |
438 |
s->kbd = ps2_kbd_init(kbd_update_kbd_irq, s);
|
446 |
439 |
s->mouse = ps2_mouse_init(kbd_update_aux_irq, s);
|