加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

yaffs2 不能写的问题原因及解决方法

(2011-12-08 15:04:36)
标签:

yaffs

readonly

filesystem

只读

文件系统

it

分类: linux

    移植完内核后,构建文件系统,.......等这些都忙完后,准备写驱动时,发现在文件系统是ro,使用mount -v命令查看结果如下:

/ # mount -v
rootfs on / type rootfs (rw)
/dev/root on / type yaffs (ro,relatime)
proc on /proc type proc (rw,relatime)
tmpfs on /tmp type ramfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
tmpfs on /dev type ramfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)

 

我cao,这是什么原因导致的,yaffs filesystem 应该是rw的啊!在网上google下,有很多网友也遇到这个问题,说是root分区大小不对:应该是128K的整数倍。

于是我就去查看启动信息,发现在flash partition分区时就应经出现问题了,提示信息如下(仅摘抄一部分):

.......

dm9000 Ethernet Driver, V1.31
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2440-nand s3c2440-nand: Tacls=2, 20ns Twrph0=3 30ns, Twrph1=2 20ns
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 1131 at 0x000008d60000
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "boot"
0x000000200000-0x000000400000 : "kernel"
0x000000400000-0x000003ff8000 : "filesystem
"
mtd: partition "filesystem" doesn't end on an erase block -- force read-only

mice: PS/2 mouse device common for all mice
TCP cubic registered
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
end_request: I/O error, dev mtdblock2, sector 256
isofs_fill_super: bread failed, dev=mtdblock2, iso_blknum=64, block=128
yaffs: dev is 32505858 name is "mtdblock2" ro
yaffs: passed flags ""
VFS: Mounted root (yaffs filesystem) readonly on device 31:2.
Freeing init memory: 112K

......

 

    看上图中红色部分,已经force read-only,问题就出现在这!!! 我查了下TQ2440的nand flash芯片datasheet,发现其组织形式为 K9F2G08=(2K+64B) X 64pages X 2048 blocks

                                   =2,112 Mbits   

    所以,擦除nand flash最小大小为1个block=2k X 64pages=128 Kbit,也就是说,上面分区大小必须是128K的整数倍,这样才能擦除,否则,就会出现上面的问题——force read-only。原来如此啊!

    既然找到问题了,相应的也就好解决了,更改分区大小,满足上面的要求的大小即可!也可以验证上面的大小(03ff8000)确实不能满足128K的整数倍,128K=0x20000,所以更改为:

 

static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name   = "boot",
                .size   = 0x00040000,
                .offset = 0x00000000,
        },
        [1] = {
                .name   = "kernel",
                .offset = 0x00200000,
                .size   = 0x00200000,
        },
        [2] = {
                .name   = "filesystem",
                .offset = 0x00400000,
                .size   = 0x0FB80000,
        }
};
更改后,可查看启动信息就不会出现上文中的红色部分了,此时yaffs为rw filesystem !

 

------------------------------------------------------------------------------------------------

    注意上文提示信息中的蓝色部分,怎么时序是这样的呢?记得在nand flash的驱动里nand flash的驱动在linux-2.6.30.4/arch/arm/plat-s3c24xx/common-smdk.c)。

时序配置如下啊:

137
140
141 static struct s3c2410_platform_nand smdk_nand_info = {
142         .tacls          = 10,
143         .twrph0         = 25,
144         .twrph1         = 10,
145         .nr_sets        = ARRAY_SIZE(smdk_nand_sets),
146         .sets           = smdk_nand_sets,
147 };
148
这时怎么回事啊?SOS!!!

 

 

 

 

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有