1c0d4eb83SSteffen Görtz /* 2c0d4eb83SSteffen Görtz * Nordic Semiconductor nRF51 non-volatile memory 3c0d4eb83SSteffen Görtz * 4c0d4eb83SSteffen Görtz * It provides an interface to erase regions in flash memory. 5c0d4eb83SSteffen Görtz * Furthermore it provides the user and factory information registers. 6c0d4eb83SSteffen Görtz * 7c0d4eb83SSteffen Görtz * QEMU interface: 8c0d4eb83SSteffen Görtz * + sysbus MMIO regions 0: NVMC peripheral registers 9c0d4eb83SSteffen Görtz * + sysbus MMIO regions 1: FICR peripheral registers 10c0d4eb83SSteffen Görtz * + sysbus MMIO regions 2: UICR peripheral registers 11c0d4eb83SSteffen Görtz * + flash-size property: flash size in bytes. 12c0d4eb83SSteffen Görtz * 13c0d4eb83SSteffen Görtz * Accuracy of the peripheral model: 14c0d4eb83SSteffen Görtz * + Code regions (MPU configuration) are disregarded. 15c0d4eb83SSteffen Görtz * 16c0d4eb83SSteffen Görtz * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de> 17c0d4eb83SSteffen Görtz * 18c0d4eb83SSteffen Görtz * This code is licensed under the GPL version 2 or later. See 19c0d4eb83SSteffen Görtz * the COPYING file in the top-level directory. 20c0d4eb83SSteffen Görtz * 21c0d4eb83SSteffen Görtz */ 22c0d4eb83SSteffen Görtz #ifndef NRF51_NVM_H 23c0d4eb83SSteffen Görtz #define NRF51_NVM_H 24c0d4eb83SSteffen Görtz 25c0d4eb83SSteffen Görtz #include "hw/sysbus.h" 26*db1015e9SEduardo Habkost #include "qom/object.h" 27c0d4eb83SSteffen Görtz #define TYPE_NRF51_NVM "nrf51_soc.nvm" 28*db1015e9SEduardo Habkost typedef struct NRF51NVMState NRF51NVMState; 29c0d4eb83SSteffen Görtz #define NRF51_NVM(obj) OBJECT_CHECK(NRF51NVMState, (obj), TYPE_NRF51_NVM) 30c0d4eb83SSteffen Görtz 31c0d4eb83SSteffen Görtz #define NRF51_UICR_FIXTURE_SIZE 64 32c0d4eb83SSteffen Görtz 33c0d4eb83SSteffen Görtz #define NRF51_NVMC_SIZE 0x1000 34c0d4eb83SSteffen Görtz 35c0d4eb83SSteffen Görtz #define NRF51_NVMC_READY 0x400 36c0d4eb83SSteffen Görtz #define NRF51_NVMC_READY_READY 0x01 37c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG 0x504 38c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG_MASK 0x03 39c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG_WEN 0x01 40c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG_EEN 0x02 41c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEPCR1 0x508 42c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEPCR0 0x510 43c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEALL 0x50C 44c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEUICR 0x514 45c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASE 0x01 46c0d4eb83SSteffen Görtz 47c0d4eb83SSteffen Görtz #define NRF51_UICR_SIZE 0x100 48c0d4eb83SSteffen Görtz 49*db1015e9SEduardo Habkost struct NRF51NVMState { 50c0d4eb83SSteffen Görtz SysBusDevice parent_obj; 51c0d4eb83SSteffen Görtz 52c0d4eb83SSteffen Görtz MemoryRegion mmio; 53c0d4eb83SSteffen Görtz MemoryRegion ficr; 54c0d4eb83SSteffen Görtz MemoryRegion uicr; 55c0d4eb83SSteffen Görtz MemoryRegion flash; 56c0d4eb83SSteffen Görtz 57c0d4eb83SSteffen Görtz uint32_t uicr_content[NRF51_UICR_FIXTURE_SIZE]; 58c0d4eb83SSteffen Görtz uint32_t flash_size; 59c0d4eb83SSteffen Görtz uint8_t *storage; 60c0d4eb83SSteffen Görtz 61c0d4eb83SSteffen Görtz uint32_t config; 62c0d4eb83SSteffen Görtz 63*db1015e9SEduardo Habkost }; 64c0d4eb83SSteffen Görtz 65c0d4eb83SSteffen Görtz 66c0d4eb83SSteffen Görtz #endif 67