1*805f61bbSSteffen Görtz /* 2*805f61bbSSteffen Görtz * nRF51 System-on-Chip general purpose input/output register definition 3*805f61bbSSteffen Görtz * 4*805f61bbSSteffen Görtz * QEMU interface: 5*805f61bbSSteffen Görtz * + sysbus MMIO regions 0: GPIO registers 6*805f61bbSSteffen Görtz * + Unnamed GPIO inputs 0-31: Set tri-state input level for GPIO pin. 7*805f61bbSSteffen Görtz * Level -1: Externally Disconnected/Floating; Pull-up/down will be regarded 8*805f61bbSSteffen Görtz * Level 0: Input externally driven LOW 9*805f61bbSSteffen Görtz * Level 1: Input externally driven HIGH 10*805f61bbSSteffen Görtz * + Unnamed GPIO outputs 0-31: 11*805f61bbSSteffen Görtz * Level -1: Disconnected/Floating 12*805f61bbSSteffen Görtz * Level 0: Driven LOW 13*805f61bbSSteffen Görtz * Level 1: Driven HIGH 14*805f61bbSSteffen Görtz * 15*805f61bbSSteffen Görtz * Accuracy of the peripheral model: 16*805f61bbSSteffen Görtz * + The nRF51 GPIO output driver supports two modes, standard and high-current 17*805f61bbSSteffen Görtz * mode. These different drive modes are not modeled and handled the same. 18*805f61bbSSteffen Görtz * + Pin SENSEing is not modeled/implemented. 19*805f61bbSSteffen Görtz * 20*805f61bbSSteffen Görtz * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de> 21*805f61bbSSteffen Görtz * 22*805f61bbSSteffen Görtz * This code is licensed under the GPL version 2 or later. See 23*805f61bbSSteffen Görtz * the COPYING file in the top-level directory. 24*805f61bbSSteffen Görtz * 25*805f61bbSSteffen Görtz */ 26*805f61bbSSteffen Görtz #ifndef NRF51_GPIO_H 27*805f61bbSSteffen Görtz #define NRF51_GPIO_H 28*805f61bbSSteffen Görtz 29*805f61bbSSteffen Görtz #include "hw/sysbus.h" 30*805f61bbSSteffen Görtz #define TYPE_NRF51_GPIO "nrf51_soc.gpio" 31*805f61bbSSteffen Görtz #define NRF51_GPIO(obj) OBJECT_CHECK(NRF51GPIOState, (obj), TYPE_NRF51_GPIO) 32*805f61bbSSteffen Görtz 33*805f61bbSSteffen Görtz #define NRF51_GPIO_PINS 32 34*805f61bbSSteffen Görtz 35*805f61bbSSteffen Görtz #define NRF51_GPIO_SIZE 0x1000 36*805f61bbSSteffen Görtz 37*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUT 0x504 38*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUTSET 0x508 39*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUTCLR 0x50C 40*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_IN 0x510 41*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIR 0x514 42*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIRSET 0x518 43*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIRCLR 0x51C 44*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_CNF_START 0x700 45*805f61bbSSteffen Görtz #define NRF51_GPIO_REG_CNF_END 0x77F 46*805f61bbSSteffen Görtz 47*805f61bbSSteffen Görtz #define NRF51_GPIO_PULLDOWN 1 48*805f61bbSSteffen Görtz #define NRF51_GPIO_PULLUP 3 49*805f61bbSSteffen Görtz 50*805f61bbSSteffen Görtz typedef struct NRF51GPIOState { 51*805f61bbSSteffen Görtz SysBusDevice parent_obj; 52*805f61bbSSteffen Görtz 53*805f61bbSSteffen Görtz MemoryRegion mmio; 54*805f61bbSSteffen Görtz qemu_irq irq; 55*805f61bbSSteffen Görtz 56*805f61bbSSteffen Görtz uint32_t out; 57*805f61bbSSteffen Görtz uint32_t in; 58*805f61bbSSteffen Görtz uint32_t in_mask; 59*805f61bbSSteffen Görtz uint32_t dir; 60*805f61bbSSteffen Görtz uint32_t cnf[NRF51_GPIO_PINS]; 61*805f61bbSSteffen Görtz 62*805f61bbSSteffen Görtz uint32_t old_out; 63*805f61bbSSteffen Görtz uint32_t old_out_connected; 64*805f61bbSSteffen Görtz 65*805f61bbSSteffen Görtz qemu_irq output[NRF51_GPIO_PINS]; 66*805f61bbSSteffen Görtz } NRF51GPIOState; 67*805f61bbSSteffen Görtz 68*805f61bbSSteffen Görtz 69*805f61bbSSteffen Görtz #endif 70