上篇讲的官方推荐的编译方式,由于前面我们一直都是使用 xilinx 的 petalinux 工具编译镜像文件,例如包括 u-boot、 linux 内核、设备树、 ZYNQ PL 端的 bitstream 文件以及 fsbl 等,虽然 petalinux 功能上比较全面,但是在编译速度上太慢了,而且一旦hdf更换会带来整个工程的重新配置和编译,而且像我这种不细看手册的,甚至连kernel的源码都找不到在哪儿,tmp目录下的完全改了不起作用好不好,于是在没有找到本地kernel源码之前 采取了一种非官方的迂回展示(上篇讲到了官方怎么设置本地kernel源码)单独将kernel源码取出来交叉编译,然后利用petalinux的小脚本在和官方生成的设备树和文件系统生成image.ub(基于原子交叉编译kernel的方法加以完善修改,因为至今没找到his命令行的哭泣)
准备工作 先将之前编译好的任何一个工程里/build/tmp/work-shared/plnx-zynq7/kernel-source的源码压缩copy出来,
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 文件,将设备树添加上去,如下:
1002 wm8850-w70v2.dtb 1003 dtb-$(CONFIG ARCH ZYNQ) += \ 1004 zynq-cc108.dtb \ 1005 zynq-microzed.dtb \ 1006 zynq-parallella.dtb \ 1007 zynq-zc702.dtb\ 1008 zynq-zc706.dtb \ 1009 zynq-zc770-xm010.dtb \ 101日 zynq-zc770-xm011.dtb / 1011 zynq-zc770-xm012.dtb 1012 zynq-zc770-xm013.dtb \ 1013 zynq-zed.dtb\ 1014 zyng-zybo.dtb 1015 system-top.dtb 1017 1016 dtb-$(CONFIG MACH ARMADA_370)+= \ armada-370-db.dtb \ Hx--1024
修改完成之后保存退出即可
2、 defconfig 配置
在内核源码目录下执行下面这条命令对内核进行 defconfig 配置:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
3、 menuconfig 配置
如果有单独需要配置的执行之后执行menuconfig即可上一步是默认设置
4、 编译内核
执行下面这条命令编译内核源码:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j10
编译完成之后会在 arch/arm/boot/目录下生成一个名为 zImage 的内核镜像文件,后面我们再用。
5、编译设备树
内核与 u-boot 不同的是, U-Boot 的设备树默认是与内核一起编译的,并且产生的 dtb 文件已经与 U-Boot 镜像文件集成在一起了;在内核里边我们需要单独编译出设备树的 dtb 文件,前面已经将我们所需要的设备树文件拷贝到内核的 arch/arm/boot/dts 目录下了,接下来执行这条命令编译 system-top.dtb 文件:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb -j10
然后呢我们知道image.ub文件是有mkimage生成的
/build/tmp/deploy/images/plnx_arm/fitimage.its里面的内容
/ { description = "U-Boot fitImage for plnx_arm kernel"; #address-cells = <1>; images { kernel@0 { description = "Linux Kernel"; data = /incbin/("/home/flinn/peta/peta_top/build/tmp/deploy/images/plnx_arm/zImage"); type = "kernel"; arch = "arm"; os = "linux"; compression = "none"; load = <0x8000>; entry = <0x8000>; hash@1 { algo = "sha1"; }; }; fdt@0 { description = "Flattened Device Tree blob"; data = /incbin/("/home/flinn/peta/peta_top/build/tmp/deploy/images/plnx_arm/plnx_arm-system.dtb"); type = "flat_dt"; arch = "arm"; compression = "none"; hash@1 { algo = "sha1"; }; }; ramdisk@0 { description = "ramdisk"; data = /incbin/("/home/flinn/peta/peta_top/build/tmp/deploy/images/plnx_arm/petalinux-user-image-plnx_arm.cpio.gz"); type = "ramdisk"; arch = "arm"; os = "linux"; compression = "none"; hash@1 { algo = "sha1"; }; }; }; configurations { default = "conf@1"; conf@1 { description = "Boot Linux kernel with FDT blob + ramdisk"; kernel = "kernel@0"; fdt = "fdt@0"; ramdisk = "ramdisk@0"; hash@1 { algo = "sha1"; }; }; conf@2 { description = "Boot Linux kernel with FDT blob"; kernel = "kernel@0"; fdt = "fdt@0"; hash@1 { algo = "sha1"; }; }; }; };
同时还能得出三个来源
/home/flinn/peta/peta_top/build/tmp/deploy/images/plnx_arm/zImage /home/flinn/peta/peta_top/build/tmp/deploy/images/plnx_arm/plnx_arm-system.dtb /home/flinn/peta/peta_top/build/tmp/deploy/images/plnx_arm/petalinux-user-image-plnx_arm.cpio.gz
可以修改.its文件,替换交叉编译生成的zimage和设备树文件,文件系统压缩包可以用原来的之后执行下面的命令就可以生成新的image.ub了!(注意生成的大小哦四兆五兆左右的是不带文件系统的,因为its文件由两种,可以仔细阅读里面包不包括文件系统,正常大小在十兆左右)
mkimage -f fitimage.its image.ub
其他部分的等到下次用的时候再行补充吧,全部交叉编译也是可以做到的,毕竟petalinux高级于交叉编译的优点就是自己生成的设备树文件了,实际上sdk也是可以直接生成的,毕竟现在还在初级阶段,先用着官方的简易模式吧,虽然效率上确实是差了一点