qcom adsp sensor

1.声明入口函数

(ADSP.8953.2.8.2\adsp_proc\Sensors\dd\qcom\inc\sns_dd.h)

extern sns_ddf_driver_if_s sns_dd_part_mc3413_if;

2.添加新的驱动文件


2.1 添加驱动文件


在这个目录adsp_proc/slpi_proc>\sensors\dd\qcom\src添加新的驱动文件
并且在adsp_proc/slpi_proc>\sensors\dd\qcom\build\dd_qcom.scons 包含编译文件

qcom adsp sensor_第1张图片


2.2 添加编译选项配置

(adsp_proc/slpi_proc>\sensors\build\Sensors.scons)

这里写图片描述



3.生成 UUID 并与驱动建立联系


3.1 在sns_reg_common.h文件中更新uuid


//adsp ap端都要更新uuid
**(ADSP - ADSP.8953.2.8.2\adsp_proc\Sensors\common\inc\sns_reg_common.h)
(APSS -android\vendor\qcom\proprietary\sensors\dsps\sensordaemon\common\inc\sns_reg_common.h)**

qcom adsp sensor_第2张图片


3.2. 更新 Sensors Manager (SMGR) sensor函数指针和uuid

For MSM8974, MSM8x26, and APQ8084, modify (adsp_proc/Sensors/smgr/src/common/sns_smgr_init.c) update smgr_sensor_fn_ptr_map[]:

For MSM8994/MSM8992, MSM8952, and MSM8996, modify (adsp_proc/Sensors/smgr/src/sns_smgr_reg.c) update smgr_sensor_fn_ptr_map[]:

#ifdef CONFIG_SUPPORT_
{ SNS_REG_UUID_XXXX, &sns_xxx_xxxx_driver_fn_list}, // (UUID,sensor驱动入口函数)
#endif

4.单独更新adsp firware

单独更新adsp bin方法如下:
adb root
adb wait-for-device
adb remount
adb shell mount -o rw,remount /firmware
adb shell rm /firmware/image/adsp*
adb push adsp* /firmware/image/         (adsp.b00 ~ adsp.b14 、adsp.mdt)
adb shell rm /persist/sensors/sns.reg
adb shell sync
adb reboot

4. 配置sensor相关配置文件 ,及push生效生成reg文件


4.1 配置sensor config文件 ☆

(vendor/qcom/proprietary /sensors/dsps/reg_defaults/sensor_def_qcomdev.conf)
—— 可以在Sensors\api\sns_reg_api_v02.h 找到对应的含义

// sns_reg_api_v02.h  中对应各sensor的数值
SNS_REG_ITEM_SSI_DEVINFO_ACCEL
SNS_REG_ITEM_SSI_DEVINFO_GYRO
SNS_REG_ITEM_SSI_DEVINFO_MAG
SNS_REG_ITEM_SSI_DEVINFO_PROX_LIGHT
SNS_REG_ITEM_SSI_DEVINFO_SAR
SNS_REG_ITEM_SSI_DEVINFO_HALL

—— 配置i2c总线、地址、及数据获取方式(irq、fifo、poll)

demo

qcom adsp sensor_第3张图片

// uuid 添加规则

{0x50,0xa7,0xb4,0xbd,0x8e,0x57,0x43,0x2a,   0x85,0x7f,0x3f,0xf8,0x8b,0x88,0x26,0x68

#UUID2013 0x2a43578ebdb4a750 0x00010001 
#UUID2014 0x6826888bf83f7f85 0x00010001

4.2 push配置使其生效

For MSM8974, MSM8x26, APQ8084 – /etc/sensor_def_.conf
For MSM8994/MSM8992, MSM8952, MSM8996 – /etc/sensors/sensor_def_.conf

adb root  
adb remount  
adb shell rm /system/etc/sensors/sensor_def_qcomdev.conf  
adb push sensor_def_qcomdev.conf /system/etc/sensors/sensor_def_qcomdev.conf  
adb shell chmod 644 /system/etc/sensors/sensor_def_qcomdev.conf  
adb shell rm /persist/sensor/sns.reg  
adb shell sync  
adb reboot  

4.3 config文件生成reg文件

A registry (sns.reg) is created from the sensor_def_.conf file on boot-up time by the
sensors daemon in the following directory paths:
 For MSM8974, MSM8x26, APQ8084 – /data/misc/sensors/sns.reg
 For MSM8994/92, MSM8952, MSM8996 – /persist/sensors/sns.reg


4.4 根据config文件版本号决定是否更新config文件

For MSM8974, MSM8x26, APQ8084 – /etc/sensor_def_.conf
For MSM8994/MSM8992, MSM8952, MSM8996 – /etc/sensors/sensor_def_.conf

:version 0x00010002
:hardware 8974# SSI SMGR Cfg 0
1903 0x11FFEEDDCCBBAA99 0x00010001 # Low UUID
1902 0x9988665544332211 0x00010001 # High UUID
1906 3 0x00010002 # I2C Bus – updating from 12 to 3

注意:一定要更新config版本号,产线两段式升级(不擦除persist分区)时若config配置有变化版本号未更新就会出现配置不生效的情况


5.sensor probe过程分析

// sns_smgr_reg.c

SMGR_STATIC void sns_smgr_parse_reg_devinfo_resp( uint16_t   Id,  const sns_reg_ssi_devinfo_group_s* devinfo)
    {

...
   SNS_SMGR_PRINTF2(HIGH, "ssi: probing devinfo_idx[i]: %u[%u]", devinfo_idx, i);
      SNS_SMGR_PRINTF3(HIGH, "ssi: bus_instance:%u gpio1:%u slave_addr:0x%x",
                       devinfo->uuid_cfg[i].i2c_bus, devinfo->uuid_cfg[i].gpio1,
                       devinfo->uuid_cfg[i].i2c_address );

// 调用dd sensor驱动的probe函数
      status = drv_fn_ptr->probe( &dev_access, &memhandler,
                                  &num_sensors, &sensor_list );

    if( status == SNS_DDF_SUCCESS  && num_sensors != 0 )
      {
        SNS_SMGR_PRINTF2(HIGH, "zch---ssi: devinfo_idx[i]: %u[%u] probe success", devinfo_idx, i);
        return;
      }
    else
      SNS_SMGR_PRINTF3(HIGH, "ssi: devinfo_idx[i]: %u[%u] probe failed error=%d",     devinfo_idx, i, status);

...

}

6.cfg各配置项说明

2202 0x564d2b94fe80aef6 0x00010001 #UUID
2203 0x90611b98d561168f 0x00010001 #UUID
2204 3000 0x00010001               #off_to_idle
2205 10000 0x00010001              #idle_to_ready
2206 44 0x00010001                  #gpio1                   // 中断应交
2207 1020 0x00010001               #reg_group_id             // nv分区中的reg偏移值(详见KBA-160602035047 cfg文件所代表的配置.pdf)
2208 0xffff 0x00010001                  #cal_grp_id          // 同上
2209 0x4 0x00010001                #i2c_bus
2210 0xc 0x00010001               #i2c_addr
2211 1 0x00010001                  #sens_default
2212 0x0 0x00010001               #flags

// reg_group_id 关系到nv分区中保存的sensor方向的配置!!

7.sensor方向

每个sensor init过程会 通过sns_ddf_axes_map_init 从nv分区中读取sensor方向设置(如下修改为强制修改方向忽略cfg文件配置)

qcom adsp sensor_第4张图片


8.获取init log

8.1方法一

adb root
adb wait-for-device
adb remount
adb shell rm /persist/sensors/sns.reg
adb shell sync
adb shell stop sensors
adb shell "echo 'related' > /sys/bus/msm_subsys/devices/subsys2/restart_level"
adb shell "echo 'restart' > /sys/kernel/debug/msm_subsys/adsp";
adb shell start sensors'

8.2方法二

1)

adb root
adb wait-for-device
adb remount
adb shell rm /persist/sensors/sns.reg
adb shell sync
adb shell stop sensors
adb shell "echo 'related' > /sys/bus/msm_subsys/devices/subsys2/restart_level"

2) qxdm 中send cmd

send_data 75 37 03 48 00

3) adb shell start sensors


9.命令行获取sensor数据

-r : rate
-d: duration in secound
-s: Sensor ID
-t data_type   // 几个数据
      sns_cm_test -r 20 -d 1 -s 40 -t 1 测试prox
      sns_cm_test -r 20 -d 1 -s 0  -t 0 测试G-sensor
      sns_cm_test -r 20 -d 1 -s 10 -t 0测试GYRO
      sns_cm_test -r 20 -d 1 -s 20 -t 0测试MAG
#check sensor registry configure:
sns_regedit_ssi -r

#check which sensor init success:
sns_dsps_tc0001

10.conf文件解析

vendor/qcom/proprietary/sensors/dsps/sensordaemon/reg/src/sns_reg_conf_la.c

sns_reg_write_conf_item

10.sleep 模式下capsensor无效

—— 将数据上传模式改为wakeup
--- a/vendor/qcom/proprietary/sensors/dsps/libhalsensors/src/SAR.cpp
+++ b/vendor/qcom/proprietary/sensors/dsps/libhalsensors/src/SAR.cpp
@@ -18,6 +18,7 @@ SAR::SAR(int handle)
     :SMGRSensor(handle)
 {
     trigger_mode = SENSOR_MODE_EVENT;
+       bWakeUp = true;
 }

 /*============================================================================
@@ -38,7 +39,8 @@ void SAR::setSensorInfo(sns_smgr_sensor_datatype_info_s_v01* sensor_datatype)
 {
     HAL_LOG_DEBUG("%s: SAR DTy: %d", __FUNCTION__, sensor_datatype->DataType);
     setType(SENSOR_TYPE_SAR);
-    setFlags(SENSOR_FLAG_ON_CHANGE_MODE);
+       setFlags(SENSOR_FLAG_ON_CHANGE_MODE|SENSOR_FLAG_WAKE_UP);
+    strlcat(name," -Wakeup",SNS_MAX_SENSOR_NAME_SIZE);
     setResolution((float)((float)sensor_datatype->Resolution *
                 UNIT_CONVERT_Q16));
     setMaxRange((float)((float)sensor_datatype->MaxRange *

11.SSI auto detect下允许初始化的sensor个数

#adsp_proc/Sensors/smgr/src/sns_smgr_sensor_config.h
SNS_SMGR_NUM_SENSORS_DEFINED

12.auto detect every boottime


diff --git a/Sensors/smgr/src/sns_smgr_reg.c b/Sensors/smgr/src/sns_smgr_reg.c
index ed725ec..65aedf6 100755
--- a/Sensors/smgr/src/sns_smgr_reg.c
+++ b/Sensors/smgr/src/sns_smgr_reg.c
@@ -1733,7 +1733,7 @@
                 0,
                 sizeof(sns_reg_ssi_smgr_cfg_group_s));

-  ssi_cfg_ptr->maj_ver_no = 1;
+  ssi_cfg_ptr->maj_ver_no = 0;
   ssi_cfg_ptr->min_ver_no = 1;
   ssi_cfg_ptr->reserved1 = 0;
   ssi_cfg_ptr->reserved2 = 0;
@@ -1990,7 +1990,7 @@
       sns_smgr.all_init_state = SENSOR_ALL_INIT_CONFIGURED;
     }
   }
-  else if ( (cfg_group_ptr->maj_ver_no != 1) && !valid_cfg )
+  else if ( !valid_cfg )
   {
     /* Only use the configuration if the major version is 1. 
     Otherwise autodetect sensors */

13.add product keyword to match different sensor configurations


add product keyword to match different sensor configurations

Change-Id: I1afbb2b23e0758bc32378330ffba3dafe27e4130
---

diff --git a/dsps/sensordaemon/reg/src/sns_reg_conf_la.c b/dsps/sensordaemon/reg/src/sns_reg_conf_la.c
old mode 100644
new mode 100755
index 831a2d9..71ac549
--- a/dsps/sensordaemon/reg/src/sns_reg_conf_la.c
+++ b/dsps/sensordaemon/reg/src/sns_reg_conf_la.c
@@ -295,6 +295,7 @@
   @param item_id[i]: Item ID
   @param item_val[i]: Discovered item val, if any
   @param hw_conf[i]: Hardware string selected in the conf file
+  @param product_conf[i]: Product string selected in the conf file
   @param platform_conf[i]: Platform string selected in the conf file
   @param soc_id_conf[i]: SOC ID string selected in the conf file
   @param subtype_conf[i]: Platform subtype string selected in the conf file
@@ -307,6 +308,7 @@
 void sns_reg_write_conf_item( int32_t item_id,
                               uint64_t item_val,
                               char (*hw_conf)[META_VAL_LEN],
+                              char (*product_conf)[META_VAL_LEN],
                               char (*platform_conf)[META_VAL_LEN],
                               char (*version_conf)[META_VAL_LEN],
                               char (*soc_id_conf)[META_VAL_LEN],
@@ -318,6 +320,7 @@
 {
   int index;
   static char hw_string[PROPERTY_VALUE_MAX] = "";
+  static char product_string[20] = "";
   static char platform_string[20] = "";
   static char platform_subtype_string[20] = "";
   static char platform_subtype_id_string[20] = "";
@@ -333,6 +336,25 @@

     /* get the hw string from property */
     property_get("ro.board.platform", hw_string, "");
+
+    /* check the motorola product */
+    fp = sns_fsa_open("/sys/devices/soc0/motorola_product", "r" );
+    if( fp == NULL )
+    {
+      SNS_PRINTF_STRING_ERROR_1( SNS_MODULE_APPS_REG,
+                                 "motorola_product fopen failed %i", errno );
+      strlcpy(product_string, invalid_str, sizeof(product_string));
+    }
+    else if( fgets(product_string, sizeof(product_string), fp) == NULL )
+    {
+      SNS_PRINTF_STRING_ERROR_1( SNS_MODULE_APPS_REG,
+                                 "product_string fgets failed %i: %i", errno );
+      strlcpy(product_string, invalid_str, sizeof(product_string));
+    }
+    if( fp != NULL )
+    {
+      sns_fsa_close( fp );
+    }

     fp = sns_fsa_open("/sys/devices/soc0/hw_platform", "r" );
     if( fp == NULL )
@@ -452,6 +474,12 @@
     /* Configuration file set a hardware string, and it doesn't match
        this hardware. Abort */
     return;
+  }
+  if( ( product_conf[0][0] != 0 ) &&
+      sns_reg_match_conf_item( product_string, product_conf ) ) {
+      /* Configuration file set a product string, and it doesn't match
+         the product string. Abort */
+      return;
   }
   if( ( platform_conf[0][0] != 0 ) &&
       sns_reg_match_conf_item( platform_string, platform_conf ) ) {
@@ -581,6 +609,7 @@
   char *buf = malloc(sz);
   uint32_t file_version = 0;
   char hw_conf[META_MAX_KEY][META_VAL_LEN];
+  char product_conf[META_MAX_KEY][META_VAL_LEN];
   char platform_conf[META_MAX_KEY][META_VAL_LEN];
   char soc_id_conf[META_MAX_KEY][META_VAL_LEN];
   char subtype_conf[META_MAX_KEY][META_VAL_LEN];
@@ -592,6 +621,7 @@

   for( key_var = 0; key_var < META_MAX_KEY; key_var++ ) {
     hw_conf[key_var][0]       = 0x00;
+    product_conf[key_var][0] = 0x00;
     platform_conf[key_var][0] = 0x00;
     soc_id_conf[key_var][0]   = 0x00;
     subtype_conf[key_var][0]  = 0x00;
@@ -629,7 +659,7 @@
       /* Check for an item */
       if( true == sns_reg_parse_conf_item( buf, &item_id, &item_val, &item_ver ) ) {
         if( item_ver > conf_info->version) {
-          sns_reg_write_conf_item( item_id, item_val, hw_conf,
+          sns_reg_write_conf_item( item_id, item_val, hw_conf, product_conf,
                                    platform_conf, version_conf, soc_id_conf,
                                    subtype_conf, subtype_id_conf, soc_rev_conf, &property_conf );
         }
@@ -642,6 +672,8 @@
         if( sscanf_result > 0 ) {
           if( 0 == strncmp( key_meta, "hardware", META_KEY_LEN ) ) {
             sns_reg_get_conf_key(buf, hw_conf);
+          } else if( 0 == strncmp( key_meta, "product", META_KEY_LEN ) ) {
+            sns_reg_get_conf_key(buf, product_conf);
           } else if( 0 == strncmp( key_meta, "platform", META_KEY_LEN ) ) {
             sns_reg_get_conf_key(buf, platform_conf);
           } else if( 0 == strncmp( key_meta, "soc_id", META_KEY_LEN ) ) {

你可能感兴趣的:(sensor)