Nand分区及nand erase简解

来源:互联网 发布:淘宝全屏轮播素材女装 编辑:程序博客网 时间:2024/06/05 14:18
我的nand flash 32M,kernel 2.6.18, rootfs is emb linux, cramfs.

nand flash分区如下:
static struct mtd_partition nand_partitions[] = {
        /* bootloader (UBL, U-Boot, BBT) in sectors: 0 - 14 */
        {
                .name = "bootloader",
                .offset = 0,
                .size = 32 * NAND_BLOCK_SIZE,  //32x16 = 512k
                .mask_flags = MTD_WRITEABLE,        /* force read-only */
        },
        /* bootloader params in the next sector 15 */
        {
                .name = "params",
                .offset = MTDPART_OFS_APPEND,
                .size = 96 * NAND_BLOCK_SIZE, //96x16 = 1536k = 1.5M
                .mask_flags = MTD_WRITEABLE,        /* force read-only */
        },
        /* kernel in sectors: 16 */
        {
                .name = "kernel", 
                .offset = MTDPART_OFS_APPEND,
                .size = SZ_2M, //2M
                .mask_flags = 0
        },
        /* rootfs */
        {
                .name = "filesystem1", 
                .offset = MTDPART_OFS_APPEND,
                .size = SZ_16M + SZ_8M, //24M
                .mask_flags = 0
        },
        /*parameter*/
        {
                .name = "filesystem2", 
                .offset = MTDPART_OFS_APPEND,
                .size = MTDPART_SIZ_FULL, //4M, /mnt/nand, save log,sysenv, 
                .mask_flags = 0
        }
};

//系统启动后
# cat /proc/partitions                                                         
major minor  #blocks  name                                                      
                                                                                
  31     0        512 mtdblock0                                                 
  31     1       1536 mtdblock1                                                 
  31     2       2048 mtdblock2                                                 
  31     3      24576 mtdblock3                                                 
  31     4       4096 mtdblock4                                                 
254     0        512 sbulla                                                    

# cat /proc/mtd                                                                 
dev:    size   erasesize  name                                                  
mtd0: 00080000 00004000 "bootloader"                                            
mtd1: 00180000 00004000 "params"                                                
mtd2: 00200000 00004000 "kernel"                                                
mtd3: 01800000 00004000 "filesystem1"                                           
mtd4: 00400000 00004000 "filesystem2"                                           


loadb 20000000                  //(1)
nand erase 0x100000   0x200000           //(2)
nand write 0x20000000 0x100000 0x200000 -//(3)
nand read  0x20000000 0x100000 0x200000 -//(4)

tftp 0x80200000(内存地址) uImage 
过程  从服务器 到内存 从内存在到Nand flash 
为什么呢 因为 nandflash 的擦出 读写不独立 万一一边擦好了 可网络断了 那就麻烦了 呵呵 通过内存中转 好主意阿 速度起码快把 呵呵

(1) 从串口下载到SDRAM的0x20000000处
(2) 从1M处开始擦写Nand Flash,擦写2M大小的空间
(3) 将SDRAM中的0x20000000处开始的内容,烧写到Nand Flash的0x100000处开始的2M空间内
(4) 将Nand Flash的0x100000处开始的2M空间内容,拷贝到SDRAM中0x20000000处开始的地方
Nand flash芯片工作原理
------------------------------------
    Nand flash芯片型号为Samsung K9F1208U0B,数据存储容量为64MB,采用块页式存储管理。8个I/O
引脚充当数据、地址、命令的复用端口。

    芯片内部存储布局及存储操作特点:
    一片Nand flash为一个设备(device), 其数据存储分层为:
    1 (Device) = 4096 (Blocks)
    1 (Block) -= 32   (Pages/Rows) 页与行是相同的意思,叫法不一样
    1 (Page)   = 528 (Bytes) = 数据块大小(512Bytes) + OOB 块大小(16Bytes)
     在每一页中,最后16个字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余512个字节又
分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位通过
Nand Flash内置的指针指向各自的首地址。

    存储操作特点:
    1. 擦除操作的最小单位是块。
    2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).
    3. OOB部分的第六字节(即517字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。

    4. 除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码


转自: http://blog.csdn.net/maopig/article/details/17554429

0 0