From 18716159c9a79a1dae0e07a7e172c66f212a2df9 Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Sun, 29 Mar 2026 11:16:29 +0200 Subject: [PATCH] sensors/bmi270_uorb: support for fixed-point data support for fixed-point data for bmi270_uorb Signed-off-by: raiden00pl --- drivers/sensors/bmi270_uorb.c | 50 +++++++++++++++-------------------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/drivers/sensors/bmi270_uorb.c b/drivers/sensors/bmi270_uorb.c index 4030f8aaf2e..b3bc63652f9 100644 --- a/drivers/sensors/bmi270_uorb.c +++ b/drivers/sensors/bmi270_uorb.c @@ -49,12 +49,6 @@ * Pre-processor Definitions ****************************************************************************/ -/* Only float data type supported now */ - -#ifdef CONFIG_SENSORS_USE_B16 -# error fixed-point data type not supported yet -#endif - #define CONSTANTS_ONE_G 9.8f /**************************************************************************** @@ -72,7 +66,7 @@ struct bmi270_sensor_s { struct sensor_lowerhalf_s lower; uint64_t last_update; - float scale; + sensor_data_t scale; FAR void *dev; bool enabled; #ifdef CONFIG_SENSORS_BMI270_POLL @@ -256,9 +250,9 @@ static int bmi270_fetch(FAR struct sensor_lowerhalf_s *lower, (FAR uint8_t *)data, 6); accel.timestamp = sensor_get_timestamp(); - accel.x = data[0] * priv->scale; - accel.y = data[1] * priv->scale; - accel.z = data[2] * priv->scale; + accel.x = sensor_data_muli(priv->scale, data[0]); + accel.y = sensor_data_muli(priv->scale, data[1]); + accel.z = sensor_data_muli(priv->scale, data[2]); memcpy(buffer, &accel, sizeof(accel)); ret = sizeof(accel); @@ -274,9 +268,9 @@ static int bmi270_fetch(FAR struct sensor_lowerhalf_s *lower, (FAR uint8_t *)data, 6); gyro.timestamp = sensor_get_timestamp(); - gyro.x = data[0] * priv->scale; - gyro.y = data[1] * priv->scale; - gyro.z = data[2] * priv->scale; + gyro.x = sensor_data_muli(priv->scale, data[0]); + gyro.y = sensor_data_muli(priv->scale, data[1]); + gyro.z = sensor_data_muli(priv->scale, data[2]); memcpy(buffer, &gyro, sizeof(gyro)); ret = sizeof(gyro); @@ -363,22 +357,22 @@ static int bmi270_accel_scale(FAR struct bmi270_sensor_s *priv, if (scale < bmi270_midpoint(2, 4)) { bmi270_putreg8(&priv->base, BMI270_ACC_RANGE, ACCEL_RANGE_2G); - priv->scale = CONSTANTS_ONE_G / 16384.f; + priv->scale = sensor_data_ftof(CONSTANTS_ONE_G / 16384.f); } else if (scale < bmi270_midpoint(4, 8)) { bmi270_putreg8(&priv->base, BMI270_ACC_RANGE, ACCEL_RANGE_4G); - priv->scale = CONSTANTS_ONE_G / 8192.f; + priv->scale = sensor_data_ftof(CONSTANTS_ONE_G / 8192.f); } else if (scale < bmi270_midpoint(8, 16)) { bmi270_putreg8(&priv->base, BMI270_ACC_RANGE, ACCEL_RANGE_8G); - priv->scale = CONSTANTS_ONE_G / 4096.f; + priv->scale = sensor_data_ftof(CONSTANTS_ONE_G / 4096.f); } else { bmi270_putreg8(&priv->base, BMI270_ACC_RANGE, ACCEL_RANGE_16G); - priv->scale = CONSTANTS_ONE_G / 2048.f; + priv->scale = sensor_data_ftof(CONSTANTS_ONE_G / 2048.f); } return ret; @@ -396,27 +390,27 @@ static int bmi270_gyro_scale(FAR struct bmi270_sensor_s *priv, if (scale < bmi270_midpoint(125, 250)) { bmi270_putreg8(&priv->base, BMI270_GYR_RANGE, GYRO_RANGE_125); - priv->scale = (M_PI / 180.0f) * 125.f / 32768.f; + priv->scale = sensor_data_ftof((M_PI / 180.0f) * 125.f / 32768.f); } else if (scale < bmi270_midpoint(250, 500)) { bmi270_putreg8(&priv->base, BMI270_GYR_RANGE, GYRO_RANGE_250); - priv->scale = (M_PI / 180.0f) * 250.f / 32768.f; + priv->scale = sensor_data_ftof((M_PI / 180.0f) * 250.f / 32768.f); } else if (scale < bmi270_midpoint(500, 1000)) { bmi270_putreg8(&priv->base, BMI270_GYR_RANGE, GYRO_RANGE_500); - priv->scale = (M_PI / 180.0f) * 500.f / 32768.f; + priv->scale = sensor_data_ftof((M_PI / 180.0f) * 500.f / 32768.f); } else if (scale < bmi270_midpoint(1000, 2000)) { bmi270_putreg8(&priv->base, BMI270_GYR_RANGE, GYRO_RANGE_1000); - priv->scale = (M_PI / 180.0f) * 1000.f / 32768.f; + priv->scale = sensor_data_ftof((M_PI / 180.0f) * 1000.f / 32768.f); } else { bmi270_putreg8(&priv->base, BMI270_GYR_RANGE, GYRO_RANGE_2000); - priv->scale = (M_PI / 180.0f) * 2000.f / 32768.f; + priv->scale = sensor_data_ftof((M_PI / 180.0f) * 2000.f / 32768.f); } return ret; @@ -453,9 +447,9 @@ static void bmi270_accel_data(FAR struct bmi270_sensor_s *priv, priv->last_update = now; accel.timestamp = now; - accel.x = buf[0] * priv->scale; - accel.y = buf[1] * priv->scale; - accel.z = buf[2] * priv->scale; + accel.x = sensor_data_muli(priv->scale, buf[0]); + accel.y = sensor_data_muli(priv->scale, buf[1]); + accel.z = sensor_data_muli(priv->scale, buf[2]); accel.temperature = 0; lower->push_event(lower->priv, &accel, sizeof(accel)); @@ -491,9 +485,9 @@ static void bmi270_gyro_data(FAR struct bmi270_sensor_s *priv, priv->last_update = now; gyro.timestamp = now; - gyro.x = buf[0] * priv->scale; - gyro.y = buf[1] * priv->scale; - gyro.z = buf[2] * priv->scale; + gyro.x = sensor_data_muli(priv->scale, buf[0]); + gyro.y = sensor_data_muli(priv->scale, buf[1]); + gyro.z = sensor_data_muli(priv->scale, buf[2]); gyro.temperature = 0; lower->push_event(lower->priv, &gyro, sizeof(gyro));