开发板上只有Nor Flash,所以为了实现层次文件系统,需要为Linux2.6.20增加Nor Flash MTD驱动支持。其实工作量并不大,因为已经有现成的程序可供参考。
MTD的驱动程序都集中在drivers/mtd里面。我们需要做的,仅仅是在drivers/mtd/maps下增加自己的分区表。因为有参考的代码,所以比较容易。
(1)构建配置选项
首先,根据edb7312.c构建自己的mtd分区表驱动。
$cd drivers/mtd/maps/ |
然后,修改Kconfig,增加自己的配置选项。
//拷贝过EDB7312稍作修改即可 |
最后,修改Makefile,增加编译项目。
这样,自己建立的MTD分区表驱动就可以编译进内核了。
(2)修改分区表信息
因为第一步的工作中,at91rm9200.c实际上还是edb7312.c的内容,所以需要根据自己的开发板nor flash的配置做一下修改。
obj-$(CONFIG_MTD_EDB7312) += edb7312.o |
#include <linux/module.h> #ifdef CONFIG_MTD_PARTITIONS #define WINDOW_ADDR 0x10000000 /* physical properties of flash */ #define MSG_PREFIX "AT91RM9200-NOR:" /* prefix for our printk()'s */ static struct mtd_info *mymtd; struct map_info at91rm9200nor_map = { #ifdef CONFIG_MTD_PARTITIONS /* static const char *probes[] = { NULL }; #endif static int mtd_parts_nb = 0; int __init init_at91rm9200nor(void) printk(KERN_NOTICE MSG_PREFIX "0x%08x at 0x%08x\n", if (!at91rm9200nor_map.virt) { simple_map_init(&at91rm9200nor_map); mymtd = 0; #ifdef CONFIG_MTD_PARTITIONS if (mtd_parts_nb == 0) //mymtd为master mtd_info它不被添加到数组mtd_table[]中,它只用于初始化 //每一个分区的mtd_info。而后将每一个分区对应的mtd_info添加到数组mtd_table[]
//供上层调用。MTD原始设备驱动层的主要工作就是向 mtd_table[]中添加mtd_info。 iounmap((void *)at91rm9200nor_map.virt); static void __exit cleanup_at91rm9200nor(void) module_init(init_at91rm9200nor); MODULE_LICENSE("GPL"); |
(3)配置内核
增加MTD,和相应的文件系统的支持。
Devices Drivers --->
Memory Technology Devices (MTD) --->
<*> Memory Technology Device(MTD) support
<*> MTD partitioning support
<*> Direct char device access to MTD devices
<*> Caching block device access to MTD devices
RAM/ROM/Flash chip drivers --->
<*> Detect flash chips by Common Flash Interface(CFI) probe
<*> Support for Intel/Sharp flash chips
Mapping drivers for chip access --->
<*> CFI Flash device mapped on AT91RM9200
File Systems --->
Miscellaneous filesystems --->
这里选择cramfs或者Jffs2的支持。
(4)编译,然后加载
make Image编译,然后制作成uImage。
这是JFFS2作为根文件系统的信息:
TOPDIR=$($(which pwd)) arm-linux-objcopy -O binary -S vmlinux $TMP && gzip -v9 $TMP && \ |
可以看到MTD分区信息。进入shell界面,然后查看/proc/mtd,如下:
AT91RM9200-NOR:0x00800000 at 0x10000000 |