Revision 2be17ebd
b/hw/fdc.c | ||
---|---|---|
766 | 766 |
return fdctrl; |
767 | 767 |
} |
768 | 768 |
|
769 |
static void fdctrl_handle_tc(void *opaque, int irq, int level) |
|
770 |
{ |
|
771 |
//fdctrl_t *s = opaque; |
|
772 |
|
|
773 |
if (level) { |
|
774 |
// XXX |
|
775 |
FLOPPY_DPRINTF("TC pulsed\n"); |
|
776 |
} |
|
777 |
} |
|
778 |
|
|
769 | 779 |
fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, |
770 |
BlockDriverState **fds) |
|
780 |
BlockDriverState **fds, qemu_irq *fdc_tc)
|
|
771 | 781 |
{ |
772 | 782 |
fdctrl_t *fdctrl; |
773 | 783 |
int io_mem; |
... | ... | |
778 | 788 |
fdctrl_mem_write_strict, |
779 | 789 |
fdctrl); |
780 | 790 |
cpu_register_physical_memory(io_base, 0x08, io_mem); |
791 |
*fdc_tc = *qemu_allocate_irqs(fdctrl_handle_tc, fdctrl, 1); |
|
781 | 792 |
|
782 | 793 |
return fdctrl; |
783 | 794 |
} |
b/hw/fdc.h | ||
---|---|---|
7 | 7 |
target_phys_addr_t io_base, |
8 | 8 |
BlockDriverState **fds); |
9 | 9 |
fdctrl_t *sun4m_fdctrl_init (qemu_irq irq, target_phys_addr_t io_base, |
10 |
BlockDriverState **fds); |
|
10 |
BlockDriverState **fds, qemu_irq *fdc_tc);
|
|
11 | 11 |
int fdctrl_get_drive_type(fdctrl_t *fdctrl, int drive_num); |
b/hw/slavio_misc.c | ||
---|---|---|
51 | 51 |
uint32_t sysctrl; |
52 | 52 |
uint16_t leds; |
53 | 53 |
CPUState *env; |
54 |
qemu_irq fdc_tc; |
|
54 | 55 |
} MiscState; |
55 | 56 |
|
56 | 57 |
#define MISC_SIZE 1 |
... | ... | |
66 | 67 |
#define MISC_MDM 0x01b00000 |
67 | 68 |
#define MISC_SYS 0x01f00000 |
68 | 69 |
|
70 |
#define AUX1_TC 0x02 |
|
71 |
|
|
69 | 72 |
#define AUX2_PWROFF 0x01 |
70 | 73 |
#define AUX2_PWRINTCLR 0x02 |
71 | 74 |
#define AUX2_PWRFAIL 0x20 |
... | ... | |
175 | 178 |
MiscState *s = opaque; |
176 | 179 |
|
177 | 180 |
MISC_DPRINTF("Write aux1 %2.2x\n", val & 0xff); |
181 |
if (val & AUX1_TC) { |
|
182 |
// Send a pulse to floppy terminal count line |
|
183 |
if (s->fdc_tc) { |
|
184 |
qemu_irq_raise(s->fdc_tc); |
|
185 |
qemu_irq_lower(s->fdc_tc); |
|
186 |
} |
|
187 |
val &= ~AUX1_TC; |
|
188 |
} |
|
178 | 189 |
s->aux1 = val & 0xff; |
179 | 190 |
} |
180 | 191 |
|
... | ... | |
407 | 418 |
void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
408 | 419 |
target_phys_addr_t aux1_base, |
409 | 420 |
target_phys_addr_t aux2_base, qemu_irq irq, |
410 |
CPUState *env) |
|
421 |
CPUState *env, qemu_irq **fdc_tc)
|
|
411 | 422 |
{ |
412 | 423 |
int io; |
413 | 424 |
MiscState *s; |
... | ... | |
462 | 473 |
|
463 | 474 |
s->irq = irq; |
464 | 475 |
s->env = env; |
476 |
*fdc_tc = &s->fdc_tc; |
|
465 | 477 |
|
466 | 478 |
register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, |
467 | 479 |
s); |
b/hw/sun4m.c | ||
---|---|---|
376 | 376 |
qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, |
377 | 377 |
*espdma_irq, *ledma_irq; |
378 | 378 |
qemu_irq *esp_reset, *le_reset; |
379 |
qemu_irq *fdc_tc; |
|
379 | 380 |
unsigned long prom_offset, kernel_size; |
380 | 381 |
int ret; |
381 | 382 |
char buf[1024]; |
... | ... | |
494 | 495 |
slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
495 | 496 |
serial_hds[1], serial_hds[0]); |
496 | 497 |
|
498 |
slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base, |
|
499 |
hwdef->aux1_base, hwdef->aux2_base, |
|
500 |
slavio_irq[hwdef->me_irq], envs[0], |
|
501 |
&fdc_tc); |
|
502 |
|
|
497 | 503 |
if (hwdef->fd_base != (target_phys_addr_t)-1) { |
498 | 504 |
/* there is zero or one floppy drive */ |
499 | 505 |
memset(fd, 0, sizeof(fd)); |
... | ... | |
501 | 507 |
if (index != -1) |
502 | 508 |
fd[0] = drives_table[index].bdrv; |
503 | 509 |
|
504 |
sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd); |
|
510 |
sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, |
|
511 |
fdc_tc); |
|
505 | 512 |
} |
506 | 513 |
|
507 | 514 |
if (drive_get_max_bus(IF_SCSI) > 0) { |
... | ... | |
520 | 527 |
esp_scsi_attach(main_esp, drives_table[index].bdrv, i); |
521 | 528 |
} |
522 | 529 |
|
523 |
slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base, |
|
524 |
hwdef->aux1_base, hwdef->aux2_base, |
|
525 |
slavio_irq[hwdef->me_irq], envs[0]); |
|
526 | 530 |
if (hwdef->cs_base != (target_phys_addr_t)-1) |
527 | 531 |
cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); |
528 | 532 |
|
... | ... | |
549 | 553 |
void *iommu, *espdma, *ledma, *main_esp, *nvram; |
550 | 554 |
qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq; |
551 | 555 |
qemu_irq *esp_reset, *le_reset; |
556 |
qemu_irq *fdc_tc; |
|
552 | 557 |
unsigned long prom_offset, kernel_size; |
553 | 558 |
int ret; |
554 | 559 |
char buf[1024]; |
... | ... | |
643 | 648 |
slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], |
644 | 649 |
serial_hds[1], serial_hds[0]); |
645 | 650 |
|
651 |
slavio_misc = slavio_misc_init(-1, hwdef->apc_base, |
|
652 |
hwdef->aux1_base, hwdef->aux2_base, |
|
653 |
slavio_irq[hwdef->me_irq], env, &fdc_tc); |
|
654 |
|
|
646 | 655 |
if (hwdef->fd_base != (target_phys_addr_t)-1) { |
647 | 656 |
/* there is zero or one floppy drive */ |
648 | 657 |
fd[1] = fd[0] = NULL; |
... | ... | |
650 | 659 |
if (index != -1) |
651 | 660 |
fd[0] = drives_table[index].bdrv; |
652 | 661 |
|
653 |
sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd); |
|
662 |
sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, |
|
663 |
fdc_tc); |
|
654 | 664 |
} |
655 | 665 |
|
656 | 666 |
if (drive_get_max_bus(IF_SCSI) > 0) { |
... | ... | |
669 | 679 |
esp_scsi_attach(main_esp, drives_table[index].bdrv, i); |
670 | 680 |
} |
671 | 681 |
|
672 |
slavio_misc = slavio_misc_init(-1, hwdef->apc_base, |
|
673 |
hwdef->aux1_base, hwdef->aux2_base, |
|
674 |
slavio_irq[hwdef->me_irq], env); |
|
675 |
|
|
676 | 682 |
kernel_size = sun4m_load_kernel(kernel_filename, kernel_cmdline, |
677 | 683 |
initrd_filename); |
678 | 684 |
|
b/hw/sun4m.h | ||
---|---|---|
56 | 56 |
void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, |
57 | 57 |
target_phys_addr_t aux1_base, |
58 | 58 |
target_phys_addr_t aux2_base, qemu_irq irq, |
59 |
CPUState *env); |
|
59 |
CPUState *env, qemu_irq **fdc_tc);
|
|
60 | 60 |
void slavio_set_power_fail(void *opaque, int power_failing); |
61 | 61 |
|
62 | 62 |
/* cs4231.c */ |
Also available in: Unified diff