mini2440移植之nand驱动

1.linux2.6.32.2内核支持的所有nand类型

Linux2.6.32.2 已经自带了大部分Nand Flash 驱动, 在
linux-2.6.32.2/drivers/mtd/nand/nand_ids.c 文件中,定义了所支持的各种Nand Flash 类型

2.修改Nand Flash分区表

系统默认的分区不能满足mini2440的系统,需要修改,Nand Flash的结构信息业需要增加修改,

以便满足系统的Nand Flash驱动接口。

可参考SMDK2440中Nand Flash设备注册的一些信息

vim /arch/arm/plat-s3c24xx/common-smdk.c

/* NAND分区表*/
static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name   = "Boot Agent",
                .size   = SZ_16K,
                .offset = 0,
        },
        [1] = {
                .name   = "S3C2410 flash partition 1",
                .offset = 0,
                .size   = SZ_2M,
        },
        [2] = {
                .name   = "S3C2410 flash partition 2",
                .offset = SZ_4M,
                .size   = SZ_4M,
        },
        [3] = {
                .name   = "S3C2410 flash partition 3",
                .offset = SZ_8M,
                .size   = SZ_2M,
        },
        [4] = {
                .name   = "S3C2410 flash partition 4",
                .offset = SZ_1M * 10,
                .size   = SZ_4M,
        },
        [5] = {
                .name   = "S3C2410 flash partition 5",
                .offset = SZ_1M * 14,
                .size   = SZ_1M * 10,
        },
[6] = {
                .name   = "S3C2410 flash partition 6",
                .offset = SZ_1M * 24,
                .size   = SZ_1M * 24,
        },
        [7] = {
                .name   = "S3C2410 flash partition 7",
                .offset = SZ_1M * 48,
                .size   = SZ_16M,
        }
};

Nand 在系统中是用平台设备的方式注册的

打开arch/arm/plat-s3c24xx/common-smdk.c

static struct s3c2410_nand_set smdk_nand_sets[] = {
        [0] = {
                .name           = "NAND",
                .nr_chips       = 1,
                .nr_partitions  = ARRAY_SIZE(smdk_default_nand_part),
                .partitions     = smdk_default_nand_part,
        },
};
/* choose a set of timings which should suit most 512Mbit
 * chips and beyond.
*/
static struct s3c2410_platform_nand smdk_nand_info = {
        .tacls          = 20,
        .twrph0         = 60,
        .twrph1         = 20,
        .nr_sets        = ARRAY_SIZE(smdk_nand_sets),
        .sets           = smdk_nand_sets,
};

· 参考以上SMDK中分区表的结构信息,我们可以在mach-mini2440.c中添加nand分区表等nand的相关信息

在mach-mini2440.c中添加以下代码(注意:1)和4)手册上并没有提到,没有这两项,不能编译通过)

1).添加NAND相关头文件

#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h>

2).添加Nand分区表

mini2440所有大小的NAND都可以使用下列的分区表

static struct mtd_partition mini2440_default_nand_part[] ={
        [0] = {
                .name = "supervivi",//bootloader所在分区,可以放置uboot,supervivi等,对应/dev/mtdblock0
                .size = 0x00040000,
                .offset = 0,
        },
        [1] = {
                .name = "param",//supervivi的参数区,设置启动参数,命令等,也属于bootloader一部分,如果uboot比较大,可以将此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
                .offset = 0x00040000,
                .size = 0x00020000,
        },
        [2] = {
                .name = "Kernel",//内核所在分区,5M,zImage一般都很小,完全能放下,对应于/dev/mtdblock2
                .offset = 0x00060000,
                .size = 0x00500000,
        },
        [3] = {
                .name = "root",//文件系统分区,mini2440用来存放yaffs2文件系统,对应于/dev/mtdblock3
                .offset = 0x00560000,
                .size = 1024*1024*1024,
        },
        [4] = {
                .name = "nand",//代表整片nand flash,主要是预留使用,eg:可通过应用程序访问读取/dev/mtdblock4来实现备份整个nand flash
                .offset = 0x00000000,
                .size = 1024*1024*1024,
        }
};
//nand flash设置表,板子上只有一片NAND,只有一个表
static struct s3c2410_nand_set mini2440_nand_sets[] = {
        [0] = {
                .name = "NAND",
                .nr_chips = 1,//一片NAND
                .nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
                .partitions = mini2440_default_nand_part,
        },
};
//nand flash本身的特性,需对照datasheet填写,大部分情况下按照以下参数填写即可
static struct s3c2410_platform_nand mini2440_nand_info = {
        .tacls =        20,
        .twrph0 =       60,
        .twrph1 =       20,
        .nr_sets =      ARRAY_SIZE(mini2440_nand_sets),
        .sets =         mini2440_nand_sets,
        .ignore_unset_ecc = 1,
};

3).添加nand设备到系统的设备列表结构

static struct platform_device *mini2440_devices[] __initdata = {
        &s3c_device_usb,
        &s3c_device_lcd,
        &s3c_device_wdt,
        &s3c_device_i2c0,
        &s3c_device_iis,
        &s3c_device_nand,//注册nand平台设备
};

4).添加文件

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));
        s3c_device_nand.dev.platform_data = &mini2440_nand_info;//添加的内容
}

3.从启动信息看分区表

make zImage,并下载到开发板运行


此时还没有加入yaffs2补丁,所以文件系统不能启动,到这里就不能进行下去了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值