14#ifndef ZEPHYR_INCLUDE_DRIVERS_I3C_H_
15#define ZEPHYR_INCLUDE_DRIVERS_I3C_H_
49#define I3C_OD_TLOW_MIN_NS 200
50#define I3C_OD_MIXED_BUS_THIGH_MAX_NS 41
51#define I3C_OD_FIRST_BC_THIGH_MIN_NS 200
100#define I3C_BCR_MAX_DATA_SPEED_LIMIT BIT(0)
103#define I3C_BCR_IBI_REQUEST_CAPABLE BIT(1)
112#define I3C_BCR_IBI_PAYLOAD_HAS_DATA_BYTE BIT(2)
120#define I3C_BCR_OFFLINE_CAPABLE BIT(3)
128#define I3C_BCR_VIRTUAL_TARGET BIT(4)
137#define I3C_BCR_ADV_CAPABILITIES BIT(5)
140#define I3C_BCR_DEVICE_ROLE_I3C_TARGET 0U
143#define I3C_BCR_DEVICE_ROLE_I3C_CONTROLLER_CAPABLE 1U
146#define I3C_BCR_DEVICE_ROLE_MASK GENMASK(7U, 6U)
155#define I3C_BCR_DEVICE_ROLE(bcr) \
156 FIELD_GET(I3C_BCR_DEVICE_ROLE_MASK, (bcr))
181#define I3C_LVR_I2C_FM_PLUS_MODE 0
184#define I3C_LVR_I2C_FM_MODE 1
187#define I3C_LVR_I2C_MODE_MASK BIT(4)
196#define I3C_LVR_I2C_MODE(lvr) \
197 FIELD_GET(I3C_LVR_I2C_MODE_MASK, (lvr))
205#define I3C_LVR_I2C_DEV_IDX_0 0
213#define I3C_LVR_I2C_DEV_IDX_1 1
221#define I3C_LVR_I2C_DEV_IDX_2 2
224#define I3C_LVR_I2C_DEV_IDX_MASK GENMASK(7U, 5U)
233#define I3C_LVR_I2C_DEV_IDX(lvr) \
234 FIELD_GET(I3C_LVR_I2C_DEV_IDX_MASK, (lvr))
321#define I3C_MSG_WRITE (0U << 0U)
324#define I3C_MSG_READ BIT(0)
327#define I3C_MSG_RW_MASK BIT(0)
331#define I3C_MSG_STOP BIT(1)
342#define I3C_MSG_RESTART BIT(2)
345#define I3C_MSG_HDR BIT(3)
348#define I3C_MSG_NBCH BIT(4)
351#define I3C_MSG_HDR_MODE0 BIT(0)
354#define I3C_MSG_HDR_MODE1 BIT(1)
357#define I3C_MSG_HDR_MODE2 BIT(2)
360#define I3C_MSG_HDR_MODE3 BIT(3)
363#define I3C_MSG_HDR_MODE4 BIT(4)
366#define I3C_MSG_HDR_MODE5 BIT(5)
369#define I3C_MSG_HDR_MODE6 BIT(6)
372#define I3C_MSG_HDR_MODE7 BIT(7)
375#define I3C_MSG_HDR_DDR I3C_MSG_HDR_MODE0
378#define I3C_MSG_HDR_TSP I3C_MSG_HDR_MODE1
381#define I3C_MSG_HDR_TSL I3C_MSG_HDR_MODE2
384#define I3C_MSG_HDR_BT I3C_MSG_HDR_MODE3
547__subsystem
struct i3c_driver_api {
557 struct i2c_driver_api i2c_api;
571 int (*configure)(
const struct device *dev,
586 int (*config_get)(
const struct device *dev,
588#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
600 int (*recover_bus)(
const struct device *dev);
614 int (*attach_i3c_device)(
const struct device *dev,
630 int (*reattach_i3c_device)(
const struct device *dev,
646 int (*detach_i3c_device)(
const struct device *dev,
661 int (*attach_i2c_device)(
const struct device *dev,
676 int (*detach_i2c_device)(
const struct device *dev,
690 int (*do_daa)(
const struct device *dev);
704 int (*do_ccc)(
const struct device *dev,
719 int (*i3c_xfers)(
const struct device *dev,
723#if defined(CONFIG_I3C_CALLBACK) || defined(__DOXYGEN__)
738 int (*do_ccc_cb)(
const struct device *dev,
757 int (*i3c_xfers_cb)(
const struct device *dev,
780#ifdef CONFIG_I3C_USE_IBI
781#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
794 int (*ibi_raise)(
const struct device *dev,
797#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
808 int (*ibi_hj_response)(
const struct device *dev,
836 int (*ibi_enable)(
const struct device *dev,
851 int (*ibi_disable)(
const struct device *dev,
855#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
871 int (*target_register)(
const struct device *dev,
889 int (*target_unregister)(
const struct device *dev,
908 int (*target_tx_write)(
const struct device *dev,
926 int (*target_controller_handoff)(
const struct device *dev,
929#if defined(CONFIG_I3C_RTIO) || defined(__DOXYGEN__)
940 void (*iodev_submit)(
const struct device *dev,
967#define I3C_DEVICE_ID(pid) \
1166 void *controller_priv;
1169#if defined(CONFIG_I3C_USE_IBI) || defined(__DOXYGEN__)
1210 void *controller_priv;
1280#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
1289#elif defined(CONFIG_CPP)
1291 uint8_t unused_cpp_size_compatibility;
1295#if defined(CONFIG_CPP)
1306#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
1309#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
1318#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
1326#define I3C_BUS_FOR_EACH_I3CDEV(bus, desc) \
1327 SYS_SLIST_FOR_EACH_CONTAINER( \
1328 &((struct i3c_driver_data *)(bus->data))->attached_dev.devices.i3c, desc, node)
1337#define I3C_BUS_FOR_EACH_I2CDEV(bus, desc) \
1338 SYS_SLIST_FOR_EACH_CONTAINER( \
1339 &((struct i3c_driver_data *)(bus->data))->attached_dev.devices.i2c, desc, node)
1349#define I3C_BUS_FOR_EACH_I3CDEV_SAFE(bus, desc, desc_s) \
1350 SYS_SLIST_FOR_EACH_CONTAINER_SAFE( \
1351 &((struct i3c_driver_data *)(bus->data))->attached_dev.devices.i3c, desc, desc_s, \
1362#define I3C_BUS_FOR_EACH_I2CDEV_SAFE(bus, desc, desc_s) \
1363 SYS_SLIST_FOR_EACH_CONTAINER_SAFE( \
1364 &((struct i3c_driver_data *)(bus->data))->attached_dev.devices.i2c, desc, desc_s, \
1503 if (api->configure ==
NULL) {
1507 return api->configure(dev, type, config);
1509#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
1531#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
1578 if (api->config_get ==
NULL) {
1582 return api->config_get(dev, type, config);
1584#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
1606#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
1628#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
1643 if (api->recover_bus ==
NULL) {
1647 return api->recover_bus(dev);
1734 if (desc == target) {
1796 if (desc == target) {
1830 if (api->do_daa ==
NULL) {
1834 return api->do_daa(dev);
1853static inline int z_impl_i3c_do_ccc(
const struct device *dev,
1858 if (api->do_ccc ==
NULL) {
1862 return api->do_ccc(dev, payload);
1865#if defined(CONFIG_I3C_CALLBACK) || defined(__DOXYGEN__)
1891static inline int z_impl_i3c_do_ccc_cb(
const struct device *dev,
1896 const struct i3c_driver_api *api =
1897 (
const struct i3c_driver_api *)dev->
api;
1899 if (api->do_ccc_cb ==
NULL) {
1903 return api->do_ccc_cb(dev, payload, cb, userdata);
1947#if defined(CONFIG_I3C_CALLBACK) || defined(__DOXYGEN__)
1982static inline int z_impl_i3c_transfer_cb(
struct i3c_device_desc *target,
1988 const struct i3c_driver_api *api = (
const struct i3c_driver_api *)target->
bus->
api;
1990 if (api->i3c_xfers_cb ==
NULL) {
1994 return api->i3c_xfers_cb(target->
bus, target, msgs, num_msgs, cb, userdata);
2020 if (api->i3c_device_find ==
NULL) {
2024 return api->i3c_device_find(dev,
id);
2027#if defined(CONFIG_I3C_USE_IBI) || defined(__DOXYGEN__)
2033#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
2051 if (api->ibi_hj_response ==
NULL) {
2055 return api->ibi_hj_response(dev, ack);
2073 const struct i3c_driver_api *api =
2074 (
const struct i3c_driver_api *)target->
bus->
api;
2076 if (api->ibi_crr_response ==
NULL) {
2080 return api->ibi_crr_response(target, ack);
2083#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
2100 if (api->ibi_raise ==
NULL) {
2104 return api->ibi_raise(dev, request);
2107#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
2126 if (api->ibi_enable ==
NULL) {
2130 return api->ibi_enable(target->
bus, target);
2149 if (api->ibi_disable ==
NULL) {
2153 return api->ibi_disable(target->
bus, target);
2209#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
2234 msg.
len = num_bytes;
2261 msg.
len = num_bytes;
2287 const void *write_buf,
size_t num_write,
2288 void *read_buf,
size_t num_read)
2293 msg[0].
len = num_write;
2299 msg[1].
len = num_read;
2330 &start_addr,
sizeof(start_addr),
2361 msg[0].
buf = &start_addr;
2368 msg[1].
len = num_bytes;
2394 ®_addr,
sizeof(reg_addr),
2395 value,
sizeof(*value));
2418 uint8_t tx_buf[2] = {reg_addr, value};
2453 new_value = (old_value & ~mask) | (value & mask);
2454 if (new_value == old_value) {
2775#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
2830#if defined(CONFIG_I3C_USE_IBI) || defined(__DOXYGEN__)
2831#if (defined(CONFIG_I3C_CONTROLLER) && defined(CONFIG_I3C_TARGET)) || defined(__DOXYGEN__)
2847#if (defined(CONFIG_I3C_NUM_OF_DESC_MEM_SLABS) && CONFIG_I3C_NUM_OF_DESC_MEM_SLABS > 0) || \
2848 defined(__DOXYGEN__)
2900#if (defined(CONFIG_I3C_I2C_NUM_OF_DESC_MEM_SLABS) && CONFIG_I3C_I2C_NUM_OF_DESC_MEM_SLABS > 0) || \
2901 defined(__DOXYGEN__)
2953#if defined(CONFIG_I3C_RTIO) || defined(__DOXYGEN__)
2984 if (api->iodev_submit ==
NULL) {
2988 api->iodev_submit(data->
bus, iodev_sqe);
3002#define I3C_DT_IODEV_DEFINE(name, node_id) \
3003 const struct i3c_iodev_data _i3c_iodev_data_##name = { \
3004 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
3005 .dev_id = I3C_DEVICE_ID_DT(node_id), \
3007 RTIO_IODEV_DEFINE(name, &i3c_iodev_api, (void *)&_i3c_iodev_data_##name)
3018#define I3C_DT_INST_IODEV_DEFINE(name, inst) \
3019 I3C_DT_IODEV_DEFINE(name, DT_DRV_INST(inst))
3039#if defined(CONFIG_I3C_TARGET) || defined(__DOXYGEN__)
3048#if defined(CONFIG_I3C_CONTROLLER) || defined(__DOXYGEN__)
3063#include <zephyr/syscalls/i3c.h>
workaround assembler barfing for ST r
Definition asm-macro-32-bit-gnu.h:24
#define DEVICE_API_EXTENDS(_child, _parent, _member)
Declare that API class _child is an extension of device API class _parent.
Definition device.h:1390
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1425
Main header file for I2C (Inter-Integrated Circuit) driver API.
i3c_sdr_controller_error_types
I3C SDR Controller Error Types.
Definition error_types.h:24
static int i3c_ibi_disable(struct i3c_device_desc *target)
Disable IBI of a target device.
Definition i3c.h:2145
static int i3c_ibi_has_payload(struct i3c_device_desc *target)
Check if target's IBI has payload.
Definition i3c.h:2168
static int i3c_ibi_crr_response(struct i3c_device_desc *target, bool ack)
ACK or NACK IBI Controller Role Requests.
Definition i3c.h:2070
static int i3c_ibi_raise(const struct device *dev, struct i3c_ibi *request)
Raise an In-Band Interrupt (IBI).
Definition i3c.h:2095
static int i3c_device_is_controller_capable(struct i3c_device_desc *target)
Check if the target is controller capable.
Definition i3c.h:2202
static int i3c_device_is_ibi_capable(struct i3c_device_desc *target)
Check if device is IBI capable.
Definition i3c.h:2185
static int i3c_ibi_enable(struct i3c_device_desc *target)
Enable IBI of a target device.
Definition i3c.h:2122
int(* i3c_target_ibi_cb_t)(struct i3c_device_desc *target, struct i3c_ibi_payload *payload)
Function called when In-Band Interrupt received from target device.
Definition ibi.h:146
static int i3c_ibi_hj_response(const struct device *dev, bool ack)
ACK or NACK IBI HJ Requests.
Definition i3c.h:2046
int i3c_attach_i3c_device(struct i3c_device_desc *target)
Attach an I3C device.
#define I3C_BCR_IBI_REQUEST_CAPABLE
IBI Request Capable bit.
Definition i3c.h:103
#define I3C_BCR_DEVICE_ROLE_I3C_CONTROLLER_CAPABLE
Device Role - I3C Controller Capable.
Definition i3c.h:143
struct i3c_device_desc * i3c_dev_list_i3c_addr_find(const struct device *dev, uint8_t addr)
Find a I3C target device descriptor by dynamic address.
static struct i3c_device_desc * i3c_device_find(const struct device *dev, const struct i3c_device_id *id)
Find a registered I3C target device.
Definition i3c.h:2015
int i3c_bus_getpid(struct i3c_device_desc *desc)
Retrieve the Provisional ID (PID) of a device.
bool i3c_bus_has_sec_controller(const struct device *dev)
Check if the bus has a secondary controller.
int i3c_bus_rstdaa_all(const struct device *dev)
Reset all devices on the bus and clear their dynamic addresses.
struct i3c_i2c_device_desc * i3c_i2c_device_desc_alloc(void)
Allocate memory for a i3c i2c device descriptor.
void i3c_sec_handoffed(struct k_work *work)
Call back for when Controllership is Handoffed to itself.
void i3c_device_desc_free(struct i3c_device_desc *desc)
Free memory from a i3c device descriptor.
int i3c_bus_setmrl_all(const struct device *dev, uint16_t mrl, uint8_t ibi_len, bool has_ibi_size)
Set the Maximum Read Length (MRL) for all devices on the bus.
int i3c_bus_setdasa(struct i3c_device_desc *desc, uint8_t dynamic_addr)
Assign a dynamic address to a device using its static address.
static int i3c_configure(const struct device *dev, enum i3c_config_type type, void *config)
Configure the I3C hardware.
Definition i3c.h:1498
static int i3c_device_info_get(struct i3c_device_desc *target)
Get all information from device and update device descriptor.
Definition i3c.h:2572
int i3c_dev_list_daa_addr_helper(struct i3c_addr_slots *addr_slots, const struct i3c_dev_list *dev_list, uint64_t pid, bool must_match, bool assigned_okay, struct i3c_device_desc **target, uint8_t *addr)
Helper function to find a usable address during ENTDAA.
static void i3c_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
Submit request(s) to an I3C device with RTIO.
Definition i3c.h:2978
#define I3C_BUS_FOR_EACH_I3CDEV(bus, desc)
iterate over all I3C devices present on the bus
Definition i3c.h:1326
#define I3C_BUS_FOR_EACH_I2CDEV(bus, desc)
iterate over all I2C devices present on the bus
Definition i3c.h:1337
static bool i3c_is_i2c_device_attached(struct i3c_i2c_device_desc *target)
Check if an I2C device is attached to the bus.
Definition i3c.h:1791
int i3c_device_adv_info_get(struct i3c_device_desc *target)
Get advanced information from device and update device descriptor.
int i3c_bus_getmrl(struct i3c_device_desc *desc)
Retrieve the Maximum Read Length (MRL) of a device.
int i3c_bus_deftgts(const struct device *dev)
Send the CCC DEFTGTS.
int i3c_bus_setnewda(struct i3c_device_desc *desc, uint8_t dynamic_addr)
Assign a new dynamic address to a device.
i3c_config_type
Type of configuration being passed to configure function.
Definition i3c.h:451
int i3c_attach_i2c_device(struct i3c_i2c_device_desc *target)
Attach an I2C device.
void i3c_i2c_device_desc_free(struct i3c_i2c_device_desc *desc)
Free memory from a i3c i2c device descriptor.
i3c_i2c_speed_type
I2C bus speed under I3C bus.
Definition i3c.h:274
int i3c_detach_i3c_device(struct i3c_device_desc *target)
Detach I3C Device.
int i3c_bus_setmrl(struct i3c_device_desc *desc, uint16_t mrl, uint8_t ibi_len)
Set the Maximum Read Length (MRL) for a device.
int i3c_do_ccc_cb(const struct device *dev, struct i3c_ccc_payload *payload, i3c_callback_t cb, void *userdata)
Send an async CCC to the bus with a callback.
i3c_bus_mode
I3C bus mode.
Definition i3c.h:241
static int i3c_recover_bus(const struct device *dev)
Attempt bus recovery on the I3C bus.
Definition i3c.h:1639
static int i3c_configure_target(const struct device *dev, struct i3c_config_target *config)
Get the target device configuration for an I3C device.
Definition i3c.h:1547
int i3c_bus_setmwl(struct i3c_device_desc *desc, uint16_t mwl)
Set the Maximum Write Length (MWL) for a device.
static int i3c_config_get(const struct device *dev, enum i3c_config_type type, void *config)
Get configuration of the I3C hardware.
Definition i3c.h:1573
int i3c_bus_getacccr(struct i3c_device_desc *desc)
Retrieve the Active Controller's Dynamic Address (ACCCR).
int i3c_bus_getmwl(struct i3c_device_desc *desc)
Retrieve the Maximum Write Length (MWL) of a device.
int i3c_detach_i2c_device(struct i3c_i2c_device_desc *target)
Detach I2C Device.
static int i3c_config_get_target(const struct device *dev, struct i3c_config_target *config)
Get the target device configuration for an I3C device.
Definition i3c.h:1622
#define I3C_BCR_DEVICE_ROLE(bcr)
Device Role.
Definition i3c.h:155
void i3c_iodev_submit_fallback(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe)
Fallback submit implementation.
static int i3c_config_get_controller(const struct device *dev, struct i3c_config_controller *config)
Get the controller device configuration for an I3C device.
Definition i3c.h:1600
struct i3c_device_desc * i3c_dev_list_find(const struct i3c_dev_list *dev_list, const struct i3c_device_id *id)
Find a I3C target device descriptor by ID.
int i3c_bus_init(const struct device *dev, const struct i3c_dev_list *i3c_dev_list)
Generic helper function to perform bus initialization.
int i3c_do_ccc(const struct device *dev, struct i3c_ccc_payload *payload)
Send CCC to the bus.
int i3c_bus_getdcr(struct i3c_device_desc *desc)
Retrieve the Device Characteristics Register (DCR) of a device.
int i3c_device_basic_info_get(struct i3c_device_desc *target)
Get basic information from device and update device descriptor.
uint8_t i3c_odd_parity(uint8_t p)
Calculate odd parity.
struct rtio_sqe * i3c_rtio_copy(struct rtio *r, struct rtio_iodev *iodev, const struct i3c_msg *msgs, uint8_t num_msgs)
Copy the i3c_msgs into a set of RTIO requests.
int i3c_bus_setaasa(const struct device *dev)
Assign static addresses as dynamic addresses for all devices on the bus.
struct i3c_device_desc * i3c_device_desc_alloc(void)
Allocate memory for a i3c device descriptor.
static int i3c_do_daa(const struct device *dev)
Perform Dynamic Address Assignment on the I3C bus.
Definition i3c.h:1826
bool i3c_i2c_device_desc_in_pool(struct i3c_i2c_device_desc *desc)
Report if the i3c i2c device descriptor was from a mem slab.
static bool i3c_is_i3c_device_attached(struct i3c_device_desc *target)
Check if an I3C device is attached to the bus.
Definition i3c.h:1729
void(* i3c_callback_t)(const struct device *dev, int result, void *data)
I3C callback for asynchronous transfer requests.
Definition i3c.h:533
int i3c_bus_getbcr(struct i3c_device_desc *desc)
Retrieve the Bus Characteristics Register (BCR) of a device.
const struct rtio_iodev_api i3c_iodev_api
int i3c_bus_setmwl_all(const struct device *dev, uint16_t mwl)
Set the Maximum Write Length (MWL) for all devices on the bus.
#define I3C_BCR_IBI_PAYLOAD_HAS_DATA_BYTE
IBI Payload bit.
Definition i3c.h:112
int i3c_reattach_i3c_device(struct i3c_device_desc *target, uint8_t old_dyn_addr)
Reattach I3C device.
i3c_data_rate
I3C data rate.
Definition i3c.h:290
static int i3c_configure_controller(const struct device *dev, struct i3c_config_controller *config)
Get the controller device configuration for an I3C device.
Definition i3c.h:1525
struct i3c_device_desc * i3c_dev_list_i3c_static_addr_find(const struct device *dev, uint8_t addr)
Find a I3C target device descriptor by static address.
int i3c_device_controller_handoff(struct i3c_device_desc *target, bool requested)
Perform Controller Handoff.
bool i3c_device_desc_in_pool(struct i3c_device_desc *desc)
Report if the i3c device descriptor was from a mem slab.
struct i3c_i2c_device_desc * i3c_dev_list_i2c_addr_find(const struct device *dev, uint16_t addr)
Find a I2C target device descriptor by address.
@ I3C_CONFIG_TARGET
Definition i3c.h:453
@ I3C_CONFIG_CUSTOM
Definition i3c.h:454
@ I3C_CONFIG_CONTROLLER
Definition i3c.h:452
@ I3C_I2C_SPEED_INVALID
Definition i3c.h:282
@ I3C_I2C_SPEED_MAX
Definition i3c.h:281
@ I3C_I2C_SPEED_FMPLUS
I2C FM+ mode.
Definition i3c.h:279
@ I3C_I2C_SPEED_FM
I2C FM mode.
Definition i3c.h:276
@ I3C_BUS_MODE_INVALID
Definition i3c.h:266
@ I3C_BUS_MODE_PURE
Only I3C devices are on the bus.
Definition i3c.h:243
@ I3C_BUS_MODE_MIXED_FAST
Both I3C and legacy I2C devices are on the bus.
Definition i3c.h:249
@ I3C_BUS_MODE_MAX
Definition i3c.h:265
@ I3C_BUS_MODE_MIXED_LIMITED
Both I3C and legacy I2C devices are on the bus.
Definition i3c.h:256
@ I3C_BUS_MODE_MIXED_SLOW
Both I3C and legacy I2C devices are on the bus.
Definition i3c.h:263
@ I3C_DATA_RATE_MAX
Definition i3c.h:306
@ I3C_DATA_RATE_INVALID
Definition i3c.h:307
@ I3C_DATA_RATE_HDR_TSP
High Data Rate - Ternary Symbol for Pure Bus.
Definition i3c.h:301
@ I3C_DATA_RATE_HDR_DDR
High Data Rate - Double Data Rate messaging.
Definition i3c.h:295
@ I3C_DATA_RATE_SDR
Single Data Rate messaging.
Definition i3c.h:292
@ I3C_DATA_RATE_HDR_TSL
High Data Rate - Ternary Symbol Legacy-inclusive-Bus.
Definition i3c.h:298
@ I3C_DATA_RATE_HDR_BT
High Data Rate - Bulk Transport.
Definition i3c.h:304
int i3c_transfer(struct i3c_device_desc *target, struct i3c_msg *msgs, uint8_t num_msgs)
Perform data transfer from the controller to a I3C target device.
#define I3C_MSG_STOP
Send STOP after this message.
Definition i3c.h:331
int i3c_transfer_cb(struct i3c_device_desc *target, struct i3c_msg *msgs, uint8_t num_msgs, i3c_callback_t cb, void *userdata)
Perform an async data transfer from the controller to a I3C target device with a callback.
static int i3c_write_read(struct i3c_device_desc *target, const void *write_buf, size_t num_write, void *read_buf, size_t num_read)
Write then read data from an I3C target device.
Definition i3c.h:2286
static int i3c_burst_read(struct i3c_device_desc *target, uint8_t start_addr, uint8_t *buf, uint32_t num_bytes)
Read multiple bytes from an internal address of an I3C target device.
Definition i3c.h:2324
static int i3c_reg_update_byte(struct i3c_device_desc *target, uint8_t reg_addr, uint8_t mask, uint8_t value)
Update internal register of an I3C target device.
Definition i3c.h:2441
void i3c_dump_msgs(const char *name, const struct i3c_msg *msgs, uint8_t num_msgs, struct i3c_device_desc *target)
Dump out an I3C message.
#define I3C_MSG_READ
Read message from I3C bus.
Definition i3c.h:324
#define I3C_MSG_WRITE
Write message to I3C bus.
Definition i3c.h:321
static int i3c_reg_read_byte(struct i3c_device_desc *target, uint8_t reg_addr, uint8_t *value)
Read internal register of an I3C target device.
Definition i3c.h:2390
static int i3c_write(struct i3c_device_desc *target, const uint8_t *buf, uint32_t num_bytes)
Write a set amount of data to an I3C target device.
Definition i3c.h:2228
static int i3c_read(struct i3c_device_desc *target, uint8_t *buf, uint32_t num_bytes)
Read a set amount of data from an I3C target device.
Definition i3c.h:2255
#define I3C_MSG_RESTART
RESTART I3C transaction for this message.
Definition i3c.h:342
static int i3c_burst_write(struct i3c_device_desc *target, uint8_t start_addr, const uint8_t *buf, uint32_t num_bytes)
Write multiple bytes to an internal address of an I3C target device.
Definition i3c.h:2354
static int i3c_reg_write_byte(struct i3c_device_desc *target, uint8_t reg_addr, uint8_t value)
Write internal register of an I3C target device.
Definition i3c.h:2415
static void rtio_iodev_sqe_err(struct rtio_iodev_sqe *iodev_sqe, int result)
Inform the executor of a submissions completion with error.
Definition rtio.h:674
struct _slist sys_slist_t
Single-linked list structure.
Definition slist.h:49
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen)
Real-Time IO device API for moving bytes with low effort.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
void * data
Address of the device instance private data.
Definition device.h:523
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:519
Structure to keep track of addresses on I3C bus.
Definition addresses.h:58
Payload for DEFTGTS CCC (Define List of Targets).
Definition ccc.h:477
Payload structure for one CCC transaction.
Definition ccc.h:283
Configuration parameters for I3C hardware to act as controller.
Definition i3c.h:460
uint32_t i3c
SCL frequency (in Hz) for I3C transfers.
Definition i3c.h:469
struct i3c_config_controller::@056312167321110215131324331046307064213325032241 scl
uint8_t supported_hdr
Bit mask of supported HDR modes (0 - 7).
Definition i3c.h:497
bool is_secondary
True if the controller is to be the secondary controller of the bus.
Definition i3c.h:465
uint32_t i2c
SCL frequency (in Hz) for I2C transfers.
Definition i3c.h:472
uint32_t low_ns
Requested minimum SCL Open-Drain LOW period in nanoseconds.
Definition i3c.h:488
struct i3c_config_controller::@014133034363263145217364064144071146332207047032 scl_od_min
uint32_t high_ns
Requested minimum SCL Open Drain High period in Nanoseconds.
Definition i3c.h:483
Custom I3C configuration parameters.
Definition i3c.h:508
void * ptr
Pointer to configuration parameter.
Definition i3c.h:522
uint32_t id
ID of the configuration parameter.
Definition i3c.h:510
uintptr_t val
Value of configuration parameter.
Definition i3c.h:514
Configuration parameters for I3C hardware to act as target device.
Definition target_device.h:36
Structure for describing attached devices for a controller.
Definition i3c.h:1222
sys_slist_t i3c
Linked list of attached I3C devices.
Definition i3c.h:1235
sys_slist_t i2c
Linked list of attached I2C devices.
Definition i3c.h:1240
struct i3c_addr_slots addr_slots
Address slots:
Definition i3c.h:1229
struct i3c_dev_attached_list::@246250351113353101101072335153134170037123023325 devices
Structure for describing known devices for a controller.
Definition i3c.h:1252
struct i3c_i2c_device_desc *const i2c
Pointer to array of known I2C devices.
Definition i3c.h:1261
const uint8_t num_i3c
Number of I3C devices in array.
Definition i3c.h:1266
struct i3c_device_desc *const i3c
Pointer to array of known I3C devices.
Definition i3c.h:1256
const uint8_t num_i2c
Number of I2C devices in array.
Definition i3c.h:1271
Structure describing a I3C target device.
Definition i3c.h:988
uint8_t maxwr
Maximum Write Speed.
Definition i3c.h:1068
const uint8_t init_dynamic_addr
Initial dynamic address.
Definition i3c.h:1023
uint8_t getcap1
I3C v1.1+ GETCAPS1 (I3C_CCC_GETCAPS1_*).
Definition i3c.h:1108
uint8_t static_addr
Static address for this target device.
Definition i3c.h:1012
uint8_t getcap2
GETCAPS2 (I3C_CCC_GETCAPS2_*).
Definition i3c.h:1118
uint8_t crcaps2
CRCAPS2.
Definition i3c.h:1159
uint32_t max_read_turnaround
Maximum Read turnaround time in microseconds.
Definition i3c.h:1071
uint8_t getcap4
GETCAPS4.
Definition i3c.h:1137
uint64_t pid
Device Provisioned ID.
Definition i3c.h:998
uint8_t max_ibi
Maximum IBI Payload Size.
Definition i3c.h:1082
i3c_target_ibi_cb_t ibi_cb
In-Band Interrupt (IBI) callback.
Definition i3c.h:1174
uint16_t mwl
Maximum Write Length.
Definition i3c.h:1079
struct i3c_device_desc::@360344216022242204075200247271252277022102350070 data_length
struct i3c_device_desc::@344113175167251206324273037027234367204265164265 data_speed
uint8_t crhdly1
Controller Handoff Delay Parameters.
Definition i3c.h:1086
struct i3c_device_desc::@374345307316312053174345252357015060335301342357 crcaps
uint8_t getcap3
GETCAPS3 (I3C_CCC_GETCAPS3_*).
Definition i3c.h:1131
uint8_t dynamic_addr
Dynamic Address for this target device used for communication.
Definition i3c.h:1047
uint8_t crcaps1
CRCAPS1.
Definition i3c.h:1149
const uint8_t flags
Device Flags.
Definition i3c.h:1032
sys_snode_t node
Definition i3c.h:989
const struct device * bus
I3C bus to which this target device is attached.
Definition i3c.h:992
uint16_t mrl
Maximum Read Length.
Definition i3c.h:1076
uint8_t maxrd
Maximum Read Speed.
Definition i3c.h:1065
uint8_t gethdrcap
I3C v1.0 HDR Capabilities (I3C_CCC_GETCAPS1_*).
Definition i3c.h:1098
uint8_t bcr
Bus Characteristic Register (BCR).
Definition i3c.h:1053
uint8_t dcr
Device Characteristic Register (DCR).
Definition i3c.h:1061
const struct device * dev
Device driver instance of the I3C device.
Definition i3c.h:995
struct i3c_device_desc::@177062035045125233337330056025025373240362240253 getcaps
Describes advanced (Target) capabilities and features.
Structure used for matching I3C devices.
Definition i3c.h:954
uint64_t pid
Device Provisioned ID.
Definition i3c.h:956
This structure is common to all I3C drivers and is expected to be the first element in the object poi...
Definition i3c.h:1279
uint8_t primary_controller_da
I3C Primary Controller Dynamic Address.
Definition i3c.h:1285
uint8_t flags
Driver config flags.
Definition i3c.h:1288
struct i3c_dev_list dev_list
I3C/I2C device list struct.
Definition i3c.h:1282
This structure is common to all I3C drivers and is expected to be the first element in the driver's s...
Definition i3c.h:1303
struct i3c_config_controller ctrl_config
Controller Configuration.
Definition i3c.h:1305
struct i3c_ccc_deftgts * deftgts
Received DEFTGTS Pointer.
Definition i3c.h:1311
bool deftgts_refreshed
DEFTGTS refreshed.
Definition i3c.h:1314
struct i3c_dev_attached_list attached_dev
Attached I3C/I2C devices and addresses.
Definition i3c.h:1308
Structure describing a I2C device on I3C bus.
Definition i3c.h:1191
const struct device * bus
I3C bus to which this I2C device is attached.
Definition i3c.h:1195
uint8_t lvr
Legacy Virtual Register (LVR).
Definition i3c.h:1204
uint16_t addr
Static address for this I2C device.
Definition i3c.h:1198
sys_snode_t node
Definition i3c.h:1192
Struct for IBI request.
Definition ibi.h:58
const struct device * bus
Definition i3c.h:2956
const struct i3c_device_id dev_id
Definition i3c.h:2957
One I3C Message.
Definition i3c.h:407
uint8_t flags
Flags for this message.
Definition i3c.h:432
uint8_t hdr_mode
HDR mode (I3C_MSG_HDR_MODE*) for transfer if any I3C_MSG_HDR_* is set in flags.
Definition i3c.h:440
uint32_t num_xfer
Total number of bytes transferred.
Definition i3c.h:421
uint8_t * buf
Data buffer in bytes.
Definition i3c.h:409
uint8_t hdr_cmd_code
HDR command code field (7-bit) for HDR-DDR, HDR-TSP and HDR-TSL.
Definition i3c.h:443
uint32_t len
Length of buffer in bytes.
Definition i3c.h:412
enum i3c_sdr_controller_error_types err
SDR Error Type.
Definition i3c.h:429
Structure describing a device that supports the I3C target API.
Definition target_device.h:102
A structure used to submit work.
Definition kernel.h:4561
API that an RTIO IO device should implement.
Definition iodev.h:33
IO device submission queue entry.
Definition sqe.h:394
struct rtio_sqe sqe
Definition sqe.h:395
An IO device with a function table for submitting requests.
Definition iodev.h:48
void * data
Definition iodev.h:53
A submission queue event.
Definition sqe.h:304
const struct rtio_iodev * iodev
Device to operation on.
Definition sqe.h:313
An RTIO context containing what can be viewed as a pair of queues.
Definition rtio.h:71