关于linux的busybox工具mdev的使用和声卡热插拔以及驱动挂载的总结
mdev的使用方法和原理
mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生热插拔时间的时候,mdev是被hotplug直接调用,这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式Linux的根文件系统时,使用它是最优的选择。
1)mdev的基本介绍及使用方法
mdev有两个主要的应用,初始化对象和动态更新,两个应用都需要内核sysfs的支持,且必须将sysfs挂载到/sys。为了是实现动态更新,你还必须在内核配置时增加热插拔的支持(hotplugging)\下面是系统初始化脚本中一个典型的使用mdev的代码片段
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s
当然, 一个对mdev更完整的安装还必须在以上代码段前执行下面的命令:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6]mount -t devpts devpts /dev/pts
简单说明一下上面的代码:
[1] 你必须在执行mdev前挂载/sys
[2] 随后你[2]命令内核在增删设备时执行 /bin/mdev
[3] 设置mdev,让它在系统启动时创建所有的设备节点
[4] 而对mdev更完整的安装,你必须确保[4] /dev是tmpfs
[5] (假设文件系统在flash外运行),而且你必须[5]创建
2)mdev.conf的规则
: [<@|$|*> ]
devic regex : 使用正则表达式表示的设备节点
uid gid : uid 和gid
octal permissions : 八进制的权限位
其中的特殊字符的解释:
@ 在创建设备节点后运行命令
$ 在删除设备节点前运行命令
* 在创建设备节点后和删除设备节点前都运行的命令
//好的,废话说完了,接下来是如何使用和配置
1.在使用busybox制作根文件系统的时候,(make menuconfig)选择支持mdev
Linux System Utilities --->
[*] mdev
[*] Support /etc/mdev.conf
[*] Support command execution at device
2.在文件系统添加如下内容
Vim /etc/init.d/rcS
echo "----------mount /sys as sysfs"
mount -t tmpfs mdev /dev
mount -t sysfs sysfs /sys
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo "----------Starting mdev......"
echo "echo /sbin/mdev > /proc/sys/kernel/hotplug"
echo /sbin/mdev > /proc/sys/kernel/hotplug
echo "mdev -s"
mdev -s
这些语句的添加在mdev的手册中可以找到。
<注> udev是要内核支持热插拔的,如果你的内核不支持热插拔,需要配置重新编内核,如果发生类似问题,可以去我另一篇博文
3.接下来是关于挂载的处理。mdev是走mdev.conf的,依赖它的内容做有趣的事,比如声卡吧
在嵌入式Linux板子上调试USB声卡,使用mdev创建设备节点时默认直接在 /dev/目录下创建, 如
- controlC0 pcmC0D0c seq sequencer2
- mixer pcmC0D0p sequencer timer
在busybox源代码的 doc/mdev.txt 文档里面找到以下说明:
- You can rename/move device nodes by using thenextoptional field.
: [=path] - Soifyou wanttoplace the device node into a subdirectory,make sure the path
- has a trailing/.Ifyou wanttorename the device node,just place the name.
- hda 0:3 660=drives/
- This will move"hda"into the drives/subdirectory.
- hdb 0:3 660=cdrom
- This will rename"hdb"to"cdrom".
- Similarly,">path"renames/moves the device but it also creates
- a direct symlink/dev/DEVNAMEtothe renamed/moved device.
- controlC[0-9] 0:0 0660 =snd/
- pcm.* 0:0 0660 =snd/
- seq.* 0:0 0660 =snd/
- mix.* 0:0 0660 =snd/
- timer 0:0 0660 =snd/
我的完整的mdev.conf如下(仅供参考)
# support module loading on hotplug
$MODALIAS=.*root:root 660 @modprobe "$MODALIAS"
# alsa sound devices and audio stuff
pcm.*0:0 660 =snd/
control.*0:0 660 =snd/
midi.*0:0 660 =snd/
seq0:0 660 =snd/
timer0:0 660 =snd/
dsp0:0 660 >sound/
mixer0:0 660 >sound/
sequencer.*0:0 660 >sound/
另外,在调试的时候你可以去/etc下面找mdev.conf,去/dev下看一下snd是否已经存在,若存在,进去看看是不是有你想要的东西
查看etc/init.d里面的rcS 是否已经改好了
之前“注”里面说的那个bin和sbin的问题,一定不要搞混了
下面重新编译文件系统重新运行mdev即可