ZYNQ-ZedBoard USB HOST問題初探


在用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,啟動后一切正常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM