Commit d60532ca8f551d226b2a1cab46fb4d6611ee0ea8
1 parent
630530a6
Add parallel memory mapped interface, by Herve Poussineau.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2988 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
95 additions
and
13 deletions
hw/mips_pica61.c
@@ -151,11 +151,8 @@ void mips_pica61_init (int ram_size, int vga_ram_size, int boot_device, | @@ -151,11 +151,8 @@ void mips_pica61_init (int ram_size, int vga_ram_size, int boot_device, | ||
151 | serial_mm_init(serial_base[i], 0, i8259[serial_irq[i]], serial_hds[i], 1); | 151 | serial_mm_init(serial_base[i], 0, i8259[serial_irq[i]], serial_hds[i], 1); |
152 | } | 152 | } |
153 | } | 153 | } |
154 | - for (i = 0; i < MAX_PARALLEL_PORTS; i++) { | ||
155 | - if (parallel_hds[i]) { | ||
156 | - /* FIXME: memory mapped! parallel_init(0x80008000, i8259[17], parallel_hds[i]); */ | ||
157 | - } | ||
158 | - } | 154 | + /* Parallel port */ |
155 | + if (parallel_hds[0]) parallel_mm_init(0x80008000, 0, i8259[1], parallel_hds[0]); | ||
159 | 156 | ||
160 | /* Sound card */ | 157 | /* Sound card */ |
161 | /* FIXME: missing Jazz sound, IRQ 18 */ | 158 | /* FIXME: missing Jazz sound, IRQ 18 */ |
hw/parallel.c
@@ -71,6 +71,9 @@ struct ParallelState { | @@ -71,6 +71,9 @@ struct ParallelState { | ||
71 | int hw_driver; | 71 | int hw_driver; |
72 | int epp_timeout; | 72 | int epp_timeout; |
73 | uint32_t last_read_offset; /* For debugging */ | 73 | uint32_t last_read_offset; /* For debugging */ |
74 | + /* Memory-mapped interface */ | ||
75 | + target_phys_addr_t base; | ||
76 | + int it_shift; | ||
74 | }; | 77 | }; |
75 | 78 | ||
76 | static void parallel_update_irq(ParallelState *s) | 79 | static void parallel_update_irq(ParallelState *s) |
@@ -400,15 +403,8 @@ static uint32_t parallel_ioport_ecp_read(void *opaque, uint32_t addr) | @@ -400,15 +403,8 @@ static uint32_t parallel_ioport_ecp_read(void *opaque, uint32_t addr) | ||
400 | return ret; | 403 | return ret; |
401 | } | 404 | } |
402 | 405 | ||
403 | -/* If fd is zero, it means that the parallel device uses the console */ | ||
404 | -ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | 406 | +static void parallel_reset(ParallelState *s, qemu_irq irq, CharDriverState *chr) |
405 | { | 407 | { |
406 | - ParallelState *s; | ||
407 | - uint8_t dummy; | ||
408 | - | ||
409 | - s = qemu_mallocz(sizeof(ParallelState)); | ||
410 | - if (!s) | ||
411 | - return NULL; | ||
412 | s->datar = ~0; | 408 | s->datar = ~0; |
413 | s->dataw = ~0; | 409 | s->dataw = ~0; |
414 | s->status = PARA_STS_BUSY; | 410 | s->status = PARA_STS_BUSY; |
@@ -423,6 +419,18 @@ ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | @@ -423,6 +419,18 @@ ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | ||
423 | s->hw_driver = 0; | 419 | s->hw_driver = 0; |
424 | s->epp_timeout = 0; | 420 | s->epp_timeout = 0; |
425 | s->last_read_offset = ~0U; | 421 | s->last_read_offset = ~0U; |
422 | +} | ||
423 | + | ||
424 | +/* If fd is zero, it means that the parallel device uses the console */ | ||
425 | +ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | ||
426 | +{ | ||
427 | + ParallelState *s; | ||
428 | + uint8_t dummy; | ||
429 | + | ||
430 | + s = qemu_mallocz(sizeof(ParallelState)); | ||
431 | + if (!s) | ||
432 | + return NULL; | ||
433 | + parallel_reset(s, irq, chr); | ||
426 | 434 | ||
427 | if (qemu_chr_ioctl(chr, CHR_IOCTL_PP_READ_STATUS, &dummy) == 0) { | 435 | if (qemu_chr_ioctl(chr, CHR_IOCTL_PP_READ_STATUS, &dummy) == 0) { |
428 | s->hw_driver = 1; | 436 | s->hw_driver = 1; |
@@ -445,3 +453,79 @@ ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | @@ -445,3 +453,79 @@ ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | ||
445 | } | 453 | } |
446 | return s; | 454 | return s; |
447 | } | 455 | } |
456 | + | ||
457 | +/* Memory mapped interface */ | ||
458 | +uint32_t parallel_mm_readb (void *opaque, target_phys_addr_t addr) | ||
459 | +{ | ||
460 | + ParallelState *s = opaque; | ||
461 | + | ||
462 | + return parallel_ioport_read_sw(s, (addr - s->base) >> s->it_shift) & 0xFF; | ||
463 | +} | ||
464 | + | ||
465 | +void parallel_mm_writeb (void *opaque, | ||
466 | + target_phys_addr_t addr, uint32_t value) | ||
467 | +{ | ||
468 | + ParallelState *s = opaque; | ||
469 | + | ||
470 | + parallel_ioport_write_sw(s, (addr - s->base) >> s->it_shift, value & 0xFF); | ||
471 | +} | ||
472 | + | ||
473 | +uint32_t parallel_mm_readw (void *opaque, target_phys_addr_t addr) | ||
474 | +{ | ||
475 | + ParallelState *s = opaque; | ||
476 | + | ||
477 | + return parallel_ioport_read_sw(s, (addr - s->base) >> s->it_shift) & 0xFFFF; | ||
478 | +} | ||
479 | + | ||
480 | +void parallel_mm_writew (void *opaque, | ||
481 | + target_phys_addr_t addr, uint32_t value) | ||
482 | +{ | ||
483 | + ParallelState *s = opaque; | ||
484 | + | ||
485 | + parallel_ioport_write_sw(s, (addr - s->base) >> s->it_shift, value & 0xFFFF); | ||
486 | +} | ||
487 | + | ||
488 | +uint32_t parallel_mm_readl (void *opaque, target_phys_addr_t addr) | ||
489 | +{ | ||
490 | + ParallelState *s = opaque; | ||
491 | + | ||
492 | + return parallel_ioport_read_sw(s, (addr - s->base) >> s->it_shift); | ||
493 | +} | ||
494 | + | ||
495 | +void parallel_mm_writel (void *opaque, | ||
496 | + target_phys_addr_t addr, uint32_t value) | ||
497 | +{ | ||
498 | + ParallelState *s = opaque; | ||
499 | + | ||
500 | + parallel_ioport_write_sw(s, (addr - s->base) >> s->it_shift, value); | ||
501 | +} | ||
502 | + | ||
503 | +static CPUReadMemoryFunc *parallel_mm_read_sw[] = { | ||
504 | + ¶llel_mm_readb, | ||
505 | + ¶llel_mm_readw, | ||
506 | + ¶llel_mm_readl, | ||
507 | +}; | ||
508 | + | ||
509 | +static CPUWriteMemoryFunc *parallel_mm_write_sw[] = { | ||
510 | + ¶llel_mm_writeb, | ||
511 | + ¶llel_mm_writew, | ||
512 | + ¶llel_mm_writel, | ||
513 | +}; | ||
514 | + | ||
515 | +/* If fd is zero, it means that the parallel device uses the console */ | ||
516 | +ParallelState *parallel_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq, CharDriverState *chr) | ||
517 | +{ | ||
518 | + ParallelState *s; | ||
519 | + int io_sw; | ||
520 | + | ||
521 | + s = qemu_mallocz(sizeof(ParallelState)); | ||
522 | + if (!s) | ||
523 | + return NULL; | ||
524 | + parallel_reset(s, irq, chr); | ||
525 | + s->base = base; | ||
526 | + s->it_shift = it_shift; | ||
527 | + | ||
528 | + io_sw = cpu_register_io_memory(0, parallel_mm_read_sw, parallel_mm_write_sw, s); | ||
529 | + cpu_register_physical_memory(base, 8 << it_shift, io_sw); | ||
530 | + return s; | ||
531 | +} |
vl.h
@@ -1089,6 +1089,7 @@ void serial_mm_writel (void *opaque, target_phys_addr_t addr, uint32_t value); | @@ -1089,6 +1089,7 @@ void serial_mm_writel (void *opaque, target_phys_addr_t addr, uint32_t value); | ||
1089 | 1089 | ||
1090 | typedef struct ParallelState ParallelState; | 1090 | typedef struct ParallelState ParallelState; |
1091 | ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr); | 1091 | ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr); |
1092 | +ParallelState *parallel_mm_init(target_phys_addr_t base, int it_shift, qemu_irq irq, CharDriverState *chr); | ||
1092 | 1093 | ||
1093 | /* i8259.c */ | 1094 | /* i8259.c */ |
1094 | 1095 |