1 /**
2 * @file
3 *
4 * @brief Public APIs for the I2C drivers.
5 */
6
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
15 /**
16 * @brief I2C Interface
17 * @defgroup i2c_interface I2C Interface
18 * @since 1.0
19 * @version 1.0.0
20 * @ingroup io_interfaces
21 * @{
22 */
23
24 #include <errno.h>
25
26 #include <zephyr/types.h>
27 #include <zephyr/device.h>
28 #include <zephyr/kernel.h>
29 #include <zephyr/sys/slist.h>
30 #include <zephyr/rtio/rtio.h>
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 /*
37 * The following #defines are used to configure the I2C controller.
38 */
39
40 /** I2C Standard Speed: 100 kHz */
41 #define I2C_SPEED_STANDARD (0x1U)
42
43 /** I2C Fast Speed: 400 kHz */
44 #define I2C_SPEED_FAST (0x2U)
45
46 /** I2C Fast Plus Speed: 1 MHz */
47 #define I2C_SPEED_FAST_PLUS (0x3U)
48
49 /** I2C High Speed: 3.4 MHz */
50 #define I2C_SPEED_HIGH (0x4U)
51
52 /** I2C Ultra Fast Speed: 5 MHz */
53 #define I2C_SPEED_ULTRA (0x5U)
54
55 /** Device Tree specified speed */
56 #define I2C_SPEED_DT (0x7U)
57
58 #define I2C_SPEED_SHIFT (1U)
59 #define I2C_SPEED_SET(speed) (((speed) << I2C_SPEED_SHIFT) \
60 & I2C_SPEED_MASK)
61 #define I2C_SPEED_MASK (0x7U << I2C_SPEED_SHIFT) /* 3 bits */
62 #define I2C_SPEED_GET(cfg) (((cfg) & I2C_SPEED_MASK) \
63 >> I2C_SPEED_SHIFT)
64
65 /** Use 10-bit addressing. DEPRECATED - Use I2C_MSG_ADDR_10_BITS instead. */
66 #define I2C_ADDR_10_BITS BIT(0)
67
68 /** Peripheral to act as Controller. */
69 #define I2C_MODE_CONTROLLER BIT(4)
70
71 /**
72 * @brief Complete I2C DT information
73 *
74 * @param bus is the I2C bus
75 * @param addr is the target address
76 */
77 struct i2c_dt_spec {
78 const struct device *bus;
79 uint16_t addr;
80 };
81
82 /**
83 * @brief Structure initializer for i2c_dt_spec from devicetree (on I3C bus)
84 *
85 * This helper macro expands to a static initializer for a <tt>struct
86 * i2c_dt_spec</tt> by reading the relevant bus and address data from
87 * the devicetree.
88 *
89 * @param node_id Devicetree node identifier for the I2C device whose
90 * struct i2c_dt_spec to create an initializer for
91 */
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
96 /**
97 * @brief Structure initializer for i2c_dt_spec from devicetree (on I2C bus)
98 *
99 * This helper macro expands to a static initializer for a <tt>struct
100 * i2c_dt_spec</tt> by reading the relevant bus and address data from
101 * the devicetree.
102 *
103 * @param node_id Devicetree node identifier for the I2C device whose
104 * struct i2c_dt_spec to create an initializer for
105 */
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
110 /**
111 * @brief Structure initializer for i2c_dt_spec from devicetree
112 *
113 * This helper macro expands to a static initializer for a <tt>struct
114 * i2c_dt_spec</tt> by reading the relevant bus and address data from
115 * the devicetree.
116 *
117 * @param node_id Devicetree node identifier for the I2C device whose
118 * struct i2c_dt_spec to create an initializer for
119 */
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
127 /**
128 * @brief Structure initializer for i2c_dt_spec from devicetree instance
129 *
130 * This is equivalent to
131 * <tt>I2C_DT_SPEC_GET(DT_DRV_INST(inst))</tt>.
132 *
133 * @param inst Devicetree instance number
134 */
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
143 /** Write message to I2C bus. */
144 #define I2C_MSG_WRITE (0U << 0U)
145
146 /** Read message from I2C bus. */
147 #define I2C_MSG_READ BIT(0)
148
149 /** @cond INTERNAL_HIDDEN */
150 #define I2C_MSG_RW_MASK BIT(0)
151 /** @endcond */
152
153 /** Send STOP after this message. */
154 #define I2C_MSG_STOP BIT(1)
155
156 /** RESTART I2C transaction for this message.
157 *
158 * @note Not all I2C drivers have or require explicit support for this
159 * feature. Some drivers require this be present on a read message
160 * that follows a write, or vice-versa. Some drivers will merge
161 * adjacent fragments into a single transaction using this flag; some
162 * will not. */
163 #define I2C_MSG_RESTART BIT(2)
164
165 /** Use 10-bit addressing for this message.
166 *
167 * @note Not all SoC I2C implementations support this feature. */
168 #define I2C_MSG_ADDR_10_BITS BIT(3)
169
170 /**
171 * @brief One I2C Message.
172 *
173 * This defines one I2C message to transact on the I2C bus.
174 *
175 * @note Some of the configurations supported by this API may not be
176 * supported by specific SoC I2C hardware implementations, in
177 * particular features related to bus transactions intended to read or
178 * write data from different buffers within a single transaction.
179 * Invocations of i2c_transfer() may not indicate an error when an
180 * unsupported configuration is encountered. In some cases drivers
181 * will generate separate transactions for each message fragment, with
182 * or without presence of @ref I2C_MSG_RESTART in #flags.
183 */
184 struct i2c_msg {
185 /** Data buffer in bytes */
186 uint8_t *buf;
187
188 /** Length of buffer in bytes */
189 uint32_t len;
190
191 /** Flags for this message */
192 uint8_t flags;
193 };
194
195 /**
196 * @brief I2C callback for asynchronous transfer requests
197 *
198 * @param dev I2C device which is notifying of transfer completion or error
199 * @param result Result code of the transfer request. 0 is success, -errno for failure.
200 * @param data Transfer requester supplied data which is passed along to the callback.
201 */
202 typedef void (*i2c_callback_t)(const struct device *dev, int result, void *data);
203
204 /**
205 * @cond INTERNAL_HIDDEN
206 *
207 * These are for internal use only, so skip these in
208 * public documentation.
209 */
210 struct i2c_target_config;
211
212 typedef int (*i2c_api_configure_t)(const struct device *dev,
213 uint32_t dev_config);
214 typedef int (*i2c_api_get_config_t)(const struct device *dev,
215 uint32_t *dev_config);
216 typedef int (*i2c_api_full_io_t)(const struct device *dev,
217 struct i2c_msg *msgs,
218 uint8_t num_msgs,
219 uint16_t addr);
220 typedef int (*i2c_api_target_register_t)(const struct device *dev,
221 struct i2c_target_config *cfg);
222 typedef int (*i2c_api_target_unregister_t)(const struct device *dev,
223 struct i2c_target_config *cfg);
224 #ifdef CONFIG_I2C_CALLBACK
225 typedef int (*i2c_api_transfer_cb_t)(const struct device *dev,
226 struct i2c_msg *msgs,
227 uint8_t num_msgs,
228 uint16_t addr,
229 i2c_callback_t cb,
230 void *userdata);
231 #endif /* CONFIG_I2C_CALLBACK */
232 #if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
233
234 /**
235 * @typedef i2c_api_iodev_submit
236 * @brief Callback API for submitting work to a I2C device with RTIO
237 */
238 typedef void (*i2c_api_iodev_submit)(const struct device *dev,
239 struct rtio_iodev_sqe *iodev_sqe);
240 #endif /* CONFIG_I2C_RTIO */
241
242 typedef int (*i2c_api_recover_bus_t)(const struct device *dev);
243
244 __subsystem struct i2c_driver_api {
245 i2c_api_configure_t configure;
246 i2c_api_get_config_t get_config;
247 i2c_api_full_io_t transfer;
248 i2c_api_target_register_t target_register;
249 i2c_api_target_unregister_t target_unregister;
250 #ifdef CONFIG_I2C_CALLBACK
251 i2c_api_transfer_cb_t transfer_cb;
252 #endif
253 #ifdef CONFIG_I2C_RTIO
254 i2c_api_iodev_submit iodev_submit;
255 #endif
256 i2c_api_recover_bus_t recover_bus;
257 };
258
259 typedef int (*i2c_target_api_register_t)(const struct device *dev);
260 typedef int (*i2c_target_api_unregister_t)(const struct device *dev);
261
262 __subsystem struct i2c_target_driver_api {
263 i2c_target_api_register_t driver_register;
264 i2c_target_api_unregister_t driver_unregister;
265 };
266
267 /**
268 * @endcond
269 */
270
271 /** Target device responds to 10-bit addressing. */
272 #define I2C_TARGET_FLAGS_ADDR_10_BITS BIT(0)
273
274 /** @brief Function called when a write to the device is initiated.
275 *
276 * This function is invoked by the controller when the bus completes a
277 * start condition for a write operation to the address associated
278 * with a particular device.
279 *
280 * A success return shall cause the controller to ACK the next byte
281 * received. An error return shall cause the controller to NACK the
282 * next byte received.
283 *
284 * @param config the configuration structure associated with the
285 * device to which the operation is addressed.
286 *
287 * @return 0 if the write is accepted, or a negative error code.
288 */
289 typedef int (*i2c_target_write_requested_cb_t)(
290 struct i2c_target_config *config);
291
292 /** @brief Function called when a write to the device is continued.
293 *
294 * This function is invoked by the controller when it completes
295 * reception of a byte of data in an ongoing write operation to the
296 * device.
297 *
298 * A success return shall cause the controller to ACK the next byte
299 * received. An error return shall cause the controller to NACK the
300 * next byte received.
301 *
302 * @param config the configuration structure associated with the
303 * device to which the operation is addressed.
304 *
305 * @param val the byte received by the controller.
306 *
307 * @return 0 if more data can be accepted, or a negative error
308 * code.
309 */
310 typedef int (*i2c_target_write_received_cb_t)(
311 struct i2c_target_config *config, uint8_t val);
312
313 /** @brief Function called when a read from the device is initiated.
314 *
315 * This function is invoked by the controller when the bus completes a
316 * start condition for a read operation from the address associated
317 * with a particular device.
318 *
319 * The value returned in @p *val will be transmitted. A success
320 * return shall cause the controller to react to additional read
321 * operations. An error return shall cause the controller to ignore
322 * bus operations until a new start condition is received.
323 *
324 * @param config the configuration structure associated with the
325 * device to which the operation is addressed.
326 *
327 * @param val pointer to storage for the first byte of data to return
328 * for the read request.
329 *
330 * @return 0 if more data can be requested, or a negative error code.
331 */
332 typedef int (*i2c_target_read_requested_cb_t)(
333 struct i2c_target_config *config, uint8_t *val);
334
335 /** @brief Function called when a read from the device is continued.
336 *
337 * This function is invoked by the controller when the bus is ready to
338 * provide additional data for a read operation from the address
339 * associated with the device device.
340 *
341 * The value returned in @p *val will be transmitted. A success
342 * return shall cause the controller to react to additional read
343 * operations. An error return shall cause the controller to ignore
344 * bus operations until a new start condition is received.
345 *
346 * @param config the configuration structure associated with the
347 * device to which the operation is addressed.
348 *
349 * @param val pointer to storage for the next byte of data to return
350 * for the read request.
351 *
352 * @return 0 if data has been provided, or a negative error code.
353 */
354 typedef int (*i2c_target_read_processed_cb_t)(
355 struct i2c_target_config *config, uint8_t *val);
356
357 #ifdef CONFIG_I2C_TARGET_BUFFER_MODE
358 /** @brief Function called when a write to the device is completed.
359 *
360 * This function is invoked by the controller when it completes
361 * reception of data from the source buffer to the destination
362 * buffer in an ongoing write operation to the device.
363 *
364 * @param config the configuration structure associated with the
365 * device to which the operation is addressed.
366 *
367 * @param ptr pointer to the buffer that contains the data to be transferred.
368 *
369 * @param len the length of the data to be transferred.
370 */
371 typedef void (*i2c_target_buf_write_received_cb_t)(
372 struct i2c_target_config *config, uint8_t *ptr, uint32_t len);
373
374 /** @brief Function called when a read from the device is initiated.
375 *
376 * This function is invoked by the controller when the bus is ready to
377 * provide additional data by buffer for a read operation from the address
378 * associated with the device.
379 *
380 * The value returned in @p **ptr and @p *len will be transmitted. A success
381 * return shall cause the controller to react to additional read operations.
382 * An error return shall cause the controller to ignore bus operations until
383 * a new start condition is received.
384 *
385 * @param config the configuration structure associated with the
386 * device to which the operation is addressed.
387 *
388 * @param ptr pointer to storage for the address of data buffer to return
389 * for the read request.
390 *
391 * @param len pointer to storage for the length of the data to be transferred
392 * for the read request.
393 *
394 * @return 0 if data has been provided, or a negative error code.
395 */
396 typedef int (*i2c_target_buf_read_requested_cb_t)(
397 struct i2c_target_config *config, uint8_t **ptr, uint32_t *len);
398 #endif
399
400 /** @brief Function called when a stop condition is observed after a
401 * start condition addressed to a particular device.
402 *
403 * This function is invoked by the controller when the bus is ready to
404 * provide additional data for a read operation from the address
405 * associated with the device device. After the function returns the
406 * controller shall enter a state where it is ready to react to new
407 * start conditions.
408 *
409 * @param config the configuration structure associated with the
410 * device to which the operation is addressed.
411 *
412 * @return Ignored.
413 */
414 typedef int (*i2c_target_stop_cb_t)(struct i2c_target_config *config);
415
416 /** @brief Structure providing callbacks to be implemented for devices
417 * that supports the I2C target API.
418 *
419 * This structure may be shared by multiple devices that implement the
420 * same API at different addresses on the bus.
421 */
422 struct i2c_target_callbacks {
423 i2c_target_write_requested_cb_t write_requested;
424 i2c_target_read_requested_cb_t read_requested;
425 i2c_target_write_received_cb_t write_received;
426 i2c_target_read_processed_cb_t read_processed;
427 #ifdef CONFIG_I2C_TARGET_BUFFER_MODE
428 i2c_target_buf_write_received_cb_t buf_write_received;
429 i2c_target_buf_read_requested_cb_t buf_read_requested;
430 #endif
431 i2c_target_stop_cb_t stop;
432 };
433
434 /** @brief Structure describing a device that supports the I2C
435 * target API.
436 *
437 * Instances of this are passed to the i2c_target_register() and
438 * i2c_target_unregister() functions to indicate addition and removal
439 * of a target device, respective.
440 *
441 * Fields other than @c node must be initialized by the module that
442 * implements the device behavior prior to passing the object
443 * reference to i2c_target_register().
444 */
445 struct i2c_target_config {
446 /** Private, do not modify */
447 sys_snode_t node;
448
449 /** Flags for the target device defined by I2C_TARGET_FLAGS_* constants */
450 uint8_t flags;
451
452 /** Address for this target device */
453 uint16_t address;
454
455 /** Callback functions */
456 const struct i2c_target_callbacks *callbacks;
457 };
458
459 /**
460 * @brief Validate that I2C bus is ready.
461 *
462 * @param spec I2C specification from devicetree
463 *
464 * @retval true if the I2C bus is ready for use.
465 * @retval false if the I2C bus is not ready for use.
466 */
i2c_is_ready_dt(const struct i2c_dt_spec * spec)467 static inline bool i2c_is_ready_dt(const struct i2c_dt_spec *spec)
468 {
469 /* Validate bus is ready */
470 return device_is_ready(spec->bus);
471 }
472
473 /**
474 * @brief Check if the current message is a read operation
475 *
476 * @param msg The message to check
477 * @return true if the I2C message is a read operation
478 * @return false if the I2C message is a write operation
479 */
i2c_is_read_op(const struct i2c_msg * msg)480 static inline bool i2c_is_read_op(const struct i2c_msg *msg)
481 {
482 return (msg->flags & I2C_MSG_READ) == I2C_MSG_READ;
483 }
484
485 /**
486 * @brief Check if the current message includes a stop.
487 *
488 * @param msg The message to check
489 * @return true if the I2C message includes a stop
490 * @return false if the I2C message includes a stop
491 */
i2c_is_stop_op(const struct i2c_msg * msg)492 static inline bool i2c_is_stop_op(const struct i2c_msg *msg)
493 {
494 return (msg->flags & I2C_MSG_STOP) == I2C_MSG_STOP;
495 }
496
497 /**
498 * @brief Dump out an I2C message
499 *
500 * Dumps out a list of I2C messages. For any that are writes (W), the data is
501 * displayed in hex. Setting dump_read will dump the data for read messages too,
502 * which only makes sense when called after the messages have been processed.
503 *
504 * It looks something like this (with name "testing"):
505 *
506 * @code
507 * D: I2C msg: testing, addr=56
508 * D: W len=01: 06
509 * D: W len=0e:
510 * D: contents:
511 * D: 00 01 02 03 04 05 06 07 |........
512 * D: 08 09 0a 0b 0c 0d |......
513 * D: W len=01: 0f
514 * D: R len=01: 6c
515 * @endcode
516 *
517 * @param dev Target for the messages being sent. Its name will be printed in the log.
518 * @param msgs Array of messages to dump.
519 * @param num_msgs Number of messages to dump.
520 * @param addr Address of the I2C target device.
521 * @param dump_read Dump data from I2C reads, otherwise only writes have data dumped.
522 */
523 void i2c_dump_msgs_rw(const struct device *dev, const struct i2c_msg *msgs, uint8_t num_msgs,
524 uint16_t addr, bool dump_read);
525
526 /**
527 * @brief Dump out an I2C message, before it is executed.
528 *
529 * This is equivalent to:
530 *
531 * i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, false);
532 *
533 * The read messages' data isn't dumped.
534 *
535 * @param dev Target for the messages being sent. Its name will be printed in the log.
536 * @param msgs Array of messages to dump.
537 * @param num_msgs Number of messages to dump.
538 * @param addr Address of the I2C target device.
539 */
i2c_dump_msgs(const struct device * dev,const struct i2c_msg * msgs,uint8_t num_msgs,uint16_t addr)540 static inline void i2c_dump_msgs(const struct device *dev, const struct i2c_msg *msgs,
541 uint8_t num_msgs, uint16_t addr)
542 {
543 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, false);
544 }
545
546 #if defined(CONFIG_I2C_STATS) || defined(__DOXYGEN__)
547
548 #include <zephyr/stats/stats.h>
549
550 /** @cond INTERNAL_HIDDEN */
551
552 STATS_SECT_START(i2c)
553 STATS_SECT_ENTRY32(bytes_read)
554 STATS_SECT_ENTRY32(bytes_written)
555 STATS_SECT_ENTRY32(message_count)
556 STATS_SECT_ENTRY32(transfer_call_count)
557 STATS_SECT_END;
558
559 STATS_NAME_START(i2c)
560 STATS_NAME(i2c, bytes_read)
561 STATS_NAME(i2c, bytes_written)
562 STATS_NAME(i2c, message_count)
563 STATS_NAME(i2c, transfer_call_count)
564 STATS_NAME_END(i2c);
565
566 /** @endcond */
567
568
569 /**
570 * @brief I2C specific device state which allows for i2c device class specific additions
571 */
572 struct i2c_device_state {
573 struct device_state devstate;
574 struct stats_i2c stats;
575 };
576
577 /**
578 * @brief Updates the i2c stats for i2c transfers
579 *
580 * @param dev I2C device to update stats for
581 * @param msgs Array of struct i2c_msg
582 * @param num_msgs Number of i2c_msgs
583 */
i2c_xfer_stats(const struct device * dev,struct i2c_msg * msgs,uint8_t num_msgs)584 static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
585 uint8_t num_msgs)
586 {
587 struct i2c_device_state *state =
588 CONTAINER_OF(dev->state, struct i2c_device_state, devstate);
589 uint32_t bytes_read = 0U;
590 uint32_t bytes_written = 0U;
591
592 STATS_INC(state->stats, transfer_call_count);
593 STATS_INCN(state->stats, message_count, num_msgs);
594 for (uint8_t i = 0U; i < num_msgs; i++) {
595 if (msgs[i].flags & I2C_MSG_READ) {
596 bytes_read += msgs[i].len;
597 } else {
598 bytes_written += msgs[i].len;
599 }
600 }
601 STATS_INCN(state->stats, bytes_read, bytes_read);
602 STATS_INCN(state->stats, bytes_written, bytes_written);
603 }
604
605 /** @cond INTERNAL_HIDDEN */
606
607 /**
608 * @brief Define a statically allocated and section assigned i2c device state
609 */
610 #define Z_I2C_DEVICE_STATE_DEFINE(dev_id) \
611 static struct i2c_device_state Z_DEVICE_STATE_NAME(dev_id) \
612 __attribute__((__section__(".z_devstate")))
613
614 /**
615 * @brief Define an i2c device init wrapper function
616 *
617 * This does device instance specific initialization of common data (such as stats)
618 * and calls the given init_fn
619 */
620 #define Z_I2C_INIT_FN(dev_id, init_fn) \
621 static inline int UTIL_CAT(dev_id, _init)(const struct device *dev) \
622 { \
623 struct i2c_device_state *state = \
624 CONTAINER_OF(dev->state, struct i2c_device_state, devstate); \
625 stats_init(&state->stats.s_hdr, STATS_SIZE_32, 4, \
626 STATS_NAME_INIT_PARMS(i2c)); \
627 stats_register(dev->name, &(state->stats.s_hdr)); \
628 if (!is_null_no_warn(init_fn)) { \
629 return init_fn(dev); \
630 } \
631 \
632 return 0; \
633 }
634
635 /** @endcond */
636
637 /**
638 * @brief Like DEVICE_DT_DEFINE() with I2C specifics.
639 *
640 * @details Defines a device which implements the I2C API. May
641 * generate a custom device_state container struct and init_fn
642 * wrapper when needed depending on I2C @kconfig{CONFIG_I2C_STATS}.
643 *
644 * @param node_id The devicetree node identifier.
645 *
646 * @param init_fn Name of the init function of the driver. Can be `NULL`.
647 *
648 * @param pm PM device resources reference (NULL if device does not use PM).
649 *
650 * @param data Pointer to the device's private data.
651 *
652 * @param config The address to the structure containing the
653 * configuration information for this instance of the driver.
654 *
655 * @param level The initialization level. See SYS_INIT() for
656 * details.
657 *
658 * @param prio Priority within the selected initialization level. See
659 * SYS_INIT() for details.
660 *
661 * @param api Provides an initial pointer to the API function struct
662 * used by the driver. Can be NULL.
663 */
664 #define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
665 prio, api, ...) \
666 Z_I2C_DEVICE_STATE_DEFINE(Z_DEVICE_DT_DEV_ID(node_id)); \
667 Z_I2C_INIT_FN(Z_DEVICE_DT_DEV_ID(node_id), init_fn) \
668 Z_DEVICE_DEFINE(node_id, Z_DEVICE_DT_DEV_ID(node_id), \
669 DEVICE_DT_NAME(node_id), \
670 &UTIL_CAT(Z_DEVICE_DT_DEV_ID(node_id), _init), \
671 pm, data, config, level, prio, api, \
672 &(Z_DEVICE_STATE_NAME(Z_DEVICE_DT_DEV_ID(node_id)).devstate), \
673 __VA_ARGS__)
674
675 #else /* CONFIG_I2C_STATS */
676
i2c_xfer_stats(const struct device * dev,struct i2c_msg * msgs,uint8_t num_msgs)677 static inline void i2c_xfer_stats(const struct device *dev, struct i2c_msg *msgs,
678 uint8_t num_msgs)
679 {
680 ARG_UNUSED(dev);
681 ARG_UNUSED(msgs);
682 ARG_UNUSED(num_msgs);
683 }
684
685 #define I2C_DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
686 prio, api, ...) \
687 DEVICE_DT_DEFINE(node_id, init_fn, pm, data, config, level, \
688 prio, api, __VA_ARGS__)
689
690 #endif /* CONFIG_I2C_STATS */
691
692 /**
693 * @brief Like I2C_DEVICE_DT_DEFINE() for an instance of a DT_DRV_COMPAT compatible
694 *
695 * @param inst instance number. This is replaced by
696 * <tt>DT_DRV_COMPAT(inst)</tt> in the call to I2C_DEVICE_DT_DEFINE().
697 *
698 * @param ... other parameters as expected by I2C_DEVICE_DT_DEFINE().
699 */
700 #define I2C_DEVICE_DT_INST_DEFINE(inst, ...) \
701 I2C_DEVICE_DT_DEFINE(DT_DRV_INST(inst), __VA_ARGS__)
702
703
704 /**
705 * @brief Configure operation of a host controller.
706 *
707 * @param dev Pointer to the device structure for the driver instance.
708 * @param dev_config Bit-packed 32-bit value to the device runtime configuration
709 * for the I2C controller.
710 *
711 * @retval 0 If successful.
712 * @retval -EIO General input / output error, failed to configure device.
713 */
714 __syscall int i2c_configure(const struct device *dev, uint32_t dev_config);
715
z_impl_i2c_configure(const struct device * dev,uint32_t dev_config)716 static inline int z_impl_i2c_configure(const struct device *dev,
717 uint32_t dev_config)
718 {
719 const struct i2c_driver_api *api =
720 (const struct i2c_driver_api *)dev->api;
721
722 return api->configure(dev, dev_config);
723 }
724
725 /**
726 * @brief Get configuration of a host controller.
727 *
728 * This routine provides a way to get current configuration. It is allowed to
729 * call the function before i2c_configure, because some I2C ports can be
730 * configured during init process. However, if the I2C port is not configured,
731 * i2c_get_config returns an error.
732 *
733 * i2c_get_config can return cached config or probe hardware, but it has to be
734 * up to date with current configuration.
735 *
736 * @param dev Pointer to the device structure for the driver instance.
737 * @param dev_config Pointer to return bit-packed 32-bit value of
738 * the I2C controller configuration.
739 *
740 * @retval 0 If successful.
741 * @retval -EIO General input / output error.
742 * @retval -ERANGE Configured I2C frequency is invalid.
743 * @retval -ENOSYS If get config is not implemented
744 */
745 __syscall int i2c_get_config(const struct device *dev, uint32_t *dev_config);
746
z_impl_i2c_get_config(const struct device * dev,uint32_t * dev_config)747 static inline int z_impl_i2c_get_config(const struct device *dev, uint32_t *dev_config)
748 {
749 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
750
751 if (api->get_config == NULL) {
752 return -ENOSYS;
753 }
754
755 return api->get_config(dev, dev_config);
756 }
757
758 /**
759 * @brief Perform data transfer to another I2C device in controller mode.
760 *
761 * This routine provides a generic interface to perform data transfer
762 * to another I2C device synchronously. Use i2c_read()/i2c_write()
763 * for simple read or write.
764 *
765 * The array of message @a msgs must not be NULL. The number of
766 * message @a num_msgs may be zero,in which case no transfer occurs.
767 *
768 * @note Not all scatter/gather transactions can be supported by all
769 * drivers. As an example, a gather write (multiple consecutive
770 * `i2c_msg` buffers all configured for `I2C_MSG_WRITE`) may be packed
771 * into a single transaction by some drivers, but others may emit each
772 * fragment as a distinct write transaction, which will not produce
773 * the same behavior. See the documentation of `struct i2c_msg` for
774 * limitations on support for multi-message bus transactions.
775 *
776 * @note The last message in the scatter/gather transaction implies a STOP
777 * whether or not it is explicitly set. This ensures the bus is in a good
778 * state for the next transaction which may be from a different call context.
779 *
780 * @param dev Pointer to the device structure for an I2C controller
781 * driver configured in controller mode.
782 * @param msgs Array of messages to transfer.
783 * @param num_msgs Number of messages to transfer.
784 * @param addr Address of the I2C target device.
785 *
786 * @retval 0 If successful.
787 * @retval -EIO General input / output error.
788 */
789 __syscall int i2c_transfer(const struct device *dev,
790 struct i2c_msg *msgs, uint8_t num_msgs,
791 uint16_t addr);
792
z_impl_i2c_transfer(const struct device * dev,struct i2c_msg * msgs,uint8_t num_msgs,uint16_t addr)793 static inline int z_impl_i2c_transfer(const struct device *dev,
794 struct i2c_msg *msgs, uint8_t num_msgs,
795 uint16_t addr)
796 {
797 const struct i2c_driver_api *api =
798 (const struct i2c_driver_api *)dev->api;
799
800 if (!num_msgs) {
801 return 0;
802 }
803
804 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
805 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
806 }
807
808 int res = api->transfer(dev, msgs, num_msgs, addr);
809
810 i2c_xfer_stats(dev, msgs, num_msgs);
811
812 if (IS_ENABLED(CONFIG_I2C_DUMP_MESSAGES)) {
813 i2c_dump_msgs_rw(dev, msgs, num_msgs, addr, true);
814 }
815
816 return res;
817 }
818
819 #if defined(CONFIG_I2C_CALLBACK) || defined(__DOXYGEN__)
820
821 /**
822 * @brief Perform data transfer to another I2C device in controller mode.
823 *
824 * This routine provides a generic interface to perform data transfer
825 * to another I2C device asynchronously with a callback completion.
826 *
827 * @see i2c_transfer()
828 * @funcprops \isr_ok
829 *
830 * @param dev Pointer to the device structure for an I2C controller
831 * driver configured in controller mode.
832 * @param msgs Array of messages to transfer, must live until callback completes.
833 * @param num_msgs Number of messages to transfer.
834 * @param addr Address of the I2C target device.
835 * @param cb Function pointer for completion callback.
836 * @param userdata Userdata passed to callback.
837 *
838 * @retval 0 If successful.
839 * @retval -EIO General input / output error.
840 * @retval -ENOSYS If transfer async is not implemented
841 * @retval -EWOULDBLOCK If the device is temporarily busy doing another transfer
842 */
i2c_transfer_cb(const struct device * dev,struct i2c_msg * msgs,uint8_t num_msgs,uint16_t addr,i2c_callback_t cb,void * userdata)843 static inline int i2c_transfer_cb(const struct device *dev,
844 struct i2c_msg *msgs,
845 uint8_t num_msgs,
846 uint16_t addr,
847 i2c_callback_t cb,
848 void *userdata)
849 {
850 const struct i2c_driver_api *api =
851 (const struct i2c_driver_api *)dev->api;
852
853 if (api->transfer_cb == NULL) {
854 return -ENOSYS;
855 }
856
857 if (!num_msgs) {
858 cb(dev, 0, userdata);
859 return 0;
860 }
861
862 if (!IS_ENABLED(CONFIG_I2C_ALLOW_NO_STOP_TRANSACTIONS)) {
863 msgs[num_msgs - 1].flags |= I2C_MSG_STOP;
864 }
865
866 return api->transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
867 }
868
869 /**
870 * @brief Perform data transfer to another I2C device in master mode asynchronously.
871 *
872 * This is equivalent to:
873 *
874 * i2c_transfer_cb(spec->bus, msgs, num_msgs, spec->addr, cb, userdata);
875 *
876 * @param spec I2C specification from devicetree.
877 * @param msgs Array of messages to transfer.
878 * @param num_msgs Number of messages to transfer.
879 * @param cb Function pointer for completion callback.
880 * @param userdata Userdata passed to callback.
881 *
882 * @return a value from i2c_transfer_cb()
883 */
i2c_transfer_cb_dt(const struct i2c_dt_spec * spec,struct i2c_msg * msgs,uint8_t num_msgs,i2c_callback_t cb,void * userdata)884 static inline int i2c_transfer_cb_dt(const struct i2c_dt_spec *spec,
885 struct i2c_msg *msgs,
886 uint8_t num_msgs,
887 i2c_callback_t cb,
888 void *userdata)
889 {
890 return i2c_transfer_cb(spec->bus, msgs, num_msgs, spec->addr, cb, userdata);
891 }
892
893 /**
894 * @brief Write then read data from an I2C device asynchronously.
895 *
896 * This supports the common operation "this is what I want", "now give
897 * it to me" transaction pair through a combined write-then-read bus
898 * transaction but using i2c_transfer_cb. This helper function expects
899 * caller to pass a message pointer with 2 and only 2 size.
900 *
901 * @param dev Pointer to the device structure for an I2C controller
902 * driver configured in master mode.
903 * @param msgs Array of messages to transfer.
904 * @param num_msgs Number of messages to transfer.
905 * @param addr Address of the I2C device
906 * @param write_buf Pointer to the data to be written
907 * @param num_write Number of bytes to write
908 * @param read_buf Pointer to storage for read data
909 * @param num_read Number of bytes to read
910 * @param cb Function pointer for completion callback.
911 * @param userdata Userdata passed to callback.
912 *
913 * @retval 0 if successful
914 * @retval negative on error.
915 */
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)916 static inline int i2c_write_read_cb(const struct device *dev, struct i2c_msg *msgs,
917 uint8_t num_msgs, uint16_t addr, const void *write_buf,
918 size_t num_write, void *read_buf, size_t num_read,
919 i2c_callback_t cb, void *userdata)
920 {
921 if ((msgs == NULL) || (num_msgs != 2)) {
922 return -EINVAL;
923 }
924
925 msgs[0].buf = (uint8_t *)write_buf;
926 msgs[0].len = num_write;
927 msgs[0].flags = I2C_MSG_WRITE;
928
929 msgs[1].buf = (uint8_t *)read_buf;
930 msgs[1].len = num_read;
931 msgs[1].flags = I2C_MSG_RESTART | I2C_MSG_READ | I2C_MSG_STOP;
932
933 return i2c_transfer_cb(dev, msgs, num_msgs, addr, cb, userdata);
934 }
935
936 /**
937 * @brief Write then read data from an I2C device asynchronously.
938 *
939 * This is equivalent to:
940 *
941 * i2c_write_read_cb(spec->bus, msgs, num_msgs,
942 * spec->addr, write_buf,
943 * num_write, read_buf, num_read);
944 *
945 * @param spec I2C specification from devicetree.
946 * @param msgs Array of messages to transfer.
947 * @param num_msgs Number of messages to transfer.
948 * @param write_buf Pointer to the data to be written
949 * @param num_write Number of bytes to write
950 * @param read_buf Pointer to storage for read data
951 * @param num_read Number of bytes to read
952 * @param cb Function pointer for completion callback.
953 * @param userdata Userdata passed to callback.
954 *
955 * @return a value from i2c_write_read_cb()
956 */
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)957 static inline int i2c_write_read_cb_dt(const struct i2c_dt_spec *spec, struct i2c_msg *msgs,
958 uint8_t num_msgs, const void *write_buf, size_t num_write,
959 void *read_buf, size_t num_read, i2c_callback_t cb,
960 void *userdata)
961 {
962 return i2c_write_read_cb(spec->bus, msgs, num_msgs, spec->addr, write_buf, num_write,
963 read_buf, num_read, cb, userdata);
964 }
965
966 #if defined(CONFIG_POLL) || defined(__DOXYGEN__)
967
968 /** @cond INTERNAL_HIDDEN */
969 void z_i2c_transfer_signal_cb(const struct device *dev, int result, void *userdata);
970 /** @endcond */
971
972 /**
973 * @brief Perform data transfer to another I2C device in controller mode.
974 *
975 * This routine provides a generic interface to perform data transfer
976 * to another I2C device asynchronously with a k_poll_signal completion.
977 *
978 * @see i2c_transfer_cb()
979 * @funcprops \isr_ok
980 *
981 * @param dev Pointer to the device structure for an I2C controller
982 * driver configured in controller mode.
983 * @param msgs Array of messages to transfer, must live until callback completes.
984 * @param num_msgs Number of messages to transfer.
985 * @param addr Address of the I2C target device.
986 * @param sig Signal to notify of transfer completion.
987 *
988 * @retval 0 If successful.
989 * @retval -EIO General input / output error.
990 * @retval -ENOSYS If transfer async is not implemented
991 * @retval -EWOULDBLOCK If the device is temporarily busy doing another transfer
992 */
i2c_transfer_signal(const struct device * dev,struct i2c_msg * msgs,uint8_t num_msgs,uint16_t addr,struct k_poll_signal * sig)993 static inline int i2c_transfer_signal(const struct device *dev,
994 struct i2c_msg *msgs,
995 uint8_t num_msgs,
996 uint16_t addr,
997 struct k_poll_signal *sig)
998 {
999 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
1000
1001 if (api->transfer_cb == NULL) {
1002 return -ENOSYS;
1003 }
1004
1005 return api->transfer_cb(dev, msgs, num_msgs, addr, z_i2c_transfer_signal_cb, sig);
1006 }
1007
1008 #endif /* CONFIG_POLL */
1009
1010 #endif /* CONFIG_I2C_CALLBACK */
1011
1012
1013 #if defined(CONFIG_I2C_RTIO) || defined(__DOXYGEN__)
1014
1015 /**
1016 * @brief Fallback submit implementation
1017 *
1018 * This implementation will schedule a blocking I2C transaction on the bus via the RTIO work
1019 * queue. It is only used if the I2C driver did not implement the iodev_submit function.
1020 *
1021 * @param dev Pointer to the device structure for an I2C controller driver.
1022 * @param iodev_sqe Prepared submissions queue entry connected to an iodev
1023 * defined by I2C_DT_IODEV_DEFINE.
1024 */
1025 void i2c_iodev_submit_fallback(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe);
1026
1027 /**
1028 * @brief Submit request(s) to an I2C device with RTIO
1029 *
1030 * @param iodev_sqe Prepared submissions queue entry connected to an iodev
1031 * defined by I2C_DT_IODEV_DEFINE.
1032 */
i2c_iodev_submit(struct rtio_iodev_sqe * iodev_sqe)1033 static inline void i2c_iodev_submit(struct rtio_iodev_sqe *iodev_sqe)
1034 {
1035 const struct i2c_dt_spec *dt_spec = (const struct i2c_dt_spec *)iodev_sqe->sqe.iodev->data;
1036 const struct device *dev = dt_spec->bus;
1037 const struct i2c_driver_api *api = (const struct i2c_driver_api *)dev->api;
1038
1039 if (api->iodev_submit == NULL) {
1040 rtio_iodev_sqe_err(iodev_sqe, -ENOSYS);
1041 return;
1042 }
1043 api->iodev_submit(dt_spec->bus, iodev_sqe);
1044 }
1045
1046 extern const struct rtio_iodev_api i2c_iodev_api;
1047
1048 /**
1049 * @brief Define an iodev for a given dt node on the bus
1050 *
1051 * These do not need to be shared globally but doing so
1052 * will save a small amount of memory.
1053 *
1054 * @param name Symbolic name of the iodev to define
1055 * @param node_id Devicetree node identifier
1056 */
1057 #define I2C_DT_IODEV_DEFINE(name, node_id) \
1058 const struct i2c_dt_spec _i2c_dt_spec_##name = \
1059 I2C_DT_SPEC_GET(node_id); \
1060 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name)
1061
1062 /**
1063 * @brief Define an iodev for a given i2c device on a bus
1064 *
1065 * These do not need to be shared globally but doing so
1066 * will save a small amount of memory.
1067 *
1068 * @param name Symbolic name of the iodev to define
1069 * @param _bus Node ID for I2C bus
1070 * @param _addr I2C target address
1071 */
1072 #define I2C_IODEV_DEFINE(name, _bus, _addr) \
1073 const struct i2c_dt_spec _i2c_dt_spec_##name = { \
1074 .bus = DEVICE_DT_GET(_bus), \
1075 .addr = _addr, \
1076 }; \
1077 RTIO_IODEV_DEFINE(name, &i2c_iodev_api, (void *)&_i2c_dt_spec_##name)
1078
1079 /**
1080 * @brief Copy the i2c_msgs into a set of RTIO requests
1081 *
1082 * @param r RTIO context
1083 * @param iodev RTIO IODev to target for the submissions
1084 * @param msgs Array of messages
1085 * @param num_msgs Number of i2c msgs in array
1086 *
1087 * @retval sqe Last submission in the queue added
1088 * @retval NULL Not enough memory in the context to copy the requests
1089 */
1090 struct rtio_sqe *i2c_rtio_copy(struct rtio *r,
1091 struct rtio_iodev *iodev,
1092 const struct i2c_msg *msgs,
1093 uint8_t num_msgs);
1094
1095 #endif /* CONFIG_I2C_RTIO */
1096
1097 /**
1098 * @brief Perform data transfer to another I2C device in controller mode.
1099 *
1100 * This is equivalent to:
1101 *
1102 * i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
1103 *
1104 * @param spec I2C specification from devicetree.
1105 * @param msgs Array of messages to transfer.
1106 * @param num_msgs Number of messages to transfer.
1107 *
1108 * @return a value from i2c_transfer()
1109 */
i2c_transfer_dt(const struct i2c_dt_spec * spec,struct i2c_msg * msgs,uint8_t num_msgs)1110 static inline int i2c_transfer_dt(const struct i2c_dt_spec *spec,
1111 struct i2c_msg *msgs, uint8_t num_msgs)
1112 {
1113 return i2c_transfer(spec->bus, msgs, num_msgs, spec->addr);
1114 }
1115
1116 /**
1117 * @brief Recover the I2C bus
1118 *
1119 * Attempt to recover the I2C bus.
1120 *
1121 * @param dev Pointer to the device structure for an I2C controller
1122 * driver configured in controller mode.
1123 * @retval 0 If successful
1124 * @retval -EBUSY If bus is not clear after recovery attempt.
1125 * @retval -EIO General input / output error.
1126 * @retval -ENOSYS If bus recovery is not implemented
1127 */
1128 __syscall int i2c_recover_bus(const struct device *dev);
1129
z_impl_i2c_recover_bus(const struct device * dev)1130 static inline int z_impl_i2c_recover_bus(const struct device *dev)
1131 {
1132 const struct i2c_driver_api *api =
1133 (const struct i2c_driver_api *)dev->api;
1134
1135 if (api->recover_bus == NULL) {
1136 return -ENOSYS;
1137 }
1138
1139 return api->recover_bus(dev);
1140 }
1141
1142 /**
1143 * @brief Registers the provided config as Target device of a controller.
1144 *
1145 * Enable I2C target mode for the 'dev' I2C bus driver using the provided
1146 * 'config' struct containing the functions and parameters to send bus
1147 * events. The I2C target will be registered at the address provided as 'address'
1148 * struct member. Addressing mode - 7 or 10 bit - depends on the 'flags'
1149 * struct member. Any I2C bus events related to the target mode will be passed
1150 * onto I2C target device driver via a set of callback functions provided in
1151 * the 'callbacks' struct member.
1152 *
1153 * Most of the existing hardware allows simultaneous support for controller
1154 * and target mode. This is however not guaranteed.
1155 *
1156 * @param dev Pointer to the device structure for an I2C controller
1157 * driver configured in target mode.
1158 * @param cfg Config struct with functions and parameters used by the I2C driver
1159 * to send bus events
1160 *
1161 * @retval 0 Is successful
1162 * @retval -EINVAL If parameters are invalid
1163 * @retval -EIO General input / output error.
1164 * @retval -ENOSYS If target mode is not implemented
1165 */
i2c_target_register(const struct device * dev,struct i2c_target_config * cfg)1166 static inline int i2c_target_register(const struct device *dev,
1167 struct i2c_target_config *cfg)
1168 {
1169 const struct i2c_driver_api *api =
1170 (const struct i2c_driver_api *)dev->api;
1171
1172 if (api->target_register == NULL) {
1173 return -ENOSYS;
1174 }
1175
1176 return api->target_register(dev, cfg);
1177 }
1178
1179 /**
1180 * @brief Unregisters the provided config as Target device
1181 *
1182 * This routine disables I2C target mode for the 'dev' I2C bus driver using
1183 * the provided 'config' struct containing the functions and parameters
1184 * to send bus events.
1185 *
1186 * @param dev Pointer to the device structure for an I2C controller
1187 * driver configured in target mode.
1188 * @param cfg Config struct with functions and parameters used by the I2C driver
1189 * to send bus events
1190 *
1191 * @retval 0 Is successful
1192 * @retval -EINVAL If parameters are invalid
1193 * @retval -ENOSYS If target mode is not implemented
1194 */
i2c_target_unregister(const struct device * dev,struct i2c_target_config * cfg)1195 static inline int i2c_target_unregister(const struct device *dev,
1196 struct i2c_target_config *cfg)
1197 {
1198 const struct i2c_driver_api *api =
1199 (const struct i2c_driver_api *)dev->api;
1200
1201 if (api->target_unregister == NULL) {
1202 return -ENOSYS;
1203 }
1204
1205 return api->target_unregister(dev, cfg);
1206 }
1207
1208 /**
1209 * @brief Instructs the I2C Target device to register itself to the I2C Controller
1210 *
1211 * This routine instructs the I2C Target device to register itself to the I2C
1212 * Controller via its parent controller's i2c_target_register() API.
1213 *
1214 * @param dev Pointer to the device structure for the I2C target
1215 * device (not itself an I2C controller).
1216 *
1217 * @retval 0 Is successful
1218 * @retval -EINVAL If parameters are invalid
1219 * @retval -EIO General input / output error.
1220 */
1221 __syscall int i2c_target_driver_register(const struct device *dev);
1222
z_impl_i2c_target_driver_register(const struct device * dev)1223 static inline int z_impl_i2c_target_driver_register(const struct device *dev)
1224 {
1225 const struct i2c_target_driver_api *api =
1226 (const struct i2c_target_driver_api *)dev->api;
1227
1228 return api->driver_register(dev);
1229 }
1230
1231 /**
1232 * @brief Instructs the I2C Target device to unregister itself from the I2C
1233 * Controller
1234 *
1235 * This routine instructs the I2C Target device to unregister itself from the I2C
1236 * Controller via its parent controller's i2c_target_register() API.
1237 *
1238 * @param dev Pointer to the device structure for the I2C target
1239 * device (not itself an I2C controller).
1240 *
1241 * @retval 0 Is successful
1242 * @retval -EINVAL If parameters are invalid
1243 */
1244 __syscall int i2c_target_driver_unregister(const struct device *dev);
1245
z_impl_i2c_target_driver_unregister(const struct device * dev)1246 static inline int z_impl_i2c_target_driver_unregister(const struct device *dev)
1247 {
1248 const struct i2c_target_driver_api *api =
1249 (const struct i2c_target_driver_api *)dev->api;
1250
1251 return api->driver_unregister(dev);
1252 }
1253
1254 /*
1255 * Derived i2c APIs -- all implemented in terms of i2c_transfer()
1256 */
1257
1258 /**
1259 * @brief Write a set amount of data to an I2C device.
1260 *
1261 * This routine writes a set amount of data synchronously.
1262 *
1263 * @param dev Pointer to the device structure for an I2C controller
1264 * driver configured in controller mode.
1265 * @param buf Memory pool from which the data is transferred.
1266 * @param num_bytes Number of bytes to write.
1267 * @param addr Address to the target I2C device for writing.
1268 *
1269 * @retval 0 If successful.
1270 * @retval -EIO General input / output error.
1271 */
i2c_write(const struct device * dev,const uint8_t * buf,uint32_t num_bytes,uint16_t addr)1272 static inline int i2c_write(const struct device *dev, const uint8_t *buf,
1273 uint32_t num_bytes, uint16_t addr)
1274 {
1275 struct i2c_msg msg;
1276
1277 msg.buf = (uint8_t *)buf;
1278 msg.len = num_bytes;
1279 msg.flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1280
1281 return i2c_transfer(dev, &msg, 1, addr);
1282 }
1283
1284 /**
1285 * @brief Write a set amount of data to an I2C device.
1286 *
1287 * This is equivalent to:
1288 *
1289 * i2c_write(spec->bus, buf, num_bytes, spec->addr);
1290 *
1291 * @param spec I2C specification from devicetree.
1292 * @param buf Memory pool from which the data is transferred.
1293 * @param num_bytes Number of bytes to write.
1294 *
1295 * @return a value from i2c_write()
1296 */
i2c_write_dt(const struct i2c_dt_spec * spec,const uint8_t * buf,uint32_t num_bytes)1297 static inline int i2c_write_dt(const struct i2c_dt_spec *spec,
1298 const uint8_t *buf, uint32_t num_bytes)
1299 {
1300 return i2c_write(spec->bus, buf, num_bytes, spec->addr);
1301 }
1302
1303 /**
1304 * @brief Read a set amount of data from an I2C device.
1305 *
1306 * This routine reads a set amount of data synchronously.
1307 *
1308 * @param dev Pointer to the device structure for an I2C controller
1309 * driver configured in controller mode.
1310 * @param buf Memory pool that stores the retrieved data.
1311 * @param num_bytes Number of bytes to read.
1312 * @param addr Address of the I2C device being read.
1313 *
1314 * @retval 0 If successful.
1315 * @retval -EIO General input / output error.
1316 */
i2c_read(const struct device * dev,uint8_t * buf,uint32_t num_bytes,uint16_t addr)1317 static inline int i2c_read(const struct device *dev, uint8_t *buf,
1318 uint32_t num_bytes, uint16_t addr)
1319 {
1320 struct i2c_msg msg;
1321
1322 msg.buf = buf;
1323 msg.len = num_bytes;
1324 msg.flags = I2C_MSG_READ | I2C_MSG_STOP;
1325
1326 return i2c_transfer(dev, &msg, 1, addr);
1327 }
1328
1329 /**
1330 * @brief Read a set amount of data from an I2C device.
1331 *
1332 * This is equivalent to:
1333 *
1334 * i2c_read(spec->bus, buf, num_bytes, spec->addr);
1335 *
1336 * @param spec I2C specification from devicetree.
1337 * @param buf Memory pool that stores the retrieved data.
1338 * @param num_bytes Number of bytes to read.
1339 *
1340 * @return a value from i2c_read()
1341 */
i2c_read_dt(const struct i2c_dt_spec * spec,uint8_t * buf,uint32_t num_bytes)1342 static inline int i2c_read_dt(const struct i2c_dt_spec *spec,
1343 uint8_t *buf, uint32_t num_bytes)
1344 {
1345 return i2c_read(spec->bus, buf, num_bytes, spec->addr);
1346 }
1347
1348 /**
1349 * @brief Write then read data from an I2C device.
1350 *
1351 * This supports the common operation "this is what I want", "now give
1352 * it to me" transaction pair through a combined write-then-read bus
1353 * transaction.
1354 *
1355 * @param dev Pointer to the device structure for an I2C controller
1356 * driver configured in controller mode.
1357 * @param addr Address of the I2C device
1358 * @param write_buf Pointer to the data to be written
1359 * @param num_write Number of bytes to write
1360 * @param read_buf Pointer to storage for read data
1361 * @param num_read Number of bytes to read
1362 *
1363 * @retval 0 if successful
1364 * @retval negative on error.
1365 */
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)1366 static inline int i2c_write_read(const struct device *dev, uint16_t addr,
1367 const void *write_buf, size_t num_write,
1368 void *read_buf, size_t num_read)
1369 {
1370 struct i2c_msg msg[2];
1371
1372 msg[0].buf = (uint8_t *)write_buf;
1373 msg[0].len = num_write;
1374 msg[0].flags = I2C_MSG_WRITE;
1375
1376 msg[1].buf = (uint8_t *)read_buf;
1377 msg[1].len = num_read;
1378 msg[1].flags = I2C_MSG_RESTART | I2C_MSG_READ | I2C_MSG_STOP;
1379
1380 return i2c_transfer(dev, msg, 2, addr);
1381 }
1382
1383 /**
1384 * @brief Write then read data from an I2C device.
1385 *
1386 * This is equivalent to:
1387 *
1388 * i2c_write_read(spec->bus, spec->addr,
1389 * write_buf, num_write,
1390 * read_buf, num_read);
1391 *
1392 * @param spec I2C specification from devicetree.
1393 * @param write_buf Pointer to the data to be written
1394 * @param num_write Number of bytes to write
1395 * @param read_buf Pointer to storage for read data
1396 * @param num_read Number of bytes to read
1397 *
1398 * @return a value from i2c_write_read()
1399 */
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)1400 static inline int i2c_write_read_dt(const struct i2c_dt_spec *spec,
1401 const void *write_buf, size_t num_write,
1402 void *read_buf, size_t num_read)
1403 {
1404 return i2c_write_read(spec->bus, spec->addr,
1405 write_buf, num_write,
1406 read_buf, num_read);
1407 }
1408
1409 /**
1410 * @brief Read multiple bytes from an internal address of an I2C device.
1411 *
1412 * This routine reads multiple bytes from an internal address of an
1413 * I2C device synchronously.
1414 *
1415 * Instances of this may be replaced by i2c_write_read().
1416 *
1417 * @param dev Pointer to the device structure for an I2C controller
1418 * driver configured in controller mode.
1419 * @param dev_addr Address of the I2C device for reading.
1420 * @param start_addr Internal address from which the data is being read.
1421 * @param buf Memory pool that stores the retrieved data.
1422 * @param num_bytes Number of bytes being read.
1423 *
1424 * @retval 0 If successful.
1425 * @retval -EIO General input / output error.
1426 */
i2c_burst_read(const struct device * dev,uint16_t dev_addr,uint8_t start_addr,uint8_t * buf,uint32_t num_bytes)1427 static inline int i2c_burst_read(const struct device *dev,
1428 uint16_t dev_addr,
1429 uint8_t start_addr,
1430 uint8_t *buf,
1431 uint32_t num_bytes)
1432 {
1433 return i2c_write_read(dev, dev_addr,
1434 &start_addr, sizeof(start_addr),
1435 buf, num_bytes);
1436 }
1437
1438 /**
1439 * @brief Read multiple bytes from an internal address of an I2C device.
1440 *
1441 * This is equivalent to:
1442 *
1443 * i2c_burst_read(spec->bus, spec->addr, start_addr, buf, num_bytes);
1444 *
1445 * @param spec I2C specification from devicetree.
1446 * @param start_addr Internal address from which the data is being read.
1447 * @param buf Memory pool that stores the retrieved data.
1448 * @param num_bytes Number of bytes to read.
1449 *
1450 * @return a value from i2c_burst_read()
1451 */
i2c_burst_read_dt(const struct i2c_dt_spec * spec,uint8_t start_addr,uint8_t * buf,uint32_t num_bytes)1452 static inline int i2c_burst_read_dt(const struct i2c_dt_spec *spec,
1453 uint8_t start_addr,
1454 uint8_t *buf,
1455 uint32_t num_bytes)
1456 {
1457 return i2c_burst_read(spec->bus, spec->addr,
1458 start_addr, buf, num_bytes);
1459 }
1460
1461 /**
1462 * @brief Write multiple bytes to an internal address of an I2C device.
1463 *
1464 * This routine writes multiple bytes to an internal address of an
1465 * I2C device synchronously.
1466 *
1467 * @warning The combined write synthesized by this API may not be
1468 * supported on all I2C devices. Uses of this API may be made more
1469 * portable by replacing them with calls to i2c_write() passing a
1470 * buffer containing the combined address and data.
1471 *
1472 * @param dev Pointer to the device structure for an I2C controller
1473 * driver configured in controller mode.
1474 * @param dev_addr Address of the I2C device for writing.
1475 * @param start_addr Internal address to which the data is being written.
1476 * @param buf Memory pool from which the data is transferred.
1477 * @param num_bytes Number of bytes being written.
1478 *
1479 * @retval 0 If successful.
1480 * @retval -EIO General input / output error.
1481 */
i2c_burst_write(const struct device * dev,uint16_t dev_addr,uint8_t start_addr,const uint8_t * buf,uint32_t num_bytes)1482 static inline int i2c_burst_write(const struct device *dev,
1483 uint16_t dev_addr,
1484 uint8_t start_addr,
1485 const uint8_t *buf,
1486 uint32_t num_bytes)
1487 {
1488 struct i2c_msg msg[2];
1489
1490 msg[0].buf = &start_addr;
1491 msg[0].len = 1U;
1492 msg[0].flags = I2C_MSG_WRITE;
1493
1494 msg[1].buf = (uint8_t *)buf;
1495 msg[1].len = num_bytes;
1496 msg[1].flags = I2C_MSG_WRITE | I2C_MSG_STOP;
1497
1498 return i2c_transfer(dev, msg, 2, dev_addr);
1499 }
1500
1501 /**
1502 * @brief Write multiple bytes to an internal address of an I2C device.
1503 *
1504 * This is equivalent to:
1505 *
1506 * i2c_burst_write(spec->bus, spec->addr, start_addr, buf, num_bytes);
1507 *
1508 * @param spec I2C specification from devicetree.
1509 * @param start_addr Internal address to which the data is being written.
1510 * @param buf Memory pool from which the data is transferred.
1511 * @param num_bytes Number of bytes being written.
1512 *
1513 * @return a value from i2c_burst_write()
1514 */
i2c_burst_write_dt(const struct i2c_dt_spec * spec,uint8_t start_addr,const uint8_t * buf,uint32_t num_bytes)1515 static inline int i2c_burst_write_dt(const struct i2c_dt_spec *spec,
1516 uint8_t start_addr,
1517 const uint8_t *buf,
1518 uint32_t num_bytes)
1519 {
1520 return i2c_burst_write(spec->bus, spec->addr,
1521 start_addr, buf, num_bytes);
1522 }
1523
1524 /**
1525 * @brief Read internal register of an I2C device.
1526 *
1527 * This routine reads the value of an 8-bit internal register of an I2C
1528 * device synchronously.
1529 *
1530 * @param dev Pointer to the device structure for an I2C controller
1531 * driver configured in controller mode.
1532 * @param dev_addr Address of the I2C device for reading.
1533 * @param reg_addr Address of the internal register being read.
1534 * @param value Memory pool that stores the retrieved register value.
1535 *
1536 * @retval 0 If successful.
1537 * @retval -EIO General input / output error.
1538 */
i2c_reg_read_byte(const struct device * dev,uint16_t dev_addr,uint8_t reg_addr,uint8_t * value)1539 static inline int i2c_reg_read_byte(const struct device *dev,
1540 uint16_t dev_addr,
1541 uint8_t reg_addr, uint8_t *value)
1542 {
1543 return i2c_write_read(dev, dev_addr,
1544 ®_addr, sizeof(reg_addr),
1545 value, sizeof(*value));
1546 }
1547
1548 /**
1549 * @brief Read internal register of an I2C device.
1550 *
1551 * This is equivalent to:
1552 *
1553 * i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1554 *
1555 * @param spec I2C specification from devicetree.
1556 * @param reg_addr Address of the internal register being read.
1557 * @param value Memory pool that stores the retrieved register value.
1558 *
1559 * @return a value from i2c_reg_read_byte()
1560 */
i2c_reg_read_byte_dt(const struct i2c_dt_spec * spec,uint8_t reg_addr,uint8_t * value)1561 static inline int i2c_reg_read_byte_dt(const struct i2c_dt_spec *spec,
1562 uint8_t reg_addr, uint8_t *value)
1563 {
1564 return i2c_reg_read_byte(spec->bus, spec->addr, reg_addr, value);
1565 }
1566
1567 /**
1568 * @brief Write internal register of an I2C device.
1569 *
1570 * This routine writes a value to an 8-bit internal register of an I2C
1571 * device synchronously.
1572 *
1573 * @note This function internally combines the register and value into
1574 * a single bus transaction.
1575 *
1576 * @param dev Pointer to the device structure for an I2C controller
1577 * driver configured in controller mode.
1578 * @param dev_addr Address of the I2C device for writing.
1579 * @param reg_addr Address of the internal register being written.
1580 * @param value Value to be written to internal register.
1581 *
1582 * @retval 0 If successful.
1583 * @retval -EIO General input / output error.
1584 */
i2c_reg_write_byte(const struct device * dev,uint16_t dev_addr,uint8_t reg_addr,uint8_t value)1585 static inline int i2c_reg_write_byte(const struct device *dev,
1586 uint16_t dev_addr,
1587 uint8_t reg_addr, uint8_t value)
1588 {
1589 uint8_t tx_buf[2] = {reg_addr, value};
1590
1591 return i2c_write(dev, tx_buf, 2, dev_addr);
1592 }
1593
1594 /**
1595 * @brief Write internal register of an I2C device.
1596 *
1597 * This is equivalent to:
1598 *
1599 * i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1600 *
1601 * @param spec I2C specification from devicetree.
1602 * @param reg_addr Address of the internal register being written.
1603 * @param value Value to be written to internal register.
1604 *
1605 * @return a value from i2c_reg_write_byte()
1606 */
i2c_reg_write_byte_dt(const struct i2c_dt_spec * spec,uint8_t reg_addr,uint8_t value)1607 static inline int i2c_reg_write_byte_dt(const struct i2c_dt_spec *spec,
1608 uint8_t reg_addr, uint8_t value)
1609 {
1610 return i2c_reg_write_byte(spec->bus, spec->addr, reg_addr, value);
1611 }
1612
1613 /**
1614 * @brief Update internal register of an I2C device.
1615 *
1616 * This routine updates the value of a set of bits from an 8-bit internal
1617 * register of an I2C device synchronously.
1618 *
1619 * @note If the calculated new register value matches the value that
1620 * was read this function will not generate a write operation.
1621 *
1622 * @param dev Pointer to the device structure for an I2C controller
1623 * driver configured in controller mode.
1624 * @param dev_addr Address of the I2C device for updating.
1625 * @param reg_addr Address of the internal register being updated.
1626 * @param mask Bitmask for updating internal register.
1627 * @param value Value for updating internal register.
1628 *
1629 * @retval 0 If successful.
1630 * @retval -EIO General input / output error.
1631 */
i2c_reg_update_byte(const struct device * dev,uint8_t dev_addr,uint8_t reg_addr,uint8_t mask,uint8_t value)1632 static inline int i2c_reg_update_byte(const struct device *dev,
1633 uint8_t dev_addr,
1634 uint8_t reg_addr, uint8_t mask,
1635 uint8_t value)
1636 {
1637 uint8_t old_value, new_value;
1638 int rc;
1639
1640 rc = i2c_reg_read_byte(dev, dev_addr, reg_addr, &old_value);
1641 if (rc != 0) {
1642 return rc;
1643 }
1644
1645 new_value = (old_value & ~mask) | (value & mask);
1646 if (new_value == old_value) {
1647 return 0;
1648 }
1649
1650 return i2c_reg_write_byte(dev, dev_addr, reg_addr, new_value);
1651 }
1652
1653 /**
1654 * @brief Update internal register of an I2C device.
1655 *
1656 * This is equivalent to:
1657 *
1658 * i2c_reg_update_byte(spec->bus, spec->addr, reg_addr, mask, value);
1659 *
1660 * @param spec I2C specification from devicetree.
1661 * @param reg_addr Address of the internal register being updated.
1662 * @param mask Bitmask for updating internal register.
1663 * @param value Value for updating internal register.
1664 *
1665 * @return a value from i2c_reg_update_byte()
1666 */
i2c_reg_update_byte_dt(const struct i2c_dt_spec * spec,uint8_t reg_addr,uint8_t mask,uint8_t value)1667 static inline int i2c_reg_update_byte_dt(const struct i2c_dt_spec *spec,
1668 uint8_t reg_addr, uint8_t mask,
1669 uint8_t value)
1670 {
1671 return i2c_reg_update_byte(spec->bus, spec->addr,
1672 reg_addr, mask, value);
1673 }
1674
1675 #ifdef __cplusplus
1676 }
1677 #endif
1678
1679 /**
1680 * @}
1681 */
1682
1683 #include <zephyr/syscalls/i2c.h>
1684
1685 #endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_H_ */
1686