现在的位置: 首页 > 综合 > 正文

Linux-2.6.32.2内核在mini2440上的移植—-移植Nand驱动并更改分区信息

2013年04月06日 ⁄ 综合 ⁄ 共 4012字 ⁄ 字号 评论关闭

1、修改Nand Flash 分区表

系统默认的分区不一定是我们所需的,所以要自已修改,除此之外,还有 NandFlash的结构信息需要增加填写,以便能够适合系统自带的Nand Flash 驱动接口,这可以参考SMDK2440 中关于Nand Flash 设备注册的一些信息。

打开arch/arm/plat-s3c24xx/common-smdk.c,定位到108行,可以看到这样一个结构体:

/* NAND parititon from 2.4.18-swl5 */

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 Flash 的分区表,在Linux-2.6.32.2中,nand 驱动是被注册为平台设备的,这同样可在这个文件的153行看到如下信息:

/* 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,
};

/* devices we initialise */

static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
};

参考以上结构信息,我们也在自己的mach-mini2440.c 中照此添加实现,同时需要参考友善之臂原厂内核中的Nand 分区表,操作如:

打开arch/arm/mach-s3c2440/mach-mini2440.c,定位到151行处,将下面更改后的分区表定义结构加入其中:

 .lpcsel  = ((0xCE6) & ~7) | 1<<4,
};

/*NAND parititon from 2.4.18-swl5 */

static structmtd_partition mini2440_default_nand_part[] = {
 [0] = {

  .name ="boot", //;这里是bootloader所在的分区,可以放置u-boot, supervivi 等内容,对应/dev/mtdblock0
  .offset = 0,
  .size = 0x00040000, //256K

 },
 [1] = {
  .name ="param", //;这里是supervivi的参数区,其实也属于bootloader 的一部分,如果u-boot比较大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
  .offset = 0x00040000,
  .size = 0x00020000,

 },
 [2] = {
  .name ="kernel", //;内核所在的分区,大小为5M,足够放下大部分自己定制的巨型内核了,比如内核使用了更大的Linux Logo 图片等,对应/dev/mtdblock2
  .offset = 0x00060000,
  .size = 0x00500000,

 },
 [3] = {
  .name ="rootfs", //;文件系统分区,友善之臂主要用来存放yaffs2
文件系统内容,对应/dev/mtdblock3
  .offset =0x00560000,
  .size = 1024 * 1024 * 1024,

 },
 [4] = {
  .name ="nand", //;此区域代表了整片的nand flash,主要是预留使用,比如以后可以通过应用程序访问读取/dev/mtdblock4
就能实现备份整片nand flash 了。

  .offset = 0x00000000,

  .size = 1024 * 1024 * 1024,
 } 
};

//;这里是开发板的nand flash
设置表,因为板子上只有一片,因此也就只有一个表
static struct s3c2410_nand_set mini2440_nand_sets[] = {
 [0] = {

  .name  ="NAND",
  .nr_chips = 1,
  .nr_partitions =ARRAY_SIZE(mini2440_default_nand_part),
  .partitions =mini2440_default_nand_part,
 },
};

/*choose a set of timings which should suit most 512Mbit
 * chips and beyond.
*/
//;
这里是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,
};
除此之外,还需要把nand flash 设备注册到系统中

staticstruct platform_device *mini2440_devices[] __initdata = {
 &s3c_device_usb,
 &s3c_device_lcd,
 &s3c_device_wdt,
 &s3c_device_i2c0,
 &s3c_device_iis,
 &s3c_device_nand, //;把nand flash
设备添加到开发板的设备列表结构
};
2、加入编译头文件

在上面的文件中定位到50行附近,加入一下头文件:

#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>

3、传入mini2440_nand_info结构体初始化参数

定位到228行附近,修改如下:

static void__init mini2440_machine_init(void)
{
  s3c_i2c0_set_platdata(NULL);
 s3c_device_nand.dev.platform_data =&mini2440_nand_info; 
 platform_add_devices(mini2440_devices,ARRAY_SIZE(mini2440_devices));
 //smdk_machine_init();
}

然后保存。

4、编译测试

在linux-2.6.32.2目录下执行

clx@think:/work/armlinux/linux-2.6.32.2$ make clean

clx@think:/work/armlinux/linux-2.6.32.2$ make zImage

下载到开发板启动内核我们能看到如下信息:

Creating 5 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "boot"
uncorrectable error : 
0x000000040000-0x000000060000 : "param"
uncorrectable error : 
0x000000060000-0x000000560000 : "kernel"
0x000000560000-0x000040560000 : "rootfs"
mtd: partition "rootfs" extends beyond the end of device "NAND 256MiB 3,3V 8-bit" -- size truncated to 0xfaa0000
ftl_cs: FTL header not found.
0x000000000000-0x000040000000 : "nand"
mtd: partition "nand" extends beyond the end of device "NAND 256MiB 3,3V 8-bit" -- size truncated to 0x10000000

至此,就完成了nandflash 驱动的移植。

抱歉!评论已关闭.