12#ifndef ZEPHYR_INCLUDE_DRIVERS_I2C_H_ 
   13#define ZEPHYR_INCLUDE_DRIVERS_I2C_H_ 
   39#define I2C_SPEED_STANDARD              (0x1U) 
   42#define I2C_SPEED_FAST                  (0x2U) 
   45#define I2C_SPEED_FAST_PLUS             (0x3U) 
   48#define I2C_SPEED_HIGH                  (0x4U) 
   51#define I2C_SPEED_ULTRA                 (0x5U) 
   54#define I2C_SPEED_DT                    (0x7U) 
   56#define I2C_SPEED_SHIFT                 (1U) 
   57#define I2C_SPEED_SET(speed)            (((speed) << I2C_SPEED_SHIFT) \ 
   59#define I2C_SPEED_MASK                  (0x7U << I2C_SPEED_SHIFT)  
   60#define I2C_SPEED_GET(cfg)              (((cfg) & I2C_SPEED_MASK) \ 
   64#define I2C_ADDR_10_BITS                BIT(0) 
   67#define I2C_MODE_CONTROLLER             BIT(4) 
   90#define I2C_DT_SPEC_GET_ON_I3C(node_id)                                 \ 
   91        .bus = DEVICE_DT_GET(DT_BUS(node_id)),                          \ 
   92        .addr = DT_PROP_BY_IDX(node_id, reg, 0) 
  104#define I2C_DT_SPEC_GET_ON_I2C(node_id)                                 \ 
  105        .bus = DEVICE_DT_GET(DT_BUS(node_id)),                          \ 
  106        .addr = DT_REG_ADDR(node_id) 
  118#define I2C_DT_SPEC_GET(node_id)                                        \ 
  120                COND_CODE_1(DT_ON_BUS(node_id, i3c),                    \ 
  121                            (I2C_DT_SPEC_GET_ON_I3C(node_id)),          \ 
  122                            (I2C_DT_SPEC_GET_ON_I2C(node_id)))          \ 
  133#define I2C_DT_SPEC_INST_GET(inst) \ 
  134        I2C_DT_SPEC_GET(DT_DRV_INST(inst)) 
  142#define I2C_MSG_WRITE                   (0U << 0U) 
  145#define I2C_MSG_READ                    BIT(0) 
  148#define I2C_MSG_RW_MASK                 BIT(0) 
  152#define I2C_MSG_STOP                    BIT(1) 
  161#define I2C_MSG_RESTART                 BIT(2) 
  166#define I2C_MSG_ADDR_10_BITS            BIT(3) 
  210typedef int (*i2c_api_configure_t)(
const struct device *dev,
 
  212typedef int (*i2c_api_get_config_t)(
const struct device *dev,
 
  214typedef int (*i2c_api_full_io_t)(
const struct device *dev,
 
  218typedef int (*i2c_api_target_register_t)(
const struct device *dev,
 
  220typedef int (*i2c_api_target_unregister_t)(
const struct device *dev,
 
  222#ifdef CONFIG_I2C_CALLBACK 
  223typedef int (*i2c_api_transfer_cb_t)(
const struct device *dev,
 
  230#if defined(CONFIG_I2C_RTIO) || defined(DOXYGEN) 
  236typedef void (*i2c_api_iodev_submit)(
const struct device *dev,
 
  240typedef int (*i2c_api_recover_bus_t)(
const struct device *dev);
 
  242__subsystem 
struct i2c_driver_api {
 
  243        i2c_api_configure_t configure;
 
  244        i2c_api_get_config_t get_config;
 
  245        i2c_api_full_io_t transfer;
 
  246        i2c_api_target_register_t target_register;
 
  247        i2c_api_target_unregister_t target_unregister;
 
  248#ifdef CONFIG_I2C_CALLBACK 
  249        i2c_api_transfer_cb_t transfer_cb;
 
  251#ifdef CONFIG_I2C_RTIO 
  252        i2c_api_iodev_submit iodev_submit;
 
  254        i2c_api_recover_bus_t recover_bus;
 
  257typedef int (*i2c_target_api_register_t)(
const struct device *dev);
 
  258typedef int (*i2c_target_api_unregister_t)(
const struct device *dev);
 
  260struct i2c_target_driver_api {
 
  261        i2c_target_api_register_t driver_register;
 
  262        i2c_target_api_unregister_t driver_unregister;
 
  270#define I2C_TARGET_FLAGS_ADDR_10_BITS   BIT(0) 
  473#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__) 
  521        for (
uint8_t i = 0U; i < num_msgs; i++) {
 
  523                        bytes_read += msgs[i].
len;
 
  525                        bytes_written += msgs[i].
len;
 
  537#define Z_I2C_DEVICE_STATE_DEFINE(dev_id)                               \ 
  538        static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_id)      \ 
  539        __attribute__((__section__(".z_devstate")))
 
  547#define Z_I2C_INIT_FN(dev_id, init_fn)                                  \ 
  548        static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \ 
  550                struct i2c_device_state *state =                        \ 
  551                        CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \ 
  552                stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4,       \ 
  553                           STATS_NAME_INIT_PARMS(i2c));                 \ 
  554                stats_register(dev->name, &(state->stats.s_hdr));       \ 
  555                if (init_fn != NULL) {                                  \ 
  556                        return init_fn(dev);                            \ 
  591#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \ 
  593        Z_I2C_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id));         \ 
  594        Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn)             \ 
  595        Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id),           \ 
  596                        DEVICE_DT_NAME(node_id),                        \ 
  597                        &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init),  \ 
  598                        pm_device, data, config, level, prio, api,      \ 
  599                        &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \ 
  609        ARG_UNUSED(num_msgs);
 
  612#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \ 
  614        DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level,     \ 
  615                         prio, api, __VA_ARGS__) 
  627#define I2C_DEVICE_DT_INST_DEFINE(inst, ...)            \ 
  628        I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__) 
  643static inline int z_impl_i2c_configure(
const struct device *dev,
 
  646        const struct i2c_driver_api *api =
 
  647                (
const struct i2c_driver_api *)dev->
api;
 
  649        return api->configure(dev, dev_config);
 
  674static inline int z_impl_i2c_get_config(
const struct device *dev, 
uint32_t *dev_config)
 
  676        const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
 
  678        if (api->get_config == NULL) {
 
  682        return api->get_config(dev, dev_config);
 
  716static inline int z_impl_i2c_transfer(
const struct device *dev,
 
  720        const struct i2c_driver_api *api =
 
  721                (
const struct i2c_driver_api *)dev->
api;
 
  723        int res =  api->transfer(dev, msgs, num_msgs, addr);
 
  734#ifdef CONFIG_I2C_CALLBACK 
  758static inline int i2c_transfer_cb(
const struct device *dev,
 
  765        const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
 
  767        if (api->transfer_cb == NULL) {
 
  771        return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
 
  789static inline int i2c_transfer_cb_dt(
const struct i2c_dt_spec *spec,
 
  795        return i2c_transfer_cb(spec->
bus, msgs, num_msgs, spec->
addr, cb, userdata);
 
  821static inline int i2c_write_read_cb(
const struct device *dev, 
struct i2c_msg *msgs,
 
  823                                 size_t num_write, 
void *read_buf, 
size_t num_read,
 
  826        if ((msgs == NULL) || (num_msgs != 2)) {
 
  831        msgs[0].
len = num_write;
 
  835        msgs[1].
len = num_read;
 
  838        return i2c_transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
 
  862static inline int i2c_write_read_cb_dt(
const struct i2c_dt_spec *spec, 
struct i2c_msg *msgs,
 
  863                                       uint8_t num_msgs, 
const void *write_buf, 
size_t num_write,
 
  867        return i2c_write_read_cb(spec->
bus, msgs, num_msgs, spec->
addr, write_buf, num_write,
 
  868                                 read_buf, num_read, cb, userdata);
 
  874void z_i2c_transfer_signal_cb(
const struct device *dev, 
int result, 
void *userdata);
 
  898static inline int i2c_transfer_signal(
const struct device *dev,
 
  904        const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
 
  906        if (api->transfer_cb == NULL) {
 
  910        return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
 
  918#if defined(CONFIG_I2C_RTIO) || defined(DOXYGEN) 
  926static inline void i2c_iodev_submit(
struct rtio_iodev_sqe *iodev_sqe)
 
  930        const struct i2c_driver_api *api = (
const struct i2c_driver_api *)dev->
api;
 
  932        api->iodev_submit(dt_spec->
bus, iodev_sqe);
 
  945#define I2C_DT_IODEV_DEFINE(name, node_id)                                      \ 
  946        const struct i2c_dt_spec _i2c_dt_spec_##name =                          \ 
  947                I2C_DT_SPEC_GET(node_id);                                       \ 
  948        RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name) 
 1001static inline int z_impl_i2c_recover_bus(
const struct device *dev)
 
 1003        const struct i2c_driver_api *api =
 
 1004                (
const struct i2c_driver_api *)dev->
api;
 
 1006        if (api->recover_bus == NULL) {
 
 1010        return api->recover_bus(dev);
 
 1040        const struct i2c_driver_api *api =
 
 1041                (
const struct i2c_driver_api *)dev->
api;
 
 1043        if (api->target_register == NULL) {
 
 1047        return api->target_register(dev, cfg);
 
 1069        const struct i2c_driver_api *api =
 
 1070                (
const struct i2c_driver_api *)dev->
api;
 
 1072        if (api->target_unregister == NULL) {
 
 1076        return api->target_unregister(dev, cfg);
 
 1094static inline int z_impl_i2c_target_driver_register(
const struct device *dev)
 
 1096        const struct i2c_target_driver_api *api =
 
 1097                (
const struct i2c_target_driver_api *)dev->
api;
 
 1099        return api->driver_register(dev);
 
 1117static inline int z_impl_i2c_target_driver_unregister(
const struct device *dev)
 
 1119        const struct i2c_target_driver_api *api =
 
 1120                (
const struct i2c_target_driver_api *)dev->
api;
 
 1122        return api->driver_unregister(dev);
 
 1149        msg.len = num_bytes;
 
 1194        msg.len = num_bytes;
 
 1238                                 const void *write_buf, 
size_t num_write,
 
 1239                                 void *read_buf, 
size_t num_read)
 
 1244        msg[0].len = num_write;
 
 1248        msg[1].len = num_read;
 
 1272                                    const void *write_buf, 
size_t num_write,
 
 1273                                    void *read_buf, 
size_t num_read)
 
 1276                              write_buf, num_write,
 
 1277                              read_buf, num_read);
 
 1305                              &start_addr, 
sizeof(start_addr),
 
 1329                              start_addr, 
buf, num_bytes);
 
 1361        msg[0].buf = &start_addr;
 
 1366        msg[1].len = num_bytes;
 
 1392                               start_addr, 
buf, num_bytes);
 
 1415                              ®_addr, 
sizeof(reg_addr),
 
 1416                              value, 
sizeof(*value));
 
 1460        uint8_t tx_buf[2] = {reg_addr, value};
 
 1462        return i2c_write(dev, tx_buf, 2, dev_addr);
 
 1516        new_value = (old_value & ~mask) | (value & mask);
 
 1517        if (new_value == old_value) {
 
 1543                                   reg_addr, mask, value);
 
 1554#include <syscalls/i2c.h> 
workaround assembler barfing for ST r
Definition: asm-macro-32-bit-gnu.h:24
 
struct result result[2]
Definition: errno.c:42
 
bool device_is_ready(const struct device *dev)
Verify that a device is ready for use.
 
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:1386
 
static int i2c_target_unregister(const struct device *dev, struct i2c_target_config *cfg)
Unregisters the provided config as Target device.
Definition: i2c.h:1066
 
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:1237
 
int i2c_target_driver_register(const struct device *dev)
Instructs the I2C Target device to register itself to the I2C Controller.
 
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:330
 
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:1143
 
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:1168
 
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:1271
 
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:369
 
void i2c_dump_msgs_rw(const char *name, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr, bool dump_read)
Dump out an I2C message.
 
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:1298
 
static void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr)
Dump out an I2C message, before it is executed.
Definition: i2c.h:467
 
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:352
 
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:287
 
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:1538
 
void(* i2c_callback_t)(const struct device *dev, int result, void *data)
I2C callback for asynchronous transfer requests.
Definition: i2c.h:200
 
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:1213
 
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:308
 
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:1478
 
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:1456
 
#define I2C_MSG_READ
Definition: i2c.h:145
 
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:1432
 
int i2c_configure(const struct device *dev, uint32_t dev_config)
Configure operation of a host controller.
 
#define I2C_MSG_RESTART
Definition: i2c.h:161
 
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:981
 
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:1188
 
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:1323
 
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:1037
 
#define I2C_MSG_STOP
Definition: i2c.h:152
 
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:511
 
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:1503
 
#define I2C_MSG_WRITE
Definition: i2c.h:142
 
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:1410
 
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:1353
 
static bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
Validate that I2C bus is ready.
Definition: i2c.h:418
 
#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:224
 
#define EINVAL
Definition: errno.h:61
 
#define ENOSYS
Definition: errno.h:83
 
flags
Definition: parser.h:96
 
state
Definition: parser_state.h:29
 
Real-Time IO device API for moving bytes with low effort.
 
Single-linked list implementation.
 
struct _snode sys_snode_t
Definition: slist.h:33
 
#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:353
 
Runtime device structure (in ROM) per driver instance.
Definition: device.h:380
 
const char * name
Definition: device.h:382
 
const void * api
Definition: device.h:386
 
struct device_state * state
Definition: device.h:388
 
I2C specific device state which allows for i2c device class specific additions.
Definition: i2c.h:499
 
struct stats_i2c stats
Definition: i2c.h:501
 
struct device_state devstate
Definition: i2c.h:500
 
Complete I2C DT information.
Definition: i2c.h:75
 
const struct device * bus
Definition: i2c.h:76
 
uint16_t addr
Definition: i2c.h:77
 
One I2C Message.
Definition: i2c.h:182
 
uint8_t * buf
Definition: i2c.h:184
 
uint32_t len
Definition: i2c.h:187
 
uint8_t flags
Definition: i2c.h:190
 
Structure providing callbacks to be implemented for devices that supports the I2C target API.
Definition: i2c.h:377
 
i2c_target_read_requested_cb_t read_requested
Definition: i2c.h:379
 
i2c_target_write_received_cb_t write_received
Definition: i2c.h:380
 
i2c_target_read_processed_cb_t read_processed
Definition: i2c.h:381
 
i2c_target_write_requested_cb_t write_requested
Definition: i2c.h:378
 
i2c_target_stop_cb_t stop
Definition: i2c.h:382
 
Structure describing a device that supports the I2C target API.
Definition: i2c.h:396
 
uint8_t flags
Definition: i2c.h:401
 
uint16_t address
Definition: i2c.h:404
 
sys_snode_t node
Definition: i2c.h:398
 
const struct i2c_target_callbacks * callbacks
Definition: i2c.h:407
 
Definition: kernel.h:5517
 
API that an RTIO IO device should implement.
Definition: rtio.h:421
 
Compute the mempool block index for a given pointer.
Definition: rtio.h:411
 
struct rtio_sqe sqe
Definition: rtio.h:412
 
An IO device with a function table for submitting requests.
Definition: rtio.h:439
 
void * data
Definition: rtio.h:447
 
A submission queue event.
Definition: rtio.h:238
 
const struct rtio_iodev * iodev
Definition: rtio.h:249
 
An RTIO context containing what can be viewed as a pair of queues.
Definition: rtio.h:338
 
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
 
static void msg(uint64_t c64)
Definition: main.c:17