ZYNQ-ZedBoard USB HOST问题二探

上一次讲到USB不启动问题是由与Vivado工程中的EMIO引脚未正确配置造成的,那么软件上又是如何使用这个引脚的呢?

首先,Xilinx提供的Linux 开发包中已经包含了gpio的驱动和sysfs进行配套,并在设备树文件中对OTG-RESETN进行了初始化配置和声明。

其次,在实际使用中,USB-OTG的驱动向系统申请了OTG-RESETN的使用权,用来对PHY芯片完成配置。

启动后,查看sysfs中GPIO的相关状态信息:

[email protected]:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 906-1023, parent: platform/e000a000.gpio, zynq_gpio:
 gpio-991 (                    |ulpi resetb         ) out hi
[email protected]-ubuntu-desktop:~#

991号gpio正被使用,标签为“ulpi resetb”,从字面意思可以知道,它与USB-PHY和复位信号有一定关系。该gpio为输出状态,电平为高。

USB-PHY芯片是低复位,此时是正常工作的。

在Linux内核中查找字符串“ulpi resetb”,位于与USB-HOST驱动文件目录中。

[email protected]:~/WORK/Linux_xilinx/linux$ find . -type f  -name "*.c" | xargs grep "ulpi resetb"
./drivers/usb/chipidea/core.c:                GPIOF_INIT_LOW, "ulpi resetb");

打开这个文件,找到相关代码,发现USB-PHY芯片初始化时进行了两项工作

一是读取设备树中相关配置;二是向sysfs文件系统申请该gpio,并设置低电平,标签内容为“ulpi resetb”。

static int ci_hdrc_create_ulpi_phy(struct device *dev, struct ci_hdrc *ci)
{
        struct usb_phy *ulpi;
        int reset_gpio;
        int ret;

        reset_gpio = of_get_named_gpio(dev->parent->of_node, "xlnx,phy-reset-gpio", 0);        //读取设备树中相关配置
        if (gpio_is_valid(reset_gpio)) {
                ret = devm_gpio_request_one(dev, reset_gpio,                        //向sysfs文件系统申请该gpio,并进行初始化
                                GPIOF_INIT_LOW, "ulpi resetb");
                if (ret) {
                        dev_err(dev, "Failed to request ULPI reset gpio: %d\n", ret);
                        return ret;
                }
                msleep(5);
                gpio_set_value_cansleep(reset_gpio, 1);
                msleep(1);
        }

        ulpi = otg_ulpi_create(&ulpi_viewport_access_ops,
                ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
        if (ulpi) {
                ulpi->io_priv = ci->hw_bank.abs + 0x170;
                ci->usb_phy = ulpi;
        }

        return 0;
}

再来看看设备树,由上面驱动信息可知,这个991号引脚在设备树中名字是“xlnx,phy-reset-gpio”, 在目录中搜一下

[email protected]:~/WORK/Linux_xilinx/linux/arch/arm/boot/dts$ find . -type f -name "*zynq*.dts*" | xargs grep "phy-reset-gpio"
./zynq-picozed-sdr2.dtsi:    xlnx,phy-reset-gpio = <&gpio0 7 0>;
./zynq-zc702.dts:    phy-reset-gpio = <&gpio0 11 0>;
./zynq-microzed.dtsi:    xlnx,phy-reset-gpio = <&gpio0 7 0>;
./zynq-zc706.dtsi:    xlnx,phy-reset-gpio = <&gpio0 7 0>;
./zynq-picozed-sdr-userspace.dts:    xlnx,phy-reset-gpio = <&gpio0 7 0>;
./zynq-picozed-sdr1.dtsi:    xlnx,phy-reset-gpio = <&gpio0 7 0>;
./zynq-zed.dtsi:    xlnx,phy-reset-gpio = <&gpio0 85 0>;
./zynq-zc702.dtsi:    xlnx,phy-reset-gpio = <&gpio0 7 0>;
./zynq-mini-itx.dtsi:    xlnx,phy-reset-gpio = <&gpio0 7 0>;

zynq-zed.dtsi正是生成设备树的依赖文件,正是usb0中的一个配置。

&usb0 {
        xlnx,phy-reset-gpio = <&gpio0 85 0>;
};

现在还剩下一个问题,就是gpio-991和<&gpio0 85 0>是什么关系?

ZYNQ有54个MIO和64个EMIO,总共118个gpio。排列顺序如图所示,gpio的基地址是0xE000_A000。

设备树中gpio0的描述如下

                gpio0: [email protected] {
                        compatible = "xlnx,zynq-gpio-1.0";
                        #gpio-cells = <2>;
                        clocks = <&clkc 42>;
                        gpio-controller;
                        interrupt-controller;
                        #interrupt-cells = <2>;
                        interrupt-parent = <&intc>;
                        interrupts = <0 20 4>;
                        reg = <0xe000a000 0x1000>;
                };

OTG-RESETN 对应的网络为gpib_bd[31],在118中的顺序为54位MIO+31EMIO=85,正好是gpio0的第85个。

那么sysfs中的991又是如何来的呢?

gpiochip0: GPIOs 906-1023, parent: platform/e000a000.gpio, zynq_gpio:
 gpio-991 (                    |ulpi resetb         ) out hi

实际上,906-1023 共有118个gpio号,从906开始偏移85个,正好也是991,即OTG-RESETN信号引脚。

假设在终端中输入如下命令:

[email protected]:~# echo 979 > /sys/class/gpio/export          #申请端口号
[email protected]-ubuntu-desktop:~# echo out > /sys/class/gpio/gpio979/direction    #指定IO方向
[email protected]-ubuntu-desktop:~# echo 1 > /sys/class/gpio/gpio979/value       #写入IO值
[email protected]-ubuntu-desktop:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 906-1023, parent: platform/e000a000.gpio, zynq_gpio:
 gpio-979 (                    |sysfs               ) out hi
 gpio-991 (                    |ulpi resetb         ) out hi
[email protected]-ubuntu-desktop:~#

会发现,ZedBoard上的LD0被点亮,参考xdc约束文件;

set_property  -dict {PACKAGE_PIN  T22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[19]]      ; ## LD0

906开始偏移54+19个单元,正好是979.

以上就是对Vivado中自己搭建ZYNQ系统遇到的一点问题进行的探索,后续我将把从零搭建最小系统介绍下,让大家可以比较深入的认识一下ZYNQ的硬件环境使用。

PS:目前我也是初学,这些内容权当抛砖引玉,有什么错误的地方,还请高手指正,不胜感激。

时间: 2024-11-05 22:54:58

ZYNQ-ZedBoard USB HOST问题二探的相关文章

Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

【转】Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

全志Android设备增加Usb host ADK 功能

全志Android设备增加Usb host ADK 功能 Usb Host ADK是指不采用USB驱动,直接用java与设备编程的 这样让Android 可以无需修改内核和驱动情况下方便与各种USB外设通讯.全志的CPU的资料都是公开的,因此我们在上面开发很多应用.但是发现无法使用usb host 接口. 一.测试 可以简单下载USB Device info 来测试 https://play.google.com/store/apps/details?id=aws.apps.usbDeviceE

usb host鼠标不能使用原因

linux kernel 2.6.35的板子插入USB鼠标,出现如下错误LOG: [  191.177508] Plug in USB Port2 [  191.363516] usb 1-1: new full speed USB device number 10 using Mstar-ehci-2 [  191.578860] First get dev desc failed [  192.413517] usb 1-1: device not accepting address 10,

usb host和usb device

S3C2440的数据手册将USB功能分为两章--usb host和usb device.具体什么意思呢? usb host: 微处理器作为usb主设备,可以挂接U盘之类的从属设备. usb device: 微处理器作为usb从属设备,其常用作接受PC机发送的命令. 参考网页:USB Host和USB Device的区别 usb host和usb device,布布扣,bubuko.com

I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之USB HOST移植

USB HOST驱动一般都是由芯片厂商维护的,因此,我们仍然只需要配置下DTS即可完成USB HOST驱动的移植. DTS配置 参考sabresd相关的DTS,在我们的DTS中添加如下内容: / { ... regulators { compatible = "simple-bus"; reg_usb_otg_vbus: usb_otg_vbus { compatible = "regulator-fixed"; regulator-name = "usb

Android USB Host与HID通讯

前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 比较好的文章是:      Android USB Host与HID通讯 Android Service创建USB HOST通信 其中代码之处有些地方需要注意的, 特此注明一下: /** * USB HOST 连接 HID * @author IVAN * */ public class MainActivity extends Activity { private static final String T

翻译Android USB HOST API

翻译Android USB HOST API 源码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者注:翻译的好不好不是太重要,重点是在翻译的过程中会把每句话都看认真看一遍,或者说是抱着翻译的思想来完成一个读懂的目的. USB Host通信 当你的可供电Android设备处理USB host模式时,它担任着为USB总线供电,枚举连接的USB从设备等等一个主设备应用的工作.Android 3.1及以后

Using a USB host controller security extension for controlling changes in and auditing USB topology

Protecting computer systems from attacks that attempt to change USB topology and for ensuring that the system's information regarding USB topology is accurate is disclosed. A software model is defined that, together with secure USB hardware, provides