当设备出现bug时,考虑到有可能是sensor引起,也有可能是其他器件引起的时候(一般是功耗相关的问题),我们需要禁用sensor来查看是否确为sensor引起,若确定是sensor引起的,还需要确定为哪一个sensor器件引起的,这时可以用摘除各个器件来定位问题。
结果:sensor list 为空,adsp/slpi sensor 仍然会初始化,modem侧的子系统仍然可以获取sensor数据
禁用方法(bat脚本):注册表禁用sensor
adb root
adb wait-for-device
adb remount
adb shell "echo disable_sensors > /persist/sensors/registry/registry/sensors_settings"
adb shell sync
adb reboot
android 9 的禁用指令为:
adb shell "echo disable_sensors > /mnt/vendor/persist/sensors/sensors_settings"
该方法也可用于软移除单个sensor器件,去除对应的json文件即可
结果:sensor 驱动 init 失败,adsp/slpi仍运行
禁用方法(bat脚本):删除json文件及其生成的文件
adb root
adb wait-for-device
adb remount
adb shell rm -rf /persist/sensors/registry/registry
adb shell rm -rf /persist/sensors/registry/config
adb shell rm -rf /vendor/etc/sensors/config
adb shell sync
adb reboot
android 9 的删除指令为:
adb shell rm /vendor/etc/sensors/config/*.json
adb shell rm /mnt/vendor/persist/sensors/registry/config/*.json
adb shell rm /mnt/vendor/persist/sensors/registry/registry/*
结果:sensor相关全部移除
禁用方法:禁用sensor daemon & 删除adsp/slpi固件
LINUX/android/device/qcom/common/rootdir/etc/init.qcom.sensors.sh文件中对以下进行注释:
//start_sensor
adb root
adb wait-for-device
adb shell mount -o rw,remount /firmware
adb shell rm /firmware/image/slpi*
adb shell sync
adb reboot
android 9 以及部分芯片的删除指令为:
adb shell mount -o rw,remount /vendor/firmware_mnt
adb shell rm -rf /vendor/firmware_mnt/image/slpi
此外,SDM670上需要同时删除audio和SEE中的adsp*固件
结果:不启动sensor线程,但是subsystem子系统依旧运行
禁用方法(bat脚本):禁用sensor 线程
在ssc/utils/osa/hexagon_root_pd/sns_root_pd_init.c中做如下修改:
void sns_root_pd_init(void)
{
#if 0
PD_MON_RESTART restart = PD_MON_RESTART_ALWAYS;
(void)pd_mon_spawn(&restart, SENSOR_IMG_NAME);
+#endif
}
在ssc/utils/osa/hexagon_user_pd/slpi/sns_user_pd_init.c中做如下修改:
sns_rc sns_user_pd_init()
{
+#if 0
if(false == sns_init_done)
{
…
}
+endif
return SNS_RC_FAILED;
}
可以参考上文禁用sensor的部分,去除相关json及其注册表文件即可。
在adsp_proc/ssc/chipset/por.py中,去除需要去除的器件
include_sensor_vendor_libs.extend(['lsm6dso',
'sns_mmc56x3x',
'sns_ltr311'])
不要为了图方便而只是注释掉某个器件,如需编译去除单个器件后调试,请备份后将器件删除而不是注释,否则可能导致所有器件都挂载不上。