• 正文
    • 硬件原理
    • IOMUX配置
    • 設(shè)備節(jié)點(diǎn)
    • 添加驅(qū)動
    • 編譯測試
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

飛凌嵌入式ElfBoard ELF 1板卡-開發(fā)板適配之USB_OTG

02/27 09:15
773
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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盤。

相關(guān)推薦