Nand flash驱动移植及带硬件Ecc的Jffs2文件系统制作

时间:2021-01-14 09:02:35

cd /new_disk/weiyan/linux- 2.6.25

vi arch/arm/mach-s 3c 2440/mach-smdk2440.c

修改板级配置文件,为统一驱动的配置,设备的配置信息一般在此文件中添加。

1)    添加头文件

#include <linux/mtd/nand.h>

#include <linux/mtd/nand_ecc.h>

#include <linux/mtd/partitions.h>

#include <asm/plat-s 3c /nand.h>

#include <asm/plat-s 3c 24xx/pm.h>

2)    添加nand划分信息

static struct mtd_partition wy_nand_part[] = {

        [0] = {    //u-boot及内存存放的分区

                .name   = "BOOT",

                .size   = SZ_ 2M ,

                .offset = 0,

        },

        [1] = {    //文件系统存放的分区

                .name   = "ROOTFS",

                .offset = SZ_ 2M ,

                .size   = SZ_ 32M ,

        },

        [2] = {    //剩余空间

                .name   = "BACKUP",

                .offset = SZ_ 32M + SZ_ 2M ,

                .size   = SZ_ 32M - SZ_ 2M ,

        },

};

static struct s 3c 2410_nand_set wy_nand_sets[] = {

        [0] = {

                .name        = "NAND",

                .nr_chips     = 1,

                .nr_partitions  = ARRAY_SIZE(wy_nand_part),

                .partitions     = wy_nand_part,

        },

};

3)    添加nand flash的读写匹配时间,各时间定义如图

static struct s 3c 2410_platform_nand wy_nand_info = {

        .tacls          = 10,

        .twrph0         = 25,

        .twrph1         = 10,

        .nr_sets        = ARRAY_SIZE(wy_nand_sets),

        .sets           = wy_nand_sets,

};

4)    添加nand设备到初始化表

static struct platform_device *smdk2440_devices[] __initdata = {

              ……(此处省略其他设备,添加时请注意。)

        &s 3c _device_iis,

        &s 3c _device_nand,

};

5)    添加nand初始化信息与nand设备的关联

static void __init smdk2440_machine_init(void)

{    

       s 3c 24xx_fb_set_platdata(&smdk2440_fb_info);

       s 3c _device_nand.dev.platform_data = &wy_nand_info;

       //添加Nand初始化数据

       platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));

//     smdk_machine_init();

       s 3c 2410_pm_init();              //注释不需要的led初始化,增加电源管理初始化

}

6)    添加硬件校验

make menuconfig

Device Drivers  --->

<*> Memory Technology Device (MTD) support  --->

<*>   NAND Device Support  --->

[*]     S 3C 2410 NAND Hardware ECC

make uImage && cp arch/arm/boot/uImage /new_disk/tftp

7)    重新生成jffs2文件系统

./mkfs.jffs2 -d rootfs -p -s 0x200 -e 0x4000 -n -l -U -o rootfs.jffs2

-d指定目录rootfs,-s指定页大小为0x200字节,-e指定块大小为0x4000字节,-p指定用0xff填充最后块的空闲空间,-n指定不添加清空标志,-l指定小端格式,-U指定所有文件的属主为root,-o指定输出的镜像文件名。

cp rootfs.jffs2 /new_disk/tftp

 

8)    修改u-boot传给内核的参数

WEIYAN # set bootargs root=/dev/mtdblock1 rootfstype=jffs2 console=ttySAC0

指定分区1("ROOTFS")为存放根文件系统的分区,类型为jffs2。

9)    烧写jffs2文件系统及Linux内核

WEIYAN # nand erase 0x50000

//擦除从0x50000(320K)开始的全部空间,从0~320K为保留的U-boot空间。

WEIYAN # tftp 0x31000000 rootfs.jffs2

//将jffs2根文件系统下载到0x31000000的内存段

WEIYAN # nand write.jffs2 0x31000000 0x200000 $(filesize)

//将根文件系统写入到0x200000开始的空间,写入大小为下载的大小$(filesize)。

WEIYAN # tftp 0x31000000 uImage

WEIYAN # nand write.jffs2 0x31000000 0x50000 $(filesize)

//将内核写入到0x50000开始的Nand flash,写入大小为$(filesize)。

WEIYAN # set  bootread  nand  read.jffs2  0x31000000  0x50000  $(filesize)

WEIYAN # set  bootcmd  $(bootread)  \;bootm  0x31000000

//设置启动脚本为将Nand flash上的内核读到sdram里,并自动启动内核。

WEIYAN # save;reset                  //保存参数并重新启动

10)    系统正常启动显示如下

VFS: Mounted root (jffs2 filesystem).

Freeing init memory: 132K

init started: BusyBox v 1.10.1 (2008-03-02 02:33:43 CST)

starting pid 771, tty '': '/etc/init.d/rcS'

Please press Enter to activate this console.