硬件環境:天嵌IMX6q_coreC
內核版本:4.1.15
目的:板子做USB從機,通過otg連接PC機進行通信。即PC機上IMX6Q相當與U盤
如果板卡作爲PC的外設,通過USB線連接,那麼板卡處於USB Device工作模式,也即是USB Gadget工作模式,這種模式下常見的功能是PC識別板卡爲U盤(USB Gadget Mass Storage Class),雙方交換數據,還有板卡通過PC上網(USB Gadget CDC),板卡端虛擬出一個網絡設備。本篇文章主要介紹板卡作爲PC的外部存儲設備。
飛思卡爾源碼原生支持MSC ,即usb gadget 設備中的MSC
MSC即 Mass Storage Class.
一.修改內核配置單
make ARCH=arm menuconfig
Device Drivers --->
[*] USB support --->
<*> USB Gadget Support --->
<M> USB Gadget Drivers
<M> Mass Storage Gadget
編譯模塊:make modules
只能編譯爲模塊,原因其加載有依賴項目。
驅動模塊生成位置:drivers/usb/gadget/legacy/g_mass_storage.ko
查看其Makefile,有依賴項目:
obj-$(CONFIG_USB_MASS_STORAGE) += g_mass_storage.o
USB_LIBCOMPOSITE [=m] && USB_F_MASS_STORAGE [=m]
可以追到另外依賴的兩個驅動:1.drivers/usb/gadget/libcomposite.ko
2.drivers/usb/gadget/function/usb_f_mass_storage.ko
將這一共3個驅動ko文件一起拷貝到文件系統。
二.加載驅動
1.分別先按順序加載依賴驅動:
insmod libcomposite.ko
insmod usb_f_mass_storage.ko
2.因爲加載MSC驅動是需要參數的,可以直接讓PC機識別SD卡,emmc,nandflash(emmc和nand默認格式爲extn,PC機必須爲linux才能識別):
(1)讓ubuntuPC機識別板子上的SD卡:
使用命令df查看SD卡分區,
/dev/mmcblk1p1 15248320 929240 14319080 7% /run/media/mmcblk1p1
使用命令掛載MSC驅動並傳參,SD卡dev路徑:insmod g_mass_storage.ko file=/dev/mmcblk1p1 removable=1
插上otg連接到PC機就可以讀寫板子上的SD卡數據了,因爲SD卡的格式是fat的在windows下也能識別,
讀寫emmc,nandflash使用方法一樣,指定的路徑分別改爲emmc和nandflash的路徑就可以了,但是不能被windows識別,因爲windows僅能識別fat格式
(2)在內存創建指定格式的小空間,並跟PC機通訊
創建一個鏡像(本例放到/opt目錄下,名爲:test.img,容量:10MB):(僅需第一次創建時執行)
dd if=/dev/zero of=/opt/test.img bs=1M count=10
格式化鏡像爲fat格式,因爲windows僅能識別fat格式:(僅需第一次創建時執行)
mkfs.vfat /opt/test.img
關聯鏡像和loop設備(利用loop設備來掛載):(每次開機都要執行)
losetup /dev/loop0 /opt/test.img
掛載loop0到某個目錄下:(每次開機都要執行)
mount -t vfat /dev/loop0 /mnt
掛載MSC驅動:(每次開機都有執行),先掛載兩個依賴驅動
insmod libcomposite.ko
insmod usb_f_mass_storage.ko
insmod g_mass_storage.ko file=/dev/loop0 removable=1
加載之後插入usb連接到PC,就可以在PC(win7)上訪問板卡了。
一切完成之後,驗證是否正確。發現在windows下寫入文件或者新建文件夾。在開發板的掛載點的文件夾中能同步到windows的信息。而在開發板中新建的文件或文件夾,需要拔下設備,重連之後才能同步到windows的可移動設備中。