關於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 : 使用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/目錄下建立, 如
- controlC0 pcmC0D0c seq sequencer2
- mixer pcmC0D0p sequencer timer
但是使用者空間的程式alsa-lib, alsa-utils都是去 /dev/snd/目錄下找這些裝置節點, 怎麼能讓mdev把裝置節點建立在子目錄下呢?
在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.
所以, 我們只要在 /etc/mdev.conf設定檔裡面加入幾行就可以了:
- 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, 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即可