FPGA ZYNQ Linux内核分离编译

1 开发模式

image.png image.png

  • 编写 linux 驱动的时候,经常改动的要素有设备树文件、linux 内核、根文件系统,当然如果改动 PL 的话还需改动 bit 文件。因而我们将这些要素独立出来,从而方便修改变更。也就是说我们将 bit 文件从原先的 BOOT.BIN 文件独立出来,将 image.ub 文件分开为内核 zImage和设备树dtb。另外将根文件系统放到 SD 卡的

2 BOOT.BIN 剥离出bitStream文件

  • 先在 Ubuntu 主机终端中选一个合适的路径以创建出厂镜像的 Petalinux 工程,然后在终端中输入如下命令:
    source /opt/pkg/petalinux/2018.3/settings.sh //设置 petalinux 工作环境
    petalinux-create -t project --template zynq -n ALIENTEK-ZYNQ //创建 Petalinux 工程
    cd ALIENTEK-ZYNQ //进入到 petalinux 工程目录下
    petalinux-config --get-hw-description ../hdf/Navigator_7010.sdk/  //导入 hdf 文件
复制代码

image.png

  • 进入“Subsystem AUTO Hardware Settings”子菜单下的“Advanced bootable imagesstorage Settings”菜单中,移动到“dtb image settings”选项,并将 image storage media 设置为 primary sd

image.png

  • 进入到“Image Packaging Configuration”菜单下的“Root filesystem type (INITRAMFS)”子菜单下

image.png

  • 配置完成后,编译 uboot,及生成 BOOT.BIN 文件
    petalinux-build -c u-boot
    petalinux-package --boot --fsbl --u-boot --force
复制代码

image.png

3 image.ub剥离出ZImage/设备树/根文件

  • 生成设备树文件,在 Petalinux 工 程 中 执 行 编 译 uboot 后 , 会 在 工 程 的components/plnx_workspace/device-tree/device-tree/目录下生成设备树文件,红框圈出的是我们需要用到的设备树文件,skeleton.dtsi 文件我们一般不用。

image.png

  • 内核源码,用新xilinx 官方 2018.3 版本( 这个版本是 x xilinx 设定的版本,其 x linux 版本为 4.14.0)的内核源码

image.png

3.1 修改设备树文件

  • 将前面生成的设备树文件(生成的设备树文件在Petalinux 工程components/plnx_workspace/device-tree/device-tree/目录下)pcw.dtsi、pl.dtsi、system-top.dts 以及 zynq-7000.dtsi 四个文件直接拷贝到内核源码目录下的 arch/arm/boot/dts 目录中。

3.2 编译内核

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j10
复制代码

image.png

  • 编译完成之后会在 arch/arm/boot/目录下生成一个名为 zImage 的内核镜像文件

3.3 编译设备树

  • 在内核里边我们需要单独编译出设备树的 dtb 文件,前面已经将我们所需要的设备树文件拷贝到内核的 arch/arm/boot/dts 目录下了,接下来执行下面这条命令编译 system-top.dtb文件:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb -j10
复制代码
  • 编译成功之后会在 arch/arm/boot/dts 目录下生成 system-top.dtb 文件
  • 为了方便、好看,笔者将 system-top.dtb 文件进行了重命名 system.dtb

image.png

3.4 编译 rootfs

petalinux-config -c rootfs
复制代码
  • 进入“Image Features --->”菜单下,使能“debug-tweaks”,如下图所示

image.png

  • 等待其编译完成,完成之后产生的根文件系统压缩包在 images/linux 目录下

image.png

4 制作SD启动卡

image.png

4.1 拷贝镜像到FAT分区

  • 将前面过程当中生成的各种镜像文件拷贝到 SD 启动卡的 FAT 分区,包括 zImage(内核镜像,内核源码目录 arch/arm/boot/zImage)、 system-top.dtb(内核设备树 dtb 文件,内核源码目录 arch/arm/boot/dts/system-top.dtb)、 systemt.bit(pl 端 bitstream 文件,Petalinux工程目录下的 images/linux/system.bit)。
  • BOOT.BIN文件拷贝到 FAT 分区

image.png

4.2 将根文件系统解压到EXT4

sudo tar -xzf rootfs.tar.gz -C /media/linux/rootfs
复制代码

image.png

5启动开发板

  • 在U-Boot 启动 2 秒倒计时之前,按回车或者是空格键停止启动,进入到 U-Boot 的命令行

模式,因为现在不能直接启动,我们需要对 U-Boot 环境变量进行修改,在 U-Boot 命令行下执 行下面这些命令设置环境变量, image.png

image.png

env default -a
setenv bitstream_load_address 0x100000
setenv bitstream_image system.bit
setenv bitstream_size 0x300000
setenv kernel_img zImage
setenv dtbnetstart 0x2000000
setenv netstart 0x2080000
setenv default_bootcmd '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}
&& run cp_kernel2ram && run cp_dtb2ram && bootz ${netstart} - ${dtbnetstart}; fi'
复制代码
  • 保存完成后执行 boot 命令启动内核或者执行 reset 重启开发板:

image.png

猜你喜欢

转载自juejin.im/post/7032901481112010789