Petalinux 相关操作 [黑金资料 基础教程s1]
16 -- Petalinux 工具安装
1.注: petalinux 并不是一个特殊 Linux 内核,而是一套开发环境配置的工具,降低 uboot、内核、根文件系统的配置的工作量,可以从 Vivado 的导出硬件信息自动完成相关软件的配置
2.安装必要的库
alinx@ubuntu:~$ sudo apt-get install tofrodos gawk xvfb git libncurses5-dev tftpd zlib1g-dev zlib1g-dev:i386 \
libssl-dev flex bison chrpath socat autoconf libtool texinfo gcc-multilib \
libsdl1.2-dev libglib2.0-dev screen pax
配置 tftp server,如果不需要从 TFTP 启动,这一步可选
sudo -s
apt-get install tftpd-hpa
chmod a+w /var/lib/tftpboot/
reboot
3.安装 Petalinux
运行以下命令做安装准备
sudo -s
mkdir -p /opt/pkg/petalinux
chown <your_user_name> /opt/pkg/
chgrp <your_user_name> /opt/pkg/
chgrp <your_user_name> /opt/pkg/petalinux/
chown <your_user_name> /opt/pkg/petalinux/
exit
给安装文件添加运行权限,当然 petalinux-v2017.4-final-installer.run 这个文件要先复制到系统下
sudo chmod +x petalinux-v2017.4-final-installer.run
开始安装
./petalinux-v2017.4-final-installer.run /opt/pkg/petalinux/
按回车查看协议内容,按 q 退出协议内容,按 y 同意协议内容 [共三次]
在安装过程中会弹出 License,按“q”退出,然后按“y”同意
等待完成
17 -- NFS服务软件安装
注: NFS (Network FileSystem,网络文件系统),用于在不同机器,不同操作系统之间通过网络互相分享各自的文件。 NFS 设计之初就是为了在不同的系统间使用,所以它的通讯协议设计与主机及操作系统无关。
NFS 分服务器和客户机,当使用远端文件时只要用 mount 命令就可把远端 NFS 服务器上的文件系统挂载在本地文件系统之下,操作远程文件与操作本地文件没有不同。 NFS 服务器所共享文件或目录记录在/etc/exports 文件中。
嵌入式 Linux 开发中,会经常使用 NFS,目标系统通常作为 NFS 客户机使用,Linux 主机作为 NFS 服务器
1.安装 NFS 服务
安装 NFS 服务器
alinx@ubuntu:~$ sudo apt-get install nfs-kernel-server
新建一个 work 目录做为 NFS 的一个工作目录,以后我们可以把交叉编译的程序放在这个目录里
alinx@ubuntu:~$ mkdir -p /home/alinx/work
配置 NFS 服务路径
alinx@ubuntu:~$ sudo gedit /etc/exports
在尾部添加下行命令,配置 /home/alinx/work 目录为 NFS 的一个工作目录
/home/alinx/work *(rw,sync,no_root_squash,no_subtree_check)
重启 rpcbind 服务
sudo /etc/init.d/rpcbind restart
重启 nfs 服务
sudo /etc/init.d/nfs-kernel-server restart
2.测试 NFS
挂载 NFS,在本机将 NFS 工作路径挂载在 /mnt 目录 [需 root 权限]
mount -t nfs 127.0.0.1:/home/alinx/work /mnt
进入 /mnt,新建一个 test 目录测试一下,可以在 /home/alinx/work 目录同步看到 test 文件夹
cd /mnt
mkdir test
18 -- 使用 Petalinux 定制 Linux 系统
1.Vivado 工程
编译生成 bit 文件 - 导出硬件信息 - 在 vivado 的工程目录下会有一个 *linux_base.sdk 的目录,下面有一个 "*.hdf" 文件,这个文件就包含了 petalinux 使用的文件
2.使用 Petalinux 建立工程
把“linux_base.sdk”目录复制到 Linux 主机中
进入工作目录
alinx@ubuntu:~/Downloads/peta_prj$
设置 petalinux 环境变量
alinx@ubuntu:~/Downloads/peta_prj$ source /opt/pkg/petalinux/settings.sh
设置 vivado 环境变量
alinx@ubuntu:~/Downloads/peta_prj$ source /opt/Xilinx/Vivado/2017.4/settings64.sh
创建一个 petalinux 工程,工程名为 ax_peta [注意代码中为双横线]
alinx@ubuntu:~/Downloads/peta_prj$ petalinux-create --type project --template zynq --name ax_peta
进入 petalinux 工作目录
cd ax_peta
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$
配置 Petalinux 工程的硬件信息 [这里 ../linux_base.sdk 即为之前导出的硬件信息]
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-config --get-hw-description ../linux_base.sdk
弹窗里可以配置 petalinux 工程,之后还可以使用命令 petalinux-config 来配置
在 Linux Components Selection 中可以配置 uboot 和 Linux 内核的来源,默认是 github 上下载的,需要 Linux 主机连接互联网才能下载。这里保持默认配置
在 Subsystem AUTO Hardware Settings 可以配置外设和启动方式,本实验都保持模式
在 Advanced bootable images storage Settings 选项中配置启动方式,默认从 sd 卡启动,为了调试这里保持默认从 sd 卡启动,如果需要制作一个从 QSPI flash 启动的嵌入式 Linux,可以在这里配置
保存后退出
3.配置 Linux 内核
配置内核
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-config -c kernel
等待一段时间后弹出配置内核的配置界面
暂时不需要什么配置,保存配置并退出
4.配置根文件系统
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-config -c rootfs
这里先保持默认配置
5.编译
配置编译 uboot、内核、根文件系统、设备树
petalinux-build
6.生成 BOOT 文件
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force
7.测试 Linux
将工程目录 images -> linux 目录 [/Downloads/peta_prj/ax_peta/images/linux]中的 BOOT.BIN 和 image.ub 复制到 sd 卡
打开串口终端,启动开发板 [显示 "ax_peta login: ",使用 root 登录,默认密码 root]
19 -- 使用 SDK 开发 Linux 程序
1.使用 SDK 建立 Linux 应用程序
在/home/alinx/work 建立目录 linux_app [即home/work/linux_app]
设置 Vivado 环境变量,运行 SDK
alinx@ubuntu:~/work$ source /opt/Xilinx/Vivado/2017.4/settings64.sh
alinx@ubuntu:~/work$ xsdk
弹出 SDK 启动窗,工作空间选 /home/alinx/work/linux_app
选择 Create Application Project
工程名填写 hello,OS Platform 选择 linux,Processor Type 选择 ps7_cortexa9,Finish
右键 - Build Project
2.通过 NFS 共享运行
在PuTTY上操作
开发板插上网线 (需要路由器支持自动获取 IP),上电,挂载 Linux 主机 NFS,其中192.168.1.77 为主机地址,/home/alinx/work 为 NFS 目录,/mnt 为开发板目录。 这里要求主机和开发板在一个网段
mount -t nfs -o nolock 192.168.1.77:/home/alinx/work /mnt
进入/mnt/linux_app/hello/Debug 目录,运行 hello.elf,我们可以看到打印出 Hello World
cd /mnt/linux_app/hello/Debug
./ hello.elf
3. 通过 TCF-Agent 运行调试
在 SDK 上操作
双击 Linux Agent,配置连接参数
填上 Host 的 IP 地址,这里填写的就是开发板的 IP 地址
点击 Test Connection,如果测试连接成功,表示 Linux TCF Agent 服务正在运行,可以运行调试
右键 - Run As -1.Launch on Hardware
在 debug 终端可以看到 Hello World 输出
4.TCF-Agent 问题
TCF-Agent 虽然可以很方便的运行调试 Linux 应用程序,也不需要 NFS 支持,但是对调试多线程程序支持不是很好,在应用程序崩溃时也不能很好的恢复调试环境,需要重启开发板,所以一直不常用
20 -- Linux 下 GPIO 实验
1.使用 SHELL 控制
通过 ls /sys/class/gpio 命令可以查看 GPIO 编号
root@zynq:~# ls /sys/class/gpio
gpio_test.sh
可以通过挂载 NFS 来运行这个 SHELL
如果 SHELL 不能运行,可以先添加运行权限
root@zynq:/mnt/linux_app/gpio# chmod +x gpio_test.sh
2.使用 C 语言控制
大部分情况我们都需要使用 C 语言来控制外设
一段 GPIO 测试代码
这一次我们不再使用 SDK 来编译,源代码命名为“gpio.c” ,运行下面命令编译代码
root@zynq:/mnt/linux_app/gpio# source /opt/Xilinx/Vivado/2017.4/settings64.sh
root@zynq:/mnt/linux_app/gpio# arm-linux-gnueabihf-gcc gpio.c -o gpio
编译完成以后会生成一个 gpio 的文件,gpio 文件就是一个 elf 文件
运行 gpio
root@zynq:/mnt/linux_app/gpio# ./gpio
确定 GPIO 的这个编号
root@zynq:/mnt/linux_app/gpio# ls /sys/class/gpio
确定和物理 GPIO 的关系
先选一个节点,这里确定 GPIO1016 和物理 GPIO 的关系
root@zynq:/sys/class/gpio/gpiochip1016# cat /sys/class/gpio/gpiochip1016/label
21 -- Petalinux 下的 HDMI 显示
讲解如何使用一个自己的内核来做 Linux
1.Petalinux 配置
把内核源文件[linux-xlnx-xlinx-v2017.4.tar.gz]复制到 Linux 主机,并解压
进入之前实验中的 Petalinux 工程目录
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$
设置 petalinux 环境变量
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ source /opt/pkg/petalinux/settings.sh
设置 vivado 环境变量
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ source /opt/Xilinx/Vivado/2017.4/settings64.sh
重新配置 petalinux
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-config
选择 Linux Components Selection ---> linux-kernel (linux-xlnx) ---> 选择 ext-local-src 按空格键
选择 External linux-kernel local source settings ---> 选择 EXternal linux-kernel local source path
填上 Linux 内核源码的路径 /home/alinx/work/linux-xlnx-xilinx-v2017.4
保存后退出
2.配置 Linux 内核
配置内核
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-config -c kernel
在弹出的窗口中,进入 Device Drivers → Graphics support,选择 Digilent VGA/HDMI DRM Encoder Driver 项按 y
在 Device Drivers → Common Clock Framework 选项中选择 Digilent axi_dynclk Driver 按 y
保存并退出
3.修改设备树
设备树是描述设备信息的一种格式化文本,这种文本结构对类似于 XML 和 JSON
打开 petalinux 工程文件中的名为 system-user.dtsi 的文件[在~/Downloads/peta_prj/ax_peta/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi]
修改设备树内容
4.编译测试 Petalinux 工程
配置编译 uboot、内核、根文件系统、设备树
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-build
生成 BOOT 文件
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force
把 BOOT.bin 和 iamge.ub [位于~/Downloads/peta_prj/ax_peta/images/linux/]复制到 sd 中,设置开发板 sd 模式启动,插上 HDMI 显示器,启动开发板
显示器会显示出如下内容 "ax_peta login: "
5.其他
防止系统休眠
休眠之前运行命令
echo -e "\033[9;0]\033[?33l\033[?25h\033[?1c" > /dev/tty0
echo -e "\033[9;0]\033[?33l\033[?25h\033[?1c" > /dev/tty1
echo -e "\033[9;0]\033[?33l\033[?25h\033[?1c" > /dev/tty
echo -e "\033[9;0]\033[?33l\033[?25h\033[?1c" > /dev/console
22 -- 使用 Debian 桌面系统
1.Petalinux 配置
进入前面实验中的 Petalinux 工程目录
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$
设置 petalinux 环境变量
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ source /opt/pkg/petalinux/settings.sh
设置 vivado 环境变量
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ source /opt/Xilinx/Vivado/2017.4/settings64.sh
使用 petalinux-config 命令重新配置 petalinux
在 Image Packaging Configuration --> Root filesystem type 选项中选择 SD card [把根文件系统放在 SD 卡中]
保存并退出
2.配置 Linux 内核
配置内核
petalinux-config -c kernel
配置 USB WIFI 模块驱动
在选项 Networking Support -> Wireless -> 选项中先选择 cfg80211 - wireless configuration API 再选择 Generic IEEE 802.11 Networking Stack (mac80211)
在选项 Device Drivers -> Network device support -> Wireless LAN -> Realtek rtlwifi family of devices 选择 Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter
配置 USB 摄像头驱动
在选项 Device Drivers -> Multimedia support -> Media USB Adapters -> 中使能 USB Video Class (UVC)
保存并退出
3.编译测试 Petalinux 工程
配置编译 uboot、内核、根文件系统、设备树
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-build
生成 BOOT.BIN 文件
alinx@ubuntu:~/Downloads/peta_prj/ax_peta$ petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force
4.制作 SD 卡文件系统
Ubuntu 中打开 disks 应用 - TF 卡删除全部分区
分区: 5000MB [格式为FAT] [名称为FAT] 用于存放ZYNQ 的启动文件 BOOT.bin 和内核文件、设备树
2985MB [格式为Ext4] [名称为EXT] 用于存放根文件系统
同步根文件系统到 SD 卡 EXT4 分区
复制根文件系统的压缩包到 Linux 主机[即复制debian_rootfs.tar.gz,实验复制在“/home/alinx/work”目录下]
解压缩文件系统
alinx@ubuntu:~/work$ sudo tar -zxvpf debian_rootfs.tar.gz
把这些文件系统的所有文件复制到 SD 卡的 EXT 分区的根目录下
alinx@ubuntu:~/work$ cd debian_rootfs
同步当前目录到 SD 卡的 EXT 分区根目录
alinx@ubuntu:~/work/debian_rootfs$ sudo rsync -av ./ /media/alinx/EXT [/media/alinx/EXT 为 SD 卡 EXT4 分区的路径]
把 BOOT.bin 和 iamge.ub 复制到 sd 的 FAT32 分区(第一分区)中,设置开发板 sd 模式启动[在images/linux目录]
完成
23 -- 制作从 QSPI Flash 启动的 Linux
[注意: 虽然板子上的 QSPI Flash 大小是 32MByte,但是 ZYNQ 芯片只能用其中的 16MByte]
1.复制 Petalinux 工程
原工程目录内 Ctrl+H, 显示隐藏文件
复制 project-spec、.petalinux、config.project 于新目录[新工程]
将 images/linux 目录下的 bit 文件也复制到新的工程目录下,用于合成带 PL 配置的 BOOT
2.配置编译 Petalinux
设置环境变量
alinx@ubuntu:~/work/peta/newpj$ source /opt/pkg/petalinux/settings.sh
alinx@ubuntu:~/work/peta/newpj$ source /opt/Xilinx/Vivado/2017.4/settings64.sh
使用 petalinux-config 命令配置 Petalinux
在 Subsystem AUTO Hardware Settings -> Advanced bootable images storage Settings -> boot image settings -> image storage media 选项中选择 primary flash
在 Subsystem AUTO Hardware Settings -> Advanced bootable images storage Settings -> kernel image settings -> image storage media 选项中选择 primary flash
在 Subsystem AUTO Hardware Settings -> Flash Settings 中可以修改 QSPI flash 的分区,默认的就差不多可以使用
在 Image Packaging Configuration -> Root filesystem type 选择 INITRAMFS,使用 RAM 类型的根文件系统[方便打包烧写到 QSPI Flash]
在 Firmware Version Configuration -> 中可以修改 Host name 等信息
保存并退出
编译
alinx@ubuntu:~/work/peta/newpj$ petalinux-build
合成 BOOT[与之前不同之处在于,把内核也打包到 BOOT.bin 文件里]
petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --kernel --force
将 BOOT.bin 烧写到 QSPI Flash
调整启动模式为 QSPI
附录
https://xilinx-wiki.atlassian.net/wiki/spaces/A/overview
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841873/Linux+Drivers
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842398/Linux+GPIO+Driver
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842142/GPIO+User+Space+App