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" 26db1015e9SEduardo Habkost #include "qom/object.h" 27c0d4eb83SSteffen Görtz #define TYPE_NRF51_NVM "nrf51_soc.nvm" 28*8063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(NRF51NVMState, NRF51_NVM) 29c0d4eb83SSteffen Görtz 30c0d4eb83SSteffen Görtz #define NRF51_UICR_FIXTURE_SIZE 64 31c0d4eb83SSteffen Görtz 32c0d4eb83SSteffen Görtz #define NRF51_NVMC_SIZE 0x1000 33c0d4eb83SSteffen Görtz 34c0d4eb83SSteffen Görtz #define NRF51_NVMC_READY 0x400 35c0d4eb83SSteffen Görtz #define NRF51_NVMC_READY_READY 0x01 36c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG 0x504 37c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG_MASK 0x03 38c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG_WEN 0x01 39c0d4eb83SSteffen Görtz #define NRF51_NVMC_CONFIG_EEN 0x02 40c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEPCR1 0x508 41c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEPCR0 0x510 42c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEALL 0x50C 43c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASEUICR 0x514 44c0d4eb83SSteffen Görtz #define NRF51_NVMC_ERASE 0x01 45c0d4eb83SSteffen Görtz 46c0d4eb83SSteffen Görtz #define NRF51_UICR_SIZE 0x100 47c0d4eb83SSteffen Görtz 48db1015e9SEduardo Habkost struct NRF51NVMState { 49c0d4eb83SSteffen Görtz SysBusDevice parent_obj; 50c0d4eb83SSteffen Görtz 51c0d4eb83SSteffen Görtz MemoryRegion mmio; 52c0d4eb83SSteffen Görtz MemoryRegion ficr; 53c0d4eb83SSteffen Görtz MemoryRegion uicr; 54c0d4eb83SSteffen Görtz MemoryRegion flash; 55c0d4eb83SSteffen Görtz 56c0d4eb83SSteffen Görtz uint32_t uicr_content[NRF51_UICR_FIXTURE_SIZE]; 57c0d4eb83SSteffen Görtz uint32_t flash_size; 58c0d4eb83SSteffen Görtz uint8_t *storage; 59c0d4eb83SSteffen Görtz 60c0d4eb83SSteffen Görtz uint32_t config; 61c0d4eb83SSteffen Görtz 62db1015e9SEduardo Habkost }; 63c0d4eb83SSteffen Görtz 64c0d4eb83SSteffen Görtz 65c0d4eb83SSteffen Görtz #endif 66