]>
Commit | Line | Data |
---|---|---|
c5a4829c SG |
1 | /* |
2 | * nRF51 System-on-Chip Timer peripheral | |
3 | * | |
4 | * QEMU interface: | |
5 | * + sysbus MMIO regions 0: GPIO registers | |
6 | * + sysbus irq | |
7 | * | |
8 | * Copyright 2018 Steffen Görtz <contrib@steffen-goertz.de> | |
9 | * | |
10 | * This code is licensed under the GPL version 2 or later. See | |
11 | * the COPYING file in the top-level directory. | |
12 | */ | |
13 | #ifndef NRF51_TIMER_H | |
14 | #define NRF51_TIMER_H | |
15 | ||
16 | #include "hw/sysbus.h" | |
17 | #include "qemu/timer.h" | |
db1015e9 | 18 | #include "qom/object.h" |
c5a4829c | 19 | #define TYPE_NRF51_TIMER "nrf51_soc.timer" |
db1015e9 | 20 | typedef struct NRF51TimerState NRF51TimerState; |
8110fa1d EH |
21 | DECLARE_INSTANCE_CHECKER(NRF51TimerState, NRF51_TIMER, |
22 | TYPE_NRF51_TIMER) | |
c5a4829c SG |
23 | |
24 | #define NRF51_TIMER_REG_COUNT 4 | |
25 | ||
26 | #define NRF51_TIMER_TASK_START 0x000 | |
27 | #define NRF51_TIMER_TASK_STOP 0x004 | |
28 | #define NRF51_TIMER_TASK_COUNT 0x008 | |
29 | #define NRF51_TIMER_TASK_CLEAR 0x00C | |
30 | #define NRF51_TIMER_TASK_SHUTDOWN 0x010 | |
31 | #define NRF51_TIMER_TASK_CAPTURE_0 0x040 | |
32 | #define NRF51_TIMER_TASK_CAPTURE_3 0x04C | |
33 | ||
34 | #define NRF51_TIMER_EVENT_COMPARE_0 0x140 | |
35 | #define NRF51_TIMER_EVENT_COMPARE_1 0x144 | |
36 | #define NRF51_TIMER_EVENT_COMPARE_2 0x148 | |
37 | #define NRF51_TIMER_EVENT_COMPARE_3 0x14C | |
38 | ||
39 | #define NRF51_TIMER_REG_SHORTS 0x200 | |
40 | #define NRF51_TIMER_REG_SHORTS_MASK 0xf0f | |
41 | #define NRF51_TIMER_REG_INTENSET 0x304 | |
42 | #define NRF51_TIMER_REG_INTENCLR 0x308 | |
43 | #define NRF51_TIMER_REG_INTEN_MASK 0xf0000 | |
44 | #define NRF51_TIMER_REG_MODE 0x504 | |
45 | #define NRF51_TIMER_REG_MODE_MASK 0x01 | |
46 | #define NRF51_TIMER_TIMER 0 | |
47 | #define NRF51_TIMER_COUNTER 1 | |
48 | #define NRF51_TIMER_REG_BITMODE 0x508 | |
49 | #define NRF51_TIMER_REG_BITMODE_MASK 0x03 | |
50 | #define NRF51_TIMER_WIDTH_16 0 | |
51 | #define NRF51_TIMER_WIDTH_8 1 | |
52 | #define NRF51_TIMER_WIDTH_24 2 | |
53 | #define NRF51_TIMER_WIDTH_32 3 | |
54 | #define NRF51_TIMER_REG_PRESCALER 0x510 | |
55 | #define NRF51_TIMER_REG_PRESCALER_MASK 0x0F | |
56 | #define NRF51_TIMER_REG_CC0 0x540 | |
57 | #define NRF51_TIMER_REG_CC3 0x54C | |
58 | ||
db1015e9 | 59 | struct NRF51TimerState { |
c5a4829c SG |
60 | SysBusDevice parent_obj; |
61 | ||
62 | MemoryRegion iomem; | |
63 | qemu_irq irq; | |
64 | ||
27d6dea3 | 65 | uint8_t id; |
c5a4829c SG |
66 | QEMUTimer timer; |
67 | int64_t timer_start_ns; | |
68 | int64_t update_counter_ns; | |
69 | uint32_t counter; | |
70 | ||
71 | bool running; | |
72 | ||
73 | uint8_t events_compare[NRF51_TIMER_REG_COUNT]; | |
74 | uint32_t cc[NRF51_TIMER_REG_COUNT]; | |
75 | uint32_t shorts; | |
76 | uint32_t inten; | |
77 | uint32_t mode; | |
78 | uint32_t bitmode; | |
79 | uint32_t prescaler; | |
80 | ||
db1015e9 | 81 | }; |
c5a4829c SG |
82 | |
83 | ||
84 | #endif |