您的位置:首页 > 其它

S3C2410上Jffs2的移植

2006-04-22 15:33 176 查看

S3C2410上Jffs2的移植

作者:llg 2004-4-30

为了“还愿”吧,因为我答应过hn,有时间写一些2410 jffs2的移植过程,前一段时间实在是太忙了,现在也不是很清闲啊,不过明天就是五一了吗,所以今天偷一会儿懒,还了这个愿。

1.移植环境:

CPU:S3C2410
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下添加自己mcu的map,我把握的文件内容贴上,仅供参考:
S3c2410_llg.c
/*
* Normal mappings of chips on Samsung s3c2410 in physical memory
*/

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <asm/io.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <linux/config.h>

#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
#llg add S3C2410 的CFI配置
dep_tristate ' CFI Flash device mapped on S3C2410' CONFIG_MTD_S3C2410 $CONFIG_MTD_CFI
fi

5. 编译内核、下载

1)make menuconfig将4加入的内容选中
2)在make menuconfig下配置选项。(抄的。可能不太一样,只要你配置对了就可以了)
在linux Kernel v2.4.20-uc0 Configuration下
Memory Technology Devices(MTD)下
CONFIG_MTD=Y
CONFIG_MTD_DEBUG=Y
CONFIG_MTD_DEBUG_VERBOSE=3
CONFIG_MTD_PARTITIONS=Y
CONFIG_MTD_CHAR=Y
CONFIG_MTD_BLOCK=Y
RAM/ROM/Flash chip drivers下
CONFIG_MTD_CFI=Y
CONFIG_MTD_JEDECPROBE=Y
CONFIG_MTD_CFI_AMDSTD=Y
Mapping drivers for chip access下
CONFIG_S3C2410=Y
File systems下
CONFIG_JFFS2_FS=Y
CONFIG_JFFS2_FS_DEBUG=2
在uClinux v1.3.4 Configuration下
Flash Tools下
CONFIG_USER_MTDUTILS=Y
CONFIG_USER_MTDUTILS_ERASE=Y
CONFIG_USER_MTDUTILS_ERASEALL=Y
CONFIG_USER_MTDUTILS_MKFSJFFS2=Y
3)make zImage 重新编译内核
4)下载到内存或flash

6.检查jffs2是否配置成功

根据上述的修改,启动armlinux,看一下/proc/mtd的文件内容(当然你的系统要支持proc文件系统)
# cat /proc/mtd
dev: size erasesize name
mtd0: 01000000 00020000 "Physically mapped flash"
mtd1: 00040000 00020000 "reserved for bootloader"
mtd2: 00100000 00020000 "reserved for kernel"
mtd3: 00400000 00020000 "reserved for ramdisk"
mtd4: 00800000 00020000 "jffs2"
如果出现上述内容,则说明你的jffs2系统已经配置成功了

7.使用Jffs2文件系统

1)# /erase /dev/mtd/4
MTD_open
MTD_ioctl
Erasing 128 KibMte @ 0 -- 0 % complete.TD_ioctl
Erasing 128 KibMte @ 20000 -- 1 % complete.TD_ioctl
Erasing 128 KibMte @ 40000 -- 3 % complete.TD_ioctl
……
Erasing 128 KibMte @ 7e0000 -- 98 % complete.TD_ioctl
Erased 8192 Kibyte @ 0 -- 100% Complete.
MTD_close
这一步应该可以用直接烧些flash的方法代替:
[root@llg]#mkfs.jffs2 -d /bin -o jffs2.img (/bin随便的目录)
然后将jffs2.img烧入1800000(根据自己的情况确定地址)

至于上面的删除操作,我也没搞太明白,因为我第一次做的时候直接烧写flash就成功了,但刚刚执行却执行了erase之后才成功了
2#mkfs.jffs2 -d /bin -o jffs2.img
mkfs.jffs2 网上应该可以找到
3#cp jffs2.img /dev/mtd1
4#mount -t jffs2 /dev/mtdblock1 /mnt
mtdblock_open
ok
5#cd /mnt
6#ls(如果正确就说明你成功了)

好了,粗粗的写了这些,应该是可以使的,因为所附上的所有代码都是我现在使的,没有任何保留啊!!!我希望大家也经常写些东东,让别人与你一起分享成功的喜悦!(当然是可以共享的东东了!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: