nandflash驱动编写 与 busybox 的bug 修改

在看老师的第19nand flash 驱动程序编写的时候遇到如下问题,已在论坛里发帖了:

http://www.100ask.net/forum/showtopic-3974.aspx

 

再次说明一下小弟的环境:

硬件平台: mini 2440 (淘宝上上海嵌入式家园花了520 大洋买的)

软件平台: 内核: linux – 2.6.32

                    根文件系统:自己用busybox – 1.16.2 制作的简单根文件系统

 

经过昨天下午老师远程协助现场直播的排疑解答,问题得到顺利解决:

1.      使用mdev –s 可以重新生成下设备文件,由

[root@FriendlyARM 19_nand]# ls -l /dev/mtdblock*
crw-rw---- 1 root root 31, 0 Feb 3 21:02 /dev/mtdblock0
crw-rw---- 1 root root 31, 1 Feb 3 21:02 /dev/mtdblock1
crw-rw---- 1 root root 31, 2 Feb 3 21:02 /dev/mtdblock2
crw-rw---- 1 root root 31, 3 Feb 3 21:02 /dev/mtdblock3

变成

[root@FriendlyARM 19_nand]# ls -l /dev/mtdblock*
brw-rw---- 1 root root 31, 0 Feb 3 21:02/dev/mtdblock0
brw-rw---- 1 root root 31, 1 Feb 3 21:02/dev/mtdblock1
brw-rw---- 1 root root 31, 2 Feb 3 21:02/dev/mtdblock2
brw-rw---- 1 root root 31, 3 Feb 3 21:02/dev/mtdblock3

 

2.      老师对busybox 1.16.2 的源码进行分析,发现了这居然是由busybox mdev 的一个bug 造成的,问题具体描述如下:

busybox 1.16.2 的源码文件util-linux/mdev.c中,找到make_device()函数的第152行左右吧:

                    type = S_IFCHR;

        if (strstr(path, "/block/"))

type = S_IFBLK;

改为:

                            type= S_IFCHR;

  if (strstr(path,"block"))

                            type = S_IFBLK;

strstr 函数是在第一个变量中查找第二个变量字符串找到了就返回真,否则返回假

 

在没改之前:打印make_device 函数中的path , type, S_IFBLK 变量如下:

对于字符设备:以.device/mtd1 为例:

打印出的信息:

path = /sys/devices/virtual/mtd/mtd1

type = 8192, S_IFBLK = 24576

肯定type S_IFBLK是不相等的。毫无疑问,因为他是字符设备

但是对于块设备,代码的意图应该是如果在path中找到block的字眼(而不是/block/字眼),就认为它是块设备,重新使type = S_IFBLK,即块设备的这两个值是相等的。

而对于/device/mtdblk:

打印出来居然是这样的:

path =/sys/devices/virtual/mtd/mtd3/mtdblock3

type = 8192, S_IFBLK = 24576

很显然type S_IFBLK 不等,显然是上述bug造成的,除非你的块设备文件名里含有/mtdblock/ 它才认为你是块设备

 

解决之道:

只要改正上述bug之后重新编译make ,然后将新的busybox 考到 /bin 中命名为busybox_mdev

然后再到/sbin 中删了以前mdev 的链接文件,重新使用命令ln -s /bin/busybox_mdev mdev

新建一个mdev链接即可。

 

 

再次装载 insmod s3c_nand.ko 你会发现

[root@FriendlyARM 19_nand]# ls -l /dev/mtd*

crw-rw----    1 root    root      90,   0 Feb 5 11:36 /dev/mtd0

crw-rw----    1 root    root      90,   1 Feb 5 11:36 /dev/mtd0ro

crw-rw----    1 root    root      90,   2 Feb 5 11:36 /dev/mtd1

crw-rw----    1 root    root      90,   3 Feb 5 11:36 /dev/mtd1ro

crw-rw----    1 root    root      90,   4 Feb 5 11:36 /dev/mtd2

crw-rw----    1 root    root      90,   5 Feb 5 11:36 /dev/mtd2ro

crw-rw----    1 root    root      90,   6 Feb 5 11:36 /dev/mtd3

crw-rw----    1 root    root      90,   7 Feb 5 11:36 /dev/mtd3ro

brw-rw----    1 root    root      31,   0 Feb 5 11:36 /dev/mtdblock0

brw-rw----    1 root    root      31,   1 Feb 5 11:36 /dev/mtdblock1

brw-rw----    1 root    root      31,   2 Feb 5 11:36 /dev/mtdblock2

brw-rw----    1 root    root      31,   3 Feb 5 11:36 /dev/mtdblock3

 

终于变成快设备了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值