参考:
问题:
1.ZYNQ Linux启动流程:
BOOTROM→FSBL→Uboot→Kernel→RootFS

环境:
虚拟机ubuntu16.04
petalinux2018.3
vivado2018.3
开发板:小熊猫z7020

前言
使用ZYNQ大概率会用到Linux。这里就对linux移植的整个流程做一个记录。
移植有两种方式:
(1)使用petalinux工具链进行移植。虚拟机需要装petalinux,自动化程度相对高。
 (2)手动移植,需安装SDK移植环境或者petalinux的环境,两者貌似是一样的。
实际上,rootfs是可以随便用哪个的。比如,可以混搭手动移植的uboot\kernel,而使用petalinux的rootfs。或者使用petalinux的image.ub,而使用debian等三方rootfs。看需要使用。
手动移植可以更熟悉定制方面的内容,当然更为繁琐。

  • 建立BSP:
首先我们从建立底层硬件平台开始,其定义了底层的设备树相关内容、PL端功能等。
这里使用了网口0、SD卡、UART1,根据原理图分配管脚即可,网口和SD卡的管脚使用fast,设置好DDR信息。
(1)配置ZYNQ:
(2)正常综合编译生成bit导出BSP到文件夹。
(3)打开SDK查看一下是否导入成功。

  • SD卡分区:本次移植u-boot、kernel、rootfs都在SD上。
分两个区即可,BOOT分区和RootFS分区,前面的分区用于存储u-boot和内核和PL端的bit,后一个分区用于存储根文件系统。
(1)在ubuntu中安装gparted。使用图形化界面简化操作,可直接在命令行中打开。

(2)切换到sd卡,可根据容量确认。
右键删除分区。
新建BOOT分区:最起始保留4MB空间,这里分512M,文件格式fat32,标签设置为BOOT。
剩下的全部分为RootFS分区。
至此,分区完成。

下述会讲述petalinux的移植方式和手动移植的方式。
一、petalinux移植
对于初学者,自然,petalinux是一种更为简便的方式,敲几个命令即可得到控制台的欢喜,而手动移植的坑还蛮多的。
(1)导出前述bsp到虚拟机:
(2)随便哪个位置新建个目录,并把sdk文件夹放入。这里新建个demo_linux文件夹。
(3)source下petalinux的环境(可放在bashrc中自动source,避免手动敲)。路径根据petalinux的安装路径进行选择。
source /home/kingstacker/petalinux2018.3/settings.sh
(4)新建一个petalinux项目:这里新建了个demo1_linux工程,路径下会自动新建demo1_linux文件夹,模板使用zynq,zynq7系列应该都是这个。
petalinux-create -t project -n demo1_linux --template zynq
(5)cd到这个工程下面:
cd demo1_linux/
(6)导入上层的SDK文件夹内容:会自动弹出配置窗口。
petalinux-config --get-hw-description=/home/kingstacker/demo_linux/project_1.sdk
(7)配置使用哪个串口进行打印。这里我使用的是PS端的串口1,波特率115200,跟ZYNQ配置时保持一致即可。
在Subsystem AUTO Hardware Settings选项下的Serial Settings设置。
(8)设置bootargs,用于打印信息的串口指定,指定内核启动位置。注意:我这里使用了自动生成头,不使用自动的没得实验成功。
在DTG Setting选项卡下第三行修改如下:
键入bootargs:我这里使用了PS端的uart1(在设备树中被alias到了serial0),内核要从SD卡的第二个分区启动,分区格式为ext4。
console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait
在Image Packaging Configuration中设置根文件系统类型,这里为SD卡。

切换到save保存主项配置,然后按两次ESC退出。

根据需要配置u-boot\kernel\rootfs内容,这里不配置使用默认,直接运行build即可。
petalinux-config -c u-boot
petalinux-config -c kernel
petalinux-config -c rootfs
(9)编译工程,打把游戏回来再看:
petalinux-build
(10)切换到image目录下的linux目录,执行语句生成BOOT.BIN文件。
petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga system.bit --u-boot
(11)复制BOOT.BIN和image.ub文件到SD卡的BOOT分区。
我这里BOOT路径如下:
cp BOOT.BIN /media/kingstacker/BOOT/
cp image.ub /media/kingstacker/BOOT/
(12)解压文件系统到SD卡的RootFS分区。
sudo tar xvf rootfs.tar.gz -C /media/kingstacker/RootFS/
至此,完成了所有内容,把SD卡放到板子上,切换板子启动模式为SD卡启动,连接CRT显示串口打印信息。

其他:
QEMU仿真:对于petalinux编译的系统,其提供了仿真工具,在上板之前就可以知道Uboot和Kernel是否可以启动。
(1)在工程目录下执行下述打包命令:
petalinux-package --prebuilt
(2)进行第三阶段仿真:
petalinux-boot --qemu --prebuilt 3
可以看到在等待文件系统,则表示成功。
也可以单独仿真uboot、kernel:
petalinux-boot --qemu --u-boot
petalinux-boot --qemu --kernel
还有一些高级用法这里不表。

二、手动移植linux:

(1)获取u-boot\kernel、device tree。
  • 下载xilinx的u-boot、kernel:
git clone https://github.com/Xilinx/u-boot-xlnx.git
git clone https://github.com/Xilinx/linux-xlnx.git
git checkout 检出想使用的版本,git tag查看所有可用的版本。
u-boot 2018.3貌似没得zynq_zc702_defconfig这个配置文件,可检出到2018.1拷贝一份。
确保含有device tree文件,没有就要下载并导入到SDK的仓库中:
git clone https://github.com/Xilinx/device-tree-xlnx
(2)设备树编译:
  • 工程导入SDK生成设备树:就是新建个设备树工程。

  • 设备树信息导入linux中生成dtb文件:
导入bsp信息:
右键命令行中运行:
首先source下SDK的settings.sh环境,source petalinux的sh文件也是一样的:
归集dts文件到一个文件中:
cpp -nostdinc -I include -I arch  -undef -x assembler-with-cpp  system-top.dts system-top.dts.preprocessed
编译设备树,生成dtb:
dtc -I dts -O dtb -i . -o devicetree.dtb system-top.dts.preprocessed
可以看到文件夹下生成了dtb文件:

(3)编译uboot:2018.3没得zc702,所以这里检出了2018.1的版本。
这里可以使用zc702的defconfig文件,其在xil_source/u-boot-xlnx/configs路径下。
CONFIG_ARM=y
CONFIG_SYS_CONFIG_NAME="zynq_zc70x"
CONFIG_ARCH_ZYNQ=y
CONFIG_SYS_TEXT_BASE=0x4000000
CONFIG_SYS_MALLOC_F_LEN=0x800
CONFIG_IDENT_STRING=" Xilinx Zynq ZC702"
CONFIG_SPL_STACK_R_ADDR=0x200000
CONFIG_DEFAULT_DEVICE_TREE="zynq-zc702"
CONFIG_DEBUG_UART=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_FIT=y
CONFIG_FIT_SIGNATURE=y
CONFIG_FIT_VERBOSE=y
CONFIG_BOOTCOMMAND="run $modeboot || run distro_bootcmd"
# CONFIG_DISPLAY_CPUINFO is not set
CONFIG_SPL=y
CONFIG_SPL_STACK_R=y
CONFIG_SPL_OS_BOOT=y
CONFIG_SYS_PROMPT="Zynq> "
CONFIG_CMD_THOR_DOWNLOAD=y
CONFIG_CMD_EEPROM=y
CONFIG_CMD_MEMTEST=y
CONFIG_CMD_DFU=y
# CONFIG_CMD_FLASH is not set
CONFIG_CMD_FPGA_LOADBP=y
CONFIG_CMD_FPGA_LOADFS=y
CONFIG_CMD_FPGA_LOADMK=y
CONFIG_CMD_FPGA_LOADP=y
CONFIG_CMD_GPIO=y
CONFIG_CMD_I2C=y
CONFIG_CMD_MMC=y
CONFIG_CMD_SF=y
CONFIG_CMD_USB=y
# CONFIG_CMD_SETEXPR is not set
CONFIG_CMD_TFTPPUT=y
CONFIG_CMD_CACHE=y
CONFIG_CMD_EXT4_WRITE=y
CONFIG_OF_EMBED=y
#CONFIG_ENV_IS_IN_SPI_FLASH=y
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_SPL_DM_SEQ_ALIAS=y
CONFIG_DFU_MMC=y
CONFIG_DFU_RAM=y
CONFIG_FPGA_XILINX=y
CONFIG_DM_GPIO=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_ZYNQ=y
CONFIG_SPI_FLASH=y
CONFIG_SPI_FLASH_BAR=y
CONFIG_SF_DUAL_FLASH=y
CONFIG_SPI_FLASH_ISSI=y
CONFIG_SPI_FLASH_MACRONIX=y
CONFIG_SPI_FLASH_SPANSION=y
CONFIG_SPI_FLASH_STMICRO=y
CONFIG_SPI_FLASH_WINBOND=y
CONFIG_PHY_MARVELL=y
CONFIG_PHY_REALTEK=y
CONFIG_PHY_XILINX=y
CONFIG_ZYNQ_GEM=y
CONFIG_DEBUG_UART_ZYNQ=y
CONFIG_DEBUG_UART_BASE=0xe0001000
CONFIG_DEBUG_UART_CLOCK=50000000
CONFIG_ZYNQ_SERIAL=y
CONFIG_ZYNQ_QSPI=y
CONFIG_USB=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_ULPI_VIEWPORT=y
CONFIG_USB_ULPI=y
CONFIG_USB_STORAGE=y
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
CONFIG_USB_GADGET_VENDOR_NUM=0x03fd
CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
CONFIG_CI_UDC=y
CONFIG_USB_GADGET_DOWNLOAD=y
因为没有用到flash则并修改下述:关掉 不然启动时候会卡死在SPI flash初始化部分
清除中间编译:
make distclean
使用配置文件:
make CROSS_COMPILE=arm-linux-gnueabihf- zynq_zc702_defconfig
通过下述指令可在界面中uboot进行进一步修改配置:改defconfig文件也可以
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
工具编译:
make CROSS_COMPILE=arm-linux-gnueabihf- tools
编译u-boot:
make CROSS_COMPILE=arm-linux-gnueabihf-

最后把编译生成的u-boot后缀改成.elf。

(4)生成FSBL文件并合成BOOT.BIN:
  • 在SDK中先生新建fsbl工程成FSBL,在src的h文件中添加debug属性,可以在控制台中打印FSBL阶段的启动信息:
#define FSBL_DEBUG_INFO

SDK中合成BOOT.BIN文件:uboot.elf、fsbl.elf、bit。
复制BOOT.BIN到SD卡的BOOT分区。上电确认BOOT.BIN是否可以正常启动。
(5)内核编译:
切换到linux-xlnx目录。
注意:错误的解决:

解决 "mkimage" command not found - U-Boot images will not be built

sudo apt-get install u-boot-tools
或者#export PATH=${YOUR_UBOOT_DIR}/tools:$PATH  //编译内核如果要生成uImage,则需要用到mkimage工具,该工具在u-boot/tools下有提供
或者直接复制mkimage到/bin目录即可,生成uimage会用到。
清除老的编译文件:
#make distclean
配置:
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_mz7x_defconfig  
根据需要对内核进行图形化界面的配置:暂时默认就好
#make ARCH=arm menuconfig
编译工具:
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- prepare scripts  
编译内核生成uimage:
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage  
(6)定制文件系统:
  • 文件系统:
这里文件系统使用debian,也可用别的,无所谓。
安装arm环境和debootstrap:
sudo apt-get install binfmt-support qemu qemu-user-static debootstrap
debian提取:
sudo debootstrap --arch=armhf --foreign stretch rootfs http://cdn.debian.net/debian
拷贝到bin路径:
cp /usr/bin/qemu-arm-static {{刚刚rootfs目录}}/usr/bin
在rootfs文件夹的上层执行:
DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot rootfs debootstrap/debootstrap --second-stage
进入rootfs:
chroot rootfs
添加源到list:
echo deb http://ftp.cn.debian.org/debian/ stretch main > /etc/apt/sources.list
更新:
apt-get update
按需安装相关包:
apt-get install vim sudo net-tools

debian9启动后网口默认没有自动挂载,开发者可以指定rc.local(注意给权限777)文件中自动执行脚本,使用脚本配置网口,脚本注意给权限chmod +x xx.sh。
而debian9默认不带rc.local。解决方法:https://www.cnblogs.com/flymeng/p/7901062.html
比如我这里新建/etc/rc.local文件:放入了sh_boot.sh文件。
#!/bin/sh -e
#
#rc.local #sh in there
/home/sh_boot.sh
#sh end
exit 0
EOF
给权限:chmod 777 /etc/rc.local
在home路径放入sh文件,即可。(注意别放在普通用户文件夹下,否则无法上电就执行了)配置网口0使用,根据需要修改。
echo "Welcome to use,powerd by kingstacker"
echo "config the eth......." ifconfig eth0 192.168.0.110 netmask 255.255.255.0 up echo "config finish."
给权限:chmod 777 /home/sh_boot.sh
命令行执行exit 退出。

  • 打包rootfs备份:
文件夹压缩:
切换到rootfs路径,执行:
tar -zcvf debian9_rootfs.tar.gz ./

文件夹解压到SD卡的rootfs:
tar zxvf debian9_rootfs.tar.gz -C /media/kingstacker/RootFS

debian9 rootfs文件坚果云分享:
https://www.jianguoyun.com/p/DdhhnukQ15CBCBjvgrcD 
普通用户登录及密码:kingstacker
su登录密码:123123


(7)复制相关文件到SD卡的BOOT分区,并添加uEnv.txt文件:
  • SD卡BOOT分区内容如下:bin文件、设备树、txt、内核镜像。
uEnv.txt:其指定了内核传参。表示uart速率115200,使用ttyPS0。根目录为SD卡的第二个分区。
bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait
load_image=fatload mmc 0 ${kernel_load_address} ${kernel_image} && fatload mmc 0 ${devicetree_load_address} ${devicetree_image}
uenvcmd=echo Copying Linux from SD to RAM... && mmcinfo && run load_image && bootm ${kernel_load_address} - ${devicetree_load_address}

而SD卡的RootFS分区存储了根文件系统:

至此,移植结束,插到板子上,享受劳动成果吧。

以上。






ZYNQ Linux 移植:包含petalinux移植和手动移植debian9的更多相关文章

  1. ZYNQ FLASH+EMMC手动移植LINUX启动

    前言 虽可使用Petalinux进行移植,简单方便,但为了更清楚明白的了解整个流程,还是尝试了一波手动移植. 参考资料 ZYNQ Linux 移植:包含petalinux移植和手动移植debian9 ...

  2. 嵌入式Linux下MP4视频录制库MP4V2移植和简单介绍

    **************************************************************************************************** ...

  3. STM32 HAL库详解 及 手动移植

    源: STM32 HAL库详解 及 手动移植

  4. Linux下移动图像监测系统——motion的移植及应用

    移动图像监控主系统的开发 移动图像监控的原理方法: 通过获取摄像头图像,比较前后每一帧的图像数据,从而实现移动物体监控.所有移动监控均是如此,只是图像帧的比较算法不同. 移动图像监控系统的实现 选择开 ...

  5. zynq linux驱动之PL-PS中断【转】

    转自:https://blog.csdn.net/h244259402/article/details/83993524 PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2 ...

  6. VM的Linux CentOS系统的VMTools的手动安装

    VM的Linux CentOS系统的VMTools的手动安装 一是没时间安装,另外是一直用的是VM的绿色版,里面没有Linux.iso 文件 今天晚上安装上了 linux 的vmtools ,再也不用 ...

  7. Linux显示包含全部的文件系统

    Linux显示包含全部的文件系统 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -a 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev ...

  8. 老段带你学鸟哥Linux视频教程 包含基础班+提高班

    老段带你学鸟哥Linux视频教程 包含基础班+提高班,附带pdf文档. 目录结构如下: 目录:/-老段带你学鸟哥Linux视频教程 [.9G] ┣━━老段带你学鸟哥-服务器篇 [1009.4M] ┃ ...

  9. Linux系统在嵌入式硬件上的移植

    =========================        基本常识       ========================= 一. Linux系统的基本构成: 1. loader 2.  ...

随机推荐

  1. 孟老板 BaseAdapter封装 (一) 简单封装

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  2. Linkerd 2.10(Step by Step)—1. 将您的服务添加到 Linkerd

    为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理(data plane proxy)注入到它们服务的 pod 中,从而进行网格化. Linkerd 2.10 中文手 ...

  3. 三、DNS子域授权

    前提:准备两台虚拟机:父域: www.tedu.cn(虚拟机A)子域:www.bj.tedu.cn(虚拟机B) 一.在两台虚拟机上安装域名解析软件 root@pc207 ~]# yum -y inst ...

  4. LM-MLC 一种基于完型填空的多标签分类算法

    LM-MLC 一种基于完型填空的多标签分类算法 1 前言 本文主要介绍本人在全球人工智能技术创新大赛[赛道一]设计的一种基于完型填空(模板)的多标签分类算法:LM-MLC,该算法拟合能力很强能感知标签 ...

  5. vue项目使用Echarts制作项目工期甘特图

    目录 1,前言 2,布局和数据部分 3,制作甘特图 1,前言 项目迭代过程中,碰上一个需求,要求用甘特图的方式显示项目的工期进度,开完会我赶紧搜索一下甘特图是啥东东,大概了解之后,做出了如下样式 Ec ...

  6. Blazor Server 和 WebAssembly 应用程序入门指南

    翻译自 Waqas Anwar 2021年3月12日的文章 <A Beginner's Guide To Blazor Server and WebAssembly Applications&g ...

  7. C、C++、python、Java、php、C#六种编程语言大PK 哪个好学习?

    作为程序员吃饭的工具,编程语言之间也形成了某种鄙视链,各大论坛里弥漫着剑拔弩张的气氛,众口难调.也难怪有很多初学者会有疑惑,为什么会有这么多编程语言,我到底应该学什么语言? 其实各种语言都各有千秋.接 ...

  8. Binding(四):数据校验

    ​    除了上一节讲的类型转换器,Binding还自带数据校验功能,这节主要来讲一下. 跟类型转换器一样,数据校验需要我们继承ValidationRule类,实现其中的Validate方法,并写入我 ...

  9. 如何使用原生的Feign

    什么是Feign Feign 是由 Netflix 团队开发的一款基于 Java 实现的 HTTP client,借鉴了 Retrofi. JAXRS-2.0.WebSocket 等类库.通过 Fei ...

  10. Docker:Docker部署postgresql数据库

    环境 Centos-7  Postgresql-10 docker-19 yum加载Postgresql yum install https://download.postgresql.org/pub ...