Zephyr Project API  3.1.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_MASTER BIT(4)
63
71 const struct device *bus;
73};
74
85#define I2C_DT_SPEC_GET(node_id) \
86 { \
87 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
88 .addr = DT_REG_ADDR(node_id) \
89 }
90
99#define I2C_DT_SPEC_INST_GET(inst) \
100 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
101
102
103/*
104 * I2C_MSG_* are I2C Message flags.
105 */
106
108#define I2C_MSG_WRITE (0U << 0U)
109
111#define I2C_MSG_READ BIT(0)
112
114#define I2C_MSG_RW_MASK BIT(0)
118#define I2C_MSG_STOP BIT(1)
119
127#define I2C_MSG_RESTART BIT(2)
128
132#define I2C_MSG_ADDR_10_BITS BIT(3)
133
148struct i2c_msg {
151
154
157};
158
165struct i2c_slave_config;
166
167typedef int (*i2c_api_configure_t)(const struct device *dev,
168 uint32_t dev_config);
169typedef int (*i2c_api_get_config_t)(const struct device *dev,
170 uint32_t *dev_config);
171typedef int (*i2c_api_full_io_t)(const struct device *dev,
172 struct i2c_msg *msgs,
173 uint8_t num_msgs,
174 uint16_t addr);
175typedef int (*i2c_api_slave_register_t)(const struct device *dev,
176 struct i2c_slave_config *cfg);
177typedef int (*i2c_api_slave_unregister_t)(const struct device *dev,
178 struct i2c_slave_config *cfg);
179typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
180
181__subsystem struct i2c_driver_api {
182 i2c_api_configure_t configure;
183 i2c_api_get_config_t get_config;
184 i2c_api_full_io_t transfer;
185 i2c_api_slave_register_t slave_register;
186 i2c_api_slave_unregister_t slave_unregister;
187 i2c_api_recover_bus_t recover_bus;
188};
189
190typedef int (*i2c_slave_api_register_t)(const struct device *dev);
191typedef int (*i2c_slave_api_unregister_t)(const struct device *dev);
192
193struct i2c_slave_driver_api {
194 i2c_slave_api_register_t driver_register;
195 i2c_slave_api_unregister_t driver_unregister;
196};
197
203#define I2C_SLAVE_FLAGS_ADDR_10_BITS BIT(0)
204
221 struct i2c_slave_config *config);
222
242 struct i2c_slave_config *config, uint8_t val);
243
264 struct i2c_slave_config *config, uint8_t *val);
265
286 struct i2c_slave_config *config, uint8_t *val);
287
302typedef int (*i2c_slave_stop_cb_t)(struct i2c_slave_config *config);
303
316};
317
332
335
338
341};
342
343#if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
344
345#include <zephyr/stats/stats.h>
346
350STATS_SECT_ENTRY32(bytes_read)
351STATS_SECT_ENTRY32(bytes_written)
352STATS_SECT_ENTRY32(message_count)
353STATS_SECT_ENTRY32(transfer_call_count)
355
357STATS_NAME(i2c, bytes_read)
358STATS_NAME(i2c, bytes_written)
359STATS_NAME(i2c, message_count)
360STATS_NAME(i2c, transfer_call_count)
361STATS_NAME_END(i2c);
362
371 struct stats_i2c stats;
372};
373
381static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
382 uint8_t num_msgs)
383{
384 struct i2c_device_state *state =
386 uint32_t bytes_read = 0U;
387 uint32_t bytes_written = 0U;
388
389 STATS_INC(state->stats, transfer_call_count);
390 STATS_INCN(state->stats, message_count, num_msgs);
391 for (uint8_t i = 0U; i < num_msgs; i++) {
392 if (msgs[i].flags & I2C_MSG_READ) {
393 bytes_read += msgs[i].len;
394 }
395 if (msgs[i].flags & I2C_MSG_WRITE) {
396 bytes_written += msgs[i].len;
397 }
398 }
399 STATS_INCN(state->stats, bytes_read, bytes_read);
400 STATS_INCN(state->stats, bytes_written, bytes_written);
401}
402
408#define Z_I2C_DEVICE_STATE_DEFINE(node_id, dev_name) \
409 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_name) \
410 __attribute__((__section__(".z_devstate")));
411
418#define Z_I2C_INIT_FN(dev_name, init_fn) \
419 static inline int UTIL_CAT(dev_name, _init)(const struct device *dev) \
420 { \
421 struct i2c_device_state *state = \
422 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
423 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
424 STATS_NAME_INIT_PARMS(i2c)); \
425 stats_register(dev->name, &(state->stats.s_hdr)); \
426 return init_fn(dev); \
427 }
428
458#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
459 data_ptr, cfg_ptr, level, prio, \
460 api_ptr, ...) \
461 Z_I2C_DEVICE_STATE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id)); \
462 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_NAME(node_id), init_fn) \
463 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_NAME(node_id), \
464 DEVICE_DT_NAME(node_id), \
465 &UTIL_CAT(Z_DEVICE_DT_DEV_NAME(node_id), _init), \
466 pm_device, \
467 data_ptr, cfg_ptr, level, prio, \
468 api_ptr, \
469 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_NAME(node_id)).devstate), \
470 __VA_ARGS__)
471
472#else /* CONFIG_I2C_STATS */
473
474static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
475 uint8_t num_msgs)
476{
477 ARG_UNUSED(dev);
478 ARG_UNUSED(msgs);
479 ARG_UNUSED(num_msgs);
480}
481
482#define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm_device, \
483 data_ptr, cfg_ptr, level, prio, \
484 api_ptr, ...) \
485 DEVICE_DT_DEFINE(node_id, &init_fn, pm_device, \
486 data_ptr, cfg_ptr, level, prio, \
487 api_ptr, __VA_ARGS__)
488
489#endif /* CONFIG_I2C_STATS */
490
499#define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
500 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
501
502
513__syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
514
515static inline int z_impl_i2c_configure(const struct device *dev,
516 uint32_t dev_config)
517{
518 const struct i2c_driver_api *api =
519 (const struct i2c_driver_api *)dev->api;
520
521 return api->configure(dev, dev_config);
522}
523
544__syscall int i2c_get_config(const struct device *dev, uint32_t *dev_config);
545
546static inline int z_impl_i2c_get_config(const struct device *dev, uint32_t *dev_config)
547{
548 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
549
550 if (api->get_config == NULL) {
551 return -ENOSYS;
552 }
553
554 return api->get_config(dev, dev_config);
555}
556
584__syscall int i2c_transfer(const struct device *dev,
585 struct i2c_msg *msgs, uint8_t num_msgs,
586 uint16_t addr);
587
588static inline int z_impl_i2c_transfer(const struct device *dev,
589 struct i2c_msg *msgs, uint8_t num_msgs,
590 uint16_t addr)
591{
592 const struct i2c_driver_api *api =
593 (const struct i2c_driver_api *)dev->api;
594
595 int res = api->transfer(dev, msgs, num_msgs, addr);
596
597 i2c_xfer_stats(dev, msgs, num_msgs);
598
599 return res;
600}
601
615static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
616 struct i2c_msg *msgs, uint8_t num_msgs)
617{
618 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
619}
620
633__syscall int i2c_recover_bus(const struct device *dev);
634
635static inline int z_impl_i2c_recover_bus(const struct device *dev)
636{
637 const struct i2c_driver_api *api =
638 (const struct i2c_driver_api *)dev->api;
639
640 if (api->recover_bus == NULL) {
641 return -ENOSYS;
642 }
643
644 return api->recover_bus(dev);
645}
646
671static inline int i2c_slave_register(const struct device *dev,
672 struct i2c_slave_config *cfg)
673{
674 const struct i2c_driver_api *api =
675 (const struct i2c_driver_api *)dev->api;
676
677 if (api->slave_register == NULL) {
678 return -ENOSYS;
679 }
680
681 return api->slave_register(dev, cfg);
682}
683
700static inline int i2c_slave_unregister(const struct device *dev,
701 struct i2c_slave_config *cfg)
702{
703 const struct i2c_driver_api *api =
704 (const struct i2c_driver_api *)dev->api;
705
706 if (api->slave_unregister == NULL) {
707 return -ENOSYS;
708 }
709
710 return api->slave_unregister(dev, cfg);
711}
712
726__syscall int i2c_slave_driver_register(const struct device *dev);
727
728static inline int z_impl_i2c_slave_driver_register(const struct device *dev)
729{
730 const struct i2c_slave_driver_api *api =
731 (const struct i2c_slave_driver_api *)dev->api;
732
733 return api->driver_register(dev);
734}
735
749__syscall int i2c_slave_driver_unregister(const struct device *dev);
750
751static inline int z_impl_i2c_slave_driver_unregister(const struct device *dev)
752{
753 const struct i2c_slave_driver_api *api =
754 (const struct i2c_slave_driver_api *)dev->api;
755
756 return api->driver_unregister(dev);
757}
758
759/*
760 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
761 */
762
777static inline int i2c_write(const struct device *dev, const uint8_t *buf,
778 uint32_t num_bytes, uint16_t addr)
779{
780 struct i2c_msg msg;
781
782 msg.buf = (uint8_t *)buf;
783 msg.len = num_bytes;
785
786 return i2c_transfer(dev, &msg, 1, addr);
787}
788
802static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
803 const uint8_t *buf, uint32_t num_bytes)
804{
805 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
806}
807
822static inline int i2c_read(const struct device *dev, uint8_t *buf,
823 uint32_t num_bytes, uint16_t addr)
824{
825 struct i2c_msg msg;
826
827 msg.buf = buf;
828 msg.len = num_bytes;
829 msg.flags = I2C_MSG_READ | I2C_MSG_STOP;
830
831 return i2c_transfer(dev, &msg, 1, addr);
832}
833
847static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
848 uint8_t *buf, uint32_t num_bytes)
849{
850 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
851}
852
871static inline int i2c_write_read(const struct device *dev, uint16_t addr,
872 const void *write_buf, size_t num_write,
873 void *read_buf, size_t num_read)
874{
875 struct i2c_msg msg[2];
876
877 msg[0].buf = (uint8_t *)write_buf;
878 msg[0].len = num_write;
879 msg[0].flags = I2C_MSG_WRITE;
880
881 msg[1].buf = (uint8_t *)read_buf;
882 msg[1].len = num_read;
884
885 return i2c_transfer(dev, msg, 2, addr);
886}
887
905static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
906 const void *write_buf, size_t num_write,
907 void *read_buf, size_t num_read)
908{
909 return i2c_write_read(spec->bus, spec->addr,
910 write_buf, num_write,
911 read_buf, num_read);
912}
913
932static inline int i2c_burst_read(const struct device *dev,
933 uint16_t dev_addr,
934 uint8_t start_addr,
935 uint8_t *buf,
936 uint32_t num_bytes)
937{
938 return i2c_write_read(dev, dev_addr,
939 &start_addr, sizeof(start_addr),
940 buf, num_bytes);
941}
942
957static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
958 uint8_t start_addr,
959 uint8_t *buf,
960 uint32_t num_bytes)
961{
962 return i2c_burst_read(spec->bus, spec->addr,
963 start_addr, buf, num_bytes);
964}
965
987static inline int i2c_burst_write(const struct device *dev,
988 uint16_t dev_addr,
989 uint8_t start_addr,
990 const uint8_t *buf,
991 uint32_t num_bytes)
992{
993 struct i2c_msg msg[2];
994
995 msg[0].buf = &start_addr;
996 msg[0].len = 1U;
997 msg[0].flags = I2C_MSG_WRITE;
998
999 msg[1].buf = (uint8_t *)buf;
1000 msg[1].len = num_bytes;
1001 msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1002
1003 return i2c_transfer(dev, msg, 2, dev_addr);
1004}
1005
1020static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
1021 uint8_t start_addr,
1022 const uint8_t *buf,
1023 uint32_t num_bytes)
1024{
1025 return i2c_burst_write(spec->bus, spec->addr,
1026 start_addr, buf, num_bytes);
1027}
1028
1044static inline int i2c_reg_read_byte(const struct device *dev,
1045 uint16_t dev_addr,
1046 uint8_t reg_addr, uint8_t *value)
1047{
1048 return i2c_write_read(dev, dev_addr,
1049 &reg_addr, sizeof(reg_addr),
1050 value, sizeof(*value));
1051}
1052
1066static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
1067 uint8_t reg_addr, uint8_t *value)
1068{
1069 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1070}
1071
1090static inline int i2c_reg_write_byte(const struct device *dev,
1091 uint16_t dev_addr,
1092 uint8_t reg_addr, uint8_t value)
1093{
1094 uint8_t tx_buf[2] = {reg_addr, value};
1095
1096 return i2c_write(dev, tx_buf, 2, dev_addr);
1097}
1098
1112static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
1113 uint8_t reg_addr, uint8_t value)
1114{
1115 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1116}
1117
1137static inline int i2c_reg_update_byte(const struct device *dev,
1138 uint8_t dev_addr,
1139 uint8_t reg_addr, uint8_t mask,
1140 uint8_t value)
1141{
1142 uint8_t old_value, new_value;
1143 int rc;
1144
1145 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
1146 if (rc != 0) {
1147 return rc;
1148 }
1149
1150 new_value = (old_value & ~mask) | (value & mask);
1151 if (new_value == old_value) {
1152 return 0;
1153 }
1154
1155 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
1156}
1157
1172static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
1173 uint8_t reg_addr, uint8_t mask,
1174 uint8_t value)
1175{
1176 return i2c_reg_update_byte(spec->bus, spec->addr,
1177 reg_addr, mask, value);
1178}
1179
1202void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs,
1203 uint8_t num_msgs, uint16_t addr);
1204
1208};
1209
1210#define I2C_DECLARE_CLIENT_CONFIG struct i2c_client_config i2c_client
1211
1212#define I2C_CLIENT(_master, _addr) \
1213 .i2c_client = { \
1214 .i2c_master = (_master), \
1215 .i2c_addr = (_addr), \
1216 }
1217
1218#define I2C_GET_MASTER(_conf) ((_conf)->i2c_client.i2c_master)
1219#define I2C_GET_ADDR(_conf) ((_conf)->i2c_client.i2c_addr)
1220
1221#ifdef __cplusplus
1222}
1223#endif
1224
1229#include <syscalls/i2c.h>
1230
1231#endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_H_ */
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:1020
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:871
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 master mode.
static int i2c_slave_register(const struct device *dev, struct i2c_slave_config *cfg)
Registers the provided config as Slave device of a controller.
Definition: i2c.h:671
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:777
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:802
int(* i2c_slave_read_requested_cb_t)(struct i2c_slave_config *config, uint8_t *val)
Function called when a read from the device is initiated.
Definition: i2c.h:263
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:905
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:932
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:1172
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:847
int i2c_slave_driver_unregister(const struct device *dev)
Instructs the I2C Slave device to unregister itself from the I2C Controller.
int(* i2c_slave_write_requested_cb_t)(struct i2c_slave_config *config)
Function called when a write to the device is initiated.
Definition: i2c.h:220
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:1112
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:1090
int(* i2c_slave_read_processed_cb_t)(struct i2c_slave_config *config, uint8_t *val)
Function called when a read from the device is continued.
Definition: i2c.h:285
#define I2C_MSG_READ
Definition: i2c.h:111
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:1066
int i2c_configure(const struct device *dev, uint32_t dev_config)
Configure operation of a host controller.
int(* i2c_slave_stop_cb_t)(struct i2c_slave_config *config)
Function called when a stop condition is observed after a start condition addressed to a particular d...
Definition: i2c.h:302
#define I2C_MSG_RESTART
Definition: i2c.h:127
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 master mode.
Definition: i2c.h:615
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:822
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:957
#define I2C_MSG_STOP
Definition: i2c.h:118
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:381
int i2c_slave_driver_register(const struct device *dev)
Instructs the I2C Slave device to register itself to the I2C Controller.
int(* i2c_slave_write_received_cb_t)(struct i2c_slave_config *config, uint8_t val)
Function called when a write to the device is continued.
Definition: i2c.h:241
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:1137
static int i2c_slave_unregister(const struct device *dev, struct i2c_slave_config *cfg)
Unregisters the provided config as Slave device.
Definition: i2c.h:700
#define I2C_MSG_WRITE
Definition: i2c.h:108
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:1044
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:987
#define CONTAINER_OF(ptr, type, field)
Get a pointer to a structure containing the element.
Definition: util.h:147
#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:429
Runtime device structure (in ROM) per driver instance.
Definition: device.h:456
const void * api
Definition: device.h:462
struct device_state *const state
Definition: device.h:464
Definition: i2c.h:1205
uint16_t i2c_addr
Definition: i2c.h:1207
char * i2c_master
Definition: i2c.h:1206
I2C specific device state which allows for i2c device class specific additions.
Definition: i2c.h:369
struct stats_i2c stats
Definition: i2c.h:371
struct device_state devstate
Definition: i2c.h:370
Complete I2C DT information.
Definition: i2c.h:70
const struct device * bus
Definition: i2c.h:71
uint16_t addr
Definition: i2c.h:72
One I2C Message.
Definition: i2c.h:148
uint8_t * buf
Definition: i2c.h:150
uint32_t len
Definition: i2c.h:153
uint8_t flags
Definition: i2c.h:156
Structure providing callbacks to be implemented for devices that supports the I2C slave API.
Definition: i2c.h:310
i2c_slave_write_requested_cb_t write_requested
Definition: i2c.h:311
i2c_slave_write_received_cb_t write_received
Definition: i2c.h:313
i2c_slave_read_processed_cb_t read_processed
Definition: i2c.h:314
i2c_slave_read_requested_cb_t read_requested
Definition: i2c.h:312
i2c_slave_stop_cb_t stop
Definition: i2c.h:315
Structure describing a device that supports the I2C slave API.
Definition: i2c.h:329
uint8_t flags
Definition: i2c.h:334
const struct i2c_slave_callbacks * callbacks
Definition: i2c.h:340
sys_snode_t node
Definition: i2c.h:331
uint16_t address
Definition: i2c.h:337
static void msg(uint64_t c64)
Definition: main.c:17