总结一下关于烧录器与nand的情缘

记得上家公司,每发生产版本,测试完后,都需要将flash拆下来,用烧录器读出里面的内容

后面的生产都要用这个文件来烧录

同样的,在这家公司,每当uboot改动发新版本后,都需要先用仿真器将ram版uboot带起来,再通过tftp将nand uboot

down下来,用命令nand write将uboot写入nand,将芯片拆下来,使用烧录器读出,读出的文件还要再用烧录器烧进芯片进行验证

这个过程相当复杂,不断拆焊芯片,而且烧录器有时候不稳定,读出的文件会有问题。

这么复杂的过程,看上去就很不合理,为什么不能直接用烧录器将nand uboot烧入nand flash呢

做了如下实验

1.将uboot-nand.bin直接烧入nand,板子上电起不来

将flash内容读出,uboot-read1.txt,与uboot-nand.bin对比,基本相同

2.将uboot-nand.bin通过仿真器BDI3000带起的uboot,然后通过uboot命令行nand write将uboot-nand.bin写入flash

板子上电可以起来,读出flash的内容如下,uboot-read2.txt(其中的一个页),可以看到最下面部分,比uboot-nand.bin多出了129-132这4行

27 05 19 56 55 2D 42 6F 6F 74 20 33 20 2E 30 31-----------------1
20 20 28 44 65 63 20 30 39 20 32 30 31 35 20 2D-----------------2
20 31 30 3A 35 35 3A 35 32 29 00 00 00 00 00 00-----------------3
3C 20 FF D0 60 21 3F 90 38 00 00 00 94 01 FF FC
94 01 FF FC 94 21 FF F8 3C 00 FF FF 60 00 FF FC
94 21 FF F8 90 01 00 0C 48 00 00 05 7D 88 02 A6
80 0C 01 D8 7D 80 62 14 48 00 02 49 3C 60 00 02
60 63 12 00 7C 60 01 24 4C 00 01 2C 48 00 02 A9
48 00 06 CD 4C 00 01 2C 7C 70 9B A6 7C 91 9B A6
7C B2 9B A6 7C D3 9B A6 7C F0 EB A6 38 60 00 00
7D 6B 01 D6 60 84 20 00 81 3E 80 00 3C 60 FF E0
60 63 45 00 3F 80 FF E0 7C 8B 23 96 91 69 00 00
3F A0 FF E0 63 9C F0 00 63 BD F0 08 3F 60 00 20
3B 40 00 00 48 00 02 09 80 7E 80 04 4B FF FD 71
3D 20 FF E0 61 29 F0 04 3C 00 02 20 38 60 03 E8
90 1C 00 00 93 69 00 00 93 5D 00 00 48 00 03 A5
93 7D 00 00 38 60 03 E8 48 00 03 99 93 5C 00 00-------------------128
FF FF FF FF FF FF FF FF 65 A6 6A FF FF FF FF FF-------------------129
FF FF FF FF FF FF FF FF C0 33 33 FF FF FF FF FF-------------------130
FF FF FF FF FF FF FF FF FF 30 F0 FF FF FF FF FF-------------------131
FF FF FF FF FF FF FF FF CC F3 FF FF FF FF FF FF-------------------132

我们使用的K9K8G08U0B flash,datasheet里面介绍的组织存储是这样的

每一个页是由2048B+64Byte组成的,再看uboot-read.txt的第一页

128*16+4*16

=2048+64

正好吻合,这个64B的区域叫做OOB area。

NAND flashes store per-NAND page ECC codes in the OOB area, which means that whole NAND page has to be written at once to calculate the ECC code, and whole NAND page has to be read at once to check the ECC code.

nand flash将每一个页的ECC(错误检查和纠正)码存储在OOB区域,这就意味着每次写入必须以一个nand 页的形式并计算出ECC码,每次读必须以一个nand页的形式并检查ECC码。

很明显,直接将软件编译出来的uboot-nand.bin是不包含ECC码的,通过烧录器写入nand,cpu读取的时候找不到ECC,导致无法正确load data

关于ECC是有一个比较复杂的算法的,一开始,我以为是与nand相关,后来与烧录器厂家联系,说是跟cpu相关

其实不用考虑这些问题

排除硬件或cpu nand控制器实现ECC的可能,还有一种就是软件来实现的,目前ECC校验使用软件来校验的比较多

通过uboot中nand write将uboot-nand.bin写入nand时,烧录器读出是带有ECC的,

而使用烧录器将uboot-nand.bin写入nand,烧录器读出是不带ECC的

nand write命令可能带有ECC码的算法,于是追踪nand write命令的实现

入口:

U_BOOT_CMD(
nand, CONFIG_SYS_MAXARGS, 1, do_nand,

...

}

函数:

int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
{

if (read)
ret = nand_read_skip_bad(nand, off, &rwsize, (u_char *)addr);
else
ret = nand_write_skip_bad(nand, off, &rwsize, (u_char *)addr, 0);

intnand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length,

u_char *buffer, int flags)

{

for (page = 0; page <pages; page++) {

rval =nand->write_oob(nand, offset, &ops);

}

最后调用了write_oob将oob信息写入flash,中间省去了ECC码的生成算法,这一块内容较多,将会专门写一篇文档

一开始的想法是提取这个算法,写一个工具,或者通过nand命令行将oob读出来,

Uboot下有命令=> nand dump 0可将flash page页和oob一起打印出来

Page 00000000 dump:

27 05 19 56 55 2d 42 6f  6f 74 2033 20 2e 31 30

20 20 28 44 65 63 20 31  37 20 3230 31 35 20 2d

20 31 37 3a 32 36 3a 32  30 29 0000 00 00 00 00

….

3d 20 ff e0 61 29 f0 04  3c 00 0220 38 60 03 e8

90 1c 00 00 93 69 00 00  93 5d 0000 48 00 03 a5

93 7d 00 00 38 60 03 e8  48 00 0399 93 5c 00 00

OOB:

ff ff ff ff ff ff ff ff

5a a6 56 ff ff ff ff ff

ff ff ff ff ff ff ff ff

c0 33 33 ff ff ff ff ff

ff ff ff ff ff ff ff ff

ff 30 f0 ff ff ff ff ff

ff ff ff ff ff ff ff ff

cc f3 ff ff ff ff ff ff

但因命令行限制,不能将所有oob打印出来,即使修改命令行,将全部oob取出,也不容易导出到PC,毕竟不是在linux中,可以以将信息文件的形式来导出。

想到这里,我便查找busybox的命令行,而且找到了一个命令,nanddump,可以将mtd分区信息导出到文件。

在kernel中,通过如下命令

[root@Huahuan:/root]#cat /proc/mtd

dev:    size  erasesize  name

mtd0: 00080000 00020000 "u-boot"

mtd1: 00020000 00020000"u-boot-env"

mtd2: 3a000000 00020000 "ubifs"

mtd3: 05f60000 00020000"reserved"

[root@Huahuan:/root]#nanddump -fuboot.bin  /dev/mtd0

可将uboot分区mtd0全部导出

导出的文件与uboot下通过命令打印出来的oob信息完全一致,由此判断导出的文件可作为烧录文件,后面使用烧录器烧录也证实了这一判断

nand flash与烧录器相关推荐

  1. 335平台部分flash用烧录器烧写不能启动问题

    问题题背景描述: 335平台在 更换1gflash 型号后 ,有29F8G08ABABA 更换为29F8G08ABACA 后.部分flash 存在坏块. 用烧录器烧写后部分核心板不能能启动.但是用sd ...

  2. NAND FLASH编程器烧录详解

    NAND FLASH编程器_NAND FLASH烧录器 SUPERPRO5000是西尔特出品的新一代USB接口独立式智能极速NAND FLASH编程器.具有编程速度快,烧录稳定,软件集成度高,更智能化 ...

  3. 第四章 主存储器及NAND FLASH存储器组成——ARM

    1.S3C2410简介 (1)S3C2410X集成的主要片上功能 1.8V ARM920T内核,1.8V/2.5V/3.3V存储系统,带有3.3V16KB指令和16KB数据缓存及MMU单元的外部O接口 ...

  4. 【小米路由器3】breed刷机救砖-nand flash硬改SPI flash-编程器救砖(解决ttl无法救砖问题)

    大家好,我是老子姓李!(gzh:楠瘦) 本博文带来[小米路由器3]变砖,ttl无法救砖,硬改焊接一块SPI flash,使用编程器刷入小米路由器mini的breed最终成功救砖. 目录 1.引言 1. ...

  5. 编程器烧写NAND flash的一些说明

    注意事项: 1.大小端模式,也即在使用编程器时需不需要做字节反序 2.Spare area处理方式,需要还是不需要,是否含有私有ECC算法. 3.坏块处理方式. 摘要一段说明如下:(虽然针对西尔特SU ...

  6. uboot下nand flash读写方法_鸿蒙HarmonyOS烧录方法总结

    1.烧录工具 理解HarmonyOS驱动框架,用户态APP和内核态驱动之间的通信机制. HarmonyOS烧录使用的海思自研的烧录工具Hitool,使用起来相对来说比较简单.整体界面如图所示: 2.  ...

  7. [Keil 烧录器下载报错] “Flash Timeout. Reset the Target and try it again”

    1.首先检查是否为BOOT0,BOOT1选择导致的下载方式错误. 2.最有可能的原因是STM32芯片读写保护,导致程序烧录失败. 第二种解决办法如下: 使用ST-Link Utility去除STM32 ...

  8. CH341A及XTW 2两种SPI FLASH烧录器的硬件使用说明_20220920【可用于升级主板BIOS】

    目录 一.XTW 2(烧录速度快一些) 二.CH341A(烧录速度慢,但貌似兼容性更高,同时价格较便宜) 三.烧录器驱动及软件的下载链接 一.XTW 2(烧录速度快一些) 3.3V SPI FLASH ...

  9. H7-TOOL脱机烧录器支持1拖4,支持新唐,GD32,MM32,AT32,APM32,CX32,STM32,STM8,i.MX RT,W7500,外置Flash等2020-10-27

    大家在使用中,有什么建议,欢迎反馈. 脱机烧录视频效果展示: http://v.qq.com/x/page/p30628h2ou7.html 多款STM8+STM32产品混合烧录展示: http:// ...

  10. 【立创EDA开源推荐】001期 | 基于航顺HK32F030R8串行Flash烧录器

    工程名称: 串行Flash烧录器 工程作者: micespring 工程主页链接:https://oshwhub.com/micespring/hk32_serialflashprogrammer 开 ...

最新文章

  1. SpringMVC 如何实现将消息的websocket
  2. 以Attention Model为例谈谈两种研究创新模式
  3. 高可用Hadoop平台-Oozie工作流
  4. Java排序算法(1)
  5. spring mvc原理_Spring MVC的工作原理,我们来看看其源码实现
  6. 结合随机微分方程,多大Duvenaud团队提出无限深度贝叶斯神经网络
  7. awx文件解析_Android so(ELF)文件解析
  8. Leet Code OJ 260. Single Number III [Difficulty: Medium]
  9. 跨语言RPC框架Thrift详解
  10. Mockito 的使用
  11. 前端学习(1304):package.json
  12. AngualrJS之服务器端通信
  13. erwin 不能输入中文_国产开源建模软件PDMan与国外商业建模软件ERwin的主要功能比较...
  14. Spring Boot 使用 AOP 实现页面自适应
  15. ProjectEuler 5
  16. 一款AI编程助手,阿里云智能编码插件
  17. jQuery:ajax中form表单serialize()序列化方法
  18. Selenium2 + Python3.6实战(五):生成HTML测试报告 Invalid argument
  19. C/C++正则表达式匹配数字范围/小数点后几位
  20. 2021年最新DNF脚本框架

热门文章

  1. 迅捷pdf在线转换html,如何把PDF转换成HTML?迅捷PDF转换器
  2. 模拟京东登陆 java_java京东自动登录
  3. 10本入门编程书籍推荐,带你入门到精通
  4. 常用颜色及RGB配色表
  5. 凯立德2015夏季3621J0P4G卡版分区地图
  6. 巧如范金,精比琢玉,一分钟高效打造精美详实的Go语言技术简历(Golang1.18)
  7. 排序算法(2)冒泡排序
  8. ei会议论文录用但不参加会议_ei会议论文还能在报纸杂志发表吗?
  9. 如何编写一个好的软件设计文档——Medium中文站
  10. bc547可以用8050代换吗_代换S8550 S8050三极管要特别注意放大倍数