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" 30db1015e9SEduardo Habkost #include "qom/object.h" 31805f61bbSSteffen Görtz #define TYPE_NRF51_GPIO "nrf51_soc.gpio" 328063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(NRF51GPIOState, NRF51_GPIO) 33805f61bbSSteffen Görtz 34805f61bbSSteffen Görtz #define NRF51_GPIO_PINS 32 35805f61bbSSteffen Görtz 36805f61bbSSteffen Görtz #define NRF51_GPIO_SIZE 0x1000 37805f61bbSSteffen Görtz 38805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUT 0x504 39805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUTSET 0x508 40805f61bbSSteffen Görtz #define NRF51_GPIO_REG_OUTCLR 0x50C 41805f61bbSSteffen Görtz #define NRF51_GPIO_REG_IN 0x510 42805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIR 0x514 43805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIRSET 0x518 44805f61bbSSteffen Görtz #define NRF51_GPIO_REG_DIRCLR 0x51C 45805f61bbSSteffen Görtz #define NRF51_GPIO_REG_CNF_START 0x700 46c8aeef3aSCameron Esfahani #define NRF51_GPIO_REG_CNF_END 0x77C 47805f61bbSSteffen Görtz 48805f61bbSSteffen Görtz #define NRF51_GPIO_PULLDOWN 1 49805f61bbSSteffen Görtz #define NRF51_GPIO_PULLUP 3 50805f61bbSSteffen Görtz 51db1015e9SEduardo Habkost struct NRF51GPIOState { 52805f61bbSSteffen Görtz SysBusDevice parent_obj; 53805f61bbSSteffen Görtz 54805f61bbSSteffen Görtz MemoryRegion mmio; 55805f61bbSSteffen Görtz qemu_irq irq; 56805f61bbSSteffen Görtz 57805f61bbSSteffen Görtz uint32_t out; 58805f61bbSSteffen Görtz uint32_t in; 59805f61bbSSteffen Görtz uint32_t in_mask; 60805f61bbSSteffen Görtz uint32_t dir; 61805f61bbSSteffen Görtz uint32_t cnf[NRF51_GPIO_PINS]; 62805f61bbSSteffen Görtz 63805f61bbSSteffen Görtz uint32_t old_out; 64805f61bbSSteffen Görtz uint32_t old_out_connected; 65805f61bbSSteffen Görtz 66805f61bbSSteffen Görtz qemu_irq output[NRF51_GPIO_PINS]; 67*8d6b2f94SChris Laplante qemu_irq detect; 68db1015e9SEduardo Habkost }; 69805f61bbSSteffen Görtz 70805f61bbSSteffen Görtz 71805f61bbSSteffen Görtz #endif 72