Lines Matching +full:armv7m +full:- +full:systick
2 * ARMv7M SysTick timer
4 * Copyright (c) 2006-2007 CodeSourcery.
17 #include "hw/qdev-clock.h"
31 #define SYSCALIB_TENMS ((1U << 24) - 1)
39 if (s->control & SYSTICK_CLKSOURCE) { in systick_set_period_from_clock()
40 ptimer_set_period_from_clock(s->ptimer, s->cpuclk, 1); in systick_set_period_from_clock()
42 ptimer_set_period_from_clock(s->ptimer, s->refclk, 1); in systick_set_period_from_clock()
52 s->control |= SYSTICK_COUNTFLAG; in systick_timer_tick()
53 if (s->control & SYSTICK_TICKINT) { in systick_timer_tick()
54 /* Tell the NVIC to pend the SysTick exception */ in systick_timer_tick()
55 qemu_irq_pulse(s->irq); in systick_timer_tick()
57 if (ptimer_get_limit(s->ptimer) == 0) { in systick_timer_tick()
62 ptimer_stop(s->ptimer); in systick_timer_tick()
78 case 0x0: /* SysTick Control and Status. */ in systick_read()
79 val = s->control; in systick_read()
80 s->control &= ~SYSTICK_COUNTFLAG; in systick_read()
82 case 0x4: /* SysTick Reload Value. */ in systick_read()
83 val = ptimer_get_limit(s->ptimer); in systick_read()
85 case 0x8: /* SysTick Current Value. */ in systick_read()
86 val = ptimer_get_count(s->ptimer); in systick_read()
88 case 0xc: /* SysTick Calibration Value. */ in systick_read()
101 if (!clock_has_source(s->refclk)) { in systick_read()
105 val = clock_ns_to_ticks(s->refclk, 10 * SCALE_MS) - 1; in systick_read()
107 if (clock_ticks_to_ns(s->refclk, val + 1) != 10 * SCALE_MS) { in systick_read()
115 "SysTick: Bad read offset 0x%" HWADDR_PRIx "\n", addr); in systick_read()
138 case 0x0: /* SysTick Control and Status. */ in systick_write()
142 if (!clock_has_source(s->refclk)) { in systick_write()
147 ptimer_transaction_begin(s->ptimer); in systick_write()
148 oldval = s->control; in systick_write()
149 s->control &= 0xfffffff8; in systick_write()
150 s->control |= value & 7; in systick_write()
158 ptimer_run(s->ptimer, 0); in systick_write()
160 ptimer_stop(s->ptimer); in systick_write()
163 ptimer_transaction_commit(s->ptimer); in systick_write()
166 case 0x4: /* SysTick Reload Value. */ in systick_write()
167 ptimer_transaction_begin(s->ptimer); in systick_write()
168 ptimer_set_limit(s->ptimer, value & 0xffffff, 0); in systick_write()
169 ptimer_transaction_commit(s->ptimer); in systick_write()
171 case 0x8: /* SysTick Current Value. */ in systick_write()
177 ptimer_transaction_begin(s->ptimer); in systick_write()
178 if (ptimer_get_limit(s->ptimer) == 0) { in systick_write()
179 ptimer_stop(s->ptimer); in systick_write()
181 ptimer_set_count(s->ptimer, 0); in systick_write()
182 s->control &= ~SYSTICK_COUNTFLAG; in systick_write()
183 ptimer_transaction_commit(s->ptimer); in systick_write()
187 "SysTick: Bad write offset 0x%" HWADDR_PRIx "\n", addr); in systick_write()
202 SysTickState *s = SYSTICK(dev); in systick_reset()
204 ptimer_transaction_begin(s->ptimer); in systick_reset()
205 s->control = 0; in systick_reset()
206 if (!clock_has_source(s->refclk)) { in systick_reset()
208 s->control |= SYSTICK_CLKSOURCE; in systick_reset()
210 ptimer_stop(s->ptimer); in systick_reset()
211 ptimer_set_count(s->ptimer, 0); in systick_reset()
212 ptimer_set_limit(s->ptimer, 0, 0); in systick_reset()
214 ptimer_transaction_commit(s->ptimer); in systick_reset()
219 SysTickState *s = SYSTICK(opaque); in systick_cpuclk_update()
221 if (!(s->control & SYSTICK_CLKSOURCE)) { in systick_cpuclk_update()
225 ptimer_transaction_begin(s->ptimer); in systick_cpuclk_update()
226 ptimer_set_period_from_clock(s->ptimer, s->cpuclk, 1); in systick_cpuclk_update()
227 ptimer_transaction_commit(s->ptimer); in systick_cpuclk_update()
232 SysTickState *s = SYSTICK(opaque); in systick_refclk_update()
234 if (s->control & SYSTICK_CLKSOURCE) { in systick_refclk_update()
238 ptimer_transaction_begin(s->ptimer); in systick_refclk_update()
239 ptimer_set_period_from_clock(s->ptimer, s->refclk, 1); in systick_refclk_update()
240 ptimer_transaction_commit(s->ptimer); in systick_refclk_update()
246 SysTickState *s = SYSTICK(obj); in systick_instance_init()
248 memory_region_init_io(&s->iomem, obj, &systick_ops, s, "systick", 0xe0); in systick_instance_init()
249 sysbus_init_mmio(sbd, &s->iomem); in systick_instance_init()
250 sysbus_init_irq(sbd, &s->irq); in systick_instance_init()
252 s->refclk = qdev_init_clock_in(DEVICE(obj), "refclk", in systick_instance_init()
254 s->cpuclk = qdev_init_clock_in(DEVICE(obj), "cpuclk", in systick_instance_init()
260 SysTickState *s = SYSTICK(dev); in systick_realize()
261 s->ptimer = ptimer_init(systick_timer_tick, s, in systick_realize()
267 if (!clock_has_source(s->cpuclk)) { in systick_realize()
268 error_setg(errp, "systick: cpuclk must be connected"); in systick_realize()
292 dc->vmsd = &vmstate_systick; in systick_class_init()
294 dc->realize = systick_realize; in systick_class_init()