Line data Source code
1 1 : /** 2 : * @file 3 : * 4 : * @brief Public APIs for the I2C emulation drivers. 5 : */ 6 : 7 : /* 8 : * Copyright 2020 Google LLC 9 : * Copyright (c) 2020 Nordic Semiconductor ASA 10 : * 11 : * SPDX-License-Identifier: Apache-2.0 12 : */ 13 : #ifndef ZEPHYR_INCLUDE_DRIVERS_I2C_I2C_EMUL_H_ 14 : #define ZEPHYR_INCLUDE_DRIVERS_I2C_I2C_EMUL_H_ 15 : 16 : #include <zephyr/device.h> 17 : #include <zephyr/drivers/emul.h> 18 : #include <zephyr/drivers/i2c.h> 19 : #include <zephyr/sys/slist.h> 20 : #include <zephyr/types.h> 21 : 22 : /** 23 : * @brief I2C Emulation Interface 24 : * @defgroup i2c_emul_interface I2C Emulation Interface 25 : * @ingroup io_emulators 26 : * @{ 27 : */ 28 : 29 : #ifdef __cplusplus 30 : extern "C" { 31 : #endif 32 : 33 : struct i2c_msg; 34 : struct i2c_emul_api; 35 : 36 : /** Node in a linked list of emulators for I2C devices */ 37 1 : struct i2c_emul { 38 0 : sys_snode_t node; 39 : 40 : /** Target emulator - REQUIRED for all emulated bus nodes of any type */ 41 1 : const struct emul *target; 42 : 43 : /* API provided for this device */ 44 0 : const struct i2c_emul_api *api; 45 : 46 : /** 47 : * A mock API that if not NULL will take precedence over the actual API. If set, a return 48 : * value of -ENOSYS will revert back to the default api. 49 : */ 50 1 : struct i2c_emul_api *mock_api; 51 : 52 : /* I2C address of the emulated device */ 53 0 : uint16_t addr; 54 : }; 55 : 56 : /** 57 : * Passes I2C messages to the emulator. The emulator updates the data with what 58 : * was read back. 59 : * 60 : * @param target The device Emulator instance. 61 : * @param msgs Array of messages to transfer. For 'read' messages, this function 62 : * updates the 'buf' member with the data that was read. 63 : * @param num_msgs Number of messages to transfer. 64 : * @param addr Address of the I2C target device. 65 : * 66 : * @retval 0 If successful. 67 : * @retval -EIO General input / output error. 68 : */ 69 1 : typedef int (*i2c_emul_transfer_t)(const struct emul *target, struct i2c_msg *msgs, int num_msgs, 70 : int addr); 71 : 72 : /** 73 : * Register an emulated device on the controller 74 : * 75 : * @param dev Device that will use the emulator 76 : * @param emul I2C emulator to use 77 : * @return 0 indicating success (always) 78 : */ 79 1 : int i2c_emul_register(const struct device *dev, struct i2c_emul *emul); 80 : 81 : /** Definition of the emulator API */ 82 1 : struct i2c_emul_api { 83 0 : i2c_emul_transfer_t transfer; 84 : }; 85 : 86 : #ifdef __cplusplus 87 : } 88 : #endif 89 : 90 : /** 91 : * @} 92 : */ 93 : 94 : #endif /* ZEPHYR_INCLUDE_DRIVERS_I2C_I2C_EMUL_H_ */