码迷,mamicode.com
首页 > 数据库 > 详细

ZYNQ-ZedBoard USB HOST问题二探

时间:2017-04-04 18:50:38      阅读:1289      评论:0      收藏:0      [点我收藏+]

标签:gpio   dir   direct   gre   复位   开发   err   echo   状态   

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

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

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

 

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

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

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

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

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

z@ubuntu:~/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”, 在目录中搜一下

z@ubuntu:~/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: gpio@e000a000 {
                        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信号引脚。

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

root@linaro-ubuntu-desktop:~# echo 979 > /sys/class/gpio/export          #申请端口号
root@linaro-ubuntu-desktop:~# echo out > /sys/class/gpio/gpio979/direction    #指定IO方向
root@linaro-ubuntu-desktop:~# echo 1 > /sys/class/gpio/gpio979/value       #写入IO值
root@linaro-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
root@linaro-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:目前我也是初学,这些内容权当抛砖引玉,有什么错误的地方,还请高手指正,不胜感激。

ZYNQ-ZedBoard USB HOST问题二探

标签:gpio   dir   direct   gre   复位   开发   err   echo   状态   

原文地址:http://www.cnblogs.com/qiantuo1234/p/6665638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!