/* * Copyright 2020 Google LLC * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_DRIVERS_SENSOR_BMI160_EMUL_BMI160_H_ #define ZEPHYR_DRIVERS_SENSOR_BMI160_EMUL_BMI160_H_ #include #include #ifdef __cplusplus extern "C" { #endif /** * @brief Check if I2C messages are touching a given register (R or W) * * @param[in] msgs The I2C messages in question * @param[in] num_msgs The number of messages in the @p msgs array * @param[in] reg The register to check for * @return True if @p reg is either read or written to * @return False otherwise */ __maybe_unused static bool emul_bmi160_i2c_is_touching_reg(struct i2c_msg *msgs, int num_msgs, uint32_t reg) { if (num_msgs != 2) { return false; } if (msgs[0].len != 1) { return false; } if (i2c_is_read_op(msgs)) { return false; } uint8_t start_reg = msgs[0].buf[0]; uint8_t read_len = msgs[1].len; return (start_reg <= reg) && (reg < start_reg + read_len); } /** * @brief Check if I2C messages are reading a specific register. * * @param[in] msgs The I2C messages in question * @param[in] num_msgs The number of messages in the @p msgs array * @param[in] reg The register to check for * @return True if @p reg is read * @return False otherwise */ __maybe_unused static bool emul_bmi160_i2c_is_reading_reg(struct i2c_msg *msgs, int num_msgs, uint32_t reg) { if (!emul_bmi160_i2c_is_touching_reg(msgs, num_msgs, reg)) { return false; } return i2c_is_read_op(&msgs[1]); } /** * @brief Check if I2C messages are writing to a specific register. * * @param[in] msgs The I2C messages in question * @param[in] num_msgs The number of messages in the @p msgs array * @param[in] reg The register to check for * @return True if @p reg is written * @return False otherwise */ __maybe_unused static bool emul_bmi160_i2c_is_writing_reg(struct i2c_msg *msgs, int num_msgs, uint32_t reg) { if (!emul_bmi160_i2c_is_touching_reg(msgs, num_msgs, reg)) { return false; } return !i2c_is_read_op(&msgs[1]); } /** * @brief Get the internal register value of the emulator * * @param[in] target The emulator in question * @param[in] reg_number The register number to start reading at * @param[out] out Buffer to store the values into * @param[in] count The number of registers to read * @return 0 on success * @return < 0 on error */ int emul_bmi160_get_reg_value(const struct emul *target, int reg_number, uint8_t *out, size_t count); #ifdef __cplusplus } #endif #endif /* ZEPHYR_DRIVERS_SENSOR_BMI160_EMUL_BMI160_H_ */