ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_icu.c
Go to the documentation of this file.
1
15
16#include "ra8_icu.h"
17
18#include <stdint.h>
19
20#include "ra8_check.h"
21#include "ra8_err.h"
22#include "ra8_icu_regs.h"
23#include "ra8_log.h"
24
25static const char* s_tag = "ICU";
26
31typedef enum : uint32_t {
32 /* FSP R_ICU_NMICLR bits 0..14 + 16..18 + 20 are write-1-to-clear; use
33 * the full 32-bit mask to cover future extensions. */
34 k_ra8_icu_nmiclr_all = 0xFFFFFFFFUL,
35 /* FSP R_ICU_WUPEN0 / WUPEN1 are RW, reset value 0; clearing every
36 * bit puts the wake-up matrix back to its post-reset state. */
37 k_ra8_icu_wupen_clear = 0x00000000UL,
39
40/* =============================================================================
41 * initialisation
42 * =============================================================================
43 */
44
46{
47 ra8_log_info(s_tag, "ra8_icu_init");
48
49 /* HUM Ch 14.2.12 "IRQCRi : IRQ Control Register", p 535 */
50 for (uint8_t i = 0U; i < (uint8_t)k_ra8_icu_num_irqs; ++i) {
51 volatile uint8_t* irqcr = ra8_icu_irqcr(i);
52 if (irqcr != nullptr) { /* GCOVR_EXCL_BR_LINE -- bounds validated */
53 *irqcr = 0U;
54 }
55 }
56
57 /* HUM Ch 14.2.14 "NMIER : NMI Enable Register", p 542 */
58 *ra8_icu_nmier() = 0UL;
59
60 /* HUM Ch 14.2.15 "NMICLR : NMI Status Clear Register", p 544 -- write
61 * all-ones to clear every latched NMI status bit. */
63
64 /* HUM Ch 14 "WUPEN0/WUPEN1 : Wake Up Interrupt Enable Register",
65 * p 524..582 -- clear so no source can wake the core unexpectedly. */
68 return k_ra8_ok;
69}
70
71/* =============================================================================
72 * external IRQ pin programming
73 * =============================================================================
74 */
75
77{
78 RA8_CHECK_NULL_PTR(cfg, s_tag, "irq cfg");
79 if (irq_num >= (uint8_t)k_ra8_icu_num_irqs) {
81 }
82 volatile uint8_t* irqcr = ra8_icu_irqcr(irq_num);
83 if (irqcr == nullptr) { /* GCOVR_EXCL_BR_LINE -- bounds validated */
85 }
86
87 const uint8_t irqmd = ((uint8_t)cfg->sense & k_ra8_icu_irqcr_mask_irqmd);
88 const uint8_t fclk = (uint8_t)(((uint8_t)cfg->filter_div << k_ra8_icu_irqcr_bit_fclksel) &
90 uint8_t val = (uint8_t)(irqmd | fclk);
91 if (cfg->filter_en) {
93 }
94 /* HUM Ch 14.2.12 "IRQCRi : IRQ Control Register", p 535 */
95 *irqcr = val;
96 ra8_log_info_val(s_tag, "irqcr pin", (uint32_t)irq_num);
97 return k_ra8_ok;
98}
99
100ra8_err_t ra8_icu_read_irqcr(uint8_t irq_num, uint8_t* out_val)
101{
102 RA8_CHECK_NULL_PTR(out_val, s_tag, "irqcr out");
103 if (irq_num >= (uint8_t)k_ra8_icu_num_irqs) {
105 }
106 volatile const uint8_t* irqcr = ra8_icu_irqcr(irq_num);
107 if (irqcr == nullptr) { /* GCOVR_EXCL_BR_LINE -- bounds validated */
109 }
110 *out_val = *irqcr;
111 return k_ra8_ok;
112}
113
114/* =============================================================================
115 * NMI management
116 * =============================================================================
117 */
118
120{
121 /* HUM Ch 14.2.14 "NMIER : NMI Enable Register", p 542 */
122 volatile uint32_t* nmier = ra8_icu_nmier();
123 *nmier = (*nmier | mask);
124 return k_ra8_ok;
125}
126
128{
129 /* HUM Ch 14.2.14 "NMIER : NMI Enable Register", p 542 */
130 volatile uint32_t* nmier = ra8_icu_nmier();
131 *nmier = (*nmier & ~mask);
132 return k_ra8_ok;
133}
134
136{
137 /* HUM Ch 14.2.15 "NMICLR : NMI Status Clear Register", p 544 */
138 *ra8_icu_nmiclr() = mask;
139 return k_ra8_ok;
140}
141
142ra8_err_t ra8_icu_nmi_status(uint32_t* out_status)
143{
144 RA8_CHECK_NULL_PTR(out_status, s_tag, "nmi status out");
145 *out_status = *ra8_icu_nmisr();
146 return k_ra8_ok;
147}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
Validation and Error-Checking Macros for ra8-firmware.
#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
ra8_err_t ra8_icu_nmi_status(uint32_t *out_status)
Read the current NMISR value.
Definition ra8_icu.c:142
ra8_err_t ra8_icu_init(void)
Reset every ICU-owned register to its post-reset state.
Definition ra8_icu.c:45
ra8_err_t ra8_icu_nmi_enable(uint32_t mask)
Enable one or more NMI sources by OR'ing into NMIER.
Definition ra8_icu.c:119
ra8_err_t ra8_icu_nmi_clear(uint32_t mask)
Clear pending NMI status flags via NMICLR (HUM 14.2.15 p 544).
Definition ra8_icu.c:135
ra8_err_t ra8_icu_nmi_disable(uint32_t mask)
Disable NMI sources by clearing bits in NMIER.
Definition ra8_icu.c:127
ra8_icu_clear_val_t
Magic values used during ra8_icu_init.
Definition ra8_icu.c:31
@ k_ra8_icu_wupen_clear
RA8 icu wupen clear.
Definition ra8_icu.c:37
@ k_ra8_icu_nmiclr_all
RA8 icu nmiclr all.
Definition ra8_icu.c:34
ra8_err_t ra8_icu_read_irqcr(uint8_t irq_num, uint8_t *out_val)
Read the raw 8-bit IRQCRi value.
Definition ra8_icu.c:100
ra8_err_t ra8_icu_configure_irq_pin(uint8_t irq_num, const ra8_icu_irq_cfg_t *cfg)
Programme one IRQCRi register.
Definition ra8_icu.c:76
Interrupt Control Unit driver (IRQ pins, NMI).
Interrupt Control Unit (ICU) register layout for the Renesas RA8D2.
static volatile uint32_t * ra8_icu_wupen0(void)
Get pointer to the 32-bit WUPEN0 register.
@ k_ra8_icu_num_irqs
IRQ0..IRQ31, RA8D2 has 32 IRQ channels.
@ k_ra8_icu_irqcr_bit_fclksel
FCLKSEL[1:0] at bits 5..4.
@ k_ra8_icu_irqcr_mask_irqmd
IRQMD[1:0] bits 1..0.
@ k_ra8_icu_irqcr_mask_flten
FLTEN bit 7.
@ k_ra8_icu_irqcr_mask_fclksel
FCLKSEL[1:0] bits 5..4.
static volatile uint32_t * ra8_icu_nmisr(void)
Get pointer to the 32-bit NMISR register.
static volatile uint8_t * ra8_icu_irqcr(uint8_t irq_num)
Get pointer to the IRQCRi register for IRQ channel irq_num.
static volatile uint32_t * ra8_icu_wupen1(void)
Get pointer to the 32-bit WUPEN1 register.
static volatile uint32_t * ra8_icu_nmiclr(void)
Get pointer to the 32-bit NMICLR register.
static volatile uint32_t * ra8_icu_nmier(void)
Get pointer to the 32-bit NMIER register.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
Definition ra8_log.h:366
#define ra8_log_info(tag, message)
RA8 log info.
Definition ra8_log.h:364
One external-IRQ-pin configuration descriptor.
Definition ra8_icu.h:65
bool filter_en
True = enable digital filter.
Definition ra8_icu.h:68
ra8_icu_fclksel_t filter_div
Filter sampling clock divider.
Definition ra8_icu.h:67
ra8_icu_irqmd_t sense
Edge / level detection mode.
Definition ra8_icu.h:66