您的位置:首页 > 理论基础 > 计算机网络

flash 分区 nor nand FLASH区别(开发板启动时) 及 结构 【转自网络】

2014-03-05 23:43 603 查看
nandflash 的分区表 对应于内核arch/arm/mach-s3c2440/mach-mini2440.c中(友善官网提供的2.6.32.2的移植内核)




在linux2.6.32.2 中 已经自带了大部分nandflash驱动
在linux-2.6.32.2/drivers/mtd/nand/nand_ids.c这个文件中
里面定义了所支持的各种nandflash类型
在linux 2.6.32 中 nand驱动是被注册为平台设备
在linux统源代码树中 在linux2.6.32/arch/arm 这个文件夹中
目录plat-s3c24xx中  有common-smdk.c文件
里面定义nandflash的默认分区情况 这个是这个s3c24xx平台的 可能并不适合我们的具体的开发板
因此在这个目录外 有相应得开发板的具体的一些硬件结构信息
mach-s3c2440 这个目录 里面 的mach-mini2440.c中就定义了我们自己开发板上自己划分的适合的分区
static struct mtd_partition friendly_arm_default_nand_part[]
= {
    [0]
= {
        .name    =
"supervivi",//bootloader 所在分区 可以放u-boot supervivi 等对应为/dev/mtdblock0
        .size    =
0x00040000,
        .offset    =
0,
    },
    [1]
= {
        .name    =
"param",//这里是supervivi  或bootloader(uboot)等参数区
如果uboot较大 可以覆盖此区域 不会影响系统的启动 对应于/dev/mtdblock1
        .offset
= 0x00040000,
        .size    =
0x00020000,
    },
    [2]
= {
        .name    =
"Kernel",//内核所在的分区 大小5M 一般内核也就是2点几兆 足够了 对应/dev/mtdblock2
        .offset
= 0x00060000,
        .size    =
0x00500000,
    },
    [3]
= {
        .name    =
"root",//文件系统分区 nandflash用的多的yaffs2文件系统 对应/dev/mtdblock3
        .offset
= 0x00560000,
        .size    =
1024 * 1024 * 1024, //
    },
    [4]
= {
        .name    =
"nand",//此区域代表了整片的nandflash 主要是预留使用 比如以后可以通过应用程序访问读取/dev/mtdblock4 就能实现备份整片nandflash了
        .offset
= 0x00000000,
        .size    =
1024 * 1024 * 1024, //
    }
};
特别注意:对文件系统的分区大小要是nand页的大小的整数倍
否则会出现readonly错误 flash按页读取

//下面为开发板的nandflash设置表 因为板子上只有一片  因此也就只有一个表
static struct s3c2410_nand_set friendly_arm_nand_sets[] = {
    [0]
= {
        .name        =
"NAND",
        .nr_chips    =
1,
        .nr_partitions    =
ARRAY_SIZE(friendly_arm_default_nand_part),
        .partitions    =
friendly_arm_default_nand_part,
    },
};

//下面是nand flash 本身的一些特性 一般需要对照datasheet填写 大部分情况下按照以下参数填写即可
static struct s3c2410_platform_nand friendly_arm_nand_info = {
    .tacls        =
20,
    .twrph0        =
60,
    .twrph1        =
20,
    .nr_sets    =
ARRAY_SIZE(friendly_arm_nand_sets),
    .sets        =
friendly_arm_nand_sets,
    .ignore_unset_ecc
= 1,
};
注意:
mini2440_nand_info需要注册到mini2440_map_io中。
static void __init mini2440_map_io(void)
{
    s3c24xx_init_io(mini2440_iodesc,
ARRAY_SIZE(mini2440_iodesc));
    s3c24xx_init_clocks(12000000);
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: