官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2221|回复: 3

解决nandflash驱动编写出现的 “字符设备”问题 和 busybox 的bug修改

[复制链接]

4

主题

15

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2012-5-26 12:17:00 | 显示全部楼层 |阅读模式
在看老师的 19 nand flash 驱动程序编写的时候遇到如下问题,已在论坛里发帖了:
再次说明一下小弟的环境:
硬件平台: 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*
b
rw-rw---- 1 root root 31, 0 Feb 3 21:02 /dev/mtdblock0
b
rw-rw---- 1 root root 31, 1 Feb 3 21:02 /dev/mtdblock1
b
rw-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*
  1. [root@FriendlyARM 19_nand]# ls -l /dev/mtd*
  2. crw-rw----    1 root     root      90,   0 Feb  5 11:36 /dev/mtd0
  3. crw-rw----    1 root     root      90,   1 Feb  5 11:36 /dev/mtd0ro
  4. crw-rw----    1 root     root      90,   2 Feb  5 11:36 /dev/mtd1
  5. crw-rw----    1 root     root      90,   3 Feb  5 11:36 /dev/mtd1ro
  6. crw-rw----    1 root     root      90,   4 Feb  5 11:36 /dev/mtd2
  7. crw-rw----    1 root     root      90,   5 Feb  5 11:36 /dev/mtd2ro
  8. crw-rw----    1 root     root      90,   6 Feb  5 11:36 /dev/mtd3
  9. crw-rw----    1 root     root      90,   7 Feb  5 11:36 /dev/mtd3ro
  10. brw-rw----    1 root     root      31,   0 Feb  5 11:36 /dev/mtdblock0
  11. brw-rw----    1 root     root      31,   1 Feb  5 11:36 /dev/mtdblock1
  12. brw-rw----    1 root     root      31,   2 Feb  5 11:36 /dev/mtdblock2
  13. brw-rw----    1 root     root      31,   3 Feb  5 11:36 /dev/mtdblock3
复制代码

终于变成快设备了!
         在这里再次感谢韦老师的耐心解答和细心帮助!向着嵌入式linux 咱们在坛子里互相交流,共同进步吧!
回复

使用道具 举报

9

主题

23

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2012-5-27 00:47:00 | 显示全部楼层
学习了....
回复 支持 反对

使用道具 举报

9

主题

14

帖子

37

积分

新手上路

Rank: 1

积分
37
发表于 2012-5-30 10:45:00 | 显示全部楼层
回复 1楼cgsz1992的帖子

我mdev -s之后为块设备了,为什么在mount时,出现mount: mounting /dev/mtdblock3 on /mnt failed: No such device呢
回复 支持 反对

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2012-6-1 13:08:00 | 显示全部楼层
有 /dev/mtdblock3 吗
有 /mnt 吗
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-12-18 19:45 , Processed in 0.292979 second(s), 21 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表