20
#include "qemu/osdep.h"
21
#include "qapi/error.h"
23
#include "qemu/module.h"
24
#include "hw/arm/nrf51.h"
25
#include "hw/nvram/nrf51_nvm.h"
26
#include "hw/qdev-properties.h"
27
#include "migration/vmstate.h"
67
static const uint32_t ficr_content[64] = {
68
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000400,
69
0x00000100, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000002, 0x00002000,
70
0x00002000, 0x00002000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
71
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
72
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000003,
73
0x12345678, 0x9ABCDEF1, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
74
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
75
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
76
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
77
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
78
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
79
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
80
0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
83
static uint64_t ficr_read(void *opaque, hwaddr offset, unsigned int size)
85
assert(offset < sizeof(ficr_content));
86
return ficr_content[offset / 4];
89
static void ficr_write(void *opaque, hwaddr offset, uint64_t value,
95
static const MemoryRegionOps ficr_ops = {
98
.impl.min_access_size = 4,
99
.impl.max_access_size = 4,
100
.endianness = DEVICE_LITTLE_ENDIAN
171
static uint64_t uicr_read(void *opaque, hwaddr offset, unsigned int size)
173
NRF51NVMState *s = NRF51_NVM(opaque);
175
assert(offset < sizeof(s->uicr_content));
176
return s->uicr_content[offset / 4];
179
static void uicr_write(void *opaque, hwaddr offset, uint64_t value,
182
NRF51NVMState *s = NRF51_NVM(opaque);
184
assert(offset < sizeof(s->uicr_content));
185
s->uicr_content[offset / 4] = value;
188
static const MemoryRegionOps uicr_ops = {
191
.impl.min_access_size = 4,
192
.impl.max_access_size = 4,
193
.endianness = DEVICE_LITTLE_ENDIAN
197
static uint64_t io_read(void *opaque, hwaddr offset, unsigned int size)
199
NRF51NVMState *s = NRF51_NVM(opaque);
203
case NRF51_NVMC_READY:
204
r = NRF51_NVMC_READY_READY;
206
case NRF51_NVMC_CONFIG:
210
qemu_log_mask(LOG_GUEST_ERROR,
211
"%s: bad read offset 0x%" HWADDR_PRIx "\n", __func__, offset);
218
static void io_write(void *opaque, hwaddr offset, uint64_t value,
221
NRF51NVMState *s = NRF51_NVM(opaque);
224
case NRF51_NVMC_CONFIG:
225
s->config = value & NRF51_NVMC_CONFIG_MASK;
227
case NRF51_NVMC_ERASEPCR0:
228
case NRF51_NVMC_ERASEPCR1:
229
if (s->config & NRF51_NVMC_CONFIG_EEN) {
231
value &= ~(NRF51_PAGE_SIZE - 1);
232
if (value <= (s->flash_size - NRF51_PAGE_SIZE)) {
233
memset(s->storage + value, 0xFF, NRF51_PAGE_SIZE);
234
memory_region_flush_rom_device(&s->flash, value,
238
qemu_log_mask(LOG_GUEST_ERROR,
239
"%s: Flash erase at 0x%" HWADDR_PRIx" while flash not erasable.\n",
243
case NRF51_NVMC_ERASEALL:
244
if (value == NRF51_NVMC_ERASE) {
245
if (s->config & NRF51_NVMC_CONFIG_EEN) {
246
memset(s->storage, 0xFF, s->flash_size);
247
memory_region_flush_rom_device(&s->flash, 0, s->flash_size);
248
memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
250
qemu_log_mask(LOG_GUEST_ERROR, "%s: Flash not erasable.\n",
255
case NRF51_NVMC_ERASEUICR:
256
if (value == NRF51_NVMC_ERASE) {
257
memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
262
qemu_log_mask(LOG_GUEST_ERROR,
263
"%s: bad write offset 0x%" HWADDR_PRIx "\n", __func__, offset);
267
static const MemoryRegionOps io_ops = {
270
.impl.min_access_size = 4,
271
.impl.max_access_size = 4,
272
.endianness = DEVICE_LITTLE_ENDIAN,
275
static uint64_t flash_read(void *opaque, hwaddr offset, unsigned size)
282
g_assert_not_reached();
285
static void flash_write(void *opaque, hwaddr offset, uint64_t value,
288
NRF51NVMState *s = NRF51_NVM(opaque);
290
if (s->config & NRF51_NVMC_CONFIG_WEN) {
293
assert(offset + size <= s->flash_size);
296
oldval = ldl_le_p(s->storage + offset);
298
stl_le_p(s->storage + offset, oldval);
300
memory_region_flush_rom_device(&s->flash, offset, size);
302
qemu_log_mask(LOG_GUEST_ERROR,
303
"%s: Flash write 0x%" HWADDR_PRIx" while flash not writable.\n",
310
static const MemoryRegionOps flash_ops = {
312
.write = flash_write,
313
.valid.min_access_size = 4,
314
.valid.max_access_size = 4,
315
.endianness = DEVICE_LITTLE_ENDIAN,
318
static void nrf51_nvm_init(Object *obj)
320
NRF51NVMState *s = NRF51_NVM(obj);
321
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
323
memory_region_init_io(&s->mmio, obj, &io_ops, s, "nrf51_soc.nvmc",
325
sysbus_init_mmio(sbd, &s->mmio);
327
memory_region_init_io(&s->ficr, obj, &ficr_ops, s, "nrf51_soc.ficr",
328
sizeof(ficr_content));
329
sysbus_init_mmio(sbd, &s->ficr);
331
memory_region_init_io(&s->uicr, obj, &uicr_ops, s, "nrf51_soc.uicr",
332
sizeof(s->uicr_content));
333
sysbus_init_mmio(sbd, &s->uicr);
336
static void nrf51_nvm_realize(DeviceState *dev, Error **errp)
338
NRF51NVMState *s = NRF51_NVM(dev);
340
if (!memory_region_init_rom_device(&s->flash, OBJECT(dev), &flash_ops, s,
341
"nrf51_soc.flash", s->flash_size, errp)) {
345
s->storage = memory_region_get_ram_ptr(&s->flash);
346
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->flash);
349
static void nrf51_nvm_reset(DeviceState *dev)
351
NRF51NVMState *s = NRF51_NVM(dev);
354
memset(s->uicr_content, 0xFF, sizeof(s->uicr_content));
357
static Property nrf51_nvm_properties[] = {
358
DEFINE_PROP_UINT32("flash-size", NRF51NVMState, flash_size, 0x40000),
359
DEFINE_PROP_END_OF_LIST(),
362
static const VMStateDescription vmstate_nvm = {
363
.name = "nrf51_soc.nvm",
365
.minimum_version_id = 1,
366
.fields = (const VMStateField[]) {
367
VMSTATE_UINT32_ARRAY(uicr_content, NRF51NVMState,
368
NRF51_UICR_FIXTURE_SIZE),
369
VMSTATE_UINT32(config, NRF51NVMState),
370
VMSTATE_END_OF_LIST()
374
static void nrf51_nvm_class_init(ObjectClass *klass, void *data)
376
DeviceClass *dc = DEVICE_CLASS(klass);
378
device_class_set_props(dc, nrf51_nvm_properties);
379
dc->vmsd = &vmstate_nvm;
380
dc->realize = nrf51_nvm_realize;
381
dc->reset = nrf51_nvm_reset;
384
static const TypeInfo nrf51_nvm_info = {
385
.name = TYPE_NRF51_NVM,
386
.parent = TYPE_SYS_BUS_DEVICE,
387
.instance_size = sizeof(NRF51NVMState),
388
.instance_init = nrf51_nvm_init,
389
.class_init = nrf51_nvm_class_init
392
static void nrf51_nvm_register_types(void)
394
type_register_static(&nrf51_nvm_info);
397
type_init(nrf51_nvm_register_types)