移植linux之传统方式
在ZYNQ开发时,有些情况下,为了降低开发的复杂性,或是提升系统运行的性能,在ARM上跑一个linux系统往往是一个不错的选择,而且linux系统一般集成了一些常用的成熟驱动,可以减少开发周期。本章将通过传统u-boot、kernel方式,完成移植。该方式虽然繁琐复杂,但是毕竟是一种通用的移植方式。
一、搭建硬件环境
- 1.新建工程,并新建一个 BD 文件,然后添加一个ZYNQ Processing system的IP核,并设置好与硬件相符合的PS和PL时钟以及DDR型号
2.添加一些必要外设
为了看到linux启动的实验现象,下面的外设是必备的:- SD:SD卡(用于从SD卡启动u-boot、kernel、PL以及文件系统)
- UART:用于打印调试信息的串口
3.右键单击 Block 文件,文件选择 Generate the Output Products
- 4.右键单击 Block 文件,选择 Create a HDL wrapper,根据 Block 文件内容产生一个 HDL 的顶层文件,并选择让 vivado 自动完成
- 5.并综合实现、生产.bit文件
- 6.导出硬件(包含.bit),待启动SDK
二、ARM上运行linux前的准备工作
- -1.电脑上安装linux环境
- 0.更新apt-get(可选,加速用)
在linux系统中打开/etc/apt目录下找到sources.list文件
将文件内容替换为
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
打开命令行执行apt-get update
刷新列表
- 1.安装相应环境
#安装32位依赖库
apt-get install lib32z1 lib32ncurses5 lib32stdc++6 libbz2-1.0:i386
#安装 Openssl 库,实现网络的保密性和可靠性的数据传输,在编译u-boot时会用到
apt-get install libssl-dev
#安装设备树编译器工具
apt-get install device-tree-compiler
#安装此库,否则内核编译时make menuconfig等会报错
apt-get install libncurses5-dev
#安装此库,否则内核编译报错
sudo apt-get install u-boot-tools
- 2.安装vivado
- 从官网下载WEB版的VIVADO Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin(我已上传到:Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin)
- 执行该.bin,安装方法以及界面都同WINDOWS版的VIVADO安装一样,运行该文件后首先通过GUI对安装进行配置
- 配置到选择器件支持时,尽可能将不需要的器件勾选掉(减少下载的大小)
- 配置完成后,等待下载,以及安装,即可
- 3.下载
从https://github.com/Xilinx,直接下载官方u-boot和kernel(linux-xlnx-master.zip、u-boot-xlnx-master.tar.gz) - 4.编译u-boot
- 定位编译环境
source /opt/Xilinx/SDK/2017.1/settings64.sh
- 进入u-boot目录
cd /home/hlf/mnt/u-boot-xlnx-master
- 打开GUI配置u-boot
make menuconfig
,但是这个GUI是空白的配置,所以要先载入一下xilinx的默认配置,再做修改(如下) - 在menu中,按方向键选择load,回车,载入xinlinx默认配置文件(输入zynq_ax7010_defconfig的绝对路径,我的是
/home/hlf/mnt/u-boot-xlnx-master/configs/zynq_ax7010_defconfig
)
- 然后将改动好的配置(本章不改动),再save到该路径,所需配置已保存到zynq_ax7010_defconfig文件里
- 针对刚刚的配置开始编译u-boot:
make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_ax7010_defconfig#读配置
make CROSS_COMPILE=arm-xilinx-linux-gnueabi-#编译
#arm-xilinx-linux-gnueabi-objdump -h u-boot #查看 u-boot 文件的不同段的内存分配情况
到这一步,把u-boot拷贝出来,并加后缀为u-boot.elf,待用
- 定位编译环境
- 5.生成BOOT.bin
- 启动SDK,新建一个FSBL模板,并在文件中
#define FSBL_DEGUG_INFO
以便看到调试信息,然后编译生成fsbl.elf
- 从SDK中将上述fsbl.elf、硬件的.bit文件、u-boot.elf打包成BOOT.bin
- 启动SDK,新建一个FSBL模板,并在文件中
- 6.生成uImage
- 进入目录
cd /home/hlf/mnt/linux-xlnx-master
- 定位编译环境
source /opt/Xilinx/SDK/2017.1/settings64.sh
- 打开GUI配置内核
make ARCH=arm menuconfig
- 在GUI中load一下xilinx的默认配置,load的路径为
/home/hlf/mnt/linux-xlnx-master/arch/arm/configs/xilinx_zynq_defconfig
- 在GUI中进行相关设置后(本章不改动),save到xilinx_zynq_defconfig里(也可以自己选择)
make ARCH=arm xilinx_zynq_defconfig #读配置
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage LOADADDR=0x00008000 #编译内核
- 编译完成后,在linux-xlnx-master/arch/arm/boot目录下可以发现uImage文件,待用
- 进入目录
- 7.生成devicetree.dtb
在linux-xlnx-master/arch/arm/boot/dts目录内新建或者找到zynq-7010.dts文件,内容为(注意一下串口和主频和硬件是否对应)&#