Zephyr Project API  3.3.0
A Scalable Open Source RTOS
i2c.h
Go to the documentation of this file.
1
7/*
8 * Copyright (c) 2015 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12#ifndef ZEPHYR_INCLUDE_DRIVERS_I2C_H_
13#define ZEPHYR_INCLUDE_DRIVERS_I2C_H_
14
22#include <errno.h>
23
24#include <zephyr/types.h>
25#include <zephyr/device.h>
26#include <zephyr/kernel.h>
27#include <zephyr/sys/slist.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33/*
34 * The following #defines are used to configure the I2C controller.
35 */
36
38#define I2C_SPEED_STANDARD (0x1U)
39
41#define I2C_SPEED_FAST (0x2U)
42
44#define I2C_SPEED_FAST_PLUS (0x3U)
45
47#define I2C_SPEED_HIGH (0x4U)
48
50#define I2C_SPEED_ULTRA (0x5U)
51
53#define I2C_SPEED_DT (0x7U)
54
55#define I2C_SPEED_SHIFT (1U)
56#define I2C_SPEED_SET(speed) (((speed) << I2C_SPEED_SHIFT) \
57 & I2C_SPEED_MASK)
58#define I2C_SPEED_MASK (0x7U << I2C_SPEED_SHIFT) /* 3 bits */
59#define I2C_SPEED_GET(cfg) (((cfg) & I2C_SPEED_MASK) \
60 >> I2C_SPEED_SHIFT)
61
63#define I2C_ADDR_10_BITS BIT(0)
64
66#define I2C_MODE_CONTROLLER BIT(4)
67
69#define I2C_MODE_MASTER __DEPRECATED_MACRO BIT(4)
70
78 const struct device *bus;
80};
81
92#define I2C_DT_SPEC_GET_ON_I3C(node_id) \
93 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
94 .addr = DT_PROP_BY_IDX(node_id, reg, 0)
95
106#define I2C_DT_SPEC_GET_ON_I2C(node_id) \
107 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
108 .addr = DT_REG_ADDR(node_id)
109
120#define I2C_DT_SPEC_GET(node_id) \
121 { \
122 COND_CODE_1(DT_ON_BUS(node_id, i3c), \
123 (I2C_DT_SPEC_GET_ON_I3C(node_id)), \
124 (I2C_DT_SPEC_GET_ON_I2C(node_id))) \
125 }
126
135#define I2C_DT_SPEC_INST_GET(inst) \
136 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
137
138
139/*
140 * I2C_MSG_* are I2C Message flags.
141 */
142
144#define I2C_MSG_WRITE (0U << 0U)
145
147#define I2C_MSG_READ BIT(0)
148
150#define I2C_MSG_RW_MASK BIT(0)
154#define I2C_MSG_STOP BIT(1)
155
163#define I2C_MSG_RESTART BIT(2)
164
168#define I2C_MSG_ADDR_10_BITS BIT(3)
169
184struct i2c_msg {
187
190
193};
194
202typedef void (*i2c_callback_t)(const struct device *dev, int result, void *data);
203
210struct i2c_target_config;
211
212typedef int (*i2c_api_configure_t)(const struct device *dev,
213 uint32_t dev_config);
214typedef int (*i2c_api_get_config_t)(const struct device *dev,
215 uint32_t *dev_config);
216typedef int (*i2c_api_full_io_t)(const struct device *dev,
217 struct i2c_msg *msgs,
218 uint8_t num_msgs,
219 uint16_t addr);
220typedef int (*i2c_api_target_register_t)(const struct device *dev,
221 struct i2c_target_config *cfg);
222typedef int (*i2c_api_target_unregister_t)(const struct device *dev,
223 struct i2c_target_config *cfg);
224#ifdef CONFIG_I2C_CALLBACK
225typedef int (*i2c_api_transfer_cb_t)(const struct device *dev,
226 struct i2c_msg *msgs,
227 uint8_t num_msgs,
228 uint16_t addr,
230 void *userdata);
231#endif /* CONFIG_I2C_CALLBACK */
232typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
233
234__subsystem struct i2c_driver_api {
235 i2c_api_configure_t configure;
236 i2c_api_get_config_t get_config;
237 i2c_api_full_io_t transfer;
238 i2c_api_target_register_t target_register;
239 i2c_api_target_unregister_t target_unregister;
240#ifdef CONFIG_I2C_CALLBACK
241 i2c_api_transfer_cb_t transfer_cb;
242#endif
243 i2c_api_recover_bus_t recover_bus;
244};
245
246typedef int (*i2c_target_api_register_t)(const struct device *dev);
247typedef int (*i2c_target_api_unregister_t)(const struct device *dev);
248
249struct i2c_target_driver_api {
250 i2c_target_api_register_t driver_register;
251 i2c_target_api_unregister_t driver_unregister;
252};
253
259#define I2C_TARGET_FLAGS_ADDR_10_BITS BIT(0)
260
277 struct i2c_target_config *config);
278
298 struct i2c_target_config *config, uint8_t val);
299
320 struct i2c_target_config *config, uint8_t *val);
321
342 struct i2c_target_config *config, uint8_t *val);
343
358typedef int (*i2c_target_stop_cb_t)(struct i2c_target_config *config);
359
372};
373
388
391
394
397};
398
407static inline bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
408{
409 /* Validate bus is ready */
410 return device_is_ready(spec->bus);
411}
412
439void i2c_dump_msgs_rw(const char *name, const struct i2c_msg *msgs,
440 uint8_t num_msgs, uint16_t addr, bool dump_read);
441
456static inline void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs,
457 uint8_t num_msgs, uint16_t addr)
458{
459 i2c_dump_msgs_rw(name, msgs, num_msgs, addr, false);
460}
461
462#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
463
464#include <zephyr/stats/stats.h>
465
469STATS_SECT_ENTRY32(bytes_read)
470STATS_SECT_ENTRY32(bytes_written)
471STATS_SECT_ENTRY32(message_count)
472STATS_SECT_ENTRY32(transfer_call_count)
474
476STATS_NAME(i2c, bytes_read)
477STATS_NAME(i2c, bytes_written)
478STATS_NAME(i2c, message_count)
479STATS_NAME(i2c, transfer_call_count)
480STATS_NAME_END(i2c);
481
490 struct stats_i2c stats;
491};
492
500static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
501 uint8_t num_msgs)
502{
503 struct i2c_device_state *state =
505 uint32_t bytes_read = 0U;
506 uint32_t bytes_written = 0U;
507
508 STATS_INC(state->stats, transfer_call_count);
509 STATS_INCN(state->stats, message_count, num_msgs);
510 for (uint8_t i = 0U; i < num_msgs; i++) {
511 if (msgs[i].flags & I2C_MSG_READ) {
512 bytes_read += msgs[i].len;
513 }
514 if (msgs[i].flags & I2C_MSG_WRITE) {
515 bytes_written += msgs[i].len;
516 }
517 }
518 STATS_INCN(state->stats, bytes_read, bytes_read);
519 STATS_INCN(state->stats, bytes_written, bytes_written);
520}
521
527#define Z_I2C_DEVICE_STATE_DEFINE(dev_id) \
528 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_id) \
529 __attribute__((__section__(".z_devstate")))
530
537#define Z_I2C_INIT_FN(dev_id, init_fn) \
538 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
539 { \
540 struct i2c_device_state *state = \
541 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
542 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
543 STATS_NAME_INIT_PARMS(i2c)); \
544 stats_register(dev->name, &(state->stats.s_hdr)); \
545 return init_fn(dev); \
546 }
547
577#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
578 prio, api, ...) \
579 Z_I2C_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
580 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
581 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
582 DEVICE_DT_NAME(node_id), \
583 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
584 pm_device, data, config, level, prio, api, \
585 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
586 __VA_ARGS__)
587
588#else /* CONFIG_I2C_STATS */
589
590static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
591 uint8_t num_msgs)
592{
593 ARG_UNUSED(dev);
594 ARG_UNUSED(msgs);
595 ARG_UNUSED(num_msgs);
596}
597
598#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
599 prio, api, ...) \
600 DEVICE_DT_DEFINE(node_id, &init_fn, pm, data, config, level, \
601 prio, api, __VA_ARGS__)
602
603#endif /* CONFIG_I2C_STATS */
604
613#define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
614 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
615
616
627__syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
628
629static inline int z_impl_i2c_configure(const struct device *dev,
630 uint32_t dev_config)
631{
632 const struct i2c_driver_api *api =
633 (const struct i2c_driver_api *)dev->api;
634
635 return api->configure(dev, dev_config);
636}
637
658__syscall int i2c_get_config(const struct device *dev, uint32_t *dev_config);
659
660static inline int z_impl_i2c_get_config(const struct device *dev, uint32_t *dev_config)
661{
662 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
663
664 if (api->get_config == NULL) {
665 return -ENOSYS;
666 }
667
668 return api->get_config(dev, dev_config);
669}
670
698__syscall int i2c_transfer(const struct device *dev,
699 struct i2c_msg *msgs, uint8_t num_msgs,
700 uint16_t addr);
701
702static inline int z_impl_i2c_transfer(const struct device *dev,
703 struct i2c_msg *msgs, uint8_t num_msgs,
704 uint16_t addr)
705{
706 const struct i2c_driver_api *api =
707 (const struct i2c_driver_api *)dev->api;
708
709 int res = api->transfer(dev, msgs, num_msgs, addr);
710
711 i2c_xfer_stats(dev, msgs, num_msgs);
712
713 if (IS_ENABLED(CONFIG_I2C_DUMP_MESSAGES)) {
714 i2c_dump_msgs_rw(dev->name, msgs, num_msgs, addr, true);
715 }
716
717 return res;
718}
719
720#ifdef CONFIG_I2C_CALLBACK
721
744static inline int i2c_transfer_cb(const struct device *dev,
745 struct i2c_msg *msgs,
746 uint8_t num_msgs,
747 uint16_t addr,
749 void *userdata)
750{
751 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
752
753 if (api->transfer_cb == NULL) {
754 return -ENOSYS;
755 }
756
757 return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
758}
759
775static inline int i2c_transfer_cb_dt(const struct i2c_dt_spec *spec,
776 struct i2c_msg *msgs,
777 uint8_t num_msgs,
779 void *userdata)
780{
781 return i2c_transfer_cb(spec->bus, msgs, num_msgs, spec->addr, cb, userdata);
782}
783
807static inline int i2c_write_read_cb(const struct device *dev, struct i2c_msg *msgs,
808 uint8_t num_msgs, uint16_t addr, const void *write_buf,
809 size_t num_write, void *read_buf, size_t num_read,
810 i2c_callback_t cb, void *userdata)
811{
812 if ((msgs == NULL) || (num_msgs != 2)) {
813 return -EINVAL;
814 }
815
816 msgs[0].buf = (uint8_t *)write_buf;
817 msgs[0].len = num_write;
818 msgs[0].flags = I2C_MSG_WRITE;
819
820 msgs[1].buf = (uint8_t *)read_buf;
821 msgs[1].len = num_read;
823
824 return i2c_transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
825}
826
848static inline int i2c_write_read_cb_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs,
849 uint8_t num_msgs, const void *write_buf, size_t num_write,
850 void *read_buf, size_t num_read, i2c_callback_t cb,
851 void *userdata)
852{
853 return i2c_write_read_cb(spec->bus, msgs, num_msgs, spec->addr, write_buf, num_write,
854 read_buf, num_read, cb, userdata);
855}
856
857#ifdef CONFIG_POLL
858
860void z_i2c_transfer_signal_cb(const struct device *dev, int result, void *userdata);
884static inline int i2c_transfer_signal(const struct device *dev,
885 struct i2c_msg *msgs,
886 uint8_t num_msgs,
887 uint16_t addr,
888 struct k_poll_signal *sig)
889{
890 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
891
892 if (api->transfer_cb == NULL) {
893 return -ENOSYS;
894 }
895
896 return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
897}
898
899#endif /* CONFIG_POLL */
900
901#endif /* CONFIG_I2C_CALLBACK */
902
916static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
917 struct i2c_msg *msgs, uint8_t num_msgs)
918{
919 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
920}
921
934__syscall int i2c_recover_bus(const struct device *dev);
935
936static inline int z_impl_i2c_recover_bus(const struct device *dev)
937{
938 const struct i2c_driver_api *api =
939 (const struct i2c_driver_api *)dev->api;
940
941 if (api->recover_bus == NULL) {
942 return -ENOSYS;
943 }
944
945 return api->recover_bus(dev);
946}
947
972static inline int i2c_target_register(const struct device *dev,
973 struct i2c_target_config *cfg)
974{
975 const struct i2c_driver_api *api =
976 (const struct i2c_driver_api *)dev->api;
977
978 if (api->target_register == NULL) {
979 return -ENOSYS;
980 }
981
982 return api->target_register(dev, cfg);
983}
984
1001static inline int i2c_target_unregister(const struct device *dev,
1002 struct i2c_target_config *cfg)
1003{
1004 const struct i2c_driver_api *api =
1005 (const struct i2c_driver_api *)dev->api;
1006
1007 if (api->target_unregister == NULL) {
1008 return -ENOSYS;
1009 }
1010
1011 return api->target_unregister(dev, cfg);
1012}
1013
1027__syscall int i2c_target_driver_register(const struct device *dev);
1028
1029static inline int z_impl_i2c_target_driver_register(const struct device *dev)
1030{
1031 const struct i2c_target_driver_api *api =
1032 (const struct i2c_target_driver_api *)dev->api;
1033
1034 return api->driver_register(dev);
1035}
1036
1050__syscall int i2c_target_driver_unregister(const struct device *dev);
1051
1052static inline int z_impl_i2c_target_driver_unregister(const struct device *dev)
1053{
1054 const struct i2c_target_driver_api *api =
1055 (const struct i2c_target_driver_api *)dev->api;
1056
1057 return api->driver_unregister(dev);
1058}
1059
1060/*
1061 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
1062 */
1063
1078static inline int i2c_write(const struct device *dev, const uint8_t *buf,
1079 uint32_t num_bytes, uint16_t addr)
1080{
1081 struct i2c_msg msg;
1082
1083 msg.buf = (uint8_t *)buf;
1084 msg.len = num_bytes;
1085 msg.flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1086
1087 return i2c_transfer(dev, &msg, 1, addr);
1088}
1089
1103static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
1104 const uint8_t *buf, uint32_t num_bytes)
1105{
1106 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
1107}
1108
1123static inline int i2c_read(const struct device *dev, uint8_t *buf,
1124 uint32_t num_bytes, uint16_t addr)
1125{
1126 struct i2c_msg msg;
1127
1128 msg.buf = buf;
1129 msg.len = num_bytes;
1130 msg.flags = I2C_MSG_READ | I2C_MSG_STOP;
1131
1132 return i2c_transfer(dev, &msg, 1, addr);
1133}
1134
1148static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
1149 uint8_t *buf, uint32_t num_bytes)
1150{
1151 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
1152}
1153
1172static inline int i2c_write_read(const struct device *dev, uint16_t addr,
1173 const void *write_buf, size_t num_write,
1174 void *read_buf, size_t num_read)
1175{
1176 struct i2c_msg msg[2];
1177
1178 msg[0].buf = (uint8_t *)write_buf;
1179 msg[0].len = num_write;
1180 msg[0].flags = I2C_MSG_WRITE;
1181
1182 msg[1].buf = (uint8_t *)read_buf;
1183 msg[1].len = num_read;
1185
1186 return i2c_transfer(dev, msg, 2, addr);
1187}
1188
1206static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
1207 const void *write_buf, size_t num_write,
1208 void *read_buf, size_t num_read)
1209{
1210 return i2c_write_read(spec->bus, spec->addr,
1211 write_buf, num_write,
1212 read_buf, num_read);
1213}
1214
1233static inline int i2c_burst_read(const struct device *dev,
1234 uint16_t dev_addr,
1235 uint8_t start_addr,
1236 uint8_t *buf,
1237 uint32_t num_bytes)
1238{
1239 return i2c_write_read(dev, dev_addr,
1240 &start_addr, sizeof(start_addr),
1241 buf, num_bytes);
1242}
1243
1258static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
1259 uint8_t start_addr,
1260 uint8_t *buf,
1261 uint32_t num_bytes)
1262{
1263 return i2c_burst_read(spec->bus, spec->addr,
1264 start_addr, buf, num_bytes);
1265}
1266
1288static inline int i2c_burst_write(const struct device *dev,
1289 uint16_t dev_addr,
1290 uint8_t start_addr,
1291 const uint8_t *buf,
1292 uint32_t num_bytes)
1293{
1294 struct i2c_msg msg[2];
1295
1296 msg[0].buf = &start_addr;
1297 msg[0].len = 1U;
1298 msg[0].flags = I2C_MSG_WRITE;
1299
1300 msg[1].buf = (uint8_t *)buf;
1301 msg[1].len = num_bytes;
1302 msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1303
1304 return i2c_transfer(dev, msg, 2, dev_addr);
1305}
1306
1321static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
1322 uint8_t start_addr,
1323 const uint8_t *buf,
1324 uint32_t num_bytes)
1325{
1326 return i2c_burst_write(spec->bus, spec->addr,
1327 start_addr, buf, num_bytes);
1328}
1329
1345static inline int i2c_reg_read_byte(const struct device *dev,
1346 uint16_t dev_addr,
1347 uint8_t reg_addr, uint8_t *value)
1348{
1349 return i2c_write_read(dev, dev_addr,
1350 &reg_addr, sizeof(reg_addr),
1351 value, sizeof(*value));
1352}
1353
1367static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
1368 uint8_t reg_addr, uint8_t *value)
1369{
1370 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1371}
1372
1391static inline int i2c_reg_write_byte(const struct device *dev,
1392 uint16_t dev_addr,
1393 uint8_t reg_addr, uint8_t value)
1394{
1395 uint8_t tx_buf[2] = {reg_addr, value};
1396
1397 return i2c_write(dev, tx_buf, 2, dev_addr);
1398}
1399
1413static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
1414 uint8_t reg_addr, uint8_t value)
1415{
1416 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1417}
1418
1438static inline int i2c_reg_update_byte(const struct device *dev,
1439 uint8_t dev_addr,
1440 uint8_t reg_addr, uint8_t mask,
1441 uint8_t value)
1442{
1443 uint8_t old_value, new_value;
1444 int rc;
1445
1446 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
1447 if (rc != 0) {
1448 return rc;
1449 }
1450
1451 new_value = (old_value & ~mask) | (value & mask);
1452 if (new_value == old_value) {
1453 return 0;
1454 }
1455
1456 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
1457}
1458
1473static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
1474 uint8_t reg_addr, uint8_t mask,
1475 uint8_t value)
1476{
1477 return i2c_reg_update_byte(spec->bus, spec->addr,
1478 reg_addr, mask, value);
1479}
1480
1481#ifdef __cplusplus
1482}
1483#endif
1484
1489#include <syscalls/i2c.h>
1490
1491#endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_H_ */
struct result result[2]
Definition: errno.c:42
System error numbers.
bool device_is_ready(const struct device *dev)
Verify that a device is ready for use.
int i2c_target_driver_unregister(const struct device *dev)
Instructs the I2C Target device to unregister itself from the I2C Controller.
static int i2c_burst_write_dt(const struct i2c_dt_spec *spec, uint8_t start_addr, const uint8_t *buf, uint32_t num_bytes)
Write multiple bytes to an internal address of an I2C device.
Definition: i2c.h:1321
static int i2c_target_unregister(const struct device *dev, struct i2c_target_config *cfg)
Unregisters the provided config as Target device.
Definition: i2c.h:1001
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:1172
int i2c_target_driver_register(const struct device *dev)
Instructs the I2C Target device to register itself to the I2C Controller.
int(* i2c_target_read_requested_cb_t)(struct i2c_target_config *config, uint8_t *val)
Function called when a read from the device is initiated.
Definition: i2c.h:319
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:1078
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:1103
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:1206
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:358
void i2c_dump_msgs_rw(const char *name, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr, bool dump_read)
Dump out an I2C message.
static int i2c_burst_read(const struct device *dev, uint16_t dev_addr, uint8_t start_addr, uint8_t *buf, uint32_t num_bytes)
Read multiple bytes from an internal address of an I2C device.
Definition: i2c.h:1233
static void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr)
Dump out an I2C message, before it is executed.
Definition: i2c.h:456
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:341
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:276
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:1473
void(* i2c_callback_t)(const struct device *dev, int result, void *data)
I2C callback for asynchronous transfer requests.
Definition: i2c.h:202
static int i2c_read_dt(const struct i2c_dt_spec *spec, uint8_t *buf, uint32_t num_bytes)
Read a set amount of data from an I2C device.
Definition: i2c.h:1148
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:297
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:1413
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:1391
#define I2C_MSG_READ
Definition: i2c.h:147
static int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec, uint8_t reg_addr, uint8_t *value)
Read internal register of an I2C device.
Definition: i2c.h:1367
int i2c_configure(const struct device *dev, uint32_t dev_config)
Configure operation of a host controller.
#define I2C_MSG_RESTART
Definition: i2c.h:163
static int i2c_transfer_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs, uint8_t num_msgs)
Perform data transfer to another I2C device in controller mode.
Definition: i2c.h:916
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:1123
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:1258
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:972
#define I2C_MSG_STOP
Definition: i2c.h:154
static void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs, uint8_t num_msgs)
Updates the i2c stats for i2c transfers.
Definition: i2c.h:500
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:1438
#define I2C_MSG_WRITE
Definition: i2c.h:144
static int i2c_reg_read_byte(const struct device *dev, uint16_t dev_addr, uint8_t reg_addr, uint8_t *value)
Read internal register of an I2C device.
Definition: i2c.h:1345
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:1288
static bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
Validate that I2C bus is ready.
Definition: i2c.h:407
#define IS_ENABLED(config_macro)
Check for macro definition in compiler-visible expressions.
Definition: util_macro.h:121
#define CONTAINER_OF(ptr, type, field)
Get a pointer to a structure containing the element.
Definition: util.h:220
#define EINVAL
Definition: errno.h:61
#define ENOSYS
Definition: errno.h:83
Public kernel APIs.
flags
Definition: parser.h:96
state
Definition: parser_state.h:29
Single-linked list implementation.
struct _snode sys_snode_t
Definition: slist.h:33
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:351
Runtime device structure (in ROM) per driver instance.
Definition: device.h:378
const char * name
Definition: device.h:380
const void * api
Definition: device.h:384
struct device_state * state
Definition: device.h:386
I2C specific device state which allows for i2c device class specific additions.
Definition: i2c.h:488
struct stats_i2c stats
Definition: i2c.h:490
struct device_state devstate
Definition: i2c.h:489
Complete I2C DT information.
Definition: i2c.h:77
const struct device * bus
Definition: i2c.h:78
uint16_t addr
Definition: i2c.h:79
One I2C Message.
Definition: i2c.h:184
uint8_t * buf
Definition: i2c.h:186
uint32_t len
Definition: i2c.h:189
uint8_t flags
Definition: i2c.h:192
Structure providing callbacks to be implemented for devices that supports the I2C target API.
Definition: i2c.h:366
i2c_target_read_requested_cb_t read_requested
Definition: i2c.h:368
i2c_target_write_received_cb_t write_received
Definition: i2c.h:369
i2c_target_read_processed_cb_t read_processed
Definition: i2c.h:370
i2c_target_write_requested_cb_t write_requested
Definition: i2c.h:367
i2c_target_stop_cb_t stop
Definition: i2c.h:371
Structure describing a device that supports the I2C target API.
Definition: i2c.h:385
uint8_t flags
Definition: i2c.h:390
uint16_t address
Definition: i2c.h:393
sys_snode_t node
Definition: i2c.h:387
const struct i2c_target_callbacks * callbacks
Definition: i2c.h:396
Definition: kernel.h:5459
Definition: errno.c:37
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
static void msg(uint64_t c64)
Definition: main.c:17