42
42
#define RAM_SIZE 0x4000000
43
43
#define ROM_FILE "Rev_2.5_v66.bin"
44
44
45
- typedef struct NeXTRTC {
45
+
46
+ #define TYPE_NEXT_RTC "next-rtc"
47
+ OBJECT_DECLARE_SIMPLE_TYPE (NeXTRTC , NEXT_RTC )
48
+
49
+ struct NeXTRTC {
50
+ SysBusDevice parent_obj ;
51
+
46
52
int8_t phase ;
47
53
uint8_t ram [32 ];
48
54
uint8_t command ;
49
55
uint8_t value ;
50
56
uint8_t status ;
51
57
uint8_t control ;
52
58
uint8_t retval ;
53
- } NeXTRTC ;
59
+ };
54
60
55
61
#define TYPE_NEXT_SCSI "next-scsi"
56
62
OBJECT_DECLARE_SIMPLE_TYPE (NeXTSCSI , NEXT_SCSI )
@@ -1012,6 +1018,37 @@ static const MemoryRegionOps next_dummy_en_ops = {
1012
1018
.endianness = DEVICE_BIG_ENDIAN ,
1013
1019
};
1014
1020
1021
+ static const VMStateDescription next_rtc_vmstate = {
1022
+ .name = "next-rtc" ,
1023
+ .version_id = 3 ,
1024
+ .minimum_version_id = 3 ,
1025
+ .fields = (const VMStateField []) {
1026
+ VMSTATE_INT8 (phase , NeXTRTC ),
1027
+ VMSTATE_UINT8_ARRAY (ram , NeXTRTC , 32 ),
1028
+ VMSTATE_UINT8 (command , NeXTRTC ),
1029
+ VMSTATE_UINT8 (value , NeXTRTC ),
1030
+ VMSTATE_UINT8 (status , NeXTRTC ),
1031
+ VMSTATE_UINT8 (control , NeXTRTC ),
1032
+ VMSTATE_UINT8 (retval , NeXTRTC ),
1033
+ VMSTATE_END_OF_LIST ()
1034
+ },
1035
+ };
1036
+
1037
+ static void next_rtc_class_init (ObjectClass * klass , void * data )
1038
+ {
1039
+ DeviceClass * dc = DEVICE_CLASS (klass );
1040
+
1041
+ dc -> desc = "NeXT RTC" ;
1042
+ dc -> vmsd = & next_rtc_vmstate ;
1043
+ }
1044
+
1045
+ static const TypeInfo next_rtc_info = {
1046
+ .name = TYPE_NEXT_RTC ,
1047
+ .parent = TYPE_SYS_BUS_DEVICE ,
1048
+ .instance_size = sizeof (NeXTRTC ),
1049
+ .class_init = next_rtc_class_init ,
1050
+ };
1051
+
1015
1052
static void next_pc_rtc_data_in_irq (void * opaque , int n , int level )
1016
1053
{
1017
1054
NeXTPC * s = NEXT_PC (opaque );
@@ -1078,6 +1115,12 @@ static void next_pc_realize(DeviceState *dev, Error **errp)
1078
1115
}
1079
1116
sysbus_connect_irq (sbd , 0 , qdev_get_gpio_in (dev , NEXT_SCC_I ));
1080
1117
sysbus_connect_irq (sbd , 1 , qdev_get_gpio_in (dev , NEXT_SCC_DMA_I ));
1118
+
1119
+ /* RTC */
1120
+ d = DEVICE (& s -> rtc );
1121
+ if (!sysbus_realize (SYS_BUS_DEVICE (d ), errp )) {
1122
+ return ;
1123
+ }
1081
1124
}
1082
1125
1083
1126
static void next_pc_init (Object * obj )
@@ -1111,6 +1154,8 @@ static void next_pc_init(Object *obj)
1111
1154
"next.timer" , 4 );
1112
1155
sysbus_init_mmio (sbd , & s -> timer_mem );
1113
1156
1157
+ object_initialize_child (obj , "rtc" , & s -> rtc , TYPE_NEXT_RTC );
1158
+
1114
1159
s -> rtc_power_irq = qdev_get_gpio_in (DEVICE (obj ), NEXT_PWR_I );
1115
1160
qdev_init_gpio_in_named (DEVICE (obj ), next_pc_rtc_data_in_irq ,
1116
1161
"pc-rtc-data-in" , 1 );
@@ -1128,34 +1173,17 @@ static const Property next_pc_properties[] = {
1128
1173
DEFINE_PROP_LINK ("cpu" , NeXTPC , cpu , TYPE_M68K_CPU , M68kCPU * ),
1129
1174
};
1130
1175
1131
- static const VMStateDescription next_rtc_vmstate = {
1132
- .name = "next-rtc" ,
1133
- .version_id = 2 ,
1134
- .minimum_version_id = 2 ,
1135
- .fields = (const VMStateField []) {
1136
- VMSTATE_INT8 (phase , NeXTRTC ),
1137
- VMSTATE_UINT8_ARRAY (ram , NeXTRTC , 32 ),
1138
- VMSTATE_UINT8 (command , NeXTRTC ),
1139
- VMSTATE_UINT8 (value , NeXTRTC ),
1140
- VMSTATE_UINT8 (status , NeXTRTC ),
1141
- VMSTATE_UINT8 (control , NeXTRTC ),
1142
- VMSTATE_UINT8 (retval , NeXTRTC ),
1143
- VMSTATE_END_OF_LIST ()
1144
- },
1145
- };
1146
-
1147
1176
static const VMStateDescription next_pc_vmstate = {
1148
1177
.name = "next-pc" ,
1149
- .version_id = 3 ,
1150
- .minimum_version_id = 3 ,
1178
+ .version_id = 4 ,
1179
+ .minimum_version_id = 4 ,
1151
1180
.fields = (const VMStateField []) {
1152
1181
VMSTATE_UINT32 (scr1 , NeXTPC ),
1153
1182
VMSTATE_UINT32 (scr2 , NeXTPC ),
1154
1183
VMSTATE_UINT32 (old_scr2 , NeXTPC ),
1155
1184
VMSTATE_UINT32 (int_mask , NeXTPC ),
1156
1185
VMSTATE_UINT32 (int_status , NeXTPC ),
1157
1186
VMSTATE_UINT32 (led , NeXTPC ),
1158
- VMSTATE_STRUCT (rtc , NeXTPC , 0 , next_rtc_vmstate , NeXTRTC ),
1159
1187
VMSTATE_END_OF_LIST ()
1160
1188
},
1161
1189
};
@@ -1305,6 +1333,7 @@ static void next_register_type(void)
1305
1333
type_register_static (& next_typeinfo );
1306
1334
type_register_static (& next_pc_info );
1307
1335
type_register_static (& next_scsi_info );
1336
+ type_register_static (& next_rtc_info );
1308
1337
}
1309
1338
1310
1339
type_init (next_register_type )
0 commit comments