nand flash 2410+linux2.6.13移植
时间:2009-04-08 来源:guliangzeng
|
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h>
#include <asm/arch/nand.h>
...
/* NAND Controller */
1.建立Nand Flash分区表
/* 一个Nand Flash总共64MB, 按如下大小进行分区 */
static struct mtd_partition partition_info[] ={
{ /* 1MB */
name: "bootloader",
size: 0x00030000,
offset: 0x0,
},{
name: "kernel",
size: 0x00200000,
offset: 0x00050000,
}, {
name: "root",
size: 0x03dac000,
offset: 0x00250000, }
};
name: 代表分区名字
size: 代表flash分区大小(单位:字节)
offset: 代表flash分区的起始地址(相对于0x0的偏移)
目标板计划分4个区,分别存放bootloader, kernel, rootfs以及以便以后扩展使用的用户文件系统空间。 2. 加入Nand Flash分区 struct s3c2410_nand_set nandset ={
nr_partitions: 4, /* the number of partitions */
partitions: partition_info, /* partition table */
}; nr_partitions: 指明partition_info中定义的分区数目
partitions: 分区信息表 3. 建立Nand Flash芯片支持
struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
}; tacls, twrph0, twrph1的意思见S3C2410手册的63,
这3个值最后会被设置到NFCONF中,见S3C2410手册66.
sets: 支持的分区集
nr_set:分区集的个数 4. 加入Nand Flash芯片支持到Nand Flash驱动 另外,还要修改此文件中的s3c_device_nand结构体变量,添加对dev成员的赋值
struct platform_device s3c_device_nand = {
.name = "s3c2410nand",
/* Device name */
.id = 1,
/* Device ID */
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource, /* Nand Flash Controller Registers */ /* Add the Nand Flash device */
.dev = {
.platform_data = &superlpplatform
}
};
name: 设备名称
id: 有效设备编号,如果只有唯一的一个设备为1,
有多个设备从0开始计数.
num_resource: 有几个寄存器区
resource: 寄存器区数组首地址
dev: 支持的Nand Flash设备 1.3.2 指定启动时初始化
kernel启动时依据我们对分区的设置进行初始配置
修改arch/arm/machs3c2410/mach-smdk2410.c文件
[arm@localhost linux2.6.14]$
vi arch/arm/machs3c2410/machsmdk2410.c
修改smdk2410_devices[].指明初始化时包括我们在前面所设置的flash分区信息
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis, /* 添加如下语句即可 */
&s3c_device_nand,
}; 保存,退出。
1.3.3 禁止Flash ECC校验
我们的内核都是通过UBOOT写到Nand Flash的, UBOOT通过的软件ECC算法产生ECC校验码, 这与内核
校验的ECC码不一样, 内核中的ECC码是由S3C2410中Nand Flash控制器产生的. 所以, 我们在这里选择禁止
内核ECC校验. 修改drivers/mtd/nand/s3c2410.c 文件: [arm@localhost linux2.6.14]$
vi drivers/mtd/nand/s3c2410.c
找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
chip>
eccmode = NAND_ECC_NONE;
保存,退出。 OK.我们的关于flash分区的设置全部完工.
相关阅读 更多 +