[Author: Bo Shen <[email protected]>]
当我们需要让u-boot从JFFS2文件系统中读取Linux内核image来启动系统,我们应该如做呢?答案其实很简单:让u-boot支持JFFS2文件系统,并且添加能访问JFFS2文件系统的命令。如下即按此步骤来实现。
u-boot版本:commit id: c2e5e802ecb7ab668ce9911b210ed68c804b349f
1. 添加JFFS2文件系统的支持。
查看<fs/Makefie>发现:obj-$(CONFIG_CMD_JFFS2) += jffs2/ 所以要支持JFFS2文件系统,需要在board相关文件里面定义:CONFIG_CMD_JFFS2
既然文件系统支持了,那么这个文件系统的载体是什么呢?它可以是NAND FLASH, NOR FLASH, ONENAND。
2. 定义文件系统的载体以及分区大小。
我们这里使用NAND FLASH做为JFFS2文件系统的载体。所以需要定义:CONFIG_JFFS2_DEV和CONFIG_JFFS2_NAND
----------------------
#define COFIG_JFFS2_DEV "nand0"
#define CONFIG_JFFS2_NAND
----------------------
既然载体有了,那么JFFS2文件系统放在NAND FLASH的什么位置呢?所以需要定义:CONFIG_JFFS2_PART_SIZE和CONFIG_JFFS2_PART_OFFSET。
举例如下:从8MiB位置开始后的所有空间用作JFFS2文件系统。
----------------------
#define CONFIG_JFFS2_PART_OFFSET 0x800000
#define CONFIG_JFFS2_PART_SIZE 0xf800000
----------------------
注:如果不定义这两个变量。那么u-boot会把整个NAND FLASH作为JFFS2文件系统。如果定义了CONFIG_JFFS2_PART_OFFSET,则是从offset开始剩余的所以空间作为JFFS2文件系统。如果定义了CONFIG_JFFS2_PART_SIZE,则从0开始,到size-1的空间用为JFFS2文件系统。
既然一切准备就绪。那么接下来就是使能JFFS2文件系统相关的命令。
3. 使用JFFS2文件系统命令
查看<common/Makefile>发现:obj-$(CONFIG_CMD_JFFS2) += cmd_jffs2.o 所以要支持JFFS2文件系统,需要定义:CONFIG_CMD_JFFS2。此定义已经在第一步完成了。查看cmd_jffs2.c文件,其提供三个命令:
ls:如果不加参数,则列出JFFS2根文件夹下面的内容。如果参数为某一路径名(ls /boot),列出此路径下面的内容。
flinfo:显示JFFS2文件系统的信息。
fsload:从JFFS2文件系统里面load文件到内存中。
至此需要的配置选项已经全部加入。加入后如下patch所示:
----------------------------------------
#define CONFIG_CMD_JFFS2
#define CONFIG_JFFS2_DEV "nand0"
#define CONFIG_JFFS2_NAND
#define CONFIG_JFFS2_PART_OFFSET 0x800000
#define CONFIG_JFFS2_PART_SIZE 0xf800000
---------------------------------------
重新编译u-boot,就可以使用jffs2相关命令访问JFFS2文件系统了。
具体实例于Atmel at91sam9m10g45ek board参考:https://github.com/voiceshen/u-boot-at91/tree/at91sam9m10g45ek/enable_jffs2_command