ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_bkup_tamper.c
Go to the documentation of this file.
1
33
34#include <stdint.h>
35
36#include "ra8_attributes.h"
37#include "ra8_bkup.h"
38#include "ra8_bkup_internal.h"
39#include "ra8_bkup_regs.h"
40#include "ra8_check.h"
41#include "ra8_err.h"
42#include "ra8_log.h"
44
52
53/* =============================================================================
54 * Internal helpers
55 * =============================================================================
56 */
57
79{
80 if (((uint8_t)ch->edge != k_ra8_bkup_edge_falling) &&
81 ((uint8_t)ch->edge != k_ra8_bkup_edge_rising)) {
83 }
84 if (((uint8_t)ch->capture_src != k_ra8_bkup_capture_src_pin) &&
87 }
88 return k_ra8_ok;
89}
90
115RA8_INTERNAL static inline uint8_t internal_chan_mask(uint8_t base_mask, ra8_bkup_channel_t channel)
116{
117 return (uint8_t)((uint32_t)base_mask << (uint32_t)channel);
118}
119
141{
142 for (uint8_t i = 0U; i < (uint8_t)k_ra8_bkup_chan_count; ++i) {
143 const ra8_err_t err = internal_validate_chan(&cfg->channels[i]);
144 RA8_RETURN_ON_ERROR(err, g_bkup_tag, "tamper_init: channel cfg out of range");
145 }
146 return k_ra8_ok;
147}
148
170{
171 uint8_t ictlr = 0U;
172 for (uint8_t i = 0U; i < (uint8_t)k_ra8_bkup_chan_count; ++i) {
173 if (cfg->channels[i].input_enable) {
176 }
177 }
178 return ictlr;
179}
180
202{
203 uint8_t ictlr2 = 0U;
204 for (uint8_t i = 0U; i < (uint8_t)k_ra8_bkup_chan_count; ++i) {
205 if (cfg->channels[i].noise_canceller_en) {
206 ictlr2 = (uint8_t)(ictlr2 | internal_chan_mask(k_ra8_bkup_vbtictlr2_mask_vch0nce,
208 }
209 if ((uint8_t)cfg->channels[i].edge == k_ra8_bkup_edge_rising) {
210 ictlr2 = (uint8_t)(ictlr2 | internal_chan_mask(k_ra8_bkup_vbtictlr2_mask_vch0eg,
212 }
213 }
214 return ictlr2;
215}
216
238{
239 uint8_t adcr1 = 0U;
240 for (uint8_t i = 0U; i < (uint8_t)k_ra8_bkup_chan_count; ++i) {
241 if (cfg->channels[i].irq_enable) {
244 }
245 if (cfg->channels[i].clear_backup) {
248 }
249 }
250 return adcr1;
251}
252
274{
275 uint8_t adcr2 = 0U;
276 for (uint8_t i = 0U; i < (uint8_t)k_ra8_bkup_chan_count; ++i) {
277 if ((uint8_t)cfg->channels[i].capture_src == k_ra8_bkup_capture_src_vbtadf) {
280 }
281 }
282 return adcr2;
283}
284
306{
307 uint8_t adcr3 = 0U;
308 for (uint8_t i = 0U; i < (uint8_t)k_ra8_bkup_chan_count; ++i) {
309 if (cfg->channels[i].zeroize_huk) {
312 }
313 }
314 return adcr3;
315}
316
317/* =============================================================================
318 * Tamper-detection / RTCIC pad wiring
319 * =============================================================================
320 */
321
323{
324 RA8_CHECK_NULL_PTR(cfg, g_bkup_tag, "tamper cfg must not be nullptr");
325 if ((uint16_t)cfg->nc_width > k_ra8_bkup_max_nc_width) {
327 }
329 RA8_RETURN_ON_ERROR(v_err, g_bkup_tag, "tamper_init: channel cfg out of range");
330
331 /* The whole tamper register file is PRC1 (HUM Ch 13.1 Table 13.1 p 521). */
333 {
334 /* HUM Ch 12.3.5 p 516 + Ch 12.3.7.4 step 0: disable VCHnNCE / VBTADCRn
335 * before changing VINCW. */
336 /* HUM Ch 12.2.9 "VBTICTLR2 : VBATT Input Control Register 2", p 506 */
337 *ra8_bkup_vbtictlr2() = 0U;
338 /* HUM Ch 12.2.15 "VBTADCR1 : VBATT Tamper Detection Control Register 1", p 510 */
339 *ra8_bkup_vbtadcr1() = 0U;
340 /* HUM Ch 12.2.16 "VBTADCR2 : VBATT Tamper Detection Control Register 2", p 511 */
341 *ra8_bkup_vbtadcr2() = 0U;
342 /* HUM Ch 12.2.17 "VBTADCR3 : VBATT Tamper Detection Control Register 3", p 511 */
343 *ra8_bkup_vbtadcr3() = 0U;
344
345 /* Tamper-init step 1 (12.3.7.4 p 518): VCHnINEN. */
346 /* HUM Ch 12.2.8 "VBTICTLR : VBATT Input Control Register", p 505 */
348
349 /* Tamper-init step 3 (12.3.7.4 p 518): VINCW. */
350 /* HUM Ch 12.2.18 "VBTNCWCR : VBATT Noise Canceler Width Control Register", p 512 */
351 *ra8_bkup_vbtncwcr() = (uint8_t)((uint8_t)cfg->nc_width & k_ra8_bkup_vbtncwcr_mask_vincw);
352
353 /* Tamper-init step 4 (12.3.7.4 p 518): VCHnNCE + VCHnEG. */
354 /* HUM Ch 12.2.9 "VBTICTLR2 : VBATT Input Control Register 2", p 506 */
356
357 /* HUM Ch 12.3.7.4 step 7: dummy-read + W0C VBTADFn (pseudo-edge from
358 * the edge-control register write may have set them). */
359 /* HUM Ch 12.2.14 "VBTADSR : VBATT Tamper Detection Status Register", p 509 */
360 (void)*ra8_bkup_vbtadsr();
361 *ra8_bkup_vbtadsr() = 0U;
362
363 /* Tamper-init step 8 (12.3.7.4 p 518): VBTADCR1/2/3. */
364 /* HUM Ch 12.2.15 "VBTADCR1 : VBATT Tamper Detection Control Register 1", p 510 */
366 /* HUM Ch 12.2.16 "VBTADCR2 : VBATT Tamper Detection Control Register 2", p 511 */
368 /* HUM Ch 12.2.17 "VBTADCR3 : VBATT Tamper Detection Control Register 3", p 511 */
370 }
371
372 s_bkup_initialized = true;
373 ra8_log_info(g_bkup_tag, "bkup_tamper_init");
374 return k_ra8_ok;
375}
376
378{
379 /* All six are PRC1-protected (HUM Ch 13.1 Table 13.1 p 521). */
381 {
382 /* HUM Ch 12.2.15 "VBTADCR1 : VBATT Tamper Detection Control Register 1", p 510 */
383 *ra8_bkup_vbtadcr1() = 0U;
384 /* HUM Ch 12.2.16 "VBTADCR2 : VBATT Tamper Detection Control Register 2", p 511 */
385 *ra8_bkup_vbtadcr2() = 0U;
386 /* HUM Ch 12.2.17 "VBTADCR3 : VBATT Tamper Detection Control Register 3", p 511 */
387 *ra8_bkup_vbtadcr3() = 0U;
388 /* HUM Ch 12.2.9 "VBTICTLR2 : VBATT Input Control Register 2", p 506 */
389 *ra8_bkup_vbtictlr2() = 0U;
390 /* HUM Ch 12.2.8 "VBTICTLR : VBATT Input Control Register", p 505 */
391 *ra8_bkup_vbtictlr() = 0U;
392 /* HUM Ch 12.2.14 "VBTADSR : VBATT Tamper Detection Status Register", p 509 */
393 *ra8_bkup_vbtadsr() = 0U;
394 }
395 return k_ra8_ok;
396}
397
398[[nodiscard]] ra8_err_t ra8_bkup_read_input(ra8_bkup_channel_t channel, bool* high_out)
399{
400 RA8_CHECK_NULL_PTR(high_out, g_bkup_tag, "high_out must not be nullptr");
401 if ((uint8_t)channel >= (uint8_t)k_ra8_bkup_chan_count) {
403 }
404 /* HUM Ch 12.2.10 "VBTIMONR : VBATT Input Monitor Register", p 506 */
405 const uint8_t mask = internal_chan_mask(k_ra8_bkup_vbtimonr_mask_vch0mon, channel);
406 *high_out = ((*ra8_bkup_vbtimonr() & mask) != 0U);
407 return k_ra8_ok;
408}
409
410[[nodiscard]] ra8_err_t ra8_bkup_set_input_enable(ra8_bkup_channel_t channel, bool enable)
411{
412 if ((uint8_t)channel >= (uint8_t)k_ra8_bkup_chan_count) {
414 }
415 /* HUM Ch 12.2.8 "VBTICTLR : VBATT Input Control Register", p 505 */
416 const uint8_t mask = internal_chan_mask(k_ra8_bkup_vbtictlr_mask_vch0inen, channel);
417 /* VBTICTLR is PRC1 (HUM Ch 13.1 Table 13.1 p 521). */
419 return k_ra8_ok;
420}
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
const char * g_bkup_tag
Log tag used for this driver's diagnostics.
Definition ra8_bkup.c:88
bool s_bkup_initialized
true once any of the lifecycle init helpers have run.
Definition ra8_bkup.c:120
void priv_ra8_bkup_internal_rmw8(volatile uint8_t *reg, uint8_t mask, bool enable, uint16_t unlock_val)
Set or clear a bit in an 8-bit PRCR-protected RMW register.
Definition ra8_bkup.c:172
Battery Backup Function (VBATT) HAL driver – public API.
@ 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
@ k_ra8_bkup_nc_width_1hz
111b: 1 Hz.
Definition ra8_bkup.h:120
@ 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_bkup_channel_t
RTCICn tamper-detection channel index (HUM Ch 12.2.8 p 505).
Definition ra8_bkup.h:87
Cross-TU shared surface for the ra8_bkup driver split.
Battery Backup Function (VBATT / BAT*) register layout for the RA8D2.
@ k_ra8_bkup_chan_count
RTCIC0..RTCIC2 tamper channels.
@ k_ra8_bkup_vbtimonr_mask_vch0mon
VCH0MON @ bit 0.
static volatile uint8_t * ra8_bkup_vbtictlr2(void)
Pointer to 8-bit VBTICTLR2 (HUM Ch 12.2.9 p 506).
static volatile uint8_t * ra8_bkup_vbtadcr3(void)
Pointer to 8-bit VBTADCR3 (HUM Ch 12.2.17 p 511).
@ k_ra8_bkup_vbtadcr3_mask_vbtadze0
VBTADZE0 @ bit 0.
static volatile uint8_t * ra8_bkup_vbtadcr2(void)
Pointer to 8-bit VBTADCR2 (HUM Ch 12.2.16 p 511).
@ k_ra8_bkup_vbtncwcr_mask_vincw
VINCW[2:0] @ [2:0].
static volatile uint8_t * ra8_bkup_vbtimonr(void)
Pointer to 8-bit VBTIMONR (HUM Ch 12.2.10 p 506).
@ k_ra8_bkup_vbtictlr2_mask_vch0eg
VCH0EG @ bit 4.
@ k_ra8_bkup_vbtictlr2_mask_vch0nce
VCH0NCE @ bit 0.
static volatile uint8_t * ra8_bkup_vbtadsr(void)
Pointer to 8-bit VBTADSR (HUM Ch 12.2.14 p 509).
static volatile uint8_t * ra8_bkup_vbtictlr(void)
Pointer to 8-bit VBTICTLR (HUM Ch 12.2.8 p 505).
static volatile uint8_t * ra8_bkup_vbtadcr1(void)
Pointer to 8-bit VBTADCR1 (HUM Ch 12.2.15 p 510).
@ k_ra8_bkup_vbtictlr_mask_vch0inen
VCH0INEN @ bit 0.
static volatile uint8_t * ra8_bkup_vbtncwcr(void)
Pointer to 8-bit VBTNCWCR (HUM Ch 12.2.18 p 511).
@ k_ra8_bkup_vbtadcr2_mask_vbrtces0
VBRTCES0 @ bit 0.
@ k_ra8_bkup_vbtadcr1_mask_vbtadie0
VBTADIE0 @ bit 0.
@ k_ra8_bkup_vbtadcr1_mask_vbtadce0
VBTADCE0 @ bit 4.
static uint8_t internal_compose_vbtictlr(const ra8_bkup_tamper_config_t *cfg)
Compose the VBTICTLR (VCHnINEN) byte from per-channel flags.
ra8_err_t ra8_bkup_read_input(ra8_bkup_channel_t channel, bool *high_out)
Read the live RTCICn pin level via VBTIMONR.
static ra8_err_t internal_validate_tamper_channels(const ra8_bkup_tamper_config_t *cfg)
Validate every channel descriptor in a tamper config.
ra8_err_t ra8_bkup_tamper_disable(void)
Disable every tamper input and clear flags.
static uint8_t internal_compose_vbtictlr2(const ra8_bkup_tamper_config_t *cfg)
Compose the VBTICTLR2 (VCHnNCE + VCHnEG) byte from per-channel flags.
static uint8_t internal_chan_mask(uint8_t base_mask, ra8_bkup_channel_t channel)
Convert channel + bit-base mask into the actual masked bit.
ra8_bkup_tamper_internal_t
Local numeric constants – avoid magic numbers per CLAUDE.md.
@ k_ra8_bkup_max_nc_width
Highest legal VINCW encoding.
static uint8_t internal_compose_vbtadcr2(const ra8_bkup_tamper_config_t *cfg)
Compose the VBTADCR2 (capture-source) byte.
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.
static uint8_t internal_compose_vbtadcr3(const ra8_bkup_tamper_config_t *cfg)
Compose the VBTADCR3 (HUK-zeroize) byte.
static uint8_t internal_compose_vbtadcr1(const ra8_bkup_tamper_config_t *cfg)
Compose the VBTADCR1 (IRQ-enable + clear-backup) byte.
static ra8_err_t internal_validate_chan(const ra8_bkup_tamper_chan_cfg_t *ch)
Validate a per-channel tamper descriptor.
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
Definition ra8_check.h:184
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info(tag, message)
RA8 log info.
Definition ra8_log.h:364
Scoped PRCR unlock helper.
#define RA8_PROTECTED_WRITE(unlock_val)
Scoped PRCR unlock block.
@ k_ra8_prcr_unlock_lpm
RA8 prcr unlock lpm.
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