参考:
问题:
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. ES6中的数组常用方法

    数组在JS中虽然没有函数地位那么高,但是也有着举足轻重的地位,下面我就结合这ES5中的一些常用的方法,与ES6中的一些方法做一些说明和实际用途.大家也可以关注我的微信公众号,蜗牛全栈. 一.ES5中数 ...

  2. Java抽象类、继承及多态和适配器的实现

    Java继承 方法重写是Java语言多态的特性,必须满足以下条件 在子类中,方法名称与父类方法名称完全相同 方法的参数个数和类型完全相同,返回类型完全相同 方法的访问修饰符访问级别不低于父类同名方法的 ...

  3. 【NX二次开发】获取相邻面UF_MODL_ask_adjac_faces

    获取箭头指示的面的相邻面 源码: 1 extern DllExport void ufsta(char *param, int *returnCode, int rlen) 2 { 3 UF_init ...

  4. 【C++】Vector排序

    1.普通类型(由大到小排序) int main() { sort(v.begin(),v.end()); } 2.普通类型(由小到大排序) bool comp(const int &a,con ...

  5. 重磅!GitHub官方开源新命令行工具

    近日,GitHub 发布命令列工具 (Beta) 测试版,官方表示,GitHub CLI提供了一种更简单.更无缝的方法来使用Github.这个命令行工具叫做GitHub CLI,别名gh. 现在,你就 ...

  6. SpringMVC 进阶版

    请求限制 一些情况下我们可能需要对请求进行限制,比如仅允许POST,GET等... RequestMapping注解中提供了多个参数用于添加请求的限制条件 value 请求地址 path 请求地址 m ...

  7. EVB_Air724UG_A13开发板使用指南

      Air724 是上海合宙物联网于2020年3月下旬发布的一款基于UIS8910DM芯片组的物联网通讯模块. 模块通讯性能优越,符合Cat1通讯标准,支持最大下行速率 10Mbps 和最大上行速率5 ...

  8. java并发编程实战之线程安全性(一)

    1.1什么是线程安全性 要对线程安全性给出一个确切的定义是非常复杂的.最核心的概念就是正确性.正确性:某个类的行为与其规范完全一致.在良好的规范中通常会定义各种不变性条件来约束对象的状态,以及定义各种 ...

  9. STP协议与MSTP协议

    STP协议与MSTP协议 目录 一.STP概述 1.1.交换网络环路的产生 1.2.STP简介 二.生成树算法 2.1.生成树算法的步骤 2.2.网桥 ID 2.3.选择根端口 2.4.选择指定端口 ...

  10. 22、编译安装nginx及性能优化

    22.1.编译安装nginx: 1.下载nginx: [root@slave-node1 ~]# mkdir -p /tools/ [root@slave-node1 ~]# cd /tools/ [ ...