Zephyr Project API  3.2.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 <zephyr/types.h>
23#include <zephyr/device.h>
24
25#ifdef __cplusplus
26extern "C" {
27#endif
28
29/*
30 * The following #defines are used to configure the I2C controller.
31 */
32
34#define I2C_SPEED_STANDARD (0x1U)
35
37#define I2C_SPEED_FAST (0x2U)
38
40#define I2C_SPEED_FAST_PLUS (0x3U)
41
43#define I2C_SPEED_HIGH (0x4U)
44
46#define I2C_SPEED_ULTRA (0x5U)
47
49#define I2C_SPEED_DT (0x7U)
50
51#define I2C_SPEED_SHIFT (1U)
52#define I2C_SPEED_SET(speed) (((speed) << I2C_SPEED_SHIFT) \
53 & I2C_SPEED_MASK)
54#define I2C_SPEED_MASK (0x7U << I2C_SPEED_SHIFT) /* 3 bits */
55#define I2C_SPEED_GET(cfg) (((cfg) & I2C_SPEED_MASK) \
56 >> I2C_SPEED_SHIFT)
57
59#define I2C_ADDR_10_BITS BIT(0)
60
62#define I2C_MODE_CONTROLLER BIT(4)
63
65#define I2C_MODE_MASTER __DEPRECATED_MACRO BIT(4)
66
74 const struct device *bus;
76};
77
88#define I2C_DT_SPEC_GET_ON_I3C(node_id) \
89 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
90 .addr = DT_PROP_BY_IDX(node_id, reg, 0)
91
102#define I2C_DT_SPEC_GET_ON_I2C(node_id) \
103 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
104 .addr = DT_REG_ADDR(node_id)
105
116#define I2C_DT_SPEC_GET(node_id) \
117 { \
118 COND_CODE_1(DT_ON_BUS(node_id, i3c), \
119 (I2C_DT_SPEC_GET_ON_I3C(node_id)), \
120 (I2C_DT_SPEC_GET_ON_I2C(node_id))) \
121 }
122
131#define I2C_DT_SPEC_INST_GET(inst) \
132 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
133
134
135/*
136 * I2C_MSG_* are I2C Message flags.
137 */
138
140#define I2C_MSG_WRITE (0U << 0U)
141
143#define I2C_MSG_READ BIT(0)
144
146#define I2C_MSG_RW_MASK BIT(0)
150#define I2C_MSG_STOP BIT(1)
151
159#define I2C_MSG_RESTART BIT(2)
160
164#define I2C_MSG_ADDR_10_BITS BIT(3)
165
180struct i2c_msg {
183
186
189};
190
198typedef void (*i2c_callback_t)(const struct device *dev, int result, void *data);
199
206struct i2c_target_config;
207
208typedef int (*i2c_api_configure_t)(const struct device *dev,
209 uint32_t dev_config);
210typedef int (*i2c_api_get_config_t)(const struct device *dev,
211 uint32_t *dev_config);
212typedef int (*i2c_api_full_io_t)(const struct device *dev,
213 struct i2c_msg *msgs,
214 uint8_t num_msgs,
215 uint16_t addr);
216typedef int (*i2c_api_target_register_t)(const struct device *dev,
217 struct i2c_target_config *cfg);
218typedef int (*i2c_api_target_unregister_t)(const struct device *dev,
219 struct i2c_target_config *cfg);
220#ifdef CONFIG_I2C_CALLBACK
221typedef int (*i2c_api_transfer_cb_t)(const struct device *dev,
222 struct i2c_msg *msgs,
223 uint8_t num_msgs,
224 uint16_t addr,
226 void *userdata);
227#endif /* CONFIG_I2C_CALLBACK */
228typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
229
230__subsystem struct i2c_driver_api {
231 i2c_api_configure_t configure;
232 i2c_api_get_config_t get_config;
233 i2c_api_full_io_t transfer;
234 i2c_api_target_register_t target_register;
235 i2c_api_target_unregister_t target_unregister;
236#ifdef CONFIG_I2C_CALLBACK
237 i2c_api_transfer_cb_t transfer_cb;
238#endif
239 i2c_api_recover_bus_t recover_bus;
240};
241
242typedef int (*i2c_target_api_register_t)(const struct device *dev);
243typedef int (*i2c_target_api_unregister_t)(const struct device *dev);
244
245struct i2c_target_driver_api {
246 i2c_target_api_register_t driver_register;
247 i2c_target_api_unregister_t driver_unregister;
248};
249
255#define I2C_TARGET_FLAGS_ADDR_10_BITS BIT(0)
256
273 struct i2c_target_config *config);
274
294 struct i2c_target_config *config, uint8_t val);
295
316 struct i2c_target_config *config, uint8_t *val);
317
338 struct i2c_target_config *config, uint8_t *val);
339
354typedef int (*i2c_target_stop_cb_t)(struct i2c_target_config *config);
355
368};
369
384
387
390
393};
394
395#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
396
397#include <zephyr/stats/stats.h>
398
402STATS_SECT_ENTRY32(bytes_read)
403STATS_SECT_ENTRY32(bytes_written)
404STATS_SECT_ENTRY32(message_count)
405STATS_SECT_ENTRY32(transfer_call_count)
407
409STATS_NAME(i2c, bytes_read)
410STATS_NAME(i2c, bytes_written)
411STATS_NAME(i2c, message_count)
412STATS_NAME(i2c, transfer_call_count)
413STATS_NAME_END(i2c);
414
423 struct stats_i2c stats;
424};
425
433static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
434 uint8_t num_msgs)
435{
436 struct i2c_device_state *state =
438 uint32_t bytes_read = 0U;
439 uint32_t bytes_written = 0U;
440
441 STATS_INC(state->stats, transfer_call_count);
442 STATS_INCN(state->stats, message_count, num_msgs);
443 for (uint8_t i = 0U; i < num_msgs; i++) {
444 if (msgs[i].flags & I2C_MSG_READ) {
445 bytes_read += msgs[i].len;
446 }
447 if (msgs[i].flags & I2C_MSG_WRITE) {
448 bytes_written += msgs[i].len;
449 }
450 }
451 STATS_INCN(state->stats, bytes_read, bytes_read);
452 STATS_INCN(state->stats, bytes_written, bytes_written);
453}
454
460#define Z_I2C_DEVICE_STATE_DEFINE(node_id, dev_name) \
461 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_name) \
462 __attribute__((__section__(".z_devstate")));
463
470#define Z_I2C_INIT_FN(dev_name, init_fn) \
471 static inline int UTIL_CAT(dev_name, _init)(const struct device *dev) \
472 { \
473 struct i2c_device_state *state = \
474 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
475 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
476 STATS_NAME_INIT_PARMS(i2c)); \
477 stats_register(dev->name, &(state->stats.s_hdr)); \
478 return init_fn(dev); \
479 }
480
510#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
511 data_ptr, cfg_ptr, level, prio, \
512 api_ptr, ...) \
513 Z_I2C_DEVICE_STATE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id)); \
514 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_NAME(node_id), init_fn) \
515 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id), \
516 DEVICE_DT_NAME(node_id), \
517 &UTIL_CAT(Z_DEVICE_DT_DEV_NAME(node_id), _init), \
518 pm_device, \
519 data_ptr, cfg_ptr, level, prio, \
520 api_ptr, \
521 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_NAME(node_id)).devstate), \
522 __VA_ARGS__)
523
524#else /* CONFIG_I2C_STATS */
525
526static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
527 uint8_t num_msgs)
528{
529 ARG_UNUSED(dev);
530 ARG_UNUSED(msgs);
531 ARG_UNUSED(num_msgs);
532}
533
534#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
535 data_ptr, cfg_ptr, level, prio, \
536 api_ptr, ...) \
537 DEVICE_DT_DEFINE(node_id, &init_fn, pm_device, \
538 data_ptr, cfg_ptr, level, prio, \
539 api_ptr, __VA_ARGS__)
540
541#endif /* CONFIG_I2C_STATS */
542
551#define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
552 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
553
554
565__syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
566
567static inline int z_impl_i2c_configure(const struct device *dev,
568 uint32_t dev_config)
569{
570 const struct i2c_driver_api *api =
571 (const struct i2c_driver_api *)dev->api;
572
573 return api->configure(dev, dev_config);
574}
575
596__syscall int i2c_get_config(const struct device *dev, uint32_t *dev_config);
597
598static inline int z_impl_i2c_get_config(const struct device *dev, uint32_t *dev_config)
599{
600 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
601
602 if (api->get_config == NULL) {
603 return -ENOSYS;
604 }
605
606 return api->get_config(dev, dev_config);
607}
608
636__syscall int i2c_transfer(const struct device *dev,
637 struct i2c_msg *msgs, uint8_t num_msgs,
638 uint16_t addr);
639
640static inline int z_impl_i2c_transfer(const struct device *dev,
641 struct i2c_msg *msgs, uint8_t num_msgs,
642 uint16_t addr)
643{
644 const struct i2c_driver_api *api =
645 (const struct i2c_driver_api *)dev->api;
646
647 int res = api->transfer(dev, msgs, num_msgs, addr);
648
649 i2c_xfer_stats(dev, msgs, num_msgs);
650
651 return res;
652}
653
654#ifdef CONFIG_I2C_CALLBACK
655
678static inline int i2c_transfer_cb(const struct device *dev,
679 struct i2c_msg *msgs,
680 uint8_t num_msgs,
681 uint16_t addr,
683 void *userdata)
684{
685 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
686
687 if (api->transfer_cb == NULL) {
688 return -ENOSYS;
689 }
690
691 return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
692}
693
694#ifdef CONFIG_POLL
695
697void z_i2c_transfer_signal_cb(const struct device *dev, int result, void *userdata);
721static inline int i2c_transfer_signal(const struct device *dev,
722 struct i2c_msg *msgs,
723 uint8_t num_msgs,
724 uint16_t addr,
725 struct k_poll_signal *sig)
726{
727 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
728
729 if (api->transfer_cb == NULL) {
730 return -ENOSYS;
731 }
732
733 return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
734}
735
736#endif /* CONFIG_POLL */
737
738#endif /* CONFIG_I2C_CALLBACK */
739
753static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
754 struct i2c_msg *msgs, uint8_t num_msgs)
755{
756 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
757}
758
771__syscall int i2c_recover_bus(const struct device *dev);
772
773static inline int z_impl_i2c_recover_bus(const struct device *dev)
774{
775 const struct i2c_driver_api *api =
776 (const struct i2c_driver_api *)dev->api;
777
778 if (api->recover_bus == NULL) {
779 return -ENOSYS;
780 }
781
782 return api->recover_bus(dev);
783}
784
809static inline int i2c_target_register(const struct device *dev,
810 struct i2c_target_config *cfg)
811{
812 const struct i2c_driver_api *api =
813 (const struct i2c_driver_api *)dev->api;
814
815 if (api->target_register == NULL) {
816 return -ENOSYS;
817 }
818
819 return api->target_register(dev, cfg);
820}
821
838static inline int i2c_target_unregister(const struct device *dev,
839 struct i2c_target_config *cfg)
840{
841 const struct i2c_driver_api *api =
842 (const struct i2c_driver_api *)dev->api;
843
844 if (api->target_unregister == NULL) {
845 return -ENOSYS;
846 }
847
848 return api->target_unregister(dev, cfg);
849}
850
864__syscall int i2c_target_driver_register(const struct device *dev);
865
866static inline int z_impl_i2c_target_driver_register(const struct device *dev)
867{
868 const struct i2c_target_driver_api *api =
869 (const struct i2c_target_driver_api *)dev->api;
870
871 return api->driver_register(dev);
872}
873
887__syscall int i2c_target_driver_unregister(const struct device *dev);
888
889static inline int z_impl_i2c_target_driver_unregister(const struct device *dev)
890{
891 const struct i2c_target_driver_api *api =
892 (const struct i2c_target_driver_api *)dev->api;
893
894 return api->driver_unregister(dev);
895}
896
897/*
898 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
899 */
900
915static inline int i2c_write(const struct device *dev, const uint8_t *buf,
916 uint32_t num_bytes, uint16_t addr)
917{
918 struct i2c_msg msg;
919
920 msg.buf = (uint8_t *)buf;
921 msg.len = num_bytes;
923
924 return i2c_transfer(dev, &msg, 1, addr);
925}
926
940static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
941 const uint8_t *buf, uint32_t num_bytes)
942{
943 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
944}
945
960static inline int i2c_read(const struct device *dev, uint8_t *buf,
961 uint32_t num_bytes, uint16_t addr)
962{
963 struct i2c_msg msg;
964
965 msg.buf = buf;
966 msg.len = num_bytes;
967 msg.flags = I2C_MSG_READ | I2C_MSG_STOP;
968
969 return i2c_transfer(dev, &msg, 1, addr);
970}
971
985static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
986 uint8_t *buf, uint32_t num_bytes)
987{
988 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
989}
990
1009static inline int i2c_write_read(const struct device *dev, uint16_t addr,
1010 const void *write_buf, size_t num_write,
1011 void *read_buf, size_t num_read)
1012{
1013 struct i2c_msg msg[2];
1014
1015 msg[0].buf = (uint8_t *)write_buf;
1016 msg[0].len = num_write;
1017 msg[0].flags = I2C_MSG_WRITE;
1018
1019 msg[1].buf = (uint8_t *)read_buf;
1020 msg[1].len = num_read;
1022
1023 return i2c_transfer(dev, msg, 2, addr);
1024}
1025
1043static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
1044 const void *write_buf, size_t num_write,
1045 void *read_buf, size_t num_read)
1046{
1047 return i2c_write_read(spec->bus, spec->addr,
1048 write_buf, num_write,
1049 read_buf, num_read);
1050}
1051
1070static inline int i2c_burst_read(const struct device *dev,
1071 uint16_t dev_addr,
1072 uint8_t start_addr,
1073 uint8_t *buf,
1074 uint32_t num_bytes)
1075{
1076 return i2c_write_read(dev, dev_addr,
1077 &start_addr, sizeof(start_addr),
1078 buf, num_bytes);
1079}
1080
1095static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
1096 uint8_t start_addr,
1097 uint8_t *buf,
1098 uint32_t num_bytes)
1099{
1100 return i2c_burst_read(spec->bus, spec->addr,
1101 start_addr, buf, num_bytes);
1102}
1103
1125static inline int i2c_burst_write(const struct device *dev,
1126 uint16_t dev_addr,
1127 uint8_t start_addr,
1128 const uint8_t *buf,
1129 uint32_t num_bytes)
1130{
1131 struct i2c_msg msg[2];
1132
1133 msg[0].buf = &start_addr;
1134 msg[0].len = 1U;
1135 msg[0].flags = I2C_MSG_WRITE;
1136
1137 msg[1].buf = (uint8_t *)buf;
1138 msg[1].len = num_bytes;
1139 msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1140
1141 return i2c_transfer(dev, msg, 2, dev_addr);
1142}
1143
1158static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
1159 uint8_t start_addr,
1160 const uint8_t *buf,
1161 uint32_t num_bytes)
1162{
1163 return i2c_burst_write(spec->bus, spec->addr,
1164 start_addr, buf, num_bytes);
1165}
1166
1182static inline int i2c_reg_read_byte(const struct device *dev,
1183 uint16_t dev_addr,
1184 uint8_t reg_addr, uint8_t *value)
1185{
1186 return i2c_write_read(dev, dev_addr,
1187 &reg_addr, sizeof(reg_addr),
1188 value, sizeof(*value));
1189}
1190
1204static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
1205 uint8_t reg_addr, uint8_t *value)
1206{
1207 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1208}
1209
1228static inline int i2c_reg_write_byte(const struct device *dev,
1229 uint16_t dev_addr,
1230 uint8_t reg_addr, uint8_t value)
1231{
1232 uint8_t tx_buf[2] = {reg_addr, value};
1233
1234 return i2c_write(dev, tx_buf, 2, dev_addr);
1235}
1236
1250static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
1251 uint8_t reg_addr, uint8_t value)
1252{
1253 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1254}
1255
1275static inline int i2c_reg_update_byte(const struct device *dev,
1276 uint8_t dev_addr,
1277 uint8_t reg_addr, uint8_t mask,
1278 uint8_t value)
1279{
1280 uint8_t old_value, new_value;
1281 int rc;
1282
1283 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
1284 if (rc != 0) {
1285 return rc;
1286 }
1287
1288 new_value = (old_value & ~mask) | (value & mask);
1289 if (new_value == old_value) {
1290 return 0;
1291 }
1292
1293 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
1294}
1295
1310static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
1311 uint8_t reg_addr, uint8_t mask,
1312 uint8_t value)
1313{
1314 return i2c_reg_update_byte(spec->bus, spec->addr,
1315 reg_addr, mask, value);
1316}
1317
1342void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs,
1343 uint8_t num_msgs, uint16_t addr);
1344
1345#ifdef __cplusplus
1346}
1347#endif
1348
1353#include <syscalls/i2c.h>
1354
1355#endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_H_ */
struct result result[2]
Definition: errno.c:42
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:1158
static int i2c_target_unregister(const struct device *dev, struct i2c_target_config *cfg)
Unregisters the provided config as Target device.
Definition: i2c.h:838
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:1009
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:315
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:915
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:940
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:1043
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:354
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:1070
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:337
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:272
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:1310
void(* i2c_callback_t)(const struct device *dev, int result, void *data)
I2C callback for asynchronous transfer requests.
Definition: i2c.h:198
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:985
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:293
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:1250
void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr)
Dump out an I2C message.
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:1228
#define I2C_MSG_READ
Definition: i2c.h:143
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:1204
int i2c_configure(const struct device *dev, uint32_t dev_config)
Configure operation of a host controller.
#define I2C_MSG_RESTART
Definition: i2c.h:159
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:753
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:960
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:1095
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:809
#define I2C_MSG_STOP
Definition: i2c.h:150
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:433
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:1275
#define I2C_MSG_WRITE
Definition: i2c.h:140
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:1182
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:1125
#define CONTAINER_OF(ptr, type, field)
Get a pointer to a structure containing the element.
Definition: util.h:210
#define ENOSYS
Definition: errno.h:83
flags
Definition: http_parser.h:131
state
Definition: http_parser_state.h:29
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:408
Runtime device structure (in ROM) per driver instance.
Definition: device.h:435
const void * api
Definition: device.h:441
struct device_state * state
Definition: device.h:443
I2C specific device state which allows for i2c device class specific additions.
Definition: i2c.h:421
struct stats_i2c stats
Definition: i2c.h:423
struct device_state devstate
Definition: i2c.h:422
Complete I2C DT information.
Definition: i2c.h:73
const struct device * bus
Definition: i2c.h:74
uint16_t addr
Definition: i2c.h:75
One I2C Message.
Definition: i2c.h:180
uint8_t * buf
Definition: i2c.h:182
uint32_t len
Definition: i2c.h:185
uint8_t flags
Definition: i2c.h:188
Structure providing callbacks to be implemented for devices that supports the I2C target API.
Definition: i2c.h:362
i2c_target_read_requested_cb_t read_requested
Definition: i2c.h:364
i2c_target_write_received_cb_t write_received
Definition: i2c.h:365
i2c_target_read_processed_cb_t read_processed
Definition: i2c.h:366
i2c_target_write_requested_cb_t write_requested
Definition: i2c.h:363
i2c_target_stop_cb_t stop
Definition: i2c.h:367
Structure describing a device that supports the I2C target API.
Definition: i2c.h:381
uint8_t flags
Definition: i2c.h:386
uint16_t address
Definition: i2c.h:389
sys_snode_t node
Definition: i2c.h:383
const struct i2c_target_callbacks * callbacks
Definition: i2c.h:392
Definition: kernel.h:5396
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