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