ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_icu_regs.h
Go to the documentation of this file.
1
38
39#pragma once
40
41#ifdef __cplusplus
42extern "C" {
43#endif
44
45#include <stdint.h>
46
47/* =============================================================================
48 * Base addresses
49 * =============================================================================
50 */
51
52typedef enum : uintptr_t {
53 k_ra8_icu_base_addr = 0x40006000UL,
55
63
64/* =============================================================================
65 * Register offsets (verified against FSP R_ICU_Type in
66 * R7KA8D2KF_core0.h lines 8670-9061)
67 * =============================================================================
68 */
69
84
95
106
115
125
127static inline volatile uint32_t* ra8_icu_nmier(void)
128{
129 return (volatile uint32_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_nmier);
130}
131
133static inline volatile uint32_t* ra8_icu_nmisr(void)
134{
135 return (volatile uint32_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_nmisr);
136}
137
139static inline volatile uint32_t* ra8_icu_nmiclr(void)
140{
141 return (volatile uint32_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_nmiclr);
142}
143
145static inline volatile uint8_t* ra8_icu_nmicr(void)
146{
147 return (volatile uint8_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_nmicr);
148}
149
158static inline volatile uint32_t* ra8_icu_wupen0(void)
159{
160 return (volatile uint32_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_wupen0);
161}
162
171static inline volatile uint32_t* ra8_icu_wupen1(void)
172{
173 return (volatile uint32_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_wupen1);
174}
175
187static inline volatile uint32_t* ra8_icu_delsr(uint8_t index)
188{
189 enum ra8_icu_delsr_bound : uint8_t {
190 k_ra8_icu_num_delsr = 8U,
191 };
192 if (index >= k_ra8_icu_num_delsr) {
193 return nullptr;
194 }
195 return (volatile uint32_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_delsr0 +
196 ((uintptr_t)index * sizeof(uint32_t)));
197}
198
199/* =============================================================================
200 * Accessors
201 * =============================================================================
202 */
203
205static inline volatile uint32_t* ra8_icu_ielsr(uint16_t index)
206{
207 if (index >= k_ra8_icu_num_ielsr) {
208 return nullptr;
209 }
210 return (volatile uint32_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_ielsr0 +
211 ((uintptr_t)index * sizeof(uint32_t)));
212}
213
232static inline volatile uint8_t* ra8_icu_irqcr(uint8_t irq_num)
233{
234 if (irq_num >= (uint8_t)k_ra8_icu_num_irqs) {
235 return nullptr;
236 }
237 /* HUM Ch 14.2.12 "IRQCRi : IRQ Control Register", p 535: IRQCRa
238 * occupies bytes 0..15, NMICR + reserved fill 16..19, IRQCRb starts
239 * at 20. Match FSP ICU_IRQCR_CH(c) = c + ((c >> 4) << 2). */
240 const uintptr_t gap_bytes = ((uintptr_t)irq_num >= (uintptr_t)k_ra8_icu_irqcrb_first)
241 ? (uintptr_t)k_ra8_icu_irqcrb_offset
242 : (uintptr_t)0U;
243 return (volatile uint8_t*)((uintptr_t)k_ra8_icu_base_addr + (uintptr_t)k_ra8_icu_off_irqcra0 +
244 (uintptr_t)irq_num + gap_bytes);
245}
246
247/* =============================================================================
248 * IELSR bit layout
249 * =============================================================================
250 */
251
268
269typedef enum : uint32_t {
270 /* HUM Ch 14.2.17 "IELSRn : ICU Event Link Setting Register n", p 547:
271 * IELS occupies bits [9:0] -- 10-bit field, mask 0x3FF. RA8 has
272 * hundreds of ELC event sources so the FSP layout uses 10 bits. */
273 k_ra8_ielsr_iels_mask = 0x000003FFUL,
274 k_ra8_ielsr_ir_mask = 0x00010000UL,
275 k_ra8_ielsr_dtce_mask = 0x01000000UL,
277
278#ifdef __cplusplus
279}
280#endif
static volatile uint32_t * ra8_icu_wupen0(void)
Get pointer to the 32-bit WUPEN0 register.
ra8_icu_limits_t
@ k_ra8_icu_num_irqs
IRQ0..IRQ31, RA8D2 has 32 IRQ channels.
@ k_ra8_icu_num_ielsr
IELSR slot count on RA8D2 (FSP R_ICU_Type).
@ k_ra8_icu_irqcrb_first
First IRQ channel served by IRQCRb.
@ k_ra8_icu_irqcra_count
IRQCRa[16] holds channels 0..15.
@ k_ra8_icu_irqcrb_offset
Byte gap between IRQCRa[15] and IRQCRb[0].
ra8_ielsr_bit_t
Bit positions in an IELSR register.
@ k_ra8_ielsr_iels_shift
IELS event-select shift, bits [9:0].
@ k_ra8_ielsr_dtce_bit
DTCE: DTC activation enable.
@ k_ra8_ielsr_ir_bit
IR interrupt status flag (W0C).
static volatile uint8_t * ra8_icu_nmicr(void)
Get pointer to the 8-bit NMICR register.
ra8_icu_fclksel_t
IRQCRi.FCLKSEL[1:0] digital filter sampling clock (HUM 14.2.12 p 535).
@ k_ra8_icu_fclksel_pclkb_32
10: sample once per 32 cycles.
@ k_ra8_icu_fclksel_pclkb_8
01: sample once per 8 cycles.
@ k_ra8_icu_fclksel_pclkb_64
11: sample once per 64 cycles.
@ k_ra8_icu_fclksel_pclkb
00: sample every PCLKB cycle.
ra8_icu_irqcr_bit_t
IRQCRi bit positions.
@ k_ra8_icu_irqcr_bit_flten
FLTEN at bit 7.
@ k_ra8_icu_irqcr_bit_fclksel
FCLKSEL[1:0] at bits 5..4.
ra8_icu_irqcr_mask_t
IRQCRi bit masks.
@ 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_ielsr(uint16_t index)
Get pointer to IELSR register N.
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_delsr(uint8_t index)
Get pointer to DELSR[index], the DMAC Event Link Setting Register.
ra8_icu_irqmd_t
IRQCRi.IRQMD[1:0] detection sense values (HUM 14.2.12 p 535).
@ k_ra8_icu_irqmd_rising
01: rising edge.
@ k_ra8_icu_irqmd_both
10: rising OR falling.
@ k_ra8_icu_irqmd_falling
00: falling edge.
@ k_ra8_icu_irqmd_low
11: low-level sensitive.
ra8_icu_off_t
@ k_ra8_icu_off_intselr
INTSELR[32] (32 bits each): IRQ core.
@ k_ra8_icu_off_delsr0
DELSR[8]: DMAC event link select.
@ k_ra8_icu_off_ielsr0
IELSR[0..95] (32 bits each).
@ k_ra8_icu_off_dslpwup
DSLPWUPIRQEN[3]: deep-sleep IRQ enable.
@ k_ra8_icu_off_nmiclr
NMICLR: NMI status clear (32b).
@ k_ra8_icu_off_nmier
NMIER: NMI enable (32b).
@ k_ra8_icu_off_irqcrb0
IRQCRb[0..15] (8 bits each), ch 16..31.
@ k_ra8_icu_off_wupen0
WUPEN0: wake-up enable register 0.
@ k_ra8_icu_off_nmicr
NMICR: NMI pin control (8b).
@ k_ra8_icu_off_wupen1
WUPEN1: wake-up enable register 1.
@ k_ra8_icu_off_irqcra0
IRQCRa[0..15] (8 bits each), ch 0..15.
@ k_ra8_icu_off_nmisr
NMISR: NMI status (32b).
ra8_ielsr_mask_t
@ k_ra8_ielsr_dtce_mask
DTCE bit mask.
@ k_ra8_ielsr_iels_mask
IELS field mask (10 bits).
@ k_ra8_ielsr_ir_mask
IR bit mask (RW1C).
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.
ra8_icu_addr_t
@ k_ra8_icu_base_addr
R_ICU block base.