Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1395332
  • 博文数量: 343
  • 博客积分: 13098
  • 博客等级: 上将
  • 技术积分: 2862
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-06 00:35
文章存档

2012年(131)

2011年(31)

2010年(53)

2009年(23)

2008年(62)

2007年(2)

2006年(36)

2005年(5)

分类: LINUX

2006-09-11 23:46:30

S3C2410Jffs2的移植

 

作者:wpq  2004-7-06

 

参照llg写的关于hharme28f128flash)上的jffs2的移植

 

具体如下:

1.移植环境:

CPUARMS3C2410

Linux version:2.4.18

FlashIntel 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是我新建的一个目录

8Jffs2的应用

对于ppcbootzImageramdisk.image.gzromfs一样正常烧写;

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

tftp 30800000 jffs2.img

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

 

 

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

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

 

 

 

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

阅读(2519) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~