ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_i3c.h
Go to the documentation of this file.
1
42
43#pragma once
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48
49#include <stdint.h>
50
51#include "ra8_err.h"
52
67typedef enum : uint8_t {
71
90typedef struct {
92 uint32_t bus_hz;
93 uint32_t pclka_hz;
95
113
123typedef void (*ra8_i3c_event_fn_t)(void* ctx, uint32_t status);
124
137typedef struct {
138 uint8_t pid[6];
139 uint8_t bcr;
140 uint8_t dcr;
143
157
169typedef struct {
170 uint8_t address;
172 uint8_t payload_len;
173 uint8_t payload[8];
174 uint8_t last;
176
190
191/* =========================================================================
192 * Lifecycle (shared)
193 * =========================================================================
194 */
195
221[[nodiscard]] ra8_err_t ra8_i3c_init(uint8_t channel, const ra8_i3c_cfg_t* cfg);
222
239[[nodiscard]] ra8_err_t ra8_i3c_deinit(uint8_t channel);
240
241/* =========================================================================
242 * Data path (shared, mode-dispatched)
243 * =========================================================================
244 */
245
274[[nodiscard]] ra8_err_t
275ra8_i3c_write(uint8_t channel, uint8_t addr, const uint8_t* data, uint32_t len, bool restart);
276
303[[nodiscard]] ra8_err_t
304ra8_i3c_read(uint8_t channel, uint8_t addr, uint8_t* buf, uint32_t len, bool restart);
305
334[[nodiscard]] ra8_err_t ra8_i3c_transfer(uint8_t channel,
335 uint8_t addr,
336 const uint8_t* wr,
337 uint32_t wr_len,
338 uint8_t* rd,
339 uint32_t rd_len);
340
341/* =========================================================================
342 * I2C-mode-only
343 * =========================================================================
344 */
345
365[[nodiscard]] ra8_err_t ra8_i3c_set_clock(uint8_t channel, uint32_t bus_hz, uint32_t pclka_hz);
366
386[[nodiscard]] ra8_err_t ra8_i3c_scan(uint8_t channel, uint8_t addr, bool* out_acked);
387
406[[nodiscard]] ra8_err_t ra8_i3c_get_errors(uint8_t channel, uint8_t* out_mask);
407
424[[nodiscard]] ra8_err_t ra8_i3c_clear_errors(uint8_t channel);
425
442[[nodiscard]] ra8_err_t ra8_i3c_abort(uint8_t channel);
443
444/* =========================================================================
445 * IRQ / status (shared)
446 * =========================================================================
447 */
448
467[[nodiscard]] ra8_err_t ra8_i3c_attach_handler(uint8_t channel, ra8_i3c_event_fn_t fn, void* ctx);
468
485void ra8_i3c_dispatch(uint8_t channel);
486
487/* =========================================================================
488 * Native-mode-only (single I3C0 instance)
489 * =========================================================================
490 */
491
506[[nodiscard]] ra8_err_t ra8_i3c_set_address(uint32_t addr);
507
521[[nodiscard]] ra8_err_t ra8_i3c_bus_enable(bool enable);
522
537[[nodiscard]] ra8_err_t ra8_i3c_get_status(uint32_t* out_mask);
538
552[[nodiscard]] ra8_err_t ra8_i3c_clear_status(uint32_t mask);
553
566[[nodiscard]] ra8_err_t ra8_i3c_enter_stop(void);
567
580[[nodiscard]] ra8_err_t ra8_i3c_exit_stop(void);
581
599 uint8_t target_count);
600
616[[nodiscard]] ra8_err_t ra8_i3c_set_dynamic_address(uint8_t static_addr, uint8_t dynamic_addr);
617
631
650[[nodiscard]] ra8_err_t
651ra8_i3c_send_ccc(uint8_t ccc, uint8_t target_addr, const uint8_t* payload, uint8_t len);
652
672[[nodiscard]] ra8_err_t
673ra8_i3c_recv_ccc(uint8_t ccc, uint8_t target_addr, uint8_t* buf, uint8_t max_len, uint8_t* got_len);
674
690[[nodiscard]] ra8_err_t ra8_i3c_set_hdr_mode(uint8_t target_addr, ra8_i3c_hdr_mode_t mode);
691
706[[nodiscard]] ra8_err_t ra8_i3c_ibi_enable(uint8_t target_addr);
707
723[[nodiscard]] ra8_err_t ra8_i3c_ibi_drain(ra8_i3c_ibi_t* ibi);
724
740[[nodiscard]] ra8_err_t ra8_i3c_ibi_read(ra8_i3c_ibi_t* out_ibi);
741
756[[nodiscard]] ra8_err_t ra8_i3c_target_open(uint8_t static_addr);
757
758/* =========================================================================
759 * I2C-compatibility peripheral (responder) mode
760 * =========================================================================
761 */
762
774typedef struct {
776 uint8_t general_call;
778
795
812[[nodiscard]] ra8_err_t ra8_i3c_peripheral_open(uint8_t channel,
813 const ra8_i3c_peripheral_cfg_t* cfg);
814
829[[nodiscard]] ra8_err_t ra8_i3c_peripheral_close(uint8_t channel);
830
847[[nodiscard]] ra8_err_t ra8_i3c_peripheral_send(uint8_t channel, const uint8_t* data, uint32_t len);
848
865[[nodiscard]] ra8_err_t ra8_i3c_peripheral_receive(uint8_t channel, uint8_t* buf, uint32_t len);
866
882[[nodiscard]] ra8_err_t ra8_i3c_peripheral_status(uint8_t channel, uint8_t* out_mask);
883
884#ifdef __cplusplus
885}
886#endif
Error Code Definitions for ra8-firmware.
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_i3c_exit_stop(void)
Exit MSTP-gated stop (native mode).
Definition ra8_i3c.c:460
ra8_err_t ra8_i3c_target_open(uint8_t static_addr)
Enter peripheral (target) mode (native mode).
Definition ra8_i3c.c:893
ra8_err_t ra8_i3c_read(uint8_t channel, uint8_t addr, uint8_t *buf, uint32_t len, bool restart)
Read len bytes from addr.
Definition ra8_i3c.c:666
ra8_err_t ra8_i3c_get_status(uint32_t *out_mask)
Read the native INST status register (native mode).
Definition ra8_i3c.c:398
ra8_err_t ra8_i3c_transfer(uint8_t channel, uint8_t addr, const uint8_t *wr, uint32_t wr_len, uint8_t *rd, uint32_t rd_len)
Write-then-read with repeated-START framing (I2C mode).
Definition ra8_i3c.c:702
ra8_i3c_err_t
Latched error bits returned by ra8_i3c_get_errors (I2C mode).
Definition ra8_i3c.h:107
@ k_ra8_i3c_err_timeout
Bus timeout (BST.TODF).
Definition ra8_i3c.h:111
@ k_ra8_i3c_err_arb_lost
Arbitration lost (BST.ALF).
Definition ra8_i3c.h:109
@ k_ra8_i3c_err_nack
NACK received (BST.NACKDF).
Definition ra8_i3c.h:110
@ k_ra8_i3c_err_none
No latched error.
Definition ra8_i3c.h:108
ra8_err_t ra8_i3c_send_ccc(uint8_t ccc, uint8_t target_addr, const uint8_t *payload, uint8_t len)
Generic CCC send – broadcast or directed write (native mode).
Definition ra8_i3c.c:555
ra8_err_t ra8_i3c_peripheral_send(uint8_t channel, const uint8_t *data, uint32_t len)
Queue bytes for the controller to read (responder mode).
Definition ra8_i3c.c:807
ra8_err_t ra8_i3c_clear_status(uint32_t mask)
Clear native INST status bits (native mode).
Definition ra8_i3c.c:406
void ra8_i3c_dispatch(uint8_t channel)
Snapshot status and fire the channel's callback.
Definition ra8_i3c.c:426
ra8_err_t ra8_i3c_deinit(uint8_t channel)
Tear down an I3C channel and gate the peripheral.
Definition ra8_i3c.c:348
ra8_err_t ra8_i3c_peripheral_receive(uint8_t channel, uint8_t *buf, uint32_t len)
Read bytes the controller wrote (responder mode).
Definition ra8_i3c.c:818
ra8_err_t ra8_i3c_enter_stop(void)
Put native I3C0 into MSTP-gated stop (native mode).
Definition ra8_i3c.c:452
ra8_err_t ra8_i3c_peripheral_status(uint8_t channel, uint8_t *out_mask)
Read the latched responder-mode status (responder mode).
Definition ra8_i3c.c:829
ra8_err_t ra8_i3c_set_dynamic_address(uint8_t static_addr, uint8_t dynamic_addr)
Issue SETDASA to assign one target a dynamic address (native mode).
Definition ra8_i3c.c:518
ra8_err_t ra8_i3c_bus_enable(bool enable)
Enable/disable bus-primary operation via BCTL.BUSE (native mode).
Definition ra8_i3c.c:385
ra8_err_t ra8_i3c_dynamic_address_assign(ra8_i3c_daa_target_t *targets, uint8_t target_count)
Issue ENTDAA to enumerate I3C targets (native mode).
Definition ra8_i3c.c:470
ra8_i3c_mode_t
Operating mode selected per channel at ra8_i3c_init.
Definition ra8_i3c.h:67
@ k_ra8_i3c_mode_native
Native MIPI I3C (DAA/CCC/SDR/HDR/IBI).
Definition ra8_i3c.h:68
@ k_ra8_i3c_mode_i2c
Legacy I2C-compatibility controller.
Definition ra8_i3c.h:69
ra8_err_t ra8_i3c_attach_handler(uint8_t channel, ra8_i3c_event_fn_t fn, void *ctx)
Attach an event callback for a channel.
Definition ra8_i3c.c:415
ra8_err_t ra8_i3c_ibi_enable(uint8_t target_addr)
Enable inbound IBI capture for a target (native mode).
Definition ra8_i3c.c:871
ra8_err_t ra8_i3c_abort(uint8_t channel)
Abort an in-flight I2C transfer and release the bus (I2C mode).
Definition ra8_i3c.c:762
ra8_i3c_ibi_type_t
Type encoded in an IBI status descriptor (native mode).
Definition ra8_i3c.h:152
@ k_ra8_i3c_ibi_type_main_request
Mainship request.
Definition ra8_i3c.h:155
@ k_ra8_i3c_ibi_type_interrupt
Peripheral-initiated IBI.
Definition ra8_i3c.h:153
@ k_ra8_i3c_ibi_type_hot_join
Hot-join request.
Definition ra8_i3c.h:154
ra8_err_t ra8_i3c_scan(uint8_t channel, uint8_t addr, bool *out_acked)
Probe whether a 7-bit address acknowledges (I2C mode).
Definition ra8_i3c.c:729
ra8_err_t ra8_i3c_ibi_read(ra8_i3c_ibi_t *out_ibi)
Drain one inbound IBI from NIBIQP (native mode).
Definition ra8_i3c.c:920
void(* ra8_i3c_event_fn_t)(void *ctx, uint32_t status)
Event callback fired by ra8_i3c_dispatch.
Definition ra8_i3c.h:123
ra8_i3c_hdr_mode_t
HDR transfer-mode selector for ra8_i3c_set_hdr_mode (native).
Definition ra8_i3c.h:185
@ k_ra8_i3c_hdr_mode_sdr
Plain SDR transfer (default).
Definition ra8_i3c.h:186
@ k_ra8_i3c_hdr_mode_ts
HDR-TS.
Definition ra8_i3c.h:188
@ k_ra8_i3c_hdr_mode_ddr
HDR-DDR.
Definition ra8_i3c.h:187
ra8_err_t ra8_i3c_recv_ccc(uint8_t ccc, uint8_t target_addr, uint8_t *buf, uint8_t max_len, uint8_t *got_len)
Generic CCC receive – directed read (native mode).
Definition ra8_i3c.c:593
ra8_err_t ra8_i3c_set_address(uint32_t addr)
Programme the primary dynamic address (native mode).
Definition ra8_i3c.c:372
ra8_err_t ra8_i3c_write(uint8_t channel, uint8_t addr, const uint8_t *data, uint32_t len, bool restart)
Write len bytes to addr.
Definition ra8_i3c.c:621
ra8_err_t ra8_i3c_ibi_drain(ra8_i3c_ibi_t *ibi)
Pop one inbound IBI (alias of ra8_i3c_ibi_read, native mode).
Definition ra8_i3c.c:888
ra8_err_t ra8_i3c_set_hdr_mode(uint8_t target_addr, ra8_i3c_hdr_mode_t mode)
Programme the NCMDQP transfer-mode field for a target (native mode).
Definition ra8_i3c.c:845
ra8_i3c_peripheral_status_t
Latched responder-mode event bits from ra8_i3c_peripheral_status.
Definition ra8_i3c.h:787
@ k_ra8_i3c_peripheral_status_rx_full
Receive buffer full.
Definition ra8_i3c.h:790
@ k_ra8_i3c_peripheral_status_idle
No latched event.
Definition ra8_i3c.h:788
@ k_ra8_i3c_peripheral_status_tx_empty
Transmit buffer empty.
Definition ra8_i3c.h:791
@ k_ra8_i3c_peripheral_status_aas
Address matched.
Definition ra8_i3c.h:789
@ k_ra8_i3c_peripheral_status_stop
STOP detected.
Definition ra8_i3c.h:792
@ k_ra8_i3c_peripheral_status_nack
NACK detected.
Definition ra8_i3c.h:793
ra8_err_t ra8_i3c_get_errors(uint8_t channel, uint8_t *out_mask)
Read the latched I2C error mask (I2C mode).
Definition ra8_i3c.c:740
ra8_err_t ra8_i3c_peripheral_open(uint8_t channel, const ra8_i3c_peripheral_cfg_t *cfg)
Open a channel in I2C-compat responder mode.
Definition ra8_i3c.c:778
ra8_err_t ra8_i3c_clear_errors(uint8_t channel)
Clear latched I2C error bits (I2C mode).
Definition ra8_i3c.c:751
ra8_err_t ra8_i3c_reset_dynamic_addresses(void)
Issue RSTDAA to clear all dynamic addresses (native mode).
Definition ra8_i3c.c:539
ra8_err_t ra8_i3c_init(uint8_t channel, const ra8_i3c_cfg_t *cfg)
Initialise an I3C channel in the configured mode.
Definition ra8_i3c.c:311
ra8_err_t ra8_i3c_peripheral_close(uint8_t channel)
Close responder mode on a channel.
Definition ra8_i3c.c:796
ra8_err_t ra8_i3c_set_clock(uint8_t channel, uint32_t bus_hz, uint32_t pclka_hz)
Re-programme the I2C bit rate (I2C mode).
Definition ra8_i3c.c:718
Per-channel bring-up configuration for ra8_i3c_init.
Definition ra8_i3c.h:90
uint32_t bus_hz
Target bus clock in Hz (I2C mode).
Definition ra8_i3c.h:92
ra8_i3c_mode_t mode
Operating mode for this channel.
Definition ra8_i3c.h:91
uint32_t pclka_hz
Source clock for the bit-rate calc (I2C).
Definition ra8_i3c.h:93
One target entry filled in by ENTDAA (native mode).
Definition ra8_i3c.h:137
uint8_t pid[6]
48-bit Provisional ID (BE order).
Definition ra8_i3c.h:138
uint8_t bcr
Bus Characteristic Register byte.
Definition ra8_i3c.h:139
uint8_t dcr
Device Characteristic Register byte.
Definition ra8_i3c.h:140
uint8_t dynamic_address
Address assigned to this target.
Definition ra8_i3c.h:141
Decoded IBI inbound descriptor (native mode).
Definition ra8_i3c.h:169
uint8_t payload[8]
Up to 8 bytes of payload.
Definition ra8_i3c.h:173
uint8_t payload_len
Bytes that follow in payload[].
Definition ra8_i3c.h:172
ra8_i3c_ibi_type_t type
IBI / HJ / MR classification.
Definition ra8_i3c.h:171
uint8_t address
Originating dynamic address.
Definition ra8_i3c.h:170
uint8_t last
1 if this is the final fragment.
Definition ra8_i3c.h:174
Bring-up configuration for I2C-compat responder mode.
Definition ra8_i3c.h:774
uint8_t peripheral_addr_7b
7-bit own address.
Definition ra8_i3c.h:775
uint8_t general_call
Non-zero -> answer general-call address.
Definition ra8_i3c.h:776