在用Vivado (2015.4.2)在ZedBoard上搭建如圖所示的PS最小系統時,USB-OTG無法正常使用且在啟動LOG中報錯。
經過與原廠的各個啟動文件進行對比替換,最后確定是Vivado工程生成的bit流出了問題。也就是說建立的工程不對。
USB 啟動錯誤提示信息:外置PHY芯片初始化失敗,載入模塊失敗。
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic
usbcore: registered new interface driver ftdi_sio
usbserial: USB Serial support registered for FTDI USB Serial Device
e0002000.usb supply vbus not found, using dummy regulator
ci_hdrc ci_hdrc.0: unable to init phy: -110
ci_hdrc: probe of ci_hdrc.0 failed with error -110
mousedev: PS/2 mouse device common for all mice
由於已經排除了fsbl,uboot,內核鏡像的問題,那么剩下來看,最可能與硬件配置有關。在查閱USB-PHY部分電路時發現,PHY芯片除了與MIO信號線連接之外,還有兩條線:復位OTG-RESETN和5V電源控制線OTG-VBUSOC。其中OTG-VBUSOC已經正常引出,因此只剩下一條就是OTG-RESETN信號線,實際上並未從系統引出。
那么問題會不會出現在這里呢?
首先,查看sysfs中gpio相關信息
root@linaro-ubuntu-desktop:~# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 906-1023, parent: platform/e000a000.gpio, zynq_gpio:
顯示為空,即不存在包括otg-resetn這個引腳在內的任何gpio的調用信息。
再看看綜合后的RTL網表
也未找到關於OTG-RESETN的任何信息,看來OTG-RESETN確實是沒有的。
下面是官方樣板工程,打開.xdc文件查看,確實有OTG-RESETN輸出,對應G17引腳,網絡名稱是gpio_bd[31]
set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS25} [get_ports gpio_bd[27]] ; ## XADC-GIO0 set_property -dict {PACKAGE_PIN R15 IOSTANDARD LVCMOS25} [get_ports gpio_bd[28]] ; ## XADC-GIO1 set_property -dict {PACKAGE_PIN K15 IOSTANDARD LVCMOS25} [get_ports gpio_bd[29]] ; ## XADC-GIO2 set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS25} [get_ports gpio_bd[30]] ; ## XADC-GIO3 set_property -dict {PACKAGE_PIN G17 IOSTANDARD LVCMOS25} [get_ports gpio_bd[31]] ; ## OTG-RESETN
在回頭查看gpio_bd, 在頂層實例文件中找到相關信息
再查找與gpio_bd相關聯的模塊,在ad_iobuf 模塊中做了例化。
ad_iobuf #( .DATA_WIDTH(32) ) i_iobuf ( .dio_t(gpio_t[31:0]), .dio_i(gpio_o[31:0]), .dio_o(gpio_i[31:0]), .dio_p(gpio_bd));
那么這個ad_iobuf又是做什么的呢?
module ad_iobuf ( dio_t, dio_i, dio_o, dio_p); parameter DATA_WIDTH = 1; //參數可配置,總共例化DATA_WIDTH個實例 input [(DATA_WIDTH-1):0] dio_t; input [(DATA_WIDTH-1):0] dio_i; output [(DATA_WIDTH-1):0] dio_o; inout [(DATA_WIDTH-1):0] dio_p; genvar n; generate for (n = 0; n < DATA_WIDTH; n = n + 1) begin: g_iobuf assign dio_o[n] = dio_p[n]; assign dio_p[n] = (dio_t[n] == 1'b1) ? 1'bz : dio_i[n]; end endgenerate endmodule
這是ADI公司自己寫的一個模塊,實際上是實現了一個通用gpio的功能,通過EMIO原有的輸入(dio_i),輸出(dio_o),高阻(dio_t)組合而成一個標准的雙向可編程gpio。並由頂層實例中的32個gpio_bd引腳。(注意ad_iobuf
中的多重例化)
實際上它對應的正是EMIO的第31位。
再結合之前xdc文件中的描述我們可以知道,OTG-RESETN引腳即是gpio_bd[31].
在自己建立的工程中加入EMIO后,並為OTG-RESETN分配好引腳和網絡
set_property -dict {PACKAGE_PIN G17 IOSTANDARD LVCMOS25} [get_ports gpio_bd[31]] ; ## OTG-RESETN
重新生成bit流文件,和BOOT.BIN,啟動后一切正常。