PetaLinux安装编译
目录PetaLinux安装编译1.安装petalinux2.编译petalinux3.生成BOOT文件PetaLinux安装编译开发板:Xilinx Zynq XCZU9EG虚拟机:Ubuntu18.04摄像头格式:jpeg显示屏接口:DisplayPort1.安装petalinux安装依赖包,运行脚本st_env_setup.sh如下,记得chmod给脚本权限:#!/bin/bashset -x
PetaLinux安装编译
- 开发板:Xilinx Zynq XCZU9EG
- 虚拟机:Ubuntu18.04
1.安装petalinux
- 安装依赖包,运行脚本
st_env_setup.sh
如下,记得chmod给脚本权限:
#!/bin/bash
set -x
script_dir=$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)
# This script sets up a Ubuntu host to be able to create the image by # installing all of the necessary files. It assumes a host with
# passwordless sudo
# Install a bunch of packages we need
read -d '' PACKAGES <<EOT
iproute2
gcc
g++
net-tools
libncurses5-dev
zlib1g:i386
libssl-dev
flex
bison
libselinux1
xterm
autoconf
libtool
texinfo
zlib1g-dev
gcc-multilib
build-essential
screen
pax
gawk
python3
python3-pexpect
python3-pip
python3-git
python3-jinja2
xz-utils
debianutils
iputils-ping
libegl1-mesa
libsdl1.2-dev
pylint3
cpio
EOT
set -e
sudo apt-get update
if [[ $(lsb_release -rs) == "16.04" ]]; then
echo "Install packages on Ubuntu 16.04..." sudo apt purge -y libgnutls-dev
elif [[ $(lsb_release -rs) == "18.04" ]]; then
echo "Install packages on Ubuntu 18.04..."
else
echo "Error: current OS not supported."
exit 1
fi
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y $PACKAGES
echo "Now install Vivado, SDK, and Petalinux."
echo "Re-login to ensure the enviroment is properly set up."
-
进入官网:https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-design-tools.html,下载
PetaLinux 2020.2 Installer (TAR/GZIP - 1.85 GB)
-
运行命令(注意不能用根用户sudo运行):
./petalinux-v2020.2-final-installer.run
,一开始会检查依赖,回车,之后会让你同意几个license,每个看完后按q
退出再输入y
回车同意,重复3次,最后再输入1次y
回车。 -
进入安装目录,bash下运行
source ./settings.sh
-
执行
echo $PETALINUX
,输出结果应为petalinux的安装路径。
2.编译petalinux
- 创建文件夹
project
,在其中再创建文件夹hardware
,将Vivado生成的.xsa
文件拷入hardware
中。 - 进入petalinux安装路径,执行
source ./settings.sh
,同一终端下,进入project文件夹,执行petalinux-create -t project -n petalinux --template zynqMP
创建工程,出现一个petalinux文件夹。 - 进入petalinux文件夹,执行
petalinux-config --get-hw-description ../hardware/
进行配置,如下:
- 进入
Auto Config Settings
,勾选kernel autoconfig
和u-boot autoconfig
-
Save,Exit
-
修改设备树文件
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
如下:
/include/ "system-conf.dtsi"
/ {
};
/* SD */
&sdhci1 {
disable-wp;
no-1-8-v;
};
/* USB */
&dwc3_0 {
status = "okay";
dr_mode = "host";
};
/* display */
&xlnx_dpdma {
status = "okay";
};
&zynqmp_dpsub {
status = "okay";
};
petalinux build
进行编译,下载的东西很大,速度又很慢,可以离线编译,参考https://blog.csdn.net/weixin_38939826/article/details/108118136,注意这个是2020.01的版本,下载的时候选择自己对应的版本。
3.生成BOOT文件
- 进入
/xxx/petalinux/images/linux
文件夹,执行petalinux-package --boot --u-boot --fpga --force
命令,生成BOOT文件如下:
- 将红框中的三个文件拷入SD卡,开发板调制SD卡启动,上电,打开串口即可看到输出。
- 用户名和密码均默认为
root
4.简单程序
a.运行helloworld
- 创建
hello.c
:
#include <stdio.h>
int main(void)
{
printf("hello world\r\n");
return 0;
}
- 交叉编译
aarch64-linux-gnu-gcc hello.c -o hello
- 将
hello
拷入SD卡 - 按照上述方法打开petalinux,
hello
在/media/sd-mmcblk1p1
路径下 ./hello
运行
b.gpio控制led
- 创建
gpio_test.c
:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdbool.h>
#define PS_LED_BASE 336
#define PS_LED_INDEX 44
#define PS_LED_ADDR (PS_LED_BASE+PS_LED_INDEX)
void led_ctl_init(void)
{
int lGpioFd;
char lCache[100];
lGpioFd = open("/sys/class/gpio/export", O_WRONLY);
if(lGpioFd < 0)
{
printf("open export fail\n");
return;
}
int len = sprintf(lCache, "%d", PS_LED_ADDR);
write(lGpioFd, lCache, len+1);
close(lGpioFd);
sprintf(lCache, "/sys/class/gpio/gpio%d/direction", PS_LED_ADDR);
lGpioFd = open(lCache, O_RDWR);
if (lGpioFd < 0)
{
printf("open direction fail\n");
return;
}
write(lGpioFd, "out", 4);
close(lGpioFd);
}
void led_ctl_on(bool isON)
{
int lGpioFd;
char lCache[100];
sprintf(lCache, "/sys/class/gpio/gpio%d/value", PS_LED_ADDR);
lGpioFd = open(lCache, O_RDWR);
if (lGpioFd < 0)
{
printf("open value fail\n");
return;
}
if(isON)
{
write(lGpioFd, "1", 2);
}
else
{
write(lGpioFd, "0", 2);
}
close(lGpioFd);
}
int main()
{
led_ctl_init();
printf("================start led ctrl==============\n");
while(1)
{
led_ctl_on(true);
printf("on\r\n");
usleep(500000);
led_ctl_on(false);
printf("off\r\n");
usleep(500000);
}
return 0;
}
led_ctl_init主要功能为导出gpio管脚,并将其初始化为输出管脚。led_ctl_on函数控制管脚的高低电平,实现led灯的亮灭。
- 进入petalinux,
ls /sys/class/gpio/
,会看到存在gpiochipxxx
的文件,将gpio_test.c
中的PS_LED_BASE
改为xxx相同的数字,查找手册PS_led
管脚为MIOxx
,将gpio_test.c
中的PS_LED_INDEX
改为xx相同的数字 - 交叉编译
aarch64-linux-gnu-gcc gpio_test.c -o gpio_test
- 将
gpio_test
拷入SD卡 gpio_test
在/media/sd-mmcblk1p1
路径下./gpio_test
运行,可以看到led等交替亮灭。
更多推荐
所有评论(0)