当前位置: 首页 > news >正文

网站会员注册系统建行网站用户名是什么

网站会员注册系统,建行网站用户名是什么,2019一个网站开发要多少钱,国内网站制作公司排名1)摘自【正点原子】领航者 ZYNQ 之linux驱动开发指南2)实验平台#xff1a;正点原子领航者ZYNQ开发板3)平台购买地址#xff1a;https://item.taobao.com/item.htm?id6061601087614)全套实验源码手册视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.ht…1)摘自【正点原子】领航者 ZYNQ 之linux驱动开发指南2)实验平台正点原子领航者ZYNQ开发板3)平台购买地址https://item.taobao.com/item.htm?id6061601087614)全套实验源码手册视频下载:http://www.openedv.com/docs/boards/fpga/zdyz_linhanz.html5)对正点原子FPGA感兴趣的同学可以加群讨论8767449006)关注正点原子公众号获取最新资料第二十章另一种方式编译ZYNQ镜像本篇是ARM Linux驱动开发篇中的第一章本章跟驱动开发并没有什么关系由于前面我们一直都是使用xilinx的petalinux工具编译镜像文件例如包括u-boot、linux内核、设备树、ZYNQ PL端的bitstream文件以及fsbl等虽然petalinux功能上比较全面但是在编译速度上太慢了完全是在浪费时间相信大家在使用petalinux的时候已经感受到了它给你带来的无奈之处为此笔者专门去研究了一下那本章笔者就带大家通过另外一种比较快的方式编译各种镜像文件。本章采用分步式的方式编译启动开发板所需要的各种镜像文件虽然步骤比较繁琐但灵活性比较高虽然本章使用的是另一种方式编译镜像但还是得需要用到petalinux提供的一些工具所以大家一定要安装petalinux。20.1由hdf文件得到bit文件.bit文件是zynq pl端所需要用到的bitstream文件例如我们使用petalinux-build命令完成工程编译之后会在images/linux目录会产生一个system.bit文件这个就是我们这里说到bitstream文件.bit可以通过.hdf硬件描述符文件得到怎么得到呢下面给大家说来。将ZYNQ开发板资料盘(A盘)4_SourceCodeZYNQ_70103_Embedded_Linuxvivado_proNavigator_7010Navigator_7010.sdk文件夹拷贝到Ubuntu系统目录下例如/home/zynq/hdf/目录大家根据自己的情况选择目录本实验以领航者7010为例如果大家用的是领航者7020则选择ZYNQ开发板资料盘(A盘)4_SourceCodeZYNQ_70203_Embedded_Linuxvivado_proNavigator_7020Navigator_7020.sdk文件夹。在Navigator_7010.sdk目录下有一个.hdf文件如下所示图 31.1.1 hdf文件接下来使用source命令执行petalinux的环境配置脚本settings.sh如下所示source /home/zynq/petalinux/v2018.3/settings.sh图 31.1.2 运行settings.sh脚本文件/home/zynq/petalinux/v2018.3是笔者的petalinux安装目录完成环境配置之后执行hsi命令进入到hsi命令模式如下所示hsi图 31.1.3 hsi命令行执行命令之后就可以进入到hsi命令行模式下了hsi命令行模式就跟我们的linux命令行模式差不多都可以执行命令只不过执行的命令不同hsi命令是petalinux工具提供的所以一定安装petalinux才行在这个模式下可以执行一些命令例如执行下面这条命令可以打开硬件设计文件hdf得到bit文件open_hw_design /home/zynq/hdf/Navigator_7010.sdk/design_navigator_7010_wrapper.hdf图 31.1.4 打开hdf文件Open_hw_design命令紧跟着的是hdf文件路径命令执行成功之后会在hdf文件所在目录下产生bit文件以及ps7_init命名的.c文件和.h文件如下所示(在hsi命令行模式下执行exit命令退出该模式)exit图 31.1.5 退出hsi命令行模式图 31.1.6 产生bit文件及其它文件从上图中可以看到在hdf文件所在目录下产生了design_navigator_7010_wrapper.bit文件以及.c和.h文件。20.2自动生成设备树文件Petalinux可以根据hdf文件描述的硬件信息自动配置U-Boot和内核所需的设备树文件那么我们也可以通过hsi命令来生成首先需要导入xilinx的device-tree仓库在我们提供的资料包中已经给大家准备好了路径为ZYNQ开发板资料盘(A盘)4_SourceCodeZYNQ_70103_Embedded_Linuxmiscdevice-tree-xlnx-xilinx-v2018.3.tar.gz大家也可以通过https://github.com/Xilinx/device-tree-xlnx/releases网址进行下载选择2018.3版本.tar.gz压缩格式文件如下所示图 31.2.1 设备树仓库下载Xilinx device-tree描述了设备与设备树之间的匹配关系将下载好或是资料包中的device-tree-xlnx-xilinx-v2018.3.tar.gz压缩文件拷贝到Ubuntu系统目录下例如/home/zynq/device-tree大家根据自己的情况选择然后将其解压当前目录解压之后会产生一个device-tree-xlnx-xilinx-v2018.3文件夹如下所示图 31.2.2 device-tree目录那么device-tree-xlnx-xilinx-v2018.3目录就是我们所需要的device-tree仓库。接下来我们执行hsi命令进入到hsi命令行模式执行下面这些命令open_hw_design /home/zynq/hdf/Navigator_7010.sdk/design_navigator_7010_wrapper.hdfset_repo_path /home/zynq/device-tree/device-tree-xlnx-xilinx-v2018.3create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0generate_target -dir /home/zynq/linux/dts图 31.2.3 生成设备树文件首先也是通过open_hw_design命令打开hdf文件然后使用set_repo_path命令设置device-tree仓库所在路径例如/home/zynq/device-tree/device-tree-xlnx-xilinx-v2018.3使用create_sw_design创建软件设计” -os device_tree”指定了软件设计的类型我们这里使用device-tree表示它是一个设备树类型” -proc ps7_cortexa9_0”指定处理器的名称在hsi命令模式下使用”xxxx -help”可以查看xxxx命令的用法说明这里就不给大家列举了最后使用generate_target命令去产生目标也就是我们的设备树文件” -dir /home/zynq/linux/dts”指定路径。此时我们可以退出hsi命令行模式进入到/home/zynq/linux/dts目录下可以看到自动配置产生的.dts和.dtsi文件如下所示图 31.2.4 生成设备树文件Linux设备树是是一个很重要的知识点将会在后面给大家详细说明本章先不讲这些文件后面我们会用到。20.3创建、编译fsbl工程fsbl(First Stage Boot Loader)是ZYNQ第一启动引导加载代码它的主要任务就是初始化DDR并将用户代码(例如U-Boot、bit文件或者是SDK裸机代码)从存储设备中拷贝到DDR中运行。在使用petalinux-build命令编译完成之后在images/linux目录下有一个zynq_fsbl.elf文件这个就是fsbl编译之后产生了elf格式文件同样也可以使用hsi命令来创建fsbl工程并进行编译。首先我们需要导入Xilinx embeddedsw存储库该embeddedsw仓库用于裸机应用例如fsbl、pmu固件、plm等在我们提供的资料包中已经给大家准备好了路径ZYNQ开发板资料盘(A盘)4_SourceCodeZYNQ_70103_Embedded_Linuxmiscembeddedsw-xilinx-v2018.3.tar.gz大家也可以从https://github.com/Xilinx/embeddedsw/releases网址进行下载选择2018.3版本.tar.gz压缩格式如下所示图 31.3.1 下载embeddedsw仓库将下载好或是资料包中的embeddedsw-xilinx-v2018.3.tar.gz压缩文件拷贝到Ubuntu系统目录下例如/home/zynq/embeddedsw大家根据自己的情况选择然后将其解压当前目录解压之后会产生一个embeddedsw-xilinx-v2018.3文件夹如下所示图 31.3.2 embeddedsw目录在Ubuntu中执行下面这条命令建立一个软链接文件gmake链接到makesudo ln -s /usr/bin/make /usr/bin/gmake图 31.3.3 建立gmake软链接文件因为在编译的过程中会用到gmake其实gmake就是GNU make的缩写Linux系统环境下的make就是GNU make之所有有gmake是因为在别的平台上make一般被占用GNU make只好叫gmake了比如在进行编译时要使用make命令但如果在非GNU系统中运行必须使用GNU make而不是使用系统自带的make版本这时要用gmake代替make进行编译。完成上面的工作之后我们就可以进行fsbl的创建与编译了执行hsi命令进入hsi命令行模式执行下面这些命令open_hw_design /home/zynq/hdf/Navigator_7010.sdk/design_navigator_7010_wrapper.hdfset hwdsgn design_navigator_7010_wrapper // 定义hwdsgn变量set_repo_path /home/zynq/embeddedsw/embeddedsw-xilinx-v2018.3 // 设置embeddedsw仓库路径set fsbl_dir /home/zynq/linux/fsbl // 定义fsbl_dir变量generate_app -hw $hwdsgn -os standalone -proc ps7_cortexa9_0 -app zynq_fsbl -compile -sw fsbl -dir $fsbl_dir图 31.3.4 编译fsbl-1图 31.3.5 编译fsbl-2首先还是使用open_hw_design命令打开hdf硬件描述符文件使用set_repo_path命令设置embeddedsw仓库所在路径例如/home/zynq/embeddedsw/embeddedsw-xilinx-v2018.3set命令用于定义变量我们使用set命令定义了一个hwdsgn变量等于design_navigator_7010_wrapper当执行generate_app命令的时候使用该变量定义了一个fsbl_dir变量定义了用于存放fsbl工程的路径最后使用generate_app命令产生和编译fsbl”-hw $hwdsgn”指定硬件设计的名字就是hdf文件去掉后缀即可”-os standalone”指定我们的app是一个无操作系统的裸机程序”-proc ps7_cortexa9_0”指定处理器”-app zynq_fsbl”指定app的名字(这个不能改)”-compile”表示要编译生成的源文件(如果不加的话则表示仅产生fsbl工程源码并不进行编译)”-sw fsbl”指定本软件设计的名字(这个名字可以自己定)”-dir $fsbl_dir”我们的fsbl工程存放的路径笔者这里以/home/zynq/linux/fsbl为例大家根据自己的情况设定。整个过程完成之后我们可以执行exit命令退出hsi命令行模式了此时/home/zynq/linux/fsbl目录下的内容如下所示图 31.3.6 fsbl工程源码目录/home/zynq/linux/fsbl就是我们通过hsi命令生成的fsbl对应的源码目录这个就像是在Windows下使用SDK软件创建了一个FSBL工程一样上图中的executable.elf文件fsbl工程编译之后得到elf格式文件得到fsbl源码工程之后我们就可以直接在fsbl工程目录进行编译了例如在/home/zynq/linux/fsbl目录下执行make clean命令对fsbl工程目录进行清理如下make clean图 31.3.7 清理工程我们可以修改Makefile文件将编译产生的fsbl镜像文件名字改为zynq_fsbl.elf在fsbl工程目录下打开Makefile文件修改EXEC变量如下所示vi Makefile图 31.3.8 修改EXEC变量将该变量由executable.elf修改为zynq_fsbl.elf除此之外我们还可以看到变量CC : arm-none-eabi-gcc这指定了编译fsbl时使用的交叉编译工具这个不用改修改完成之后保存退出即可我们直接在该目录下执行make命令即可编译如下make图 31.3.9 make编译fsbl工程编译成功之后产生的镜像文件就成了fsbl_zynq.elf如下所示图 31.3.10 fsbl镜像文件20.4编译U-Boot在中已经让大家把xilinx官方的U-Boot拷贝到Ubuntu系统中了并对他们进行了修改添加了一些自己定义的文件本篇教程不使用前面移植后的U-Boot我们用一份新的xilinx官方2018.3版本(这个版本是xilinx设定的版本其U-Boot版本为2018.01)的U-Boot源码源码已经提供给大家了路径为ZYNQ开发板资料盘(A盘)4_SourceCodeZYNQ_70103_Embedded_Linux资源文件甥潢瑯u-boot-xlnx-xilinx-v2018.3.tar.gz大家也可以通过https://github.com/Xilinx/u-boot-xlnx/releases网址进行下载。首先将U-Boot源码压缩包文件拷贝到Ubuntu系统目录中例如/home/zynq/linux/u-boot目录并将其解压到当前目录解压之后会产生一个u-boot-xlnx-xilinx-v2018.3文件夹进入到该目录下就可以看到U-boot源码目录下的文件和文件夹了如下所示图 31.4.1 U-Boot源码目录在前面给大家讲过使用petalinux-config -c u-boot命令可以对U-Boot进行配置、使用petalinux-build -c u-boot命令可以编译u-boot那么这些方法都是使用petalinux工具时的做法这里教大家如何在U-Boot源码目录下配置、编译而不通过petalinux-xxx命令关于U-Boot我们已经在前面给大家进行了详细的讲解包括Makefile文件、各个文件目录的作用以及源码的分析、U-Boot配置、U-Boot常用命令等等这里就不再讲解。1、添加设备树文件关于设备树的概念现在不给大家讲后面会说。除了Linux内核支持设备树之外我们使用的U-Boot也是支持设备树的在31.2小节中我们使用hsi命令生成了一些dts和dtsi的设备树源文件现在我们要用到它们了这些设备树文件都是根据我们的hdf硬件设计而自动生成的如果我们使用U-Boot中自带的设备树文件则不能满足我们的情况。将前面生成的设备树文件(笔者这里生成的设备树文件在/home/zynq/linux/dts目录下)pcw.dtsi、pl.dtsi、system-top.dts以及zynq-7000.dtsi四个文件拷贝到U-Boot源码目录下的arch/arm/dts目录下拷贝过去之后进入到arch/arm/dts目录下查看如下所示图 31.4.2 拷贝设备树文件到U-Boot接下来我们需要对system-top.dts文件进行一个简单地修改打开system-top.dts文件修改之前内容如下示例代码20.4.1 system-top.dts修改之前1 /* 2 * CAUTION: This file is automatically generated by Xilinx. 3 * Version: HSI 4 * Today is: Mon Mar 16 02:51:23 2020 5 */ 6 7 8 /dts-v1/; 9 #include zynq-7000.dtsi10 #include pl.dtsi11 #include pcw.dtsi12 / {13 chosen {14 bootargs earlycon;15 stdout-path serial0:115200n8;16 };17 aliases {18 ethernet0 gem0;19 i2c0 i2c_2;20 i2c1 i2c0;21 i2c2 i2c1;22 serial0 uart0;23 serial1 uart1;24 spi0 qspi;25 };26 memory {27 device_type memory;28 reg 0x0 0x20000000;29 };30 };这里我们对该文件进行一个简单地修改修改之后如下所示示例代码20.4.2 system-top.dts修改之后1 /* 2 * CAUTION: This file is automatically generated by Xilinx. 3 * Version: HSI 4 * Today is: Mon Mar 16 02:51:23 2020 5 */ 6 7 8 /dts-v1/; 9 #include zynq-7000.dtsi10 #include pl.dtsi11 #include pcw.dtsi12 / {13 model Alientek ZYNQ Development Board;14 15 chosen {16 bootargs consolettyPS0,115200 earlyprintk root/dev/mmcblk0p2 rw rootwait;17 stdout-path serial0:115200n8;18 };19 aliases {20 ethernet0 gem0;21 i2c0 i2c_2;22 i2c1 i2c0;23 i2c2 i2c1;24 serial0 uart0;25 serial1 uart1;26 spi0 qspi;27 };28 memory {29 device_type memory;30 reg 0x0 0x20000000;31 };32 };33 34 gem0 {35 local-mac-address [00 0a 35 00 1e 53];36 };37 38 qspi {39 #address-cells 1;40 #size-cells 0;41 flash0: flash0 {42 compatible n25q512a,micron,m25p80;43 reg 0x0;44 #address-cells 1;45 #size-cells 1;46 spi-max-frequency 50000000;47 partition0x00000000 {48 label boot;49 reg 0x00000000 0x00500000;50 };51 partition0x00500000 {52 label bootenv;53 reg 0x00500000 0x00020000;54 };55 partition0x00520000 {56 label kernel;57 reg 0x00520000 0x00a80000;58 };59 partition0x00fa0000 {60 label spare;61 reg 0x00fa0000 0x00000000;62 };63 };64 };修改完成之后保存退出即可以上主要修改了bootargs属性、添加了model属性、网口0的MAC地址以及给qspi进行了分区操作。修改完成之后我们还需要将system-top.dts文件添加到arch/arm/dts/Makefile文件中找到dtb-$(CONFIG_ARCH_ZYNQ)这里将system-top.dtb(.dts编译之后得到的就是.dtb文件)添加上去这样当CONFIG_ARCH_ZYNQ宏被选中的时候system-top.dts才会被编译进去如下所示图 31.4.3 添加system-top.dtb文件注意在zynq-zybo.dtb后面加上一个反斜杠””跟上面的保持一致。添加好之后保存退出文件。2、修改zynq-common.h和zynq_zc70x.h配置文件include/configs/目录下有很多的配置文件该目录下的配置文件中有很多宏定义这些宏定义将会在编译U-Boot源码时会被用到前面我们使用petalinux工具的时候并没有去配置U-Boot、内核等原因在于petalinux确实比较智能它能够根据hdf文件记录的信息自动配置例如一些时钟频率、外设时钟、环境变量偏移量等。zynq-common.h和zynq_zc70x.h都在include/configs目录下zynq-common.h是xilinx提供的用于配置zynq系列处理器的通用配置文件zynq-common.h头文件被zynq_zc70x.h包含下面我们要对这两个头文件进行一些简单地修改首先对zynq_zc70x.h文件进行修改修改之前如下所示示例代码20.4.3 zynq_zc70x.h修改之前1 /* 2 * (C) Copyright 2013 Xilinx, Inc. 3 * 4 * Configuration settings for the Xilinx Zynq ZC702 and ZC706 boards 5 * See zynq-common.h for Zynq common configs 6 * 7 * SPDX-License-Identifier: GPL-2.0 8 */ 9 10 #ifndef __CONFIG_ZYNQ_ZC70X_H11 #define __CONFIG_ZYNQ_ZC70X_H12 13 #define CONFIG_ZYNQ_I2C014 #define CONFIG_ZYNQ_EEPROM15 16 #include 17 18 #endif /* __CONFIG_ZYNQ_ZC70X_H */这里我们要把CONFIG_ZYNQ_I2C0和CONFIG_ZYNQ_EEPROM宏定义给去掉原因就是我不想在U-Boot中使用I2C设备直接给去掉修改之后如下示例代码20.4.4 zynq_zc70x.h修改之后1 /* 2 * (C) Copyright 2013 Xilinx, Inc. 3 * 4 * Configuration settings for the Xilinx Zynq ZC702 and ZC706 boards 5 * See zynq-common.h for Zynq common configs 6 * 7 * SPDX-License-Identifier: GPL-2.0 8 */ 9 10 #ifndef __CONFIG_ZYNQ_ZC70X_H11 #define __CONFIG_ZYNQ_ZC70X_H12 13 #include 14 15 #endif /* __CONFIG_ZYNQ_ZC70X_H */接下来修改zynq-common.h文件打开该文件修改CONFIG_CPU_FREQ_HZ(ARM主频)将频率由800000000修改为666666687(如果是7020核心板则修改为766666687)示例代码20.4.5 zynq-common.h修改内容-112 13 /* CPU clock */14 #ifndef CONFIG_CPU_FREQ_HZ15 # define CONFIG_CPU_FREQ_HZ 66666668716 #endif17接下来修改CONFIG_SF_DEFAULT_SPEED(默认的QSPI速率)由30000000改为50000000如下所示示例代码20.4.6 zynq-common.h修改内容-250 51 /* QSPI */52 #ifdef CONFIG_ZYNQ_QSPI53 # define CONFIG_SF_DEFAULT_SPEED 5000000054 #endif55修改CONFIG_ENV_SIZE(环境变量大小)由(128 10)修改为0x20000示例代码20.4.7 zynq-common.h修改内容-3148 149 /* Total Size of Environment Sector */150 #ifdef CONFIG_ENV_IS_IN_EEPROM151 # define CONFIG_ENV_SIZE CONFIG_SYS_EEPROM_SIZE152 # define CONFIG_EXTRA_ENV_SETTINGS153 #else154 # define CONFIG_ENV_SIZE 0x20000155 #endif156修改CONFIG_ENV_OFFSET(环境变量存储位置偏移量)由0xE0000修改为0x500000[size13.3333px]示例代码20.4.8 zynq-common.h修改内容-4163 164 /* cc108 requires to be 0xF00000 to have boot.bin with bitstream included */165 # ifndef CONFIG_ENV_OFFSET166 # define CONFIG_ENV_OFFSET 0x500000167 # endif168 #endif169 需要注意CONFIG_ENV_SIZE和CONFIG_ENV_OFFSET这两个是U-Boot环境变量存储有关的在下面menuconfig配置U-Boot的时候我们会将环境变量存储在QSPI中CONFIG_ENV_SIZE指定了环境变量分区的大小CONFIG_ENV_OFFSET指定环境变量分区的偏移量这些都与QSPI的分区表有关修改完成之后保存退出即可接下来就可以正式使用make命令进行配置和编译了。3、defconfig配置在U-Boot的源码目录下执行下面这条命令对xilinx官方的U-Boot进行defconfig配置如下所示make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- zynq_zc702_defconfig图 31.4.4 defconfig配置“ARCHarm”指定了u-boot运行的机器架构“CROSS_COMPILEarm-linux-gnueabihf-”指定了交叉编译工具的前缀交叉编译工具我们使用的是xilinx官方提供的在我们安装petalinux的时候也安装了在petalinux安装目录下的tools/linux-i386目录如下所示图 31.4.5 交叉编译工具链安装目录gcc-arm-linux-gnueabi和gcc-arm-none-eabi两个目录下安装的是两种不同的交叉编译工具链(其它那几个目录安装的也是交叉编译工具链对于ZYNQ 7010/7020来说用不上)两者之间的区别大家可以简单地理解为gcc-arm-linux-gnueabi一般用于编译linux系统的源码例如ARM Linux内核源码、ARM Linux应用程序等而gcc-arm-none-eabi一般用于编译ARM裸机程序例如我们前面编译fsbl代码的时候用的就是它这么一说的话那我们编译U-Boot应该用gcc-arm-none-eabi咯但这里我们用的是gcc-arm-linux-gnueabi主要笔者看到xilinx wiki文档中用的也是这个那就这个吧。交叉编译命令就在安装目录下的bin文件夹中例如图 31.4.6 交叉编译命令CROSS_COMPILE指定的就是这些命令的前缀我们在前面source petalinux目录下的settings.sh脚本时已经将它们的路径导出到环境变量了所以不用加全路径。zynq_zc702_defconfig是xilinx为7010/7020添加的配置文件所以我们也是使用这个4、menuconfig图形化配置U-Boot图形化配置前面已经给大家讲过了在U-Boot源码目录下执行下面这条命令进入到menuconfig图形化配置界面make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- menuconfig图 31.4.7 menuconfig配置各个配置项就不给大家一一讲解了相信大家通过前面的学习已经对U-Boot的menuconfig图形化配置有一定的认识和理解了接下来我直接把配置列出来Boot media --- Support for booting from SD/EMMC // 选择SPL / TPL --- [ ] Enable SPL // 取消Command line interface --- Memory commands --- [ ] eeprom - EEPROM subsystem // 取消 Device access commands --- [ ] i2c // 取消Device Tree Control --- (system-top) Default Device Tree for DT control // 将设备树设置为system-top(也就是system-top.dts)Device Drivers --- Serial drivers --- [ ] Enable an early debug UART for debugging // 取消配置完成之后保存退出执行下面这条命进行编译make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- all -j10图 31.4.8 编译U-Boot编译完成之后将会在当前目录下生成一个u-boot文件、u-boot.bin文件以及其它一些文件如下所示图 31.4.9 编译完成u-boot文件是elf格式的镜像文件而u-boot.bin则是纯二进制格式的镜像文件。20.5编译kernel同样本篇教程不使用前面移植后的Linux内核源码我们用一份新的xilinx官方2018.3版本(这个版本是xilinx设定的版本其linux版本为4.14.0)的内核源码源码已经提供给大家了路径为ZYNQ开发板资料盘(A盘)4_SourceCodeZYNQ_70103_Embedded_Linux资源文件kernellinux-xlnx-xilinx-v2018.3.tar.gz大家也可以通过https://github.com/Xilinx/linux-xlnx/releases网址进行下载。将内核源码压缩包文件拷贝到Ubuntu系统目录中例如/home/zynq/linux/kernel目录并将其解压到当前目录解压之后会产生一个linux-xlnx-xilinx-v2018.3文件夹进入到该目录下就可以看到内核源码目录下的文件和文件夹了如下所示图 31.5.1 内核源码目录本小节我们也是直接在内核源码目录下进行编译而不使用petalinux工具其实这些知识前面都已经给大家介绍过了。1、添加设备树文件这里我们直接将前面U-Boot源码arch/arm/dts目录下的那四个设备树文件(pl.dtsi、pcw.dtsi、system-top.dts和zynq-7000.dtsi)直接拷贝到内核源码目录下的arch/arm/boot/dts目录中不用进行修改。同样我们也需要修改arch/arm/boot/dts目录下的Makefile文件将设备树添加上去如下图 31.5.2 Makefile中添加设备树修改完成之后保存退出即可2、defconfig配置在内核源码目录下执行下面这条命令对内核进行defconfig配置make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- xilinx_zynq_defconfig图 31.5.3 defconfig配置命令这里就不给大家解释了前面我们已经解释过内核的配置、编译方式基本跟U-Boot是一样的需要注意的是命令中间的空格不要漏掉了因为以前发现很多初学者老是会漏掉这些空格这样就导致命令执行失败。3、menuconfig配置这里我们暂时就不进行配置以后有需要的时候再配先保持默认4、编译内核执行下面这条命令编译内核源码make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- zImage -j10图 31.5.4 编译内核图 31.5.5 编译完成编译完成之后会在arch/arm/boot/目录下生成一个名为zImage的内核镜像文件后面我们在用。5、编译设备树内核与u-boot不同的是U-Boot的设备树默认是与内核一起编译的并且产生的dtb文件已经与U-Boot镜像文件集成在一起了在内核里边我们需要单独编译出设备树的dtb文件前面已经将我们所需要的设备树文件拷贝到内核的arch/arm/boot/dts目录下了接下来执行这条命令编译system-top.dtb文件make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- system-top.dtb -j10图 31.5.6 编译设备树编译成功之后会在arch/arm/boot/dts目录下生成system-top.dtb文件。20.6编译rootfs根文件系统我们直接使用petalinux进行编译即可首先进入petalinux的安装目录使用petalinux-create命令新建一个petalinux工程如下petalinux-create --type project --template zynq --name ALIENTEK-ZYNQ图 31.6.1 新建petalinux工程进入到ALIENTEK-ZYNQ工程目录下执行petalinux-config --get-hw命令导入hdf硬件描述符文件cd ALIENTEK-ZYNQpetalinux-config --get-hw-description /home/zynq/hdf/Navigator_7010.sdk图 31.6.2 导入hdf文件这里用的hdf文件就是31.1小节中使用的在弹出来的配置界面中我们不用进行任何配置直接保存退出即可等待它配置完成。接下来直接编译根文件系统petalinux-build -c rootfs图 31.6.3 编译根文件系统等待其编译完成完成之后产生的根文件系统压缩包在images/linux目录下如下所示图 31.6.4 产生的根文件系统压缩包因为我们要使用SD卡启动并且SD卡会有一个EXT4格式的分区专门存放根文件系统所以我们要使用压缩格式的根文件系统例如rootfs.tar.gz或rootfs.tar.bz2。20.7启动开发板经过上面一系列的过程之后我们就已经得到了启动开发板的所有所需的镜像文件了。例如我们使用petalinux工具会生成image.ub和BOOT.BIN文件使用这两个文件我们就可以启动开发板了但是这里我们不这样做。前面给大家介绍过image.ub这个文件的本质那么它其实是多个文件组合在一起的包括内核镜像、dtb以及根文件系统这样的做法有一个弊端不够灵活一个变了整个image.ub文件就得重新制作一遍很麻烦。同样BOOT.BIN文件是fsbl镜像、u-boot镜像以及pl端bit文件集合在一起的那么既然是集合在一起的那么我们单独使用也是可以的嘛。所以我们这里的思路就是将内核镜像文件zImage、内核设备树文件以及根文件系统从image.ub文件中分离出来而将bit文件从BOOT.BIN文件中分离出来这样做之后我们的SD卡中将会存在5部分内容zImage、dtb、rootfs、bit以及BOOT.BIN(fsbl镜像与u-boot镜像的集合体)明确之后我们将他们拷贝到我们的SD卡中。1、制作SD启动卡SD启动卡的制作方式在17.2.10小节当中已经给大家介绍过了这里不再细说笔者直接将一张16G的TF卡格式化了2个分区FAT32和EXT4如下所示图 31.7.1 SD启动卡分区信息2、拷贝镜像到FAT分区将前面过程当中生成的各种镜像文件拷贝到SD启动卡的FAT分区包括zImage(内核镜像内核源码目录arch/arm/boot/zImage)、system-top.dtb(内核设备树dtb文件内核源码目录arch/arm/boot/dts/system-top.dtb)、design_navigator_7010_wrapper.bit(pl端bitstream文件/home/zynq/hdf/Navigator_7010.sdk/design_navigator_7010_wrapper.bit)。大家根据自己前面步骤当中文件存放的目录去找到相应的这些镜像文件。接下来我们需要将BOOT.BIN文件拷贝到FAT分区但是前面的过程中我们并没有生成BOOT.BIN文件这里就需要使用前面生成的u-boot(U-Boot elf格式镜像U-Boot源码目录u-boot)和zynq_fsbl.elf(fsbl elf格式镜像/home/zynq/linux/fsbl/zynq_fsbl.elf)来制作BOOT.BIN文件。首先我们进入到U-Boot源码目录下将生成的u-boot文件重命名为u-boot.elf如下所示mv u-boot u-boot.elf图 31.7.2 u-boot重命名为啥要重命名呢因为笔者发现使用petalinux-package命令制作BOOT.BIN文件的时候如果elf格式文件没有带.elf后缀名会识别不了。接下来我们就可以用petalinux-package命令去生成BOOT.BIN文件了在U-Boot源码目录下执行下面这条命令petalinux-package --boot -p /home/zynq/petalinux/v2018.3/ALIENTEK-ZYNQ --fsbl /home/zynq/linux/fsbl/zynq_fsbl.elf --u-boot ./u-boot.elf -o ./BOOT.BIN --force图 31.7.3 生成BOOT.BIN文件petalinux-package命令前面已经给大家介绍过了”-p”选项指定一个petalinux工程如果直接在petalinux工程目录下运行该命令则不需要用”-p”指定”--fsbl”指定fsbl的elf格式镜像” --u-boot”指定U-Boot的elf格式镜像文件大家根据自己的路径情况进行修改”-o”选项指定输出文件的名字以及存放的路径例如这里是将BOOT.BIN文件存放在当前目录下命令执行完成之后就会在当前目录下生成一个BOOT.BIN文件如上图所示。我们使用ls查看下它的大小图 31.7.4 BOOT.BIN文件大小我们发现它只有600多K但是u-boot.elf文件可是有4M多的而zynq_fsbl.elf文件也有600多K为啥合成为BOOT.BIN文件之后只有600多K了呢原因在于格式问题elf格式文件中除了机器码之外还包含了很多额外的信息例如符号表、调试信息、重定位表、运行地址和加载地址等信息量很大所以导致elf文件很大例如linux下的应用程序就是elf格式的程序加载运行的时候会去解析但是裸机下不能用elf格式包括内核镜像和U-Boot镜像等都不能用elf格式而bin文件则是最纯粹的二进制机器代码没有任何多余的信息所以文件小。使用petalinux-package命令生成的BOOT.BIN文件的时候它会解析我们给定的elf格式文件获取它的运行地址、加载地址以及真正的二进制机器代码然后再把它俩集合起来所以BOOT.BIN文件就是一个.bin格式的文件所以它小相信说到这里大家应该明白了需要注意我们生成的BOOT.BIN文件中并不包含bit文件前面已经跟大家说过了。之后将BOOT.BIN文件也拷贝到SD启动卡的FAT分区那么此时来看看我们的FAT分区有哪些文件图 31.7.5 FAT分区文件列表为了方便、好看笔者将design_navigator_7010_wrapper.bit文件和system-top.dtb文件进行了重命名分别为system.bit和system.dtb如下图 31.7.6 文件重命名3、将根文件系统解压到EXT4分区接下来我们需要将31.6小节编译的根文件系统压缩包文件解压到SD启动卡的EXT4分区这里笔者使用rootfs.tar.gz压缩包文件进入到rootfs.tar.gz压缩包文件所在目录执行解压命令图 31.7.7 解压rootfs.tar.gz/media/zynq/ext4是笔者的SD启动卡对应的EXT4分区的挂载点注意解压的时候需要使用前面要加sudo也就是要以root用户的身份进行解压。解压完成之后执行sync命令将数据同步到SD卡中之后卸载SD启动卡卸载成功之后拔掉它图 31.7.8 卸载SD启动卡4、启动开发板将我们做好的启动卡插入开发板连接电源、串口启动打印信息如下所示图 31.7.9 开发板启动在U-Boot启动2秒倒计时之前按回车或者是空格键停止启动进入到U-Boot的命令行模式因为现在不能直接启动我们需要对U-Boot环境变量进行修改在U-Boot命令行下执行下面这些命令设置环境变量如下所示图 31.7.10 设置环境变量示例代码20.7.1 U-Boot环境变量设置Zynq setenv bitstream_load_address 0x100000Zynq setenv bitstream_image system.bitZynq setenv bitstream_size 0x300000Zynq setenv kernel_image zImageZynq setenv devicetree_image system.dtbZynq Zynq setenv sdboot if mmcinfo; then run uenvboot; echo Copying Linux from SD to RAM... load mmc 0 ${bitstream_load_address} ${bitstream_image} fpga loadb 0 ${bitstream_load_address} ${bitstream_size} load mmc 0 ${kernel_load_address} ${kernel_image} load mmc 0 ${devicetree_load_address} ${devicetree_image} bootz ${kernel_load_address} - ${devicetree_load_address}; fi关于U-Boot命令的使用在前面已经给大家讲解过不过这里也给大家简单地说明一下我们设置的这些环境变量的作用首先第一条命令我们设置了bitstream_load_address变量存放bitstream文件从SD卡中拷贝到内存中的地址第二条命设置了bitstream_image变量等于SD卡中bitstream文件的名字也就是system.bit第三条命设置了bitstream_size变量等于bitstream文件的大小第四条命令设置了kernel_image变量等于SD卡中内核镜像的名字也就是zImage第五条命令设置了devicetree_image变量等于SD卡中内核设备树dtb文件的名字也就是system.dtbkernel_image和devicetree_image我们的这个U-Boot中默认是有的只不过它们的内容并不是我们SD中的文件名所以需要重新设定。最后一条命令设置了sdboot变量其实这个变量在我们使用的这个U-Boot中也是存在的这里也是对他重新定义这个变量的内容很长我们可以把它的内容整理一下如下示例代码20.7.2 sdboot变量内容整理if mmcinfo; then run uenvboot; echo Copying Linux from SD to RAM... // 打印字符串 load mmc 0 ${bitstream_load_address} ${bitstream_image} // 从SD卡拷贝bitstream文件到内存 fpga loadb 0 ${bitstream_load_address} ${bitstream_size} // 从内存中加载bitstream数据到FPGA load mmc 0 ${kernel_load_address} ${kernel_image} // 从SD卡拷贝内核镜像到内存 load mmc 0 ${devicetree_load_address} ${devicetree_image} // 从SD卡拷贝设备树到内存 bootz ${kernel_load_address} - ${devicetree_load_address}; // bootz启动内核fi“”符号其实就是C语言中”与”跟C语言里面的作用一毛一样${xxx}就是变量的引用if … fi这个就是if条件判断语句了fi表示条件判断的结束U-Boot里边的这种语法很简单地就不给大家细说了如果不明白可以在网上找找资料。前面跟大家讲过U-Boot中的bootcmd变量的作用U-Boot启动内核或在命令行下执行boot命令时其实就是去执行bootcmd那我们来看看bootcmd的内容是什么图 31.7.11 bootcmd的内容图 31.7.12 modeboot的内容所以从上面可以知道bootcmd的内容其实就是运行sdboot也就是上面定义的那个。变量设置完成之后执行saveenv保存环境变量到QSPI Flash中那么下次就不用再设置了图 31.7.13 保存环境变量保存完成执行boot命令启动内核图 31.7.14 启动内核启动完成之后登陆系统(用户名和密码都是root)图 31.7.15 登陆系统后面我们的驱动开发篇将以本章使用的U-Boot源码、内核源码等进行开发工作20.8tcl脚本前面我们在hsi终端下通过执行相应的命令去获取bit文件、自动生成设备树以及构建一个fsbl源码等觉得这样非常的不方便每次都要先执行hsi命令进入到hsi终端模式然后在一个一个命令敲这样感觉非常不好那可不可以像shell命令一样创建一个shell脚本之类的呢其实是可以的我们可以创建一个后缀名为.tcl的脚本然后把我们的命令添加上去然后直接执行这个脚本就行了。例如我在Ubuntu目录下新建一个hsi_test.tcl文件内容如下所示1 2 hsi::open_hw_design /home/zynq/hdf/Navigator_7010.sdk/design_navigator_7010_wrapper.hdf文件中的hsi::open_hw_design xxx.hdf就表示执行his的open_hw_design命令后面跟着的参数就是对应的hdf文件路径了例如我们将31.2小节中执行的命令写入到hsi_test.tcl脚本中如下所示示例代码20.8.1 tcl脚本示例 hsi_test.tcl内容 1 # tcl script test 2 3 hsi::open_hw_design /home/zynq/hdf/Navigator_7010.sdk/design_navigator_7010_wrapper.hdf 4 hsi::set_repo_path /home/zynq/device-tree/device-tree-xlnx-xilinx-v2018.3 5 hsi::create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0 6 hsi::generate_target -dir /home/zynq/linux/dts 7第一行#号表示注释。那我们如何执行hsi_test.tcl脚本呢执行方法如下所示xsct hsi_test.tcl图 31.8.1 运行hsi_test.tcl脚本“xsct xxx.tcl”即可xsct也是petalinux工具安装的时候自带的它也是命令行终端例如运行xsct命令就会进入到xsct终端模式如下所示图 31.8.2 xsct终端例如我们在xsct终端下也可以执行脚本中的命令例如图 31.8.3 xsct运行hsi命令所以当我们执行”xsct hsi_test.tcl”命令时其实就是类似于将hsi_test.tcl交给xsct去解析并运行。关于xsct、hsi以及tcl脚本等更多的内容这里就不讲了笔者对这些没有什么深入的了解如果大家感兴趣自己去网上找找相关的资料。
http://www.zqtcl.cn/news/666987/

相关文章:

  • 山东省职业能力建设处网站dz论坛怎么做视频网站吗
  • 郑州专业做网站的公司今天郑州最新通告
  • wap网站引导页特效wordpress 文章 数据库
  • 做建筑效果图最好的网站做网站是如果盈利的
  • 企业网站seo托管怎么做seo公司培训
  • 自己做网站不想买空间 自己电脑可以做服务器吗?下载建设网站软件
  • 有服务器自己怎么做网站百度广告电话号码是多少
  • 一个网站 两个数据库沈阳市住房和城乡建设厅网站
  • 重庆建站网站流程及费用制作网页界面工具
  • 设计师家园官网wordpress 4.9 优化
  • 主机屋空间安装织梦后台程序后怎么弄成淘宝客网站襄阳网站制作
  • 怎么建设分销模式手机网站宜昌做网站的公司
  • 网上商城网站设计网页设计作业欣赏
  • 育才网站建设网站访问慢原因
  • 网站建设方案 备案品牌网站推广软件
  • 桓台县建设局网站前端开发入门培训
  • 前端怎么在猪八戒网站接单做烟台网站开发技术
  • 济南烨铭网站建设做英文网站2014
  • 哪个餐饮店微网站做的有特色3d动画制作收费标准
  • h5旅游网站开发wordpress的站点地址如何配置
  • 网站正在维护中 模板招远网站建设
  • 福田欧曼银河报价seo文章是什么
  • 古云网站建设模具培训网站建设
  • 帮助企业做网站的销售卫浴洁具公司网站模板
  • 解释seo网站推广网站域名和空间费用
  • 深圳市珠宝网站建设手机网站框架
  • 晋城推广型网站开发dw做网站模板
  • 万网一个ip建立多个网站网页设计注册页面代码
  • 网站建设6000元地方门户网站有哪些
  • 十大SEO网站外链建设误区排版设计教程入门初学者