Zephyr API Documentation  2.7.0-rc2
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 <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
48#define I2C_SPEED_SHIFT (1U)
49#define I2C_SPEED_SET(speed) (((speed) << I2C_SPEED_SHIFT) \
50 & I2C_SPEED_MASK)
51#define I2C_SPEED_MASK (0x7U << I2C_SPEED_SHIFT) /* 3 bits */
52#define I2C_SPEED_GET(cfg) (((cfg) & I2C_SPEED_MASK) \
53 >> I2C_SPEED_SHIFT)
54
56#define I2C_ADDR_10_BITS BIT(0)
57
59#define I2C_MODE_MASTER BIT(4)
60
68 const struct device *bus;
70};
71
82#define I2C_DT_SPEC_GET(node_id) \
83 { \
84 .bus = DEVICE_DT_GET(DT_BUS(node_id)), \
85 .addr = DT_REG_ADDR(node_id) \
86 }
87
96#define I2C_DT_SPEC_INST_GET(inst) \
97 I2C_DT_SPEC_GET(DT_DRV_INST(inst))
98
99
100/*
101 * I2C_MSG_* are I2C Message flags.
102 */
103
105#define I2C_MSG_WRITE (0U << 0U)
106
108#define I2C_MSG_READ BIT(0)
109
111#define I2C_MSG_RW_MASK BIT(0)
115#define I2C_MSG_STOP BIT(1)
116
124#define I2C_MSG_RESTART BIT(2)
125
129#define I2C_MSG_ADDR_10_BITS BIT(3)
130
145struct i2c_msg {
148
151
154};
155
162struct i2c_slave_config;
163
164typedef int (*i2c_api_configure_t)(const struct device *dev,
165 uint32_t dev_config);
166typedef int (*i2c_api_full_io_t)(const struct device *dev,
167 struct i2c_msg *msgs,
168 uint8_t num_msgs,
169 uint16_t addr);
170typedef int (*i2c_api_slave_register_t)(const struct device *dev,
171 struct i2c_slave_config *cfg);
172typedef int (*i2c_api_slave_unregister_t)(const struct device *dev,
173 struct i2c_slave_config *cfg);
174typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
175
176__subsystem struct i2c_driver_api {
177 i2c_api_configure_t configure;
178 i2c_api_full_io_t transfer;
179 i2c_api_slave_register_t slave_register;
180 i2c_api_slave_unregister_t slave_unregister;
181 i2c_api_recover_bus_t recover_bus;
182};
183
184typedef int (*i2c_slave_api_register_t)(const struct device *dev);
185typedef int (*i2c_slave_api_unregister_t)(const struct device *dev);
186
187struct i2c_slave_driver_api {
188 i2c_slave_api_register_t driver_register;
189 i2c_slave_api_unregister_t driver_unregister;
190};
191
197#define I2C_SLAVE_FLAGS_ADDR_10_BITS BIT(0)
198
215 struct i2c_slave_config *config);
216
236 struct i2c_slave_config *config, uint8_t val);
237
258 struct i2c_slave_config *config, uint8_t *val);
259
280 struct i2c_slave_config *config, uint8_t *val);
281
296typedef int (*i2c_slave_stop_cb_t)(struct i2c_slave_config *config);
297
310};
311
326
329
332
335};
336
347__syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
348
349static inline int z_impl_i2c_configure(const struct device *dev,
350 uint32_t dev_config)
351{
352 const struct i2c_driver_api *api =
353 (const struct i2c_driver_api *)dev->api;
354
355 return api->configure(dev, dev_config);
356}
357
385__syscall int i2c_transfer(const struct device *dev,
386 struct i2c_msg *msgs, uint8_t num_msgs,
387 uint16_t addr);
388
389static inline int z_impl_i2c_transfer(const struct device *dev,
390 struct i2c_msg *msgs, uint8_t num_msgs,
391 uint16_t addr)
392{
393 const struct i2c_driver_api *api =
394 (const struct i2c_driver_api *)dev->api;
395
396 return api->transfer(dev, msgs, num_msgs, addr);
397}
398
412static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
413 struct i2c_msg *msgs, uint8_t num_msgs)
414{
415 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
416}
417
430__syscall int i2c_recover_bus(const struct device *dev);
431
432static inline int z_impl_i2c_recover_bus(const struct device *dev)
433{
434 const struct i2c_driver_api *api =
435 (const struct i2c_driver_api *)dev->api;
436
437 if (api->recover_bus == NULL) {
438 return -ENOSYS;
439 }
440
441 return api->recover_bus(dev);
442}
443
468static inline int i2c_slave_register(const struct device *dev,
469 struct i2c_slave_config *cfg)
470{
471 const struct i2c_driver_api *api =
472 (const struct i2c_driver_api *)dev->api;
473
474 if (api->slave_register == NULL) {
475 return -ENOSYS;
476 }
477
478 return api->slave_register(dev, cfg);
479}
480
497static inline int i2c_slave_unregister(const struct device *dev,
498 struct i2c_slave_config *cfg)
499{
500 const struct i2c_driver_api *api =
501 (const struct i2c_driver_api *)dev->api;
502
503 if (api->slave_unregister == NULL) {
504 return -ENOSYS;
505 }
506
507 return api->slave_unregister(dev, cfg);
508}
509
523__syscall int i2c_slave_driver_register(const struct device *dev);
524
525static inline int z_impl_i2c_slave_driver_register(const struct device *dev)
526{
527 const struct i2c_slave_driver_api *api =
528 (const struct i2c_slave_driver_api *)dev->api;
529
530 return api->driver_register(dev);
531}
532
546__syscall int i2c_slave_driver_unregister(const struct device *dev);
547
548static inline int z_impl_i2c_slave_driver_unregister(const struct device *dev)
549{
550 const struct i2c_slave_driver_api *api =
551 (const struct i2c_slave_driver_api *)dev->api;
552
553 return api->driver_unregister(dev);
554}
555
556/*
557 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
558 */
559
574static inline int i2c_write(const struct device *dev, const uint8_t *buf,
575 uint32_t num_bytes, uint16_t addr)
576{
577 struct i2c_msg msg;
578
579 msg.buf = (uint8_t *)buf;
580 msg.len = num_bytes;
582
583 return i2c_transfer(dev, &msg, 1, addr);
584}
585
599static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
600 const uint8_t *buf, uint32_t num_bytes)
601{
602 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
603}
604
619static inline int i2c_read(const struct device *dev, uint8_t *buf,
620 uint32_t num_bytes, uint16_t addr)
621{
622 struct i2c_msg msg;
623
624 msg.buf = buf;
625 msg.len = num_bytes;
627
628 return i2c_transfer(dev, &msg, 1, addr);
629}
630
644static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
645 uint8_t *buf, uint32_t num_bytes)
646{
647 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
648}
649
668static inline int i2c_write_read(const struct device *dev, uint16_t addr,
669 const void *write_buf, size_t num_write,
670 void *read_buf, size_t num_read)
671{
672 struct i2c_msg msg[2];
673
674 msg[0].buf = (uint8_t *)write_buf;
675 msg[0].len = num_write;
676 msg[0].flags = I2C_MSG_WRITE;
677
678 msg[1].buf = (uint8_t *)read_buf;
679 msg[1].len = num_read;
681
682 return i2c_transfer(dev, msg, 2, addr);
683}
684
702static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
703 const void *write_buf, size_t num_write,
704 void *read_buf, size_t num_read)
705{
706 return i2c_write_read(spec->bus, spec->addr,
707 write_buf, num_write,
708 read_buf, num_read);
709}
710
729static inline int i2c_burst_read(const struct device *dev,
730 uint16_t dev_addr,
731 uint8_t start_addr,
732 uint8_t *buf,
733 uint32_t num_bytes)
734{
735 return i2c_write_read(dev, dev_addr,
736 &start_addr, sizeof(start_addr),
737 buf, num_bytes);
738}
739
754static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
755 uint8_t start_addr,
756 uint8_t *buf,
757 uint32_t num_bytes)
758{
759 return i2c_burst_read(spec->bus, spec->addr,
760 start_addr, buf, num_bytes);
761}
762
784static inline int i2c_burst_write(const struct device *dev,
785 uint16_t dev_addr,
786 uint8_t start_addr,
787 const uint8_t *buf,
788 uint32_t num_bytes)
789{
790 struct i2c_msg msg[2];
791
792 msg[0].buf = &start_addr;
793 msg[0].len = 1U;
794 msg[0].flags = I2C_MSG_WRITE;
795
796 msg[1].buf = (uint8_t *)buf;
797 msg[1].len = num_bytes;
799
800 return i2c_transfer(dev, msg, 2, dev_addr);
801}
802
817static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
818 uint8_t start_addr,
819 const uint8_t *buf,
820 uint32_t num_bytes)
821{
822 return i2c_burst_write(spec->bus, spec->addr,
823 start_addr, buf, num_bytes);
824}
825
841static inline int i2c_reg_read_byte(const struct device *dev,
842 uint16_t dev_addr,
843 uint8_t reg_addr, uint8_t *value)
844{
845 return i2c_write_read(dev, dev_addr,
846 &reg_addr, sizeof(reg_addr),
847 value, sizeof(*value));
848}
849
863static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
864 uint8_t reg_addr, uint8_t *value)
865{
866 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
867}
868
887static inline int i2c_reg_write_byte(const struct device *dev,
888 uint16_t dev_addr,
889 uint8_t reg_addr, uint8_t value)
890{
891 uint8_t tx_buf[2] = {reg_addr, value};
892
893 return i2c_write(dev, tx_buf, 2, dev_addr);
894}
895
909static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
910 uint8_t reg_addr, uint8_t value)
911{
912 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
913}
914
934static inline int i2c_reg_update_byte(const struct device *dev,
935 uint8_t dev_addr,
936 uint8_t reg_addr, uint8_t mask,
937 uint8_t value)
938{
939 uint8_t old_value, new_value;
940 int rc;
941
942 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
943 if (rc != 0) {
944 return rc;
945 }
946
947 new_value = (old_value & ~mask) | (value & mask);
948 if (new_value == old_value) {
949 return 0;
950 }
951
952 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
953}
954
969static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
970 uint8_t reg_addr, uint8_t mask,
971 uint8_t value)
972{
973 return i2c_reg_update_byte(spec->bus, spec->addr,
974 reg_addr, mask, value);
975}
976
999void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs,
1000 uint8_t num_msgs, uint16_t addr);
1001
1005};
1006
1007#define I2C_DECLARE_CLIENT_CONFIG struct i2c_client_config i2c_client
1008
1009#define I2C_CLIENT(_master, _addr) \
1010 .i2c_client = { \
1011 .i2c_master = (_master), \
1012 .i2c_addr = (_addr), \
1013 }
1014
1015#define I2C_GET_MASTER(_conf) ((_conf)->i2c_client.i2c_master)
1016#define I2C_GET_ADDR(_conf) ((_conf)->i2c_client.i2c_addr)
1017
1018#ifdef __cplusplus
1019}
1020#endif
1021
1026#include <syscalls/i2c.h>
1027
1028#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:817
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:668
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:468
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:574
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:599
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:257
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:702
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:729
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:969
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:644
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:214
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:909
void i2c_dump_msgs(const char *name, const struct i2c_msg *msgs, uint8_t num_msgs, uint16_t addr)
Dump out an I2C message.
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:887
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:279
#define I2C_MSG_READ
Definition: i2c.h:108
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:863
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:296
#define I2C_MSG_RESTART
Definition: i2c.h:124
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:412
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:619
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:754
#define I2C_MSG_STOP
Definition: i2c.h:115
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:235
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:934
static int i2c_slave_unregister(const struct device *dev, struct i2c_slave_config *cfg)
Unregisters the provided config as Slave device.
Definition: i2c.h:497
#define I2C_MSG_WRITE
Definition: i2c.h:105
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:841
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:784
#define ENOSYS
Definition: errno.h:83
struct _snode sys_snode_t
Definition: slist.h:33
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
__UINT16_TYPE__ uint16_t
Definition: stdint.h:59
Runtime device structure (in ROM) per driver instance.
Definition: device.h:367
const void * api
Definition: device.h:373
Definition: i2c.h:1002
uint16_t i2c_addr
Definition: i2c.h:1004
char * i2c_master
Definition: i2c.h:1003
Complete I2C DT information.
Definition: i2c.h:67
const struct device * bus
Definition: i2c.h:68
uint16_t addr
Definition: i2c.h:69
One I2C Message.
Definition: i2c.h:145
uint8_t * buf
Definition: i2c.h:147
uint32_t len
Definition: i2c.h:150
uint8_t flags
Definition: i2c.h:153
Structure providing callbacks to be implemented for devices that supports the I2C slave API.
Definition: i2c.h:304
i2c_slave_write_requested_cb_t write_requested
Definition: i2c.h:305
i2c_slave_write_received_cb_t write_received
Definition: i2c.h:307
i2c_slave_read_processed_cb_t read_processed
Definition: i2c.h:308
i2c_slave_read_requested_cb_t read_requested
Definition: i2c.h:306
i2c_slave_stop_cb_t stop
Definition: i2c.h:309
Structure describing a device that supports the I2C slave API.
Definition: i2c.h:323
uint8_t flags
Definition: i2c.h:328
const struct i2c_slave_callbacks * callbacks
Definition: i2c.h:334
sys_snode_t node
Definition: i2c.h:325
uint16_t address
Definition: i2c.h:331