在看老师的第19课nand 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
终于变成快设备了!