本文介绍在Petalinux 下调用我们的USB 资源实现USB HOST的功能,并最终实现U盘的识别和读取
- 此章节内容适用于下列主板
- Lemon ZYNQ (CLG400封装的7020)
- Smart ZYNQ SP / SP2 (CLG484封装的7020)
- Smart ZYNQ 标准版(停产) (CLG400封装7010/7020 )
- Smart ZYNQ SL版因为没有USB的资源,所以并不适用此工程
- 本文在 vivado2018.3 以及 Petalinux2018.3 版本上进行演示
关于USB 部分,设备树和内核驱动部分xilinx 官方在wiki上也有资料 详细可以看下面链接http://www.wiki.xilinx.com/Zynq+Linux+USB+Device+Driver
一、VIVADO工程部分 (之前章节制作的镜像已经带USB的部分,这里只做介绍)
我们之前制作的镜像中已经包含了USB部分的内容了,所以本次实验不需要重新制作VIVADO工程以及Petalinux 系统的重新编译操作。
- USB添加的过程的内容可以回顾下列章节:
- Smart Zynq : 基于Smart Zynq 的Petalinux开发 章节一 Vivado 基础硬件工程搭建
- Lemon Zynq :基于Lemon Zynq 的Petalinux开发 章节一 Vivado 基础硬件工程搭建
这里我们也可以简单回顾下:
1)在Block Design的ZYNQ设置页面里使能USB 0资源

因为我们的USB Phy的复位部分是接在MIO46管脚上的,所以这里还需要使能ZYNQ的MIO功能,并且在下方的USB 0 RESET选项里勾选 MIO46 复位方式选择低电平复位。 (因为我们没有用到I2C功能,所以I2C复位的选项去除)

这里要注意,USB 资源挂载在BANK501上,Lemon Zynq 和Smart Zynq 的BANK501是不同的,所以这里设置不同(会影响SD,USB,和网络功能):
- Lemon ZYNQ 的主板 (BANK501电压是1.8V),这里电压成1.8V
- Smart ZYNQ 的主板 (BANK501电压是1.8V),这里电压成3.3V
- 下图以Smart ZYNQ为例

上面是和USB相关部分的添加重点, 当然要想让PETALINUX 正常跑起来,我们还是需要按工程一那样,将DDR型号,DDR位宽,UART,SD等资源添加起来的。
二、PETALINUX的编译和烧录(之前章节制作的镜像已经带USB的部分,这里只做回顾)
如果要回顾内容可以参考下面部分:
- PETALINUX 的系统的编译及镜像的生成:
- PETALINUX 镜像的烧录:基于Smart Zynq与Lemon Zynq 的Petalinux开发 章节三 创建可用于Petalinux 系统启动的SD卡(包含boot和rootfs分区)
编译过程中与USB相关的部分如下:
1) 在Kernel中增加 USB驱动部分
(我们和WIKI网站上的内容作对比,Kernel的配置页默认已经包含了USB HOST的所有必须的内容,所以不需要额外再单独配置了)(如果需要修改Kernel配置页,在命令行中输入下列指令 petalinux-config -c kernel)
根据刚才wiki 网站上的介绍,如果需要配置成USB HOST模式则需要 将kernel按照下图这样设置

2) 设备树的修改
为了让USB功能正常使用,我们需要在设备树上增加USB的相关内容,路径在 我们创建的工程PetalinuxSystem路径下的 /project-spec/meta-user/recipes-bsp/device-tree/files 内的 system-user.dtsi文件。

双击打开这个文件,并按下图所示,在原先的代码后面增加如下内容,之后再保存与退出
/include/ "system-conf.dtsi"
/ {
};
/{
usb_phy0: usb_phy@0 {
compatible = "ulpi-phy";
#phy-cells = <0>;
reg = <0xe0002000 0x1000>;
view-port = <0x0170>;
drv-vbus;
};
};
&usb0 {
dr_mode = "host";
usb-phy = <&usb_phy0>;
};
上述内容中包含了USB 的设备树内容。之后保存并关闭即可。

备注:网上部分教程在设备树里需要手动添加网络部分的设备树,但是经过实际调试,2018.3的petalinux不需要自己手动创建网络的设备树,系统会自动帮我们在设备树里添加网络,而不需要手动添加(在没有编译前看不到设备树,整个工程编译后系统会自动在 /components/plnx_workspace/device-tree/device-tree下的pcw.dtsi文件和和zynq-7000.dtsi文件中自动添加上网络部分的中为我们添加网络部分的设备树内容)。
三、启动主板并进入PETALINUX系统
将板子的启动方式调整成SD启动,如下图所示(图片以Smart ZYNQ为例)

接下来可以对主板进行上电(已经上电的就按下电脑的POR复位键)。 上电之后板子上的POWER灯以及DONE灯将会亮起,如果我们的UART和电脑连接了,此时用putty等专业软件查看串口信息(波特率115200),可以看到系统已经启动,串口正在发送启动的日志信息。(当然这里也可以用 SSH方式通过网络进行连接)
当系统出现root@localhost:~# 就代表系统已经成功启动了,系统此时停留在等待输入账号密码的状态

此时输入用户名 root 密码 root,之后就正式登录 petalinux 了

之后就正式登录 petalinux 了
四、USB功能验证
此时在USB 接口插入 我们提前准备好的 U盘(必须是fat32格式)并且 这个U盘在电脑上创建了 两个文本文档 分别命名为a和b(无内容,仅最后访问验证用)

接入U盘后 会看到命令行有下列信息 ,有些U盘会提示some date may be corrupt 这个代表接入的U盘 需要错误检查 这个是正常的

输入 fdisk -l 可以查看U盘的信息
fdisk -l

也可以通过输入 df -h 查看U盘/dev/sda1 挂载的目录为/run/media/sda1
df -h

按照上面的图上U盘的位置,输入 cd /run/media/sda1 进入U盘 或者cd /dev/sda1 也可以 是一样
cd /run/media/sda1
然后输入ls检索文件夹下的信息
ls

可以看到 文件夹下有 a.txt 和 b.txt两个文件 跟我们之前复制到U盘的文件一致
简单介绍挂载的操作
1)在mnt文件夹下创建一个USB 目录
mkdir -p /mnt/USB
2)将/dev/sda1 也就是U盘 挂载到 /mnt/USB 文件夹下
mount /dev/sda1 /mnt/USB
3)用ls检索我们挂载的目录 ,可以看到 目录下 存在a.txt和b.txt 证明挂载成功了
ls /mnt/USB

4) 解挂载 用umount指令解除之前的挂载
umount /mnt/USB
之后再用ls命令 已经看不到U盘下的文件了 ,说明解除挂载成功

以上是本次用U盘来验证我们的USB 功能,实际上USB HOST 还可以接鼠标和键盘之类的外设,大家可以自行摸索