uint32_t sysctrl;
uint16_t leds;
CPUState *env;
+ qemu_irq fdc_tc;
} MiscState;
#define MISC_SIZE 1
#define MISC_MDM 0x01b00000
#define MISC_SYS 0x01f00000
+#define AUX1_TC 0x02
+
#define AUX2_PWROFF 0x01
#define AUX2_PWRINTCLR 0x02
#define AUX2_PWRFAIL 0x20
MiscState *s = opaque;
MISC_DPRINTF("Write aux1 %2.2x\n", val & 0xff);
+ if (val & AUX1_TC) {
+ // Send a pulse to floppy terminal count line
+ if (s->fdc_tc) {
+ qemu_irq_raise(s->fdc_tc);
+ qemu_irq_lower(s->fdc_tc);
+ }
+ val &= ~AUX1_TC;
+ }
s->aux1 = val & 0xff;
}
void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base,
target_phys_addr_t aux1_base,
target_phys_addr_t aux2_base, qemu_irq irq,
- CPUState *env)
+ CPUState *env, qemu_irq **fdc_tc)
{
int io;
MiscState *s;
s->irq = irq;
s->env = env;
+ *fdc_tc = &s->fdc_tc;
register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load,
s);
qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
*espdma_irq, *ledma_irq;
qemu_irq *esp_reset, *le_reset;
+ qemu_irq *fdc_tc;
unsigned long prom_offset, kernel_size;
int ret;
char buf[1024];
slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
serial_hds[1], serial_hds[0]);
+ slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base,
+ hwdef->aux1_base, hwdef->aux2_base,
+ slavio_irq[hwdef->me_irq], envs[0],
+ &fdc_tc);
+
if (hwdef->fd_base != (target_phys_addr_t)-1) {
/* there is zero or one floppy drive */
memset(fd, 0, sizeof(fd));
if (index != -1)
fd[0] = drives_table[index].bdrv;
- sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd);
+ sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
+ fdc_tc);
}
if (drive_get_max_bus(IF_SCSI) > 0) {
esp_scsi_attach(main_esp, drives_table[index].bdrv, i);
}
- slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base,
- hwdef->aux1_base, hwdef->aux2_base,
- slavio_irq[hwdef->me_irq], envs[0]);
if (hwdef->cs_base != (target_phys_addr_t)-1)
cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
void *iommu, *espdma, *ledma, *main_esp, *nvram;
qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq;
qemu_irq *esp_reset, *le_reset;
+ qemu_irq *fdc_tc;
unsigned long prom_offset, kernel_size;
int ret;
char buf[1024];
slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
serial_hds[1], serial_hds[0]);
+ slavio_misc = slavio_misc_init(-1, hwdef->apc_base,
+ hwdef->aux1_base, hwdef->aux2_base,
+ slavio_irq[hwdef->me_irq], env, &fdc_tc);
+
if (hwdef->fd_base != (target_phys_addr_t)-1) {
/* there is zero or one floppy drive */
fd[1] = fd[0] = NULL;
if (index != -1)
fd[0] = drives_table[index].bdrv;
- sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd);
+ sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
+ fdc_tc);
}
if (drive_get_max_bus(IF_SCSI) > 0) {
esp_scsi_attach(main_esp, drives_table[index].bdrv, i);
}
- slavio_misc = slavio_misc_init(-1, hwdef->apc_base,
- hwdef->aux1_base, hwdef->aux2_base,
- slavio_irq[hwdef->me_irq], env);
-
kernel_size = sun4m_load_kernel(kernel_filename, kernel_cmdline,
initrd_filename);