天嵌 ARM开发社区

 找回密码
 注册
查看: 4012|回复: 3

请教一下天嵌uboot nand启动时搬运代码时检测坏块原理

[复制链接]
北极熊 发表于 2012-9-8 16:53:10 | 显示全部楼层 |阅读模式
天嵌uboot中board/embedsky/boot_init.c中306行函数nand_read_ll_lp中有段代码如下,注释为检测坏块,它的实现原理是什么呢?最后的if(dat != 0xff)  i += 131072;应该是检测到坏块了吧,为什么dat != 0xff就是坏块呢?还有,如果i += 131072;跳过这个坏块后会不会导致实际读到的代码比size小呢?size为_bss_start-_armboot_start,即要搬运代码的长度。

        for(i=start_addr; i < (start_addr + size);)
        {
/* Check Bad Block */
if(1){
                int col, page;

                col = i & NAND_BLOCK_MASK_LP;
                page = i / NAND_SECTOR_SIZE_LP;
                /*send write cmd*/
                write_cmd(READ1);

                *p = 5;
                for(j=0; j<10; j++);
                *p = 8;
                for(j=0; j<10; j++);
                *p = page & 0xff;                /* Row Address A12~A19 */
                for(j=0; j<10; j++);
                *p = (page >> 8) & 0xff;                /* Row Address A20~A27 */
                for(j=0; j<10; j++);
                *p = (page >> 16) & 0x01;                /* Row Address A28 */
                for(j=0; j<10; j++);

                write_cmd(READ2);/*configerate write cmd*/
                wait_idle();
                dat = read_data();

                nand_deselect_chip();
                if(dat != 0xff)
                        i += 131072;                // 1 Block = 2048*64= 131072
/* Read Page */
                nand_select_chip();
}
                write_cmd(READ1);

                /* Write Address */
                write_addr_lp(i);
                write_cmd(READ2);
                wait_idle();

                for(j=0; j < NAND_SECTOR_SIZE_LP; j++, i++)
                {
                        *buf = read_data();
                        buf++;
                }
        }
 楼主| 北极熊 发表于 2012-9-8 16:54:49 | 显示全部楼层
我将uboot中nand的操作命令用宏定义READ1 READ2代替了
 楼主| 北极熊 发表于 2012-9-8 22:36:42 | 显示全部楼层
我查了一些资料,明白了三星K9F2G08U0A nand flash在出场前会把每个坏块的列地址2048处标记为非FF,所以只需读一下该地址是不是FF就可以知道是不是坏块,天嵌检测的地址是spare area的第5个地址吧,芯片手册说的是第0个地址,有位前辈提到了小页是NAND的spare area第五个字节是用来检测坏块的,大页NAND的spare area第0位是用来检测坏块的,不知道天嵌uboot是不是写错了?

还有就是跳过坏块后会不会对实际读到的代码长度产生影响?希望前辈指点一二。
 楼主| 北极熊 发表于 2012-9-9 23:06:02 | 显示全部楼层
人工置顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-29 14:20 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表