Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 28 additions & 8 deletions src/sensor/imu/LSM6DSO.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ int lsm6dso_ext_setup(sensor_ext_mode_t mode, const sensor_mag_t *mag, uint8_t m
break;

case SENSOR_EXT_MODE_I2CM_PROXY:
sensor_interface_ext_configure(&sensor_ext_lsm6dsv);
sensor_interface_ext_configure(&sensor_ext_lsm6dso);
break;

case SENSOR_EXT_MODE_I2CM_AUTONOMOUS:
Expand Down Expand Up @@ -254,9 +254,16 @@ int lsm6dso_ext_write(const uint8_t addr, const uint8_t *buf, uint32_t num_bytes
// Wait for transaction
uint8_t status = 0;
int64_t timeout = k_uptime_get() + 10;
while ((status & 0x80) && k_uptime_get() < timeout) // WR_ONCE_DONE
do {
err |= ssi_reg_read_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_STATUS_MASTER, &status);
err |= ssi_reg_write_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_MASTER_CONFIG, 0x08); // SHUB_PU_EN, disable I2C master

if ((status & 0x80) != 0) {
break;
}

} while (k_uptime_get() < timeout);

err |= ssi_reg_write_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_MASTER_CONFIG, 0x08); // disable I2C master
k_usleep(300);
err |= ssi_reg_write_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_FUNC_CFG_ACCESS, 0x00); // switch to normal registers
if (~status & 0x80)
Expand All @@ -269,7 +276,7 @@ int lsm6dso_ext_write(const uint8_t addr, const uint8_t *buf, uint32_t num_bytes

int lsm6dso_ext_write_read(const uint8_t addr, const uint8_t *write_buf, size_t num_write, uint8_t *read_buf, size_t num_read)
{
if (num_write != 1 || num_read < 1 || num_read > 8)
if (num_write != 1 || num_read < 1 || num_read > 7)
{
LOG_ERR("Unsupported write_read");
return -1;
Expand All @@ -286,14 +293,27 @@ int lsm6dso_ext_write_read(const uint8_t addr, const uint8_t *write_buf, size_t
err |= ssi_reg_write_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_FUNC_CFG_ACCESS, 0x00); // switch to normal registers
uint8_t tmp;
err |= ssi_reg_read_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_OUTX_H_A, &tmp); // clear XLDA

uint8_t status = 0;
int64_t timeout = k_uptime_get() + 10;
while ((status & 0x01) && k_uptime_get() < timeout) // XLDA

do {
err |= ssi_reg_read_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_STATUS_REG, &status);
if ((status & 0x01) != 0) {
break;
}
} while (k_uptime_get() < timeout);

status = 0;
timeout = k_uptime_get() + 10;
while ((status & 0x01) && k_uptime_get() < timeout) // SENS_HUB_ENDOP
err |= ssi_reg_read_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSO_STATUS_MASTER_MAINPAGE, &status);
// SENS_HUB_ENDOP
do {
err |= ssi_reg_read_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_STATUS_MASTER_MAINPAGE, &status);
if ((status & 0x01) != 0) {
break;
}
} while (k_uptime_get() < timeout);

// Read data
err |= ssi_reg_write_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_FUNC_CFG_ACCESS, 0x40); // switch to sensor hub registers
err |= ssi_reg_write_byte(SENSOR_INTERFACE_DEV_IMU, LSM6DSV_MASTER_CONFIG, 0x08); // SHUB_PU_EN, disable I2C master
Expand Down Expand Up @@ -325,5 +345,5 @@ const sensor_imu_t sensor_imu_lsm6dso = {
const sensor_ext_ssi_t sensor_ext_lsm6dso = {
*lsm6dso_ext_write,
*lsm6dso_ext_write_read,
8
7
};