问题背景
板卡:SOM-TL437x-A1
事件:生产了 410 PCS 需要测试、烧写系统,部分板卡烧写出货系统异常。
现象:其中 78 PCS 由于 BTB 问题未测试。332 PCS 功能测试后进行烧写,发现只有 47 PCS NAND Flash 烧写正常,285 PCS NAND Flash 烧写异常。内核报错:blk_update_request: I/O error,dd 报错:Input/output error。
补充说明
功能测试未有直接测试 Nand Flash 读写,其他所有功能项测试通过后使用专用烧写卡进行烧写。
该型号板卡已多次生产,未有出现类似问题。
调试经过
1)去到品质部现场,向问题报告者了解其遇到的问题具体情况;
2)重新熟悉烧写卡,烧写脚本流程。
3)确认软硬件环境是否完备,没有被破坏。
4)复现问题,观察问题出现的整个过程。
5)多张卡、多个不同核心板对比测试。
6)定位报错信息对应的代码,分析问题属于硬件、驱动、还是应用范围。无法确定,都有可能。
7)调整心态。意识到当前问题不是简单问题。
8)请教乐荣、伯齐,询问是否有相关经验,了解其看法。未有突破。
9)品质部启荣提交了其对比测试情况说明。主要有两个关键点:1、先执行一个由曾福开发的坏块检测脚本,后进行烧写正常;2、烧写异常的 Flash 芯片更换到 335x 核心板上烧写正常。
10)请求伯齐帮忙对比分析 335x 与 437x 内核在 Nand 相关内容上的差异。被告知只有一个 ecc 配置差异,但觉得不影响。
11)分析坏块检测脚本的代码,确定影响的相关操作。确定 flash_erase 有关联。
12)转由曾福进一步调查确认问题根源。确认背后原因。
问题结果
部分核心板的 Flash 上的校验算法与系统内核的不一致,而我们的烧写脚本没有在烧写前先做擦除,直接使用了 /dev/mtdblock* 的方式写入数据。结果出现了 IO 错误。
后续处理:
1)更新内核,根据 Flash 型号不同,采用合适的校验算法;
2)更新烧写脚本,先对每个 Flash 分区执行 flash_erase 操作,再进行烧写。
回顾分析
针对书籍《调试九法:软硬件错误的排查之道》的调试规则的回顾分析。
理解系统:重新熟悉烧写的实现流程。
制造失败:复现烧写异常观察具体现象。
分而治之:分析代码,尝试定位问题归属于硬件、驱动还是应用。
检查插头:确认当前软硬件环境是否已被破坏。
获得全新观点:找到烧写脚本开发人员、内核开发人员交流。
如果你不修复 bug,它将依然存在:确定好临时解决办法与后续更新安排。
对比的思维:不同批次的生产有和差异?335x 系统与 437x 系统有和差异?坏块检测脚本执行前后有何差异?
参考
找茬:https://liaojieliang.gitee.io/2013-04-18/spot-the-difference.html
2020年10月27日