S3C2410上Jffs2的移植

S 3C 2410Jffs2的移植

作者:llg  2004-4-30

 

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

1.移植环境:

CPUS 3C 2410

FlashIntel E 28F 128

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下添加自己mcumap,我把握的文件内容贴上,仅供参考:

S 3c 2410_llg.c

/*

 * Normal mappings of chips on Samsung s 3c 2410 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 s 3c 2410_read8(struct map_info *map, unsigned long ofs)

{

         return readb(map->map_priv_1 + ofs);

}

 

__u16 s 3c 2410_read16(struct map_info *map, unsigned long ofs)

{

         return readw(map->map_priv_1 + ofs);

}

 

__u32 s 3c 2410_read32(struct map_info *map, unsigned long ofs)

{

         return readl(map->map_priv_1 + ofs);

}

 

void s 3c 2410_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)

{

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

}

 

void s 3c 2410_write8(struct map_info *map, __u8 d, unsigned long adr)

{

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

}

 

void s 3c 2410_write16(struct map_info *map, __u16 d, unsigned long adr)

{

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

}

 

void s 3c 2410_write32(struct map_info *map, __u32 d, unsigned long adr)

{

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

}

 

void s 3c 2410_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 s 3c 2410_map = {

         name: "s 3c 2410 flash device",

         size: WINDOW_SIZE,

         buswidth: BUSWIDTH,

         read8: s 3c 2410_read8,

         read16: s 3c 2410_read16,

         read32: s 3c 2410_read32,

         copy_from: s 3c 2410_copy_from,

         write8: s 3c 2410_write8,

         write16: s 3c 2410_write16,

         write32: s 3c 2410_write32,

         copy_to: s 3c 2410_copy_to,

        

         map_priv_1:     WINDOW_ADDR,

         map_priv_2:     -1,       

};

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

static struct mtd_partition s 3c 2410_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_s 3c 2410(void)

{

    printk(KERN_NOTICE "s 3c 2410 flash device: %x at %x/n", WINDOW_SIZE, WINDOW_ADDR);

         s 3c 2410_map.map_priv_1 = (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE);

         //printk("0/n");

         if (!s 3c 2410_map.map_priv_1) {

                     printk("Failed to ioremap/n");

                     return -EIO;

         }

         //printk("1/n");

         mymtd = do_map_probe("jedec_probe", &s 3c 2410_map);

         if (!mymtd)

         mymtd = do_map_probe("cfi_probe", &s 3c 2410_map);

         //printk("2/n");

         if (mymtd) {

                     mymtd->module = THIS_MODULE;

                     mymtd->erasesize = 0x20000; //擦除的大小 INTEL E 28F 128J 3A -150 128kb

                     return add_mtd_partitions(mymtd, s 3c 2410_partitions, sizeof(s 3c 2410_partitions) / sizeof(struct mtd_partition));

         }

         //printk("3/n");

         iounmap((void *)s 3c 2410_map.map_priv_1);

         return -ENXIO;

}

 

static void __exit cleanup_s 3c 2410(void)

{

         if (mymtd) {

                     del_mtd_partitions(mymtd);

                     map_destroy(mymtd);

         }

         if (s 3c 2410_map.map_priv_1) {

                     iounmap((void *)s 3c 2410_map.map_priv_1);

                     s 3c 2410_map.map_priv_1 = 0;

         }

}

 

module_init(init_s 3c 2410);

module_exit(cleanup_s 3c 2410);

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

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 S 3C 2410 CFI配置  

   dep_tristate '  CFI Flash device mapped on S 3C 2410' CONFIG_MTD_S 3C 2410 $CONFIG_MTD_CFI

fi

5. 编译内核、下载

1make menuconfig4加入的内容选中

2)在make menuconfig下配置选项。(抄的。可能不太一样,只要你配置对了就可以了)

linux Kernel v 2.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_S 3C 2410=Y

 File systems

  CONFIG_JFFS2_FS=Y

    CONFIG_JFFS2_FS_DEBUG=2

uClinux v 1.3.4 Configuration

 Flash Tools

  CONFIG_USER_MTDUTILS=Y

    CONFIG_USER_MTDUTILS_ERASE=Y

    CONFIG_USER_MTDUTILS_ERASEALL=Y

    CONFIG_USER_MTDUTILS_MKFSJFFS2=Y

3make 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(如果正确就说明你成功了)

 

 

好了,粗粗的写了这些,应该是可以使的,因为所附上的所有代码都是我现在使的,没有任何保留啊!!!我希望大家也经常写些东东,让别人与你一起分享成功的喜悦!(当然是可以共享的东东了!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值