我板子的启动过程如下:

..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分区对应的地址。

nand中间出现坏块,无法正常启动内…的更多相关文章

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

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

  2. nand flash 的oob 及坏块管理

    0.NAND的操作管理方式      NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...

  3. nand flash坏块管理OOB,BBT,ECC

    转:http://www.cnblogs.com/elect-fans/archive/2012/05/14/2500643.html 0.NAND的操作管理方式 NAND FLASH的管理方式:以三 ...

  4. 【转】nand flash坏块管理OOB,BBT,ECC

    0.NAND的操作管理方式      NAND FLASH的管理方式:以三星FLASH为例,一片Nand flash为一个设备(device),1 (Device) = xxxx (Blocks),1 ...

  5. undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库坏块导致

    本文转自 惜纷飞 大师. 模拟基表事务未提交数据库crash,undo丢失恢复异常恢复,运维DBA反映Oracle数据库无法启动报错ORA-01157 ORA-01110,分析原因为Oracle数据库 ...

  6. NAND Flash大容量存储器K9F1G08U的坏块管理方法

    转: http://www.360doc.com/content/11/0915/10/7715138_148381804.shtml 在进行数据存储的时候,我们需要保证数据的完整性,而NAND Fl ...

  7. PostgreSQL 恢复大法 - 恢复部分数据库、跳过坏块、修复无法启动的数据库

    转载自:https://yq.aliyun.com/articles/582880 背景 一个较大的数据库,如何只恢复一部分数据(例如只恢复某个DB). 如果访问有坏块的表. 如何从无法启动的数据库中 ...

  8. STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析

    最近因项目需要,做一个数据采集的单片机平台.需要移植 FatFs .现在把最后成果贴上来. 1.摘要 在 STM32 单片机上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片为 ...

  9. Oracle corrupt block(坏块) 详解

    转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...

随机推荐

  1. css3 hover 效果

    链接 链接 链接 链接 大量级 11 22  类似拉勾  33 包括各种流行的hover 小众 极光

  2. 自定义View实战--实现一个清新美观的加载按钮

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在 Dribble 上偶然看到了一组交互如下: 当时在心里问自己能不能做,答案肯定是能做的,不过我比较懒,觉得中间那个伸缩变化要编写 ...

  3. 正则 去除html标签

    String.prototype.stripHtml=function(){ var re=/<(?:.)*?>/g; // *? 意味着匹配任意数量的重复 return this.rep ...

  4. php果然是世界上最好的语言

    这两天参加Hackathon,作为一个什么都半吊子的家伙,两人小队伍被逼上岗,于是我不得不着手写代码.由此,我体验到了php的魔力-- 首先,我深刻地意识到了更新版本的重要性. 偷懒不想搭Apache ...

  5. verilog case 语句合并问题

    有时候在case语句中会有不同选择执行相同操作的情况,为了简化代码,可以将其合并. 以下解答来自百度知道(由于排版问题,有相应修改): reg [1:0]addr_cnt=2'b11; reg rea ...

  6. ansible playbook 使用

    ansible playbook 格式是json  yaml   1. 执行方法 ansible-playbook deply.yml 2. playbook 格式 关键字 hosts 主机ip 主机 ...

  7. 限制UITextfield的输入字符为50个字符

    1.实现UITextfieldDelegate 2.在UITextfield的代理方法中判断添加字符还是删除字符,从而做不同的操作 #pragma mark-UITextfield的代理方法 - (B ...

  8. C#检测应用程序重复启动----函数检测(可以在多用户登录情况下检测)

    上文是在网上找的检测程序重复运行的类,但是感觉不是很好用,而且还使用了API,似乎完全没有必要,于是晚上自己写了一个函数,经过测试,在多用户下仍然可以检测到程序的多次运行.当然,如果程序改了名字还是可 ...

  9. PCBA 的收货要求记录

    PCBA 的收货要求记录 性能 功能性测试 外观 标识 需要可以识别的料号(客户料号或货号) 贴片 元件焊点饱满 元件参数统一 后焊 插件焊盘饱满 插件焊盘不可以有小孔 焊盘不可以有漏铜上锡均匀 体积 ...

  10. 记一次印象有点深刻的坑(bug)

    1.该模块的主要功能介绍 该系统是一个网上课程预约系统. 学生进行口语预约(没上课前可以进行取消)--> 等待上课 --> 上完课老师进行完成的确认操作. 2.问题描述 看下图,现在出现的 ...