#pragma once #include "hw/sysbus.h" #include "hw/hw.h" #include "hw/registerfields.h" #define TYPE_ESP32_GPIO "esp32.gpio" #define ESP32_GPIO(obj) OBJECT_CHECK(Esp32GpioState, (obj), TYPE_ESP32_GPIO) #define ESP32_GPIO_GET_CLASS(obj) OBJECT_GET_CLASS(Esp32GpioClass, obj, TYPE_ESP32_GPIO) #define ESP32_GPIO_CLASS(klass) OBJECT_CLASS_CHECK(Esp32GpioClass, klass, TYPE_ESP32_GPIO) REG32(GPIO_STRAP, 0x0038) #define ESP32_STRAP_MODE_FLASH_BOOT 0x12 #define ESP32_STRAP_MODE_UART_BOOT 0x0f //added by cpu #define ESP32_GPIO_COUNT 40 #define ESP32_PERIPHERAL_CONFIG_COUNT 256 #define ESP32_GPIO_IRQ_GPIO "gpio_irq" #define ESP32_GPIO_NMI_IRQ_GPIO "gpio_nmi_irq" union GpioConfig{ struct{ uint32_t _reserved0_ :2; uint32_t padDriver :1; uint32_t _reserved1_ :4; uint32_t interruptType :3; uint32_t wakeupEnable :1; uint32_t _reserved2_ :2; uint32_t appCpuIntEnable :1; uint32_t appCpuNmiEnable :1; uint32_t proCpuIntEnable :1; uint32_t proCpuNmiEnable :1; uint32_t _unknownField_ :1; uint32_t _reserved3_ :14; }; uint32_t mem; }; typedef struct Esp32GpioState { SysBusDevice parent_obj; MemoryRegion iomem; qemu_irq irq; uint32_t strap_mode; //added by cpu uint32_t outputRegister[2]; uint32_t outputEnableRegister[2]; uint32_t inputRegister[2]; uint32_t interruptStatusRegister[2]; uint32_t appCpuInterruptStatus[2]; uint32_t appCpuNmiInterruptStatus[2]; //NMI means Non-Maskable Interrupt uint32_t proCpuInterruptStatus[2]; uint32_t proCpuNmiInterruptStatus[2]; union GpioConfig gpioConfig[ESP32_GPIO_COUNT]; uint32_t peripheralFunctionInput[ESP32_PERIPHERAL_CONFIG_COUNT]; uint32_t peripheralFunctionOutput[ESP32_PERIPHERAL_CONFIG_COUNT]; qemu_irq gpioIrq; qemu_irq gpioNmiIrq; } Esp32GpioState; typedef struct Esp32GpioClass { SysBusDeviceClass parent_class; } Esp32GpioClass;