我我的以爲nandflash上用yaffs2文件系統是很好的方案,可是最新的Linux並不支持yaffs2文件系統,須要你本身給內核打補丁,不過話說在前面,因爲內核間差別及兼容問題,在編譯時確定會出現各類編譯問題,須要你一一的去解決。node
1、準備工做linux
1. 下載源碼git
使用git工具下載:$ git clone git://www.aleph1.co.uk/yaffs2 函數
2. 給內核打補丁工具
下載完成後,在該執行目錄下會有yaffs2文件夾,進入該文件夾。ui
$ ./patch-ker.sh c m ../../kernel/test/linux-3.14.4this
Updating ../../kernel/test/linux-3.14.4/fs/Kconfig
Updating ../../kernel/test/linux-3.14.4/fs/Makefilespa
有以上兩個信息,說明已經打好補丁,而且在fs/目錄下,多了yaffs2文件夾,其實這是從yaffs2文件夾中複製過來的。debug
2、內核配置code
下面配置內核,在linux目錄下make menuconfig
咱們發如今File system—>Miscellaneous filesystems—>下面並找不到yaffs2選項。原來是這樣的
查看YAFFS2的Kconfig文件,須要先選擇MTD_BLOCK纔會有顯示YAFFS2
#
# yaffs file system configurations
#
config YAFFS_FS
tristate "yaffs2 file system support"
default n
depends on MTD_BLOCK
select YAFFS_YAFFS1
select YAFFS_YAFFS2
help
也就說須要先選擇Device Drivers-->MTD-->Caching block device access to MTD devices,而後纔可以在File Systems--->Miscellaneous filesystem下面找到YAFFS2。
好的 ,配置完後,這下要執行make clean;make uImage了。剩下的工做就是解決一大堆編譯錯誤了!!!!
下面看看編譯的錯誤:
CC fs/yaffs2/yaffs_vfs.o
fs/yaffs2/yaffs_vfs.c: In function 'yaffs_mknod':
fs/yaffs2/yaffs_vfs.c:1228: error: incompatible types when initializing type 'uid_t' using type 'kuid_t'
fs/yaffs2/yaffs_vfs.c:1230: error: incompatible types when initializing type 'gid_t' using type 'const struct <anonymous>'
fs/yaffs2/yaffs_vfs.c: In function 'yaffs_symlink':
fs/yaffs2/yaffs_vfs.c:1427: error: incompatible types when initializing type 'uid_t' using type 'kuid_t'
fs/yaffs2/yaffs_vfs.c:1429: error: incompatible types when initializing type 'gid_t' using type 'const struct <anonymous>'
fs/yaffs2/yaffs_vfs.c: At top level:
fs/yaffs2/yaffs_vfs.c:1786: error: unknown field 'readdir' specified in initializer
fs/yaffs2/yaffs_vfs.c:1786: warning: initialization from incompatible pointer type
fs/yaffs2/yaffs_vfs.c: In function 'yaffs_fill_inode_from_obj':
fs/yaffs2/yaffs_vfs.c:1832: error: incompatible types when assigning to type 'kuid_t' from type 'u32'
fs/yaffs2/yaffs_vfs.c:1833: error: incompatible types when assigning to type 'kgid_t' from type 'u32'
fs/yaffs2/yaffs_vfs.c:1857: warning: format '%d' expects type 'int', but argument 3 has type 'kuid_t'
fs/yaffs2/yaffs_vfs.c:1857: warning: format '%d' expects type 'int', but argument 4 has type 'kgid_t'
fs/yaffs2/yaffs_vfs.c: In function 'yaffs_proc_debug_write':
fs/yaffs2/yaffs_vfs.c:3300: warning: comparison of distinct pointer types lacks a cast
fs/yaffs2/yaffs_vfs.c: In function 'init_yaffs_fs':
fs/yaffs2/yaffs_vfs.c:3394: error: implicit declaration of function 'create_proc_entry'
fs/yaffs2/yaffs_vfs.c:3395: warning: assignment makes pointer from integer without a cast
fs/yaffs2/yaffs_vfs.c:3398: error: dereferencing pointer to incomplete type
fs/yaffs2/yaffs_vfs.c:3399: error: dereferencing pointer to incomplete type
fs/yaffs2/yaffs_vfs.c:3400: error: dereferencing pointer to incomplete type
make[2]: *** [fs/yaffs2/yaffs_vfs.o] Error 1
make[1]: *** [fs/yaffs2] Error 2
make: *** [fs] Error 2
1. 出現error: incompatible types when initializing type 'uid_t' using type 'kuid_t' ,應該是不兼容問題致使,修改:
uid_t改成kuid_t和gid_t 改成kgid_t
剩下的關於這個變量的問題不少,可是都是關於兼容性的,你們在修改時只須要知道只要不兼容,那咱們就把全部用到的改到兼容的kuid_t爲止。
這裏修改的地方和文件有點多,我就不一一列出來了
2. error: implicit declaration of function 'create_proc_entry'
因爲最新的內核不支持這個函數,須要註釋掉並改成my_proc_entry = proc_create("yaffs",S_IRUGO | S_IFREG, YPROC_ROOT, &yaffs_fops);
最終修改以下:
mutex_init(&yaffs_context_lock);
my_proc_entry = proc_create("yaffs",
S_IRUGO | S_IFREG, YPROC_ROOT, &yaffs_fops);
#if 0
/* Install the proc_fs entries */
my_proc_entry = create_proc_entry("yaffs",
S_IRUGO | S_IFREG, YPROC_ROOT);
if (my_proc_entry) {
my_proc_entry->write_proc = yaffs_proc_write;
my_proc_entry->read_proc = yaffs_proc_read;
my_proc_entry->data = NULL;
} else {
return -ENOMEM;
}
#endif
3. error: unknown field 'readdir' specified in initializer
在init_yaffs_fs函數前添加如下代碼
static const struct file_operations yaffs_fops = { .owner = THIS_MODULE, .read = yaffs_proc_read, .write = yaffs_proc_write, };
static int __init init_yaffs_fs(void)
修改了以上,咱們就能編譯經過了。目前,內核就支持yaffs2文件系統了。
下一篇文件咱們來用busybox製做yaffs2文件系統。