加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

NAND flash替换问题

发布时间:2020-12-15 20:02:14 所属栏目:百科 来源:网络整理
导读:原flash: SAMSUNG K9K8G08U0B 新flash:SPANSION ?S32ML08G201TF100 简单介绍: K9K8G08U0B与?S32ML08G201TF100很相似,都是8Gbits,页大小都是2048bytes 但K9K8G08U0B的SPARE AREA为每页64B,S32ML08G201TF100为128B 问题是这样的: 1.生产了50块板,这些

原flash: SAMSUNG K9K8G08U0B

新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 %sn",argv[1]);

        sprintf(new,"%s-spansion.filebin",argv[1]);

        if((fd1 = fopen(argv[1],"rb"))==NULL)
        {
                printf("open %s errorn",argv[1]);;
                return 0;
        }
        if((fd2 = fopen(new,"wb"))==NULL)
        {
                printf("open %s errorn",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),64);
                fwrite(buf,(2048+128),fd2);
                memset(buf,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秒

?

烧录器配置:

?

器件配置字:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读