ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_cnecc.h
Go to the documentation of this file.
1
64
65#pragma once
66
67#ifdef __cplusplus
68extern "C" {
69#endif
70
71#include <stdint.h>
72
73#include "ra8_cnecc_regs.h"
74#include "ra8_err.h"
75#include "ra8_isr.h"
76
77/* =============================================================================
78 * Configuration types
79 * =============================================================================
80 */
81
93typedef struct {
95 bool irq_1bit;
96 bool irq_2bit;
97 bool enable;
99
113
114/* =============================================================================
115 * Status / event types
116 * =============================================================================
117 */
118
154
166typedef struct {
167 uint32_t one_bit_count;
168 uint32_t two_bit_count;
169 uint32_t overflow_count;
171
183typedef void (*ra8_cnecc_error_fn_t)(void* ctx, uint8_t instance, bool is_2bit, uint16_t err_addr);
184
185/* =============================================================================
186 * Lifecycle
187 * =============================================================================
188 */
189
230[[nodiscard]] ra8_err_t ra8_cnecc_init(const ra8_cnecc_config_t* cfg);
231
248[[nodiscard]] ra8_err_t ra8_cnecc_deinit(void);
249
274[[nodiscard]] ra8_err_t ra8_cnecc_enable_instance(uint8_t instance);
275
299[[nodiscard]] ra8_err_t ra8_cnecc_disable_instance(uint8_t instance);
300
327[[nodiscard]] ra8_err_t ra8_cnecc_enter_standby(void);
328
352[[nodiscard]] ra8_err_t ra8_cnecc_exit_standby(void);
353
354/* =============================================================================
355 * Per-instance configuration tweaks
356 * =============================================================================
357 */
358
386[[nodiscard]] ra8_err_t ra8_cnecc_set_irq_enables(uint8_t instance, bool irq_1bit, bool irq_2bit);
387
412[[nodiscard]] ra8_err_t ra8_cnecc_set_correction_permission(uint8_t instance, bool correct_1bit);
413
414/* =============================================================================
415 * Status / event API
416 * =============================================================================
417 */
418
448[[nodiscard]] ra8_err_t ra8_cnecc_get_status(uint8_t instance, ra8_cnecc_status_t* out);
449
478[[nodiscard]] ra8_err_t ra8_cnecc_get_counters(uint8_t instance, ra8_cnecc_counters_t* out);
479
499[[nodiscard]] ra8_err_t ra8_cnecc_reset_counters(uint8_t instance);
500
535[[nodiscard]] ra8_err_t ra8_cnecc_set_counter_mirror(uint8_t instance,
536 ra8_cnecc_counters_t* mirror);
537
564[[nodiscard]] ra8_err_t ra8_cnecc_clear_status(uint8_t instance);
565
566/* =============================================================================
567 * Fault injection (HUM 42.3.2 ECC Decoder Testing)
568 * =============================================================================
569 */
570
595typedef struct {
596 uint32_t substitute;
599
632[[nodiscard]] ra8_err_t ra8_cnecc_inject_fault(uint8_t instance, const ra8_cnecc_inject_t* req);
633
659[[nodiscard]] ra8_err_t ra8_cnecc_test_mode_disable(uint8_t instance);
660
681[[nodiscard]] ra8_err_t ra8_cnecc_test_mode_active(uint8_t instance, bool* out);
682
683/* =============================================================================
684 * Async fault notification
685 * =============================================================================
686 */
687
707[[nodiscard]] ra8_err_t ra8_cnecc_attach_handler(ra8_cnecc_error_fn_t fn, void* ctx);
708
746[[nodiscard]] ra8_err_t ra8_cnecc_attach_isr(uint8_t priority);
747
769[[nodiscard]] ra8_err_t ra8_cnecc_detach_isr(void);
770
799void ra8_cnecc_isr_handler(void* ctx);
800
827void ra8_cnecc_dispatch(uint8_t instance, bool is_2bit, uint16_t err_addr);
828
849void ra8_cnecc_dispatch_overflow(uint8_t instance);
850
851/* =============================================================================
852 * Code-flash ECC compute / verify (software fallback)
853 * =============================================================================
854 */
855
878[[nodiscard]] ra8_err_t ra8_cnecc_open(void);
879
919[[nodiscard]] ra8_err_t ra8_cnecc_compute(uint32_t addr, uint32_t len, uint32_t* out_ecc);
920
949[[nodiscard]] ra8_err_t ra8_cnecc_verify(uint32_t addr, uint32_t len, uint32_t expected_ecc);
950
951#ifdef __cplusplus
952}
953#endif
ra8_err_t ra8_cnecc_attach_handler(ra8_cnecc_error_fn_t fn, void *ctx)
Attach a callback for CNECC fault events.
Definition ra8_cnecc.c:641
ra8_err_t ra8_cnecc_set_counter_mirror(uint8_t instance, ra8_cnecc_counters_t *mirror)
Attach a BBR-mirrored counter triple for one instance.
Definition ra8_cnecc.c:546
ra8_err_t ra8_cnecc_disable_instance(uint8_t instance)
Disable error judgment for one instance only.
Definition ra8_cnecc.c:395
void ra8_cnecc_dispatch_overflow(uint8_t instance)
Force-bump the overflow counter (used by the ISR trampoline).
Definition ra8_cnecc.c:752
ra8_err_t ra8_cnecc_enter_standby(void)
Software-standby preparation (HUM 42.5.1 p 2876).
Definition ra8_cnecc.c:407
ra8_err_t ra8_cnecc_open(void)
One-shot CNECC bring-up using the driver's default config.
Definition ra8_cnecc.c:827
ra8_err_t ra8_cnecc_detach_isr(void)
Tear down the ICU vector wiring established by ra8_cnecc_attach_isr.
Definition ra8_cnecc.c:674
ra8_err_t ra8_cnecc_get_counters(uint8_t instance, ra8_cnecc_counters_t *out)
Read the cumulative fault counters for one instance.
Definition ra8_cnecc.c:518
ra8_err_t ra8_cnecc_inject_fault(uint8_t instance, const ra8_cnecc_inject_t *req)
Run the HUM Ch 42.3.2 fault-injection sequence for one instance.
Definition ra8_cnecc.c:578
ra8_err_t ra8_cnecc_enable_instance(uint8_t instance)
Enable error judgment for one instance only.
Definition ra8_cnecc.c:383
ra8_err_t ra8_cnecc_test_mode_disable(uint8_t instance)
Force EC710TMC = 0x8000 to leave fault-injection mode.
Definition ra8_cnecc.c:616
ra8_err_t ra8_cnecc_init(const ra8_cnecc_config_t *cfg)
Initialise the CNECC driver and configure both instances.
Definition ra8_cnecc.c:340
void(* ra8_cnecc_error_fn_t)(void *ctx, uint8_t instance, bool is_2bit, uint16_t err_addr)
CANFD ECC fault callback signature.
Definition ra8_cnecc.h:183
ra8_err_t ra8_cnecc_set_correction_permission(uint8_t instance, bool correct_1bit)
Update the 1-bit correction permission for one instance.
Definition ra8_cnecc.c:461
ra8_err_t ra8_cnecc_clear_status(uint8_t instance)
Clear the latched ECC fault state for one instance.
Definition ra8_cnecc.c:562
ra8_err_t ra8_cnecc_set_irq_enables(uint8_t instance, bool irq_1bit, bool irq_2bit)
Update the IRQ enable bits for one instance without touching any other CTL field.
Definition ra8_cnecc.c:439
void ra8_cnecc_dispatch(uint8_t instance, bool is_2bit, uint16_t err_addr)
Dispatch a CNECC fault event to the installed handler.
Definition ra8_cnecc.c:728
ra8_err_t ra8_cnecc_reset_counters(uint8_t instance)
Zero the cumulative fault counters for one instance.
Definition ra8_cnecc.c:530
ra8_err_t ra8_cnecc_test_mode_active(uint8_t instance, bool *out)
Query whether fault injection is currently armed.
Definition ra8_cnecc.c:628
void ra8_cnecc_isr_handler(void *ctx)
Generic ICU trampoline for both CANn_MRAM_ERI vectors.
Definition ra8_cnecc.c:685
ra8_err_t ra8_cnecc_verify(uint32_t addr, uint32_t len, uint32_t expected_ecc)
Verify a region's ECC tag matches an expected value.
Definition ra8_cnecc.c:864
ra8_err_t ra8_cnecc_deinit(void)
Tear down both CNECC instances and gate the CANFD MSTP bits.
Definition ra8_cnecc.c:354
ra8_err_t ra8_cnecc_attach_isr(uint8_t priority)
Wire the CANn_MRAM_ERI ICU vectors to the driver dispatcher.
Definition ra8_cnecc.c:649
ra8_err_t ra8_cnecc_exit_standby(void)
Software-standby exit (HUM 42.5.2 p 2876).
Definition ra8_cnecc.c:423
ra8_err_t ra8_cnecc_get_status(uint8_t instance, ra8_cnecc_status_t *out)
Snapshot the current ECC state of one CNECC instance.
Definition ra8_cnecc.c:480
ra8_err_t ra8_cnecc_compute(uint32_t addr, uint32_t len, uint32_t *out_ecc)
Compute a 32-bit ECC code over a (addr, len) memory region.
Definition ra8_cnecc.c:842
CANFD ECC (CNECC) register layout for the RA8D2.
@ k_ra8_cnecc_instance_count
ECCMB0 + ECCMB1.
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
NVIC + ICU IELSR allocator.
Top-level driver configuration.
Definition ra8_cnecc.h:110
ra8_cnecc_instance_cfg_t instances[k_ra8_cnecc_instance_count]
Per-instance settings.
Definition ra8_cnecc.h:111
Cumulative per-instance fault counters.
Definition ra8_cnecc.h:166
uint32_t one_bit_count
Lifetime 1-bit fault count for this instance.
Definition ra8_cnecc.h:167
uint32_t two_bit_count
Lifetime 2-bit fault count for this instance.
Definition ra8_cnecc.h:168
uint32_t overflow_count
Lifetime ECOVFF count for this instance.
Definition ra8_cnecc.h:169
Fault-injection request descriptor.
Definition ra8_cnecc.h:595
uint32_t substitute
32-bit value stored in EC710TED.
Definition ra8_cnecc.h:596
bool one_bit_flip
true => 1-bit error variant; false => 2-bit.
Definition ra8_cnecc.h:597
Per-instance ECC configuration descriptor.
Definition ra8_cnecc.h:93
bool enable
true => leave ECERVF set after init.
Definition ra8_cnecc.h:97
bool irq_2bit
true => raise IRQ on every 2-bit fault.
Definition ra8_cnecc.h:96
bool correct_1bit
true => HW corrects 1-bit faults (clears EC1ECP).
Definition ra8_cnecc.h:94
bool irq_1bit
true => raise IRQ on every 1-bit fault.
Definition ra8_cnecc.h:95
Snapshot of one CNECC instance, returned by ra8_cnecc_get_status.
Definition ra8_cnecc.h:133
uint16_t reserved0
Padding for alignment.
Definition ra8_cnecc.h:136
bool overflow
Live ECOVFF: address-capture overflow.
Definition ra8_cnecc.h:144
bool err_present
Live ECEMF: present-cycle error.
Definition ra8_cnecc.h:141
uint32_t two_bit_count
Cumulative 2-bit fault count.
Definition ra8_cnecc.h:138
bool irq2_enabled
Live EC2EDIC.
Definition ra8_cnecc.h:150
uint32_t raw_ctl
Live EC710CTL value.
Definition ra8_cnecc.h:134
bool addr_is_2bit
true => last_addr was a 2-bit fault.
Definition ra8_cnecc.h:146
bool judgment_active
Live ECERVF: judgment currently enabled.
Definition ra8_cnecc.h:147
uint16_t raw_tmc
Live EC710TMC value.
Definition ra8_cnecc.h:135
bool irq1_enabled
Live EC1EDIC.
Definition ra8_cnecc.h:149
uint16_t last_addr
Last captured ECEAD[9:0] RAM offset.
Definition ra8_cnecc.h:140
bool err_1bit
Live ECER1F: 1-bit fault latched.
Definition ra8_cnecc.h:142
uint32_t one_bit_count
Cumulative 1-bit fault count.
Definition ra8_cnecc.h:137
bool addr_is_1bit
true => last_addr was a 1-bit fault.
Definition ra8_cnecc.h:145
uint32_t overflow_count
Cumulative ECOVFF count.
Definition ra8_cnecc.h:139
bool test_mode
Live ECTMCE: fault-injection currently armed.
Definition ra8_cnecc.h:151
bool err_2bit
Live ECER2F: 2-bit fault latched.
Definition ra8_cnecc.h:143
bool reserved1
Padding.
Definition ra8_cnecc.h:152
bool correct_enabled
true => 1-bit correction enabled (EC1ECP=0).
Definition ra8_cnecc.h:148