ZynqSoc基于PetaLinux移植与开发

若该文为原创文章,未经允许不得转载
QQ: 627833006
Email: hn.cy@foxmail.com
微信:Abner程
CSDN博客地址:https://blog.csdn.net/weixin_46718879
Gitee代码存储:https://gitee.com/abnerwork

1.版本说明

时间作者版本号说明
2020/04/03Abnerv1.0

2.概要

 本文档中提到的Linux方法,通用于ZYNQ系列芯片,即本次移植与开发LINUX不仅仅针对现有项目设备,而是希望通过该方法搭建起一个通过的LINUX移植平台,避免FPGA工程师过多开发Linux而引入一些千奇百怪的问题。
  本文中提到的工具使用全套 :
**VIVADO2018.2 **
**PETALINUX2018.2**
**SDK2018.2**

3.重要说明

 移植前,需要搭建整个PetaLinux开发环境,请参考UG1144,并确保每一步都正确安装成功,若后续出现莫名其妙的问题,请根据情况重装整个系统。
 首次编译,需要从网络下载大量数据,根据网络情况可能会比较久,需要耐心等待。
 文档中未提到的信息,如无特殊需求,请不要更改,非专业LINUX驱动人员,不建议修改系统默认的uboot、kernel配置。
 文档中提到的部分参数,属于网上资源或者项目中的经验值,经目前项目验证可用。

4.移植步骤

4.1.创建petalinux工程

 执行命令

		petalinux-create -t project -n Serial7 --template zynq

 执行结果:
在这里插入图片描述
 使用cd命令进入工程目录,准备linux配置

    	cd ./Serial7

4.2.硬件配置

 在工程目录下,手动建立platform文件夹,目的是存放hdf文件并进行hdf文件的统一管理。
在这里插入图片描述
 使用命令导入hdf文件,并配置整个系统:

		petalinux-config --get-hw-description=./platform 

 执行结果:

在这里插入图片描述
配置选项:
注意:该界面下,只需要修改 Subsystem AUTO Hardware Settings内部的选项,请勿改变其他信息。
选择:Subsystem AUTO Hardware Settings菜单,执行结果:
在这里插入图片描述
在该页面中需要对

	Serial Settings
	Ethernet Settings
	Flash Settings
	Advanced bootable images storage Settings

进行配置,并根据硬件或者软件需求进行适当的参数设置;

4.2.1.Serial Settings

在这里插入图片描述
当有一个串口时,不需要改变,默认即可;
当有多个串口时,需要根据硬件接口配置linux控制台输出,可以在此处选择,和其他地方无关。

4.2.2.Ethernet Settings

在这里插入图片描述
自定义网络IP
直接在此处修改IP信息,记住: 随机MAC需要勾选。若运行中要修改IP地址,需要代码,代码为通用网络代码。百度搜索。

4.2.3.Flash Settings

在这里插入图片描述
修改并且固定FLASH参数:

    boot    :0xA00000
    bootenv :0x20000
    kernel  :0xF00000
    spare   : 0x0

参数经过ZYNQ7010 ZYNQ7020 ZYNQ7030验证可用;
实际可根据FLASH容量大小进行修改,但修改后,需要验证。
boot+bootenv=fsbl+bit+u-boot 。kernel存放LINUX。

4.2.4.Advanced bootable images storage Settings

在这里插入图片描述
配置 SD卡启动(2选1)

	boot image settings
	    -> image storage media (primary sd)
	u-boot env partition settings 
	    ->image storage media (primary sd)
	kernel image settings
	     ->image storage media (primary sd)
	jffs2 rootfs image settings
	    ->image storage media (manual)
	dtb image settings     
	    ->image storage media (from boot image)

配置 QSPI启动(2选1)

	boot image settings
	    -> image storage media (primary flash)
	u-boot env partition settings 
	    ->image storage media (primary flash)
	kernel image settings
	     ->image storage media (primary flash)
	jffs2 rootfs image settings
	    ->image storage media (primary flash)
	dtb image settings     
	    ->image storage media (from boot image) 

总结
硬件配置,主要功能:
 1.配置硬件平台,即HDF文件
 2.确认串口、网络硬件信息
 3.确认系统SD/QSPI启动方式

4.3.创建上电自启动应用

执行命令

	petalinux-create -t apps --template install -n autorun-init --enable
	petalinux-create -t apps --template install -n autorun --enable

执行结果:
在这里插入图片描述
进入目录:project-spec/meta-user/recipes-apps/autorun-init/
修改文件 autorun-init.bb

#
# This file is the autorun-init recipe.
#

SUMMARY = "Simple autorun-init application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://autorun-init \
   "

S = "${WORKDIR}"

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

inherit update-rc.d

INITSCRIPT_NAME = "autorun-init"
INITSCRIPT_PARAMS = "start 99 5 ."

do_install() {
   install -d ${D}${sysconfdir}/init.d
   install -m 0755 ${S}/autorun-init ${D}${sysconfdir}/init.d/autorun-init
}

FILES_${PN} += "${sysconfdir}/*"

修改文件 ./file/autorun-init

#!/bin/sh
DAEMON=/usr/bin/autorun
start ()
{
    echo " Starting autorun"
    #start-stop-daemon -S -o --background -x $DAEMON
    start-stop-daemon -S -o -x $DAEMON
}
stop ()
{
    echo " Stoping autorun"
    start-stop-daemon -K -x $DAEMON
}
restart()
{
    stop
    start
}
[ -e $DAEMON ] || exit 1
        case "$1" in
            start)
            	start; ;;
            stop)
            	stop; ;;
            restart)
            	restart; ;;
            *)
            	echo "Usage: $0 {start|stop|restart}"
            	exit 1
        esac
exit $?

进入目录:project-spec/meta-user/recipes-apps/autorun/
修改文件 ./file/autorun

#!/bin/sh
echo "Hello PetaLinux World"
mkdir /platform
mkdir /platform/SD
mount /dev/mmcblk0p1 /platform/SD
touch /platform/SD/autorun.sh
chmod 777 /platform/SD/autorun.sh
source /platform/SD/autorun.sh
app &

4.4.创建用户APP

 该APP为用户SDK产生的应用程序,即当SDK代码调试完毕以后,在此处增加。 同时该APP就是上电自动执行的app。 即上一步提到的内容。

	petalinux-create -t apps --template install -n app --enable

进入目录:project-spec/meta-user/recipes-apps/
可以看到新增了一个文件夹: app
在这里插入图片描述
进行app/file文件夹,可以看到app程序
在这里插入图片描述
使用SDK进行代码编写,并将编写好的程序生产的elf文件,通过更变名称变为app,然后替换现有的app文件。
在这里插入图片描述

4.5.创建用户LIB

 创建的lib,具体存放位置未知,但是如果能看懂lib.bb文件应该是能知道具体位置的,该方式采用xilinx官方推荐方式,但是该方法不适合大型应用程序。因为如果有几百个库文件这里估计很难实现。

	petalinux-create -t apps --template install -n lib --enable

进入目录:project-spec/meta-user/recipes-apps/
可以看到新增了一个文件夹: lib
在这里插入图片描述
删除 ./lib/files/ 下现有的文件,然后添加用户需要的lib文件
在这里插入图片描述
修改对应的 lib.bb 文件

#
# This file is the lib recipe.
#

SUMMARY = "Simple lib application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://libstdc++.so.6 \
		   file://libgcc_s.so.1 \
		  "

S = "${WORKDIR}"

TARGET_CC_ARCH += "${LDFLAGS}"

do_install() {
	     install -d ${D}/${libdir}
	     install -m 0655 ${S}/libstdc++.so.6 ${D}${libdir}}	     
	     install -m 0655 ${S}/libgcc_s.so.1 ${D}${libdir}}
}


FILES_${PN} += "${libdir}"
FILES_SOLIBSDEV = ""

4.6.内存使用区域分配

进入目录:
/project-spec/meta-user/recipes-bsp/device-tree/files/
修改文件:
/system-user.dtsi
/include/ "system-conf.dtsi"

/include/ "system-conf.dtsi"
/ {
	chosen {
		bootargs = "mem=256M";
	};
};

4.7.创建QSPI升级APP

 同QSPI区间分配匹配,请勿修改QSPI区间分配,也请勿修改代码,该升级支持fsbl+bit+uboot+uimage,但是只能同时升级,不能分开升级。

	petalinux-create -t apps --template c --name update --enable

 进入目录:/project-spec/meta-user/recipes-apps/update/file/
修改:update.c

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void flash_read() {
    system("dd if=/dev/mtd0 of=/platform/mtd_read.bin bs=4096 count=2560  skip=0  seek=0   "); // boot    10MB  = 0xA00000
    system("dd if=/dev/mtd1 of=/platform/mtd_read.bin bs=4096 count=32    skip=0  seek=2560"); // bootenv 128KB = 0x020000
    system("dd if=/dev/mtd2 of=/platform/mtd_read.bin bs=4096 count=3840  skip=0  seek=2592"); // kernel  15MB  = 0xF00000
    system("dd if=/dev/mtd3 of=/platform/mtd_read.bin bs=4096 count=1760  skip=0  seek=6432"); // spare   6MB896KB   = 0x6E0000
}
void flash_write() {
    system("flash_erase /dev/mtd0 0 0");
    system("flash_erase /dev/mtd1 0 0");
    system("flash_erase /dev/mtd2 0 0");
    system("flash_erase /dev/mtd3 0 0");

    system("dd if=/platform/update.bin of=/dev/mtd0 bs=4096 count=2560  skip=0     seek=0"); // boot    10MB  = 0xA00000
    system("dd if=/platform/update.bin of=/dev/mtd1 bs=4096 count=32    skip=2560  seek=0"); // bootenv 128KB = 0x020000
    system("dd if=/platform/update.bin of=/dev/mtd2 bs=4096 count=3840  skip=2592  seek=0"); // kernel  15MB  = 0xF00000
    system("dd if=/platform/update.bin of=/dev/mtd3 bs=4096 count=1760  skip=6432  seek=0"); // kernel  6MB896KB   = 0x6E0000
}
int main(int argc, char * argv[]) {
  char ID;
  ID = *(*(argv + 1));
  switch (ID) {
  case 'r': flash_read(); break;
  case 'w': flash_write(); break;
  default :
    printf("Just Support r or w\r\n");
    break;
  }
  return 0;
}

4.8.配置U-BOOT

	petalinux-config -c u-boot

请勿修改任何配置,直接退出,进行下一步。

4.9.配置KERNEL

	petalinux-config -c kernel

修改XADC配置

Device Drivers  --->    
	<*> Industrial I/O support  --->
    	Analog to digital converters  ---> 
        	< > Xilinx XADC driver

请勿修改其他任何配置,直接退出,进行下一步。

4.10.配置ROOTFS

	petalinux-config -c rootfs

TCF工具

Filesystem Packages
	-> console
    	-> network
        	-> tcp-wrappers
            	-> [*] tcp-wrappers

TFTP工具

Filesystem Packages
	-> console
    	-> network
        	-> dropbear
            	-> [ ] dropbear-openssh-sftp-server 

4.11.编译PETALINUX

petalinux-build

5.SD卡挂载

mount /dev/mmcblk0p1 /platform/SD
/dev/mmcblk0p1      SD卡驱动  不能修改
/platform/SD        目标文件,可以修改

但是如果遇到不能挂载的情况,比如/dev/mmcblk0p1 不存在,先检查硬件,然后换SD卡尝试,有些SD卡不支持。初步怀疑可能和win和linux的格式有关。

6.FLASH下载

第一步 create Boot Image
在这里插入图片描述
第二步,点击add增加u-boot.elf文件,点击OK确认
在这里插入图片描述

第三步,点击add增加image.ub文件,修改offset 0xA20000,点击OK确认。
记住:offset=0xA20000,是固定值,该固定值和LINUX内QSPI的分区,和升级也有关系,请勿修改这三处内容,因为修改以后在其他芯片上出现过问题,
记住:即时按照官方推荐的地址修改,也曾经遇到过问题,
另外:如果恰好修改了该地址,然后恰好可以使用,该地址也支持修改,但是必须和QSPI区间分配,和升级相匹配。
在这里插入图片描述
第四步,FLASH下载。
在这里插入图片描述
在这里插入图片描述
都是offset = 0,官方默认配置,意思是从FLASH的地址0开始烧写程序。

7.问题

FLASH启动不支持设备重启,reboot命令失效。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值