ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_bkup.h
Go to the documentation of this file.
1
37
38#pragma once
39
40#ifdef __cplusplus
41extern "C" {
42#endif
43
44#include <stdint.h>
45
46#include "ra8_bkup_regs.h"
47#include "ra8_err.h"
48
49/* =============================================================================
50 * Configuration enums
51 * =============================================================================
52 */
53
73
82
92
97typedef enum : uint8_t {
101
122
132
133/* =============================================================================
134 * Configuration / status structures
135 * =============================================================================
136 */
137
152
169
189
205
219typedef struct {
220 uint32_t bbfsar;
221 uint16_t saba;
222 uint16_t pabas;
223 uint16_t pabans;
225
235typedef void (*ra8_bkup_event_fn_t)(void* ctx, uint8_t tamper_flags);
236
237/* =============================================================================
238 * Lifecycle
239 * =============================================================================
240 */
241
310[[nodiscard]] ra8_err_t ra8_bkup_init(const ra8_bkup_config_t* cfg);
311
335[[nodiscard]] ra8_err_t ra8_bkup_deinit(void);
336
377 uint32_t timeout_iters);
378
409[[nodiscard]] ra8_err_t ra8_bkup_warm_start_check(bool* needs_reinit, uint32_t timeout_iters);
410
437[[nodiscard]] ra8_err_t ra8_bkup_no_switch_init(uint32_t timeout_iters);
438
439/* =============================================================================
440 * Status
441 * =============================================================================
442 */
443
465
488[[nodiscard]] ra8_err_t ra8_bkup_clear_status(uint8_t mask);
489
490/* =============================================================================
491 * VBTBKRn 32-bit word access
492 * =============================================================================
493 */
494
515[[nodiscard]] ra8_err_t ra8_bkup_read_word(uint8_t word_index, uint32_t* out);
516
536[[nodiscard]] ra8_err_t ra8_bkup_write_word(uint8_t word_index, uint32_t value);
537
556[[nodiscard]] ra8_err_t ra8_bkup_read_byte(uint16_t index, uint8_t* out);
557
574[[nodiscard]] ra8_err_t ra8_bkup_write_byte(uint16_t index, uint8_t value);
575
593[[nodiscard]] ra8_err_t ra8_bkup_zero_all(void);
594
595/* =============================================================================
596 * Tamper-detection / RTCIC pad wiring
597 * =============================================================================
598 */
599
630
650[[nodiscard]] ra8_err_t ra8_bkup_tamper_disable(void);
651
669[[nodiscard]] ra8_err_t ra8_bkup_read_input(ra8_bkup_channel_t channel, bool* high_out);
670
686[[nodiscard]] ra8_err_t ra8_bkup_set_input_enable(ra8_bkup_channel_t channel, bool enable);
687
688/* =============================================================================
689 * VBATT analog voltage monitor (VBATTMNSELR)
690 * =============================================================================
691 */
692
715[[nodiscard]] ra8_err_t ra8_bkup_set_voltage_monitor(bool enable);
716
731[[nodiscard]] ra8_err_t ra8_bkup_get_voltage_monitor_enabled(bool* enabled_out);
732
733/* =============================================================================
734 * TrustZone partitioning
735 * =============================================================================
736 */
737
766
782
783/* =============================================================================
784 * Interrupt path
785 * =============================================================================
786 */
787
812[[nodiscard]] ra8_err_t ra8_bkup_attach_handler(ra8_bkup_event_fn_t fn, void* ctx);
813
833[[nodiscard]] ra8_err_t ra8_bkup_isr_handle(void);
834
852void ra8_bkup_dispatch(uint8_t tamper_flags);
853
854#ifdef __cplusplus
855}
856#endif
void(* ra8_bkup_event_fn_t)(void *ctx, uint8_t tamper_flags)
Low-battery / tamper event callback signature.
Definition ra8_bkup.h:235
ra8_err_t ra8_bkup_read_input(ra8_bkup_channel_t channel, bool *high_out)
Read the live RTCICn pin level via VBTIMONR.
ra8_err_t ra8_bkup_clear_status(uint8_t mask)
Clear latched VBPORF and tamper flags selected by mask.
Definition ra8_bkup.c:448
ra8_err_t ra8_bkup_write_word(uint8_t word_index, uint32_t value)
Write one 32-bit word into the VBTBKRn array.
Definition ra8_bkup.c:487
ra8_err_t ra8_bkup_tamper_disable(void)
Disable every tamper input and clear flags.
ra8_bkup_capture_src_t
RTC time-capture event source select (HUM Ch 12.2.16 p 511, VBTADCR2.VBRTCESn).
Definition ra8_bkup.h:128
@ k_ra8_bkup_capture_src_pin
0 -> raw RTCICn pin.
Definition ra8_bkup.h:129
@ k_ra8_bkup_capture_src_vbtadf
1 -> VBTADFn flag.
Definition ra8_bkup.h:130
ra8_bkup_source_t
Live power-source decoded from VBTBPSR.BPWSWM.
Definition ra8_bkup.h:78
@ k_ra8_bkup_source_vbatt
BPWSWM=0: VCC < VDETBATT, on VBATT.
Definition ra8_bkup.h:79
@ k_ra8_bkup_source_vcc
BPWSWM=1: VCC > VDETBATT, on VCC.
Definition ra8_bkup.h:80
ra8_err_t ra8_bkup_read_byte(uint16_t index, uint8_t *out)
Read one 8-bit byte from the VBTBKRn array.
Definition ra8_bkup.c:504
ra8_err_t ra8_bkup_init(const ra8_bkup_config_t *cfg)
Configure the battery-backup block from cfg.
Definition ra8_bkup.c:222
ra8_bkup_vdet_level_t
VDETBATT trip level (HUM Ch 12.2.12 p 508, VBTBPCR2.VDETLVL).
Definition ra8_bkup.h:65
@ k_ra8_bkup_vdet_2p80v
000b: 2.80 V (default after reset).
Definition ra8_bkup.h:66
@ k_ra8_bkup_vdet_2p53v
001b: 2.53 V.
Definition ra8_bkup.h:67
@ k_ra8_bkup_vdet_2p10v
010b: 2.10 V.
Definition ra8_bkup.h:68
@ k_ra8_bkup_vdet_1p85v
100b: 1.85 V.
Definition ra8_bkup.h:70
@ k_ra8_bkup_vdet_1p75v
101b: 1.75 V.
Definition ra8_bkup.h:71
@ k_ra8_bkup_vdet_1p95v
011b: 1.95 V.
Definition ra8_bkup.h:69
ra8_err_t ra8_bkup_warm_start_check(bool *needs_reinit, uint32_t timeout_iters)
Warm-start sanity check (HUM Ch 12.3.7.2 p 517).
Definition ra8_bkup.c:341
ra8_err_t ra8_bkup_security_get(ra8_bkup_security_config_t *cfg)
Read back the four security partition registers.
ra8_bkup_nc_width_t
Noise-canceller sampling clock select (HUM Ch 12.2.18 p 511, VBTNCWCR.VINCW).
Definition ra8_bkup.h:112
@ k_ra8_bkup_nc_width_1hz
111b: 1 Hz.
Definition ra8_bkup.h:120
@ k_ra8_bkup_nc_width_16hz
011b: 16 Hz.
Definition ra8_bkup.h:116
@ k_ra8_bkup_nc_width_32hz
010b: 32 Hz.
Definition ra8_bkup.h:115
@ k_ra8_bkup_nc_width_32768hz
000b: 32.768 kHz (sub-clock).
Definition ra8_bkup.h:113
@ k_ra8_bkup_nc_width_8hz
100b: 8 Hz.
Definition ra8_bkup.h:117
@ k_ra8_bkup_nc_width_2hz
110b: 2 Hz.
Definition ra8_bkup.h:119
@ k_ra8_bkup_nc_width_4hz
101b: 4 Hz.
Definition ra8_bkup.h:118
@ k_ra8_bkup_nc_width_64hz
001b: 64 Hz.
Definition ra8_bkup.h:114
ra8_err_t ra8_bkup_attach_handler(ra8_bkup_event_fn_t fn, void *ctx)
Attach the shared low-battery / tamper event callback.
Definition ra8_bkup.c:580
ra8_err_t ra8_bkup_get_voltage_monitor_enabled(bool *enabled_out)
Read the live VBATTMNSELR.VBTMNSEL bit.
Definition ra8_bkup.c:567
ra8_err_t ra8_bkup_get_status(ra8_bkup_status_t *out)
Read VBTBPSR + VBTADSR and decode into out.
Definition ra8_bkup.c:427
ra8_err_t ra8_bkup_tamper_init(const ra8_bkup_tamper_config_t *cfg)
Apply per-channel tamper configuration in one shot.
ra8_err_t ra8_bkup_set_input_enable(ra8_bkup_channel_t channel, bool enable)
Convenience wrapper that just sets / clears VCHnINEN.
ra8_bkup_edge_t
Tamper-detection edge select (HUM Ch 12.2.9 p 506).
Definition ra8_bkup.h:97
@ k_ra8_bkup_edge_falling
VCHnEG = 0 -> falling edge.
Definition ra8_bkup.h:98
@ k_ra8_bkup_edge_rising
VCHnEG = 1 -> rising edge.
Definition ra8_bkup.h:99
ra8_err_t ra8_bkup_set_voltage_monitor(bool enable)
Enable / disable the VBATT/6 analog tap to ADC16H.
Definition ra8_bkup.c:555
ra8_err_t ra8_bkup_cold_start_init(ra8_bkup_vdet_level_t level, uint32_t timeout_iters)
Drive the cold-start flow from HUM Ch 12.3.7.1 p 517.
Definition ra8_bkup.c:291
ra8_err_t ra8_bkup_deinit(void)
Disable the battery-backup switch and close the VBTBKRn window.
Definition ra8_bkup.c:273
ra8_bkup_channel_t
RTCICn tamper-detection channel index (HUM Ch 12.2.8 p 505).
Definition ra8_bkup.h:87
@ k_ra8_bkup_chan_rtcic2
RTCIC2 -> VBTADF2 / VCH2*.
Definition ra8_bkup.h:90
@ k_ra8_bkup_chan_rtcic1
RTCIC1 -> VBTADF1 / VCH1*.
Definition ra8_bkup.h:89
@ k_ra8_bkup_chan_rtcic0
RTCIC0 -> VBTADF0 / VCH0*.
Definition ra8_bkup.h:88
ra8_err_t ra8_bkup_read_word(uint8_t word_index, uint32_t *out)
Read one 32-bit word from the VBTBKRn array.
Definition ra8_bkup.c:474
ra8_err_t ra8_bkup_write_byte(uint16_t index, uint8_t value)
Write one 8-bit byte into the VBTBKRn array.
Definition ra8_bkup.c:517
ra8_err_t ra8_bkup_zero_all(void)
Bulk-zeroise the entire 128-byte backup-register array.
Definition ra8_bkup.c:533
ra8_err_t ra8_bkup_security_apply(const ra8_bkup_security_config_t *cfg)
Apply BBFSAR + VBRSABAR + VBRPABAR{S,NS} from one descriptor.
void ra8_bkup_dispatch(uint8_t tamper_flags)
Fire the registered callback (called from the ISR shim).
Definition ra8_bkup.c:613
ra8_err_t ra8_bkup_no_switch_init(uint32_t timeout_iters)
"Power-supply switch unused" init flow (HUM Ch 12.3.7.3 p 518).
Definition ra8_bkup.c:367
ra8_err_t ra8_bkup_isr_handle(void)
ISR entry point that fires the registered callback.
Definition ra8_bkup.c:587
Battery Backup Function (VBATT / BAT*) register layout for the RA8D2.
@ k_ra8_bkup_chan_count
RTCIC0..RTCIC2 tamper channels.
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
Configuration descriptor passed to ra8_bkup_init.
Definition ra8_bkup.h:147
ra8_bkup_vdet_level_t vdet_level
VDETBATT trip threshold (VBTBPCR2.VDETLVL).
Definition ra8_bkup.h:148
bool enable_backup
true -> set VBTBER.VBAE so VBTBKRn is accessible.
Definition ra8_bkup.h:150
bool enable_switch
true -> clear BPWSWSTP, allow VCC->VBATT switching.
Definition ra8_bkup.h:149
BBFSAR + backup-register boundary descriptor.
Definition ra8_bkup.h:219
uint16_t pabans
VBRPABARNS.PABANS (32-byte aligned).
Definition ra8_bkup.h:223
uint16_t saba
VBRSABAR.SABA (32-byte aligned).
Definition ra8_bkup.h:221
uint32_t bbfsar
OR of k_ra8_bkup_bbfsar_mask_* bits.
Definition ra8_bkup.h:220
uint16_t pabas
VBRPABARS.PABAS (32-byte aligned).
Definition ra8_bkup.h:222
Decoded snapshot of VBTBPSR.
Definition ra8_bkup.h:162
uint8_t tamper_flags
Raw VBTADSR.VBTADF[2:0] mask.
Definition ra8_bkup.h:166
bool por_detected
VBPORF: VBATT_POR reset latched (W0C).
Definition ra8_bkup.h:165
uint8_t raw_vbtbpsr
Unmodified VBTBPSR (debug aid).
Definition ra8_bkup.h:167
ra8_bkup_source_t source
Active power source right now.
Definition ra8_bkup.h:163
bool vbatt_r_ok
VBPORM: VBATT_R > VPORBATT (post-OK).
Definition ra8_bkup.h:164
Per-channel tamper-detection configuration.
Definition ra8_bkup.h:180
bool zeroize_huk
VBTADZEn: assert HUK zeroize on flag.
Definition ra8_bkup.h:186
ra8_bkup_capture_src_t capture_src
VBRTCESn: RTC time-capture source select.
Definition ra8_bkup.h:187
bool clear_backup
VBTADCEn: zeroise VBTBKRn on flag.
Definition ra8_bkup.h:185
ra8_bkup_edge_t edge
VCHnEG: falling vs rising trigger edge.
Definition ra8_bkup.h:183
bool input_enable
VCHnINEN: drive RTCICn pad as input.
Definition ra8_bkup.h:181
bool irq_enable
VBTADIEn: route flag to VBATTADI ICU slot.
Definition ra8_bkup.h:184
bool noise_canceller_en
VCHnNCE: enable 3-tap synchroniser.
Definition ra8_bkup.h:182
Whole-block tamper-detection configuration.
Definition ra8_bkup.h:200
ra8_bkup_nc_width_t nc_width
VINCW noise-sampling clock.
Definition ra8_bkup.h:201
ra8_bkup_tamper_chan_cfg_t channels[(uint8_t) k_ra8_bkup_chan_count]
Channels.
Definition ra8_bkup.h:203