嵌入式系统 - Nand Flash 烧写问题排查

时间:2024-04-13 15:35:11

问题背景

板卡: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 烧写问题排查

 

补充说明

功能测试未有直接测试 Nand Flash 读写,其他所有功能项测试通过后使用专用烧写卡进行烧写。

该型号板卡已多次生产,未有出现类似问题。

 

调试经过

1)去到品质部现场,向问题报告者了解其遇到的问题具体情况;

2)重新熟悉烧写卡,烧写脚本流程。

3)确认软硬件环境是否完备,没有被破坏。

4)复现问题,观察问题出现的整个过程。

5)多张卡、多个不同核心板对比测试。

6)定位报错信息对应的代码,分析问题属于硬件、驱动、还是应用范围。无法确定,都有可能。

7)调整心态。意识到当前问题不是简单问题。

8)请教乐荣、伯齐,询问是否有相关经验,了解其看法。未有突破。

9)品质部启荣提交了其对比测试情况说明。主要有两个关键点:1、先执行一个由曾福开发的坏块检测脚本,后进行烧写正常;2、烧写异常的 Flash 芯片更换到 335x 核心板上烧写正常。

10)请求伯齐帮忙对比分析 335x 与 437x 内核在 Nand 相关内容上的差异。被告知只有一个 ecc 配置差异,但觉得不影响。

11)分析坏块检测脚本的代码,确定影响的相关操作。确定 flash_erase 有关联。

12)转由曾福进一步调查确认问题根源。确认背后原因。

嵌入式系统 - Nand Flash 烧写问题排查

 

问题结果

部分核心板的 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日