1. 程式人生 > >linux嵌入式系統下實現U盤、SD卡自動掛載功能

linux嵌入式系統下實現U盤、SD卡自動掛載功能

在 Linux的嵌入式系統中我們經常用到U盤、SD卡的掛載,而每次都手動掛載或解除安裝非常麻煩,我們可以採取以下方法實現自動掛載或解除安裝U盤、SD卡

這就要用到mdev了

其具體操作如下:

1、首先在/etc/init.d/rsC中加入以下語句

echo /sbin/mdev > /proc/sys/kernel/hotplug

2、在/etc/下簡歷medv.conf的檔案,包含以下內容

sd[a-z][0-9]      0:0 666        @(/etc/hotplug/insert.sh $MDEV $SUBSYSTEM)
sd[a-z]           0:0 666        $(/etc/hotplug/remove.sh $MDEV $SUBSYSTEM)
ub[a-z][0-9]      0:0 666        @(/etc/hotplug/insert.sh $MDEV $SUBSYSTEM)
ub[a-z]           0:0 666        $(/etc/hotplug/remove.sh $MDEV $SUBSYSTEM)
mmcblk[0-9]p[0-9] 0:0 666        @(/etc/hotplug/insert.sh $MDEV $SUBSYSTEM)
mmcblk[0-9]       0:0 666        $(/etc/hotplug/remove.sh $MDEV $SUBSYSTEM)


3、在/etc/下建立以下資料夾hotplug,並在hotplug目錄下建立以下檔案,包含以下內容

insert.sh:

if [ -n "$1" ] ; then
    if [ -b /dev/$1 ]; then

        if [ ! -d /media ]; then
            mkdir -p /media
        fi

        if [ ! -d /media/$1 ]; then
            mkdir -p /media/$1
        fi
             mount /dev/$1 /media/$1
if [ $? -ne 0 ]; then
    rm -rf /media/$1

        fi

    fi
fi

remove.sh:

MOUNTS=$(mount | grep $1 | cut -d' ' -f3)
umount $MOUNTS
rm -rf $MOUNTS

(特別提醒:上面的程式碼在實際使用中可以直接複製,但注意換行符)

插入U盤、SD等裝置,即可在根目錄的/media目錄下建立相應的資料夾,掛載對用的磁碟檔案

而其原理是:

mdev是busybox自帶的一個簡化版的udev,適合於嵌入式的應用場合。其具有使用簡單的特點。它的作用,就是在系統啟動和熱插拔或者動態載入驅動程式時,自動產生驅動程式所需的節點檔案。在以busybox為基礎構建嵌入式linux的根檔案系統時,使用它是最優的選擇。


mdev的使用在busybox中的mdev.txt文件已經將得很詳細了。但作為例子,我簡單講講我的使用過程:

(1)在編譯時加上對mdev的支援:
    Linux System Utilities  --->             
                           mdev      
          
   Support /etc/mdev.conf         
   Support command execution at device addition/removal

(2)在啟動時加上使用mdev的命令:
我在自己建立的根檔案系統(nfs)中的/linuxrc檔案中添加了如下指令:
#掛載/sys為sysfs檔案系統
    echo "----------mount /sys as sysfs"
    /bin/mount -t tmpfs mdev /dev
    /bin/mount -t sysfs sysfs /sys
    echo "----------Starting mdev......"
    /bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
注意:是/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug,並非/bin/echo /bin/mdev > /proc/sys/kernel/hotplug。
 
(3)在你的驅動中加上對類裝置介面的支援。
  在驅動程式的初始化函式中,使用下述的類似語句,就能在類裝置目錄下新增包含裝置號的名為“dev”的屬性檔案。並通過mdev

在/dev目錄下產生gpio_dev0的裝置節點檔案。
  my_class = class_create(THIS_MODULE, "gpio_class");
  if(IS_ERR(my_class)) {
    printk("Err: failed in creating class./n");
    return -1;
  }
 
  class_device_create(my_class, MKDEV(gpio_major_number, 0), NULL, "gpio_dev%d" ,0);
  在驅動程式的清除程式段,加入以下語句,以完成清除工作。
  class_device_destroy(my_class, MKDEV(gpio_major_number, 0));
  class_destroy(my_class);
  需要的標頭檔案是linux/device.h,因此程式的開始應加入下句
  #include
  另外,my_class是class型別的結構體指標,要在程式開始時宣告成全域性變數。
  struct class *my_class;
  上述程式中的gpio_major_number是裝置的主節點號。可以換成需要的節點號。gpio_dev是最終生成的裝置節點檔案的名子。%d是用於以相同裝置自動編號的。gpio_class是建立的class的名稱,當驅動程式載入後,可以在/sys/class的目錄下看到它。上述語句也不一定要在初始化和清除階段使用,可以根據需要在其它地方使用。

(4)至於/etc/mdev.conf檔案,可有可無,不影響使用,只是添加了些功能。

執行mdev -s:

以‘-s’為引數呼叫位於/sbin目錄寫的mdev(其實是個連結,作用是傳遞引數給/bin目錄下的busybox程式並呼叫它),mdev掃描 /sys/class 和/sys/block中所有的類裝置目錄,如果在目錄中含有名為“dev”的檔案,且檔案中包含的是裝置號,則mdev就利用這些資訊為這個裝置在/dev下建立裝置節點檔案。一般只在啟動時才執行一次 “mdev -s”。

熱插拔事件:

由於啟動時運行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那麼當有熱插拔事件產生時,核心就會呼叫位於/sbin目錄的mdev。這時mdev通過環境變數中的 ACTION 和DEVPATH,(這兩個變數是系統自帶的)來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接著會看看這個目錄中是否有“dev”的屬性檔案,如果有就利用這些資訊為這個裝置在/dev 下建立裝置節點檔案。