99 lines
2.5 KiB
C
99 lines
2.5 KiB
C
|
/*
|
||
|
* 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 <zephyr/drivers/emul.h>
|
||
|
#include <zephyr/drivers/i2c.h>
|
||
|
|
||
|
#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_ */
|