NAND flash替换问题
2016-07-25 20:16
501 查看
原flash: SAMSUNG K9K8G08U0B
新flash:SPANSION S32ML08G201TF100
但K9K8G08U0B的SPARE AREA为每页64B,S32ML08G201TF100为128B
板子全都起不来
2.板子起不来,就想着通过JTAG(BDI3000)引导ram版的uboot,然后将程序写入nand,但bdi检查不通过,表示cpu已经跑飞了...
我的意思是这个校验是cpu加上的,尽管nand不同,但写入的数据是一样的。通过烧写器(希尔特6100)将芯片内容读出对比也确实证明了这一点。
数据完全一样,新flash却起不来。
冷静思考解决办法,通过修改烧录器的配置字参数,终于有一片flash,bdi可以检查通过,ram uboot跑起来了。
通过nand dump命令查看flash的内容,发现!!!
发现第一页数据都正常,但是第二页却出现了偏差,数据前移了64B,正好卡上下面这张图
道理就是这样,S32ML08G201TF100有128B的SPARE AREA,校验虽然只有64B,但后面的数据会继续填满这128B,这就导致再后面的数据每页往前移动64B
2.按道理来讲,bdi可以配置target(也就是cpu)reset后立刻挂起,进入debug模式,既然reset后等在那,说明cpu什么也没有执行,怎么会跑飞呢?
将芯片格了,bdi就OK了,果然跟数据有关,也就是说,cpu上电或bdi进行reset,cpu是会执行nand中的代码的。
后来想到,毕竟是nand,cpu的nand控制器定会自动将nand的前4K load到SRAM的,然后CPU会小跑一段?
那只能来硬的了,查看cpu手册,将cpu的上电启动改了
原来cpu本身就支持多种上电启动,有ram,nand,reserve...
暂时将cpu的上电改为reserve,bdi可以识别,也可以烧录。
解决办法:
在原来数据基础上在每4K+64后面插入64字节的0xff 这样就适配了新nand的结构
代码如下
附:给领导的文档
关于新flash芯片SPANSION S32ML08G201TF100,烧录进程序后,设备无法启动问题
老芯片 SAMSUNG K9K8G08U0B 的PAGE大小为 (2048+64) bytes
新芯片S32ML08G201TF100的PAGE大小为(2048+128) bytes
差异部分为SPARE AREA区域,也就是存放ECC校验的区域
CPU方面仍然按(2048+64) bytes大小提取程序,烧录器按(2048+128) bytes烧录
导致程序烧录进去后按每个PAGE向前移动64 bytes,程序乱了板子也就起不来了。
注意:新老芯片页大小不同,最终的离线烧录程序不同
由于已经烧录过的芯片,bdi3000无法识别,只能将芯片取下,重新烧录后,再将芯片焊上
烧录器配置:
器件配置字:
新flash:SPANSION S32ML08G201TF100
简单介绍:
K9K8G08U0B与 S32ML08G201TF100很相似,都是8Gbits,页大小都是2048bytes但K9K8G08U0B的SPARE AREA为每页64B,S32ML08G201TF100为128B
问题是这样的:
1.生产了50块板,这些板都是用的新flash,但程序烧录的却是老flash的程序板子全都起不来
2.板子起不来,就想着通过JTAG(BDI3000)引导ram版的uboot,然后将程序写入nand,但bdi检查不通过,表示cpu已经跑飞了...
问题分析:
1.按道理讲,通过JTAG load起来的ram uboot将uboot的原始程序通过nand write往nand写的时候,是有计算校验的,我的意思是这个校验是cpu加上的,尽管nand不同,但写入的数据是一样的。通过烧写器(希尔特6100)将芯片内容读出对比也确实证明了这一点。
数据完全一样,新flash却起不来。
冷静思考解决办法,通过修改烧录器的配置字参数,终于有一片flash,bdi可以检查通过,ram uboot跑起来了。
通过nand dump命令查看flash的内容,发现!!!
发现第一页数据都正常,但是第二页却出现了偏差,数据前移了64B,正好卡上下面这张图
道理就是这样,S32ML08G201TF100有128B的SPARE AREA,校验虽然只有64B,但后面的数据会继续填满这128B,这就导致再后面的数据每页往前移动64B
2.按道理来讲,bdi可以配置target(也就是cpu)reset后立刻挂起,进入debug模式,既然reset后等在那,说明cpu什么也没有执行,怎么会跑飞呢?
将芯片格了,bdi就OK了,果然跟数据有关,也就是说,cpu上电或bdi进行reset,cpu是会执行nand中的代码的。
后来想到,毕竟是nand,cpu的nand控制器定会自动将nand的前4K load到SRAM的,然后CPU会小跑一段?
那只能来硬的了,查看cpu手册,将cpu的上电启动改了
原来cpu本身就支持多种上电启动,有ram,nand,reserve...
暂时将cpu的上电改为reserve,bdi可以识别,也可以烧录。
解决办法:
在原来数据基础上在每4K+64后面插入64字节的0xff 这样就适配了新nand的结构
代码如下
/* * COPYRIGHT NOTICE * Copyright (C) 2016 HuaHuan Electronics Corporation, Inc. All rights reserved * * Author :Kevin_fzs * File Name :/home/kevin/works/projects/ACCUMULATION/C_Program/addOob/addoob.c * Create Date :2016/07/21 16:18 * Last Modified :2016/07/21 16:18 * Description : */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fd1, *fd2; char new[70] = {0}, *buf = NULL; int len = 0; if(argc<2) { printf("Please input pof name"); return 0; } printf("file is %s\n",argv[1]); sprintf(new, "%s-spansion.filebin",argv[1]); if((fd1 = fopen(argv[1],"rb"))==NULL) { printf("open %s error\n", argv[1]);; return 0; } if((fd2 = fopen(new,"wb"))==NULL) { printf("open %s error\n", new);; return 0; } printf("processing..\n"); if(NULL == (buf = malloc(2048+200))) { printf("malloc failed..\n"); return 0; } memset(buf, 0xff, sizeof(buf)); while((len = fread(buf, 1, (2048+64), fd1))>0) { memset(buf+(2048+64), 0xff, 64); fwrite(buf, 1, (2048+128), fd2); memset(buf, 0xff, sizeof(buf)); } free(buf); fclose(fd1); fclose(fd2); printf("OK..\n"); return 0; }
附:给领导的文档
关于新flash芯片SPANSION S32ML08G201TF100,烧录进程序后,设备无法启动问题
问题分析
芯片特性差异:老芯片 SAMSUNG K9K8G08U0B 的PAGE大小为 (2048+64) bytes
新芯片S32ML08G201TF100的PAGE大小为(2048+128) bytes
差异部分为SPARE AREA区域,也就是存放ECC校验的区域
CPU方面仍然按(2048+64) bytes大小提取程序,烧录器按(2048+128) bytes烧录
导致程序烧录进去后按每个PAGE向前移动64 bytes,程序乱了板子也就起不来了。
解决办法
按照新芯片的特性,将提取到的程序在每(2048+64) bytes后填充64bytes的校验,补齐到(2048+128) bytes。经过特殊处理后的程序验证通过注意:新老芯片页大小不同,最终的离线烧录程序不同
由于已经烧录过的芯片,bdi3000无法识别,只能将芯片取下,重新烧录后,再将芯片焊上
烧录器配置
烧录时间:烧录一块芯片的时间大约为25秒烧录器配置:
器件配置字:
相关文章推荐
- Java学习之Iterator(迭代器)的一般用法 (多方整理)
- pdo事物回滚
- 矩阵基础1003 HDU 4965
- mysql的安装和用户权限
- OpenGL,z值转深度值计算
- 矩阵基础1002 CodeForces 450B
- 【Maven用户手册】Maven生命周期
- 矩阵基础1001 HDU 4990
- 计算几何 ( 凸包 )——Wall ( HDU 1248 )
- Linux动态链接库的创建与使用
- 操作各个版本的excel的链接写法
- Scala命令设置JVM参数的规则
- HDU 1254 推箱子(双层BFS)
- Android Studio中Android应用程序签名打包方法
- screen命令的详解
- HDU1335 POJ1546 UVA389 UVALive5306 ZOJ1334 Basically Speaking【进制+atio+itoa】
- mysql左链接,右链接,内部链接,交叉连接
- 【Maven用户手册】Maven是什么
- malloc、calloc、realloc的使用和区别
- 引入layoutlib.jar