16dca62a0SLaurent Vivier /* 26dca62a0SLaurent Vivier * 36dca62a0SLaurent Vivier * Copyright (c) 2011-2018 Laurent Vivier 46dca62a0SLaurent Vivier * 56dca62a0SLaurent Vivier * This work is licensed under the terms of the GNU GPL, version 2 or later. 66dca62a0SLaurent Vivier * See the COPYING file in the top-level directory. 76dca62a0SLaurent Vivier */ 86dca62a0SLaurent Vivier 96dca62a0SLaurent Vivier #ifndef HW_MISC_MAC_VIA_H 106dca62a0SLaurent Vivier #define HW_MISC_MAC_VIA_H 116dca62a0SLaurent Vivier 126dca62a0SLaurent Vivier #include "exec/memory.h" 136dca62a0SLaurent Vivier #include "hw/sysbus.h" 146dca62a0SLaurent Vivier #include "hw/misc/mos6522.h" 15db1015e9SEduardo Habkost #include "qom/object.h" 166dca62a0SLaurent Vivier 176dca62a0SLaurent Vivier 186dca62a0SLaurent Vivier /* VIA 1 */ 196dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND_BIT 0 204c8f4ab4SMark Cave-Ayland #define VIA1_IRQ_60HZ_BIT 1 216dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY_BIT 2 226dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA_BIT 3 236dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK_BIT 4 246dca62a0SLaurent Vivier 256dca62a0SLaurent Vivier #define VIA1_IRQ_NB 8 266dca62a0SLaurent Vivier 276dca62a0SLaurent Vivier #define VIA1_IRQ_ONE_SECOND (1 << VIA1_IRQ_ONE_SECOND_BIT) 284c8f4ab4SMark Cave-Ayland #define VIA1_IRQ_60HZ (1 << VIA1_IRQ_60HZ_BIT) 296dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_READY (1 << VIA1_IRQ_ADB_READY_BIT) 306dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_DATA (1 << VIA1_IRQ_ADB_DATA_BIT) 316dca62a0SLaurent Vivier #define VIA1_IRQ_ADB_CLOCK (1 << VIA1_IRQ_ADB_CLOCK_BIT) 326dca62a0SLaurent Vivier 336dca62a0SLaurent Vivier 346dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA1 "mos6522-q800-via1" 358063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA1State, MOS6522_Q800_VIA1) 366dca62a0SLaurent Vivier 37db1015e9SEduardo Habkost struct MOS6522Q800VIA1State { 386dca62a0SLaurent Vivier /*< private >*/ 396dca62a0SLaurent Vivier MOS6522State parent_obj; 406dca62a0SLaurent Vivier 416dca62a0SLaurent Vivier qemu_irq irqs[VIA1_IRQ_NB]; 426dca62a0SLaurent Vivier uint8_t last_b; 43*8064d7bbSMark Cave-Ayland 44*8064d7bbSMark Cave-Ayland /* RTC */ 456dca62a0SLaurent Vivier uint8_t PRAM[256]; 46*8064d7bbSMark Cave-Ayland BlockBackend *blk; 47*8064d7bbSMark Cave-Ayland VMChangeStateEntry *vmstate; 486dca62a0SLaurent Vivier 496dca62a0SLaurent Vivier /* external timers */ 506dca62a0SLaurent Vivier QEMUTimer *one_second_timer; 516dca62a0SLaurent Vivier int64_t next_second; 524c8f4ab4SMark Cave-Ayland QEMUTimer *sixty_hz_timer; 534c8f4ab4SMark Cave-Ayland int64_t next_sixty_hz; 54db1015e9SEduardo Habkost }; 556dca62a0SLaurent Vivier 566dca62a0SLaurent Vivier 576dca62a0SLaurent Vivier /* VIA 2 */ 586dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA_BIT 0 596dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT_BIT 1 606dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED_BIT 2 616dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_BIT 3 626dca62a0SLaurent Vivier #define VIA2_IRQ_ASC_BIT 4 636dca62a0SLaurent Vivier 646dca62a0SLaurent Vivier #define VIA2_IRQ_NB 8 656dca62a0SLaurent Vivier 666dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA (1 << VIA2_IRQ_SCSI_DATA_BIT) 676dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT (1 << VIA2_IRQ_SLOT_BIT) 686dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED (1 << VIA2_IRQ_SCSI_BIT) 696dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI (1 << VIA2_IRQ_UNUSED_BIT) 706dca62a0SLaurent Vivier #define VIA2_IRQ_ASC (1 << VIA2_IRQ_ASC_BIT) 716dca62a0SLaurent Vivier 726dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2" 738063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA2State, MOS6522_Q800_VIA2) 746dca62a0SLaurent Vivier 75db1015e9SEduardo Habkost struct MOS6522Q800VIA2State { 766dca62a0SLaurent Vivier /*< private >*/ 776dca62a0SLaurent Vivier MOS6522State parent_obj; 78db1015e9SEduardo Habkost }; 796dca62a0SLaurent Vivier 806dca62a0SLaurent Vivier 816dca62a0SLaurent Vivier #define TYPE_MAC_VIA "mac_via" 828063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MacVIAState, MAC_VIA) 836dca62a0SLaurent Vivier 84db1015e9SEduardo Habkost struct MacVIAState { 856dca62a0SLaurent Vivier SysBusDevice busdev; 866dca62a0SLaurent Vivier 876dca62a0SLaurent Vivier /* MMIO */ 886dca62a0SLaurent Vivier MemoryRegion mmio; 896dca62a0SLaurent Vivier MemoryRegion via1mem; 906dca62a0SLaurent Vivier MemoryRegion via2mem; 916dca62a0SLaurent Vivier 926dca62a0SLaurent Vivier /* VIAs */ 936dca62a0SLaurent Vivier MOS6522Q800VIA1State mos6522_via1; 946dca62a0SLaurent Vivier MOS6522Q800VIA2State mos6522_via2; 956dca62a0SLaurent Vivier 966dca62a0SLaurent Vivier /* RTC */ 976dca62a0SLaurent Vivier uint32_t tick_offset; 986dca62a0SLaurent Vivier 996dca62a0SLaurent Vivier uint8_t data_out; 1006dca62a0SLaurent Vivier int data_out_cnt; 1016dca62a0SLaurent Vivier uint8_t data_in; 1026dca62a0SLaurent Vivier uint8_t data_in_cnt; 1036dca62a0SLaurent Vivier uint8_t cmd; 1046dca62a0SLaurent Vivier int wprotect; 1056dca62a0SLaurent Vivier int alt; 1066dca62a0SLaurent Vivier 1076dca62a0SLaurent Vivier /* ADB */ 1086dca62a0SLaurent Vivier ADBBusState adb_bus; 10987a34e2aSLaurent Vivier qemu_irq adb_data_ready; 11087a34e2aSLaurent Vivier int adb_data_in_size; 11187a34e2aSLaurent Vivier int adb_data_in_index; 11287a34e2aSLaurent Vivier int adb_data_out_index; 11387a34e2aSLaurent Vivier uint8_t adb_data_in[128]; 11487a34e2aSLaurent Vivier uint8_t adb_data_out[16]; 115975fceddSMark Cave-Ayland uint8_t adb_autopoll_cmd; 116db1015e9SEduardo Habkost }; 1176dca62a0SLaurent Vivier 1186dca62a0SLaurent Vivier #endif 119