Zephyr API 3.6.99
Loading...
Searching...
No Matches
i3c.h
Go to the documentation of this file.
1/*
2 * Copyright 2022 Intel Corporation
3 * Copyright 2023 Meta Platforms, Inc. and its affiliates
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8#ifndef ZEPHYR_INCLUDE_DRIVERS_I3C_H_
9#define ZEPHYR_INCLUDE_DRIVERS_I3C_H_
10
20#include <errno.h>
21#include <stdint.h>
22#include <stddef.h>
23
24#include <zephyr/device.h>
29#include <zephyr/drivers/i2c.h>
30#include <zephyr/sys/slist.h>
31#include <zephyr/sys/util.h>
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
84#define I3C_BCR_MAX_DATA_SPEED_LIMIT BIT(0)
85
87#define I3C_BCR_IBI_REQUEST_CAPABLE BIT(1)
88
96#define I3C_BCR_IBI_PAYLOAD_HAS_DATA_BYTE BIT(2)
97
104#define I3C_BCR_OFFLINE_CAPABLE BIT(3)
105
112#define I3C_BCR_VIRTUAL_TARGET BIT(4)
113
121#define I3C_BCR_ADV_CAPABILITIES BIT(5)
122
124#define I3C_BCR_DEVICE_ROLE_I3C_TARGET 0U
125
127#define I3C_BCR_DEVICE_ROLE_I3C_CONTROLLER_CAPABLE 1U
128
130#define I3C_BCR_DEVICE_ROLE_MASK GENMASK(7U, 6U)
131
139#define I3C_BCR_DEVICE_ROLE(bcr) \
140 FIELD_GET(I3C_BCR_DEVICE_ROLE_MASK, (bcr))
141
165#define I3C_LVR_I2C_FM_PLUS_MODE 0
166
168#define I3C_LVR_I2C_FM_MODE 1
169
171#define I3C_LVR_I2C_MODE_MASK BIT(4)
172
180#define I3C_LVR_I2C_MODE(lvr) \
181 FIELD_GET(I3C_LVR_I2C_MODE_MASK, (lvr))
182
189#define I3C_LVR_I2C_DEV_IDX_0 0
190
197#define I3C_LVR_I2C_DEV_IDX_1 1
198
205#define I3C_LVR_I2C_DEV_IDX_2 2
206
208#define I3C_LVR_I2C_DEV_IDX_MASK GENMASK(7U, 5U)
209
217#define I3C_LVR_I2C_DEV_IDX(lvr) \
218 FIELD_GET(I3C_LVR_I2C_DEV_IDX_MASK, (lvr))
219
252
268
293
326
374
381/*
382 * I3C_MSG_* are I3C Message flags.
383 */
384
386#define I3C_MSG_WRITE (0U << 0U)
387
389#define I3C_MSG_READ BIT(0)
390
392#define I3C_MSG_RW_MASK BIT(0)
396#define I3C_MSG_STOP BIT(1)
397
407#define I3C_MSG_RESTART BIT(2)
408
410#define I3C_MSG_HDR BIT(3)
411
413#define I3C_MSG_NBCH BIT(4)
414
416#define I3C_MSG_HDR_MODE0 BIT(0)
417
419#define I3C_MSG_HDR_MODE1 BIT(1)
420
422#define I3C_MSG_HDR_MODE2 BIT(2)
423
425#define I3C_MSG_HDR_MODE3 BIT(3)
426
428#define I3C_MSG_HDR_MODE4 BIT(4)
429
431#define I3C_MSG_HDR_MODE5 BIT(5)
432
434#define I3C_MSG_HDR_MODE6 BIT(6)
435
437#define I3C_MSG_HDR_MODE7 BIT(7)
438
440#define I3C_MSG_HDR_DDR I3C_MSG_HDR_MODE0
441
443#define I3C_MSG_HDR_TSP I3C_MSG_HDR_MODE1
444
446#define I3C_MSG_HDR_TSL I3C_MSG_HDR_MODE2
447
449#define I3C_MSG_HDR_BT I3C_MSG_HDR_MODE3
450
502
513
540
552
553 union {
556
563 void *ptr;
564 };
565};
566
573struct i3c_device_desc;
574struct i3c_device_id;
576struct i3c_target_config;
577
578__subsystem struct i3c_driver_api {
588 struct i2c_driver_api i2c_api;
589
602 int (*configure)(const struct device *dev,
603 enum i3c_config_type type, void *config);
604
617 int (*config_get)(const struct device *dev,
618 enum i3c_config_type type, void *config);
619
631 int (*recover_bus)(const struct device *dev);
632
646 int (*attach_i3c_device)(const struct device *dev,
647 struct i3c_device_desc *target,
648 uint8_t addr);
649
663 int (*reattach_i3c_device)(const struct device *dev,
664 struct i3c_device_desc *target,
665 uint8_t old_dyn_addr);
666
679 int (*detach_i3c_device)(const struct device *dev,
680 struct i3c_device_desc *target);
681
694 int (*attach_i2c_device)(const struct device *dev,
695 struct i3c_i2c_device_desc *target);
696
709 int (*detach_i2c_device)(const struct device *dev,
710 struct i3c_i2c_device_desc *target);
711
723 int (*do_daa)(const struct device *dev);
724
737 int (*do_ccc)(const struct device *dev,
738 struct i3c_ccc_payload *payload);
739
752 int (*i3c_xfers)(const struct device *dev,
753 struct i3c_device_desc *target,
754 struct i3c_msg *msgs,
755 uint8_t num_msgs);
756
770 struct i3c_device_desc *(*i3c_device_find)(const struct device *dev,
771 const struct i3c_device_id *id);
772
785 int (*ibi_raise)(const struct device *dev,
786 struct i3c_ibi *request);
787
800 int (*ibi_enable)(const struct device *dev,
801 struct i3c_device_desc *target);
802
815 int (*ibi_disable)(const struct device *dev,
816 struct i3c_device_desc *target);
817
833 int (*target_register)(const struct device *dev,
834 struct i3c_target_config *cfg);
835
851 int (*target_unregister)(const struct device *dev,
852 struct i3c_target_config *cfg);
853
870 int (*target_tx_write)(const struct device *dev,
871 uint8_t *buf, uint16_t len, uint8_t hdr_mode);
872};
873
883 const uint64_t pid:48;
884};
885
894#define I3C_DEVICE_ID(pid) \
895 { \
896 .pid = pid \
897 }
898
917
919 const struct device * const bus;
920
922 const struct device * const dev;
923
925 const uint64_t pid:48;
926
940
951
959
974
975#if defined(CONFIG_I3C_USE_GROUP_ADDR) || defined(__DOXYGEN__)
985#endif /* CONFIG_I3C_USE_GROUP_ADDR */
986
992
1000
1001 struct {
1004
1007
1011
1012 struct {
1015
1018
1022
1024 struct {
1025 union {
1034
1044 };
1045
1054
1067
1074
1079 void *controller_priv;
1082#if defined(CONFIG_I3C_USE_IBI) || defined(__DOXYGEN__)
1088#endif /* CONFIG_I3C_USE_IBI */
1089};
1090
1106
1108 const struct device *bus;
1109
1112
1118
1123 void *controller_priv;
1125};
1126
1156
1169 struct i3c_device_desc * const i3c;
1170
1174 struct i3c_i2c_device_desc * const i2c;
1175
1180
1185};
1186
1196
1208
1221struct i3c_device_desc *i3c_dev_list_find(const struct i3c_dev_list *dev_list,
1222 const struct i3c_device_id *id);
1223
1237 uint8_t addr);
1238
1252 uint16_t addr);
1253
1268
1321 const struct i3c_dev_list *dev_list,
1322 uint64_t pid, bool must_match,
1323 bool assigned_okay,
1324 struct i3c_device_desc **target,
1325 uint8_t *addr);
1326
1340static inline int i3c_configure(const struct device *dev,
1341 enum i3c_config_type type, void *config)
1342{
1343 const struct i3c_driver_api *api =
1344 (const struct i3c_driver_api *)dev->api;
1345
1346 if (api->configure == NULL) {
1347 return -ENOSYS;
1348 }
1349
1350 return api->configure(dev, type, config);
1351}
1352
1373static inline int i3c_config_get(const struct device *dev,
1374 enum i3c_config_type type, void *config)
1375{
1376 const struct i3c_driver_api *api =
1377 (const struct i3c_driver_api *)dev->api;
1378
1379 if (api->config_get == NULL) {
1380 return -ENOSYS;
1381 }
1382
1383 return api->config_get(dev, type, config);
1384}
1385
1396static inline int i3c_recover_bus(const struct device *dev)
1397{
1398 const struct i3c_driver_api *api =
1399 (const struct i3c_driver_api *)dev->api;
1400
1401 if (api->recover_bus == NULL) {
1402 return -ENOSYS;
1403 }
1404
1405 return api->recover_bus(dev);
1406}
1407
1428
1453int i3c_reattach_i3c_device(struct i3c_device_desc *target, uint8_t old_dyn_addr);
1454
1475
1495
1514
1538static inline int i3c_do_daa(const struct device *dev)
1539{
1540 const struct i3c_driver_api *api =
1541 (const struct i3c_driver_api *)dev->api;
1542
1543 if (api->do_daa == NULL) {
1544 return -ENOSYS;
1545 }
1546
1547 return api->do_daa(dev);
1548}
1549
1563__syscall int i3c_do_ccc(const struct device *dev,
1564 struct i3c_ccc_payload *payload);
1565
1566static inline int z_impl_i3c_do_ccc(const struct device *dev,
1567 struct i3c_ccc_payload *payload)
1568{
1569 const struct i3c_driver_api *api =
1570 (const struct i3c_driver_api *)dev->api;
1571
1572 if (api->do_ccc == NULL) {
1573 return -ENOSYS;
1574 }
1575
1576 return api->do_ccc(dev, payload);
1577}
1578
1610__syscall int i3c_transfer(struct i3c_device_desc *target,
1611 struct i3c_msg *msgs, uint8_t num_msgs);
1612
1613static inline int z_impl_i3c_transfer(struct i3c_device_desc *target,
1614 struct i3c_msg *msgs, uint8_t num_msgs)
1615{
1616 const struct i3c_driver_api *api =
1617 (const struct i3c_driver_api *)target->bus->api;
1618
1619 return api->i3c_xfers(target->bus, target, msgs, num_msgs);
1620}
1621
1638static inline
1640 const struct i3c_device_id *id)
1641{
1642 const struct i3c_driver_api *api =
1643 (const struct i3c_driver_api *)dev->api;
1644
1645 if (api->i3c_device_find == NULL) {
1646 return NULL;
1647 }
1648
1649 return api->i3c_device_find(dev, id);
1650}
1651
1668static inline int i3c_ibi_raise(const struct device *dev,
1669 struct i3c_ibi *request)
1670{
1671 const struct i3c_driver_api *api =
1672 (const struct i3c_driver_api *)dev->api;
1673
1674 if (api->ibi_raise == NULL) {
1675 return -ENOSYS;
1676 }
1677
1678 return api->ibi_raise(dev, request);
1679}
1680
1695static inline int i3c_ibi_enable(struct i3c_device_desc *target)
1696{
1697 const struct i3c_driver_api *api =
1698 (const struct i3c_driver_api *)target->bus->api;
1699
1700 if (api->ibi_enable == NULL) {
1701 return -ENOSYS;
1702 }
1703
1704 return api->ibi_enable(target->bus, target);
1705}
1706
1719static inline int i3c_ibi_disable(struct i3c_device_desc *target)
1720{
1721 const struct i3c_driver_api *api =
1722 (const struct i3c_driver_api *)target->bus->api;
1723
1724 if (api->ibi_disable == NULL) {
1725 return -ENOSYS;
1726 }
1727
1728 return api->ibi_disable(target->bus, target);
1729}
1730
1742static inline int i3c_ibi_has_payload(struct i3c_device_desc *target)
1743{
1744 return (target->bcr & I3C_BCR_IBI_PAYLOAD_HAS_DATA_BYTE)
1746}
1747
1759static inline int i3c_device_is_ibi_capable(struct i3c_device_desc *target)
1760{
1761 return (target->bcr & I3C_BCR_IBI_REQUEST_CAPABLE)
1763}
1764
1776static inline int i3c_device_is_controller_capable(struct i3c_device_desc *target)
1777{
1778 return I3C_BCR_DEVICE_ROLE(target->bcr)
1780}
1781
1802static inline int i3c_write(struct i3c_device_desc *target,
1803 const uint8_t *buf, uint32_t num_bytes)
1804{
1805 struct i3c_msg msg;
1806
1807 msg.buf = (uint8_t *)buf;
1808 msg.len = num_bytes;
1810 msg.hdr_mode = 0;
1811 msg.hdr_cmd_code = 0;
1812
1813 return i3c_transfer(target, &msg, 1);
1814}
1815
1829static inline int i3c_read(struct i3c_device_desc *target,
1830 uint8_t *buf, uint32_t num_bytes)
1831{
1832 struct i3c_msg msg;
1833
1834 msg.buf = buf;
1835 msg.len = num_bytes;
1837 msg.hdr_mode = 0;
1838 msg.hdr_cmd_code = 0;
1839
1840 return i3c_transfer(target, &msg, 1);
1841}
1842
1860static inline int i3c_write_read(struct i3c_device_desc *target,
1861 const void *write_buf, size_t num_write,
1862 void *read_buf, size_t num_read)
1863{
1864 struct i3c_msg msg[2];
1865
1866 msg[0].buf = (uint8_t *)write_buf;
1867 msg[0].len = num_write;
1868 msg[0].flags = I3C_MSG_WRITE;
1869 msg[0].hdr_mode = 0;
1870 msg[0].hdr_cmd_code = 0;
1871
1872 msg[1].buf = (uint8_t *)read_buf;
1873 msg[1].len = num_read;
1875 msg[1].hdr_mode = 0;
1876 msg[1].hdr_cmd_code = 0;
1877
1878 return i3c_transfer(target, msg, 2);
1879}
1880
1898static inline int i3c_burst_read(struct i3c_device_desc *target,
1899 uint8_t start_addr,
1900 uint8_t *buf,
1901 uint32_t num_bytes)
1902{
1903 return i3c_write_read(target,
1904 &start_addr, sizeof(start_addr),
1905 buf, num_bytes);
1906}
1907
1928static inline int i3c_burst_write(struct i3c_device_desc *target,
1929 uint8_t start_addr,
1930 const uint8_t *buf,
1931 uint32_t num_bytes)
1932{
1933 struct i3c_msg msg[2];
1934
1935 msg[0].buf = &start_addr;
1936 msg[0].len = 1U;
1937 msg[0].flags = I3C_MSG_WRITE;
1938 msg[0].hdr_mode = 0;
1939 msg[0].hdr_cmd_code = 0;
1940
1941 msg[1].buf = (uint8_t *)buf;
1942 msg[1].len = num_bytes;
1943 msg[1].flags = I3C_MSG_WRITE | I3C_MSG_STOP;
1944 msg[1].hdr_mode = 0;
1945 msg[1].hdr_cmd_code = 0;
1946
1947 return i3c_transfer(target, msg, 2);
1948}
1949
1964static inline int i3c_reg_read_byte(struct i3c_device_desc *target,
1965 uint8_t reg_addr, uint8_t *value)
1966{
1967 return i3c_write_read(target,
1968 &reg_addr, sizeof(reg_addr),
1969 value, sizeof(*value));
1970}
1971
1989static inline int i3c_reg_write_byte(struct i3c_device_desc *target,
1990 uint8_t reg_addr, uint8_t value)
1991{
1992 uint8_t tx_buf[2] = {reg_addr, value};
1993
1994 return i3c_write(target, tx_buf, 2);
1995}
1996
2015static inline int i3c_reg_update_byte(struct i3c_device_desc *target,
2016 uint8_t reg_addr, uint8_t mask,
2017 uint8_t value)
2018{
2019 uint8_t old_value, new_value;
2020 int rc;
2021
2022 rc = i3c_reg_read_byte(target, reg_addr, &old_value);
2023 if (rc != 0) {
2024 return rc;
2025 }
2026
2027 new_value = (old_value & ~mask) | (value & mask);
2028 if (new_value == old_value) {
2029 return 0;
2030 }
2031
2032 return i3c_reg_write_byte(target, reg_addr, new_value);
2033}
2034
2059void i3c_dump_msgs(const char *name, const struct i3c_msg *msgs,
2060 uint8_t num_msgs, struct i3c_device_desc *target);
2061
2079int i3c_bus_init(const struct device *dev,
2080 const struct i3c_dev_list *i3c_dev_list);
2081
2102
2113bool i3c_bus_has_sec_controller(const struct device *dev);
2114
2126int i3c_bus_deftgts(const struct device *dev);
2127
2128/*
2129 * This needs to be after declaration of struct i3c_driver_api,
2130 * or else compiler complains about undefined type inside
2131 * the static inline API wrappers.
2132 */
2134
2135/*
2136 * Include High-Data-Rate (HDR) inline helper functions
2137 */
2139
2140#ifdef __cplusplus
2141}
2142#endif
2143
2148#include <zephyr/syscalls/i3c.h>
2149
2150#endif /* ZEPHYR_INCLUDE_DRIVERS_I3C_H_ */
Public APIs for the I2C drivers.
System error numbers.
static int i3c_ibi_disable(struct i3c_device_desc *target)
Disable IBI of a target device.
Definition i3c.h:1719
static int i3c_ibi_has_payload(struct i3c_device_desc *target)
Check if target's IBI has payload.
Definition i3c.h:1742
static int i3c_ibi_raise(const struct device *dev, struct i3c_ibi *request)
Raise an In-Band Interrupt (IBI).
Definition i3c.h:1668
static int i3c_device_is_controller_capable(struct i3c_device_desc *target)
Check if the target is controller capable.
Definition i3c.h:1776
static int i3c_device_is_ibi_capable(struct i3c_device_desc *target)
Check if device is IBI capable.
Definition i3c.h:1759
static int i3c_ibi_enable(struct i3c_device_desc *target)
Enable IBI of a target device.
Definition i3c.h:1695
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
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:87
#define I3C_BCR_DEVICE_ROLE_I3C_CONTROLLER_CAPABLE
Device Role - I3C Controller Capable.
Definition i3c.h:127
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:1639
bool i3c_bus_has_sec_controller(const struct device *dev)
Check if the bus has a secondary controller.
i3c_sdr_target_error_codes
I3C SDR Target Error Codes.
Definition i3c.h:337
static int i3c_configure(const struct device *dev, enum i3c_config_type type, void *config)
Configure the I3C hardware.
Definition i3c.h:1340
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.
int i3c_bus_deftgts(const struct device *dev)
Send the CCC DEFTGTS.
i3c_config_type
Type of configuration being passed to configure function.
Definition i3c.h:508
int i3c_attach_i2c_device(struct i3c_i2c_device_desc *target)
Attach an I2C device.
int i3c_determine_default_addr(struct i3c_device_desc *target, uint8_t *addr)
Helper function to find the default address an i3c device is attached with.
i3c_i2c_speed_type
I2C bus speed under I3C bus.
Definition i3c.h:258
int i3c_detach_i3c_device(struct i3c_device_desc *target)
Detach I3C Device.
i3c_bus_mode
I3C bus mode.
Definition i3c.h:225
static int i3c_recover_bus(const struct device *dev)
Attempt bus recovery on the I3C bus.
Definition i3c.h:1396
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:1373
int i3c_detach_i2c_device(struct i3c_i2c_device_desc *target)
Detach I2C Device.
#define I3C_BCR_DEVICE_ROLE(bcr)
Device Role.
Definition i3c.h:139
struct i3c_i2c_device_desc * i3c_dev_list_i2c_addr_find(struct i3c_dev_attached_list *dev_list, uint16_t addr)
Find a I2C target device descriptor by address.
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.
i3c_sdr_controller_error_codes
I3C SDR Controller Error Codes.
Definition i3c.h:304
int i3c_do_ccc(const struct device *dev, struct i3c_ccc_payload *payload)
Send CCC to the bus.
struct i3c_device_desc * i3c_dev_list_i3c_addr_find(struct i3c_dev_attached_list *dev_list, uint8_t addr)
Find a I3C target device descriptor by dynamic address.
int i3c_device_basic_info_get(struct i3c_device_desc *target)
Get basic information from device and update device descriptor.
static int i3c_do_daa(const struct device *dev)
Perform Dynamic Address Assignment on the I3C bus.
Definition i3c.h:1538
#define I3C_BCR_IBI_PAYLOAD_HAS_DATA_BYTE
IBI Payload bit.
Definition i3c.h:96
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:274
@ I3C_ERROR_TE_UNKNOWN
Unknown error (not official error code)
Definition i3c.h:366
@ I3C_ERROR_TE6
Monitoring Error.
Definition i3c.h:360
@ I3C_ERROR_TE4
0x7E/R missing after RESTART during Dynamic Address Arbitration
Definition i3c.h:354
@ I3C_ERROR_TE3
Assigned Address during Dynamic Address Arbitration.
Definition i3c.h:351
@ I3C_ERROR_TE_NONE
No error (not official error code)
Definition i3c.h:369
@ I3C_ERROR_TE_MAX
Definition i3c.h:371
@ I3C_ERROR_TE1
CCC Code.
Definition i3c.h:345
@ I3C_ERROR_TE5
Transaction after detecting CCC.
Definition i3c.h:357
@ I3C_ERROR_DBR
Dead Bus Recovery.
Definition i3c.h:363
@ I3C_ERROR_TE2
Write Data.
Definition i3c.h:348
@ I3C_ERROR_TE_INVALID
Definition i3c.h:372
@ I3C_ERROR_TE0
Invalid Broadcast Address or Dynamic Address after DA assignment.
Definition i3c.h:342
@ I3C_CONFIG_TARGET
Definition i3c.h:510
@ I3C_CONFIG_CUSTOM
Definition i3c.h:511
@ I3C_CONFIG_CONTROLLER
Definition i3c.h:509
@ I3C_I2C_SPEED_INVALID
Definition i3c.h:266
@ I3C_I2C_SPEED_MAX
Definition i3c.h:265
@ I3C_I2C_SPEED_FMPLUS
I2C FM+ mode.
Definition i3c.h:263
@ I3C_I2C_SPEED_FM
I2C FM mode.
Definition i3c.h:260
@ I3C_BUS_MODE_INVALID
Definition i3c.h:250
@ I3C_BUS_MODE_PURE
Only I3C devices are on the bus.
Definition i3c.h:227
@ I3C_BUS_MODE_MIXED_FAST
Both I3C and legacy I2C devices are on the bus.
Definition i3c.h:233
@ I3C_BUS_MODE_MAX
Definition i3c.h:249
@ I3C_BUS_MODE_MIXED_LIMITED
Both I3C and legacy I2C devices are on the bus.
Definition i3c.h:240
@ I3C_BUS_MODE_MIXED_SLOW
Both I3C and legacy I2C devices are on the bus.
Definition i3c.h:247
@ I3C_ERROR_CE0
Transaction after sending CCC.
Definition i3c.h:306
@ I3C_ERROR_CE2
No response to broadcast address (0x7E)
Definition i3c.h:312
@ I3C_ERROR_CE_INVALID
Definition i3c.h:324
@ I3C_ERROR_CE_MAX
Definition i3c.h:323
@ I3C_ERROR_CE_UNKNOWN
Unknown error (not official error code)
Definition i3c.h:318
@ I3C_ERROR_CE3
Failed Controller Handoff.
Definition i3c.h:315
@ I3C_ERROR_CE1
Monitoring Error.
Definition i3c.h:309
@ I3C_ERROR_CE_NONE
No error (not official error code)
Definition i3c.h:321
@ I3C_DATA_RATE_MAX
Definition i3c.h:290
@ I3C_DATA_RATE_INVALID
Definition i3c.h:291
@ I3C_DATA_RATE_HDR_TSP
High Data Rate - Ternary Symbol for Pure Bus.
Definition i3c.h:285
@ I3C_DATA_RATE_HDR_DDR
High Data Rate - Double Data Rate messaging.
Definition i3c.h:279
@ I3C_DATA_RATE_SDR
Single Data Rate messaging.
Definition i3c.h:276
@ I3C_DATA_RATE_HDR_TSL
High Data Rate - Ternary Symbol Legacy-inclusive-Bus.
Definition i3c.h:282
@ I3C_DATA_RATE_HDR_BT
High Data Rate - Bulk Transport.
Definition i3c.h:288
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:396
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:1860
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:1898
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:2015
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:389
#define I3C_MSG_WRITE
Write message to I3C bus.
Definition i3c.h:386
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:1964
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:1802
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:1829
#define I3C_MSG_RESTART
RESTART I3C transaction for this message.
Definition i3c.h:407
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:1928
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:1989
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
__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:403
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:409
Structure to keep track of addresses on I3C bus.
Definition addresses.h:58
Payload structure for one CCC transaction.
Definition ccc.h:267
Configuration parameters for I3C hardware to act as controller.
Definition i3c.h:517
struct i3c_config_controller::@219 scl
uint32_t i3c
SCL frequency (in Hz) for I3C transfers.
Definition i3c.h:526
uint8_t supported_hdr
Bit mask of supported HDR modes (0 - 7).
Definition i3c.h:538
bool is_secondary
True if the controller is to be the secondary controller of the bus.
Definition i3c.h:522
uint32_t i2c
SCL frequency (in Hz) for I2C transfers.
Definition i3c.h:529
Custom I3C configuration parameters.
Definition i3c.h:549
void * ptr
Pointer to configuration parameter.
Definition i3c.h:563
uint32_t id
ID of the configuration parameter.
Definition i3c.h:551
uintptr_t val
Value of configuration parameter.
Definition i3c.h:555
Structure for describing attached devices for a controller.
Definition i3c.h:1135
sys_slist_t i3c
Linked list of attached I3C devices.
Definition i3c.h:1148
struct i3c_dev_attached_list::@227 devices
sys_slist_t i2c
Linked list of attached I2C devices.
Definition i3c.h:1153
struct i3c_addr_slots addr_slots
Address slots:
Definition i3c.h:1142
Structure for describing known devices for a controller.
Definition i3c.h:1165
struct i3c_i2c_device_desc *const i2c
Pointer to array of known I2C devices.
Definition i3c.h:1174
const uint8_t num_i3c
Number of I3C devices in array.
Definition i3c.h:1179
struct i3c_device_desc *const i3c
Pointer to array of known I3C devices.
Definition i3c.h:1169
const uint8_t num_i2c
Number of I2C devices in array.
Definition i3c.h:1184
Structure describing a I3C target device.
Definition i3c.h:915
uint8_t maxwr
Maximum Write Speed.
Definition i3c.h:1006
const uint8_t init_dynamic_addr
Initial dynamic address.
Definition i3c.h:950
uint8_t getcap1
I3C v1.1+ GETCAPS1 (I3C_CCC_GETCAPS1_*)
Definition i3c.h:1043
uint8_t getcap2
GETCAPS2 (I3C_CCC_GETCAPS2_*)
Definition i3c.h:1053
uint32_t max_read_turnaround
Maximum Read turnaround time in microseconds.
Definition i3c.h:1009
const uint8_t static_addr
Static address for this target device.
Definition i3c.h:939
uint8_t getcap4
GETCAPS4.
Definition i3c.h:1072
uint8_t max_ibi
Maximum IBI Payload Size.
Definition i3c.h:1020
i3c_target_ibi_cb_t ibi_cb
In-Band Interrupt (IBI) callback.
Definition i3c.h:1087
uint8_t group_addr
Group address for this target device.
Definition i3c.h:984
uint16_t mwl
Maximum Write Length.
Definition i3c.h:1017
uint8_t getcap3
GETCAPS3 (I3C_CCC_GETCAPS3_*)
Definition i3c.h:1066
uint8_t dynamic_addr
Dynamic Address for this target device used for communication.
Definition i3c.h:973
const struct device *const dev
Device driver instance of the I3C device.
Definition i3c.h:922
struct i3c_device_desc::@222 data_speed
sys_snode_t node
Definition i3c.h:916
uint16_t mrl
Maximum Read Length.
Definition i3c.h:1014
const uint64_t pid
Device Provisioned ID.
Definition i3c.h:925
uint8_t maxrd
Maximum Read Speed.
Definition i3c.h:1003
uint8_t gethdrcap
I3C v1.0 HDR Capabilities (I3C_CCC_GETCAPS1_*)
Definition i3c.h:1033
uint8_t bcr
Bus Characteristic Register (BCR)
Definition i3c.h:991
struct i3c_device_desc::@223 data_length
struct i3c_device_desc::@224 getcaps
Describes advanced (Target) capabilities and features.
uint8_t dcr
Device Characteristic Register (DCR)
Definition i3c.h:999
const bool supports_setaasa
Device support for SETAASA.
Definition i3c.h:958
const struct device *const bus
I3C bus to which this target device is attached.
Definition i3c.h:919
Structure used for matching I3C devices.
Definition i3c.h:881
const uint64_t pid
Device Provisioned ID.
Definition i3c.h:883
This structure is common to all I3C drivers and is expected to be the first element in the object poi...
Definition i3c.h:1192
struct i3c_dev_list dev_list
I3C/I2C device list struct.
Definition i3c.h:1194
This structure is common to all I3C drivers and is expected to be the first element in the driver's s...
Definition i3c.h:1201
struct i3c_config_controller ctrl_config
Controller Configuration.
Definition i3c.h:1203
struct i3c_dev_attached_list attached_dev
Attached I3C/I2C devices and addresses.
Definition i3c.h:1206
Structure describing a I2C device on I3C bus.
Definition i3c.h:1104
const struct device * bus
I3C bus to which this I2C device is attached.
Definition i3c.h:1108
const uint16_t addr
Static address for this I2C device.
Definition i3c.h:1111
const uint8_t lvr
Legacy Virtual Register (LVR)
Definition i3c.h:1117
sys_snode_t node
Definition i3c.h:1105
Struct for IBI request.
Definition ibi.h:58
One I3C Message.
Definition i3c.h:472
uint8_t flags
Flags for this message.
Definition i3c.h:489
uint8_t hdr_mode
HDR mode (I3C_MSG_HDR_MODE*) for transfer if any I3C_MSG_HDR_* is set in flags.
Definition i3c.h:497
uint32_t num_xfer
Total number of bytes transferred.
Definition i3c.h:486
uint8_t * buf
Data buffer in bytes.
Definition i3c.h:474
uint8_t hdr_cmd_code
HDR command code field (7-bit) for HDR-DDR, HDR-TSP and HDR-TSL.
Definition i3c.h:500
uint32_t len
Length of buffer in bytes.
Definition i3c.h:477
Structure describing a device that supports the I3C target API.
Definition target_device.h:102
Misc utilities.