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 |