2 * nRF51 System-on-Chip Timer peripheral
4 * Reference Manual: http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.pdf
5 * Product Spec: http://infocenter.nordicsemi.com/pdf/nRF51822_PS_v3.1.pdf
7 * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de>
8 * Copyright (c) 2019 Red Hat, Inc.
10 * This code is licensed under the GPL version 2 or later. See
11 * the COPYING file in the top-level directory.
14 #include "qemu/osdep.h"
16 #include "qemu/module.h"
17 #include "hw/arm/nrf51.h"
19 #include "hw/timer/nrf51_timer.h"
20 #include "hw/qdev-properties.h"
21 #include "migration/vmstate.h"
24 #define TIMER_CLK_FREQ 16000000UL
26 static uint32_t const bitwidths
[] = {16, 8, 24, 32};
28 static uint32_t ns_to_ticks(NRF51TimerState
*s
, int64_t ns
)
30 uint32_t freq
= TIMER_CLK_FREQ
>> s
->prescaler
;
32 return muldiv64(ns
, freq
, NANOSECONDS_PER_SECOND
);
35 static int64_t ticks_to_ns(NRF51TimerState
*s
, uint32_t ticks
)
37 uint32_t freq
= TIMER_CLK_FREQ
>> s
->prescaler
;
39 return muldiv64(ticks
, NANOSECONDS_PER_SECOND
, freq
);
42 /* Returns number of ticks since last call */
43 static uint32_t update_counter(NRF51TimerState
*s
, int64_t now
)
45 uint32_t ticks
= ns_to_ticks(s
, now
- s
->update_counter_ns
);
47 s
->counter
= (s
->counter
+ ticks
) % BIT(bitwidths
[s
->bitmode
]);
48 s
->update_counter_ns
= now
;
52 /* Assumes s->counter is up-to-date */
53 static void rearm_timer(NRF51TimerState
*s
, int64_t now
)
55 int64_t min_ns
= INT64_MAX
;
58 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
61 if (s
->events_compare
[i
]) {
62 continue; /* already expired, ignore it for now */
65 if (s
->cc
[i
] <= s
->counter
) {
66 delta_ns
= ticks_to_ns(s
, BIT(bitwidths
[s
->bitmode
]) -
67 s
->counter
+ s
->cc
[i
]);
69 delta_ns
= ticks_to_ns(s
, s
->cc
[i
] - s
->counter
);
72 if (delta_ns
< min_ns
) {
77 if (min_ns
!= INT64_MAX
) {
78 timer_mod_ns(&s
->timer
, now
+ min_ns
);
82 static void update_irq(NRF51TimerState
*s
)
87 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
88 flag
|= s
->events_compare
[i
] && extract32(s
->inten
, 16 + i
, 1);
90 qemu_set_irq(s
->irq
, flag
);
93 static void timer_expire(void *opaque
)
95 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
96 int64_t now
= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
);
97 uint32_t cc_remaining
[NRF51_TIMER_REG_COUNT
];
98 bool should_stop
= false;
102 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
103 if (s
->cc
[i
] > s
->counter
) {
104 cc_remaining
[i
] = s
->cc
[i
] - s
->counter
;
106 cc_remaining
[i
] = BIT(bitwidths
[s
->bitmode
]) -
107 s
->counter
+ s
->cc
[i
];
111 ticks
= update_counter(s
, now
);
113 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
114 if (cc_remaining
[i
] <= ticks
) {
115 s
->events_compare
[i
] = 1;
117 if (s
->shorts
& BIT(i
)) {
118 s
->timer_start_ns
= now
;
119 s
->update_counter_ns
= s
->timer_start_ns
;
123 should_stop
|= s
->shorts
& BIT(i
+ 8);
131 timer_del(&s
->timer
);
137 static void counter_compare(NRF51TimerState
*s
)
139 uint32_t counter
= s
->counter
;
142 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
143 if (counter
== s
->cc
[i
]) {
144 s
->events_compare
[i
] = 1;
146 if (s
->shorts
& BIT(i
)) {
153 static uint64_t nrf51_timer_read(void *opaque
, hwaddr offset
, unsigned int size
)
155 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
159 case NRF51_TIMER_EVENT_COMPARE_0
... NRF51_TIMER_EVENT_COMPARE_3
:
160 r
= s
->events_compare
[(offset
- NRF51_TIMER_EVENT_COMPARE_0
) / 4];
162 case NRF51_TIMER_REG_SHORTS
:
165 case NRF51_TIMER_REG_INTENSET
:
168 case NRF51_TIMER_REG_INTENCLR
:
171 case NRF51_TIMER_REG_MODE
:
174 case NRF51_TIMER_REG_BITMODE
:
177 case NRF51_TIMER_REG_PRESCALER
:
180 case NRF51_TIMER_REG_CC0
... NRF51_TIMER_REG_CC3
:
181 r
= s
->cc
[(offset
- NRF51_TIMER_REG_CC0
) / 4];
184 qemu_log_mask(LOG_GUEST_ERROR
,
185 "%s: bad read offset 0x%" HWADDR_PRIx
"\n",
189 trace_nrf51_timer_read(s
->id
, offset
, r
, size
);
194 static void nrf51_timer_write(void *opaque
, hwaddr offset
,
195 uint64_t value
, unsigned int size
)
197 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
198 uint64_t now
= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
);
201 trace_nrf51_timer_write(s
->id
, offset
, value
, size
);
204 case NRF51_TIMER_TASK_START
:
205 if (value
== NRF51_TRIGGER_TASK
&& s
->mode
== NRF51_TIMER_TIMER
) {
207 s
->timer_start_ns
= now
- ticks_to_ns(s
, s
->counter
);
208 s
->update_counter_ns
= s
->timer_start_ns
;
212 case NRF51_TIMER_TASK_STOP
:
213 case NRF51_TIMER_TASK_SHUTDOWN
:
214 if (value
== NRF51_TRIGGER_TASK
) {
216 timer_del(&s
->timer
);
219 case NRF51_TIMER_TASK_COUNT
:
220 if (value
== NRF51_TRIGGER_TASK
&& s
->mode
== NRF51_TIMER_COUNTER
) {
221 s
->counter
= (s
->counter
+ 1) % BIT(bitwidths
[s
->bitmode
]);
225 case NRF51_TIMER_TASK_CLEAR
:
226 if (value
== NRF51_TRIGGER_TASK
) {
227 s
->timer_start_ns
= now
;
228 s
->update_counter_ns
= s
->timer_start_ns
;
235 case NRF51_TIMER_TASK_CAPTURE_0
... NRF51_TIMER_TASK_CAPTURE_3
:
236 if (value
== NRF51_TRIGGER_TASK
) {
238 timer_expire(s
); /* update counter and all state */
241 idx
= (offset
- NRF51_TIMER_TASK_CAPTURE_0
) / 4;
242 s
->cc
[idx
] = s
->counter
;
243 trace_nrf51_timer_set_count(s
->id
, idx
, s
->counter
);
246 case NRF51_TIMER_EVENT_COMPARE_0
... NRF51_TIMER_EVENT_COMPARE_3
:
247 if (value
== NRF51_EVENT_CLEAR
) {
248 s
->events_compare
[(offset
- NRF51_TIMER_EVENT_COMPARE_0
) / 4] = 0;
251 timer_expire(s
); /* update counter and all state */
255 case NRF51_TIMER_REG_SHORTS
:
256 s
->shorts
= value
& NRF51_TIMER_REG_SHORTS_MASK
;
258 case NRF51_TIMER_REG_INTENSET
:
259 s
->inten
|= value
& NRF51_TIMER_REG_INTEN_MASK
;
261 case NRF51_TIMER_REG_INTENCLR
:
262 s
->inten
&= ~(value
& NRF51_TIMER_REG_INTEN_MASK
);
264 case NRF51_TIMER_REG_MODE
:
267 case NRF51_TIMER_REG_BITMODE
:
268 if (s
->mode
== NRF51_TIMER_TIMER
&& s
->running
) {
269 qemu_log_mask(LOG_GUEST_ERROR
,
270 "%s: erroneous change of BITMODE while timer is running\n",
273 s
->bitmode
= value
& NRF51_TIMER_REG_BITMODE_MASK
;
275 case NRF51_TIMER_REG_PRESCALER
:
276 if (s
->mode
== NRF51_TIMER_TIMER
&& s
->running
) {
277 qemu_log_mask(LOG_GUEST_ERROR
,
278 "%s: erroneous change of PRESCALER while timer is running\n",
281 s
->prescaler
= value
& NRF51_TIMER_REG_PRESCALER_MASK
;
283 case NRF51_TIMER_REG_CC0
... NRF51_TIMER_REG_CC3
:
285 timer_expire(s
); /* update counter */
288 idx
= (offset
- NRF51_TIMER_REG_CC0
) / 4;
289 s
->cc
[idx
] = value
% BIT(bitwidths
[s
->bitmode
]);
296 qemu_log_mask(LOG_GUEST_ERROR
,
297 "%s: bad write offset 0x%" HWADDR_PRIx
"\n",
304 static const MemoryRegionOps rng_ops
= {
305 .read
= nrf51_timer_read
,
306 .write
= nrf51_timer_write
,
307 .endianness
= DEVICE_LITTLE_ENDIAN
,
308 .impl
.min_access_size
= 4,
309 .impl
.max_access_size
= 4,
312 static void nrf51_timer_init(Object
*obj
)
314 NRF51TimerState
*s
= NRF51_TIMER(obj
);
315 SysBusDevice
*sbd
= SYS_BUS_DEVICE(obj
);
317 memory_region_init_io(&s
->iomem
, obj
, &rng_ops
, s
,
318 TYPE_NRF51_TIMER
, NRF51_PERIPHERAL_SIZE
);
319 sysbus_init_mmio(sbd
, &s
->iomem
);
320 sysbus_init_irq(sbd
, &s
->irq
);
322 timer_init_ns(&s
->timer
, QEMU_CLOCK_VIRTUAL
, timer_expire
, s
);
325 static void nrf51_timer_reset(DeviceState
*dev
)
327 NRF51TimerState
*s
= NRF51_TIMER(dev
);
329 timer_del(&s
->timer
);
330 s
->timer_start_ns
= 0x00;
331 s
->update_counter_ns
= 0x00;
335 memset(s
->events_compare
, 0x00, sizeof(s
->events_compare
));
336 memset(s
->cc
, 0x00, sizeof(s
->cc
));
345 static int nrf51_timer_post_load(void *opaque
, int version_id
)
347 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
349 if (s
->running
&& s
->mode
== NRF51_TIMER_TIMER
) {
355 static const VMStateDescription vmstate_nrf51_timer
= {
356 .name
= TYPE_NRF51_TIMER
,
358 .post_load
= nrf51_timer_post_load
,
359 .fields
= (VMStateField
[]) {
360 VMSTATE_TIMER(timer
, NRF51TimerState
),
361 VMSTATE_INT64(timer_start_ns
, NRF51TimerState
),
362 VMSTATE_INT64(update_counter_ns
, NRF51TimerState
),
363 VMSTATE_UINT32(counter
, NRF51TimerState
),
364 VMSTATE_BOOL(running
, NRF51TimerState
),
365 VMSTATE_UINT8_ARRAY(events_compare
, NRF51TimerState
,
366 NRF51_TIMER_REG_COUNT
),
367 VMSTATE_UINT32_ARRAY(cc
, NRF51TimerState
, NRF51_TIMER_REG_COUNT
),
368 VMSTATE_UINT32(shorts
, NRF51TimerState
),
369 VMSTATE_UINT32(inten
, NRF51TimerState
),
370 VMSTATE_UINT32(mode
, NRF51TimerState
),
371 VMSTATE_UINT32(bitmode
, NRF51TimerState
),
372 VMSTATE_UINT32(prescaler
, NRF51TimerState
),
373 VMSTATE_END_OF_LIST()
377 static Property nrf51_timer_properties
[] = {
378 DEFINE_PROP_UINT8("id", NRF51TimerState
, id
, 0),
379 DEFINE_PROP_END_OF_LIST(),
382 static void nrf51_timer_class_init(ObjectClass
*klass
, void *data
)
384 DeviceClass
*dc
= DEVICE_CLASS(klass
);
386 dc
->reset
= nrf51_timer_reset
;
387 dc
->vmsd
= &vmstate_nrf51_timer
;
388 device_class_set_props(dc
, nrf51_timer_properties
);
391 static const TypeInfo nrf51_timer_info
= {
392 .name
= TYPE_NRF51_TIMER
,
393 .parent
= TYPE_SYS_BUS_DEVICE
,
394 .instance_size
= sizeof(NRF51TimerState
),
395 .instance_init
= nrf51_timer_init
,
396 .class_init
= nrf51_timer_class_init
399 static void nrf51_timer_register_types(void)
401 type_register_static(&nrf51_timer_info
);
404 type_init(nrf51_timer_register_types
)