From bcaf0bc655df337bc02c5dd78bfc3f4487103959 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Tue, 29 Oct 2024 11:42:22 -0600 Subject: Implement RP2040 hw alarms --- libhw/rp2040_include/libhw/rp2040_hwalarm.h | 55 +++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 libhw/rp2040_include/libhw/rp2040_hwalarm.h (limited to 'libhw/rp2040_include') diff --git a/libhw/rp2040_include/libhw/rp2040_hwalarm.h b/libhw/rp2040_include/libhw/rp2040_hwalarm.h new file mode 100644 index 0000000..3a7ae10 --- /dev/null +++ b/libhw/rp2040_include/libhw/rp2040_hwalarm.h @@ -0,0 +1,55 @@ +/* libhw/rp2040_hwalarm.h - Alarms for the RP2040 + * + * Copyright (C) 2024 Luke T. Shumaker + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#ifndef _LIBHW_RP2040_HWALARM_H_ +#define _LIBHW_RP2040_HWALARM_H_ + +#include /* for bool */ +#include /* for uint{n}_t */ + +#include /* for BEGIN_PRIVATE, END_PRIVATE */ + +/** + * The RP2040 has one system "timer" (which we also use for + * ./rp2040_bootclock.c) with 4 alarm interrupts. + */ +enum rp2040_hwalarm_instance { + RP2040_HWALARM_0 = 0, + RP2040_HWALARM_1 = 1, + RP2040_HWALARM_2 = 2, + RP2040_HWALARM_3 = 3, + _RP2040_HWALARM_NUM, +}; + +struct rp2040_hwalarm_trigger; +struct rp2040_hwalarm_trigger { + BEGIN_PRIVATE(LIBHW_RP2040_HWALARM_H) + void *alarm; + struct rp2040_hwalarm_trigger *prev, *next; + + uint64_t fire_at_us; + void (*cb)(void *); + void *cb_arg; + END_PRIVATE(LIBHW_RP2040_HWALARM_H) +}; + +/** + * Returns true on error. + * + * fire_at_ns must be at most UINT32_MAX µs (72 minutes) in the future + * (or an error will be returned). + * + * If fire_at_ns is in the past, then it will fire immediately. + */ +bool rp2040_hwalarm_trigger_init(struct rp2040_hwalarm_trigger *self, + enum rp2040_hwalarm_instance alarm_num, + uint64_t fire_at_ns, + void (*cb)(void *), + void *cb_arg); + +void rp2040_hwalarm_trigger_cancel(struct rp2040_hwalarm_trigger *self); + +#endif /* _LIBHW_RP2040_HWALARM_H_ */ -- cgit v1.2.3-2-g168b