高通平台 ddf sensor config 文件配置及更新流程

config文件的配置

默认情况下 config配置文件是存放在vendor/qcom/proprietary/sensors/dsps/reg_defaults路径下

全称是:sensor_def_qcomdev.conf, 默认是只存在这一个config文件,下面看下这个文件的主要内容。

根据Configuration file keys确认平台信息

根据实际调试经验,第一步需要确认平台,例如msm8953/sdm450 平台需要将对sensor的配置信息存放在 harware 为8953的字段后,

我们需要将配置信息填写到如下的配置段落之后:

#######################################################################
###        8953 Chipsets
#######################################################################
:hardware 8953
:platform
:property
:soc_id
# Orientation of sensors

Device-specific registry items配置说明

对于设备配置项的格式应按照:<Registry ID> <Value> <Version>来做具体的配置,Registry ID的定义应对应到vendor/qcom/proprietary/sensors/dsps/api/sns_reg_api_v02.h 中的具体配置。

些寄存器配置通常以成组的形式出现,不同组这些配置属性的含义是相同的,只是他们的registry ID各不相同,同一组的配置是基于同一个偏移地址,再做对应的偏移来区分不同的配置项。

对于这个配置可以参考高通文档80-n7635-1,举例如下:

基地址的选择

所有的地址信息sns_reg_api_v02.h中都有对应定义,包括每个groups的基地址偏移的信息,平台上一共有15个配置,对应的内容如下:

仔细阅读在sns_reg_api_v02.h中的定义可以发现,主要的配置分为5大组CFG0-CFG4, 每个大组又有对应的3个不同配置,

例如:CFG0,CFG0_2,CFG0_3; 一共15个地址。不考虑兼容的情况下,常用的Configuration ID就是 0-4 ,即1902,1918,1934,1950,1966。

有同种sensor需要兼容,使用的Configuration ID就是在原基础上加5,比如CFG0_2的地址就是Configuration ID = 0+5,即3602。举例如下:

/**  Item IDs corresponding to group SN_REG_GROUP_SSI_SMGR_CFG (Group Id: 2690)  */
......
#define SNS_REG_ITEM_SSI_SMGR_CFG0_UUID_HIGH_V02 1902
#define SNS_REG_ITEM_SSI_SMGR_CFG0_UUID_LOW_V02 1903
#define SNS_REG_ITEM_SSI_SMGR_CFG0_OFF_TO_IDLE_V02 1904
#define SNS_REG_ITEM_SSI_SMGR_CFG0_IDLE_TO_READY_V02 1905
#define SNS_REG_ITEM_SSI_SMGR_CFG0_I2C_BUS_V02 1906
#define SNS_REG_ITEM_SSI_SMGR_CFG0_REG_GROUP_ID_V02 1907
#define SNS_REG_ITEM_SSI_SMGR_CFG0_CAL_PRI_GROUP_ID_V02 1908
#define SNS_REG_ITEM_SSI_SMGR_CFG0_GPIO1_V02 1909
#define SNS_REG_ITEM_SSI_SMGR_CFG0_GPIO2_V02 1910
#define SNS_REG_ITEM_SSI_SMGR_CFG0_SENSOR_ID_V02 1911
#define SNS_REG_ITEM_SSI_SMGR_CFG0_I2C_ADDRESS_V02 1912
......

实例分析

在实际项目配置过程中,比较关心的配置,是UUID,I2c_bus,sensor_id,gpio, flags,i2c_address以及电相关的配置, 实际配置主要如下:

# SSI SMGR Cfg 3: [STK LIGHT POLL] STK3311
1951 0x8b11a21aa55e6586 0x00010001 #UUID
1950 0xa4524f726702e351 0x00010001 #UUID
1952 5700 0x00010001               #off_to_idle
1953 10000 0x00010001              #idle_to_ready
1954 4 0x00010001                  #i2c_bus
1955 1040 0x00010001               #reg_group_id
1956 0xFFFF 0x00010001             #cal_grp_id
1957 0xFFFF 0x00010001             #gpio1
1958 0xFFFF 0x00010001             #gpio2
1959 40 0x00010001                 #sensor_id
1960 0x48 0x00010001               #i2c_address
1961 5 0x00010001                  #data_type1
1962 6 0x00010001                  #data_type2
1963 -1 0x00010001                 #rel_sns_idx
1964 0 0x00010001                  #sens_default
1965 0x00 0x00010001               #flags
1985 0 0x00010001                  #device_select
1993 0x93 0x00010001               #vdd 2.8v
1994 0x02 0x00010001               #vddio 1.8v

这里仅简介需要主要的配置,其他的可以参考上面的表格的内容,这里使用的是CFG3,基地址1950

UUID

 必须与在ADSP中配置的UUID内容完全相同,且唯一。

1950 + 1:1951 0x8b11a21aa55e6586    UUID Low  8bit  

1950 + 0:1950 0xa4524f726702e351    UUID High 8bit

      在adsp中的UUID的配置是存放于adsp_proc/Sensors/common/inc/sns_reg_common.h中,配置如下:

#define SNS_REG_UUID_STK3X1X \

{0x51,0xe3,0x02,0x67,0x72,0x4f,0x52,0xa4,0x86,0x65,0x5e,0xa5,0x1a,0xa2,0x11,0x8b}

在sensor_def_qcomdev.conf中 UUID存放方式是高字节存低字节位,这里需要注意,不能配置错误。

I2c bus配置

Adsp中使用在选择i2c通道前要确保这路i2c是配置在adsp中使用的,默认是使用i2c 4这组。

     1950 + 4:1954 4      

中断脚配置

若有用到中断引脚,将使用的gpio的管脚号配置在这里,如果未使用填ffff

1950 + 7:1957 0xFFFF 0x00010001

Sensor id配置
 

1950 + 9:1959 40 0x00010001

这里的配置可以表明 sensor的种类,详细的种类可以在sns_smgr_common_v01.h中查询,这里列出常见的几个。 

   ID        PRIMARY         SECONDARY

    --------  --------------  --------------

    0         Accelerometer   Temperature

    10        Gyro            Temperature

    20        Magnetometer    Temperature

    30        Pressure        Temperature

    40        Proximity       Ambient light

    50        Humidity        Temperature

I2c address 配置

1950 + 101960 0x48 0x00010001

这里是配置i2c的从设备地址,需要注意的是 配置的地址是7bit 从设备地址,不包含读写位。
 

上报数据的方式设置

1950 + 151965 0x00 0x00010001

1,(Polling)0x00同步方式[sync]:smgr向传感器请求数据,阻塞等待数据到来再返回;异步方式[async]:调用一次get_data后启动timer,等timer中断到达后调用sns_ddf_driver_if_s中指定的handle_timer()函数上报一组传感器数据。handle_timer()中一般采用ddf提供的sns_ddf_smgr_notify_data()函数上报数据。

2, (DRI)0x80又称作[self-scheduling]调用enable_sched_data()启用DRI(DataReadyInterrupt,数据完成中断),等待数据完成中断或启动timer按照set_cycle_time指定的ODR(Output Data Rate,数据输出速率)进行数据采集,采集完成后调用sns_ddf_driver_if_s中指定的handle_irq()函数上报传感器数据。

3, (FIFO)0xD0调用trigger_fifo_data()函数启动FIFO模式,当数据量到达指定的阈值,触发sns_ddf_smgr_data_notify()函数上报一批数据。

 一般加速度、陀螺仪等数据量较大的使用FIFO模式,光线、距离等有数据有变化才需要上报的传感器使用DRI模式。

电源的配置

1993 0x93 0x00010001               #vdd 2.8v

1994 0x02 0x00010001               #vddio 1.8v

电的配置 不在通用的group中,可以在sns_reg_api_v02.h中查看对应的定义,

对于CFG3: VDD是1993, VDDIO是1994  配置的值 0x93表示 2.8V,0x02表示1.8V。

特殊配置点

3轴类型数据配置

在sensor_def_qcomdev.conf的实际配置过程中,除了上面说到的常见通用配置,还有一些其他属性。

比如 调试加速度传感器,陀螺仪,地磁等需要配置 x,y,z 3个坐标轴的方向,举例如下:
 

# accel x/y/z
700  -1 0x00010001 #accel-x-axis
701  -2 0x00010001 #accel-y-axis
702   3 0x00010001 #accel-z-axis
# gyro x/y/z
800  -1 0x00010001 #gyro-x-axis
801  -2 0x00010001 #gyro-y-axis
802   3 0x00010001 #gyro-z-axis
# mag x/y/z
900   1 0x00010001 #mag-x-axis
901   2 0x00010001 #mag-y-axis
902   3 0x00010001 #mag-z-axis

其格式解读任然是<Registry ID> <Value> <Version> 的方式,Registry ID在sns_reg_api_v02.h有明确定义;

配置的值 取值范围为-3至3,不包括0。其中1 代表x轴,2 代表y轴,3代表z轴。

正负号(正可以缺省)示方向。 所以取值取反表示 方向反向,取值 调换,表示轴向调换,比如 700 配置成 2 ,701配置成1,即表示 x轴的数据与y轴数据交换。

同种类sensor 兼容需求配置

当有同种类的sensor需要兼容时,便不能再使用上面提到的那个Registry ID了,应按以下来配置:

将 1900  配置为 0(原来是1)

# SMGR SSI Configuration
1900 0 0x00010001 #Maj Ver
1901 1 0x00010001 #Min Ver

配置使能及兼容个数

以加速度sensor配置为例,在修改完 1900之后还需要配置 2000 2001(其他sensor查看sns_reg_api_v02.h)如下:

# DEVINFO ACCEL
2000 1 0x00010001 # 写1表示使能
2001 2 0x00010001 # 设置兼容 sensor的个数,这里是2个

设置设备信息

这里设置的主要内容与上文中配置的stk3x1x的内容相同,但是存在兼容情况时应按照sns_reg_api_v02.h中定义的Registry ID来配置,

这里仍以加速度计举例,当时使用2个sensor兼容时,使用的Registry ID应按照 以下的定义来获取使用

/**  Item IDs corresponding to group SNS_REG_GROUP_SSI_DEVINFO_ACCEL (Group Id: 2692)  */
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_MIN_VER_NO_V02 2000
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_NUM_UUID_VALID_V02 2001
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_UUID_HIGH_V02 2002
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_UUID_LOW_V02 2003
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_OFF_TO_IDLE_V02 2004
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_IDLE_TO_READY_V02 2005
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_GPIO1_V02 2006
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_REG_GROUP_ID_V02 2007
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_CAL_PRI_GROUP_ID_V02 2008
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_I2C_BUS_V02 2009
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_I2C_ADDRESS_V02 2010
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_SENSITIVITY_DEFAULT_V02 2011
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG0_FLAGS_V02 2012
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_UUID_HIGH_V02 2013
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_UUID_LOW_V02 2014
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_OFF_TO_IDLE_V02 2015
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_IDLE_TO_READY_V02 2016
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_GPIO1_V02 2017
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_REG_GROUP_ID_V02 2018
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_CAL_PRI_GROUP_ID_V02 2019
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_I2C_BUS_V02 2020
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_I2C_ADDRESS_V02 2021
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_SENSITIVITY_DEFAULT_V02 2022
#define SNS_REG_ITEM_SSI_DEVINFO_ACCEL_CFG1_FLAGS_V02 2023
......

有了上面的 registry id信息,既可进行对应的配置,举例如下:
 

#for example: ACCEL_CFG0 = LSM6DS3
2002 0x11454a4e90ef223f 0x00010001 #UUID_HIGH
2003 0xc0794ab65a20b094 0x00010001 #UUID_LOW
2004 100000 0x00010001 #OFF_TO_IDLE
2005 250000 0x00010001 #IDLE_TO_READY
2006 117 0x00010001 #GPIO1
2007 1000 0x00010001 #REG_GROUP_ID
2008 0 0x00010001 #CAL_PRI_GROUP_ID
2009 0x1001 0x00010001 #I2C_BUS
2010 0 0x00010001 #CS for SPI
2011 2 0x00010001 #SENSTIVITY
2012 0xD0 0x00010001 #FLAGS

#for example: ACCEL_CFG1 = BMI160
2013 0xd646cb83ec0cd5a5 0x00010001 #UUID_HIGH
2014 0x0f4d0fd654c7eab5 0x00010001 #UUID_LOW
2015 10000 0x00010001 #OFF_TO_IDLE
2016 30000 0x00010001 #IDLE_TO_READY
2017 117 0x00010001 #GPIO1
2018 1000 0x00010001 #REG_GROUP_ID
2019 0 0x00010001 #CAL_PRI_GROUP_ID
2020 0x1001 0x00010001 #I2C_BUS
2021 0 0x00010001 #CS for SPI
2022 1 0x00010001 #SENSTIVITY

兼容其他种类sensor或者更多sensor 可参考sns_reg_api_v02.h中的具体定义做修改。

如果兼容的gsensor 三轴方向不一致可以考虑配置 #REG_GROUP_ID 

/**  Item ID's corresponding to group SNS_REG_DRIVER_GROUP_ACCEL (Group Id: 1000)  */                                            
#define SNS_REG_DRIVER_ACCEL_X_ORIENT_V02 700
#define SNS_REG_DRIVER_ACCEL_Y_ORIENT_V02 701
#define SNS_REG_DRIVER_ACCEL_Z_ORIENT_V02 702

/**  Item ID's corresponding to group SNS_REG_DRIVER_GROUP_ACCEL (Group Id: 1001)  */
#define SNS_REG_DRIVER_ACCEL2_X_ORIENT_V02 720
#define SNS_REG_DRIVER_ACCEL2_Y_ORIENT_V02 721
#define SNS_REG_DRIVER_ACCEL2_Z_ORIENT_V02 722

配置文件的更新

在配置过程中需要多次修改sensor_def_qcomdev.conf,

为了提高效率应该使用将修改完成的配置直接push到相关路径下。更新流程应该按以下步骤:

adb root 
adb remount 
adb shell rm /persist/sensors/sns.reg 
adb shell rm /system/etc/sensors/sensor_def_qcomdev.conf 
adb push <your sensor_def_qcomdev.conf file path> /system/etc/sensors/ 
adb shell chmod 644 /system/etc/sensors/sensor_def_qcomdev.conf 
adb shell sync 
adb reboot 
适用于Android7; 更高的版本在vendor目录下存放;

需要注意以下事项:

  1. 如果 无法push 成功,提示只读,可以尝试命令adb disable-verity 后重启尝试。
  2. sensor_def_qcomdev.conf存放的路径不是固定的,不同的安卓版本,也有放在/vendor/etc/sensors/ 路径下的,可以先查看后在修改对应路径。
  3. 更新配置时,必须删除sns.reg,这个文件存在时,如果版本号不修改,新push的配置文件时无法被更新生效的。 高通的文档中有关于设置版本号,触发更新的方式,但是还是建议删掉sns.reg.
  4. 更新完成之后,使用可执行命令查看当前sensor生效的状态来判断更新的内容是否生效了,命令是sns_regedit_ssi –r (adb 中执行) 可以查询的信息举例如下
    msm8953_64:/ # sns_regedit_ssi -
    device platform not detected
    detected SNS_PLATFORM_MTP...
    Reading existing registry...
    SSI Group registry read successful
    
    ==========   SMGR Config Group 0   ====================
    Version: 1.1
    drv_cfg[0]
    -----------------------------
    item-registry-ID: name: value...
    1902-1903: UUID: (UNKNOWN DRV) 61c69537-9675-40c1-bc46-fd1b43b8250b
    1904: off_to_idle:   100000     1905: idle_to_ready:  20000     1906: i2c_bus:         0x04
    1907: reg_group_id:    1000     1908: cal_grp_id:         0     1909: gpio1:         0x002a
    1910: gpio2:         0xffff     1911: sensor_id:          0     1912: i2c_address:     0x68
    1913: data_type1:         1     1914: data_type2:         4     1915: rel_sns_idx:       -1
    1916: sens_default:       1     1917: flags:           0x00
    1982: device_select:      0
    1982: vdd_rail:    147
    1982: vddio_rail:      2
    drv_cfg[1]

  5. 配置完成之后  打开 Qsensor Test APP  查看是否有添加的sensor,存在的话,点击启动可以查看数据流。
     

确认配置ok后将修改完成的sensor_def_qcomdev.conf 替换到sensor_def_qcomdev.conf 的存储路径下,源码路径 是:vendor/qcom/proprietary/sensors/dsps/reg_defaults/

无法删除sns.reg最终更新到源码中的sensor_def_qcomdev.conf将添加sensor每个需要更新的配置项版本号由0x00010001 更新为0x00010002,确保更新成功,举例如下:

-- 1951 0x8b11a21aa55e6586 0x00010001 #UUID
-- 1950 0xa4524f726702e351 0x00010001 #UUID
-- 1954 4 0x00010001                  #i2c_bus
++ 1951 0x8b11a21aa55e6586 0x00010002 #UUID
++ 1950 0xa4524f726702e351 0x00010002 #UUID
++ 1954 4 0x00010002                  #i2c_bus

实际上,是需要将每个 item的 版本号修改 高于整个配置文件的版本号

这个版本号在文件的最开始部分 默认配置是

:version 0x00010001

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值