ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_wdt.h
Go to the documentation of this file.
1
100
101#pragma once
102
103#ifdef __cplusplus
104extern "C" {
105#endif
106
107#include <stdint.h>
108
109#include "ra8_err.h"
110#include "ra8_wdt_regs.h"
111
133
152
168
187
204
221
239
252
263typedef enum : uint8_t {
266
278typedef enum : uint32_t {
281
313
332
343typedef void (*ra8_wdt_event_fn_t)(void* ctx, uint16_t status_mask);
344
345/* =============================================================================
346 * Lifecycle
347 * =============================================================================
348 */
349
394[[nodiscard]] ra8_err_t ra8_wdt_init(const ra8_wdt_cfg_t* cfg);
395
420[[nodiscard]] ra8_err_t ra8_wdt_deinit(void);
421
422/* =============================================================================
423 * Refresh
424 * =============================================================================
425 */
426
447void ra8_wdt_refresh_deferred(void);
448
467
468/* =============================================================================
469 * Status read / clear / counter
470 * =============================================================================
471 */
472
494[[nodiscard]] ra8_err_t ra8_wdt_get_status(uint16_t* out_mask);
495
519[[nodiscard]] ra8_err_t ra8_wdt_clear_status(void);
520
551[[nodiscard]] ra8_err_t ra8_wdt_clear_status_blocking(uint16_t mask);
552
574[[nodiscard]] ra8_err_t ra8_wdt_get_counter(uint16_t* out_count);
575
576/* =============================================================================
577 * Timeout decoding (FSP timeoutGet analogue)
578 * =============================================================================
579 */
580
601[[nodiscard]] ra8_err_t ra8_wdt_timeout_cycles_get(ra8_wdt_timeout_sel_t sel, uint16_t* out_cycles);
602
622[[nodiscard]] ra8_err_t ra8_wdt_pclkb_divisor(ra8_wdt_clock_div_t div, uint16_t* out_divisor);
623
650 uint32_t* out_pclkb_cycles);
651
652/* =============================================================================
653 * Single-callback API (kept for backward compatibility with the existing
654 * ICU shim and the original tests; new code should use subscribe / unsubscribe)
655 * =============================================================================
656 */
657
687[[nodiscard]] ra8_err_t ra8_wdt_attach_handler(ra8_wdt_event_fn_t fn, void* ctx);
688
689/* =============================================================================
690 * Multi-subscriber API (.x) -- hot-pluggable underflow listeners
691 * =============================================================================
692 */
693
729[[nodiscard]] ra8_err_t ra8_wdt_subscribe(ra8_wdt_event_fn_t fn, void* ctx, uint8_t* out_slot);
730
749[[nodiscard]] ra8_err_t ra8_wdt_unsubscribe(uint8_t slot);
750
769uint8_t ra8_wdt_subscriber_count(void);
770
793void ra8_wdt_dispatch(void);
794
795/* =============================================================================
796 * NMI vector wiring (HUM Ch 14.2.14 p 542)
797 * =============================================================================
798 */
799
822[[nodiscard]] ra8_err_t ra8_wdt_install_nmi(void);
823
838[[nodiscard]] ra8_err_t ra8_wdt_uninstall_nmi(void);
839
840/* =============================================================================
841 * Sleep-mode stop control
842 * =============================================================================
843 */
844
865[[nodiscard]] ra8_err_t ra8_wdt_enter_stop(void);
866
888[[nodiscard]] ra8_err_t ra8_wdt_exit_stop(void);
889
890/* =============================================================================
891 * OFS0 / OFS3 read-only decode (HUM Ch 27.2.6 p 1263, Table 27.5 p 1269)
892 * =============================================================================
893 */
894
918typedef ra8_err_t (*ra8_wdt_ofs_reader_fn_t)(uintptr_t ofs_addr, uint32_t* out_word);
919
939
986
987#ifdef __cplusplus
988}
989#endif
Error Code Definitions for ra8-firmware.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
ra8_err_t ra8_wdt_install_nmi(void)
Enable the WDT bit in NMIER so the NMI line fires on underflow.
Definition ra8_wdt.c:598
ra8_err_t ra8_wdt_uninstall_nmi(void)
Disable the WDT bit in NMIER (counterpart to ra8_wdt_install_nmi).
Definition ra8_wdt.c:612
void ra8_wdt_refresh_deferred(void)
Refresh the software WDT counter (WDT0).
Definition ra8_wdt.c:350
ra8_err_t ra8_wdt_ofs_reader_set(ra8_wdt_ofs_reader_fn_t reader)
Override the OFSm reader hook used by ra8_wdt_ofs_get.
Definition ra8_wdt.c:651
ra8_wdt_timeout_sel_t
Legal TOPS[1:0] encodings for WDTCR.
Definition ra8_wdt.h:146
@ k_ra8_wdt_timeout_16384
16384 cycles.
Definition ra8_wdt.h:150
@ k_ra8_wdt_timeout_1024
1024 cycles.
Definition ra8_wdt.h:147
@ k_ra8_wdt_timeout_8192
8192 cycles.
Definition ra8_wdt.h:149
@ k_ra8_wdt_timeout_4096
4096 cycles.
Definition ra8_wdt.h:148
ra8_wdt_clock_div_t
Legal CKS[3:0] encodings for WDTCR.
Definition ra8_wdt.h:125
@ k_ra8_wdt_clkdiv_512
PCLKB / 512.
Definition ra8_wdt.h:129
@ k_ra8_wdt_clkdiv_8192
PCLKB / 8192.
Definition ra8_wdt.h:131
@ k_ra8_wdt_clkdiv_4
PCLKB / 4.
Definition ra8_wdt.h:126
@ k_ra8_wdt_clkdiv_2048
PCLKB / 2048.
Definition ra8_wdt.h:130
@ k_ra8_wdt_clkdiv_64
PCLKB / 64.
Definition ra8_wdt.h:127
@ k_ra8_wdt_clkdiv_128
PCLKB / 128.
Definition ra8_wdt.h:128
ra8_err_t ra8_wdt_refresh_for(ra8_wdt_instance_t which)
Refresh a specific WDT instance.
Definition ra8_wdt.c:356
ra8_err_t ra8_wdt_exit_stop(void)
Disable counter halt on Sleep entry.
Definition ra8_wdt.c:637
ra8_err_t ra8_wdt_timeout_cycles_get(ra8_wdt_timeout_sel_t sel, uint16_t *out_cycles)
Decode a ra8_wdt_timeout_sel_t into its cycle count.
Definition ra8_wdt.c:442
ra8_err_t(* ra8_wdt_ofs_reader_fn_t)(uintptr_t ofs_addr, uint32_t *out_word)
Hook used to fetch one OFSm option-setting word.
Definition ra8_wdt.h:918
ra8_wdt_ofs_strt_t
OFSm.WDTnSTRT encoding – auto vs register start mode.
Definition ra8_wdt.h:235
@ k_ra8_wdt_ofs_strt_auto
Auto-start (OFSm-driven).
Definition ra8_wdt.h:236
@ k_ra8_wdt_ofs_strt_register
Register-start (runtime config).
Definition ra8_wdt.h:237
uint8_t ra8_wdt_subscriber_count(void)
Number of currently-installed subscribers.
Definition ra8_wdt.c:563
ra8_err_t ra8_wdt_init(const ra8_wdt_cfg_t *cfg)
Initialise the WDT in register-start mode.
Definition ra8_wdt.c:296
ra8_wdt_window_start_t
Legal RPSS[1:0] encodings (refresh-permitted window start).
Definition ra8_wdt.h:162
@ k_ra8_wdt_window_start_100
100 % (no upper bound).
Definition ra8_wdt.h:166
@ k_ra8_wdt_window_start_75
75 %.
Definition ra8_wdt.h:165
@ k_ra8_wdt_window_start_25
25 %.
Definition ra8_wdt.h:163
@ k_ra8_wdt_window_start_50
50 %.
Definition ra8_wdt.h:164
ra8_wdt_clear_timeout_t
Bounded retry budget for ra8_wdt_clear_status_blocking.
Definition ra8_wdt.h:278
@ k_ra8_wdt_clear_max_polls
16384 reads – safely > 8193.
Definition ra8_wdt.h:279
ra8_err_t ra8_wdt_unsubscribe(uint8_t slot)
Remove a previously-registered subscriber.
Definition ra8_wdt.c:550
ra8_err_t ra8_wdt_subscribe(ra8_wdt_event_fn_t fn, void *ctx, uint8_t *out_slot)
Add a hot-pluggable subscriber to the WDT NMI dispatch list.
Definition ra8_wdt.c:529
ra8_err_t ra8_wdt_get_status(uint16_t *out_mask)
Read the WDTSR status flag bits.
Definition ra8_wdt.c:371
ra8_wdt_reset_ctrl_t
WDTRCR.RSTIRQS encoding – reset vs NMI on expiry.
Definition ra8_wdt.h:200
@ k_ra8_wdt_on_expiry_nmi
RSTIRQS=0 – route to NMI / IRQ.
Definition ra8_wdt.h:201
@ k_ra8_wdt_on_expiry_reset
RSTIRQS=1 – internal reset.
Definition ra8_wdt.h:202
ra8_err_t ra8_wdt_ofs_get(ra8_wdt_instance_t which, ra8_wdt_ofs_decoded_t *out)
Decode an OFSm option-setting word into ra8_wdt_cfg_t.
Definition ra8_wdt.c:824
ra8_wdt_status_mask_t
WDTSR top-bit status flags.
Definition ra8_wdt.h:247
@ k_ra8_wdt_status_underflow
UNDFF (bit 14).
Definition ra8_wdt.h:249
@ k_ra8_wdt_status_none
No flag set.
Definition ra8_wdt.h:248
@ k_ra8_wdt_status_refresh
REFEF (bit 15).
Definition ra8_wdt.h:250
ra8_wdt_subs_count_t
Maximum number of hot-pluggable subscribers per WDT instance.
Definition ra8_wdt.h:263
@ k_ra8_wdt_max_subs
Max simultaneous subscribers.
Definition ra8_wdt.h:264
ra8_err_t ra8_wdt_clear_status(void)
Clear the WDTSR underflow / refresh-error flags.
Definition ra8_wdt.c:379
ra8_wdt_stop_ctrl_t
WDTCSTPR.SLCSTP encoding – counter behaviour in Sleep.
Definition ra8_wdt.h:217
@ k_ra8_wdt_sleep_keep_count
SLCSTP=0 – counter runs in Sleep.
Definition ra8_wdt.h:218
@ k_ra8_wdt_sleep_stop_count
SLCSTP=1 – counter halts in Sleep.
Definition ra8_wdt.h:219
ra8_err_t ra8_wdt_deinit(void)
Quiesce the driver into a Sleep-stop posture.
Definition ra8_wdt.c:332
ra8_err_t ra8_wdt_pclkb_divisor(ra8_wdt_clock_div_t div, uint16_t *out_divisor)
Decode a ra8_wdt_clock_div_t into its numeric divisor.
Definition ra8_wdt.c:464
ra8_err_t ra8_wdt_total_pclkb_cycles(ra8_wdt_timeout_sel_t sel, ra8_wdt_clock_div_t div, uint32_t *out_pclkb_cycles)
Compute the effective timeout in PCLKB cycles.
Definition ra8_wdt.c:492
ra8_err_t ra8_wdt_get_counter(uint16_t *out_count)
Read the live CNTVAL[13:0] down-counter value.
Definition ra8_wdt.c:428
ra8_err_t ra8_wdt_enter_stop(void)
Enable counter halt on Sleep entry.
Definition ra8_wdt.c:628
void(* ra8_wdt_event_fn_t)(void *ctx, uint16_t status_mask)
WDT NMI / underflow event callback.
Definition ra8_wdt.h:343
ra8_err_t ra8_wdt_attach_handler(ra8_wdt_event_fn_t fn, void *ctx)
Register a callback invoked from the WDT NMI / underflow ISR.
Definition ra8_wdt.c:519
void ra8_wdt_dispatch(void)
Dispatch a WDT event – snapshot WDTSR + fan-out to subscribers.
Definition ra8_wdt.c:575
ra8_err_t ra8_wdt_clear_status_blocking(uint16_t mask)
Clear specific WDTSR flag bits and busy-wait until they read 0.
Definition ra8_wdt.c:389
ra8_wdt_window_end_t
Legal RPES[1:0] encodings (refresh-permitted window end).
Definition ra8_wdt.h:181
@ k_ra8_wdt_window_end_50
50 %.
Definition ra8_wdt.h:183
@ k_ra8_wdt_window_end_0
0 % (no lower bound).
Definition ra8_wdt.h:185
@ k_ra8_wdt_window_end_75
75 %.
Definition ra8_wdt.h:182
@ k_ra8_wdt_window_end_25
25 %.
Definition ra8_wdt.h:184
Watchdog Timer (WDT) register layout for the RA8D2.
@ k_ra8_wdt_sr_refef
REFEF bit 15.
@ k_ra8_wdt_sr_undff
UNDFF bit 14.
ra8_wdt_instance_t
Hardware instance selector used by per-instance helpers.
Register-start-mode configuration block.
Definition ra8_wdt.h:305
ra8_wdt_window_start_t window_start
WDTCR.RPSS[1:0] selection.
Definition ra8_wdt.h:308
ra8_wdt_timeout_sel_t timeout
WDTCR.TOPS[1:0] selection.
Definition ra8_wdt.h:306
ra8_wdt_stop_ctrl_t stop_in_sleep
WDTCSTPR.SLCSTP halt-on-Sleep.
Definition ra8_wdt.h:311
ra8_wdt_clock_div_t clock_div
WDTCR.CKS[3:0] selection.
Definition ra8_wdt.h:307
ra8_wdt_reset_ctrl_t on_expiry
WDTRCR.RSTIRQS reset vs IRQ.
Definition ra8_wdt.h:310
ra8_wdt_window_end_t window_end
WDTCR.RPES[1:0] selection.
Definition ra8_wdt.h:309
Decoded view of an OFSm option-setting word.
Definition ra8_wdt.h:327
ra8_wdt_ofs_strt_t start_mode
OFSm.WDTnSTRT (auto vs register start).
Definition ra8_wdt.h:329
ra8_wdt_cfg_t cfg
Decoded period / divider / window / etc.
Definition ra8_wdt.h:328
bool auto_start
Convenience flag = (start_mode == auto).
Definition ra8_wdt.h:330