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 + 10:1960 0x48 0x00010001
这里是配置i2c的从设备地址,需要注意的是 配置的地址是7bit 从设备地址,不包含读写位。
上报数据的方式设置
1950 + 15:1965 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目录下存放;
需要注意以下事项:
- 如果 无法push 成功,提示只读,可以尝试命令adb disable-verity 后重启尝试。
- sensor_def_qcomdev.conf存放的路径不是固定的,不同的安卓版本,也有放在/vendor/etc/sensors/ 路径下的,可以先查看后在修改对应路径。
- 更新配置时,必须删除sns.reg,这个文件存在时,如果版本号不修改,新push的配置文件时无法被更新生效的。 高通的文档中有关于设置版本号,触发更新的方式,但是还是建议删掉sns.reg.
- 更新完成之后,使用可执行命令查看当前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]
- 配置完成之后 打开 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