如何在 PetaLinux 及独立操作系统中使用 MPSoC 器件启动 USB2.0 标准接口

本文介绍在 Vivado 2016.4 - 2017.2 工具中,在 PetaLinux 和独立操作系统下如何使用 MPSoC 器件运行 USB2.0 标准接口。

使用 Zynq UltraScale+ MPSoC,该 USB 接口就有两个 USB 2.0/3.0 控制器(USB0 和 USB1)。

USB0 和 USB1 都可以在 USB 2.0 中工作,无需使用 USB 3.0 外部 PHY 硬件,也无需在 SoC 处理器配置向导 (PCW) 中更新内部 GTR 设置。

启动 USB 2.0 标准接口,不强制 Vivado 软件启用 USB 3.0 处理器配置向导 (PCW) IP 设置。

这就意味着如果 USB0/1 接口没有使用物理 USB 3.0 接口,就可以禁用 GTR。

在 Vivado 2016.4、2017.1 和 2017.2 版本中,在处理器配置向导 (PCW) IP 设置中禁用或不从 PCW GUI 中选择 USB3.0 GTR 时,USB2.0 就不起作用。

这个问题与 Vivado 软件针对 USB3.0 和 USB2.0 禁用 PIPE3 时钟并将硬件设计 (HDF) 导出至 SDK 软件有关。

这是一个 Vivado 软件设置问题,在 2017.3 版 Vivado 软件中已修复。

解决方法:

要解决 Vivado 2016.4、2017.1 和 2017.2 中的这个问题,请按照以下步骤进行操作:

Step 1:

在 Zynq UltraScale+ MPSoC IP 向导中打开 Vivado 并选择 USB 2.0 接口。不要选择 USB 3.0。

Step 2:

在生成比特流之后,将硬件定义文件导出至 SDK 软件。

为导出的 HDF 文件生成 SDK FSBL 源代码,然后将下面的源代码添加到函数 XFsbl_HookBeforeHandoff:
XFsbl_Out32 (0XFE20C200, 0x02417); /* USB3_0_XHCI_GUSB2PHYCFG_OFFSET= 0XFE20C200*/

XFsbl_Out32 (0xFF9D007C, 0x1); /*disable usb3.0 pipe3 clock and enable usb2.0 clock

XFsbl_Out32 (0xFF9D0080, 0x1); /*Pipe power present*/

XFsbl_Out32 (0xff5e00a8, 0x01000602); /*LPD switch to active the clock*/

注意:ULPI PHY RESETB 信号不是 USB SoC 的一部分,所以用户需要从它们的一端来管理。RESETB 可能是 MIO 或 EMIO 或 GPIO 的一部分。

请确保已在 FSBL 或 U-BOOT 阶段释放,这样才能在 Linux 操作系统端正常运行。

如果这在 FSBL 端完成,就应该在 XFsbl_HookBeforeHandoff 函数中提到相应的代码。

例如,使用 ZCU102 时,我已经使用了带 PS_POR_B 的 MODE_1 配置信号逻辑 ANDed。

该源代码可能会在文件“xfsbl_board.c”中看到

查看 (UG1087): https://china.xilinx.com/html_docs/registers/ug1087/ug1087-zynq-ultrasca...

第 3 步:PetaLinux OS 设置。

禁用 DT (system-user.dtsi) 中的串行解串器并使用与 USB 模式、外设或主机相同的模式。

* 如果 USB0 用于支持外设应用,DT 看上去就像:
&dwc3_0 {

status = "okay";

dr_mode = "peripheral";

snps,dis_u2_susphy_quirk;

snps,dis_u3_susphy_quirk;

maximum-speed = "high-speed";

} ;

&usb0 {

status = "okay";

/delete-property/clocks;

/delete-property/clock-names;

clocks = <0x3 0x20>;

clock-names = "bus_clk";

};

&serdes{
status = "disabled";

};