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 autoconfigu-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";
};

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等交替亮灭。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐