12#ifndef ZEPHYR_INCLUDE_DRIVERS_I2C_H_
13#define ZEPHYR_INCLUDE_DRIVERS_I2C_H_
41#define I2C_SPEED_STANDARD (0x1U)
44#define I2C_SPEED_FAST (0x2U)
47#define I2C_SPEED_FAST_PLUS (0x3U)
50#define I2C_SPEED_HIGH (0x4U)
53#define I2C_SPEED_ULTRA (0x5U)
56#define I2C_SPEED_DT (0x7U)
58#define I2C_SPEED_SHIFT (1U)
59#define I2C_SPEED_SET(speed) (((speed) << I2C_SPEED_SHIFT) \
61#define I2C_SPEED_MASK (0x7U << I2C_SPEED_SHIFT)
62#define I2C_SPEED_GET(cfg) (((cfg) & I2C_SPEED_MASK) \
66#define I2C_ADDR_10_BITS BIT(0)
69#define I2C_MODE_CONTROLLER BIT(4)
92#define I2C_DT_SPEC_GET_ON_I3C(node_id) \
93 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
94 .addr = DT_PROP_BY_IDX(node_id, reg, 0)
106#define I2C_DT_SPEC_GET_ON_I2C(node_id) \
107 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
108 .addr = DT_REG_ADDR(node_id)
120#define I2C_DT_SPEC_GET(node_id) \
122 COND_CODE_1(DT_ON_BUS(node_id, i3c), \
123 (I2C_DT_SPEC_GET_ON_I3C(node_id)), \
124 (I2C_DT_SPEC_GET_ON_I2C(node_id))) \
135#define I2C_DT_SPEC_INST_GET(inst) \
136 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
144#define I2C_MSG_WRITE (0U << 0U)
147#define I2C_MSG_READ BIT(0)
150#define I2C_MSG_RW_MASK BIT(0)
154#define I2C_MSG_STOP BIT(1)
163#define I2C_MSG_RESTART BIT(2)
168#define I2C_MSG_ADDR_10_BITS BIT(3)
212typedef int (*i2c_api_configure_t)(
const struct device *dev,
214typedef int (*i2c_api_get_config_t)(
const struct device *dev,
216typedef int (*i2c_api_full_io_t)(
const struct device *dev,
220typedef int (*i2c_api_target_register_t)(
const struct device *dev,
222typedef int (*i2c_api_target_unregister_t)(
const struct device *dev,
224#ifdef CONFIG_I2C_CALLBACK
225typedef int (*i2c_api_transfer_cb_t)(
const struct device *dev,
232#if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
238typedef void (*i2c_api_iodev_submit)(
const struct device *dev,
242typedef int (*i2c_api_recover_bus_t)(
const struct device *dev);
244__subsystem
struct i2c_driver_api {
245 i2c_api_configure_t configure;
246 i2c_api_get_config_t get_config;
247 i2c_api_full_io_t transfer;
248 i2c_api_target_register_t target_register;
249 i2c_api_target_unregister_t target_unregister;
250#ifdef CONFIG_I2C_CALLBACK
251 i2c_api_transfer_cb_t transfer_cb;
253#ifdef CONFIG_I2C_RTIO
254 i2c_api_iodev_submit iodev_submit;
256 i2c_api_recover_bus_t recover_bus;
259typedef int (*i2c_target_api_register_t)(
const struct device *dev);
260typedef int (*i2c_target_api_unregister_t)(
const struct device *dev);
262__subsystem
struct i2c_target_driver_api {
263 i2c_target_api_register_t driver_register;
264 i2c_target_api_unregister_t driver_unregister;
272#define I2C_TARGET_FLAGS_ADDR_10_BITS BIT(0)
357#ifdef CONFIG_I2C_TARGET_BUFFER_MODE
371typedef void (*i2c_target_buf_write_received_cb_t)(
396typedef int (*i2c_target_buf_read_requested_cb_t)(
427#ifdef CONFIG_I2C_TARGET_BUFFER_MODE
428 i2c_target_buf_write_received_cb_t buf_write_received;
429 i2c_target_buf_read_requested_cb_t buf_read_requested;
534#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
582 for (
uint8_t i = 0U; i < num_msgs; i++) {
584 bytes_read += msgs[i].
len;
586 bytes_written += msgs[i].
len;
598#define Z_I2C_DEVICE_STATE_DEFINE(dev_id) \
599 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_id) \
600 __attribute__((__section__(".z_devstate")))
608#define Z_I2C_INIT_FN(dev_id, init_fn) \
609 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
611 struct i2c_device_state *state = \
612 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
613 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
614 STATS_NAME_INIT_PARMS(i2c)); \
615 stats_register(dev->name, &(state->stats.s_hdr)); \
616 if (!is_null_no_warn(init_fn)) { \
617 return init_fn(dev); \
652#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
654 Z_I2C_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
655 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
656 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
657 DEVICE_DT_NAME(node_id), \
658 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
659 pm, data, config, level, prio, api, \
660 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
670 ARG_UNUSED(num_msgs);
673#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
675 DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
676 prio, api, __VA_ARGS__)
688#define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
689 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
704static inline int z_impl_i2c_configure(
const struct device *dev,
707 const struct i2c_driver_api *api =
708 (
const struct i2c_driver_api *)dev->
api;
710 return api->configure(dev, dev_config);
735static inline int z_impl_i2c_get_config(
const struct device *dev,
uint32_t *dev_config)
737 const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
739 if (api->get_config == NULL) {
743 return api->get_config(dev, dev_config);
781static inline int z_impl_i2c_transfer(
const struct device *dev,
785 const struct i2c_driver_api *api =
786 (
const struct i2c_driver_api *)dev->
api;
788 int res = api->transfer(dev, msgs, num_msgs, addr);
799#if defined(CONFIG_I2C_CALLBACK) || defined(__DOXYGEN__)
830 const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
832 if (api->transfer_cb == NULL) {
836 return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
888 size_t num_write,
void *read_buf,
size_t num_read,
891 if ((msgs == NULL) || (num_msgs != 2)) {
896 msgs[0].
len = num_write;
900 msgs[1].
len = num_read;
928 uint8_t num_msgs,
const void *write_buf,
size_t num_write,
933 read_buf, num_read, cb, userdata);
936#if defined(CONFIG_POLL) || defined(__DOXYGEN__)
939void z_i2c_transfer_signal_cb(
const struct device *dev,
int result,
void *userdata);
969 const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
971 if (api->transfer_cb == NULL) {
975 return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
983#if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
995 const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
997 api->iodev_submit(dt_spec->
bus, iodev_sqe);
1011#define I2C_DT_IODEV_DEFINE(name, node_id) \
1012 const struct i2c_dt_spec _i2c_dt_spec_##name = \
1013 I2C_DT_SPEC_GET(node_id); \
1014 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name)
1026#define I2C_IODEV_DEFINE(name, _bus, _addr) \
1027 const struct i2c_dt_spec _i2c_dt_spec_##name = { \
1028 .bus = DEVICE_DT_GET(_bus), \
1031 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name)
1084static inline int z_impl_i2c_recover_bus(
const struct device *dev)
1086 const struct i2c_driver_api *api =
1087 (
const struct i2c_driver_api *)dev->
api;
1089 if (api->recover_bus == NULL) {
1093 return api->recover_bus(dev);
1123 const struct i2c_driver_api *api =
1124 (
const struct i2c_driver_api *)dev->
api;
1126 if (api->target_register == NULL) {
1130 return api->target_register(dev, cfg);
1152 const struct i2c_driver_api *api =
1153 (
const struct i2c_driver_api *)dev->
api;
1155 if (api->target_unregister == NULL) {
1159 return api->target_unregister(dev, cfg);
1177static inline int z_impl_i2c_target_driver_register(
const struct device *dev)
1179 const struct i2c_target_driver_api *api =
1180 (
const struct i2c_target_driver_api *)dev->
api;
1182 return api->driver_register(dev);
1200static inline int z_impl_i2c_target_driver_unregister(
const struct device *dev)
1202 const struct i2c_target_driver_api *api =
1203 (
const struct i2c_target_driver_api *)dev->
api;
1205 return api->driver_unregister(dev);
1232 msg.len = num_bytes;
1277 msg.len = num_bytes;
1321 const void *write_buf,
size_t num_write,
1322 void *read_buf,
size_t num_read)
1327 msg[0].len = num_write;
1331 msg[1].len = num_read;
1355 const void *write_buf,
size_t num_write,
1356 void *read_buf,
size_t num_read)
1359 write_buf, num_write,
1360 read_buf, num_read);
1388 &start_addr,
sizeof(start_addr),
1412 start_addr,
buf, num_bytes);
1444 msg[0].
buf = &start_addr;
1449 msg[1].len = num_bytes;
1475 start_addr,
buf, num_bytes);
1498 ®_addr,
sizeof(reg_addr),
1499 value,
sizeof(*value));
1543 uint8_t tx_buf[2] = {reg_addr, value};
1545 return i2c_write(dev, tx_buf, 2, dev_addr);
1599 new_value = (old_value & ~mask) | (value & mask);
1600 if (new_value == old_value) {
1626 reg_addr, mask, value);
1637#include <zephyr/syscalls/i2c.h>
workaround assembler barfing for ST r
Definition asm-macro-32-bit-gnu.h:24
bool device_is_ready(const struct device *dev)
Verify that a device is ready for use.
static int i2c_transfer_cb_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs, uint8_t num_msgs, i2c_callback_t cb, void *userdata)
Perform data transfer to another I2C device in master mode asynchronously.
Definition i2c.h:854
int i2c_target_driver_unregister(const struct device *dev)
Instructs the I2C Target device to unregister itself from the I2C Controller.
static int i2c_burst_write_dt(const struct i2c_dt_spec *spec, uint8_t start_addr, const uint8_t *buf, uint32_t num_bytes)
Write multiple bytes to an internal address of an I2C device.
Definition i2c.h:1469
static int i2c_target_unregister(const struct device *dev, struct i2c_target_config *cfg)
Unregisters the provided config as Target device.
Definition i2c.h:1149
static int i2c_write_read(const struct device *dev, uint16_t addr, const void *write_buf, size_t num_write, void *read_buf, size_t num_read)
Write then read data from an I2C device.
Definition i2c.h:1320
int i2c_target_driver_register(const struct device *dev)
Instructs the I2C Target device to register itself to the I2C Controller.
static void i2c_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
Submit request(s) to an I2C device with RTIO.
Definition i2c.h:991
struct rtio_sqe * i2c_rtio_copy(struct rtio *r, struct rtio_iodev *iodev, const struct i2c_msg *msgs, uint8_t num_msgs)
Copy the i2c_msgs into a set of RTIO requests.
void i2c_dump_msgs_rw(const struct device *dev, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr, bool dump_read)
Dump out an I2C message.
int(* i2c_target_read_requested_cb_t)(struct i2c_target_config *config, uint8_t *val)
Function called when a read from the device is initiated.
Definition i2c.h:332
int i2c_transfer(const struct device *dev, struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr)
Perform data transfer to another I2C device in controller mode.
static int i2c_write(const struct device *dev, const uint8_t *buf, uint32_t num_bytes, uint16_t addr)
Write a set amount of data to an I2C device.
Definition i2c.h:1226
static int i2c_write_dt(const struct i2c_dt_spec *spec, const uint8_t *buf, uint32_t num_bytes)
Write a set amount of data to an I2C device.
Definition i2c.h:1251
static int i2c_write_read_dt(const struct i2c_dt_spec *spec, const void *write_buf, size_t num_write, void *read_buf, size_t num_read)
Write then read data from an I2C device.
Definition i2c.h:1354
static int i2c_write_read_cb(const struct device *dev, struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr, const void *write_buf, size_t num_write, void *read_buf, size_t num_read, i2c_callback_t cb, void *userdata)
Write then read data from an I2C device asynchronously.
Definition i2c.h:886
int(* i2c_target_stop_cb_t)(struct i2c_target_config *config)
Function called when a stop condition is observed after a start condition addressed to a particular d...
Definition i2c.h:414
static int i2c_burst_read(const struct device *dev, uint16_t dev_addr, uint8_t start_addr, uint8_t *buf, uint32_t num_bytes)
Read multiple bytes from an internal address of an I2C device.
Definition i2c.h:1381
int(* i2c_target_read_processed_cb_t)(struct i2c_target_config *config, uint8_t *val)
Function called when a read from the device is continued.
Definition i2c.h:354
int(* i2c_target_write_requested_cb_t)(struct i2c_target_config *config)
Function called when a write to the device is initiated.
Definition i2c.h:289
static int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec, uint8_t reg_addr, uint8_t mask, uint8_t value)
Update internal register of an I2C device.
Definition i2c.h:1621
void(* i2c_callback_t)(const struct device *dev, int result, void *data)
I2C callback for asynchronous transfer requests.
Definition i2c.h:202
static int i2c_read_dt(const struct i2c_dt_spec *spec, uint8_t *buf, uint32_t num_bytes)
Read a set amount of data from an I2C device.
Definition i2c.h:1296
int(* i2c_target_write_received_cb_t)(struct i2c_target_config *config, uint8_t val)
Function called when a write to the device is continued.
Definition i2c.h:310
static int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec, uint8_t reg_addr, uint8_t value)
Write internal register of an I2C device.
Definition i2c.h:1561
int i2c_get_config(const struct device *dev, uint32_t *dev_config)
Get configuration of a host controller.
static int i2c_reg_write_byte(const struct device *dev, uint16_t dev_addr, uint8_t reg_addr, uint8_t value)
Write internal register of an I2C device.
Definition i2c.h:1539
#define I2C_MSG_READ
Read message from I2C bus.
Definition i2c.h:147
static int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec, uint8_t reg_addr, uint8_t *value)
Read internal register of an I2C device.
Definition i2c.h:1515
int i2c_configure(const struct device *dev, uint32_t dev_config)
Configure operation of a host controller.
static int i2c_write_read_cb_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs, uint8_t num_msgs, const void *write_buf, size_t num_write, void *read_buf, size_t num_read, i2c_callback_t cb, void *userdata)
Write then read data from an I2C device asynchronously.
Definition i2c.h:927
#define I2C_MSG_RESTART
RESTART I2C transaction for this message.
Definition i2c.h:163
static int i2c_transfer_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs, uint8_t num_msgs)
Perform data transfer to another I2C device in controller mode.
Definition i2c.h:1064
int i2c_recover_bus(const struct device *dev)
Recover the I2C bus.
static int i2c_read(const struct device *dev, uint8_t *buf, uint32_t num_bytes, uint16_t addr)
Read a set amount of data from an I2C device.
Definition i2c.h:1271
static bool i2c_is_read_op(struct i2c_msg *msg)
Check if the current message is a read operation.
Definition i2c.h:480
static int i2c_burst_read_dt(const struct i2c_dt_spec *spec, uint8_t start_addr, uint8_t *buf, uint32_t num_bytes)
Read multiple bytes from an internal address of an I2C device.
Definition i2c.h:1406
static int i2c_target_register(const struct device *dev, struct i2c_target_config *cfg)
Registers the provided config as Target device of a controller.
Definition i2c.h:1120
static int i2c_transfer_cb(const struct device *dev, struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr, i2c_callback_t cb, void *userdata)
Perform data transfer to another I2C device in controller mode.
Definition i2c.h:823
#define I2C_MSG_STOP
Send STOP after this message.
Definition i2c.h:154
static void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs, uint8_t num_msgs)
Updates the i2c stats for i2c transfers.
Definition i2c.h:572
static void i2c_dump_msgs(const struct device *dev, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr)
Dump out an I2C message, before it is executed.
Definition i2c.h:528
static int i2c_transfer_signal(const struct device *dev, struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr, struct k_poll_signal *sig)
Perform data transfer to another I2C device in controller mode.
Definition i2c.h:963
static int i2c_reg_update_byte(const struct device *dev, uint8_t dev_addr, uint8_t reg_addr, uint8_t mask, uint8_t value)
Update internal register of an I2C device.
Definition i2c.h:1586
const struct rtio_iodev_api i2c_iodev_api
#define I2C_MSG_WRITE
Write message to I2C bus.
Definition i2c.h:144
static int i2c_reg_read_byte(const struct device *dev, uint16_t dev_addr, uint8_t reg_addr, uint8_t *value)
Read internal register of an I2C device.
Definition i2c.h:1493
static int i2c_burst_write(const struct device *dev, uint16_t dev_addr, uint8_t start_addr, const uint8_t *buf, uint32_t num_bytes)
Write multiple bytes to an internal address of an I2C device.
Definition i2c.h:1436
static bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
Validate that I2C bus is ready.
Definition i2c.h:467
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
#define IS_ENABLED(config_macro)
Check for macro definition in compiler-visible expressions.
Definition util_macro.h:124
#define CONTAINER_OF(ptr, type, field)
Get a pointer to a structure containing the element.
Definition util.h:268
#define EINVAL
Invalid argument.
Definition errno.h:60
#define ENOSYS
Function not implemented.
Definition errno.h:82
flags
Definition parser.h:96
state
Definition parser_state.h:29
void * ptr
Definition printk.c:177
Real-Time IO device API for moving bytes with low effort.
#define STATS_NAME_END(name__)
Definition stats.h:391
#define STATS_NAME(name__, entry__)
Definition stats.h:390
#define STATS_SECT_END
Ends a stats group struct definition.
Definition stats.h:89
#define STATS_SECT_ENTRY32(var__)
Definition stats.h:359
#define STATS_INC(group__, var__)
Definition stats.h:364
#define STATS_NAME_START(name__)
Definition stats.h:389
#define STATS_INCN(group__, var__, n__)
Definition stats.h:363
#define STATS_SECT_START(group__)
Definition stats.h:354
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device dynamic structure (in RAM) per driver instance.
Definition device.h:371
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
struct device_state * state
Address of the common device state.
Definition device.h:411
I2C specific device state which allows for i2c device class specific additions.
Definition i2c.h:560
struct stats_i2c stats
Definition i2c.h:562
struct device_state devstate
Definition i2c.h:561
Complete I2C DT information.
Definition i2c.h:77
const struct device * bus
Definition i2c.h:78
uint16_t addr
Definition i2c.h:79
One I2C Message.
Definition i2c.h:184
uint8_t * buf
Data buffer in bytes.
Definition i2c.h:186
uint32_t len
Length of buffer in bytes.
Definition i2c.h:189
uint8_t flags
Flags for this message.
Definition i2c.h:192
Structure providing callbacks to be implemented for devices that supports the I2C target API.
Definition i2c.h:422
i2c_target_read_requested_cb_t read_requested
Definition i2c.h:424
i2c_target_write_received_cb_t write_received
Definition i2c.h:425
i2c_target_read_processed_cb_t read_processed
Definition i2c.h:426
i2c_target_write_requested_cb_t write_requested
Definition i2c.h:423
i2c_target_stop_cb_t stop
Definition i2c.h:431
Structure describing a device that supports the I2C target API.
Definition i2c.h:445
uint8_t flags
Flags for the target device defined by I2C_TARGET_FLAGS_* constants.
Definition i2c.h:450
uint16_t address
Address for this target device.
Definition i2c.h:453
sys_snode_t node
Private, do not modify.
Definition i2c.h:447
const struct i2c_target_callbacks * callbacks
Callback functions.
Definition i2c.h:456
API that an RTIO IO device should implement.
Definition rtio.h:433
Compute the mempool block index for a given pointer.
Definition rtio.h:423
struct rtio_sqe sqe
Definition rtio.h:424
An IO device with a function table for submitting requests.
Definition rtio.h:448
void * data
Definition rtio.h:453
A submission queue event.
Definition rtio.h:232
const struct rtio_iodev * iodev
Device to operation on.
Definition rtio.h:243
An RTIO context containing what can be viewed as a pair of queues.
Definition rtio.h:327
static fdata_t data[2]
Definition test_fifo_contexts.c:15
static void msg(uint64_t c64)
Definition main.c:17