若该文为原创文章,未经允许不得转载
QQ: 627833006
Email: hn.cy@foxmail.com
微信:Abner程
CSDN博客地址:https://blog.csdn.net/weixin_46718879
Gitee代码存储:https://gitee.com/abnerwork
目录
1.版本说明
时间 | 作者 | 版本号 | 说明 |
---|---|---|---|
2020/04/03 | Abner | v1.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命令失效。