ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_ipc_regs.h
Go to the documentation of this file.
1
47
48#pragma once
49
50#ifdef __cplusplus
51extern "C" {
52#endif
53
54#include <stdint.h>
55
56#include "ra8_attributes.h"
57
69typedef enum : uintptr_t {
70 k_ra8_ipc_base_addr = 0x40020000UL,
71 k_ra8_ipc_cpscu_addr = 0x40008000UL,
72 k_ra8_ipc_ipcsar_addr = 0x40008610UL,
73 k_ra8_ipc_ipcpar_addr = 0x40008614UL,
75
101
120
132typedef enum : uint8_t {
136
147typedef enum : uint8_t {
151
181
207
228
239typedef enum : uint32_t {
242
256typedef enum : uint32_t {
259
280
299
313
326typedef enum : uint16_t {
330
346
357typedef struct {
358 volatile uint32_t STA;
359 volatile uint32_t ISET;
360 volatile uint32_t TXD;
361 volatile uint32_t RXD;
362 volatile uint32_t CLR;
363 volatile uint32_t _pad[3];
365
375typedef struct {
376 volatile uint32_t NMISTA;
377 volatile uint32_t NMISET;
378 volatile uint32_t NMICLR;
379 volatile uint32_t _pad;
381
394static inline volatile r_ipc_channel_regs_t* ra8_ipc_channel(uint8_t channel)
395{
396 if ((uint16_t)channel >= (uint16_t)k_ra8_ipc_channel_count) {
397 return nullptr;
398 }
399 /* HUM Ch 3.2 "Register Descriptions" p 205 -- channel 0 starts at
400 * +0x0C0 with a 0x20 stride between consecutive channels. */
401 const uintptr_t base = k_ra8_ipc_base_addr + (uintptr_t)k_ra8_ipc_offset_ipc0_ch0 +
402 ((uintptr_t)channel * (uintptr_t)k_ra8_ipc_channel_stride);
403 return (volatile r_ipc_channel_regs_t*)base;
404}
405
416static inline volatile r_ipc_nmi_regs_t* ra8_ipc_nmi(uint8_t unit)
417{
418 if ((uint16_t)unit >= (uint16_t)k_ra8_ipc_nmi_unit_count) {
419 return nullptr;
420 }
421 /* HUM Ch 3.2 "Register Descriptions" p 205 -- IPC0NMI at +0x080,
422 * IPC1NMI at +0x090 (0x10 stride). */
423 const uintptr_t base = k_ra8_ipc_base_addr + (uintptr_t)k_ra8_ipc_offset_ipc0nmista +
424 ((uintptr_t)unit * (uintptr_t)k_ra8_ipc_nmi_stride);
425 return (volatile r_ipc_nmi_regs_t*)base;
426}
427
433static inline volatile uint32_t* ra8_ipc_ipcsar(void)
434{
435 /* HUM Ch 3.2.1 "IPCSAR" p 205 */
436 return (volatile uint32_t*)k_ra8_ipc_ipcsar_addr;
437}
438
444static inline volatile uint32_t* ra8_ipc_ipcpar(void)
445{
446 /* HUM Ch 3.2.2 "IPCPAR" p 208 */
447 return (volatile uint32_t*)k_ra8_ipc_ipcpar_addr;
448}
449
458static inline volatile uint32_t* ra8_ipc_sem(uint8_t sem_id)
459{
460 if ((uint16_t)sem_id >= (uint16_t)k_ra8_ipc_sem_count) {
461 return nullptr;
462 }
463 /* HUM Ch 3.2.3 "IPCSEMn" p 210 -- IPCSEM0 at +0x000, each
464 * semaphore is a 32-bit word so the stride is 4 bytes. */
465 const uintptr_t base = k_ra8_ipc_base_addr + ((uintptr_t)sem_id * sizeof(uint32_t));
466 return (volatile uint32_t*)base;
467}
468
486static inline uint8_t ra8_ipc_channel_to_unit(uint8_t channel)
487{
488 if ((uint16_t)channel >= (uint16_t)k_ra8_ipc_channel_count) {
490 }
491 /* HUM Ch 3.1 "Overview" p 204 -- channels 0/1 belong to IPC0,
492 * channels 2/3 belong to IPC1. */
493 return (uint8_t)(channel >> 1U);
494}
495
496#ifdef __cplusplus
497}
498#endif
Annotation-attribute framework macros for ra8-firmware.
#define RA8_HW_REGISTER_ACCESS
Mark an MMIO accessor function (returns volatile register pointer).
static volatile r_ipc_channel_regs_t * ra8_ipc_channel(uint8_t channel)
Get a pointer to one IPC FIFO channel register window.
static volatile r_ipc_nmi_regs_t * ra8_ipc_nmi(uint8_t unit)
Get a pointer to one IPC NMI unit register window.
static volatile uint32_t * ra8_ipc_ipcpar(void)
Get a pointer to the IPCPAR Privileged Attribution register.
ra8_ipc_elc_event_t
ELC event numbers for the IPC maskable IRQs.
@ k_ra8_ipc_elc_event_irq0
Receiving-side IRQ for IPC0_*.
@ k_ra8_ipc_elc_event_irq1
Receiving-side IRQ for IPC1_*.
static volatile uint32_t * ra8_ipc_ipcsar(void)
Get a pointer to the IPCSAR Security Attribution register.
ra8_ipc_core_id_t
Logical CPU core identifiers used by attribution helpers.
@ k_ra8_ipc_core_cpu0
Cortex-M85 (primary core).
@ k_ra8_ipc_core_cpu1
Cortex-M33 (secondary core).
ra8_ipc_attr_shift_t
Bit positions of SAIPCIRn / PAIPCIRn within IPCSAR / IPCPAR.
@ k_ra8_ipc_attr_shift_nmi_base
SAIPCNMI0 / PAIPCNMI0 position.
@ k_ra8_ipc_attr_shift_ir_base
SAIPCIR0 / PAIPCIR0 bit position.
ra8_ipc_nmi_mask_t
Bit masks for the IPC NMI status / set / clear registers.
@ k_ra8_ipc_nmi_mask_bit
Single-bit NMI request / status.
ra8_ipcpar_mask_t
Bit masks for the IPCPAR Privileged Attribution Register.
@ k_ra8_ipcpar_mask_paipcir0
IPC0 channel 0 priv attr.
@ k_ra8_ipcpar_mask_paipcnmi0
IPC0NMI* priv attr.
@ k_ra8_ipcpar_mask_paipcnmi1
IPC1NMI* priv attr.
@ k_ra8_ipcpar_mask_paipcsem1
IPCSEM8..15 priv attr.
@ k_ra8_ipcpar_mask_paipcir2
IPC1 channel 0 priv attr.
@ k_ra8_ipcpar_mask_paipcir3
IPC1 channel 1 priv attr.
@ k_ra8_ipcpar_mask_paipcsem0
IPCSEM0..7 priv attr.
@ k_ra8_ipcpar_mask_paipcir1
IPC0 channel 1 priv attr.
ra8_ipc_iset_mask_t
Bit masks for the IPCnISETm "IRQ Request Set" registers.
@ k_ra8_ipc_iset_mask_set4
SET4 -> IRQ4 request.
@ k_ra8_ipc_iset_mask_all
All eight SET bits.
@ k_ra8_ipc_iset_mask_set3
SET3 -> IRQ3 request.
@ k_ra8_ipc_iset_mask_set2
SET2 -> IRQ2 request.
@ k_ra8_ipc_iset_mask_set5
SET5 -> IRQ5 request.
@ k_ra8_ipc_iset_mask_set6
SET6 -> IRQ6 request.
@ k_ra8_ipc_iset_mask_set0
SET0 -> IRQ0 request.
@ k_ra8_ipc_iset_mask_set7
SET7 -> IRQ7 request.
@ k_ra8_ipc_iset_mask_set1
SET1 -> IRQ1 request.
ra8_ipc_addr_t
Memory-mapped base addresses for the IPC block and the CPSCU window that holds IPCSAR / IPCPAR.
@ k_ra8_ipc_ipcpar_addr
IPC Privileged Attribution Reg.
@ k_ra8_ipc_base_addr
IPC block base (Secure).
@ k_ra8_ipc_cpscu_addr
CPSCU base for IPCSAR/IPCPAR.
@ k_ra8_ipc_ipcsar_addr
IPC Security Attribution Reg.
ra8_ipc_offset_t
In-block offsets relative to k_ra8_ipc_base_addr.
@ k_ra8_ipc_offset_ipc0nmiset
IPC0 NMI set.
@ k_ra8_ipc_offset_ipc1nmiclr
IPC1 NMI clear.
@ k_ra8_ipc_offset_ipcsem0
First semaphore register.
@ k_ra8_ipc_offset_ipc1_ch0
IPC1 channel 0 STA (FIFO10).
@ k_ra8_ipc_offset_ipc0nmiclr
IPC0 NMI clear.
@ k_ra8_ipc_offset_ipcsem15
Last semaphore register.
@ k_ra8_ipc_offset_ipc0_ch0
IPC0 channel 0 STA (FIFO00).
@ k_ra8_ipc_offset_ipc1_ch1
IPC1 channel 1 STA (FIFO11).
@ k_ra8_ipc_offset_ipc0nmista
IPC0 NMI status (CPU1 -> CPU0).
@ k_ra8_ipc_offset_ipc0_ch1
IPC0 channel 1 STA (FIFO01).
@ k_ra8_ipc_offset_ipc1nmista
IPC1 NMI status (CPU0 -> CPU1).
@ k_ra8_ipc_offset_ipc1nmiset
IPC1 NMI set.
static volatile uint32_t * ra8_ipc_sem(uint8_t sem_id)
Get a pointer to one IPCSEM hardware semaphore register.
ra8_ipc_sta_mask_t
Bit masks for the IPCnSTAm "Status" registers.
@ k_ra8_ipc_sta_mask_rerr
RERR: read-while-empty.
@ k_ra8_ipc_sta_mask_irq5
IRQ5 event.
@ k_ra8_ipc_sta_mask_event
Any event the ISR cares about.
@ k_ra8_ipc_sta_mask_irq4
IRQ4 event.
@ k_ra8_ipc_sta_mask_irq3
IRQ3 event.
@ k_ra8_ipc_sta_mask_irq2
IRQ2 event.
@ k_ra8_ipc_sta_mask_err_any
RERR | FERR.
@ k_ra8_ipc_sta_mask_full
FULL: FIFO full.
@ k_ra8_ipc_sta_mask_irq1
IRQ1 event.
@ k_ra8_ipc_sta_mask_ferr
FERR: write-while-full.
@ k_ra8_ipc_sta_mask_rdy
RDY: FIFO non-empty.
@ k_ra8_ipc_sta_mask_irq0
IRQ0 event.
@ k_ra8_ipc_sta_mask_irq_all
IRQ7..IRQ0 event bits.
@ k_ra8_ipc_sta_mask_irq7
IRQ7 event.
@ k_ra8_ipc_sta_mask_irq6
IRQ6 event.
ra8_ipc_clr_mask_t
Bit masks for the IPCnCLRm "Clear" registers.
@ k_ra8_ipc_clr_mask_all
Every clearable bit.
@ k_ra8_ipc_clr_mask_fclr
FCLR: clear FERR.
@ k_ra8_ipc_clr_mask_clr3
CLR3 -> drop STA.IRQ3.
@ k_ra8_ipc_clr_mask_clr5
CLR5 -> drop STA.IRQ5.
@ k_ra8_ipc_clr_mask_clr2
CLR2 -> drop STA.IRQ2.
@ k_ra8_ipc_clr_mask_clr0
CLR0 -> drop STA.IRQ0.
@ k_ra8_ipc_clr_mask_rst
RST: reset message FIFO.
@ k_ra8_ipc_clr_mask_clr6
CLR6 -> drop STA.IRQ6.
@ k_ra8_ipc_clr_mask_clr7
CLR7 -> drop STA.IRQ7.
@ k_ra8_ipc_clr_mask_clr1
CLR1 -> drop STA.IRQ1.
@ k_ra8_ipc_clr_mask_rclr
RCLR: clear RERR.
@ k_ra8_ipc_clr_mask_irq_all
CLR7..CLR0 -> clear IRQn.
@ k_ra8_ipc_clr_mask_clr4
CLR4 -> drop STA.IRQ4.
ra8_ipc_limits_t
Counts and strides used by the driver / accessors.
@ k_ra8_ipc_channel_stride
Bytes between channel windows.
@ k_ra8_ipc_sem_count
IPCSEM0..IPCSEM15.
@ k_ra8_ipc_fifo_depth
4 stages per FIFO (HUM 3.1).
@ k_ra8_ipc_irq_event_count
8 IRQ event lines per channel.
@ k_ra8_ipc_nmi_unit_count
IPC0 + IPC1 NMI units.
@ k_ra8_ipc_channel_count
Total FIFO channels: 2 per unit x 2.
@ k_ra8_ipc_nmi_stride
Bytes between NMI unit windows.
ra8_ipcsar_mask_t
Bit masks for the IPCSAR Security Attribution Register.
@ k_ra8_ipcsar_mask_saipcir3
IPC1 channel 1 secure attr.
@ k_ra8_ipcsar_mask_saipcir2
IPC1 channel 0 secure attr.
@ k_ra8_ipcsar_mask_saipcir0
IPC0 channel 0 secure attr.
@ k_ra8_ipcsar_mask_saipcsem1
IPCSEM8..15 secure attr.
@ k_ra8_ipcsar_mask_saipcnmi0
IPC0NMI* secure attr.
@ k_ra8_ipcsar_mask_saipcsem0
IPCSEM0..7 secure attr.
@ k_ra8_ipcsar_mask_saipcnmi1
IPC1NMI* secure attr.
@ k_ra8_ipcsar_mask_saipcir1
IPC0 channel 1 secure attr.
ra8_ipc_sem_attr_group_t
IPCSEMn attribution-group selector (HUM Ch 3.3.1 p 227-228).
@ k_ra8_ipc_sem_group_low
IPCSEM0..IPCSEM7 attribution group.
@ k_ra8_ipc_sem_group_high
IPCSEM8..IPCSEM15 attribution group.
ra8_ipc_sem_mask_t
Bit masks for the IPCSEMn semaphore register.
@ k_ra8_ipc_sem_mask_lock
LOCK bit (read-to-acquire).
static uint8_t ra8_ipc_channel_to_unit(uint8_t channel)
Map a logical channel id to its containing IPC unit.
ra8_ipc_unit_id_t
Logical IPC unit identifiers (IPC0 vs IPC1).
@ k_ra8_ipc_unit_ipc0
CPU1 -> CPU0 (M33 sends, M85 receives).
@ k_ra8_ipc_unit_ipc1
CPU0 -> CPU1 (M85 sends, M33 receives).
Per-FIFO-channel register window (5 x 32-bit at +0x20 stride).
volatile uint32_t ISET
+0x04 IRQ request set (W).
volatile uint32_t CLR
+0x10 Status / error / FIFO clear (W).
volatile uint32_t RXD
+0x0C FIFO receive data (R).
volatile uint32_t TXD
+0x08 FIFO transmit data (W).
volatile uint32_t STA
+0x00 Status (RDY/FULL/RERR/FERR/IRQn).
volatile uint32_t _pad[3]
+0x14..+0x1F padding to next channel.
Per-NMI-unit register window (3 x 32-bit at +0x10 stride).
volatile uint32_t _pad
+0x0C padding to next unit.
volatile uint32_t NMICLR
+0x08 NMI clear (W).
volatile uint32_t NMISTA
+0x00 NMI status (R).
volatile uint32_t NMISET
+0x04 NMI set (W).