Jffs2文件系统转换为yaffs2文件系统

ENV:
Kernel         : linux-2.6.12
boot-loader    : u-boot-1.3.0
FileSystem     : cramfs
Flash          : Intel 16M nor flash & SamSung 64M Nand Flash
CPU            : AT91rm9200DK

这个arm开发板之前的文件系统是Jffs2格式,当然只是在nand flash上的格式,因为需要应用或更改的文件都在这个flash上面,在内核配置支持Jffs2文件系统后,如果没有错误就可以在文件系统使用此格式的nand flash了,相关的命令为
mount -r -o sync -o noatime -t jffs2 /dev/mtdblock/5 /info
mount -r -o sync -o noatime -t jffs2 /dev/mtdblock/6 /apps
mount -w -o sync -o noatime -t jffs2 /dev/mtdblock/7 /logs
一般是没有错误的(毕竟这个文件系统已经集成在内核中了,打过arm的补丁后就不要修改任何文件了)

基于在nand flash上使用yaffs2文件系统的优越性,很有必要把现有的文件系统更改为yaffs2的格式,可惜这个没有默认集成到内核中,我看了linux-2.6.22版本的内核也没有集成,所以需要自己加入原代码,下载地址是http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
怎么编译/添加yaffs的支持就不细说了
如果编译没有太大问题就可以在文件系统中使用支持新格式的命令来mount nand flash了
mount -r -o sync -o noatime -t yaffs2 /dev/mtdblock/5 /info
mount -r -o sync -o noatime -t yaffs2 /dev/mtdblock/6 /apps
mount -w -o sync -o noatime -t yaffs2 /dev/mtdblock/7 /logs

但是使用过程中(copy/touch..)出现下面的错误
!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
yaffs tragedy: no more eraased blocks
!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
yaffs tragedy: no more eraased blocks
!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
yaffs tragedy: no more eraased blocks
!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
yaffs tragedy: no more eraased blocks
!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
yaffs tragedy: no more eraased blocks
!!!!!!!!! Allocator out !!!!!!!!!!!!!!!!!
yaffs tragedy: no more eraased blocks

在网上查找相关错误信息,发现在我的板子上执行
#cat /proc/yaffs
...
...
...
Device 2 "AT91 NAND partition 5, logs 25M"
startBlock......... 0
endBlock........... 1599
totalBytesPerChunk. 512
nDataBytesPerChunk. 512
chunkGroupBits..... 0
chunkGroupSize..... 1
nErasedBlocks...... 0
nReservedBlocks.... 5
blocksInCheckpoint. 0
nTnodesCreated..... 100
nFreeTnodes........ 93
nObjectsCreated.... 100
nFreeObjects....... 94
nFreeChunks........ 51129
nPageWrites........ 0
nPageReads......... 0
nBlockErasures..... 0
nGCCopies.......... 0
garbageCollections. 0
passiveGCs......... 0
nRetriedWrites..... 0
nShortOpCaches..... 10
nRetireBlocks...... 0
eccFixed........... 0
eccUnfixed......... 0
tagsEccFixed....... 0
tagsEccUnfixed..... 0
cacheHits.......... 0
nDeletedFiles...... 0
nUnlinkedFiles..... 0
nBackgroudDeletions 0
useNANDECC......... 1
isYaffs2........... 0
inbandTags......... 0
...
...
...

中,每一个nErasedBlocks...... 都是0,该问题应该是没有格式化导致成上面的错误的(原因可能是之前nand flash用的jffs2格式的文件系统,而现在突然要用yaffs2的格式,虽然jffs2没有对nand flash的OOB进行检查,但是yaffs2格式的Nand flash是必须检查的,而且在u-boot中进行擦出写入操作时,我看了u-boot的源码默认的支持就是jffs2的文件格式,所以说先前的jffs2的文件系统格式不出错而现在yaffs2出错就很正常了)

解决办法:用mkyaffs进行格式化
>: ./mkyaffs  
argc 1 sh 0 optcnt 1
usage: ./mkyaffs [-e] <mtdname> [image name]
  -e         Use mtd ecc. Default: do not use mtd ecc
  mtdname    Name of mtd device
  image name Name of optional image file

Function: Formats a NAND mtd device for YAFFS. If the optional
image file is specified, then the file system is loaded with
this image.

mkyaffs的源码在老版的yaffs的源码包中util文件夹下有 mkyaffs.c源码,配置正确的makefile就可以编译出你需要的工具
[root@redhatvm utils]# ll
total 88
-rw-r--r--    1 root     root         1427 May 20  2003 gen-ecc.c
-rw-r--r--    1 root     root         1500 May 20 11:15 Makefile
-rwxr-xr-x    1 root     root        11674 May 20 11:15 mkyaffs
-rw-r--r--    1 root     root         5796 Oct 11  2005 mkyaffs.c
-rwxr-xr-x    1 root     root        14031 May 20 11:15 mkyaffsimage
-rw-r--r--    1 root     root        14962 Oct 11  2005 mkyaffsimage.c
-rw-r--r--    1 root     root         8272 May 20 11:15 mkyaffsimage.o
-rw-r--r--    1 root     root         4500 May 20 11:15 mkyaffs.o
-rw-r--r--    1 root     root         1058 Oct 29  2003 mmaptest.c
lrwxrwxrwx    1 root     root           14 May 20 11:15 yaffs_ecc.c -> ../yaffs_ecc.c
-rw-r--r--    1 root     root         2064 May 20 11:15 yaffs_ecc.o



在板子上执行格式化的命令
>: ./mkyaffs -e /dev/mtd/7
Erasing block at 0x0816a4000
Erasing block at 0x081858000
Erasing block at 0x08185c000
....
....
Erasing block at 0x0818f8000
Erasing block at 0x0818fc000
OK
>:
如上,正确的话有Ok的回应,这下你可以看看你的
>:cat /proc/yafss
Device 2 "AT91 NAND partition 5, logs 25M"
startBlock......... 0
endBlock........... 1599
totalBytesPerChunk. 512
nDataBytesPerChunk. 512
chunkGroupBits..... 0
chunkGroupSize..... 1
nErasedBlocks...... 1597
nReservedBlocks.... 5
blocksInCheckpoint. 0
nTnodesCreated..... 100
nFreeTnodes........ 93
nObjectsCreated.... 100
nFreeObjects....... 94
nFreeChunks........ 51129
nPageWrites........ 0
nPageReads......... 46
nBlockErasures..... 0
nGCCopies.......... 0
garbageCollections. 0
passiveGCs......... 0
nRetriedWrites..... 0
nShortOpCaches..... 10
nRetireBlocks...... 0
eccFixed........... 0
eccUnfixed......... 0
tagsEccFixed....... 0
tagsEccUnfixed..... 0
cacheHits.......... 0
nDeletedFiles...... 0
nUnlinkedFiles..... 0
nBackgroudDeletions 0
useNANDECC......... 1
isYaffs2........... 0
inbandTags......... 0




也可以正常的操作你的yaffs的nand块了
附注:虽然下载的是yaffs2的代码,但是yaffs2是适合每个block>512k的nand flash使用的,我的Nand flash就模式使用的yaffs1
>:dmesg
...
...
...
<6>yaffs: dev is 32505861 name is "mtdblock5"
<6>yaffs: passed flags ""
<4>yaffs: Attempting MTD mount on 31.5, "mtdblock5"
<4>yaffs: auto selecting yaffs1
<6>yaffs: dev is 32505862 name is "mtdblock6"
<6>yaffs: passed flags ""
<4>yaffs: Attempting MTD mount on 31.6, "mtdblock6"
<4>yaffs: auto selecting yaffs1
...
...
...


>: df
Filesystem                Size      Used Available Use% Mounted on
/dev/mtdblock/5           1.0M    148.0k    876.0k  14% /info
/dev/mtdblock/6          22.0M    408.0k     21.6M   2% /apps
/dev/mtdblock/7          25.0M    196.0k     24.8M   1% /logs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值