i.MX6ULL有兩路USB功能接口USB_OTG1和USB_OTG2,這兩路USB都支持OTG功能。OTG是On-The-Go的縮寫。簡單地說,當(dāng)具備OTG功能的設(shè)備(以i.MX6ULL為例)連接到USB主設(shè)備(以電腦為例)的時候,i.MX6ULL會識別出它連接的是主設(shè)備,于是把自己作為從設(shè)備device與電腦通信,不給OTG接口供電;當(dāng)i.MX6ULL與U盤連接的時候,i.MX6ULL會識別出U盤是device從設(shè)備,于是把自己作為host主設(shè)備與U盤通信,并給OTG接口供電,為U盤提供電源。這一功能的實(shí)現(xiàn)是通過i.MX6ULL檢測一個ID引腳的高低電平實(shí)現(xiàn)的,還有一個VBUS引腳用于提供電源,當(dāng)作為device從設(shè)備時,VBUS由外部host設(shè)備供電;當(dāng)作為host設(shè)備時,VBUS需要串一個5V電源輸出給device從設(shè)備。
當(dāng)主設(shè)備(如電腦)通過電纜插入插座時,電纜的插頭內(nèi)的ID腳是懸空的,CPU檢測到的ID引腳是高電平,同時電腦通過USB電纜將插座的1腳(連接到VBUS)電壓提升至5V,CPU就工作在device模式下。
當(dāng)從設(shè)備(如U盤)通過電纜插入插座時,電纜的插頭內(nèi)的ID腳是對地短接的, CPU檢測到ID引腳是低電平,CPU就工作在HOST模式,同時通過USB座子1腳(連接到VBUS)為設(shè)備端供電。
ELF?1開發(fā)板使用TYPE C座將USB_OTG1功能引出,i.MX6ULL通過檢測TYPE C類型的插頭內(nèi)的CC引腳線的高低,來判斷自己是工作在host模式還是device模式,ELF?1開發(fā)板直接將CC(TYPE C座的CC1和CC2還有檢測插入方向的功能,這里不展開講)引腳接地了,并沒有連接到SOC檢測引腳,所以使用OTG功能,i.MX6ULL只能工作在device模式,當(dāng)做從設(shè)備使用。當(dāng)然也可以通過修改軟件,將此接口用作host模式。
將USB_OTG2作為host使用,接到了USB擴(kuò)展芯片上,型號FE1.1S,擴(kuò)展為4路USB,分別連接了2個Type-A插座,藍(lán)牙wifi模塊,擴(kuò)展板的4G模塊。
硬件原理
USB OTG功能使用的是OTG專屬引腳USB_OTG_P、USB_OTG_N、USB_OTG_VBUS,不需要做mux配置。USB_OTG2連接HUB芯片用于USB擴(kuò)展,其中HUB芯片有一個HUB_nRST復(fù)位功能引腳,由SN74HC595D控制。
IOMUX配置
由于OTG使用的是專屬引腳USB_OTG引腳,不需要IOMUX配置。
設(shè)備節(jié)點(diǎn)
在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中已經(jīng)添加好的配置otg1和otg2的設(shè)備節(jié)點(diǎn):
&usbotg1 { ????????/*dr_mode = “otg”;*/ ????????dr_mode = “peripheral”; ????????srp-disable; ????????hnp-disable; ????????adp-disable; ????????status = “okay”; }; ? &usbotg2 { ????????dr_mode = “host”; ????????disable-over-current; ????????status = “okay”; }; &usbphy1 { ?????????tx-d-cal = <0x5>; }; &usbphy2 { ?????????tx-d-cal = <0x5>; }; |
一、Usbotg1節(jié)點(diǎn)下屬性
dr_mode = "peripheral";ELF?1的USB_OTG1只作為device所以,dr_mode更改為peripheral外圍接口,即device模式。
srp-disable,hnp-disable,adp-disable,這三個屬性都是USB OTG相關(guān)協(xié)議:
SRP:Session Request Protocol,會話請求協(xié)議,此協(xié)議對于從設(shè)備可選可不選,這里不選。
HNP:Host Negotiation Protocol,主從交換協(xié)議,這里只使用從設(shè)備,所以可以關(guān)閉此協(xié)議。
ADP:Attach Detection Protocol,連接檢測協(xié)議,主要應(yīng)用于主設(shè)備,對于從設(shè)備可選可不選,這里不選。
二、Usbotg2節(jié)點(diǎn)下屬性
dr_mode = "host";USB_OTG2作為host主設(shè)備。
disable-over-current;表示不使用過流檢測功能。
同網(wǎng)絡(luò)、CAN一樣,USB也需要的phy負(fù)責(zé)最底層的信號轉(zhuǎn)換,i.MX6ULL內(nèi)部集成的usb phy。usbphy1和usbphy2分別表示USB_OTG1和USB_PHY2的 phy,tx-d-cal = <0x5>;是調(diào)整USB通信信號質(zhì)量的參數(shù)。
當(dāng)然也使用Usbotg2節(jié)點(diǎn)的配置方式,配置Usbotg節(jié)點(diǎn),使USB_OTG1工作在host模式。
除了上述配置之外,還需要注意一下,USB HUB芯片的HUB_nRST復(fù)位功能引腳是否已經(jīng)拉高,該引腳由SN74HC595D芯片的QD引腳控制:
gpio_spi: gpio_spi@0 { ????????compatible = “fairchild,74hc595”; ????????gpio-controller; ????????#gpio-cells = <2>; ????????reg = <0>; ????????registers-number = <1>; ????????registers-default = /bits/ 8 <0xaf>; ????????spi-max-frequency = <100000>; }; |
顯然,0xaf值的bit3位已設(shè)置為高。
添加驅(qū)動
一、配置內(nèi)核
使用make menuconfig打開圖形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?make menuconfig |
找到以下路徑:
Device Drivers ->USB support ->USB Gadget Support |
二、替換配置文件
通過make menuconfig修改的內(nèi)容寫入到了.config文件,當(dāng)使用make imx6ull_elf1_defconfig配置內(nèi)核源碼時,.config文件會被覆蓋,因此,需要替換原有的imx6ull_elf1_defconfig。
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?cp .config arch/arm/configs/imx6ull_elf1_defconfig |
編譯測試
編譯內(nèi)核、設(shè)備樹和模塊并拷貝到開發(fā)板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?./build.sh elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?scp arch/arm/boot/zImage ??root@172.16.0.175:/run/media/mmcblk1p1/ elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?scp arch/arm/boot/dts/imx6ull-elf1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/ elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$?scp .tmp/rootfs/modules.tar.bz2 root@172.16.0.175:~/ |
在開發(fā)板上解壓打包好的模塊到根目錄:
root@ELF1:~# tar -xvf modules.tar.bz2 -C / |
進(jìn)行sync操作后重啟開發(fā)板:
USB host:先測試USB host功能,這個測試就比較簡單了,直接將U盤插到TYPE A座上,系統(tǒng)就會自動識別到U盤設(shè)備,在/dev/下生成sda1節(jié)點(diǎn)。
USB device:我們用PC機(jī)作為HOST,開發(fā)板作為一個device設(shè)備,將開發(fā)板上的U盤掛載到PC上。
將一個U盤插到板子TYPE A座上,使用另一條TYPE C線連接OTG和PC機(jī):
運(yùn)行命令:
insmod libcomposite.ko insmod usb_f_mass_storage.ko insmod g_mass_storage.ko file=/dev/sda1 removable=1 |
可看到PC機(jī)掛載上了開發(fā)板上的U盤。