Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
i2c.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12
13#ifndef ZEPHYR_INCLUDE_DRIVERS_I2C_H_
14#define ZEPHYR_INCLUDE_DRIVERS_I2C_H_
15
24
25#include <errno.h>
26
27#include <zephyr/types.h>
28#include <zephyr/device.h>
29#include <zephyr/kernel.h>
30#include <zephyr/sys/slist.h>
31#include <zephyr/rtio/rtio.h>
32#include <zephyr/toolchain.h>
33
34#ifdef __cplusplus
35extern "C" {
36#endif
37
38/*
39 * The following #defines are used to configure the I2C controller.
40 */
41
43#define I2C_SPEED_STANDARD (0x1U)
44
46#define I2C_SPEED_FAST (0x2U)
47
49#define I2C_SPEED_FAST_PLUS (0x3U)
50
52#define I2C_SPEED_HIGH (0x4U)
53
55#define I2C_SPEED_ULTRA (0x5U)
56
58#define I2C_SPEED_DT (0x7U)
59
60#define I2C_SPEED_SHIFT (1U)
61#define I2C_SPEED_SET(speed) (((speed) << I2C_SPEED_SHIFT) \
62 & I2C_SPEED_MASK)
63#define I2C_SPEED_MASK (0x7U << I2C_SPEED_SHIFT) /* 3 bits */
64#define I2C_SPEED_GET(cfg) (((cfg) & I2C_SPEED_MASK) \
65 >> I2C_SPEED_SHIFT)
66
68#define I2C_ADDR_10_BITS BIT(0)
69
71#define I2C_MODE_CONTROLLER BIT(4)
72
73#if CONFIG_I2C_TRANSFER_TIMEOUT_SUPPORTED
74
76#if CONFIG_I2C_TRANSFER_TIMEOUT_MS
77#define I2C_TRANSFER_TIMEOUT K_MSEC(CONFIG_I2C_TRANSFER_TIMEOUT_MS)
78#else
79#define I2C_TRANSFER_TIMEOUT K_FOREVER
80#endif
81
83#define BUILD_ASSERT_INVALID_I2C_TRANSFER_TIMEOUT() \
84 BUILD_ASSERT(CONFIG_I2C_TRANSFER_TIMEOUT_MS != 0, \
85 "infinite i2c transfer timeout not unsupported")
86
87#endif /* CONFIG_I2C_TRANSFER_TIMEOUT_SUPPORTED */
88
96 const struct device *bus;
98};
99
110#define I2C_DT_SPEC_GET_ON_I3C(node_id) \
111 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
112 .addr = DT_PROP_BY_IDX(node_id, reg, 0)
113
124#define I2C_DT_SPEC_GET_ON_I2C(node_id) \
125 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
126 .addr = DT_REG_ADDR(node_id)
127
138#define I2C_DT_SPEC_GET(node_id) \
139 { \
140 COND_CODE_1(DT_ON_BUS(node_id, i3c), \
141 (I2C_DT_SPEC_GET_ON_I3C(node_id)), \
142 (I2C_DT_SPEC_GET_ON_I2C(node_id))) \
143 }
144
153#define I2C_DT_SPEC_INST_GET(inst) \
154 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
155
156
157/*
158 * I2C_MSG_* are I2C Message flags.
159 */
160
162#define I2C_MSG_WRITE (0U << 0U)
163
165#define I2C_MSG_READ BIT(0)
166
168#define I2C_MSG_RW_MASK BIT(0)
170
172#define I2C_MSG_STOP BIT(1)
173
181#define I2C_MSG_RESTART BIT(2)
182
186#define I2C_MSG_ADDR_10_BITS BIT(3)
187
212
220typedef void (*i2c_callback_t)(const struct device *dev, int result, void *data);
221
228struct i2c_target_config;
229
230typedef int (*i2c_api_configure_t)(const struct device *dev,
231 uint32_t dev_config);
232typedef int (*i2c_api_get_config_t)(const struct device *dev,
233 uint32_t *dev_config);
234typedef int (*i2c_api_full_io_t)(const struct device *dev,
235 struct i2c_msg *msgs,
236 uint8_t num_msgs,
237 uint16_t addr);
238typedef int (*i2c_api_target_register_t)(const struct device *dev,
239 struct i2c_target_config *cfg);
240typedef int (*i2c_api_target_unregister_t)(const struct device *dev,
241 struct i2c_target_config *cfg);
242
243#ifdef CONFIG_I2C_CALLBACK
244typedef int (*i2c_api_transfer_cb_t)(const struct device *dev,
245 struct i2c_msg *msgs,
246 uint8_t num_msgs,
247 uint16_t addr,
249 void *userdata);
250#endif /* CONFIG_I2C_CALLBACK */
251
252#ifdef CONFIG_I2C_RTIO
253typedef void (*i2c_api_iodev_submit)(const struct device *dev,
254 struct rtio_iodev_sqe *iodev_sqe);
255#endif /* CONFIG_I2C_RTIO */
256
257typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
258
259__subsystem struct i2c_driver_api {
260 i2c_api_configure_t configure;
261 i2c_api_get_config_t get_config;
262 i2c_api_full_io_t transfer;
263 i2c_api_target_register_t target_register;
264 i2c_api_target_unregister_t target_unregister;
265#ifdef CONFIG_I2C_CALLBACK
266 i2c_api_transfer_cb_t transfer_cb;
267#endif
268#ifdef CONFIG_I2C_RTIO
269 i2c_api_iodev_submit iodev_submit;
270#endif
271 i2c_api_recover_bus_t recover_bus;
272};
273
274typedef int (*i2c_target_api_register_t)(const struct device *dev);
275typedef int (*i2c_target_api_unregister_t)(const struct device *dev);
276
277__subsystem struct i2c_target_driver_api {
278 i2c_target_api_register_t driver_register;
279 i2c_target_api_unregister_t driver_unregister;
280};
281
285
287#define I2C_TARGET_FLAGS_ADDR_10_BITS BIT(0)
288
305 struct i2c_target_config *config);
306
326 struct i2c_target_config *config, uint8_t val);
327
348 struct i2c_target_config *config, uint8_t *val);
349
370 struct i2c_target_config *config, uint8_t *val);
371
372#if defined(CONFIG_I2C_TARGET_BUFFER_MODE) || defined(__DOXYGEN__)
387 struct i2c_target_config *config, uint8_t *ptr, uint32_t len);
388
412 struct i2c_target_config *config, uint8_t **ptr, uint32_t *len);
413#endif
414
429typedef int (*i2c_target_stop_cb_t)(struct i2c_target_config *config);
430
438 I2C_ERROR_TIMEOUT = 0, /* Timeout error */
439 I2C_ERROR_ARBITRATION, /* Bus arbitration size */
440 I2C_ERROR_SIZE, /* Bad frame size */
441 I2C_ERROR_DMA, /* DMA transfer error */
442 I2C_ERROR_GENERIC, /* Any other bus error */
443};
444
456typedef void (*i2c_target_error_cb_t)(struct i2c_target_config *config,
457 enum i2c_error_reason error_code);
458
491
516
525static inline bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
526{
527 /* Validate bus is ready */
528 return device_is_ready(spec->bus);
529}
530
538static inline bool i2c_is_read_op(const struct i2c_msg *msg)
539{
540 return (msg->flags & I2C_MSG_READ) == I2C_MSG_READ;
541}
542
550static inline bool i2c_is_stop_op(const struct i2c_msg *msg)
551{
552 return (msg->flags & I2C_MSG_STOP) == I2C_MSG_STOP;
553}
554
562static inline bool i2c_is_reset_op(const struct i2c_msg *msg)
563{
564 return (msg->flags & I2C_MSG_RESTART) == I2C_MSG_RESTART;
565}
566
593void i2c_dump_msgs_rw(const struct device *dev, const struct i2c_msg *msgs, uint8_t num_msgs,
594 uint16_t addr, bool dump_read);
595
610static inline void i2c_dump_msgs(const struct device *dev, const struct i2c_msg *msgs,
611 uint8_t num_msgs, uint16_t addr)
612{
613 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, false);
614}
615
616#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
617
618#include <zephyr/stats/stats.h>
619
621
623STATS_SECT_ENTRY32(bytes_read)
624STATS_SECT_ENTRY32(bytes_written)
625STATS_SECT_ENTRY32(message_count)
626STATS_SECT_ENTRY32(transfer_call_count)
628
630STATS_NAME(i2c, bytes_read)
631STATS_NAME(i2c, bytes_written)
632STATS_NAME(i2c, message_count)
633STATS_NAME(i2c, transfer_call_count)
634STATS_NAME_END(i2c);
635
637
638
644 struct stats_i2c stats;
645};
646
654static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
655 uint8_t num_msgs)
656{
657 struct i2c_device_state *state =
659 uint32_t bytes_read = 0U;
660 uint32_t bytes_written = 0U;
661
662 STATS_INC(state->stats, transfer_call_count);
663 STATS_INCN(state->stats, message_count, num_msgs);
664 for (uint8_t i = 0U; i < num_msgs; i++) {
665 if (msgs[i].flags & I2C_MSG_READ) {
666 bytes_read += msgs[i].len;
667 } else {
668 bytes_written += msgs[i].len;
669 }
670 }
671 STATS_INCN(state->stats, bytes_read, bytes_read);
672 STATS_INCN(state->stats, bytes_written, bytes_written);
673}
674
676
680#define Z_I2C_DEVICE_STATE_DEFINE(dev_id) \
681 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_id) \
682 __attribute__((__section__(".z_devstate")))
683
690#define Z_I2C_INIT_FN(dev_id, init_fn) \
691 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
692 { \
693 struct i2c_device_state *state = \
694 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
695 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
696 STATS_NAME_INIT_PARMS(i2c)); \
697 stats_register(dev->name, &(state->stats.s_hdr)); \
698 if (!is_null_no_warn(init_fn)) { \
699 return init_fn(dev); \
700 } \
701 \
702 return 0; \
703 }
704
706
736#define I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, \
737 data, config, level, prio, api, ...)\
738 Z_I2C_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
739 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
740 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
741 DEVICE_DT_NAME(node_id), \
742 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
743 deinit_fn, Z_DEVICE_DT_FLAGS(node_id), pm, data,\
744 config, level, prio, api, \
745 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
746 __VA_ARGS__)
747
748#else /* CONFIG_I2C_STATS */
749
750static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
751 uint8_t num_msgs)
752{
753 ARG_UNUSED(dev);
754 ARG_UNUSED(msgs);
755 ARG_UNUSED(num_msgs);
756}
757
758#define I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, \
759 data, config, level, prio, api, ...)\
760 DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, data, \
761 config, level, prio, api, __VA_ARGS__)
762
763#endif /* CONFIG_I2C_STATS */
764
768#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
769 prio, api, ...) \
770 I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, NULL, pm, data, \
771 config, level, prio, api, \
772 __VA_ARGS__)
773
782#define I2C_DEVICE_DT_INST_DEINIT_DEFINE(inst, ...) \
783 I2C_DEVICE_DT_DEINIT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
784
793#define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
794 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
795
806__syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
807
808static inline int z_impl_i2c_configure(const struct device *dev,
809 uint32_t dev_config)
810{
811 return DEVICE_API_GET(i2c, dev)->configure(dev, dev_config);
812}
813
827static inline int i2c_configure_dt(const struct i2c_dt_spec *spec,
828 uint32_t dev_config)
829{
830 return i2c_configure(spec->bus, dev_config);
831}
832
853__syscall int i2c_get_config(const struct device *dev, uint32_t *dev_config);
854
855static inline int z_impl_i2c_get_config(const struct device *dev, uint32_t *dev_config)
856{
857 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
858
859 if (api->get_config == NULL) {
860 return -ENOSYS;
861 }
862
863 return api->get_config(dev, dev_config);
864}
865
897__syscall int i2c_transfer(const struct device *dev,
898 struct i2c_msg *msgs, uint8_t num_msgs,
899 uint16_t addr);
900
901static inline int z_impl_i2c_transfer(const struct device *dev,
902 struct i2c_msg *msgs, uint8_t num_msgs,
903 uint16_t addr)
904{
905 if (!num_msgs) {
906 return 0;
907 }
908
909 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
910 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
911 }
912
913 int res = DEVICE_API_GET(i2c, dev)->transfer(dev, msgs, num_msgs, addr);
914
915 i2c_xfer_stats(dev, msgs, num_msgs);
916
917 if (IS_ENABLED(CONFIG_I2C_DUMP_MESSAGES)) {
918 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, true);
919 }
920
921 return res;
922}
923
924#if defined(CONFIG_I2C_CALLBACK) || defined(__DOXYGEN__)
925
948static inline int i2c_transfer_cb(const struct device *dev,
949 struct i2c_msg *msgs,
950 uint8_t num_msgs,
951 uint16_t addr,
953 void *userdata)
954{
955 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
956
957 if (api->transfer_cb == NULL) {
958 return -ENOSYS;
959 }
960
961 if (!num_msgs) {
962 cb(dev, 0, userdata);
963 return 0;
964 }
965
966 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
967 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
968 }
969
970 return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
971}
972
988static inline int i2c_transfer_cb_dt(const struct i2c_dt_spec *spec,
989 struct i2c_msg *msgs,
990 uint8_t num_msgs,
992 void *userdata)
993{
994 return i2c_transfer_cb(spec->bus, msgs, num_msgs, spec->addr, cb, userdata);
995}
996
1020static inline int i2c_write_read_cb(const struct device *dev, struct i2c_msg *msgs,
1021 uint8_t num_msgs, uint16_t addr, const void *write_buf,
1022 size_t num_write, void *read_buf, size_t num_read,
1023 i2c_callback_t cb, void *userdata)
1024{
1025 if ((msgs == NULL) || (num_msgs != 2)) {
1026 return -EINVAL;
1027 }
1028
1029 msgs[0].buf = (uint8_t *)write_buf;
1030 msgs[0].len = num_write;
1031 msgs[0].flags = I2C_MSG_WRITE;
1032
1033 msgs[1].buf = (uint8_t *)read_buf;
1034 msgs[1].len = num_read;
1036
1037 return i2c_transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
1038}
1039
1061static inline int i2c_write_read_cb_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs,
1062 uint8_t num_msgs, const void *write_buf, size_t num_write,
1063 void *read_buf, size_t num_read, i2c_callback_t cb,
1064 void *userdata)
1065{
1066 return i2c_write_read_cb(spec->bus, msgs, num_msgs, spec->addr, write_buf, num_write,
1067 read_buf, num_read, cb, userdata);
1068}
1069
1070#if defined(CONFIG_POLL) || defined(__DOXYGEN__)
1071
1073void z_i2c_transfer_signal_cb(const struct device *dev, int result, void *userdata);
1075
1097static inline int i2c_transfer_signal(const struct device *dev,
1098 struct i2c_msg *msgs,
1099 uint8_t num_msgs,
1100 uint16_t addr,
1101 struct k_poll_signal *sig)
1102{
1103 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1104
1105 if (api->transfer_cb == NULL) {
1106 return -ENOSYS;
1107 }
1108
1109 return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
1110}
1111
1112#endif /* CONFIG_POLL */
1113
1114#endif /* CONFIG_I2C_CALLBACK */
1115
1116
1117#if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
1118
1129void i2c_iodev_submit_fallback(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe);
1130
1137static inline void i2c_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
1138{
1139 const struct i2c_dt_spec *dt_spec = (const struct i2c_dt_spec *)iodev_sqe->sqe.iodev->data;
1140 const struct device *dev = dt_spec->bus;
1141 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1142
1143 if (api->iodev_submit == NULL) {
1144 rtio_iodev_sqe_err(iodev_sqe, -ENOSYS);
1145 return;
1146 }
1147 api->iodev_submit(dt_spec->bus, iodev_sqe);
1148}
1149
1150extern const struct rtio_iodev_api i2c_iodev_api;
1151
1152#define I2C_CAT2(x, y) x ## y
1153
1163#define I2C_DT_IODEV_DEFINE(name, node_id) \
1164 const struct i2c_dt_spec _i2c_dt_spec_##name = \
1165 I2C_DT_SPEC_GET(node_id); \
1166 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name)
1167
1177#define I2C_DT_INST_IODEV_DEFINE(name, inst) \
1178 I2C_DT_IODEV_DEFINE(name, DT_DRV_INST(inst))
1179
1190#define I2C_IODEV_DEFINE(name, _bus, _addr) \
1191 const struct i2c_dt_spec I2C_CAT2(_i2c_dt_spec_, name) = { \
1192 .bus = DEVICE_DT_GET(_bus), \
1193 .addr = _addr, \
1194 }; \
1195 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&I2C_CAT2(_i2c_dt_spec_, name))
1196
1205static inline bool i2c_is_ready_iodev(const struct rtio_iodev *i2c_iodev)
1206{
1207 struct i2c_dt_spec *spec = (struct i2c_dt_spec *)i2c_iodev->data;
1208
1209 return i2c_is_ready_dt(spec);
1210}
1211
1224 struct rtio_iodev *iodev,
1225 const struct i2c_msg *msgs,
1226 uint8_t num_msgs);
1227
1240 uint8_t reg_addr, uint8_t data);
1241
1255 uint8_t start_addr, void *buf, size_t num_bytes);
1256
1257#endif /* CONFIG_I2C_RTIO */
1258
1272static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
1273 struct i2c_msg *msgs, uint8_t num_msgs)
1274{
1275 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
1276}
1277
1290__syscall int i2c_recover_bus(const struct device *dev);
1291
1292static inline int z_impl_i2c_recover_bus(const struct device *dev)
1293{
1294 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1295
1296 if (api->recover_bus == NULL) {
1297 return -ENOSYS;
1298 }
1299
1300 return api->recover_bus(dev);
1301}
1302
1327static inline int i2c_target_register(const struct device *dev,
1328 struct i2c_target_config *cfg)
1329{
1330 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1331
1332 if (api->target_register == NULL) {
1333 return -ENOSYS;
1334 }
1335
1336 return api->target_register(dev, cfg);
1337}
1338
1355static inline int i2c_target_unregister(const struct device *dev,
1356 struct i2c_target_config *cfg)
1357{
1358 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1359
1360 if (api->target_unregister == NULL) {
1361 return -ENOSYS;
1362 }
1363
1364 return api->target_unregister(dev, cfg);
1365}
1366
1380__syscall int i2c_target_driver_register(const struct device *dev);
1381
1382static inline int z_impl_i2c_target_driver_register(const struct device *dev)
1383{
1384 return DEVICE_API_GET(i2c_target, dev)->driver_register(dev);
1385}
1386
1400__syscall int i2c_target_driver_unregister(const struct device *dev);
1401
1402static inline int z_impl_i2c_target_driver_unregister(const struct device *dev)
1403{
1404 return DEVICE_API_GET(i2c_target, dev)->driver_unregister(dev);
1405}
1406
1407/*
1408 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
1409 */
1410
1425static inline int i2c_write(const struct device *dev, const uint8_t *buf,
1426 uint32_t num_bytes, uint16_t addr)
1427{
1428 struct i2c_msg msg;
1429
1430 msg.buf = (uint8_t *)buf;
1431 msg.len = num_bytes;
1433
1434 return i2c_transfer(dev, &msg, 1, addr);
1435}
1436
1450static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
1451 const uint8_t *buf, uint32_t num_bytes)
1452{
1453 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
1454}
1455
1470static inline int i2c_read(const struct device *dev, uint8_t *buf,
1471 uint32_t num_bytes, uint16_t addr)
1472{
1473 struct i2c_msg msg;
1474
1475 msg.buf = buf;
1476 msg.len = num_bytes;
1478
1479 return i2c_transfer(dev, &msg, 1, addr);
1480}
1481
1495static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
1496 uint8_t *buf, uint32_t num_bytes)
1497{
1498 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
1499}
1500
1519static inline int i2c_write_read(const struct device *dev, uint16_t addr,
1520 const void *write_buf, size_t num_write,
1521 void *read_buf, size_t num_read)
1522{
1523 struct i2c_msg msg[2];
1524
1525 msg[0].buf = (uint8_t *)write_buf;
1526 msg[0].len = num_write;
1527 msg[0].flags = I2C_MSG_WRITE;
1528
1529 msg[1].buf = (uint8_t *)read_buf;
1530 msg[1].len = num_read;
1532
1533 return i2c_transfer(dev, msg, 2, addr);
1534}
1535
1553static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
1554 const void *write_buf, size_t num_write,
1555 void *read_buf, size_t num_read)
1556{
1557 return i2c_write_read(spec->bus, spec->addr,
1558 write_buf, num_write,
1559 read_buf, num_read);
1560}
1561
1580static inline int i2c_burst_read(const struct device *dev,
1581 uint16_t dev_addr,
1582 uint8_t start_addr,
1583 uint8_t *buf,
1584 uint32_t num_bytes)
1585{
1586 return i2c_write_read(dev, dev_addr,
1587 &start_addr, sizeof(start_addr),
1588 buf, num_bytes);
1589}
1590
1605static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
1606 uint8_t start_addr,
1607 uint8_t *buf,
1608 uint32_t num_bytes)
1609{
1610 return i2c_burst_read(spec->bus, spec->addr,
1611 start_addr, buf, num_bytes);
1612}
1613
1635static inline int i2c_burst_write(const struct device *dev,
1636 uint16_t dev_addr,
1637 uint8_t start_addr,
1638 const uint8_t *buf,
1639 uint32_t num_bytes)
1640{
1641 struct i2c_msg msg[2];
1642
1643 msg[0].buf = &start_addr;
1644 msg[0].len = 1U;
1645 msg[0].flags = I2C_MSG_WRITE;
1646
1647 msg[1].buf = (uint8_t *)buf;
1648 msg[1].len = num_bytes;
1649 msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1650
1651 return i2c_transfer(dev, msg, 2, dev_addr);
1652}
1653
1668static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
1669 uint8_t start_addr,
1670 const uint8_t *buf,
1671 uint32_t num_bytes)
1672{
1673 return i2c_burst_write(spec->bus, spec->addr,
1674 start_addr, buf, num_bytes);
1675}
1676
1692static inline int i2c_reg_read_byte(const struct device *dev,
1693 uint16_t dev_addr,
1694 uint8_t reg_addr, uint8_t *value)
1695{
1696 return i2c_write_read(dev, dev_addr,
1697 &reg_addr, sizeof(reg_addr),
1698 value, sizeof(*value));
1699}
1700
1714static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
1715 uint8_t reg_addr, uint8_t *value)
1716{
1717 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1718}
1719
1738static inline int i2c_reg_write_byte(const struct device *dev,
1739 uint16_t dev_addr,
1740 uint8_t reg_addr, uint8_t value)
1741{
1742 uint8_t tx_buf[2] = {reg_addr, value};
1743
1744 return i2c_write(dev, tx_buf, 2, dev_addr);
1745}
1746
1760static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
1761 uint8_t reg_addr, uint8_t value)
1762{
1763 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1764}
1765
1785static inline int i2c_reg_update_byte(const struct device *dev,
1786 uint8_t dev_addr,
1787 uint8_t reg_addr, uint8_t mask,
1788 uint8_t value)
1789{
1790 uint8_t old_value, new_value;
1791 int rc;
1792
1793 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
1794 if (rc != 0) {
1795 return rc;
1796 }
1797
1798 new_value = (old_value & ~mask) | (value & mask);
1799 if (new_value == old_value) {
1800 return 0;
1801 }
1802
1803 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
1804}
1805
1820static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
1821 uint8_t reg_addr, uint8_t mask,
1822 uint8_t value)
1823{
1824 return i2c_reg_update_byte(spec->bus, spec->addr,
1825 reg_addr, mask, value);
1826}
1827
1828#ifdef __cplusplus
1829}
1830#endif
1831
1835
1836#include <zephyr/syscalls/i2c.h>
1837
1838#endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_H_ */
workaround assembler barfing for ST r
Definition asm-macro-32-bit-gnu.h:24
#define DEVICE_API_GET(_class, _dev)
Expands to the pointer of a device's API for a given class.
Definition device.h:1425
System error numbers.
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:988
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:1668
static int i2c_target_unregister(const struct device *dev, struct i2c_target_config *cfg)
Unregisters the provided config as Target device.
Definition i2c.h:1355
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:1519
static bool i2c_is_reset_op(const struct i2c_msg *msg)
Check if the current message includes a restart.
Definition i2c.h:562
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:1137
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:347
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:1425
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:1450
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:1553
void(* i2c_target_error_cb_t)(struct i2c_target_config *config, enum i2c_error_reason error_code)
Function called when an error is detected on the I2C bus while acting as a target.
Definition i2c.h:456
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:1020
static bool i2c_is_stop_op(const struct i2c_msg *msg)
Check if the current message includes a stop.
Definition i2c.h:550
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:429
static bool i2c_is_ready_iodev(const struct rtio_iodev *i2c_iodev)
Validate that I2C bus is ready.
Definition i2c.h:1205
i2c_error_reason
I2C error reasons.
Definition i2c.h:437
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:1580
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:369
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:304
void i2c_iodev_submit_fallback(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe)
Fallback submit implementation.
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:1820
void(* i2c_callback_t)(const struct device *dev, int result, void *data)
I2C callback for asynchronous transfer requests.
Definition i2c.h:220
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:1495
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:325
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:1760
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:1738
#define I2C_MSG_READ
Read message from I2C bus.
Definition i2c.h:165
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:1714
int i2c_configure(const struct device *dev, uint32_t dev_config)
Configure operation of a host controller.
static int i2c_configure_dt(const struct i2c_dt_spec *spec, uint32_t dev_config)
Configure operation of a host controller.
Definition i2c.h:827
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:1061
#define I2C_MSG_RESTART
RESTART I2C transaction for this message.
Definition i2c.h:181
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:1272
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:1470
static bool i2c_is_read_op(const struct i2c_msg *msg)
Check if the current message is a read operation.
Definition i2c.h:538
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:1605
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:1327
int(* i2c_target_buf_read_requested_cb_t)(struct i2c_target_config *config, uint8_t **ptr, uint32_t *len)
Function called when a read from the device is initiated.
Definition i2c.h:411
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:948
#define I2C_MSG_STOP
Send STOP after this message.
Definition i2c.h:172
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:654
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:610
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:1097
void(* i2c_target_buf_write_received_cb_t)(struct i2c_target_config *config, uint8_t *ptr, uint32_t len)
Function called when a write to the device is completed.
Definition i2c.h:386
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:1785
const struct rtio_iodev_api i2c_iodev_api
struct rtio_sqe * i2c_rtio_copy_reg_write_byte(struct rtio *r, struct rtio_iodev *iodev, uint8_t reg_addr, uint8_t data)
Copy the register address and data to a SQE.
#define I2C_MSG_WRITE
Write message to I2C bus.
Definition i2c.h:162
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:1692
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:1635
struct rtio_sqe * i2c_rtio_copy_reg_burst_read(struct rtio *r, struct rtio_iodev *iodev, uint8_t start_addr, void *buf, size_t num_bytes)
acquire and configure a i2c burst read transmission
static bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
Validate that I2C bus is ready.
Definition i2c.h:525
@ I2C_ERROR_DMA
Definition i2c.h:441
@ I2C_ERROR_SIZE
Definition i2c.h:440
@ I2C_ERROR_GENERIC
Definition i2c.h:442
@ I2C_ERROR_TIMEOUT
Definition i2c.h:438
@ I2C_ERROR_ARBITRATION
Definition i2c.h:439
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 _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:154
#define CONTAINER_OF(ptr, type, field)
Get a pointer to a structure containing the element.
Definition util.h:281
#define EINVAL
Invalid argument.
Definition errno.h:60
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
Public kernel APIs.
flags
Definition parser.h:97
state
Definition parser_state.h:29
Real-Time IO device API for moving bytes with low effort.
Statistics.
#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:458
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
struct device_state * state
Address of the common device state.
Definition device.h:521
I2C specific device state which allows for i2c device class specific additions.
Definition i2c.h:642
struct stats_i2c stats
Definition i2c.h:644
struct device_state devstate
Definition i2c.h:643
Complete I2C DT information.
Definition i2c.h:95
const struct device * bus
Definition i2c.h:96
uint16_t addr
Definition i2c.h:97
One I2C Message.
Definition i2c.h:202
uint8_t * buf
Data buffer in bytes.
Definition i2c.h:204
uint32_t len
Length of buffer in bytes.
Definition i2c.h:207
uint8_t flags
Flags for this message.
Definition i2c.h:210
Structure providing callbacks to be implemented for devices that supports the I2C target API.
Definition i2c.h:465
i2c_target_read_requested_cb_t read_requested
Function called when a read from the device is initiated.
Definition i2c.h:469
i2c_target_write_received_cb_t write_received
Function called when a write to the device is continued.
Definition i2c.h:471
i2c_target_read_processed_cb_t read_processed
Function called when a read from the device is continued.
Definition i2c.h:473
i2c_target_write_requested_cb_t write_requested
Function called when a write to the device is initiated.
Definition i2c.h:467
i2c_target_stop_cb_t stop
Function called when a stop condition is observed after a start condition addressed to a particular d...
Definition i2c.h:487
i2c_target_buf_read_requested_cb_t buf_read_requested
Definition i2c.h:484
i2c_target_error_cb_t error
Function called when an error is detected on the I2C bus while acting as a target.
Definition i2c.h:489
i2c_target_buf_write_received_cb_t buf_write_received
Definition i2c.h:479
Structure describing a device that supports the I2C target API.
Definition i2c.h:503
uint8_t flags
Flags for the target device defined by I2C_TARGET_FLAGS_* constants.
Definition i2c.h:508
uint16_t address
Address for this target device.
Definition i2c.h:511
sys_snode_t node
Private, do not modify.
Definition i2c.h:505
const struct i2c_target_callbacks * callbacks
Callback functions.
Definition i2c.h:514
Definition kernel.h:6606
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
const uint8_t * buf
Buffer to write from.
Definition sqe.h:329
An RTIO context containing what can be viewed as a pair of queues.
Definition rtio.h:71
Macros to abstract toolchain specific capabilities.