菜单

关于linux的busybox工具mdev的使用和声卡热插拔以及驱动挂载的总结

2019年8月22日 - 前端排行

关于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
4166am金沙下载,当然, 一个对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 : 八进制的权限位
其中的特殊字符的解释:
@ 在创建设备节点后运行命令
$ 在删除设备节点前运行命令
* 在创建设备节点后和删除设备节点前都运行的命令
//好的,废话说完了,接下来是如何使用和配置

mdev的使用
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的手册中可以找到。

注意:是/bin/echo /sbin/mdev >
/proc/sys/kernel/hotplug,并非/bin/echo /bin/mdev >
/proc/sys/kernel/hotplug。
注> **
udev是要内核支持热插拔的,如果你的内核不支持热插拔,需要配置重新编内核,如果发生类似问题,可以去我另一篇博文
3.接下来是关于挂载的处理。mdev是走mdev.conf的,依赖它的内容做有趣的事,比如声卡吧
在嵌入式Linux板子上调试USB声卡,使用mdev创建设备节点时默认直接在
/dev/目录下创建, 如

  1. controlC0 pcmC0D0c seq sequencer2
  2. mixer pcmC0D0p sequencer timer

但是用户空间的程序alsa-lib, alsa-utils都是去
/dev/snd/目录下找这些设备节点,
怎么能让mdev把设备节点创建在子目录下呢?
在busybox源代码的 doc/mdev.txt 文档里面找到以下说明:

  1. You can rename/move device nodes by using thenextoptional field.
  2. :[=path]
  3. Soifyou wanttoplace the device node into a subdirectory,make sure
    the path
  4. has a trailing/.Ifyou wanttorename the device node,just place the
    name.
  5. hda 0:3 660=drives/
  6. This will move”hda”into the drives/subdirectory.
  7. hdb 0:3 660=cdrom
  8. This will rename”hdb”to”cdrom”.
  9. Similarly,”>path”renames/moves the device but it also creates
  10. a direct symlink/dev/DEVNAMEtothe renamed/moved device.

所以, 我们只要在 /etc/mdev.conf配置文件里面加入几行就可以了:

  1. controlC[0-9] 0:0 0660 =snd/
  2. pcm.* 0:0 0660 =snd/
  3. seq.* 0:0 0660 =snd/
  4. mix.* 0:0 0660 =snd/
  5. timer 0:0 0660 =snd/

这样再运行mdev, ALSA相关的设备节点就都创建在 /dev/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即可

mdev的使用方法和原理
mdev是busybox自带的一个简化版的udev,适合于嵌入式的…

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图