ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_i3c_regs.h
Go to the documentation of this file.
1
32
33#pragma once
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39#include <stddef.h>
40#include <stdint.h>
41
42#include "ra8_attributes.h"
43
52typedef enum : uintptr_t {
53 k_ra8_i3c0_base_addr = 0x4035F000UL,
54 k_ra8_i3c1_base_addr = 0x4035F100UL,
57
68typedef enum : uint8_t {
80 /* From SCSTLCTL+1 (0x0B4) through CNDCTL+RESERVED13 ending at 0x14F is
81 * 0x9C bytes = 39 words. Covers SVTDLG0, STCTL, ATCTL, ATTRG, ATCCNTE,
82 * CNDCTL and the surrounding RESERVED10..RESERVED13 padding. None of
83 * these registers are touched by the current driver -- the higher-
84 * level peripheral-mode + sync-timing card-stack consumer can carve them
85 * out of the gap when it lands. */
87 /* The 0x158..0x17B gap is 8 reserved words (RESERVED14[8]) before NIBIQP. */
89 /* IBI-status-queue port immediately follows NIBIQP -> NRSQP at 0x180. */
90 /* From NRSQP+1 (0x184) up to NTST at 0x1E0 is 0x5C bytes = 23 words.
91 * Covers HCMDQP, HRSPQP, HTDTBP, NQTHCTL, NTBTHCTL0, NRQTHCTL,
92 * HQTHCTL, HTBTHCTL, BST, BSTE, BIE, BSTFC and intervening
93 * reserved padding -- none touched by the current driver. */
96
112typedef struct {
114 volatile uint32_t PRTS;
117 volatile uint32_t CECTL;
118 volatile uint32_t BCTL;
119 volatile uint32_t MSDVAD;
123 volatile uint32_t RSTCTL;
125 volatile uint32_t PRSST;
128 volatile uint32_t INST;
129 volatile uint32_t INSTE;
130 volatile uint32_t INIE;
131 volatile uint32_t INSTFC;
134 volatile uint32_t DVCT;
138 volatile uint32_t IBINCTL;
141 volatile uint32_t BFCTL;
142 volatile uint32_t SVCTL;
145 volatile uint32_t REFCKCTL;
146 volatile uint32_t STDBR;
147 volatile uint32_t EXTBR;
148 volatile uint32_t BFRECDT;
149 volatile uint32_t BAVLCDT;
150 volatile uint32_t BIDLCDT;
151 volatile uint32_t OUTCTL;
152 volatile uint32_t INCTL;
153 volatile uint32_t TMOCTL;
156 volatile uint32_t WUCTL;
159 volatile uint32_t ACKCTL;
160 volatile uint32_t SCSTRCTL;
163 volatile uint32_t SCSTLCTL;
164 volatile uint32_t NSDVAD;
168 volatile uint32_t NTIBIVCTL;
174 volatile uint32_t NCMDQP;
175 volatile uint32_t NRSPQP;
176 volatile uint32_t NTDTBP0;
179 volatile uint32_t NIBIQP;
180 volatile uint32_t NRSQP;
183 volatile uint32_t NTST;
185
190typedef enum : uint32_t {
195 k_ra8_i3c_bctl_abt_mask = 0x20000000UL,
196 k_ra8_i3c_bctl_rsm_mask = 0x40000000UL,
199
214
228
243
254
278
283typedef enum : uint32_t {
286
325
354
367
385
397
411
434
435/* Compile-time guards: every register that the I3C driver reads or
436 * writes must sit at the FSP-canonical offset. The constants on the
437 * RHS come from the RA8D2 CMSIS device header
438 * ``R7KA8D2KF_core0.h::R_I3C0_Type``. */
439static_assert(offsetof(r_i3c_regs_t, INST) == (size_t)k_ra8_i3c_off_inst, "INST offset");
440static_assert(offsetof(r_i3c_regs_t, MSDVAD) == (size_t)k_ra8_i3c_off_msdvad, "MSDVAD offset");
441static_assert(offsetof(r_i3c_regs_t, BCTL) == (size_t)k_ra8_i3c_off_bctl, "BCTL offset");
442static_assert(offsetof(r_i3c_regs_t, RSTCTL) == (size_t)k_ra8_i3c_off_rstctl, "RSTCTL offset");
443static_assert(offsetof(r_i3c_regs_t, DVCT) == (size_t)k_ra8_i3c_off_dvct, "DVCT offset");
444static_assert(offsetof(r_i3c_regs_t, IBINCTL) == (size_t)k_ra8_i3c_off_ibinctl, "IBINCTL offset");
445static_assert(offsetof(r_i3c_regs_t, BFCTL) == (size_t)k_ra8_i3c_off_bfctl, "BFCTL offset");
446static_assert(offsetof(r_i3c_regs_t, REFCKCTL) == (size_t)k_ra8_i3c_off_refckctl,
447 "REFCKCTL offset");
448static_assert(offsetof(r_i3c_regs_t, ACKCTL) == (size_t)k_ra8_i3c_off_ackctl, "ACKCTL offset");
449static_assert(offsetof(r_i3c_regs_t, SCSTLCTL) == (size_t)k_ra8_i3c_off_scstlctl,
450 "SCSTLCTL offset");
451static_assert(offsetof(r_i3c_regs_t, NCMDQP) == (size_t)k_ra8_i3c_off_ncmdqp, "NCMDQP offset");
452static_assert(offsetof(r_i3c_regs_t, NRSPQP) == (size_t)k_ra8_i3c_off_nrspqp, "NRSPQP offset");
453static_assert(offsetof(r_i3c_regs_t, NTDTBP0) == (size_t)k_ra8_i3c_off_ntdtbp0, "NTDTBP0 offset");
454static_assert(offsetof(r_i3c_regs_t, NIBIQP) == (size_t)k_ra8_i3c_off_nibiqp, "NIBIQP offset");
455static_assert(offsetof(r_i3c_regs_t, NRSQP) == (size_t)k_ra8_i3c_off_nrsqp, "NRSQP offset");
456static_assert(offsetof(r_i3c_regs_t, NTST) == (size_t)k_ra8_i3c_off_ntst, "NTST offset");
457
463static inline volatile r_i3c_regs_t* ra8_i3c(void)
464{
465 return (volatile r_i3c_regs_t*)k_ra8_i3c0_base_addr;
466}
467
468#ifdef __cplusplus
469}
470#endif
Annotation-attribute framework macros for ra8-firmware.
#define RA8_HW_REGISTER_ACCESS
Mark an MMIO accessor function (returns volatile register pointer).
ra8_i3c_byte_t
Byte-pack helpers used to assemble / disassemble 32-bit FIFO words.
@ k_ra8_i3c_shift_b1
Shift for byte 1 in a word.
@ k_ra8_i3c_byte_shift
Bits per byte.
@ k_ra8_i3c_addr_shift_in_ibi_id
IBI ID = (addr << 1) | RnW.
@ k_ra8_i3c_shift_b3
Shift for byte 3 in a word.
@ k_ra8_i3c_word_size
Bytes per FIFO word.
@ k_ra8_i3c_byte_mask
Mask covering one byte.
@ k_ra8_i3c_shift_b2
Shift for byte 2 in a word.
ra8_i3c_misc_t
Miscellaneous protocol limits.
@ k_ra8_i3c_pid_bytes
48-bit Provisional ID.
@ k_ra8_i3c_immediate_max_bytes
Immediate-data transfer cap.
@ k_ra8_i3c_addr_mask
7-bit dynamic address mask.
@ k_ra8_i3c_setdasa_payload_bytes
SETDASA carries one address byte.
@ k_ra8_i3c_max_targets
Cap on ENTDAA device-table size.
ra8_i3c_ibi_status_bits_t
IBI status descriptor field positions (FSP I3C_IBI_STATUS_DESC_*).
@ k_ra8_i3c_ibi_status_last_shift
RA8 I3C ibi status last shift.
@ k_ra8_i3c_ibi_status_length_mask
RA8 I3C ibi status length mask.
@ k_ra8_i3c_ibi_status_ibi_st_mask
IBI status type bit 31.
@ k_ra8_i3c_ibi_status_id_mask
RA8 I3C ibi status ID mask.
@ k_ra8_i3c_ibi_status_id_shift
RA8 I3C ibi status ID shift.
@ k_ra8_i3c_ibi_status_length_shift
RA8 I3C ibi status length shift.
ra8_i3c_offset_t
FSP-canonical byte offsets used by the layout asserts below.
@ k_ra8_i3c_off_ntdtbp0
RA8 I3C off ntdtbp0.
@ k_ra8_i3c_off_bctl
RA8 I3C off bctl.
@ k_ra8_i3c_off_refckctl
RA8 I3C off refckctl.
@ k_ra8_i3c_off_ibinctl
RA8 I3C off ibinctl.
@ k_ra8_i3c_off_dvct
RA8 I3C off dvct.
@ k_ra8_i3c_off_rstctl
RA8 I3C off rstctl.
@ k_ra8_i3c_off_nibiqp
RA8 I3C off nibiqp.
@ k_ra8_i3c_off_nrspqp
RA8 I3C off nrspqp.
@ k_ra8_i3c_off_scstlctl
RA8 I3C off scstlctl.
@ k_ra8_i3c_off_nrsqp
RA8 I3C off nrsqp.
@ k_ra8_i3c_off_ackctl
RA8 I3C off ackctl.
@ k_ra8_i3c_off_bfctl
RA8 I3C off bfctl.
@ k_ra8_i3c_off_ntst
RA8 I3C off ntst.
@ k_ra8_i3c_off_ncmdqp
RA8 I3C off ncmdqp.
@ k_ra8_i3c_off_msdvad
RA8 I3C off msdvad.
@ k_ra8_i3c_off_inst
RA8 I3C off inst.
ra8_i3c_ntst_bits_t
NTST (Normal Transfer Status) flag positions.
@ k_ra8_i3c_ntst_tdbef0_mask
Tx Buffer Empty bit 0.
@ k_ra8_i3c_ntst_rsqff_mask
Rx Status Queue Full bit 20.
@ k_ra8_i3c_ntst_rspqff_mask
Rsp Queue Full bit 4.
@ k_ra8_i3c_ntst_rdbff0_mask
Rx Buffer Full bit 1.
@ k_ra8_i3c_ntst_ibiqeff_mask
IBI Queue Empty/Full bit 2.
@ k_ra8_i3c_ntst_cmdqef_mask
Cmd Queue Empty bit 3.
static volatile r_i3c_regs_t * ra8_i3c(void)
Get pointer to I3C0.
ra8_i3c_ccc_opcode_t
MIPI I3C v1.0 Common Command Code (CCC) opcodes.
@ k_ra8_i3c_ccc_d_getpid
Direct Get Provisional ID.
@ k_ra8_i3c_ccc_b_rstdaa
Broadcast Reset Dynamic Address Assignment.
@ k_ra8_i3c_ccc_direct_mask
Bit set in direct CCC opcodes.
@ k_ra8_i3c_ccc_b_entas2
Broadcast Enter Activity State 2.
@ k_ra8_i3c_ccc_d_getmrl
Direct Get Max Read Length.
@ k_ra8_i3c_ccc_d_entas2
Direct Enter Activity State 2.
@ k_ra8_i3c_ccc_d_getstatus
Direct Get Device Status.
@ k_ra8_i3c_ccc_b_enec
Broadcast Enable Peripheral Events.
@ k_ra8_i3c_ccc_d_entas1
Direct Enter Activity State 1.
@ k_ra8_i3c_ccc_d_getxtime
Direct Get Exchange Timing Information.
@ k_ra8_i3c_ccc_b_disec
Broadcast Disable Peripheral Events.
@ k_ra8_i3c_ccc_d_getdcr
Direct Get Device Characteristic Register.
@ k_ra8_i3c_ccc_d_entas0
Direct Enter Activity State 0.
@ k_ra8_i3c_ccc_b_entas3
Broadcast Enter Activity State 3.
@ k_ra8_i3c_ccc_d_setdasa
Direct Set Dynamic Address from Static Address.
@ k_ra8_i3c_ccc_d_entas3
Direct Enter Activity State 3.
@ k_ra8_i3c_ccc_d_enec
Direct Enable Peripheral Events.
@ k_ra8_i3c_ccc_d_getmwl
Direct Get Max Write Length.
@ k_ra8_i3c_ccc_d_rstact
Direct Peripheral Reset Action.
@ k_ra8_i3c_ccc_b_rstact
Broadcast Peripheral Reset Action.
@ k_ra8_i3c_ccc_d_getbcr
Direct Get Bus Characteristic Register.
@ k_ra8_i3c_ccc_b_entas0
Broadcast Enter Activity State 0.
@ k_ra8_i3c_ccc_b_entdaa
Broadcast Enter Dynamic Address Assignment.
@ k_ra8_i3c_ccc_d_disec
Direct Disable Peripheral Events.
@ k_ra8_i3c_ccc_b_entas1
Broadcast Enter Activity State 1.
ra8_i3c_limits_t
Reserved-padding word counts for r_i3c_regs_t.
@ k_ra8_i3c_pad_after_ibinctl
RESERVED5 after IBINCTL.
@ k_ra8_i3c_pad_after_scstlctl
Reserved words 0x0BC..0x14F before NCMDQP.
@ k_ra8_i3c_pad_after_prts
RESERVED[3] after PRTS.
@ k_ra8_i3c_pad_after_msdvad
RESERVED1 after MSDVAD.
@ k_ra8_i3c_pad_after_nrsqp
Reserved words 0x184..0x1DF before NTST.
@ k_ra8_i3c_pad_after_svctl
RESERVED6[2] after SVCTL.
@ k_ra8_i3c_pad_after_tmoctl
RESERVED7 after TMOCTL.
@ k_ra8_i3c_instance_count
RA8 I3C instance count.
@ k_ra8_i3c_pad_after_ntdtbp0
RESERVED14[8] after NTDTBP0.
@ k_ra8_i3c_pad_after_instfc
RESERVED3 after INSTFC.
@ k_ra8_i3c_pad_after_wuctl
RESERVED8 after WUCTL.
@ k_ra8_i3c_pad_after_dvct
RESERVED4[4] after DVCT.
@ k_ra8_i3c_pad_after_prsst
RESERVED2[2] after PRSST.
@ k_ra8_i3c_pad_after_scstr
RESERVED9[2] after SCSTRCTL.
ra8_i3c_rstctl_bits_t
RSTCTL register bit positions / masks.
@ k_ra8_i3c_rstctl_cmdqrst_mask
Command queue reset.
@ k_ra8_i3c_rstctl_intlrst_mask
Internal software reset.
@ k_ra8_i3c_rstctl_rspqrst_mask
Response queue reset.
@ k_ra8_i3c_rstctl_fifo_mask
RA8 I3C rstctl FIFO mask.
@ k_ra8_i3c_rstctl_rdbrst_mask
Rx data buffer reset.
@ k_ra8_i3c_rstctl_tdbrst_mask
Tx data buffer reset.
@ k_ra8_i3c_rstctl_rsqrst_mask
Receive status queue reset.
@ k_ra8_i3c_rstctl_ri3crst_mask
I3C software reset.
@ k_ra8_i3c_rstctl_ibiqrst_mask
IBI queue reset.
ra8_i3c_cmd_desc_bits_t
NCMDQP command-descriptor field positions (FSP I3C_CMD_DESC_*).
@ k_ra8_i3c_cmd_code_shift
CCC opcode position.
@ k_ra8_i3c_cmd_attr_shift
RA8 I3C cmd attr shift.
@ k_ra8_i3c_cmd_immed_bytes_shift
Immediate byte count [24:23].
@ k_ra8_i3c_cmd_tid_shift
Transaction ID position.
@ k_ra8_i3c_cmd_addr_count_shift
ENTDAA device count.
@ k_ra8_i3c_cmd_attr_immed
Immediate-data transfer attribute.
@ k_ra8_i3c_cmd_attr_xfer
Regular transfer attribute.
@ k_ra8_i3c_cmd_roc_shift
Response-on-Completion.
@ k_ra8_i3c_cmd_cp_shift
Command Present (CCC) flag.
@ k_ra8_i3c_cmd_xfer_mode_shift
RA8 I3C cmd xfer mode shift.
@ k_ra8_i3c_cmd_dev_index_shift
Device-table index.
@ k_ra8_i3c_cmd_attr_addr_assgn
Address-assignment attribute.
@ k_ra8_i3c_cmd_xfer_length_shift
Transfer length [31:16].
@ k_ra8_i3c_cmd_rnw_shift
Read-not-Write direction bit.
@ k_ra8_i3c_cmd_xfer_length_max
RA8 I3C cmd xfer length maximum.
@ k_ra8_i3c_cmd_toc_shift
Terminate-on-Completion (STOP).
ra8_i3c_cmd_hdr_mode_t
NCMDQP "transfer mode" attribute values for HDR transactions.
@ k_ra8_i3c_cmd_hdr_mode_mask
RA8 I3C cmd hdr mode mask.
@ k_ra8_i3c_cmd_hdr_mode_ddr
HDR-DDR.
@ k_ra8_i3c_cmd_hdr_mode_sdr
Plain SDR transfer (default).
@ k_ra8_i3c_cmd_hdr_mode_ts
HDR-TS.
ra8_i3c_bctl_bits_t
BCTL register bit positions / masks.
@ k_ra8_i3c_bctl_abt_mask
ABT bit 29.
@ k_ra8_i3c_bctl_buse_mask
BUSE bit 31.
@ k_ra8_i3c_bctl_rsm_mask
RSM bit 30.
@ k_ra8_i3c_bctl_slve_mask
SLVE bit 16 (peripheral-mode enable).
@ k_ra8_i3c_bctl_incba_mask
INCBA bit 0.
@ k_ra8_i3c_bctl_bmds_mask
BMDS bit 7.
@ k_ra8_i3c_bctl_hjackctl_mask
HJACKCTL bit 8.
ra8_i3c_nsdvad_bits_t
NSDVAD (Peripheral Device Address Register) bit positions / masks.
@ k_ra8_i3c_nsdvad_sdyad_mask
RA8 I3C nsdvad sdyad mask.
@ k_ra8_i3c_nsdvad_sdyad_shift
SDYAD bits [22:16].
@ k_ra8_i3c_nsdvad_sdyadv_mask
SDYADV bit 31.
ra8_i3c_inst_bits_t
INST/INSTE/INIE bit positions.
@ k_ra8_i3c_inst_inef_mask
Internal Error Flag bit 10.
ra8_i3c_addr_t
I3C peripheral base addresses.
@ k_ra8_i3c1_base_addr
I3C1 peripheral base.
@ k_ra8_i3c0_base_addr
I3C0 peripheral base.
@ k_ra8_i3c_base_addr
RA8 I3C base address.
ra8_i3c_ntibivctl_bits_t
NTIBIVCTL (IBI Valid Control) field positions.
@ k_ra8_i3c_ntibivctl_vlcnt_shift
RA8 I3C ntibivctl vlcnt shift.
@ k_ra8_i3c_ntibivctl_vlcnt_mask
Valid-entry count [7:0].
ra8_i3c_msdvad_bits_t
MSDVAD register bit positions / masks.
@ k_ra8_i3c_msdvad_mdyad_shift
MDYAD bits [22:16].
@ k_ra8_i3c_msdvad_addr_max
7-bit dynamic address.
@ k_ra8_i3c_msdvad_mdyadv_mask
MDYADV bit 31.
@ k_ra8_i3c_msdvad_mdyad_mask
RA8 I3C msdvad mdyad mask.
Partial RA8D2 I3C0 register window.
volatile uint32_t _r_scstlctl[k_ra8_i3c_pad_after_scstlctl]
Reserved.
volatile uint32_t NSDVAD
+0x0B4 Peripheral Device Address Register (peripheral-mode dynamic address + valid).
volatile uint32_t NTST
+0x1E0 Normal Transfer Status Register.
volatile uint32_t _r_instfc[k_ra8_i3c_pad_after_instfc]
Reserved.
volatile uint32_t TMOCTL
+0x090 Timeout Control Register.
volatile uint32_t BAVLCDT
+0x080 Bus Available Condition Detection Time Register.
volatile uint32_t NRSQP
+0x180 Normal Receive Status Queue Port Register.
volatile uint32_t STDBR
+0x074 Standard Bit Rate Register.
volatile uint32_t BFCTL
+0x060 Bus Function Control Register.
volatile uint32_t NTDTBP0
+0x158 Normal Transfer Data Buffer Port Register 0.
volatile uint32_t _r_tmoctl[k_ra8_i3c_pad_after_tmoctl]
Reserved.
volatile uint32_t INSTFC
+0x03C Internal Status Force Register.
volatile uint32_t NCMDQP
+0x150 Normal Command Queue Port Register.
volatile uint32_t NIBIQP
+0x17C Normal IBI Queue Port Register.
volatile uint32_t BIDLCDT
+0x084 Bus Idle Condition Detection Time Register.
volatile uint32_t _r_dvct[k_ra8_i3c_pad_after_dvct]
Reserved.
volatile uint32_t INIE
+0x038 Internal Interrupt Enable Register.
volatile uint32_t BCTL
+0x014 Bus Control Register.
volatile uint32_t SCSTLCTL
+0x0B0 SCL Stalling Control Register.
volatile uint32_t INCTL
+0x08C Input Control Register.
volatile uint32_t REFCKCTL
+0x070 Reference Clock Control Register.
volatile uint32_t INST
+0x030 Internal Status Register.
volatile uint32_t DVCT
+0x044 Device Characteristic Table Register.
volatile uint32_t PRSST
+0x024 Present State Register.
volatile uint32_t _r_msdvad[k_ra8_i3c_pad_after_msdvad]
Reserved.
volatile uint32_t NRSPQP
+0x154 Normal Response Queue Port Register.
volatile uint32_t _r_svctl[k_ra8_i3c_pad_after_svctl]
Reserved.
volatile uint32_t NTIBIVCTL
+0x0B8 IBI Valid Control Register (peripheral-side IBI queue valid count).
volatile uint32_t ACKCTL
+0x0A0 Acknowledge Control Register.
volatile uint32_t EXTBR
+0x078 Extended Bit Rate Register.
volatile uint32_t PRTS
+0x000 Protocol Selection Register.
volatile uint32_t _r_ibinctl[k_ra8_i3c_pad_after_ibinctl]
Reserved.
volatile uint32_t _r_wuctl[k_ra8_i3c_pad_after_wuctl]
Reserved.
volatile uint32_t INSTE
+0x034 Internal Status Enable Register.
volatile uint32_t _r_nrsqp[k_ra8_i3c_pad_after_nrsqp]
0x184..0x1DF reserved gap.
volatile uint32_t _r_ntdtbp0[k_ra8_i3c_pad_after_ntdtbp0]
0x15C..0x17B reserved gap.
volatile uint32_t OUTCTL
+0x088 Output Control Register.
volatile uint32_t CECTL
+0x010 Clock Enable Control Register.
volatile uint32_t BFRECDT
+0x07C Bus Free Condition Detection Time Register.
volatile uint32_t WUCTL
+0x098 Wake-Up Unit Control Register.
volatile uint32_t _r_prsst[k_ra8_i3c_pad_after_prsst]
Reserved.
volatile uint32_t MSDVAD
+0x018 Controller Device Address Register.
volatile uint32_t SVCTL
+0x064 Peripheral Control Register.
volatile uint32_t _r_prts[k_ra8_i3c_pad_after_prts]
Reserved.
volatile uint32_t SCSTRCTL
+0x0A4 SCL Stretch Control Register.
volatile uint32_t IBINCTL
+0x058 IBI Notify Control Register.
volatile uint32_t RSTCTL
+0x020 Reset Control Register.
volatile uint32_t _r_scstr[k_ra8_i3c_pad_after_scstr]
Reserved.