arm上sd卡熱插拔問題的解決

arm上sd卡熱插拔問題的解決: (2013-09-23 18:30:33)
轉載▼
原文:http://blog.sina.com.cn/s/blog_7d7e9d0f0101mc6p.html
標籤: sd熱插拔 arm linux it 分類: 工作中遇到的問題
首先,保證sd卡驅動是完好,但是sd卡卻無法熱插拔或者無法識別。

剛開始我的板子上,sd是能夠讀取的,但是卻不支持熱插拔,看了幾天sd驅動,找到了問題的原因,是驅動中硬件引腳相關設置的問題,具體根絕個人板子來修改,我想說的是sd卡驅動完好下如何使板子支持熱插拔,內核的相關配置我就不多說了,網上很多。

1)確保內核支持熱插拔

cd linux-2.6.30.4# vi .config
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL is not set
CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_STRIP_ASM_SYMS is not set
CONFIG_HOTPLUG=y //確保這項爲y
CONFIG_PRINTK=y
CONFIG_NET=y //確保這項也爲y
確保以上兩項都選上,不然/proc/sys/kernel/目錄不會出現hotplug文件!
2)確保busybox支持mdev
mdev是busybox中udev設備文件系統的精簡版
make menuconfig
確保以下幾項被選中:
Linux System Utilities —>
mdev

Support /etc/mdev.conf

 Support subdirs/symlinks                            
  
   Support regular expressions substitutions when renaming dev
  
 Support command execution at device addition/removal       

Support loading of firmwares
3)根文件系統
解析mdev機制
執行 mdev -s:
以 “-s” 爲參數調用位於 /sbin 目錄下的 mdev(其實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 目錄下創建或刪除設備節點文件並執行相應的動作 ACTION 。
4)添加對熱插拔事件的響應,實現U盤和SD卡的自動掛載與缷載
vi /etc/mdev.conf
sd卡相關內容爲:
sd[a-z][0-9] 0:0 666 @ /etc/hotplug/usb/udisk_insert
sd[a-z] 0:0 666 $ /etc/hotplug/usb/udisk_remove
mmcblk[0-9]p[0-9] 0:0 666 @ /etc/hotplug/sd/sd_insert
mmcblk[0-9] 0:0 666 $ /etc/hotplug/sd/sd_remove

建相應目錄和文件

vi /etc/hotplug/usb/sd_insert
內容爲:
#!/bin/sh
mkdir /sdcard
mount -t vfat /dev/sdcard /sdcard

vi /etc/hotplug/usb/sd_remove
內容爲:
#!/bin/sh
umount /sdcard/
rm /sdcard -r

爲以上兩個腳本加上可執行權限:
chmod +x /etc/hotplug/usb/sd_insert
chmod +x /etc/hotplug/usb/sd_remove

有以下一點需要注意:

如果經過上述步驟已經實現sd卡熱插拔,但是你想在/sdcard/目下下來操作sd卡,比如新建文件(夾)或打開並寫入文件,記得結束後,要在該文件夾下執行一下同步操作:sync命令,否則會報錯,你在插入sd卡,會發現你寫入的文件不存在。切記:要用sync

============================================
http://blog.sina.com.cn/s/blog_8043547601019avd.html
mdev的使用以及arm Linux 如何自動檢測並自動mount SD卡 (2013-04-19 13:53:09)轉載▼
標籤: mdev busybox的mdev 自動掛載設備 自動掛載sd卡 mdev.conf 分類: linux系統
mdev的介紹及使用方法:
mdev是busybox中的一個udev管理程序的一個精簡版,他也可以實現設備節點的自動創建和設備的自動掛載,只是在實現的過程中有點差異,在發生熱插拔時間的時候,mdev是被hotplug直接調用,這時mdev通過環境變量中的 ACTION 和 DEVPATH,來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接着會看看這個目錄中是否有“dev”的屬性文件,如果有就利用這些信息爲這個設備在/dev 下創建設備節點文件。

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 : 八進制的權限位
其中的特殊字符的解釋:
@ 在創建設備節點後運行命令
$ 在刪除設備節點前運行命令
  • 在創建設備節點後和刪除設備節點前都運行的命令

實例: 使用mdev來實現arm linux自動識別並掛載sd卡
1.在使用busybox製作根文件系統的時候,選擇支持mdev
Linux System Utilities —>
[] mdev
[
] Support /etc/mdev.conf
[*] Support command execution at device

addition/removal

2.在文件系統添加如下內容
Vim /etc/init.d/rcS
mount -t tmpfs mdev /dev
mount -t sysfs sysfs /sys
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev –s
這些語句的添加在mdev的手冊中可以找到。

3.添加對熱插拔事件的響應,實現U盤和SD卡的自動掛載。

Vim /etc/mdev.conf
mmcblk[0-9]p[0-9] 0:0 666 @ /etc/sd_card_inserting
mmcblk[0-9] 0:0 666 $ /etc/sd_card_removing
紅色部分,是一個腳本,腳本內容可以根據我們的需要定製,可以實現掛載,卸載或其他一些功能。

如下是自動掛載和卸載的腳本:
/etc/sd_card_inserting
#!/bin/sh
mount -t vfat /dev/mmcblk0p1 /mnt/sd

/etc/sd_card_removing
#!/bin/sh
sync
umount /mnt/sd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章