You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2024/04/28 05:22:02 UTC

(nuttx) 03/05: drivers/adxl362_uorb: various fixes

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 1985dcd192b3548bce135536ee2ed5e595fed75c
Author: raiden00pl <ra...@railab.me>
AuthorDate: Tue Apr 23 19:12:00 2024 +0200

    drivers/adxl362_uorb: various fixes
    
    - fix compilation for fetch interface
    - for data ready in thread
    - add soft reset
---
 drivers/sensors/adxl362_uorb.c | 34 +++++++++++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/drivers/sensors/adxl362_uorb.c b/drivers/sensors/adxl362_uorb.c
index 65fd0e5394..b1842e5bee 100644
--- a/drivers/sensors/adxl362_uorb.c
+++ b/drivers/sensors/adxl362_uorb.c
@@ -70,6 +70,7 @@
 #define ADXL362_TMEP_L                0x14
 #define ADXL362_TEMP_H                0x15
 #define ADXL362_SOFT_RESET            0x1f
+#  define ADXL362_SOFT_RESET_VALUE    0x52
 #define ADXL362_THRESH_ACT_L          0x20
 #define ADXL362_THRESH_ACT_H          0x21
 #define ADXL362_TIME_ACT              0x22
@@ -83,6 +84,7 @@
 #define ADXL362_INTMAP1               0x2a
 #define ADXL362_INTMAP2               0x2b
 #define ADXL362_FILTER_CTL            0x2c
+#  define ADXL362_FILTER_CTL_DEFAULT  0x13
 #define ADXL362_POWER_CTL             0x2d
 #   define ADXL362_LOW_NOISE          (0 << 4)
 #   define ADXL362_ULTRALOW_NOISE     (2 << 4)
@@ -282,7 +284,7 @@ static void adxl362_getregs(FAR struct adxl362_sensor_s *priv,
 
 static int16_t adxl362_data(FAR uint8_t *data)
 {
-  return (int16_t)(data[0]  | (data[1]) << 8);
+  return (int16_t)(data[0] | (data[1]) << 8);
 }
 
 /****************************************************************************
@@ -321,6 +323,20 @@ static int adxl362_checkid(FAR struct adxl362_sensor_s *priv)
   return OK;
 }
 
+/****************************************************************************
+ * Name: adxl362_reset
+ *
+ * Description:
+ *   Soft reset
+ *
+ ****************************************************************************/
+
+static void adxl362_reset(FAR struct adxl362_sensor_s *priv)
+{
+  adxl362_putreg8(priv, ADXL362_SOFT_RESET, ADXL362_SOFT_RESET_VALUE);
+  up_mdelay(5);
+}
+
 /****************************************************************************
  * Name: adxl362_start
  ****************************************************************************/
@@ -328,6 +344,10 @@ static int adxl362_checkid(FAR struct adxl362_sensor_s *priv)
 static void adxl362_start(FAR struct adxl362_sensor_s *priv)
 {
   adxl362_putreg8(priv, ADXL362_POWER_CTL, ADXL362_POWER_MODE_MEASURE);
+
+  /* Wait for sensor ready - otherwise the first measuremet is garbage */
+
+  up_mdelay(5);
 }
 
 /****************************************************************************
@@ -459,8 +479,8 @@ static int adxl362_fetch(FAR struct sensor_lowerhalf_s *lower,
 
   accel.timestamp   = sensor_get_timestamp();
   accel.x           = (float)adxl362_data(&data[0]) * priv->scale;
-  accel.y           = (float)adxl362_data(&data[1]) * priv->scale;
-  accel.z           = (float)adxl362_data(&data[2]) * priv->scale;
+  accel.y           = (float)adxl362_data(&data[2]) * priv->scale;
+  accel.z           = (float)adxl362_data(&data[4]) * priv->scale;
   accel.temperature = (float)adxl362_data(&data[6]) * ADXL362_TEMP_SCALE;
 
   memcpy(buffer, &accel, sizeof(accel));
@@ -508,6 +528,10 @@ static int adxl362_thread(int argc, FAR char **argv)
 
       if (priv->enabled)
         {
+          /* Wait for data ready */
+
+          while (!(adxl362_getreg8(priv, ADXL362_STATUS) & 0x01));
+
           adxl362_getregs(priv, ADXL362_XDATA_L, (FAR uint8_t *)data, 8);
 
           accel.timestamp   = sensor_get_timestamp();
@@ -593,6 +617,10 @@ int adxl362_register(int devno, FAR struct spi_dev_s *spi)
       return ret;
     }
 
+  /* Soft reset */
+
+  adxl362_reset(priv);
+
   /* Register the character driver */
 
   ret = sensor_register(&priv->lower, devno);