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"
22 #define TIMER_CLK_FREQ 16000000UL
24 static uint32_t const bitwidths
[] = {16, 8, 24, 32};
26 static uint32_t ns_to_ticks(NRF51TimerState
*s
, int64_t ns
)
28 uint32_t freq
= TIMER_CLK_FREQ
>> s
->prescaler
;
30 return muldiv64(ns
, freq
, NANOSECONDS_PER_SECOND
);
33 static int64_t ticks_to_ns(NRF51TimerState
*s
, uint32_t ticks
)
35 uint32_t freq
= TIMER_CLK_FREQ
>> s
->prescaler
;
37 return muldiv64(ticks
, NANOSECONDS_PER_SECOND
, freq
);
40 /* Returns number of ticks since last call */
41 static uint32_t update_counter(NRF51TimerState
*s
, int64_t now
)
43 uint32_t ticks
= ns_to_ticks(s
, now
- s
->update_counter_ns
);
45 s
->counter
= (s
->counter
+ ticks
) % BIT(bitwidths
[s
->bitmode
]);
46 s
->update_counter_ns
= now
;
50 /* Assumes s->counter is up-to-date */
51 static void rearm_timer(NRF51TimerState
*s
, int64_t now
)
53 int64_t min_ns
= INT64_MAX
;
56 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
59 if (s
->events_compare
[i
]) {
60 continue; /* already expired, ignore it for now */
63 if (s
->cc
[i
] <= s
->counter
) {
64 delta_ns
= ticks_to_ns(s
, BIT(bitwidths
[s
->bitmode
]) -
65 s
->counter
+ s
->cc
[i
]);
67 delta_ns
= ticks_to_ns(s
, s
->cc
[i
] - s
->counter
);
70 if (delta_ns
< min_ns
) {
75 if (min_ns
!= INT64_MAX
) {
76 timer_mod_ns(&s
->timer
, now
+ min_ns
);
80 static void update_irq(NRF51TimerState
*s
)
85 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
86 flag
|= s
->events_compare
[i
] && extract32(s
->inten
, 16 + i
, 1);
88 qemu_set_irq(s
->irq
, flag
);
91 static void timer_expire(void *opaque
)
93 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
94 int64_t now
= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
);
95 uint32_t cc_remaining
[NRF51_TIMER_REG_COUNT
];
96 bool should_stop
= false;
100 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
101 if (s
->cc
[i
] > s
->counter
) {
102 cc_remaining
[i
] = s
->cc
[i
] - s
->counter
;
104 cc_remaining
[i
] = BIT(bitwidths
[s
->bitmode
]) -
105 s
->counter
+ s
->cc
[i
];
109 ticks
= update_counter(s
, now
);
111 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
112 if (cc_remaining
[i
] <= ticks
) {
113 s
->events_compare
[i
] = 1;
115 if (s
->shorts
& BIT(i
)) {
116 s
->timer_start_ns
= now
;
117 s
->update_counter_ns
= s
->timer_start_ns
;
121 should_stop
|= s
->shorts
& BIT(i
+ 8);
129 timer_del(&s
->timer
);
135 static void counter_compare(NRF51TimerState
*s
)
137 uint32_t counter
= s
->counter
;
140 for (i
= 0; i
< NRF51_TIMER_REG_COUNT
; i
++) {
141 if (counter
== s
->cc
[i
]) {
142 s
->events_compare
[i
] = 1;
144 if (s
->shorts
& BIT(i
)) {
151 static uint64_t nrf51_timer_read(void *opaque
, hwaddr offset
, unsigned int size
)
153 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
157 case NRF51_TIMER_EVENT_COMPARE_0
... NRF51_TIMER_EVENT_COMPARE_3
:
158 r
= s
->events_compare
[(offset
- NRF51_TIMER_EVENT_COMPARE_0
) / 4];
160 case NRF51_TIMER_REG_SHORTS
:
163 case NRF51_TIMER_REG_INTENSET
:
166 case NRF51_TIMER_REG_INTENCLR
:
169 case NRF51_TIMER_REG_MODE
:
172 case NRF51_TIMER_REG_BITMODE
:
175 case NRF51_TIMER_REG_PRESCALER
:
178 case NRF51_TIMER_REG_CC0
... NRF51_TIMER_REG_CC3
:
179 r
= s
->cc
[(offset
- NRF51_TIMER_REG_CC0
) / 4];
182 qemu_log_mask(LOG_GUEST_ERROR
,
183 "%s: bad read offset 0x%" HWADDR_PRIx
"\n",
187 trace_nrf51_timer_read(offset
, r
, size
);
192 static void nrf51_timer_write(void *opaque
, hwaddr offset
,
193 uint64_t value
, unsigned int size
)
195 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
196 uint64_t now
= qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
);
199 trace_nrf51_timer_write(offset
, value
, size
);
202 case NRF51_TIMER_TASK_START
:
203 if (value
== NRF51_TRIGGER_TASK
&& s
->mode
== NRF51_TIMER_TIMER
) {
205 s
->timer_start_ns
= now
- ticks_to_ns(s
, s
->counter
);
206 s
->update_counter_ns
= s
->timer_start_ns
;
210 case NRF51_TIMER_TASK_STOP
:
211 case NRF51_TIMER_TASK_SHUTDOWN
:
212 if (value
== NRF51_TRIGGER_TASK
) {
214 timer_del(&s
->timer
);
217 case NRF51_TIMER_TASK_COUNT
:
218 if (value
== NRF51_TRIGGER_TASK
&& s
->mode
== NRF51_TIMER_COUNTER
) {
219 s
->counter
= (s
->counter
+ 1) % BIT(bitwidths
[s
->bitmode
]);
223 case NRF51_TIMER_TASK_CLEAR
:
224 if (value
== NRF51_TRIGGER_TASK
) {
225 s
->timer_start_ns
= now
;
226 s
->update_counter_ns
= s
->timer_start_ns
;
233 case NRF51_TIMER_TASK_CAPTURE_0
... NRF51_TIMER_TASK_CAPTURE_3
:
234 if (value
== NRF51_TRIGGER_TASK
) {
236 timer_expire(s
); /* update counter and all state */
239 idx
= (offset
- NRF51_TIMER_TASK_CAPTURE_0
) / 4;
240 s
->cc
[idx
] = s
->counter
;
243 case NRF51_TIMER_EVENT_COMPARE_0
... NRF51_TIMER_EVENT_COMPARE_3
:
244 if (value
== NRF51_EVENT_CLEAR
) {
245 s
->events_compare
[(offset
- NRF51_TIMER_EVENT_COMPARE_0
) / 4] = 0;
248 timer_expire(s
); /* update counter and all state */
252 case NRF51_TIMER_REG_SHORTS
:
253 s
->shorts
= value
& NRF51_TIMER_REG_SHORTS_MASK
;
255 case NRF51_TIMER_REG_INTENSET
:
256 s
->inten
|= value
& NRF51_TIMER_REG_INTEN_MASK
;
258 case NRF51_TIMER_REG_INTENCLR
:
259 s
->inten
&= ~(value
& NRF51_TIMER_REG_INTEN_MASK
);
261 case NRF51_TIMER_REG_MODE
:
264 case NRF51_TIMER_REG_BITMODE
:
265 if (s
->mode
== NRF51_TIMER_TIMER
&& s
->running
) {
266 qemu_log_mask(LOG_GUEST_ERROR
,
267 "%s: erroneous change of BITMODE while timer is running\n",
270 s
->bitmode
= value
& NRF51_TIMER_REG_BITMODE_MASK
;
272 case NRF51_TIMER_REG_PRESCALER
:
273 if (s
->mode
== NRF51_TIMER_TIMER
&& s
->running
) {
274 qemu_log_mask(LOG_GUEST_ERROR
,
275 "%s: erroneous change of PRESCALER while timer is running\n",
278 s
->prescaler
= value
& NRF51_TIMER_REG_PRESCALER_MASK
;
280 case NRF51_TIMER_REG_CC0
... NRF51_TIMER_REG_CC3
:
282 timer_expire(s
); /* update counter */
285 idx
= (offset
- NRF51_TIMER_REG_CC0
) / 4;
286 s
->cc
[idx
] = value
% BIT(bitwidths
[s
->bitmode
]);
293 qemu_log_mask(LOG_GUEST_ERROR
,
294 "%s: bad write offset 0x%" HWADDR_PRIx
"\n",
301 static const MemoryRegionOps rng_ops
= {
302 .read
= nrf51_timer_read
,
303 .write
= nrf51_timer_write
,
304 .endianness
= DEVICE_LITTLE_ENDIAN
,
305 .impl
.min_access_size
= 4,
306 .impl
.max_access_size
= 4,
309 static void nrf51_timer_init(Object
*obj
)
311 NRF51TimerState
*s
= NRF51_TIMER(obj
);
312 SysBusDevice
*sbd
= SYS_BUS_DEVICE(obj
);
314 memory_region_init_io(&s
->iomem
, obj
, &rng_ops
, s
,
315 TYPE_NRF51_TIMER
, NRF51_TIMER_SIZE
);
316 sysbus_init_mmio(sbd
, &s
->iomem
);
317 sysbus_init_irq(sbd
, &s
->irq
);
319 timer_init_ns(&s
->timer
, QEMU_CLOCK_VIRTUAL
, timer_expire
, s
);
322 static void nrf51_timer_reset(DeviceState
*dev
)
324 NRF51TimerState
*s
= NRF51_TIMER(dev
);
326 timer_del(&s
->timer
);
327 s
->timer_start_ns
= 0x00;
328 s
->update_counter_ns
= 0x00;
332 memset(s
->events_compare
, 0x00, sizeof(s
->events_compare
));
333 memset(s
->cc
, 0x00, sizeof(s
->cc
));
342 static int nrf51_timer_post_load(void *opaque
, int version_id
)
344 NRF51TimerState
*s
= NRF51_TIMER(opaque
);
346 if (s
->running
&& s
->mode
== NRF51_TIMER_TIMER
) {
352 static const VMStateDescription vmstate_nrf51_timer
= {
353 .name
= TYPE_NRF51_TIMER
,
355 .post_load
= nrf51_timer_post_load
,
356 .fields
= (VMStateField
[]) {
357 VMSTATE_TIMER(timer
, NRF51TimerState
),
358 VMSTATE_INT64(timer_start_ns
, NRF51TimerState
),
359 VMSTATE_INT64(update_counter_ns
, NRF51TimerState
),
360 VMSTATE_UINT32(counter
, NRF51TimerState
),
361 VMSTATE_BOOL(running
, NRF51TimerState
),
362 VMSTATE_UINT8_ARRAY(events_compare
, NRF51TimerState
,
363 NRF51_TIMER_REG_COUNT
),
364 VMSTATE_UINT32_ARRAY(cc
, NRF51TimerState
, NRF51_TIMER_REG_COUNT
),
365 VMSTATE_UINT32(shorts
, NRF51TimerState
),
366 VMSTATE_UINT32(inten
, NRF51TimerState
),
367 VMSTATE_UINT32(mode
, NRF51TimerState
),
368 VMSTATE_UINT32(bitmode
, NRF51TimerState
),
369 VMSTATE_UINT32(prescaler
, NRF51TimerState
),
370 VMSTATE_END_OF_LIST()
374 static void nrf51_timer_class_init(ObjectClass
*klass
, void *data
)
376 DeviceClass
*dc
= DEVICE_CLASS(klass
);
378 dc
->reset
= nrf51_timer_reset
;
379 dc
->vmsd
= &vmstate_nrf51_timer
;
382 static const TypeInfo nrf51_timer_info
= {
383 .name
= TYPE_NRF51_TIMER
,
384 .parent
= TYPE_SYS_BUS_DEVICE
,
385 .instance_size
= sizeof(NRF51TimerState
),
386 .instance_init
= nrf51_timer_init
,
387 .class_init
= nrf51_timer_class_init
390 static void nrf51_timer_register_types(void)
392 type_register_static(&nrf51_timer_info
);
395 type_init(nrf51_timer_register_types
)