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"
18 #include "hw/timer/nrf51_timer.h"
21 #define TIMER_CLK_FREQ 16000000UL
23 static uint32_t const bitwidths
[] = {16, 8, 24, 32};
25 static uint32_t ns_to_ticks(NRF51TimerState
*s
, int64_t ns
)
27 uint32_t freq
= TIMER_CLK_FREQ
>> s
->prescaler
;
29 return muldiv64(ns
, freq
, NANOSECONDS_PER_SECOND
);
32 static int64_t ticks_to_ns(NRF51TimerState
*s
, uint32_t ticks
)
34 uint32_t freq
= TIMER_CLK_FREQ
>> s
->prescaler
;
36 return muldiv64(ticks
, NANOSECONDS_PER_SECOND
, freq
);
39 /* Returns number of ticks since last call */
40 static uint32_t update_counter(NRF51TimerState
*s
, int64_t now
)
42 uint32_t ticks
= ns_to_ticks(s
, now
- s
->update_counter_ns
);
44 s
->counter
= (s
->counter
+ ticks
) % BIT(bitwidths
[s
->bitmode
]);
45 s
->update_counter_ns
= now
;
49 /* Assumes s->counter is up-to-date */
50 static void rearm_timer(NRF51TimerState
*s
, int64_t now
)
52 int64_t min_ns
= INT64_MAX
;
55 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
58 if (s
->events_compare
[i
]) {
59 continue; /* already expired, ignore it for now */
62 if (s
->cc
[i
] <= s
->counter
) {
63 delta_ns
= ticks_to_ns(s
, BIT(bitwidths
[s
->bitmode
]) -
64 s
->counter
+ s
->cc
[i
]);
66 delta_ns
= ticks_to_ns(s
, s
->cc
[i
] - s
->counter
);
69 if (delta_ns
< min_ns
) {
74 if (min_ns
!= INT64_MAX
) {
75 timer_mod_ns(&s
->timer
, now
+ min_ns
);
79 static void update_irq(NRF51TimerState
*s
)
84 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
85 flag
|= s
->events_compare
[i
] && extract32(s
->inten
, 16 + i
, 1);
87 qemu_set_irq(s
->irq
, flag
);
90 static void timer_expire(void *opaque
)
92 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
93 int64_t now
= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
);
94 uint32_t cc_remaining
[NRF51_TIMER_REG_COUNT
];
95 bool should_stop
= false;
99 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
100 if (s
->cc
[i
] > s
->counter
) {
101 cc_remaining
[i
] = s
->cc
[i
] - s
->counter
;
103 cc_remaining
[i
] = BIT(bitwidths
[s
->bitmode
]) -
104 s
->counter
+ s
->cc
[i
];
108 ticks
= update_counter(s
, now
);
110 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
111 if (cc_remaining
[i
] <= ticks
) {
112 s
->events_compare
[i
] = 1;
114 if (s
->shorts
& BIT(i
)) {
115 s
->timer_start_ns
= now
;
116 s
->update_counter_ns
= s
->timer_start_ns
;
120 should_stop
|= s
->shorts
& BIT(i
+ 8);
128 timer_del(&s
->timer
);
134 static void counter_compare(NRF51TimerState
*s
)
136 uint32_t counter
= s
->counter
;
139 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
140 if (counter
== s
->cc
[i
]) {
141 s
->events_compare
[i
] = 1;
143 if (s
->shorts
& BIT(i
)) {
150 static uint64_t nrf51_timer_read(void *opaque
, hwaddr offset
, unsigned int size
)
152 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
156 case NRF51_TIMER_EVENT_COMPARE_0
... NRF51_TIMER_EVENT_COMPARE_3
:
157 r
= s
->events_compare
[(offset
- NRF51_TIMER_EVENT_COMPARE_0
) / 4];
159 case NRF51_TIMER_REG_SHORTS
:
162 case NRF51_TIMER_REG_INTENSET
:
165 case NRF51_TIMER_REG_INTENCLR
:
168 case NRF51_TIMER_REG_MODE
:
171 case NRF51_TIMER_REG_BITMODE
:
174 case NRF51_TIMER_REG_PRESCALER
:
177 case NRF51_TIMER_REG_CC0
... NRF51_TIMER_REG_CC3
:
178 r
= s
->cc
[(offset
- NRF51_TIMER_REG_CC0
) / 4];
181 qemu_log_mask(LOG_GUEST_ERROR
,
182 "%s: bad read offset 0x%" HWADDR_PRIx
"\n",
186 trace_nrf51_timer_read(offset
, r
, size
);
191 static void nrf51_timer_write(void *opaque
, hwaddr offset
,
192 uint64_t value
, unsigned int size
)
194 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
195 uint64_t now
= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
);
198 trace_nrf51_timer_write(offset
, value
, size
);
201 case NRF51_TIMER_TASK_START
:
202 if (value
== NRF51_TRIGGER_TASK
&& s
->mode
== NRF51_TIMER_TIMER
) {
204 s
->timer_start_ns
= now
- ticks_to_ns(s
, s
->counter
);
205 s
->update_counter_ns
= s
->timer_start_ns
;
209 case NRF51_TIMER_TASK_STOP
:
210 case NRF51_TIMER_TASK_SHUTDOWN
:
211 if (value
== NRF51_TRIGGER_TASK
) {
213 timer_del(&s
->timer
);
216 case NRF51_TIMER_TASK_COUNT
:
217 if (value
== NRF51_TRIGGER_TASK
&& s
->mode
== NRF51_TIMER_COUNTER
) {
218 s
->counter
= (s
->counter
+ 1) % BIT(bitwidths
[s
->bitmode
]);
222 case NRF51_TIMER_TASK_CLEAR
:
223 if (value
== NRF51_TRIGGER_TASK
) {
224 s
->timer_start_ns
= now
;
225 s
->update_counter_ns
= s
->timer_start_ns
;
232 case NRF51_TIMER_TASK_CAPTURE_0
... NRF51_TIMER_TASK_CAPTURE_3
:
233 if (value
== NRF51_TRIGGER_TASK
) {
235 timer_expire(s
); /* update counter and all state */
238 idx
= (offset
- NRF51_TIMER_TASK_CAPTURE_0
) / 4;
239 s
->cc
[idx
] = s
->counter
;
242 case NRF51_TIMER_EVENT_COMPARE_0
... NRF51_TIMER_EVENT_COMPARE_3
:
243 if (value
== NRF51_EVENT_CLEAR
) {
244 s
->events_compare
[(offset
- NRF51_TIMER_EVENT_COMPARE_0
) / 4] = 0;
247 timer_expire(s
); /* update counter and all state */
251 case NRF51_TIMER_REG_SHORTS
:
252 s
->shorts
= value
& NRF51_TIMER_REG_SHORTS_MASK
;
254 case NRF51_TIMER_REG_INTENSET
:
255 s
->inten
|= value
& NRF51_TIMER_REG_INTEN_MASK
;
257 case NRF51_TIMER_REG_INTENCLR
:
258 s
->inten
&= ~(value
& NRF51_TIMER_REG_INTEN_MASK
);
260 case NRF51_TIMER_REG_MODE
:
263 case NRF51_TIMER_REG_BITMODE
:
264 if (s
->mode
== NRF51_TIMER_TIMER
&& s
->running
) {
265 qemu_log_mask(LOG_GUEST_ERROR
,
266 "%s: erroneous change of BITMODE while timer is running\n",
269 s
->bitmode
= value
& NRF51_TIMER_REG_BITMODE_MASK
;
271 case NRF51_TIMER_REG_PRESCALER
:
272 if (s
->mode
== NRF51_TIMER_TIMER
&& s
->running
) {
273 qemu_log_mask(LOG_GUEST_ERROR
,
274 "%s: erroneous change of PRESCALER while timer is running\n",
277 s
->prescaler
= value
& NRF51_TIMER_REG_PRESCALER_MASK
;
279 case NRF51_TIMER_REG_CC0
... NRF51_TIMER_REG_CC3
:
281 timer_expire(s
); /* update counter */
284 idx
= (offset
- NRF51_TIMER_REG_CC0
) / 4;
285 s
->cc
[idx
] = value
% BIT(bitwidths
[s
->bitmode
]);
292 qemu_log_mask(LOG_GUEST_ERROR
,
293 "%s: bad write offset 0x%" HWADDR_PRIx
"\n",
300 static const MemoryRegionOps rng_ops
= {
301 .read
= nrf51_timer_read
,
302 .write
= nrf51_timer_write
,
303 .endianness
= DEVICE_LITTLE_ENDIAN
,
304 .impl
.min_access_size
= 4,
305 .impl
.max_access_size
= 4,
308 static void nrf51_timer_init(Object
*obj
)
310 NRF51TimerState
*s
= NRF51_TIMER(obj
);
311 SysBusDevice
*sbd
= SYS_BUS_DEVICE(obj
);
313 memory_region_init_io(&s
->iomem
, obj
, &rng_ops
, s
,
314 TYPE_NRF51_TIMER
, NRF51_TIMER_SIZE
);
315 sysbus_init_mmio(sbd
, &s
->iomem
);
316 sysbus_init_irq(sbd
, &s
->irq
);
318 timer_init_ns(&s
->timer
, QEMU_CLOCK_VIRTUAL
, timer_expire
, s
);
321 static void nrf51_timer_reset(DeviceState
*dev
)
323 NRF51TimerState
*s
= NRF51_TIMER(dev
);
325 timer_del(&s
->timer
);
326 s
->timer_start_ns
= 0x00;
327 s
->update_counter_ns
= 0x00;
331 memset(s
->events_compare
, 0x00, sizeof(s
->events_compare
));
332 memset(s
->cc
, 0x00, sizeof(s
->cc
));
341 static int nrf51_timer_post_load(void *opaque
, int version_id
)
343 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
345 if (s
->running
&& s
->mode
== NRF51_TIMER_TIMER
) {
351 static const VMStateDescription vmstate_nrf51_timer
= {
352 .name
= TYPE_NRF51_TIMER
,
354 .post_load
= nrf51_timer_post_load
,
355 .fields
= (VMStateField
[]) {
356 VMSTATE_TIMER(timer
, NRF51TimerState
),
357 VMSTATE_INT64(timer_start_ns
, NRF51TimerState
),
358 VMSTATE_INT64(update_counter_ns
, NRF51TimerState
),
359 VMSTATE_UINT32(counter
, NRF51TimerState
),
360 VMSTATE_BOOL(running
, NRF51TimerState
),
361 VMSTATE_UINT8_ARRAY(events_compare
, NRF51TimerState
,
362 NRF51_TIMER_REG_COUNT
),
363 VMSTATE_UINT32_ARRAY(cc
, NRF51TimerState
, NRF51_TIMER_REG_COUNT
),
364 VMSTATE_UINT32(shorts
, NRF51TimerState
),
365 VMSTATE_UINT32(inten
, NRF51TimerState
),
366 VMSTATE_UINT32(mode
, NRF51TimerState
),
367 VMSTATE_UINT32(bitmode
, NRF51TimerState
),
368 VMSTATE_UINT32(prescaler
, NRF51TimerState
),
369 VMSTATE_END_OF_LIST()
373 static void nrf51_timer_class_init(ObjectClass
*klass
, void *data
)
375 DeviceClass
*dc
= DEVICE_CLASS(klass
);
377 dc
->reset
= nrf51_timer_reset
;
378 dc
->vmsd
= &vmstate_nrf51_timer
;
381 static const TypeInfo nrf51_timer_info
= {
382 .name
= TYPE_NRF51_TIMER
,
383 .parent
= TYPE_SYS_BUS_DEVICE
,
384 .instance_size
= sizeof(NRF51TimerState
),
385 .instance_init
= nrf51_timer_init
,
386 .class_init
= nrf51_timer_class_init
389 static void nrf51_timer_register_types(void)
391 type_register_static(&nrf51_timer_info
);
394 type_init(nrf51_timer_register_types
)