USB Gadget Storage功能除錯
由於工作的需要,實現板卡通過Micro USB線與PC連線,作為PC的 外設儲存,PC拷貝資料到板卡中,或者把板卡中的資料通過USB線拷貝到PC端,實現資料的互動,板卡採用Linux作業系統,筆者採用的是AM335X 處理器平臺:
開發過程中修改檔案順序記錄如下:
如果板卡作為PC的外設,通過USB線連線,那麼板卡處於USB Device工作模式,也即是USB Gadget工作模式,這種模式下常見的功能是PC識別板卡為U盤(USB Gadget Mass Storage Class),雙方交換資料,還有板卡通過PC上網(USB Gadget CDC),板卡端虛擬出一個網路裝置。本篇文章主要介紹板卡作為PC的外部儲存裝置。
1. Linux Kernel支援usb gadget 裝置中的MSC
MSG即 Mass Storage Class.
需要把該驅動配置為模組載入方式,因為在檔案系統中要靈活識別SD卡,或者NandFlash,或者Ramdisk為 PC的一個外設。
核心配置路徑:
make menuconfig -> Device Driver-> usb support -> usb gadget support
注意: MiniUSB 口需要配置成USB OTG模式,或著USB Device工作模式,一般在板級檔案進行USB工作模式的配置。
2 配置完成後,make uImage編譯核心,然後 make modules編譯模組,在 /driver/usb/gadget/下面形成驅動模組 g_mass_storage.ko檔案,把這個檔案拷貝到檔案系統的 “/lib/modules/3.2.0/kernel/drivers/usb/gadget/” 目錄下面, modprobe 命令會在lib/modules路徑下面搜尋要載入的驅動模組庫檔案。
3 PC識別板卡中的SD卡:
在超級終端裡面執行:
modprobe g_mass_storage file=/dev/mmcblk0 removable=1
以上命令載入gadget msc驅動,傳遞SD卡為模組引數,使用micro usb 線連線板卡與PC,這時PC端識SD卡FAT32分割槽,可以拷貝檔案到SD卡中,拷貝完成後可以在開發板中檢視到SD卡中的新檔案。 使用超級終端在SD卡建立檔案,需要重新連線板卡與PC,PC才能識別SD卡新建立的檔案。
另外需要注意的是:從SD卡拷貝檔案到PC,速度是比較快的,能達到18M/S,而從PC拷貝檔案到SD卡速度很慢,大概是1.4M/s,最後拷貝的檔案經過MD5驗證,資料是安全的,未丟失資料。
Read:
b9cdf2cbec8014750fde35d9e32674f4-----origin sdcard file---OK--MAX SPEED=18M/S-
b9cdf2cbec8014750fde35d9e32674f4-----read to pc files
Write:
b9cdf2cbec8014750fde35d9e32674f4------pc file-OK-MAX SPEED=1.4M/S
b9cdf2cbec8014750fde35d9e32674f4------sdcard file
4 PC識別NandFlash:
PC識別SD卡步驟較為單一,因為我們的SD卡具有FAT32分割槽,且為獨立的塊裝置,Windows系統很容易識別,而我們的NandFlash為UBI檔案系統,所以我們要在NandFlash上面建立一個虛擬的塊裝置,關鍵點是 /dev/loop 裝置節點,該裝置節點專門用來驅動模擬的塊裝置:
mkdir /usbfile
dd /usbfile
mkdir files
dd if=/dev/zero of=/usbfile/disk.img bs=1M count=20 //生成20M的二進位制映象檔案
mkdosfs disk.img // 使用mkdosfs工具把disk.img 檔案格式化成FAT32檔案系統;
mount -t vfat -o sync /usbfile/disk.img /usbfile/files //該命令會使用 /dev/loop裝置節點連線好disk.img 與 usbfile/files資料夾,這時如果我們mount一下會看到:
這時我們使用: modprobe g_mass_storage file=/usbfile/disk.img removable=1 命令即可識別NandFlash的 disk.img 檔案為PC的一個外部儲存空間,PC可以拷貝檔案到該虛擬磁碟中;
cd /usbfile/
./sync
ls /usbfile/files
可以看到PC拷貝到該虛擬磁碟中的檔案,實現了PC與NandFlash直接的資料傳遞。
下圖是檔案系統 /usbfile 資料夾下面的必要檔案:
需要注意的是:
PC拷貝檔案到虛擬磁碟後,使用超級終端檢視虛擬磁碟中的內容時需要執行 ./sync命令,sync是一個指令碼,該指令碼會重新掛載虛擬磁碟到 /usbfiles/files目錄,否則無法看到剛剛從PC拷貝的檔案。
如果使用超級終端在 /usbfiles/files下面建立檔案,需要重新插拔MicroUSB線,PC端才能看到虛擬磁碟中的新檔案;
PC拷貝到NandFlash的資料的速度也是比較慢的,而NandFlash的資料拷貝到PC的速度更好一些。
PC寫資料到NandFlash:1.8M/S
NandFlash 資料到PC的速度跟SD卡到PC的速度相當,17M/s.
5 PC識別板卡的記憶體disk
dd if=/dev/zero of=/dev/shm/50M bs=1M count=50"
insmod g_mass_storage.ko file=/dev/shm/50M
這時如果使用 micro usb線連線好PC,PC不能識別檔案系統格式,會提示格式化分割槽,選擇FAT32格式化方式即可。
由於是記憶體檔案系統,故系統重新啟動後,資料會丟失。