1. 程式人生 > >嵌入式Linux作業系統移植IMX6開發板之實現USB 自動掛載

嵌入式Linux作業系統移植IMX6開發板之實現USB 自動掛載

本篇文章講述如何實現USB自動掛載,U盤即插即用,不用手動掛載的方法,以及給出U盤自動掛載的原理。
目前做的IMX6開發板,移植Linux系統,原始碼(linux核心為3.0.35)由廠家提供(後面會提供核心,uboot,檔案系統原始碼)。主要功能是實現機器人控制器與示教器一體的功能。

一.首先給出我在 IMX6開發板實現的USB自動掛載的方法(不侷限於具體開發板):

-USB的自動掛載:
1、在/etc/udev/rules.d目錄裡面建立11-usb-mount.rules,
11-usb-mount.rules裡面的內容如下:

 ACTION!="add",GOTO="farsight"
 KERNEL=="sd[a-z
][0-9]",RUN+="/sbin/moun-tusb.sh %k" LABEL="farsight"

2、 在/sbin/目錄裡建立mount-usb.sh指令碼檔案
mount-usb.sh的內容如下:

 #!/bin/sh
 /bin/mount -t vfat /dev/$1 /udisk
 sync   

重啟下即可在linux上實現自動掛載,u盤自動掛載到/udisk目錄裡
-USB的自動解除安裝:
1、在/etc/udev/rules.d目錄裡面建立11-usb-umount.rules,內容如下:

ACTION!="remove",GOTO="farsight"
SUBSYSTEM!="block",GOTO="farsight"
KERNEL=="sd[a-z
][0-9]",RUN+="/sbin/umount-usb.sh" LABEL="farsight"

2、在/sbin/目錄裡建立umount-usb.sh指令碼檔案

 umount-usb.sh的內容如下:
 #!/bin/sh
 /bin/umount /udisk
 sync

通過上面的方法,親測有效,可以實現U盤的自動掛載。

二 分析一下U盤自動掛載的簡單原理
拿jz2440開發板中的led驅動程式做例子:

Busybox中的mdev.conf

在mdev.txt中有說明文件:
mdev.conf的格式:

<device regex> <uid
>
:<gid> <octal permissions> <device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]

device regex:正則表示式,表示哪一個裝置
uid: owner
gid: 組ID
octal permissions:以八進位制表示的屬性
@:建立裝置節點之後執行命令
$:刪除裝置節點之前執行命令
*: 建立裝置節點之後 和 刪除裝置節點之前 執行命令
command:要執行的命令

表2.常用的限定符
程式碼/語法 說明
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次

寫mdev.conf

方法1.

leds 0:0 777
led1 0:0 777
led2 0:0 777
led3 0:0 777

方法2.

leds?[123]? 0:0 777

方法3.

leds?[123]? 0:0 777 @ echo create /dev/$MDEV > /dev/console

方法4.

leds?[123]? 0:0 777 * if [ $ACTION = "add" ]; then echo create /dev/$MDEV > /dev/console; else echo remove /dev/$MDEV > /dev/console; fi

方法5.

leds?[123]? 0:0 777 * /bin/add_remove_led.sh  (這是要寫入mdev.conf的配置)

把命令寫入一個指令碼(最後需要新增執行許可權,chmod + x add_remove_led.sh):
add_remove_led.sh

#!/bin/sh
if [ $ACTION = "add" ]; 
then 
    echo create /dev/$MDEV > /dev/console; 
else 
    echo remove /dev/$MDEV > /dev/console; 
fi

6 .
U盤自動載入(放到/etc/mdev.conf裡面的)

sda[1-9]+ 0:0 777 * if [ $ACTION = "add" ]; then mount /dev/$MDEV /mnt; else umount /mnt; fi

7.

sda[1-9]+ 0:0 777 * /bin/add_remove_udisk.sh

add_remove_udisk.sh (最後需要新增執行許可權,chmod + x add_remove_udisk.sh)
#!/bin/sh
if [ $ACTION = "add" ]; 
then 
    mount /dev/$MDEV /udisk; 
else 
    umount /udisk; 
fi

想獲得各種學習資源以及交流學習的加我(有我部落格中寫的程式碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關於嵌入式,作業系統,C++語言,C語言,資料結構等技術問題。