Line data Source code
1 1 : /* 2 : * Copyright 2020 Google LLC 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_INCLUDE_DRIVERS_SPI_SPI_EMUL_H_ 8 : #define ZEPHYR_INCLUDE_DRIVERS_SPI_SPI_EMUL_H_ 9 : 10 : #include <zephyr/device.h> 11 : #include <zephyr/drivers/emul.h> 12 : #include <zephyr/drivers/spi.h> 13 : #include <zephyr/sys/slist.h> 14 : #include <zephyr/types.h> 15 : 16 : /** 17 : * @file 18 : * 19 : * @brief Public APIs for the SPI emulation drivers. 20 : */ 21 : 22 : /** 23 : * @brief SPI Emulation Interface 24 : * @defgroup spi_emul_interface SPI Emulation Interface 25 : * @ingroup io_emulators 26 : * @{ 27 : */ 28 : 29 : #ifdef __cplusplus 30 : extern "C" { 31 : #endif 32 : 33 : struct spi_msg; 34 : struct spi_emul_api; 35 : 36 : /** Node in a linked list of emulators for SPI devices */ 37 1 : struct spi_emul { 38 0 : sys_snode_t node; 39 : 40 : /** Target emulator - REQUIRED for all bus emulators */ 41 1 : const struct emul *target; 42 : 43 : /* API provided for this device */ 44 0 : const struct spi_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 spi_emul_api *mock_api; 51 : 52 : /* SPI chip-select of the emulated device */ 53 0 : uint16_t chipsel; 54 : }; 55 : 56 : /** 57 : * Passes SPI 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 config Pointer to a valid spi_config structure instance. 62 : * Pointer-comparison may be used to detect changes from 63 : * previous operations. 64 : * @param tx_bufs Buffer array where data to be sent originates from, 65 : * or NULL if none. 66 : * @param rx_bufs Buffer array where data to be read will be written to, 67 : * or NULL if none. 68 : * 69 : * @retval 0 If successful. 70 : * @retval -EIO General input / output error. 71 : */ 72 1 : typedef int (*spi_emul_io_t)(const struct emul *target, const struct spi_config *config, 73 : const struct spi_buf_set *tx_bufs, const struct spi_buf_set *rx_bufs); 74 : 75 : /** 76 : * Register an emulated device on the controller 77 : * 78 : * @param dev Device that will use the emulator 79 : * @param emul SPI emulator to use 80 : * @return 0 indicating success (always) 81 : */ 82 1 : int spi_emul_register(const struct device *dev, struct spi_emul *emul); 83 : 84 : /** Definition of the emulator API */ 85 1 : struct spi_emul_api { 86 0 : spi_emul_io_t io; 87 : }; 88 : 89 : /** 90 : * Back door to allow an emulator to retrieve the host configuration. 91 : * 92 : * @param dev SPI device associated with the emulator 93 : * @return Bit-packed 32-bit value containing the device's runtime configuration 94 : */ 95 1 : uint32_t spi_emul_get_config(const struct device *dev); 96 : 97 : #ifdef __cplusplus 98 : } 99 : #endif 100 : 101 : /** 102 : * @} 103 : */ 104 : 105 : #endif /* ZEPHYR_INCLUDE_DRIVERS_SPI_SPI_EMUL_H_ */