3#if defined(ARDUINO_ARCH_TANGNANO20K)
5#include "tangnano20k_soc.h"
6#include "tangnano20k_timer.h"
19class AudioTimerDriverTangNano :
public AudioTimerDriverBase {
21 AudioTimerDriverTangNano() =
default;
23 bool begin(repeating_timer_callback_t callback_f, uint32_t time,
24 TimeUnit unit = MS)
override {
25 LOGI(
"timer time: %u %s", (
unsigned int)time, toString(unit));
27 LOGE(
"Invalid time: 0");
30 instanceCallback = callback_f;
35 ticks = (uint64_t)time * TANGNANO20K_CLK_FREQ / 1000ULL;
38 ticks = (uint64_t)time * TANGNANO20K_CLK_FREQ / 1000000ULL;
41 ticks = TANGNANO20K_CLK_FREQ / time;
44 LOGE(
"Undefined Unit");
47 if (ticks == 0) ticks = 1;
50 handle = tangnano20k_sw_timer_alloc();
51 if (handle < 0 || handle >= TANGNANO20K_SW_TIMER_COUNT) {
52 LOGE(
"No free timer available");
57 self()[handle] =
this;
58 if (!tangnano20k_sw_timer_start(handle, trampolines()[handle], ticks,
60 LOGE(
"Could not start timer");
68 if (handle < 0)
return false;
69 tangnano20k_sw_timer_release(handle);
70 self()[handle] =
nullptr;
80 static AudioTimerDriverTangNano **self() {
81 static AudioTimerDriverTangNano *result[TANGNANO20K_SW_TIMER_COUNT] = {};
86 static void trampoline() {
87 AudioTimerDriverTangNano *p = self()[N];
88 if (p !=
nullptr && p->instanceCallback !=
nullptr)
89 p->instanceCallback(p->object);
92 static_assert(TANGNANO20K_SW_TIMER_COUNT == 6,
93 "trampolines() must match TANGNANO20K_SW_TIMER_COUNT");
95 static void (**trampolines())(void) {
96 static void (*result[TANGNANO20K_SW_TIMER_COUNT])(void) = {
97 trampoline<0>, trampoline<1>, trampoline<2>,
98 trampoline<3>, trampoline<4>, trampoline<5>};
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30
@ US
Definition AudioTypes.h:49
@ HZ
Definition AudioTypes.h:49
@ MS
Definition AudioTypes.h:49
constexpr const _Ep * end(initializer_list< _Ep > __il) noexcept
Definition InitializerList.h:63
constexpr const _Ep * begin(initializer_list< _Ep > __il) noexcept
Definition InitializerList.h:55