nand中间出现坏块,无法正常启动内…

原创 2013年12月02日 09:13:06

我板子的启动过程如下:

..showlogo..
Flash:   1 MB
NAND:    SLC detected.256 MB
In:      serial
Out:     serial
Err:     serial
*************show logo***************Hit any key to stop autoboot:  0

NAND read: device 0 offset 0x900000, size 0x300000
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
                  .....
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
s3c-nand: ECC uncorrectable error detected
 3145728 bytes read: ERROR
get_format
-------- 0 --------
Wrong Image Format for bootm command
ERROR: can't get kernel image!

分析:uboot能够正常启动,但是从这句“NAND read: device 0 offset 0x900000, size 0x300000
”可以看出在nand中0x900000出开始读kernel到内存时,出错,问题应该出在这段nand中,幸亏uboot能正常启动,那就好说了,直接重新给nand分区,然后修改uboot启动后设置启动参数,就可以搞定了。

值得注意的是:nand分区在linux内核中修改,/arch/arm/plat-s3c24xx/common-smdk.c

                                        struct mtd_partition s3c_partition_info[]

板子原来的分区如下:

struct mtd_partition s3c_partition_info[] = {
        {
                .name  = "Bootloader",
                .offset  = 0,
                .size  = (1024*SZ_1K),
             //   .mask_flags = MTD_CAP_NANDFLASH,
  
        },
  {
                .name  = "Logo",
                .offset  = MTDPART_OFS_APPEND,
                .size  = (8*SZ_1M),
               
               // .mask_flags = MTD_CAP_NANDFLASH,
        },
        {
                .name  = "Kernel",
                .offset  = MTDPART_OFS_APPEND,
                .size  = (3*SZ_1M),
               // .mask_flags = MTD_CAP_NANDFLASH,
        },
#ifdef CONFIG_SPLIT_ROOT_FILESYSTEM
        {
                .name  = "Root - Cramfs",
                .offset  = MTDPART_OFS_APPEND,
                .size  = (48*SZ_1M),
        },
#endif
        {
                .name  = "File System",
                .offset  = MTDPART_OFS_APPEND,
                .size  = MTDPART_SIZ_FULL,
        }
};

#endif

从上可以看出我板子的nand分区是:Bootloader --1M           0x0000 0000--0x0010 0000

                                Logo       --8M           0x0001 0000--0x0090 0000

                                Kernel     --3M           0x0009 0000--0x00c0 0000

                                Root - Cramfs  --48M      0x000c 0000--0x03c0 0000

                                File System    --剩余都是 0x03c0 0000--末尾

从上面可以看出,我们内核那部分空间会有部分坏块可能,所以我们要把内核空间往后移动2M空间就足够解决问题了,由于变量MTDPART_OFS_APPEND的使用,我们很好改变分区的位置和大小,我们只需要把Bootloader的空间增加2M就可以了,后面的分区就依次向后弄懂2M位置(uboot一般都很小,一般500多kb,所以后面的大部分空间就浪费了,由于nand一般都比较大,我们也就不必担心浪费的问题)。

修改后的分区应该是

                                Bootloader --1M           0x0000 0000--0x0030 0000

                                Logo       --8M           0x0003 0000--0x00b0 0000

                                Kernel     --3M           0x000b 0000--0x00e0 0000

                                Root - Cramfs  --48M      0x000e 0000--0x03e0 0000

                                File System    --剩余都是 0x03e0 0000--末尾

uboot再重新启动时,还要修改bootcmd

SMDK2416 # setenv bootcmd nand read c0008000 b00000 300000\;bootm c0008000
SMDK2416 # saveenv

 

重新修改nand分区后,如何再进行sd卡一键烧写:

uboot分两种:一个是从sd卡启动的uboot,另一个是从nand启动的uboot;把修改过分区后的内核及其他相应文件制作一键烧写的sd卡,从sd卡启动进入uboot(此为sd的uboot),敲空格进入命令行

Helper2416 # print
bootargs=set bootargs root=/dev/mtdblock2 console=ttySAC0,115200  mem=128m
bootcmd=sleep 1;nand scrub ;sleep 1;nand erase;sleep 1;movi read 3800000# 40000 c0000000 ;sleep 1;nand write c0000000 0 40000;sleep 1;movi read kernel c0000000;sleep 1;nand write c0000000 900000 200000;sleep 1;movi read 3600000# 1800000 c0000000;sleep 1;nand write.yaffs c0000000 c00000 17ffac0
bootdelay=3
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
ipaddr=192.168.0.20
serverip=192.168.0.100
gatewayip=192.168.0.1
netmask=255.255.255.0
nfspath=/opt/target
nfsargs=set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=$serverip:/opt/target,tcp rw ip=$ipaddr init=/linuxrc
updateu=nfs c0000000 $serverip:$nfspath/u-boot.bin;nand erase 0 40000;nand write c0000000 0 40000
updatek=nfs c0000000 $serverip:$nfspath/zImage;nand erase 40000 200000;nand write c0000000 40000 200000
bootnand=nand read c2000000 40000 200000;bootm c2000000
stdin=serial
stdout=serial
stderr=serial

Environment size: 950/16380 bytes
就是上面那红色部分bootcmd完成了,把sd卡上的uboot、kernel、文件系统依次copy到内存中,然后再copy到nand中保存的。因为我们修改了kernel的nand分区,所以我们也要修改这部分往nand中回写部分的地址。要和内核中的nand分区对应。我的修改如下:

setenv bootcmd 'nand scrub ;sleep 1;nand erase;movi read 3800000# 40000 c0000000 ;nand write c0000000 0 40000;movi read kernel c0000000;nand write c0000000 b00000 300000;movi read 3600000# 1800000 c0000000;nand write.yaffs c0000000 e00000 17ffac0'

saveenv  保存(这些环境参数保存到哪去了呢?注意我们此时是从sd卡启动的,当然保存到sd中的uboot中了)

然后就可以用这个sd卡进行一键烧写了。

 

还有就是要注意了,烧写完成后,启动还要报错:说是找不到zImage,那是因为你的nand中的uboot参数bootcmd没有修改成和内核nand分区对应的地址。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

AM3352 uboot中对NandFlash坏块的处理

本文用于学习uboot中对NandFlash坏块的处理,适用于AM3352,u-boot-2011.09,H27_2G8 NandFlash。1.1.1    出厂时的坏块标记依据datasheet中...
  • lights_joy
  • lights_joy
  • 2016年06月12日 23:39
  • 2328

NAND Flash产生坏块原因

NAND Flash产生坏块原因 由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。坏块的特性是...
  • broadCE
  • broadCE
  • 2015年03月02日 09:56
  • 2054

用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别

文章结构 结构顺序有变化 -1:烧写uboot 0: bootargs bootcmd 命令参数的设置 1:制作yaffs2的过程 2:烧写yaffs2的过程 3:制作uimage 的过程...
  • u012075739
  • u012075739
  • 2014年09月23日 23:44
  • 1308

am335x 从 NAND FLASH 中启动遇到的问题的解决方法(上) (下)

http://blog.chinaunix.net/uid-28458801-id-3437793.html PC操作系统:ubuntu 11.10 使用的开发板:...
  • wuxianglonghaohao
  • wuxianglonghaohao
  • 2014年09月17日 13:58
  • 2268

uboot和kernel中关于nand分区的定义

系统的NAND FLASH分区依赖于u-boot和Linux内核两方面的设置。 U-Boot中的NAND分区 位置:include/configs/开发板.h; ...
  • u014650722
  • u014650722
  • 2017年06月30日 11:30
  • 349

Nand Flash基础知识与坏块管理机制的研究

概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后...
  • qq_29350001
  • qq_29350001
  • 2016年05月24日 15:18
  • 3499

uboot 串口/网口/nand命令

一、串口传输命令         命令:         loadb   - load binary file over serial line (kermit mode)         lo...
  • xiaoxiaozhu2010
  • xiaoxiaozhu2010
  • 2014年01月07日 20:56
  • 3559

uboot.2015.07移植之从NAND Flash启动(5)

移植u-boot-2015.07之修改程序支持NAND Flash
  • u013904227
  • u013904227
  • 2016年07月05日 10:22
  • 1647

移植uboot第四步:设置NAND启动

移植的uboot使用NOR启动,不支持NAND,这次就是修改代码以支持NAND。 之前uboot的Makefile里面有-pie,前面写到了,这是为了生成位置无关码,代码可以copy到任何地方。因为...
  • ltc844139730
  • ltc844139730
  • 2016年08月11日 01:12
  • 341

uboot下读写nand flash以及nand_read()函数的实现

1、uboot下NAND操作指令         指令              Flash内地址        擦除长度  nand erase     0x100000            0x...
  • qingkongyeyue
  • qingkongyeyue
  • 2016年08月03日 11:40
  • 2073
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nand中间出现坏块,无法正常启动内…
举报原因:
原因补充:

(最多只允许输入30个字)