Zephyr Project API 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
91#define I2C_DT_INST_TRANSFER_TIMEOUT_MS(inst) \
92 DT_INST_PROP_OR(inst, zephyr_transfer_timeout_ms, CONFIG_I2C_TRANSFER_TIMEOUT_MS)
93
106#define I2C_DT_INST_TRANSFER_TIMEOUT(inst) \
107 SYS_TIMEOUT_MS_INIT(((I2C_DT_INST_TRANSFER_TIMEOUT_MS(inst) != 0) \
108 ? I2C_DT_INST_TRANSFER_TIMEOUT_MS(inst) \
109 : SYS_FOREVER_MS))
110
112#define BUILD_ASSERT_INVALID_I2C_TRANSFER_TIMEOUT() \
113 BUILD_ASSERT(CONFIG_I2C_TRANSFER_TIMEOUT_MS != 0, \
114 "infinite i2c transfer timeout not unsupported")
115
116#endif /* CONFIG_I2C_TRANSFER_TIMEOUT_SUPPORTED */
117
123 const struct device *bus;
126};
127
138#define I2C_DT_SPEC_GET_ON_I3C(node_id) \
139 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
140 .addr = DT_PROP_BY_IDX(node_id, reg, 0)
141
152#define I2C_DT_SPEC_GET_ON_I2C(node_id) \
153 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
154 .addr = DT_REG_ADDR(node_id)
155
166#define I2C_DT_SPEC_GET(node_id) \
167 { \
168 COND_CODE_1(DT_ON_BUS(node_id, i3c), \
169 (I2C_DT_SPEC_GET_ON_I3C(node_id)), \
170 (I2C_DT_SPEC_GET_ON_I2C(node_id))) \
171 }
172
181#define I2C_DT_SPEC_INST_GET(inst) \
182 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
183
184
185/*
186 * I2C_MSG_* are I2C Message flags.
187 */
188
190#define I2C_MSG_WRITE (0U << 0U)
191
193#define I2C_MSG_READ BIT(0)
194
196#define I2C_MSG_RW_MASK BIT(0)
198
200#define I2C_MSG_STOP BIT(1)
201
209#define I2C_MSG_RESTART BIT(2)
210
214#define I2C_MSG_ADDR_10_BITS BIT(3)
215
240
248typedef void (*i2c_callback_t)(const struct device *dev, int result, void *data);
249
256struct i2c_target_config;
257
258typedef int (*i2c_api_configure_t)(const struct device *dev,
259 uint32_t dev_config);
260typedef int (*i2c_api_get_config_t)(const struct device *dev,
261 uint32_t *dev_config);
262typedef int (*i2c_api_full_io_t)(const struct device *dev,
263 struct i2c_msg *msgs,
264 uint8_t num_msgs,
265 uint16_t addr);
266typedef int (*i2c_api_target_register_t)(const struct device *dev,
267 struct i2c_target_config *cfg);
268typedef int (*i2c_api_target_unregister_t)(const struct device *dev,
269 struct i2c_target_config *cfg);
270
271#ifdef CONFIG_I2C_CALLBACK
272typedef int (*i2c_api_transfer_cb_t)(const struct device *dev,
273 struct i2c_msg *msgs,
274 uint8_t num_msgs,
275 uint16_t addr,
277 void *userdata);
278#endif /* CONFIG_I2C_CALLBACK */
279
280#ifdef CONFIG_I2C_RTIO
281typedef void (*i2c_api_iodev_submit)(const struct device *dev,
282 struct rtio_iodev_sqe *iodev_sqe);
283#endif /* CONFIG_I2C_RTIO */
284
285typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
286
287__subsystem struct i2c_driver_api {
288 i2c_api_configure_t configure;
289 i2c_api_get_config_t get_config;
290 i2c_api_full_io_t transfer;
291 i2c_api_target_register_t target_register;
292 i2c_api_target_unregister_t target_unregister;
293#ifdef CONFIG_I2C_CALLBACK
294 i2c_api_transfer_cb_t transfer_cb;
295#endif
296#ifdef CONFIG_I2C_RTIO
297 i2c_api_iodev_submit iodev_submit;
298#endif
299 i2c_api_recover_bus_t recover_bus;
300};
301
302typedef int (*i2c_target_api_register_t)(const struct device *dev);
303typedef int (*i2c_target_api_unregister_t)(const struct device *dev);
304
305__subsystem struct i2c_target_driver_api {
306 i2c_target_api_register_t driver_register;
307 i2c_target_api_unregister_t driver_unregister;
308};
309
313
315#define I2C_TARGET_FLAGS_ADDR_10_BITS BIT(0)
316
333 struct i2c_target_config *config);
334
353 struct i2c_target_config *config, uint8_t val);
354
375 struct i2c_target_config *config, uint8_t *val);
376
397 struct i2c_target_config *config, uint8_t *val);
398
399#if defined(CONFIG_I2C_TARGET_BUFFER_MODE) || defined(__DOXYGEN__)
414 struct i2c_target_config *config, uint8_t *ptr, uint32_t len);
415
439 struct i2c_target_config *config, uint8_t **ptr, uint32_t *len);
440#endif
441
456typedef int (*i2c_target_stop_cb_t)(struct i2c_target_config *config);
457
465 I2C_ERROR_TIMEOUT = 0, /* Timeout error */
466 I2C_ERROR_ARBITRATION, /* Bus arbitration size */
467 I2C_ERROR_SIZE, /* Bad frame size */
468 I2C_ERROR_DMA, /* DMA transfer error */
469 I2C_ERROR_GENERIC, /* Any other bus error */
470};
471
483typedef void (*i2c_target_error_cb_t)(struct i2c_target_config *config,
484 enum i2c_error_reason error_code);
485
518
543
552static inline bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
553{
554 /* Validate bus is ready */
555 return device_is_ready(spec->bus);
556}
557
565static inline bool i2c_is_read_op(const struct i2c_msg *msg)
566{
567 return (msg->flags & I2C_MSG_READ) == I2C_MSG_READ;
568}
569
577static inline bool i2c_is_stop_op(const struct i2c_msg *msg)
578{
579 return (msg->flags & I2C_MSG_STOP) == I2C_MSG_STOP;
580}
581
589static inline bool i2c_is_restart_op(const struct i2c_msg *msg)
590{
591 return (msg->flags & I2C_MSG_RESTART) == I2C_MSG_RESTART;
592}
593
620void i2c_dump_msgs_rw(const struct device *dev, const struct i2c_msg *msgs, uint8_t num_msgs,
621 uint16_t addr, bool dump_read);
622
637static inline void i2c_dump_msgs(const struct device *dev, const struct i2c_msg *msgs,
638 uint8_t num_msgs, uint16_t addr)
639{
640 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, false);
641}
642
643#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
644
645#include <zephyr/stats/stats.h>
646
648
650STATS_SECT_ENTRY32(bytes_read)
651STATS_SECT_ENTRY32(bytes_written)
652STATS_SECT_ENTRY32(message_count)
653STATS_SECT_ENTRY32(transfer_call_count)
655
657STATS_NAME(i2c, bytes_read)
658STATS_NAME(i2c, bytes_written)
659STATS_NAME(i2c, message_count)
660STATS_NAME(i2c, transfer_call_count)
661STATS_NAME_END(i2c);
662
664
665
671 struct stats_i2c stats;
672};
673
681static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
682 uint8_t num_msgs)
683{
684 struct i2c_device_state *state =
686 uint32_t bytes_read = 0U;
687 uint32_t bytes_written = 0U;
688
689 STATS_INC(state->stats, transfer_call_count);
690 STATS_INCN(state->stats, message_count, num_msgs);
691 for (uint8_t i = 0U; i < num_msgs; i++) {
692 if (msgs[i].flags & I2C_MSG_READ) {
693 bytes_read += msgs[i].len;
694 } else {
695 bytes_written += msgs[i].len;
696 }
697 }
698 STATS_INCN(state->stats, bytes_read, bytes_read);
699 STATS_INCN(state->stats, bytes_written, bytes_written);
700}
701
703
707#define Z_I2C_DEVICE_STATE_DEFINE(dev_id) \
708 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_id) \
709 __attribute__((__section__(".z_devstate")))
710
717#define Z_I2C_INIT_FN(dev_id, init_fn) \
718 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
719 { \
720 struct i2c_device_state *state = \
721 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
722 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
723 STATS_NAME_INIT_PARMS(i2c)); \
724 stats_register(dev->name, &(state->stats.s_hdr)); \
725 if (!is_null_no_warn(init_fn)) { \
726 return init_fn(dev); \
727 } \
728 \
729 return 0; \
730 }
731
733
763#define I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, \
764 data, config, level, prio, api, ...)\
765 Z_I2C_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
766 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
767 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
768 DEVICE_DT_NAME(node_id), \
769 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
770 deinit_fn, Z_DEVICE_DT_FLAGS(node_id), pm, data,\
771 config, level, prio, api, \
772 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
773 __VA_ARGS__)
774
775#else /* CONFIG_I2C_STATS */
776
777static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
778 uint8_t num_msgs)
779{
780 ARG_UNUSED(dev);
781 ARG_UNUSED(msgs);
782 ARG_UNUSED(num_msgs);
783}
784
785#define I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, \
786 data, config, level, prio, api, ...)\
787 DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, data, \
788 config, level, prio, api, __VA_ARGS__)
789
790#endif /* CONFIG_I2C_STATS */
791
795#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
796 prio, api, ...) \
797 I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, NULL, pm, data, \
798 config, level, prio, api, \
799 __VA_ARGS__)
800
809#define I2C_DEVICE_DT_INST_DEINIT_DEFINE(inst, ...) \
810 I2C_DEVICE_DT_DEINIT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
811
820#define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
821 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
822
833__syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
834
835static inline int z_impl_i2c_configure(const struct device *dev,
836 uint32_t dev_config)
837{
838 return DEVICE_API_GET(i2c, dev)->configure(dev, dev_config);
839}
840
854static inline int i2c_configure_dt(const struct i2c_dt_spec *spec,
855 uint32_t dev_config)
856{
857 return i2c_configure(spec->bus, dev_config);
858}
859
880__syscall int i2c_get_config(const struct device *dev, uint32_t *dev_config);
881
882static inline int z_impl_i2c_get_config(const struct device *dev, uint32_t *dev_config)
883{
884 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
885
886 if (api->get_config == NULL) {
887 return -ENOSYS;
888 }
889
890 return api->get_config(dev, dev_config);
891}
892
924__syscall int i2c_transfer(const struct device *dev,
925 struct i2c_msg *msgs, uint8_t num_msgs,
926 uint16_t addr);
927
928static inline int z_impl_i2c_transfer(const struct device *dev,
929 struct i2c_msg *msgs, uint8_t num_msgs,
930 uint16_t addr)
931{
932 if (!num_msgs) {
933 return 0;
934 }
935
936 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
937 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
938 }
939
940 int res = DEVICE_API_GET(i2c, dev)->transfer(dev, msgs, num_msgs, addr);
941
942 i2c_xfer_stats(dev, msgs, num_msgs);
943
944 if (IS_ENABLED(CONFIG_I2C_DUMP_MESSAGES)) {
945 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, true);
946 }
947
948 return res;
949}
950
951#if defined(CONFIG_I2C_CALLBACK) || defined(__DOXYGEN__)
952
975static inline int i2c_transfer_cb(const struct device *dev,
976 struct i2c_msg *msgs,
977 uint8_t num_msgs,
978 uint16_t addr,
980 void *userdata)
981{
982 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
983
984 if (api->transfer_cb == NULL) {
985 return -ENOSYS;
986 }
987
988 if (!num_msgs) {
989 cb(dev, 0, userdata);
990 return 0;
991 }
992
993 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
994 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
995 }
996
997 return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
998}
999
1015static inline int i2c_transfer_cb_dt(const struct i2c_dt_spec *spec,
1016 struct i2c_msg *msgs,
1017 uint8_t num_msgs,
1018 i2c_callback_t cb,
1019 void *userdata)
1020{
1021 return i2c_transfer_cb(spec->bus, msgs, num_msgs, spec->addr, cb, userdata);
1022}
1023
1046static inline int i2c_write_read_cb(const struct device *dev, struct i2c_msg *msgs,
1047 uint8_t num_msgs, uint16_t addr, const void *write_buf,
1048 size_t num_write, void *read_buf, size_t num_read,
1049 i2c_callback_t cb, void *userdata)
1050{
1051 if ((msgs == NULL) || (num_msgs != 2)) {
1052 return -EINVAL;
1053 }
1054
1055 msgs[0].buf = (uint8_t *)write_buf;
1056 msgs[0].len = num_write;
1057 msgs[0].flags = I2C_MSG_WRITE;
1058
1059 msgs[1].buf = (uint8_t *)read_buf;
1060 msgs[1].len = num_read;
1062
1063 return i2c_transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
1064}
1065
1087static inline int i2c_write_read_cb_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs,
1088 uint8_t num_msgs, const void *write_buf, size_t num_write,
1089 void *read_buf, size_t num_read, i2c_callback_t cb,
1090 void *userdata)
1091{
1092 return i2c_write_read_cb(spec->bus, msgs, num_msgs, spec->addr, write_buf, num_write,
1093 read_buf, num_read, cb, userdata);
1094}
1095
1096#if defined(CONFIG_POLL) || defined(__DOXYGEN__)
1097
1099void z_i2c_transfer_signal_cb(const struct device *dev, int result, void *userdata);
1101
1123static inline int i2c_transfer_signal(const struct device *dev,
1124 struct i2c_msg *msgs,
1125 uint8_t num_msgs,
1126 uint16_t addr,
1127 struct k_poll_signal *sig)
1128{
1129 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1130
1131 if (api->transfer_cb == NULL) {
1132 return -ENOSYS;
1133 }
1134
1135 return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
1136}
1137
1138#endif /* CONFIG_POLL */
1139
1140#endif /* CONFIG_I2C_CALLBACK */
1141
1142
1143#if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
1144
1155void i2c_iodev_submit_fallback(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe);
1156
1163static inline void i2c_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
1164{
1165 const struct i2c_dt_spec *dt_spec = (const struct i2c_dt_spec *)iodev_sqe->sqe.iodev->data;
1166 const struct device *dev = dt_spec->bus;
1167 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1168
1169 if (api->iodev_submit == NULL) {
1170 rtio_iodev_sqe_err(iodev_sqe, -ENOSYS);
1171 return;
1172 }
1173 api->iodev_submit(dt_spec->bus, iodev_sqe);
1174}
1175
1176extern const struct rtio_iodev_api i2c_iodev_api;
1177
1178#define I2C_CAT2(x, y) x ## y
1179
1189#define I2C_DT_IODEV_DEFINE(name, node_id) \
1190 const struct i2c_dt_spec _i2c_dt_spec_##name = \
1191 I2C_DT_SPEC_GET(node_id); \
1192 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name)
1193
1203#define I2C_DT_INST_IODEV_DEFINE(name, inst) \
1204 I2C_DT_IODEV_DEFINE(name, DT_DRV_INST(inst))
1205
1216#define I2C_IODEV_DEFINE(name, _bus, _addr) \
1217 const struct i2c_dt_spec I2C_CAT2(_i2c_dt_spec_, name) = { \
1218 .bus = DEVICE_DT_GET(_bus), \
1219 .addr = _addr, \
1220 }; \
1221 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&I2C_CAT2(_i2c_dt_spec_, name))
1222
1231static inline bool i2c_is_ready_iodev(const struct rtio_iodev *i2c_iodev)
1232{
1233 struct i2c_dt_spec *spec = (struct i2c_dt_spec *)i2c_iodev->data;
1234
1235 return i2c_is_ready_dt(spec);
1236}
1237
1250 struct rtio_iodev *iodev,
1251 const struct i2c_msg *msgs,
1252 uint8_t num_msgs);
1253
1266 uint8_t reg_addr, uint8_t data);
1267
1281 uint8_t start_addr, void *buf, size_t num_bytes);
1282
1283#endif /* CONFIG_I2C_RTIO */
1284
1298static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
1299 struct i2c_msg *msgs, uint8_t num_msgs)
1300{
1301 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
1302}
1303
1316__syscall int i2c_recover_bus(const struct device *dev);
1317
1318static inline int z_impl_i2c_recover_bus(const struct device *dev)
1319{
1320 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1321
1322 if (api->recover_bus == NULL) {
1323 return -ENOSYS;
1324 }
1325
1326 return api->recover_bus(dev);
1327}
1328
1353static inline int i2c_target_register(const struct device *dev,
1354 struct i2c_target_config *cfg)
1355{
1356 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1357
1358 if (api->target_register == NULL) {
1359 return -ENOSYS;
1360 }
1361
1362 return api->target_register(dev, cfg);
1363}
1364
1381static inline int i2c_target_unregister(const struct device *dev,
1382 struct i2c_target_config *cfg)
1383{
1384 const struct i2c_driver_api *api = DEVICE_API_GET(i2c, dev);
1385
1386 if (api->target_unregister == NULL) {
1387 return -ENOSYS;
1388 }
1389
1390 return api->target_unregister(dev, cfg);
1391}
1392
1406__syscall int i2c_target_driver_register(const struct device *dev);
1407
1408static inline int z_impl_i2c_target_driver_register(const struct device *dev)
1409{
1410 return DEVICE_API_GET(i2c_target, dev)->driver_register(dev);
1411}
1412
1426__syscall int i2c_target_driver_unregister(const struct device *dev);
1427
1428static inline int z_impl_i2c_target_driver_unregister(const struct device *dev)
1429{
1430 return DEVICE_API_GET(i2c_target, dev)->driver_unregister(dev);
1431}
1432
1433/*
1434 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
1435 */
1436
1451static inline int i2c_write(const struct device *dev, const uint8_t *buf,
1452 uint32_t num_bytes, uint16_t addr)
1453{
1454 struct i2c_msg msg;
1455
1456 msg.buf = (uint8_t *)buf;
1457 msg.len = num_bytes;
1459
1460 return i2c_transfer(dev, &msg, 1, addr);
1461}
1462
1476static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
1477 const uint8_t *buf, uint32_t num_bytes)
1478{
1479 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
1480}
1481
1496static inline int i2c_read(const struct device *dev, uint8_t *buf,
1497 uint32_t num_bytes, uint16_t addr)
1498{
1499 struct i2c_msg msg;
1500
1501 msg.buf = buf;
1502 msg.len = num_bytes;
1504
1505 return i2c_transfer(dev, &msg, 1, addr);
1506}
1507
1521static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
1522 uint8_t *buf, uint32_t num_bytes)
1523{
1524 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
1525}
1526
1544static inline int i2c_write_read(const struct device *dev, uint16_t addr,
1545 const void *write_buf, size_t num_write,
1546 void *read_buf, size_t num_read)
1547{
1548 struct i2c_msg msg[2];
1549
1550 msg[0].buf = (uint8_t *)write_buf;
1551 msg[0].len = num_write;
1552 msg[0].flags = I2C_MSG_WRITE;
1553
1554 msg[1].buf = (uint8_t *)read_buf;
1555 msg[1].len = num_read;
1557
1558 return i2c_transfer(dev, msg, 2, addr);
1559}
1560
1578static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
1579 const void *write_buf, size_t num_write,
1580 void *read_buf, size_t num_read)
1581{
1582 return i2c_write_read(spec->bus, spec->addr,
1583 write_buf, num_write,
1584 read_buf, num_read);
1585}
1586
1605static inline int i2c_burst_read(const struct device *dev,
1606 uint16_t dev_addr,
1607 uint8_t start_addr,
1608 uint8_t *buf,
1609 uint32_t num_bytes)
1610{
1611 return i2c_write_read(dev, dev_addr,
1612 &start_addr, sizeof(start_addr),
1613 buf, num_bytes);
1614}
1615
1630static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
1631 uint8_t start_addr,
1632 uint8_t *buf,
1633 uint32_t num_bytes)
1634{
1635 return i2c_burst_read(spec->bus, spec->addr,
1636 start_addr, buf, num_bytes);
1637}
1638
1660static inline int i2c_burst_write(const struct device *dev,
1661 uint16_t dev_addr,
1662 uint8_t start_addr,
1663 const uint8_t *buf,
1664 uint32_t num_bytes)
1665{
1666 struct i2c_msg msg[2];
1667
1668 msg[0].buf = &start_addr;
1669 msg[0].len = 1U;
1670 msg[0].flags = I2C_MSG_WRITE;
1671
1672 msg[1].buf = (uint8_t *)buf;
1673 msg[1].len = num_bytes;
1674 msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1675
1676 return i2c_transfer(dev, msg, 2, dev_addr);
1677}
1678
1693static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
1694 uint8_t start_addr,
1695 const uint8_t *buf,
1696 uint32_t num_bytes)
1697{
1698 return i2c_burst_write(spec->bus, spec->addr,
1699 start_addr, buf, num_bytes);
1700}
1701
1717static inline int i2c_reg_read_byte(const struct device *dev,
1718 uint16_t dev_addr,
1719 uint8_t reg_addr, uint8_t *value)
1720{
1721 return i2c_write_read(dev, dev_addr,
1722 &reg_addr, sizeof(reg_addr),
1723 value, sizeof(*value));
1724}
1725
1739static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
1740 uint8_t reg_addr, uint8_t *value)
1741{
1742 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1743}
1744
1763static inline int i2c_reg_write_byte(const struct device *dev,
1764 uint16_t dev_addr,
1765 uint8_t reg_addr, uint8_t value)
1766{
1767 uint8_t tx_buf[2] = {reg_addr, value};
1768
1769 return i2c_write(dev, tx_buf, 2, dev_addr);
1770}
1771
1785static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
1786 uint8_t reg_addr, uint8_t value)
1787{
1788 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1789}
1790
1810static inline int i2c_reg_update_byte(const struct device *dev,
1811 uint8_t dev_addr,
1812 uint8_t reg_addr, uint8_t mask,
1813 uint8_t value)
1814{
1815 uint8_t old_value, new_value;
1816 int rc;
1817
1818 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
1819 if (rc != 0) {
1820 return rc;
1821 }
1822
1823 new_value = (old_value & ~mask) | (value & mask);
1824 if (new_value == old_value) {
1825 return 0;
1826 }
1827
1828 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
1829}
1830
1845static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
1846 uint8_t reg_addr, uint8_t mask,
1847 uint8_t value)
1848{
1849 return i2c_reg_update_byte(spec->bus, spec->addr,
1850 reg_addr, mask, value);
1851}
1852
1853#ifdef __cplusplus
1854}
1855#endif
1856
1860
1861#include <zephyr/syscalls/i2c.h>
1862
1863#endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_H_ */
workaround assembler barfing for ST r
Definition asm-macro-32-bit-gnu.h:27
#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:1015
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:1693
static int i2c_target_unregister(const struct device *dev, struct i2c_target_config *cfg)
Unregisters the provided config as Target device.
Definition i2c.h:1381
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:1544
static bool i2c_is_restart_op(const struct i2c_msg *msg)
Check if the current message includes a restart.
Definition i2c.h:589
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:1163
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:374
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:1451
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:1476
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:1578
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:483
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:1046
static bool i2c_is_stop_op(const struct i2c_msg *msg)
Check if the current message includes a stop.
Definition i2c.h:577
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:456
static bool i2c_is_ready_iodev(const struct rtio_iodev *i2c_iodev)
Validate that I2C bus is ready.
Definition i2c.h:1231
i2c_error_reason
I2C error reasons.
Definition i2c.h:464
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:1605
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:396
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:332
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:1845
void(* i2c_callback_t)(const struct device *dev, int result, void *data)
I2C callback for asynchronous transfer requests.
Definition i2c.h:248
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:1521
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:352
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:1785
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:1763
#define I2C_MSG_READ
Read message from I2C bus.
Definition i2c.h:193
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:1739
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:854
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:1087
#define I2C_MSG_RESTART
RESTART I2C transaction for this message.
Definition i2c.h:209
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:1298
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:1496
static bool i2c_is_read_op(const struct i2c_msg *msg)
Check if the current message is a read operation.
Definition i2c.h:565
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:1630
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:1353
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:438
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:975
#define I2C_MSG_STOP
Send STOP after this message.
Definition i2c.h:200
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:681
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:637
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:1123
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:413
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:1810
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:190
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:1717
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:1660
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:552
@ I2C_ERROR_DMA
Definition i2c.h:468
@ I2C_ERROR_SIZE
Definition i2c.h:467
@ I2C_ERROR_GENERIC
Definition i2c.h:469
@ I2C_ERROR_TIMEOUT
Definition i2c.h:465
@ I2C_ERROR_ARBITRATION
Definition i2c.h:466
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:673
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:42
#define STATS_SECT_END
Ends a stats group struct definition.
Definition stats.h:169
#define STATS_NAME(sectname__, entry__)
Add an entry name to a statistics entry name map.
Definition stats.h:519
#define STATS_SECT_ENTRY32(var__)
Declares a 32-bit stat entry inside a group struct.
Definition stats.h:204
#define STATS_NAME_START(sectname__)
Begin a statistics entry name map.
Definition stats.h:510
#define STATS_NAME_END(sectname__)
End a statistics entry name map.
Definition stats.h:527
#define STATS_INC(group__, var__)
Increments a statistic entry.
Definition stats.h:255
#define STATS_INCN(group__, var__, n__)
Increases a statistic entry by the specified amount.
Definition stats.h:243
#define STATS_SECT_START(group__)
Begins a stats group struct definition.
Definition stats.h:181
#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:61
#define ENOSYS
Function not implemented.
Definition errno.h:83
#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.
Header file for the single-linked list API.
Statistics.
__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:669
struct stats_i2c stats
Definition i2c.h:671
struct device_state devstate
Definition i2c.h:670
Complete I2C DT information.
Definition i2c.h:121
const struct device * bus
I2C bus.
Definition i2c.h:123
uint16_t addr
Target address.
Definition i2c.h:125
One I2C Message.
Definition i2c.h:230
uint8_t * buf
Data buffer in bytes.
Definition i2c.h:232
uint32_t len
Length of buffer in bytes.
Definition i2c.h:235
uint8_t flags
Flags for this message.
Definition i2c.h:238
Structure providing callbacks to be implemented for devices that supports the I2C target API.
Definition i2c.h:492
i2c_target_read_requested_cb_t read_requested
Function called when a read from the device is initiated.
Definition i2c.h:496
i2c_target_write_received_cb_t write_received
Function called when a write to the device is continued.
Definition i2c.h:498
i2c_target_read_processed_cb_t read_processed
Function called when a read from the device is continued.
Definition i2c.h:500
i2c_target_write_requested_cb_t write_requested
Function called when a write to the device is initiated.
Definition i2c.h:494
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:514
i2c_target_buf_read_requested_cb_t buf_read_requested
Definition i2c.h:511
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:516
i2c_target_buf_write_received_cb_t buf_write_received
Definition i2c.h:506
Structure describing a device that supports the I2C target API.
Definition i2c.h:530
uint8_t flags
Flags for the target device defined by I2C_TARGET_FLAGS_* constants.
Definition i2c.h:535
uint16_t address
Address for this target device.
Definition i2c.h:538
sys_snode_t node
Private, do not modify.
Definition i2c.h:532
const struct i2c_target_callbacks * callbacks
Callback functions.
Definition i2c.h:541
Poll signal object.
Definition kernel.h:6798
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:70
Macros to abstract toolchain specific capabilities.