Revision 4efbe58f hw/pckbd.c
b/hw/pckbd.c | ||
---|---|---|
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); |
Also available in: Unified diff