*/
#include "hw.h"
#include "pci.h"
-#include "../qemu-thread.c"
+#include "qemu-thread.h"
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
+/* #define QEMU_VER_ABOVE_015 */
+
#define PCI_VENDOR_ID_HUMUSOFT 0x186c
#define PCI_DEVICE_ID_MF624 0x0624
#define PCI_CLASS_SIGNAL_PROCESSING_CONTROLLER 0x1180
typedef struct {
PCIDevice dev;
+ #ifdef QEMU_VER_ABOVE_015
+ MemoryRegion mmio_bar0;
+ MemoryRegion mmio_bar2;
+ MemoryRegion mmio_bar4;
+ #endif /*QEMU_VER_ABOVE_015*/
int socket_srv;
int socket_tmp;
BAR2_t BAR2;
BAR4_t BAR4;
+
int ADDATA_FIFO[8]; //this array tells us which ADCs are being converted
unsigned int ADDATA_FIFO_POSITION; //ADDATA is FIFO register;
//We need to know, position in this FIFO =
break;
default:
- printf("mf624_BAR0_write32(): addr = %d; value = %d\n", addr, value);
+ printf("mf624_BAR0_write32(): addr = " TARGET_FMT_plx "; value = %d\n", addr, value);
break;
}
}
return s->BAR0.GPIOC;
default:
- printf("mf624_BAR0_read32(): addr = %d\n", addr);
+ printf("mf624_BAR0_read32(): addr = " TARGET_FMT_plx "\n", addr);
return 0x0;
}
}
return 0xFFFF; // Semirandom value
default:
- printf("mf624_BAR2_read16(): addr = %d\n", addr);
+ printf("mf624_BAR2_read16(): addr = " TARGET_FMT_plx "\n", addr);
return 0x0;
}
}
break;
default:
- printf("mf624_BAR2_write16(): addr = %d; value = %d\n", addr, value);
+ printf("mf624_BAR2_write16(): addr = " TARGET_FMT_plx "; value = %d\n", addr, value);
break;
}
}
static void mf624_BAR4_write32(void *opaque, target_phys_addr_t addr, uint32_t value)
{
- printf("mf624_BAR4_write32(): addr = %d; value = %d\n", addr, value);
+ printf("mf624_BAR4_write32(): addr = " TARGET_FMT_plx "; value = %d\n", addr, value);
}
static uint32_t mf624_BAR4_read32(void *opaque, target_phys_addr_t addr)
{
- printf("mf624_BAR4_read32(): addr = %d\n", addr);
+ printf("mf624_BAR4_read32(): addr = " TARGET_FMT_plx "\n", addr);
return 0x0;
}
+//-----------------------------------------------------------------------------
+
+#ifdef QEMU_VER_ABOVE_015
+
+static const MemoryRegionOps mf624_BAR0_mmio_ops = {
+ .old_mmio = {
+ .read = {
+ NULL,
+ NULL,
+ mf624_BAR0_read32,
+ },
+ .write = {
+ NULL,
+ NULL,
+ mf624_BAR0_write32,
+ },
+ },
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+static const MemoryRegionOps mf624_BAR2_mmio_ops = {
+ .old_mmio = {
+ .read = {
+ NULL,
+ mf624_BAR2_read16,
+ NULL,
+ },
+ .write = {
+ NULL,
+ mf624_BAR2_write16,
+ NULL,
+ },
+ },
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+static const MemoryRegionOps mf624_BAR4_mmio_ops = {
+ .old_mmio = {
+ .read = {
+ NULL,
+ NULL,
+ mf624_BAR4_read32,
+ },
+ .write = {
+ NULL,
+ NULL,
+ mf624_BAR4_write32,
+ },
+ },
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+#else /*QEMU_VER_ABOVE_015*/
static CPUReadMemoryFunc * const mf624_BAR0_read[3] = {
NULL, /* read8 */
NULL, /* write16 */
mf624_BAR4_write32,
};
+
+
//-----------------------------------------------------------------------------
static void mf624_map(PCIDevice *pci_dev, int region_num,
}
+#endif /*QEMU_VER_ABOVE_015*/
+
#define DEFAULT_PORT 55555
static int pci_mf624_init(PCIDevice *pci_dev)
{
pci_conf[PCI_INTERRUPT_PIN] = 0x1; // interrupt pin 0
-
+ #ifdef QEMU_VER_ABOVE_015
+ memory_region_init_io(&s->mmio_bar0, &mf624_BAR0_mmio_ops, s, "mf624_bar0", BAR0_size);
+ memory_region_init_io(&s->mmio_bar2, &mf624_BAR2_mmio_ops, s, "mf624_bar2", BAR2_size);
+ memory_region_init_io(&s->mmio_bar4, &mf624_BAR4_mmio_ops, s, "mf624_bar4", BAR4_size);
+ pci_register_bar(&s->dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_bar0);
+ pci_register_bar(&s->dev, 2, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_bar2);
+ pci_register_bar(&s->dev, 4, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->mmio_bar4);
+ #else QEMU_VER_ABOVE_015
s->BAR0_mem_table_index = cpu_register_io_memory(mf624_BAR0_read,
mf624_BAR0_write,
s,
s,
DEVICE_NATIVE_ENDIAN);
- //printf("BAR0: %d\n", s->BAR0_offset);
- //printf("BAR2: %d\n", s->BAR2_offset);
- //printf("BAR4: %d\n", s->BAR4_offset);
-
pci_register_bar(&s->dev, 0, BAR0_size, PCI_BASE_ADDRESS_SPACE_MEMORY, mf624_map);
pci_register_bar(&s->dev, 2, BAR2_size, PCI_BASE_ADDRESS_SPACE_MEMORY, mf624_map);
pci_register_bar(&s->dev, 4, BAR4_size, PCI_BASE_ADDRESS_SPACE_MEMORY, mf624_map);
+ #endif QEMU_VER_ABOVE_015
//Create thread, which will be blocked on reading from socket (connected to "I/O GUI")
qemu_thread_create(&socket_thread, init_socket, (void*) s);