2 * Virtual I/O PCI card + simple terminal connected
3 * to this card via 8bit parallel bus.
4 * Hardware used for teaching A0b36APO:
5 * https://edux.feld.cvut.cz/courses/A0B36APO/tutorials/10/start
7 * Copyright (C) 2012 Rostislav Lisovy (lisovy@gmail.com)
9 * Licensed under GPLv3 license
16 #define PCI_VENDOR_ID_ALTERA 0x1172
17 #define PCI_DEVICE_ID_ALTERA_CORPORATION_DEVICE 0x1f32
19 typedef struct apohw_state_t {
20 uint8_t emul_bus_ctrl;
21 uint8_t emul_bus_data_out;
22 uint8_t emul_bus_data_in;
30 /* ------------------------------------------------------------------------- */
32 static int pci_apohw_init(PCIDevice *pci_dev)
34 printf("apohw started\n");
38 static int pci_apohw_exit(PCIDevice *pci_dev)
43 const VMStateDescription apohw_vmsd = {
45 .version_id = 2, // Wut?
46 .minimum_version_id = 0,
47 .minimum_version_id_old = 0,
48 .fields = (VMStateField []) {
49 VMSTATE_UNUSED(0x8040),
50 VMSTATE_UINT8(emul_bus_ctrl, apohw_state_t),
52 VMSTATE_UINT8(emul_bus_data_out, apohw_state_t),
54 VMSTATE_UINT8(emul_bus_data_in, apohw_state_t),
59 static const VMStateDescription apohw_pci_vmsd = {
61 .version_id = 3, // Wat?
62 .minimum_version_id = 3,
63 .minimum_version_id_old = 3,
64 .fields = (VMStateField[]) {
65 VMSTATE_PCI_DEVICE(dev, apohw_pci_state_t),
66 VMSTATE_STRUCT(apohw, apohw_pci_state_t, 0, apohw_vmsd, apohw_state_t),
71 static void apohw_class_init(ObjectClass *klass, void *data)
73 PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
75 k->init = pci_apohw_init;
76 k->exit = pci_apohw_exit;
77 k->vendor_id = PCI_VENDOR_ID_ALTERA;
78 k->device_id = PCI_DEVICE_ID_ALTERA_CORPORATION_DEVICE;
79 k->class_id = PCI_CLASS_COMMUNICATION_OTHER;
82 static DeviceInfo apohw_info = {
84 .size = sizeof(apohw_pci_state_t),
85 .vmsd = &apohw_pci_vmsd,
86 .class_init = apohw_class_init,
89 static void apohw_register_device(void)
91 pci_qdev_register(&apohw_info);
94 device_init(apohw_register_device)