1 /*
2  * Copyright (c) 2024 Raspberry Pi (Trading) Ltd.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include "hardware/ticks.h"
8 
tick_start(tick_gen_num_t tick,uint cycles)9 void tick_start(tick_gen_num_t tick, uint cycles) {
10     valid_params_if(HARDWARE_TICKS, tick < TICK_COUNT);
11 #if PICO_RP2040
12     ((void)tick);
13     cycles <<= WATCHDOG_TICK_CYCLES_LSB;
14     valid_params_if(HARDWARE_TICKS, cycles <= WATCHDOG_TICK_CYCLES_BITS);
15     // On RP2040, this also provides a tick reference to the timer and SysTick
16     watchdog_hw->tick = cycles | WATCHDOG_TICK_ENABLE_BITS;
17 #else
18     cycles <<= TICKS_WATCHDOG_CYCLES_LSB;
19     valid_params_if(HARDWARE_TICKS, cycles <= TICKS_WATCHDOG_CYCLES_BITS);
20     // On later hardware, separate tick generators for every tick destination.
21     ticks_hw->ticks[tick].cycles = cycles;
22     ticks_hw->ticks[tick].ctrl = TICKS_WATCHDOG_CTRL_ENABLE_BITS;
23 #endif
24 }
25 
tick_stop(tick_gen_num_t tick)26 void tick_stop(tick_gen_num_t tick) {
27     valid_params_if(HARDWARE_TICKS, tick < TICK_COUNT);
28 #if PICO_RP2040
29     ((void)tick);
30     hw_clear_bits(&watchdog_hw->tick, WATCHDOG_TICK_ENABLE_BITS);
31 #else
32     hw_clear_bits(&ticks_hw->ticks[tick].ctrl, TICKS_WATCHDOG_CTRL_ENABLE_BITS);
33 #endif
34 }
35 
tick_is_running(tick_gen_num_t tick)36 bool tick_is_running(tick_gen_num_t tick) {
37     valid_params_if(HARDWARE_TICKS, tick < TICK_COUNT);
38 #if PICO_RP2040
39     ((void)tick);
40     return watchdog_hw->tick & WATCHDOG_TICK_ENABLE_BITS;
41 #else
42     // On later hardware, separate tick generators for every tick destination.
43     return ticks_hw->ticks[tick].ctrl & TICKS_WATCHDOG_CTRL_RUNNING_BITS;
44 #endif
45 }