Zephyr Project API 4.2.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
13#ifndef ZEPHYR_INCLUDE_DRIVERS_I2C_H_
14#define ZEPHYR_INCLUDE_DRIVERS_I2C_H_
15
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
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37/*
38 * The following #defines are used to configure the I2C controller.
39 */
40
42#define I2C_SPEED_STANDARD (0x1U)
43
45#define I2C_SPEED_FAST (0x2U)
46
48#define I2C_SPEED_FAST_PLUS (0x3U)
49
51#define I2C_SPEED_HIGH (0x4U)
52
54#define I2C_SPEED_ULTRA (0x5U)
55
57#define I2C_SPEED_DT (0x7U)
58
59#define I2C_SPEED_SHIFT (1U)
60#define I2C_SPEED_SET(speed) (((speed) << I2C_SPEED_SHIFT) \
61 & I2C_SPEED_MASK)
62#define I2C_SPEED_MASK (0x7U << I2C_SPEED_SHIFT) /* 3 bits */
63#define I2C_SPEED_GET(cfg) (((cfg) & I2C_SPEED_MASK) \
64 >> I2C_SPEED_SHIFT)
65
67#define I2C_ADDR_10_BITS BIT(0)
68
70#define I2C_MODE_CONTROLLER BIT(4)
71
79 const struct device *bus;
81};
82
93#define I2C_DT_SPEC_GET_ON_I3C(node_id) \
94 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
95 .addr = DT_PROP_BY_IDX(node_id, reg, 0)
96
107#define I2C_DT_SPEC_GET_ON_I2C(node_id) \
108 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
109 .addr = DT_REG_ADDR(node_id)
110
121#define I2C_DT_SPEC_GET(node_id) \
122 { \
123 COND_CODE_1(DT_ON_BUS(node_id, i3c), \
124 (I2C_DT_SPEC_GET_ON_I3C(node_id)), \
125 (I2C_DT_SPEC_GET_ON_I2C(node_id))) \
126 }
127
136#define I2C_DT_SPEC_INST_GET(inst) \
137 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
138
139
140/*
141 * I2C_MSG_* are I2C Message flags.
142 */
143
145#define I2C_MSG_WRITE (0U << 0U)
146
148#define I2C_MSG_READ BIT(0)
149
151#define I2C_MSG_RW_MASK BIT(0)
155#define I2C_MSG_STOP BIT(1)
156
164#define I2C_MSG_RESTART BIT(2)
165
169#define I2C_MSG_ADDR_10_BITS BIT(3)
170
195
203typedef void (*i2c_callback_t)(const struct device *dev, int result, void *data);
204
211struct i2c_target_config;
212
213typedef int (*i2c_api_configure_t)(const struct device *dev,
214 uint32_t dev_config);
215typedef int (*i2c_api_get_config_t)(const struct device *dev,
216 uint32_t *dev_config);
217typedef int (*i2c_api_full_io_t)(const struct device *dev,
218 struct i2c_msg *msgs,
219 uint8_t num_msgs,
220 uint16_t addr);
221typedef int (*i2c_api_target_register_t)(const struct device *dev,
222 struct i2c_target_config *cfg);
223typedef int (*i2c_api_target_unregister_t)(const struct device *dev,
224 struct i2c_target_config *cfg);
225#ifdef CONFIG_I2C_CALLBACK
226typedef int (*i2c_api_transfer_cb_t)(const struct device *dev,
227 struct i2c_msg *msgs,
228 uint8_t num_msgs,
229 uint16_t addr,
231 void *userdata);
232#endif /* CONFIG_I2C_CALLBACK */
233#if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
234
239typedef void (*i2c_api_iodev_submit)(const struct device *dev,
240 struct rtio_iodev_sqe *iodev_sqe);
241#endif /* CONFIG_I2C_RTIO */
242
243typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
244
245__subsystem struct i2c_driver_api {
246 i2c_api_configure_t configure;
247 i2c_api_get_config_t get_config;
248 i2c_api_full_io_t transfer;
249 i2c_api_target_register_t target_register;
250 i2c_api_target_unregister_t target_unregister;
251#ifdef CONFIG_I2C_CALLBACK
252 i2c_api_transfer_cb_t transfer_cb;
253#endif
254#ifdef CONFIG_I2C_RTIO
255 i2c_api_iodev_submit iodev_submit;
256#endif
257 i2c_api_recover_bus_t recover_bus;
258};
259
260typedef int (*i2c_target_api_register_t)(const struct device *dev);
261typedef int (*i2c_target_api_unregister_t)(const struct device *dev);
262
263__subsystem struct i2c_target_driver_api {
264 i2c_target_api_register_t driver_register;
265 i2c_target_api_unregister_t driver_unregister;
266};
267
273#define I2C_TARGET_FLAGS_ADDR_10_BITS BIT(0)
274
291 struct i2c_target_config *config);
292
312 struct i2c_target_config *config, uint8_t val);
313
334 struct i2c_target_config *config, uint8_t *val);
335
356 struct i2c_target_config *config, uint8_t *val);
357
358#ifdef CONFIG_I2C_TARGET_BUFFER_MODE
372typedef void (*i2c_target_buf_write_received_cb_t)(
373 struct i2c_target_config *config, uint8_t *ptr, uint32_t len);
374
397typedef int (*i2c_target_buf_read_requested_cb_t)(
398 struct i2c_target_config *config, uint8_t **ptr, uint32_t *len);
399#endif
400
415typedef int (*i2c_target_stop_cb_t)(struct i2c_target_config *config);
416
424 I2C_ERROR_TIMEOUT = 0, /* Timeout error */
425 I2C_ERROR_ARBITRATION, /* Bus arbitration size */
426 I2C_ERROR_SIZE, /* Bad frame size */
427 I2C_ERROR_DMA, /* DMA transfer error */
428 I2C_ERROR_GENERIC, /* Any other bus error */
429};
430
442typedef void (*i2c_target_error_cb_t)(struct i2c_target_config *config,
443 enum i2c_error_reason error_code);
444
456#ifdef CONFIG_I2C_TARGET_BUFFER_MODE
457 i2c_target_buf_write_received_cb_t buf_write_received;
458 i2c_target_buf_read_requested_cb_t buf_read_requested;
459#endif
462};
463
488
497static inline bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
498{
499 /* Validate bus is ready */
500 return device_is_ready(spec->bus);
501}
502
510static inline bool i2c_is_read_op(const struct i2c_msg *msg)
511{
512 return (msg->flags & I2C_MSG_READ) == I2C_MSG_READ;
513}
514
522static inline bool i2c_is_stop_op(const struct i2c_msg *msg)
523{
524 return (msg->flags & I2C_MSG_STOP) == I2C_MSG_STOP;
525}
526
553void i2c_dump_msgs_rw(const struct device *dev, const struct i2c_msg *msgs, uint8_t num_msgs,
554 uint16_t addr, bool dump_read);
555
570static inline void i2c_dump_msgs(const struct device *dev, const struct i2c_msg *msgs,
571 uint8_t num_msgs, uint16_t addr)
572{
573 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, false);
574}
575
576#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
577
578#include <zephyr/stats/stats.h>
579
583STATS_SECT_ENTRY32(bytes_read)
584STATS_SECT_ENTRY32(bytes_written)
585STATS_SECT_ENTRY32(message_count)
586STATS_SECT_ENTRY32(transfer_call_count)
588
590STATS_NAME(i2c, bytes_read)
591STATS_NAME(i2c, bytes_written)
592STATS_NAME(i2c, message_count)
593STATS_NAME(i2c, transfer_call_count)
594STATS_NAME_END(i2c);
595
604 struct stats_i2c stats;
605};
606
614static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
615 uint8_t num_msgs)
616{
617 struct i2c_device_state *state =
619 uint32_t bytes_read = 0U;
620 uint32_t bytes_written = 0U;
621
622 STATS_INC(state->stats, transfer_call_count);
623 STATS_INCN(state->stats, message_count, num_msgs);
624 for (uint8_t i = 0U; i < num_msgs; i++) {
625 if (msgs[i].flags & I2C_MSG_READ) {
626 bytes_read += msgs[i].len;
627 } else {
628 bytes_written += msgs[i].len;
629 }
630 }
631 STATS_INCN(state->stats, bytes_read, bytes_read);
632 STATS_INCN(state->stats, bytes_written, bytes_written);
633}
634
640#define Z_I2C_DEVICE_STATE_DEFINE(dev_id) \
641 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_id) \
642 __attribute__((__section__(".z_devstate")))
643
650#define Z_I2C_INIT_FN(dev_id, init_fn) \
651 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
652 { \
653 struct i2c_device_state *state = \
654 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
655 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
656 STATS_NAME_INIT_PARMS(i2c)); \
657 stats_register(dev->name, &(state->stats.s_hdr)); \
658 if (!is_null_no_warn(init_fn)) { \
659 return init_fn(dev); \
660 } \
661 \
662 return 0; \
663 }
664
696#define I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, \
697 data, config, level, prio, api, ...)\
698 Z_I2C_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
699 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
700 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
701 DEVICE_DT_NAME(node_id), \
702 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
703 deinit_fn, Z_DEVICE_DT_FLAGS(node_id), pm, data,\
704 config, level, prio, api, \
705 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
706 __VA_ARGS__)
707
708#else /* CONFIG_I2C_STATS */
709
710static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
711 uint8_t num_msgs)
712{
713 ARG_UNUSED(dev);
714 ARG_UNUSED(msgs);
715 ARG_UNUSED(num_msgs);
716}
717
718#define I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, \
719 data, config, level, prio, api, ...)\
720 DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, deinit_fn, pm, data, \
721 config, level, prio, api, __VA_ARGS__)
722
723#endif /* CONFIG_I2C_STATS */
724
728#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
729 prio, api, ...) \
730 I2C_DEVICE_DT_DEINIT_DEFINE(node_id, init_fn, NULL, pm, data, \
731 config, level, prio, api, \
732 __VA_ARGS__)
733
742#define I2C_DEVICE_DT_INST_DEINIT_DEFINE(inst, ...) \
743 I2C_DEVICE_DT_DEINIT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
744
753#define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
754 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
755
766__syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
767
768static inline int z_impl_i2c_configure(const struct device *dev,
769 uint32_t dev_config)
770{
771 const struct i2c_driver_api *api =
772 (const struct i2c_driver_api *)dev->api;
773
774 return api->configure(dev, dev_config);
775}
776
790static inline int i2c_configure_dt(const struct i2c_dt_spec *spec,
791 uint32_t dev_config)
792{
793 return i2c_configure(spec->bus, dev_config);
794}
795
816__syscall int i2c_get_config(const struct device *dev, uint32_t *dev_config);
817
818static inline int z_impl_i2c_get_config(const struct device *dev, uint32_t *dev_config)
819{
820 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
821
822 if (api->get_config == NULL) {
823 return -ENOSYS;
824 }
825
826 return api->get_config(dev, dev_config);
827}
828
860__syscall int i2c_transfer(const struct device *dev,
861 struct i2c_msg *msgs, uint8_t num_msgs,
862 uint16_t addr);
863
864static inline int z_impl_i2c_transfer(const struct device *dev,
865 struct i2c_msg *msgs, uint8_t num_msgs,
866 uint16_t addr)
867{
868 const struct i2c_driver_api *api =
869 (const struct i2c_driver_api *)dev->api;
870
871 if (!num_msgs) {
872 return 0;
873 }
874
875 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
876 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
877 }
878
879 int res = api->transfer(dev, msgs, num_msgs, addr);
880
881 i2c_xfer_stats(dev, msgs, num_msgs);
882
883 if (IS_ENABLED(CONFIG_I2C_DUMP_MESSAGES)) {
884 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, true);
885 }
886
887 return res;
888}
889
890#if defined(CONFIG_I2C_CALLBACK) || defined(__DOXYGEN__)
891
914static inline int i2c_transfer_cb(const struct device *dev,
915 struct i2c_msg *msgs,
916 uint8_t num_msgs,
917 uint16_t addr,
919 void *userdata)
920{
921 const struct i2c_driver_api *api =
922 (const struct i2c_driver_api *)dev->api;
923
924 if (api->transfer_cb == NULL) {
925 return -ENOSYS;
926 }
927
928 if (!num_msgs) {
929 cb(dev, 0, userdata);
930 return 0;
931 }
932
933 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
934 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
935 }
936
937 return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
938}
939
955static inline int i2c_transfer_cb_dt(const struct i2c_dt_spec *spec,
956 struct i2c_msg *msgs,
957 uint8_t num_msgs,
959 void *userdata)
960{
961 return i2c_transfer_cb(spec->bus, msgs, num_msgs, spec->addr, cb, userdata);
962}
963
987static inline int i2c_write_read_cb(const struct device *dev, struct i2c_msg *msgs,
988 uint8_t num_msgs, uint16_t addr, const void *write_buf,
989 size_t num_write, void *read_buf, size_t num_read,
990 i2c_callback_t cb, void *userdata)
991{
992 if ((msgs == NULL) || (num_msgs != 2)) {
993 return -EINVAL;
994 }
995
996 msgs[0].buf = (uint8_t *)write_buf;
997 msgs[0].len = num_write;
998 msgs[0].flags = I2C_MSG_WRITE;
999
1000 msgs[1].buf = (uint8_t *)read_buf;
1001 msgs[1].len = num_read;
1003
1004 return i2c_transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
1005}
1006
1028static inline int i2c_write_read_cb_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs,
1029 uint8_t num_msgs, const void *write_buf, size_t num_write,
1030 void *read_buf, size_t num_read, i2c_callback_t cb,
1031 void *userdata)
1032{
1033 return i2c_write_read_cb(spec->bus, msgs, num_msgs, spec->addr, write_buf, num_write,
1034 read_buf, num_read, cb, userdata);
1035}
1036
1037#if defined(CONFIG_POLL) || defined(__DOXYGEN__)
1038
1040void z_i2c_transfer_signal_cb(const struct device *dev, int result, void *userdata);
1064static inline int i2c_transfer_signal(const struct device *dev,
1065 struct i2c_msg *msgs,
1066 uint8_t num_msgs,
1067 uint16_t addr,
1068 struct k_poll_signal *sig)
1069{
1070 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
1071
1072 if (api->transfer_cb == NULL) {
1073 return -ENOSYS;
1074 }
1075
1076 return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
1077}
1078
1079#endif /* CONFIG_POLL */
1080
1081#endif /* CONFIG_I2C_CALLBACK */
1082
1083
1084#if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
1085
1096void i2c_iodev_submit_fallback(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe);
1097
1104static inline void i2c_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
1105{
1106 const struct i2c_dt_spec *dt_spec = (const struct i2c_dt_spec *)iodev_sqe->sqe.iodev->data;
1107 const struct device *dev = dt_spec->bus;
1108 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
1109
1110 if (api->iodev_submit == NULL) {
1111 rtio_iodev_sqe_err(iodev_sqe, -ENOSYS);
1112 return;
1113 }
1114 api->iodev_submit(dt_spec->bus, iodev_sqe);
1115}
1116
1117extern const struct rtio_iodev_api i2c_iodev_api;
1118
1119#define I2C_CAT2(x, y) x ## y
1120
1130#define I2C_DT_IODEV_DEFINE(name, node_id) \
1131 const struct i2c_dt_spec _i2c_dt_spec_##name = \
1132 I2C_DT_SPEC_GET(node_id); \
1133 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name)
1134
1145#define I2C_IODEV_DEFINE(name, _bus, _addr) \
1146 const struct i2c_dt_spec I2C_CAT2(_i2c_dt_spec_, name) = { \
1147 .bus = DEVICE_DT_GET(_bus), \
1148 .addr = _addr, \
1149 }; \
1150 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&I2C_CAT2(_i2c_dt_spec_, name))
1151
1160static inline bool i2c_is_ready_iodev(const struct rtio_iodev *i2c_iodev)
1161{
1162 struct i2c_dt_spec *spec = (struct i2c_dt_spec *)i2c_iodev->data;
1163
1164 return i2c_is_ready_dt(spec);
1165}
1166
1179 struct rtio_iodev *iodev,
1180 const struct i2c_msg *msgs,
1181 uint8_t num_msgs);
1182
1195 uint8_t reg_addr, uint8_t data);
1196
1210 uint8_t start_addr, void *buf, size_t num_bytes);
1211
1212#endif /* CONFIG_I2C_RTIO */
1213
1227static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
1228 struct i2c_msg *msgs, uint8_t num_msgs)
1229{
1230 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
1231}
1232
1245__syscall int i2c_recover_bus(const struct device *dev);
1246
1247static inline int z_impl_i2c_recover_bus(const struct device *dev)
1248{
1249 const struct i2c_driver_api *api =
1250 (const struct i2c_driver_api *)dev->api;
1251
1252 if (api->recover_bus == NULL) {
1253 return -ENOSYS;
1254 }
1255
1256 return api->recover_bus(dev);
1257}
1258
1283static inline int i2c_target_register(const struct device *dev,
1284 struct i2c_target_config *cfg)
1285{
1286 const struct i2c_driver_api *api =
1287 (const struct i2c_driver_api *)dev->api;
1288
1289 if (api->target_register == NULL) {
1290 return -ENOSYS;
1291 }
1292
1293 return api->target_register(dev, cfg);
1294}
1295
1312static inline int i2c_target_unregister(const struct device *dev,
1313 struct i2c_target_config *cfg)
1314{
1315 const struct i2c_driver_api *api =
1316 (const struct i2c_driver_api *)dev->api;
1317
1318 if (api->target_unregister == NULL) {
1319 return -ENOSYS;
1320 }
1321
1322 return api->target_unregister(dev, cfg);
1323}
1324
1338__syscall int i2c_target_driver_register(const struct device *dev);
1339
1340static inline int z_impl_i2c_target_driver_register(const struct device *dev)
1341{
1342 const struct i2c_target_driver_api *api =
1343 (const struct i2c_target_driver_api *)dev->api;
1344
1345 return api->driver_register(dev);
1346}
1347
1361__syscall int i2c_target_driver_unregister(const struct device *dev);
1362
1363static inline int z_impl_i2c_target_driver_unregister(const struct device *dev)
1364{
1365 const struct i2c_target_driver_api *api =
1366 (const struct i2c_target_driver_api *)dev->api;
1367
1368 return api->driver_unregister(dev);
1369}
1370
1371/*
1372 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
1373 */
1374
1389static inline int i2c_write(const struct device *dev, const uint8_t *buf,
1390 uint32_t num_bytes, uint16_t addr)
1391{
1392 struct i2c_msg msg;
1393
1394 msg.buf = (uint8_t *)buf;
1395 msg.len = num_bytes;
1397
1398 return i2c_transfer(dev, &msg, 1, addr);
1399}
1400
1414static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
1415 const uint8_t *buf, uint32_t num_bytes)
1416{
1417 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
1418}
1419
1434static inline int i2c_read(const struct device *dev, uint8_t *buf,
1435 uint32_t num_bytes, uint16_t addr)
1436{
1437 struct i2c_msg msg;
1438
1439 msg.buf = buf;
1440 msg.len = num_bytes;
1442
1443 return i2c_transfer(dev, &msg, 1, addr);
1444}
1445
1459static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
1460 uint8_t *buf, uint32_t num_bytes)
1461{
1462 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
1463}
1464
1483static inline int i2c_write_read(const struct device *dev, uint16_t addr,
1484 const void *write_buf, size_t num_write,
1485 void *read_buf, size_t num_read)
1486{
1487 struct i2c_msg msg[2];
1488
1489 msg[0].buf = (uint8_t *)write_buf;
1490 msg[0].len = num_write;
1491 msg[0].flags = I2C_MSG_WRITE;
1492
1493 msg[1].buf = (uint8_t *)read_buf;
1494 msg[1].len = num_read;
1496
1497 return i2c_transfer(dev, msg, 2, addr);
1498}
1499
1517static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
1518 const void *write_buf, size_t num_write,
1519 void *read_buf, size_t num_read)
1520{
1521 return i2c_write_read(spec->bus, spec->addr,
1522 write_buf, num_write,
1523 read_buf, num_read);
1524}
1525
1544static inline int i2c_burst_read(const struct device *dev,
1545 uint16_t dev_addr,
1546 uint8_t start_addr,
1547 uint8_t *buf,
1548 uint32_t num_bytes)
1549{
1550 return i2c_write_read(dev, dev_addr,
1551 &start_addr, sizeof(start_addr),
1552 buf, num_bytes);
1553}
1554
1569static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
1570 uint8_t start_addr,
1571 uint8_t *buf,
1572 uint32_t num_bytes)
1573{
1574 return i2c_burst_read(spec->bus, spec->addr,
1575 start_addr, buf, num_bytes);
1576}
1577
1599static inline int i2c_burst_write(const struct device *dev,
1600 uint16_t dev_addr,
1601 uint8_t start_addr,
1602 const uint8_t *buf,
1603 uint32_t num_bytes)
1604{
1605 struct i2c_msg msg[2];
1606
1607 msg[0].buf = &start_addr;
1608 msg[0].len = 1U;
1609 msg[0].flags = I2C_MSG_WRITE;
1610
1611 msg[1].buf = (uint8_t *)buf;
1612 msg[1].len = num_bytes;
1613 msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1614
1615 return i2c_transfer(dev, msg, 2, dev_addr);
1616}
1617
1632static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
1633 uint8_t start_addr,
1634 const uint8_t *buf,
1635 uint32_t num_bytes)
1636{
1637 return i2c_burst_write(spec->bus, spec->addr,
1638 start_addr, buf, num_bytes);
1639}
1640
1656static inline int i2c_reg_read_byte(const struct device *dev,
1657 uint16_t dev_addr,
1658 uint8_t reg_addr, uint8_t *value)
1659{
1660 return i2c_write_read(dev, dev_addr,
1661 &reg_addr, sizeof(reg_addr),
1662 value, sizeof(*value));
1663}
1664
1678static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
1679 uint8_t reg_addr, uint8_t *value)
1680{
1681 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1682}
1683
1702static inline int i2c_reg_write_byte(const struct device *dev,
1703 uint16_t dev_addr,
1704 uint8_t reg_addr, uint8_t value)
1705{
1706 uint8_t tx_buf[2] = {reg_addr, value};
1707
1708 return i2c_write(dev, tx_buf, 2, dev_addr);
1709}
1710
1724static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
1725 uint8_t reg_addr, uint8_t value)
1726{
1727 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1728}
1729
1749static inline int i2c_reg_update_byte(const struct device *dev,
1750 uint8_t dev_addr,
1751 uint8_t reg_addr, uint8_t mask,
1752 uint8_t value)
1753{
1754 uint8_t old_value, new_value;
1755 int rc;
1756
1757 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
1758 if (rc != 0) {
1759 return rc;
1760 }
1761
1762 new_value = (old_value & ~mask) | (value & mask);
1763 if (new_value == old_value) {
1764 return 0;
1765 }
1766
1767 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
1768}
1769
1784static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
1785 uint8_t reg_addr, uint8_t mask,
1786 uint8_t value)
1787{
1788 return i2c_reg_update_byte(spec->bus, spec->addr,
1789 reg_addr, mask, value);
1790}
1791
1792#ifdef __cplusplus
1793}
1794#endif
1795
1800#include <zephyr/syscalls/i2c.h>
1801
1802#endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_H_ */
workaround assembler barfing for ST r
Definition asm-macro-32-bit-gnu.h:24
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:955
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:1632
static int i2c_target_unregister(const struct device *dev, struct i2c_target_config *cfg)
Unregisters the provided config as Target device.
Definition i2c.h:1312
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:1483
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:1104
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:333
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:1389
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:1414
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:1517
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:442
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:987
static bool i2c_is_stop_op(const struct i2c_msg *msg)
Check if the current message includes a stop.
Definition i2c.h:522
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:415
static bool i2c_is_ready_iodev(const struct rtio_iodev *i2c_iodev)
Validate that I2C bus is ready.
Definition i2c.h:1160
i2c_error_reason
I2C error reasons.
Definition i2c.h:423
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:1544
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:355
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:290
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:1784
void(* i2c_callback_t)(const struct device *dev, int result, void *data)
I2C callback for asynchronous transfer requests.
Definition i2c.h:203
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:1459
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:311
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:1724
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:1702
#define I2C_MSG_READ
Read message from I2C bus.
Definition i2c.h:148
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:1678
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:790
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:1028
#define I2C_MSG_RESTART
RESTART I2C transaction for this message.
Definition i2c.h:164
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:1227
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:1434
static bool i2c_is_read_op(const struct i2c_msg *msg)
Check if the current message is a read operation.
Definition i2c.h:510
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:1569
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:1283
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:914
#define I2C_MSG_STOP
Send STOP after this message.
Definition i2c.h:155
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:614
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:570
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:1064
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:1749
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:145
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:1656
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:1599
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:497
@ I2C_ERROR_DMA
Definition i2c.h:427
@ I2C_ERROR_SIZE
Definition i2c.h:426
@ I2C_ERROR_GENERIC
Definition i2c.h:428
@ I2C_ERROR_TIMEOUT
Definition i2c.h:424
@ I2C_ERROR_ARBITRATION
Definition i2c.h:425
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:1359
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:148
#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:455
Runtime device structure (in ROM) per driver instance.
Definition device.h:510
void * data
Address of the device instance private data.
Definition device.h:520
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:516
struct device_state * state
Address of the common device state.
Definition device.h:518
I2C specific device state which allows for i2c device class specific additions.
Definition i2c.h:602
struct stats_i2c stats
Definition i2c.h:604
struct device_state devstate
Definition i2c.h:603
Complete I2C DT information.
Definition i2c.h:78
const struct device * bus
Definition i2c.h:79
uint16_t addr
Definition i2c.h:80
One I2C Message.
Definition i2c.h:185
uint8_t * buf
Data buffer in bytes.
Definition i2c.h:187
uint32_t len
Length of buffer in bytes.
Definition i2c.h:190
uint8_t flags
Flags for this message.
Definition i2c.h:193
Structure providing callbacks to be implemented for devices that supports the I2C target API.
Definition i2c.h:451
i2c_target_read_requested_cb_t read_requested
Definition i2c.h:453
i2c_target_write_received_cb_t write_received
Definition i2c.h:454
i2c_target_read_processed_cb_t read_processed
Definition i2c.h:455
i2c_target_write_requested_cb_t write_requested
Definition i2c.h:452
i2c_target_stop_cb_t stop
Definition i2c.h:460
i2c_target_error_cb_t error
Definition i2c.h:461
Structure describing a device that supports the I2C target API.
Definition i2c.h:475
uint8_t flags
Flags for the target device defined by I2C_TARGET_FLAGS_* constants.
Definition i2c.h:480
uint16_t address
Address for this target device.
Definition i2c.h:483
sys_snode_t node
Private, do not modify.
Definition i2c.h:477
const struct i2c_target_callbacks * callbacks
Callback functions.
Definition i2c.h:486
Definition kernel.h:6200
API that an RTIO IO device should implement.
Definition rtio.h:525
Compute the mempool block index for a given pointer.
Definition rtio.h:515
struct rtio_sqe sqe
Definition rtio.h:516
An IO device with a function table for submitting requests.
Definition rtio.h:540
void * data
Definition rtio.h:545
A submission queue event.
Definition rtio.h:296
const struct rtio_iodev * iodev
Device to operation on.
Definition rtio.h:305
const uint8_t * buf
Buffer to write from.
Definition rtio.h:321
An RTIO context containing what can be viewed as a pair of queues.
Definition rtio.h:419