1805f61bbSSteffen Görtz /* 2805f61bbSSteffen Görtz * nRF51 System-on-Chip general purpose input/output register definition 3805f61bbSSteffen Görtz * 4805f61bbSSteffen Görtz * QEMU interface: 5805f61bbSSteffen Görtz * + sysbus MMIO regions 0: GPIO registers 6805f61bbSSteffen Görtz * + Unnamed GPIO inputs 0-31: Set tri-state input level for GPIO pin. 7805f61bbSSteffen Görtz * Level -1: Externally Disconnected/Floating; Pull-up/down will be regarded 8805f61bbSSteffen Görtz * Level 0: Input externally driven LOW 9805f61bbSSteffen Görtz * Level 1: Input externally driven HIGH 10805f61bbSSteffen Görtz * + Unnamed GPIO outputs 0-31: 11805f61bbSSteffen Görtz * Level -1: Disconnected/Floating 12805f61bbSSteffen Görtz * Level 0: Driven LOW 13805f61bbSSteffen Görtz * Level 1: Driven HIGH 14805f61bbSSteffen Görtz * 15805f61bbSSteffen Görtz * Accuracy of the peripheral model: 16805f61bbSSteffen Görtz * + The nRF51 GPIO output driver supports two modes, standard and high-current 17805f61bbSSteffen Görtz * mode. These different drive modes are not modeled and handled the same. 18805f61bbSSteffen Görtz * + Pin SENSEing is not modeled/implemented. 19805f61bbSSteffen Görtz * 20805f61bbSSteffen Görtz * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de> 21805f61bbSSteffen Görtz * 22805f61bbSSteffen Görtz * This code is licensed under the GPL version 2 or later. See 23805f61bbSSteffen Görtz * the COPYING file in the top-level directory. 24805f61bbSSteffen Görtz * 25805f61bbSSteffen Görtz */ 26805f61bbSSteffen Görtz #ifndef NRF51_GPIO_H 27805f61bbSSteffen Görtz #define NRF51_GPIO_H 28805f61bbSSteffen Görtz 29805f61bbSSteffen Görtz #include "hw/sysbus.h" 30805f61bbSSteffen Görtz #define TYPE_NRF51_GPIO "nrf51_soc.gpio" 31805f61bbSSteffen Görtz #define NRF51_GPIO(obj) OBJECT_CHECK(NRF51GPIOState, (obj), TYPE_NRF51_GPIO) 32805f61bbSSteffen Görtz 33805f61bbSSteffen Görtz #define NRF51_GPIO_PINS 32 34805f61bbSSteffen Görtz 35805f61bbSSteffen Görtz #define NRF51_GPIO_SIZE 0x1000 36805f61bbSSteffen Görtz 37805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUT 0x504 38805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUTSET 0x508 39805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUTCLR 0x50C 40805f61bbSSteffen Görtz #define NRF51_GPIO_REG_IN 0x510 41805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIR 0x514 42805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIRSET 0x518 43805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIRCLR 0x51C 44805f61bbSSteffen Görtz #define NRF51_GPIO_REG_CNF_START 0x700 45*c8aeef3aSCameron Esfahani #define NRF51_GPIO_REG_CNF_END 0x77C 46805f61bbSSteffen Görtz 47805f61bbSSteffen Görtz #define NRF51_GPIO_PULLDOWN 1 48805f61bbSSteffen Görtz #define NRF51_GPIO_PULLUP 3 49805f61bbSSteffen Görtz 50805f61bbSSteffen Görtz typedef struct NRF51GPIOState { 51805f61bbSSteffen Görtz SysBusDevice parent_obj; 52805f61bbSSteffen Görtz 53805f61bbSSteffen Görtz MemoryRegion mmio; 54805f61bbSSteffen Görtz qemu_irq irq; 55805f61bbSSteffen Görtz 56805f61bbSSteffen Görtz uint32_t out; 57805f61bbSSteffen Görtz uint32_t in; 58805f61bbSSteffen Görtz uint32_t in_mask; 59805f61bbSSteffen Görtz uint32_t dir; 60805f61bbSSteffen Görtz uint32_t cnf[NRF51_GPIO_PINS]; 61805f61bbSSteffen Görtz 62805f61bbSSteffen Görtz uint32_t old_out; 63805f61bbSSteffen Görtz uint32_t old_out_connected; 64805f61bbSSteffen Görtz 65805f61bbSSteffen Görtz qemu_irq output[NRF51_GPIO_PINS]; 66805f61bbSSteffen Görtz } NRF51GPIOState; 67805f61bbSSteffen Görtz 68805f61bbSSteffen Görtz 69805f61bbSSteffen Görtz #endif 70