清爽的NOR Flash MTD和JFFS2

最近被其他事情耽搁了一下,已经好久没有玩EVB板了,这两天想起来,EVB上还有好多外设还没有玩过呢,正好有点时间玩一下。先还是玩玩NOR FLASH的MTD吧,这个东西相对写的代码比较少,而且系统一下有了可以读写而且掉电不丢失的文件系统也是蛮让人欣喜的。EVB最大的好处就是任何驱动都没有现成的,都要自己写,这样比较有成就感,而且容易搞清楚驱动的所以然。

废话少说,开始干吧,首先当然是要修改Kconfig,由于增加的MAP Driver,所以要在drivers/mtd/maps下面改了:

config MTD_CBP_NOR_FLASH
 tristate "CFI Flash device mapped on VTC CBP"
 depends on  ARCH_CBP&& MTD_CFI
 help
   The CBP board has a 16bit Nor FLash
以及Makefile了:

obj-$(CONFIG_MTD_CBP_NOR_FLASH)   += cbp-norflash.o
然后就是make menuconfig把这个东东选上(在Mapping Driver里面),当然还有其它的,比如

1)MTD Partitions,用于支持分区

2)Direct Char MTD Device,支持通过char接口访问,而不仅仅是block,这样就可以小规模修改kernel或者boot的数据了

3)Command Line Partition Table Parsing, 从命令行输入MTD分区参数

4)Caching block device access to MTD,这个增加性能的,先选上

然后在RAM/ROM/FLASH chip drivers里面把Intel, AMD,ST都选上,其实我是不太肯定我的到底是用的那个CFI Probe模式,因为用的是Samsung的K5L2866芯片,那个选项里面没有Samsung选项。

有了MTD和Flash,一般都要玩JFFS2的,因此要在File System下面的miscellaneous把JFFS2选上,至于下面的其它选项,丰俭由人了。

然后就进入正题了, Linux程序现在越来越复杂,一层套一层的,就像奥迪的四个圈或者奥运的五环,俺就采用个比较简单的玩法,也就少写几句,大概如下:

#define CBP_FLASH_BASE 0x00000000
#define CBP_FLASH_SIZE 0x01000000
static struct mtd_partition static_partitions[] =
{
   {
      .name = "BootLoader",
      .size = 0x040000,
      .offset = 0x0
   },
   {
      .name = "Kernel",
      .size = 0x0380000,
      .offset = 0x40000
   },

   。。。。。。。。。。。此处省略两个分区
}

 

static   struct map_info map_info;

static   struct mtd_info * pmtd_info;

void __init cbp_nor_flash_init(void)
{
   map_info.name=cbp_nor_name;
   map_info.virt=ioremap_nocache(CBP_FLASH_BASE,CBP_FLASH_SIZE);
   map_info.phys=CBP_FLASH_BASE;
   map_info.size=CBP_FLASH_SIZE;
   map_info.bankwidth=2;
   map_info.set_vpp=cbp_nor_flash_set_vpp;

   simple_map_init(&map_info);
   pmtd_info=do_map_probe("cfi_probe", &map_info);
   add_mtd_partitions(pmtd_info, static_partitions, NUM_OF_PARTITIONS);
   printk("pmtd_info-master:%x priv:%x/n",pmtd_info,pmtd_info->priv);

}
module_init(cbp_nor_flash_init);

此外还修改了一点CBP的映射,CBP的Nucleus的Boot上来是把前面的一部分空间映射成了RAM,还得把它恢复成Flash,不然找不着Flash,当然修改起始地址也是可以的,但是后面的Offset还要重新算,太麻烦了,还是映射成Flash看起来简单点。

 

        ldr     r0, =0x0bc0000c
        ldr     r8, =0x03 

        str     r8,[r0]


其实这样一个有四个分区的MTD设备就搞定,看起来还是蛮清爽的,当然远没达到完美,首先没有采用现在标准的platform,bus,driver模式注册驱动结构,其次对一些返回的指针是否正确也没有检查,不过这个驱动的确是可以用的,CFI Nor FLash MTD基本原理其实就是这样。

不过samsung的Flash在CFI Probe的时候会有一点问题,跟AMD不是完全兼容的,主要是ID不对,需要修改一下下,修改的Patch文件在以下地址,其中也包括了mkfs.jffs2的PC版本:

http://cid-a0a942ebd8c6c3b5.office.live.com/self.aspx/.Documents/jffs.rar

这样基本上就有戏了,我的第三个分区时原来的RamDisk,直接将原来的启动命令改成:

root=/dev/mtdblock2 initrd=0x10700000,1000k keepinitrd init=/sbin/init mem=8M console=ttyS0,115200n8";

这样启动的时候就从mtdblock2拷贝文件系统到RamDisk里面运行了

然后在pc上制作一个JFFS2的root文件系统,

 mkfs.jffs2 -r mmufs -o mmufs.jffs -e 0x10000 -s 0x10000

其中的-e -s是表示Page和Erase Block都是64KiB的。

放在第四个分区上,修改启动命令如下:

"root=/dev/mtdblock3 rootfstype=jffs2 rw init=/sbin/init mem=8M console=ttyS0,115200n8";

恭喜一下我自己,启动以后的root fs已经是JFFS2的了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章