1. 问题现象
做完一版os准备导入工厂生产,简称之位Ros(release),工厂有独立的用于验证其功能的os,简称Fos。出厂之前,需要做Fos到Ros的切换。然而,在切到Ros的时候,发现有低概率的设备系统重启。
2. 调查方法
首先,但凡遇到工厂的问题要从软件和硬件两个维度去看问题。
1)确认是不是软件问题,毕竟新导入的Ros,是可能有低概率的bug的。
a. 确认复现方法,理用系统自带的log抓取功能,获得和分析系统log;
b. 使用之前已经release的os,进行排查。在复现方法确定后,可以进行对比测试。如果,已经release的os的上无法复现,那么可以对比出,目前Ros是有bug;
2)使用Ros,另外找一台确认没问题的机器,进行复现
a. 假设无法复现,那么大概率是新生产设备的问题
b. 如果可以复现,那么大概率是Ros的问题
以上是debug的通用手段,这次的遇到的问题,在对比测试的过程中发现,老的os上机器正常,那么判断Ros存在bug。
确定了方向,沿着改方向继续复现并研究log。发现,os中有核心service被kill和重启的情况。部分log如下:
在看kernel的log,发现wsa881x的probe过程一直失败。因为,一直主要从事的安卓底层工作还是比较熟悉驱动部分的内容。于是,紧盯这个问题。结合,这个问题出现的概率比较低。决定把wsa881x的部分引脚拉出来看看。
拉出来后发现,wsa881x的使能脚无法正常拉低。看上去这个就是最主要的原因。检查dtsi的配置和驱动代码。引出wsa881x 使能管脚,异常时休眠情况下,电平无法拉低:
而正常的使能管脚电平变化如下。
3. 结论解决
应该使用pinctrl来统一管理的可能冲突的管脚,替换掉早期没有pinctrl子系统的单独申请和使用的情况。