S3C2410上Jffs2的移植
2012-06-02
赵印伟
标签: Jffs2 S3C2410

参照llg写的关于hharm(e28f128flash)上的jffs2的移植

具体如下:

1.移植环境:

CPU:ARMS3C2410

Linux version:2.4.18

Flash:Intel E28F128

2.修改设备号

由于ROM设备和MTDBlock设备的主设备号(major)都是31,所以如果你不想把JFFS2作为根文件系统的话,必须修改他们之一的major。如果你要修改JFFS2的设备major,在uClinux-dist/linux-2.4.x/include/linux/mtd/mtd.h中把

#define MTD_BLOCK_MAJOR 31

改成

#define MTD_BLOCK_MAJOR 30

3.编写Maps文件

添加在flash上的map文件。在HHARM2410-R3/kernel/drivers/mtd/maps下添加flash(e28f128j3a-150)的map,我把握的文件内容贴上,仅供参考:

S3c2410_wpq.c

/*

* Normal mappings of chips on Samsung s3c2410 in physical memory

*/

#include

#include

#include

#include

#include

#include

#include

#include

#define WINDOW_ADDR 0x01000000 //基地址

#define WINDOW_SIZE 0x01600000 //flash大小 16M

#define BUSWIDTH 2

static struct mtd_info *mymtd;

__u8 s3c2410_read8(struct map_info *map, unsigned long ofs)

{

return readb(map->map_priv_1 + ofs);

}

__u16 s3c2410_read16(struct map_info *map, unsigned long ofs)

{

return readw(map->map_priv_1 + ofs);

}

__u32 s3c2410_read32(struct map_info *map, unsigned long ofs)

{

return readl(map->map_priv_1 + ofs);

}

void s3c2410_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)

{

memcpy(to, (void *)(map->map_priv_1 + from), len);

}

void s3c2410_write8(struct map_info *map, __u8 d, unsigned long adr)

{

writeb(d, map->map_priv_1 + adr);

}

void s3c2410_write16(struct map_info *map, __u16 d, unsigned long adr)

{

writew(d, map->map_priv_1 + adr);

}

void s3c2410_write32(struct map_info *map, __u32 d, unsigned long adr)

{

writel(d, map->map_priv_1 + adr);

}

void s3c2410_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)

{

memcpy((void *)(map->map_priv_1 + to), from, len);

}

struct map_info s3c2410_map = {

name: "s3c2410 flash device",

size: WINDOW_SIZE,

buswidth: BUSWIDTH,

read8: s3c2410_read8,

read16: s3c2410_read16,

read32: s3c2410_read32,

copy_from: s3c2410_copy_from,

write8: s3c2410_write8,

write16: s3c2410_write16,

write32: s3c2410_write32,

copy_to: s3c2410_copy_to,

map_priv_1: WINDOW_ADDR,

map_priv_2: -1,

};

//以下是分区的内容,当然要根据你自己的需要确定了

static struct mtd_partition s3c2410_partitions[] = {

{

name: "reserved for bootloader",

size: 0x040000,

offset: 0x0,

mask_flags: MTD_WRITEABLE,

},

{

name: "reserved for kernel",

size: 0x0100000,

offset: 0x040000,

mask_flags: MTD_WRITEABLE,

},

{

name: "reserved for ramdisk",

size: 0x400000,

offset: 0x140000,

mask_flags: MTD_WRITEABLE,

},

{

name: "jffs2(8M)",

size: 0x800000,

offset: 0x800000,

}

};

int __init init_s3c2410(void)

{

printk(KERN_NOTICE "s3c2410 flash device: %x at %x\n", WINDOW_SIZE, WINDOW_ADDR);

s3c2410_map.map_priv_1 = (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE);

//printk("0\n");

if (!s3c2410_map.map_priv_1) {

printk("Failed to ioremap/n");

return -EIO;

}

//printk("1\n");

mymtd = do_map_probe("jedec_probe", &s3c2410_map);

if (!mymtd)

mymtd = do_map_probe("cfi_probe", &s3c2410_map);

//printk("2\n");

if (mymtd) {

mymtd->module = THIS_MODULE;

mymtd->erasesize = 0x20000; //擦除的大小 INTEL E28F128J3A-150 是128kb

return add_mtd_partitions(mymtd, s3c2410_partitions, sizeof(s3c2410_partitions) / sizeof(struct mtd_partition));

}

//printk("3\n");

iounmap((void *)s3c2410_map.map_priv_1);

return -ENXIO;

}

static void __exit cleanup_s3c2410(void)

{

if (mymtd) {

del_mtd_partitions(mymtd);

map_destroy(mymtd);

}

if (s3c2410_map.map_priv_1) {

iounmap((void *)s3c2410_map.map_priv_1);

s3c2410_map.map_priv_1 = 0;

}

}

module_init(init_s3c2410);

module_exit(cleanup_s3c2410);

至于其文件内容及语句的含义网上相关的文章也有不少,参考一下吧。

4.将配置加入HHARM2410-R3/kernel/drivers/mtd/maps/Config.in

if [ "$CONFIG_ARM" = "y" ]; then

dep_tristate ' CFI Flash device mapped on ARM Integrator/P720T' CONFIG_MTD_ARM_INTEGRATOR $CONFIG_MTD_CFI $CONFIG_ARCH_INTEGRATOR

dep_tristate ' Cirrus CDB89712 evaluation board mappings' CONFIG_MTD_CDB89712 $CONFIG_MTD_CFI $CONFIG_ARCH_CDB89712

dep_tristate ' CFI Flash device mapped on StrongARM SA11x0' CONFIG_MTD_SA1100 $CONFIG_MTD_CFI $CONFIG_ARCH_SA1100 $CONFIG_MTD_PARTITIONS

dep_tristate ' CFI Flash device mapped on DC21285 Footbridge' CONFIG_MTD_DC21285 $CONFIG_MTD_CFI $CONFIG_ARCH_FOOTBRIDGE $CONFIG_MTD_PARTITIONS

dep_tristate ' CFI Flash device mapped on Lubbock board' CONFIG_MTD_LUBBOCK $CONFIG_MTD_CFI $CONFIG_ARCH_LUBBOCK $CONFIG_MTD_PARTITIONS

dep_tristate ' CFI Flash device mapped on the FortuNet board' CONFIG_MTD_FORTUNET $CONFIG_MTD_CFI $CONFIG_ARCH_FORTUNET $CONFIG_MTD_PARTITIONS

dep_tristate ' CFI Flash device mapped on Epxa10db' CONFIG_MTD_EPXA10DB $CONFIG_MTD_CFI $CONFIG_MTD_PARTITIONS $CONFIG_ARCH_CAMELOT

dep_tristate ' CFI Flash device mapped on PXA CerfBoard' CONFIG_MTD_PXA_CERF $CONFIG_MTD_CFI $CONFIG_ARCH_PXA_CERF $CONFIG_MTD_PARTITIONS

dep_tristate ' NV-RAM mapping AUTCPU12 board' CONFIG_MTD_AUTCPU12 $CONFIG_ARCH_AUTCPU12

#wpq add S3C2410 的CFI配置

dep_tristate ' CFI Flash device mapped on S3C2410' CONFIG_MTD_S3C2410 $CONFIG_MTD_CFI

fi

5. 修改Makefile文件

在HHARM2410-R3/kernel/drivers/mtd/maps/ Makefile文件中加入如下语句(当然要根据你的实际情况写啊?!):

#wpq add

obj-$(CONFIG_MTD_S3C2410) += s3c2410_wpq.o

6.配置内核使其支持jffs2

说明:

这里要特别注意Memory Technology Devices (MTD)的选项支持及其子项

RAM/ROM/Flash chip drivers --->

Mapping drivers for chip access --->

的选项支持;

还有File systems下选项支持。

##################################

***********************

#############################################

Linux Kernel v2.4.18-rmk7-pxa1 Configuration

Linux Kernel v2.4.18-rmk7-pxa1 Configuration

------------------------------------------------------------------------------

+-------------------- Memory Technology Devices (MTD) --------------------+

| Arrow keys navigate the menu. selects submenus --->.|

| Highlighted letters are hotkeys. Pressing includes, excludes, |

| modularizes features. Press to exit, for Help.|

| Legend: [*] built-in [ ] excluded module < > module capable|

| +---------------------------------------------------------------------+|

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

| | [*] Debugging||

| | (3) Debugging verbosity (0 = quiet, 3 = noisy)||

| | <*> MTD partitioning support||

| | <*> MTD concatenating support||

| | < > RedBoot partition table parsing||

| | < > Command line partition table parsing||

| | < > ARM Firmware Suite partition parsing||

| | --- User Modules And Translation Layers||

| | <*> Direct char device access to MTD devices||

| | <*> Caching block device access to MTD devices||

| < > FTL (Flash Translation Layer) support||

| | < > NFTL (NAND Flash Translation Layer) support||

| | RAM/ROM/Flash chip drivers --->||

| | Mapping drivers for chip access --->||

| | Self-contained MTD device drivers --->||

| | NAND Flash Device Drivers --->||

| +---------------------------------------------------------------------+ |

+------------------------

| +---------v(+)--------------------------------------------------------+|

+-------------------------------------------------------------------------+

| < Exit > < Help > |

+-------------------------------------------------------------------------+

Linux Kernel v2.4.18-rmk7-pxa1 Configuration

------------------------------------------------------------------------------

+-------------------- Mapping drivers for chip access --------------------+

| Arrow keys navigate the menu. selects submenus --->. |

| Highlighted letters are hotkeys. Pressing includes, excludes, |

| modularizes features. Press to exit, for Help. |

| Legend: [*] built-in [ ] excluded module < > module capable |

| +---------------------------------------------------------------------+ |

| | <*> CFI Flash device in physical memory map | |

| | (800000) Physical start address of flash mapping | |

| | (800000) Physical length of flash mapping | |

| | (2) Bus width in octets | |

| | <*> CFI Flash device mapped on S3C2410 | |

| | | |

| | | |

| | | |

| | | |

| | | |

| | | |

| +---------------------------------------------------------------------+ |

+-------------------------------------------------------------------------+

| < Exit > < Help > |

+-------------------------------------------------------------------------+

7.制作jffs2映象

首先取得jffs2的制作工具:mkfs.jffs2(可从网上取得)

执行如下命令即可生成所要的映象:

chmod 777 mkfs.jffs2 //取得mkfs.jffs2的执行权限,即mkfs.jffs2成为可执行文件

./mkfs.jffs2 -d jffs2/ -o jffs2.img //生成jffs2文件映象,其中目录jffs2可以是任意的目录,这里的jffs2是我新建的一个目录

8.Jffs2的应用

对于ppcboot、zImage、ramdisk.image.gz向romfs一样正常烧写;

以上三项烧写完之后,接着烧写jffs2.img,具体烧写如下:

tftp 30800000 jffs2.img

fl 1800000 30800000 20000 (其中20000可根据jffs2的大小适当调整,理论上只要比jffs2.img略大即可,但要为20000的整数倍)

特别注意:要想使我们做的jffs2文件系统更加的人性化,我们还可以在ramdisk.image.gz的mnt/etc/init.d/rc$文件中加入如下指令以便启动时自动挂载jffs2文件系统。

Mount -t jffs2 /dev/mtdblock/4 /mnt //其中的/dev/mtdblock/4是flash上的jffs2分区。

9.以上配置烧写完成之后就可启动我们的系统,对jffs2分区尽情的添加和删除了,添加的东东再不会因断电而丢失了,呵呵就到这了。

可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号