ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_i2c_regs.h
Go to the documentation of this file.
1
27
28#pragma once
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
34#include <stddef.h>
35#include <stdint.h>
36
37#include "ra8_attributes.h"
38
51typedef enum : uintptr_t {
52 k_ra8_i2c0_base_addr = 0x4025E000UL,
53 k_ra8_i2c_channel_stride = 0x00000100UL,
55
64
78typedef struct {
79 volatile uint8_t ICCR1;
80 volatile uint8_t ICCR2;
81 volatile uint8_t ICMR1;
82 volatile uint8_t ICMR2;
83 volatile uint8_t ICMR3;
84 volatile uint8_t ICFER;
85 volatile uint8_t ICSER;
86 volatile uint8_t ICIER;
87 volatile uint8_t ICSR1;
88 volatile uint8_t ICSR2;
89 volatile uint8_t SARL0;
90 volatile uint8_t SARU0;
91 volatile uint8_t SARL1;
92 volatile uint8_t SARU1;
93 volatile uint8_t SARL2;
94 volatile uint8_t SARU2;
95 volatile uint8_t ICBRL;
96 volatile uint8_t ICBRH;
97 volatile uint8_t ICDRT;
98 volatile uint8_t ICDRR;
99 volatile uint8_t ICWUR;
100 volatile uint8_t ICWUR2;
102
103static_assert(sizeof(r_i2c_regs_t) == (size_t)k_ra8_i2c_regs_block_bytes,
104 "RIIC register block must be 22 (0x16) bytes");
105
106/* =============================================================================
107 * Bit positions for the registers actually programmed by the polling-mode
108 * IIC controller driver. Names mirror the HUM bit names -- HUM Ch 39.2,
109 * p 2369..2394.
110 * =============================================================================
111 */
112
127
140
149
162
177
192
207
227
247
261
271typedef enum : uint8_t {
275
276/* =============================================================================
277 * Composite masks. Keeping masks as a typed enum (uint8_t) lets callers OR
278 * them together without per-call shift expressions.
279 * =============================================================================
280 */
281
286typedef enum : uint8_t {
287 k_ra8_i2c_msk_iccr1_sowp = (uint8_t)(1U << 4U),
288 k_ra8_i2c_msk_iccr1_iicrst = (uint8_t)(1U << 6U),
289 k_ra8_i2c_msk_iccr1_ice = (uint8_t)(1U << 7U),
290 k_ra8_i2c_msk_iccr2_st = (uint8_t)(1U << 1U),
291 k_ra8_i2c_msk_iccr2_rs = (uint8_t)(1U << 2U),
292 k_ra8_i2c_msk_iccr2_sp = (uint8_t)(1U << 3U),
293 k_ra8_i2c_msk_iccr2_trs = (uint8_t)(1U << 5U),
294 k_ra8_i2c_msk_iccr2_mst = (uint8_t)(1U << 6U),
295 k_ra8_i2c_msk_iccr2_bbsy = (uint8_t)(1U << 7U),
296 k_ra8_i2c_msk_icmr3_ackbr = (uint8_t)(1U << 2U),
297 k_ra8_i2c_msk_icmr3_ackbt = (uint8_t)(1U << 3U),
298 k_ra8_i2c_msk_icmr3_ackwp = (uint8_t)(1U << 4U),
299 k_ra8_i2c_msk_icmr3_wait = (uint8_t)(1U << 6U),
300 k_ra8_i2c_msk_icfer_male = (uint8_t)(1U << 1U),
301 k_ra8_i2c_msk_icfer_nacke = (uint8_t)(1U << 4U),
302 k_ra8_i2c_msk_icfer_nfe = (uint8_t)(1U << 5U),
303 k_ra8_i2c_msk_icfer_scle = (uint8_t)(1U << 6U),
304 k_ra8_i2c_msk_icfer_fmpe = (uint8_t)(1U << 7U),
305 k_ra8_i2c_msk_icsr2_al = (uint8_t)(1U << 1U),
306 k_ra8_i2c_msk_icsr2_stop = (uint8_t)(1U << 3U),
307 k_ra8_i2c_msk_icsr2_nackf = (uint8_t)(1U << 4U),
308 k_ra8_i2c_msk_icsr2_rdrf = (uint8_t)(1U << 5U),
309 k_ra8_i2c_msk_icsr2_tend = (uint8_t)(1U << 6U),
310 k_ra8_i2c_msk_icsr2_tdre = (uint8_t)(1U << 7U),
311 k_ra8_i2c_msk_icmr1_mtwp = (uint8_t)(1U << 7U),
313
324typedef enum : uint8_t {
325 k_ra8_i2c_msk_icser_sar0e = (uint8_t)(1U << 0U),
326 k_ra8_i2c_msk_icser_sar1e = (uint8_t)(1U << 1U),
327 k_ra8_i2c_msk_icser_sar2e = (uint8_t)(1U << 2U),
328 k_ra8_i2c_msk_icser_gcae = (uint8_t)(1U << 3U),
329 k_ra8_i2c_msk_icsr1_aas0 = (uint8_t)(1U << 0U),
330 k_ra8_i2c_msk_icsr1_aas1 = (uint8_t)(1U << 1U),
331 k_ra8_i2c_msk_icsr1_aas2 = (uint8_t)(1U << 2U),
332 k_ra8_i2c_msk_icsr1_gca = (uint8_t)(1U << 3U),
334 k_ra8_i2c_msk_icsr1_match = (uint8_t)((1U << 0U) | (1U << 1U) | (1U << 2U) | (1U << 3U)),
336
356static inline volatile r_i2c_regs_t* ra8_i2c_regs(uint8_t channel)
357{
358 if ((uint16_t)channel >= (uint16_t)k_ra8_i2c_channel_count) {
359 return nullptr;
360 }
361 const uintptr_t base =
362 (uintptr_t)k_ra8_i2c0_base_addr + ((uintptr_t)channel * (uintptr_t)k_ra8_i2c_channel_stride);
363 return (volatile r_i2c_regs_t*)base;
364}
365
366#ifdef __cplusplus
367}
368#endif
Annotation-attribute framework macros for ra8-firmware.
#define RA8_HW_REGISTER_ACCESS
Mark an MMIO accessor function (returns volatile register pointer).
ra8_i2c_saru_t
SARUy (own-address upper) field positions (HUM Ch 39.2.14, p 2391).
@ k_ra8_i2c_saru_sva_pos
10-bit own-address upper SVA[1:0].
@ k_ra8_i2c_saru_fs_pos
7-bit (0) / 10-bit (1) format select.
ra8_i2c_icmr1_t
ICMR1 (Bus Mode 1) field positions (HUM Ch 39.2.3, p 2374).
@ k_ra8_i2c_icmr1_mtwp_pos
MST/TRS write protect.
@ k_ra8_i2c_icmr1_cks_pos
Internal reference clock select [6:4].
ra8_i2c_icmr3_t
ICMR3 (Bus Mode 3) field positions (HUM Ch 39.2.5, p 2376).
@ k_ra8_i2c_icmr3_ackwp_pos
ACKBT write protect.
@ k_ra8_i2c_icmr3_rdrfs_pos
RDRF flag set timing select.
@ k_ra8_i2c_icmr3_wait_pos
Wait between 9th and 1st clock.
@ k_ra8_i2c_icmr3_smbs_pos
SMBus/I2C select.
@ k_ra8_i2c_icmr3_ackbt_pos
Transmit acknowledge.
@ k_ra8_i2c_icmr3_ackbr_pos
Receive acknowledge (R).
ra8_i2c_sarl_t
SARLy (own-address lower) field positions (HUM Ch 39.2.13, p 2390).
@ k_ra8_i2c_sarl_sva0_pos
10-bit own-address LSB (SVA0).
@ k_ra8_i2c_sarl_sva_pos
7-bit own address / 10-bit low SVA[6:0].
ra8_i2c_mask_t
Composite bit masks used by the polling driver (HUM Ch 39.2).
@ k_ra8_i2c_msk_icsr2_al
HUM 39.2.10 ICSR2.AL, p 2384.
@ k_ra8_i2c_msk_iccr2_rs
HUM 39.2.2 ICCR2.RS, p 2371.
@ k_ra8_i2c_msk_icfer_fmpe
HUM 39.2.6 ICFER.FMPE, p 2378.
@ k_ra8_i2c_msk_icmr1_mtwp
HUM 39.2.3 ICMR1.MTWP, p 2374.
@ k_ra8_i2c_msk_iccr2_st
HUM 39.2.2 ICCR2.ST, p 2371.
@ k_ra8_i2c_msk_icfer_nacke
HUM 39.2.6 ICFER.NACKE, p 2378.
@ k_ra8_i2c_msk_iccr2_mst
HUM 39.2.2 ICCR2.MST, p 2371.
@ k_ra8_i2c_msk_icmr3_ackbr
HUM 39.2.5 ICMR3.ACKBR, p 2376.
@ k_ra8_i2c_msk_iccr2_trs
HUM 39.2.2 ICCR2.TRS, p 2371.
@ k_ra8_i2c_msk_icsr2_nackf
HUM 39.2.10 ICSR2.NACKF, p 2384.
@ k_ra8_i2c_msk_iccr2_sp
HUM 39.2.2 ICCR2.SP, p 2371.
@ k_ra8_i2c_msk_iccr1_iicrst
HUM 39.2.1 ICCR1.IICRST, p 2369.
@ k_ra8_i2c_msk_iccr1_ice
HUM 39.2.1 ICCR1.ICE, p 2369.
@ k_ra8_i2c_msk_icsr2_tdre
HUM 39.2.10 ICSR2.TDRE, p 2384.
@ k_ra8_i2c_msk_iccr1_sowp
HUM 39.2.1 ICCR1.SOWP, p 2369.
@ k_ra8_i2c_msk_icmr3_wait
HUM 39.2.5 ICMR3.WAIT, p 2376.
@ k_ra8_i2c_msk_iccr2_bbsy
HUM 39.2.2 ICCR2.BBSY, p 2371.
@ k_ra8_i2c_msk_icsr2_stop
HUM 39.2.10 ICSR2.STOP, p 2384.
@ k_ra8_i2c_msk_icmr3_ackbt
HUM 39.2.5 ICMR3.ACKBT, p 2376.
@ k_ra8_i2c_msk_icsr2_tend
HUM 39.2.10 ICSR2.TEND, p 2384.
@ k_ra8_i2c_msk_icfer_scle
HUM 39.2.6 ICFER.SCLE, p 2378.
@ k_ra8_i2c_msk_icfer_nfe
HUM 39.2.6 ICFER.NFE, p 2378.
@ k_ra8_i2c_msk_icmr3_ackwp
HUM 39.2.5 ICMR3.ACKWP, p 2376.
@ k_ra8_i2c_msk_icfer_male
HUM 39.2.6 ICFER.MALE, p 2378.
@ k_ra8_i2c_msk_icsr2_rdrf
HUM 39.2.10 ICSR2.RDRF, p 2384.
ra8_i2c_iccr1_t
ICCR1 (Bus Control 1) field positions (HUM Ch 39.2.1, p 2369).
@ k_ra8_i2c_iccr1_sowp_pos
SCLO/SDAO write protect.
@ k_ra8_i2c_iccr1_scli_pos
SCL line monitor (R).
@ k_ra8_i2c_iccr1_sclo_pos
SCL output control/monitor.
@ k_ra8_i2c_iccr1_sdai_pos
SDA line monitor (R).
@ k_ra8_i2c_iccr1_sdao_pos
SDA output control/monitor.
@ k_ra8_i2c_iccr1_clo_pos
Extra SCL clock cycle output.
@ k_ra8_i2c_iccr1_iicrst_pos
I2C internal reset.
@ k_ra8_i2c_iccr1_ice_pos
I2C interface enable.
ra8_i2c_limits_t
Channel-count limits.
@ k_ra8_i2c_channel_count
HUM Ch 39.1, p 2367 (3 channels).
@ k_ra8_i2c_regs_block_bytes
sizeof(r_i2c_regs_t): 0x00..0x15.
ra8_i2c_icier_t
ICIER (Bus Interrupt Enable) field positions (HUM Ch 39.2.8, p 2381).
@ k_ra8_i2c_icier_alie_pos
Arbitration-lost interrupt enable.
@ k_ra8_i2c_icier_teie_pos
Transmit end interrupt enable.
@ k_ra8_i2c_icier_stie_pos
Start condition interrupt enable.
@ k_ra8_i2c_icier_rie_pos
Receive data full interrupt enable.
@ k_ra8_i2c_icier_tmoie_pos
Timeout interrupt enable.
@ k_ra8_i2c_icier_spie_pos
Stop condition interrupt enable.
@ k_ra8_i2c_icier_nakie_pos
NACK reception interrupt enable.
@ k_ra8_i2c_icier_tie_pos
Transmit data empty interrupt enable.
ra8_i2c_icsr1_t
ICSR1 (Bus Status 1) field positions (HUM Ch 39.2.9, p 2382).
@ k_ra8_i2c_icsr1_aas1_pos
Own-address slot 1 detected.
@ k_ra8_i2c_icsr1_did_pos
Device-ID address detected.
@ k_ra8_i2c_icsr1_hoa_pos
Host address detected.
@ k_ra8_i2c_icsr1_aas2_pos
Own-address slot 2 detected.
@ k_ra8_i2c_icsr1_gca_pos
General-call address detected.
@ k_ra8_i2c_icsr1_aas0_pos
Own-address slot 0 detected.
static volatile r_i2c_regs_t * ra8_i2c_regs(uint8_t channel)
Get a pointer to the IIC channel channel register block.
ra8_i2c_icser_t
ICSER (Bus Status Enable) field positions (HUM Ch 39.2.7, p 2380).
@ k_ra8_i2c_icser_hoae_pos
Host-address enable.
@ k_ra8_i2c_icser_sar2e_pos
Own-address slot 2 match enable.
@ k_ra8_i2c_icser_gcae_pos
General-call address enable.
@ k_ra8_i2c_icser_sar0e_pos
Own-address slot 0 match enable.
@ k_ra8_i2c_icser_dide_pos
Device-ID address detect enable.
@ k_ra8_i2c_icser_sar1e_pos
Own-address slot 1 match enable.
ra8_i2c_icsr2_t
ICSR2 (Bus Status 2) field positions (HUM Ch 39.2.10, p 2384).
@ k_ra8_i2c_icsr2_tmof_pos
Timeout detection flag.
@ k_ra8_i2c_icsr2_al_pos
Arbitration-lost flag.
@ k_ra8_i2c_icsr2_start_pos
Start condition detection flag.
@ k_ra8_i2c_icsr2_tdre_pos
Transmit data empty flag.
@ k_ra8_i2c_icsr2_nackf_pos
NACK detection flag.
@ k_ra8_i2c_icsr2_stop_pos
Stop condition detection flag.
@ k_ra8_i2c_icsr2_tend_pos
Transmit end flag.
@ k_ra8_i2c_icsr2_rdrf_pos
Receive data full flag.
ra8_i2c_addr_t
Hardware base addresses for the IIC channels.
@ k_ra8_i2c0_base_addr
HUM Ch 39.2.1, p 2369.
@ k_ra8_i2c_channel_stride
HUM Ch 39.2.1, p 2369.
ra8_i2c_peripheral_mask_t
Composite masks for the target (peripheral) role (HUM Ch 39.2).
@ k_ra8_i2c_msk_icsr1_aas2
HUM 39.2.9 ICSR1.AAS2, p 2382.
@ k_ra8_i2c_msk_icser_gcae
HUM 39.2.7 ICSER.GCAE, p 2380.
@ k_ra8_i2c_msk_icser_sar2e
HUM 39.2.7 ICSER.SAR2E, p 2380.
@ k_ra8_i2c_msk_icser_sar1e
HUM 39.2.7 ICSER.SAR1E, p 2380.
@ k_ra8_i2c_msk_icsr1_gca
HUM 39.2.9 ICSR1.GCA, p 2382.
@ k_ra8_i2c_msk_icsr1_match
Union AAS0|AAS1|AAS2|GCA: any own-address/general-call match.
@ k_ra8_i2c_msk_icser_sar0e
HUM 39.2.7 ICSER.SAR0E, p 2380.
@ k_ra8_i2c_msk_icsr1_aas0
HUM 39.2.9 ICSR1.AAS0, p 2382.
@ k_ra8_i2c_msk_icsr1_aas1
HUM 39.2.9 ICSR1.AAS1, p 2382.
ra8_i2c_iccr2_t
ICCR2 (Bus Control 2) field positions (HUM Ch 39.2.2, p 2371).
@ k_ra8_i2c_iccr2_mst_pos
Controller/peripheral mode.
@ k_ra8_i2c_iccr2_trs_pos
Transmit/receive mode.
@ k_ra8_i2c_iccr2_sp_pos
Stop condition issuance request.
@ k_ra8_i2c_iccr2_bbsy_pos
Bus busy detection flag (R).
@ k_ra8_i2c_iccr2_rs_pos
Restart condition issuance request.
@ k_ra8_i2c_iccr2_st_pos
Start condition issuance request.
ra8_i2c_icfer_t
ICFER (Bus Function Enable) field positions (HUM Ch 39.2.6, p 2378).
@ k_ra8_i2c_icfer_male_pos
Controller arbitration-lost detect enable.
@ k_ra8_i2c_icfer_nale_pos
NACK transmit arbitration-lost enable.
@ k_ra8_i2c_icfer_sale_pos
Peripheral arbitration-lost enable.
@ k_ra8_i2c_icfer_tmoe_pos
Timeout function enable.
@ k_ra8_i2c_icfer_scle_pos
SCL synchronous circuit enable.
@ k_ra8_i2c_icfer_nacke_pos
NACK reception transfer suspension enable.
@ k_ra8_i2c_icfer_fmpe_pos
Fast-mode plus enable.
@ k_ra8_i2c_icfer_nfe_pos
Digital noise filter enable.
Memory-mapped register block for one IIC channel.
volatile uint8_t ICCR2
+0x01 Bus Control Register 2 (HUM 39.2.2, p 2371).
volatile uint8_t ICMR1
+0x02 Bus Mode Register 1 (HUM 39.2.3, p 2374).
volatile uint8_t ICIER
+0x07 Bus Interrupt Enable (HUM 39.2.8, p 2381).
volatile uint8_t ICWUR2
+0x15 Wakeup Unit Register 2 (HUM 39.2.12, p 2389).
volatile uint8_t SARU0
+0x0B Peripheral Address U0 (HUM 39.2.14, p 2391).
volatile uint8_t ICBRL
+0x10 Bit Rate Low-Level (HUM 39.2.15, p 2391).
volatile uint8_t ICSER
+0x06 Bus Status Enable (HUM 39.2.7, p 2380).
volatile uint8_t ICDRT
+0x12 Transmit Data Register (HUM 39.2.17, p 2393).
volatile uint8_t ICDRR
+0x13 Receive Data Register (HUM 39.2.18, p 2393).
volatile uint8_t ICSR1
+0x08 Bus Status Register 1 (HUM 39.2.9, p 2382).
volatile uint8_t SARL2
+0x0E Peripheral Address L2 (HUM 39.2.13, p 2390).
volatile uint8_t SARL1
+0x0C Peripheral Address L1 (HUM 39.2.13, p 2390).
volatile uint8_t ICFER
+0x05 Bus Function Enable (HUM 39.2.6, p 2378).
volatile uint8_t ICWUR
+0x14 Wakeup Unit Register (HUM 39.2.11, p 2388).
volatile uint8_t ICCR1
+0x00 Bus Control Register 1 (HUM 39.2.1, p 2369).
volatile uint8_t ICMR2
+0x03 Bus Mode Register 2 (HUM 39.2.4, p 2375).
volatile uint8_t SARU1
+0x0D Peripheral Address U1 (HUM 39.2.14, p 2391).
volatile uint8_t SARU2
+0x0F Peripheral Address U2 (HUM 39.2.14, p 2391).
volatile uint8_t SARL0
+0x0A Peripheral Address L0 (HUM 39.2.13, p 2390).
volatile uint8_t ICMR3
+0x04 Bus Mode Register 3 (HUM 39.2.5, p 2376).
volatile uint8_t ICBRH
+0x11 Bit Rate High-Level (HUM 39.2.16, p 2392).
volatile uint8_t ICSR2
+0x09 Bus Status Register 2 (HUM 39.2.10, p 2384).