本文介绍在Petalinux 下调用我们的USB 资源实现USB HOST的功能,并最终实现U盘的识别和读取
(备注 此章节内容适用于 Smart ZYNQ SP,如果是Smart ZYNQ 标准版请看对应板子目录)
另外 Smart ZYNQ SL版 不带USB 功能,本章节不适用
关于USB 部分,设备树和内核驱动部分xilinx 官方在wiki上也有资料 详细可以看下面链接
http://www.wiki.xilinx.com/Zynq+Linux+USB+Device+Driver
工程创建
1)打开Vivado 新建一个项目, 新建一个VIVADO 工程,打开软件 选中Create Project, 如下图所示
2)点击NEXT ,在出现的第二个对话框“Project name”中输入工程名;在“Project location”中选择保存路径;勾选“Create project subdirectory”(默认),最后点击“Next” 备注,所有的路径均不能出现中文名称
3)点击 RTL PROJECT 选项,点击NEXT
4) 第四步Add Sources 选项直接留空,NEXT
5)第五步Add Constraints 选项直接留空,NEXT
6)选择芯片型号 XC7Z020CLG484-1
7)确认所选信息 点击“Finish”,完成vivado的工程创建
之后 工程就新建好了, vivado 进入到开发界面
Block Design 部分创建
此处需要创建一个ZYNQ CORE ,并在ZYNQ CORE中设置DDR 以及UART等参数
UART此处用 MIO方式连接
1)创建一个BLOCK设计
2)搜索并添加ZYNQ7 Processing System,添加ZYNQ7 PROCESSING SYSTEM模块
软件自动生成了一个 zynq的block 如下图所示,接下来要做一些相应的设置,双击下图中的ZYNQ核
3)依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K256M16RE-125,数据位宽选择16bit 最后点击“OK”,如下图所示。
4)因为工程暂时用不到 AXI功能,所以可以先禁用AXI功能
5)linux 需要通过串口来进行命令行的输入输出,所以这里额外在ZYNQ核心中增加串口功能(选择EMIO方式)
由原理图可知, 主板的UART功能接在 ZYNQ PL端的 L17脚和M17脚了,即 ZYNQ的TX是 连接L17,ZYNQ的RX是连接M17 (备注 V1.0板子上的丝印 TX 和 RX标反了,以原理图为准)
使能UART 0 并在IO选项里选择EMIO方式
6) 本工程最终将使用TF卡来启动petalinux,所以这里需要使能SD功能
7)使能USB 0功能
因为我们的USB Phy的复位部分是接在MIO46管脚上的,所以这里还需要使能ZYNQ的MIO功能,并且在下方的USB 0 RESET选项里勾选 MIO46 复位方式选择低电平复位。 (因为我们没有用到I2C功能,所以I2C复位的选项去除)
8) 所有的都完成后点选 Run Block Automation,完成后续自动布线
9) 引出UART 信号,因为我们增加了EMIO 的UART,所以这里需要将UART的引脚引出 ,右键选择ZYNQ模块的UART_0,然后选择Make External
10)创建硬件描述,source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper如下图所示(这一步的作用相当于将图纸转换成对应的硬件描述语言的功能)
在弹出的对话框里保持默认
11)编写好代码后 对代码进行编译
12) 对管脚进行定义(这里用图形界面方式)
(备注 V1.0板子上的丝印 TX 和 RX标反了,以原理图为准) TX是 连接L17,RX是连接M17
11) 修改之后 点击 Generate Bitstream 进行综合以及生成Bit 文件
等待布线综合完成
12)File→Export→Export hardware…在弹出的对话框中勾选“include bitstream”,点击“OK”确认,如下图所示。
13)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”,如下图所示。
系统将自动打开SDK开发环境
其中SDK工程下的 下图hdf文件就是我们需要的系统硬件描述文件,这个需要交给petalinux 进行交叉编译用。
PetaLinux 工程创建
1)打开虚拟机下的 Ubuntu系统,打开命令行
输入 source /opt/pkg/petalinux/2018.3/settings.sh 对Petalinux 的环境进行加载
source /opt/pkg/petalinux/2018.3/settings.sh
2)在Ubuntu下创建工程目录(这里用图形界面的方式,当然也可以用mkdir的方式)
在home文件夹下 创建一个Petalinux文件夹(前两个章节已经创建了),可以图形界面打开Home 文件夹然后直接右键新建一个Petalinux
3) 创建Petalinux 工程
在工程文件夹的空白处 右键,然后点选Open in Terminal 打开终端命令行(这种方式打开命令行会自动定位到当前文件夹),当然也可以普通方式打开终端 ,再用CD的方式定位到此文件夹
(备注 如果用此方法,必须重新在这个新打开的命令行中对petalinux 开发环境进行预加载,否则后面会失败,每次打开新的命令行都需要执行这个命令)
source /opt/pkg/petalinux/2018.3/settings.sh
在命令行输入,来创建一个Petalinux_Net_TEST的工程
petalinux-create --type project --template zynq --name Petalinux_USB_HOST_TEST
按下回车后 名为Petalinux_USB_HOST_TEST的工程会被创建,并且刚才的文件夹下多了一个对应的工程文件夹
为了方便以后的工程管理,我们将刚才生成的system.hdf 也拖到Petalinux_USB_HOST_TEST文件夹中
4) 复制hdf文件到刚才创建的工程文件夹中
在图形界面下双击打开这个Petalinux 文件夹
打开刚才SDK的软件界面, 右键hdf文件,选择copy 复制
然后在图形界面打开 Ubuntu 的Petalinux 文件夹下的Petalinux_Net_TEST文件夹内, 右键空白处 点选Paste (粘贴)
5)设置路径并启动Petalinux 配置页
在刚才的界面下先CD进入 工程文件夹(Petalinux_USB_HOST_TEST) 备注(CD 的时候 可以输入文件夹的第一个字母然后按tab键,这样相同名称的文件夹就会跳出来)
cd Petalinux_USB_HOST_TEST
进入文件夹后,按下下列代码, 指定导入hdf的路径(因为是当前命令行的路径所以这里 带一个”.”就可以了,不然=号后跟具体路径) 并按下回车
petalinux-config --get-hw-description=.
之后系统将启动配置页
6) 对Petalinux 进行配置 (大量内容和之前章节四重复,可选择看)
a) 修改启动项
用键盘上的上下左右键移动光标,选择Subsystem AUTO Hardware Settings 按下回车(按两下ESC可以退回上一层)
选择Advanced bootable images storage Settings ,按下回车
选择 boot image settings选项 回车
选择 image storage media 回车
选择 primary sd并按回车(如果你在vivado 里设置了nand flash 等,这里就有多个选项可选了)
之后连按两次ESC 可以返回上一级, 一直返回,直到回到最初的初始界面
b )同理 对kernel image settings 也进行设置 ,Subsystem AUTO Hardware Settings 按下回车
选择Advanced bootable images storage Settings ,按下回车
之后用多次双击ESC的方式回到初始菜单
c) root 文件系统 类型选择
选择Image Packaging Configuration
选择 Root filesystem type
选择 INITRAMFS(这里不要因为是TF启动就选择SD CARD,否则需要构建根文件系统,这个有时间后面章节再写)
之后按多次ESC回到根菜单
d)因为板子上的DDR是512MB 的,所以这里不需要像Tiny ZYNQ板那样调整net boot offset加载位置
f)保存设置 选择save 并点选ok 对设置进行保存
退出 设置界面
主菜单选择EXIT 退出
之后 系统进行配置 ,此时等待配置结束
配置Kernel 增加 USB驱动
根据刚才wiki 网站上的介绍,如果需要配置成USB HOST模式则需要 将kernel按照下图这样设置
输入以下命令 对内核进行配置
petalinux-config -c kernel
因为kernel 设置中针对上图USB HOST中的设置默认都是打开的,所以kernel我们不需要更改设置,直接保存后退出即可
弹出来的菜单 直接选ok,并在之后出现的选项里点exit
之后一多次按ESC键返回主菜单,然后按EXIT 退出kernel 设置(接着继续漫长的等待)
设备树的修改
为了让USB功能正常使用,我们需要在设备树上增加USB的相关内容
路径在 我们创建的工程 Petalinux_USB_HOST_TEST路径下的 /project-spec/meta-user/recipes-bsp/device-tree/files 内的 system-user.dtsi文件
双击打开这个文件,并按下图所示,在原先的代码后面增加如下内容,并且在保存与退出
/{ usb_phy0: usb_phy@0 { compatible = "ulpi-phy"; #phy-cells = <0>; reg = <0xe0002000 0x1000>; view-port = <0x0170>; reset-gpios = <&gpio0 46 1>; drv-vbus; }; }; &usb0 { dr_mode = "host"; usb-phy = <&usb_phy0>; };
接下来 编译整个工程
回到命令行终端,输入以下代码 对Petalinux进行编译
petalinux-build
之后又是漫长的等待
直接到出现提示 successfully built project 代表编译完成了
打包boot.bin
编译完成后,项目工程文件夹下会有image文件夹,执行petalinux -package 命令 将zynq_fsbl.elf, system_wrapper.bit,u-boot.elf,image.ub 四个文件打包生成
BOOT.bin 文件
petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --u-boot --fpga --kernel --force
如下图所示,代表打包完成(有警告,直接忽略)
TF启动测试
在Ubuntu 系统内 打开 工程文件夹内 编译生成的image文件夹
再打开linux 文件夹
复制这2个文件 BOOT.bin、image.ub
然后回到windows 下,粘贴到格式为FAT32的 TF卡的根目录
之后正常退出TF卡, 并将卡插入到 我们的主板上
上电测试
将跳线位置换回到SD上
备注 实际测试过程中会发现 虚拟机 和windows 争抢串口的资源的情况,导致windows 下 无法访问串口,所以这里测试的时候(把串口默认设置连接到windows ) 或者临时挂起虚拟机
因为本工程需要用到ctrl+c来中断应用,所以这里用putty这样的专业工具替代串口助手(这样诸如CTRL+C这样的指令就可以用键盘的形式直接发送了,putty官网可以免费下载到)
打开后配置界面如下 模式选择serial ,并设置好串口号(查看设备管理器得到) 和波特率115200就行
设置成SD启动后重新上电,我们就能在putty上看到linux 发出来的命令行了
系统此时停留在等待输入账号密码的状态, 此时输入用户名 root 输入密码 root (不同的串口助手有些需要带回车)
之后就正式登录 petalinux 了
此时在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盘下的文件了 ,说明解除挂载成功
以下是 VIVADO 的工程 (里面的image文件夹 里面是 Ubuntu 下编译的镜像文件,将image 文件夹里的镜像复制到fat32的TF卡也能看效果)