首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构

S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构

nandflash 的分区表对应于内核arch/arm/mach-s3c2440/mach-mini2440.c中(友善官网提供的2.6.32.2的移植内核)
flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" title="S3C2440 flash 分区 nor nand FLASH区别(开发板启动时) 及 结构" height="112" width="690">

在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);
   s3c24xx_init_uarts(mini2440_uartcfgs,ARRAY_SIZE(mini2440_uartcfgs));
}

//下面把nandflash这个设备注册到系统中
static struct platform_device *mini2440_devices[] __initdata ={
   &s3c_device_usb,
   &s3c_device_rtc,
   &s3c_device_lcd,
   &s3c_device_wdt,
   &s3c_device_i2c0,
   &s3c_device_iis,
   &mini2440_device_eth,
   &s3c24xx_uda134x,
   &s3c_device_nand,//把nandflash添加到开发板设备列表结构中
   &s3c_device_sdi,
   &s3c_device_usbgadget,
};
继承事业,薪火相传
返回列表