有部分机器出现短按开机的情况;
为什么会误判
经过SBL log分析,发现SBL中检测按键的ticks计数读取有问题,问题机器,初始读取数已经超过了设定超时时间。从而导致误判为长按键,则开机
如上图,正确流程应该是进入while循环,每隔50us去读取一次,直到超时为止;错误的流程则是初始初始读取数超过设定值,直接进入判定;然而判定函数中并没有走判定流程而是直接返回,因此误判。
748: Elapsed tick: 0x1BB1754, Wait tick: 0x36EE800, sdam tick: 0x1D4C00 3000ms
Elapsed tick: 0x1B73424, Wait tick: 0x2DC6C00, sdam tick: 0x1D4C00 2500ms
0x1B73424 28783652 正常的tick数
0x25B3E63 39534179 插上电池等待5分钟的tick数
0x249F000 38400000 2000ms
0x2DC6C00 48000000 2500ms
0x36EE800 57600000 3000ms
这里硬件建议读取真实的PBL中的时间,即从PS_HOLD拉高到这个首次读取的地方,因马达震动与首次读取值几乎同时发生,因此,并不需要在此拉高GPIO来作为判断信号,而直接量取马达的电压即可;如下图2000ms+,与实际读取值一直,刚刚好超过2000ms一点。
为什么会超时?
该ticks数值是PBL中读取值;PBL中设定了启动的时序,如下图
先走FUSE,再走GPIO;FUSE是必选的,首选启动顺序,GPIO是备选顺序;当fuse启动失败,则再次走GPIO启动,当gpio启动失败,则进入9008;如fuse启动成功,则不走gpio;但是fuse如配置为000,则依然要走一次gpio;对于emmc来说,配置为000是最优时间;
gpio的值是硬件复用决定,可能收到外界环境的影响而不确定,通常是固定的。
从log中看,PBL中读取值花费了更多的时间,大概565ms,因此超时。
为何会多花500ms?
对比好的机器与坏的机器,发现好的机器,短按后,GPIO87无抬升,而坏的机器则有抬升
给gpio87加入12k下拉电阻,依然不能解决问题,说明问题不在于此;
后检查mem的物料,发现问题均出现在同一种物料上。