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; 438064d7bbSMark Cave-Ayland 448064d7bbSMark Cave-Ayland /* RTC */ 456dca62a0SLaurent Vivier uint8_t PRAM[256]; 468064d7bbSMark Cave-Ayland BlockBackend *blk; 478064d7bbSMark Cave-Ayland VMChangeStateEntry *vmstate; 486dca62a0SLaurent Vivier 49*741258b0SMark Cave-Ayland uint32_t tick_offset; 50*741258b0SMark Cave-Ayland 51*741258b0SMark Cave-Ayland uint8_t data_out; 52*741258b0SMark Cave-Ayland int data_out_cnt; 53*741258b0SMark Cave-Ayland uint8_t data_in; 54*741258b0SMark Cave-Ayland uint8_t data_in_cnt; 55*741258b0SMark Cave-Ayland uint8_t cmd; 56*741258b0SMark Cave-Ayland int wprotect; 57*741258b0SMark Cave-Ayland int alt; 58*741258b0SMark Cave-Ayland 596dca62a0SLaurent Vivier /* external timers */ 606dca62a0SLaurent Vivier QEMUTimer *one_second_timer; 616dca62a0SLaurent Vivier int64_t next_second; 624c8f4ab4SMark Cave-Ayland QEMUTimer *sixty_hz_timer; 634c8f4ab4SMark Cave-Ayland int64_t next_sixty_hz; 64db1015e9SEduardo Habkost }; 656dca62a0SLaurent Vivier 666dca62a0SLaurent Vivier 676dca62a0SLaurent Vivier /* VIA 2 */ 686dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA_BIT 0 696dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT_BIT 1 706dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED_BIT 2 716dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_BIT 3 726dca62a0SLaurent Vivier #define VIA2_IRQ_ASC_BIT 4 736dca62a0SLaurent Vivier 746dca62a0SLaurent Vivier #define VIA2_IRQ_NB 8 756dca62a0SLaurent Vivier 766dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI_DATA (1 << VIA2_IRQ_SCSI_DATA_BIT) 776dca62a0SLaurent Vivier #define VIA2_IRQ_SLOT (1 << VIA2_IRQ_SLOT_BIT) 786dca62a0SLaurent Vivier #define VIA2_IRQ_UNUSED (1 << VIA2_IRQ_SCSI_BIT) 796dca62a0SLaurent Vivier #define VIA2_IRQ_SCSI (1 << VIA2_IRQ_UNUSED_BIT) 806dca62a0SLaurent Vivier #define VIA2_IRQ_ASC (1 << VIA2_IRQ_ASC_BIT) 816dca62a0SLaurent Vivier 826dca62a0SLaurent Vivier #define TYPE_MOS6522_Q800_VIA2 "mos6522-q800-via2" 838063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MOS6522Q800VIA2State, MOS6522_Q800_VIA2) 846dca62a0SLaurent Vivier 85db1015e9SEduardo Habkost struct MOS6522Q800VIA2State { 866dca62a0SLaurent Vivier /*< private >*/ 876dca62a0SLaurent Vivier MOS6522State parent_obj; 88db1015e9SEduardo Habkost }; 896dca62a0SLaurent Vivier 906dca62a0SLaurent Vivier 916dca62a0SLaurent Vivier #define TYPE_MAC_VIA "mac_via" 928063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(MacVIAState, MAC_VIA) 936dca62a0SLaurent Vivier 94db1015e9SEduardo Habkost struct MacVIAState { 956dca62a0SLaurent Vivier SysBusDevice busdev; 966dca62a0SLaurent Vivier 976dca62a0SLaurent Vivier /* MMIO */ 986dca62a0SLaurent Vivier MemoryRegion mmio; 996dca62a0SLaurent Vivier MemoryRegion via1mem; 1006dca62a0SLaurent Vivier MemoryRegion via2mem; 1016dca62a0SLaurent Vivier 1026dca62a0SLaurent Vivier /* VIAs */ 1036dca62a0SLaurent Vivier MOS6522Q800VIA1State mos6522_via1; 1046dca62a0SLaurent Vivier MOS6522Q800VIA2State mos6522_via2; 1056dca62a0SLaurent Vivier 1066dca62a0SLaurent Vivier /* ADB */ 1076dca62a0SLaurent Vivier ADBBusState adb_bus; 10887a34e2aSLaurent Vivier qemu_irq adb_data_ready; 10987a34e2aSLaurent Vivier int adb_data_in_size; 11087a34e2aSLaurent Vivier int adb_data_in_index; 11187a34e2aSLaurent Vivier int adb_data_out_index; 11287a34e2aSLaurent Vivier uint8_t adb_data_in[128]; 11387a34e2aSLaurent Vivier uint8_t adb_data_out[16]; 114975fceddSMark Cave-Ayland uint8_t adb_autopoll_cmd; 115db1015e9SEduardo Habkost }; 1166dca62a0SLaurent Vivier 1176dca62a0SLaurent Vivier #endif 118