本帖最后由 正点原子运营 于 2024-2-21 10:47 编辑
第十二章 U-Boot移植 1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板
2) 章节摘自【正点原子】DFZU2EG_4EV MPSoC开发板之嵌入式Linux 驱动开发指南 V1.0
6)Linux技术交流QQ群:887820935
上一章节我们讲解了uboot的使用,对uboot有了一个初步的了解。前两章我们都是使用的正点原子提供的uboot,本章我们就来学习如何将Xilinx官方的uboot移植到正点原子的ZYNQ MPSoC开发板上,学习如何在uboot中添加我们自己的板子。
1.1 U-Boot源码获取及目录分析
1.1.1 获取U-Boot源码图 12.1.1 Xilinx发布的uboot源码 可以从github网站clone或下载uboot源码,注意要与Petalinux版本一致,否则可能会出现一些问题,我们使用的是2019.2版本的Petalinux,所以选择的uboot要带2019.2(Tags带2019.2)。不过我们不从上面的github网站下载,因为在11.2节使用Petalinux配置和编译U-Boot时,Petalinux工具就已经生成了uboot源码,如图 11.2.2 uboot源码所示,所以没有必要从github网站下载。 本章的uboot移植需要使用该源码,为了方便访问以及和后面章节的linux内核源码放在同一目录下,方便管理,我们在当前用户home目录下新建一个名为git.d的文件夹,并将Petalinux生成的uboot源码拷贝到该文件夹下,如下图所示: 图 12.1.2 拷贝uboot源码到git.d目录 进入~/git.d/u-boot-xlnx目录,输入“git status”和“git remote -v”命令,如下图所示: 可以看到当前uboot源码位于devtool分支,而且与Xilinx发布在github网站的uboot源码是同步的,没有做任何修改。由于笔者没有在github网站找到devtool分支以及tags,所以将其切换到与Petalinux 2019.2版本兼容的最新的tags标签上,也就是tag xilinx-v2019.2,并在此tag上创建分支u-boot-xlnx,命令如下: - git fetch origin tag xilinx-v2019.2
- git checkout tags/xilinx-v2019.2-b u-boot-xlnx
复制代码结果如下图所示: 当然了,也可以使用默认的devtool分支,没有实质上的区别。 1.1.2 U-Boot工程目录分析在移植uboot之前,我们需要先了解uboot工程目录结构,如下图所示: 上图中除了oe-logs、oe-workdir和oe-local-files这三个Petalinux工具相关的文件外,其他的文件和文件夹都是uboot源码本身的。这些文件夹或文件的含义如下表所示: 上表中的很多文件夹和文件我们都不需要去关注,我们要关注的文件夹或文件如下: 1. arch文件夹 这个文件夹里面存放着和芯片架构有关的文件,如下图所示: 从上图可以看出有很多架构,比如arm、x86、riscv等,我们现在用的是ARM芯片,所以只需要关注arm文件夹即可,进入arm文件夹里面内容如下图所示: mach开头的文件夹是跟具体的设备有关的,比如“mach-exynos”就是跟三星的exyons系列CPU有关的文件。我们使用的是Zynq UltraScale+ MPSoC,所以要关注“mach-zynqmp”这个文件夹。另外“cpu”这个文件夹也是和cpu架构有关的,文件夹内容如下图所示: 从上图可以看出有多种ARM架构相关的文件夹,Zynq UltraScale+ MPSoC使用的是Cortex-A53内核,Cortex-A53属于armv8,所以我们要关注“armv8”这个文件夹。cpu文件夹里面有个名为“u-boot.lds”的链接脚本文件,这个就是ARM芯片所使用的u-boot链接脚本文件。armv8文件夹里面的文件都是跟ARMV8架构有关的。 2. board文件夹 board文件夹就是和具体的开发板有关的,打开此文件夹,里面全是不同的板子,borad文件夹里面有个名为“xilinx”的文件夹,里面存放的是Xilinx厂商所有支持uboot的芯片系列,如下图所示: 所有使用xilinx芯片的板子都放到此文件夹中。该文件夹下有7个文件夹,其中bootscripts用于生成启动脚本boot.scr、common是所有开发板通用的、microblaze-generic表示使用microblaze软核IP的FPGA开发板、zynq表示使用ZYNQ-7000系列芯片的开发板、zynqmp表示使用ZYNQ MPSOC系列芯片的开发板、zynqmp_r5表示使用ZYNQ MPSoC系列芯片的R5处理器的开发板、versal表示使用Versal系列芯片的开发板。正点原子的开发板是ZYNQ MPSoC系列的开发板,我们后面移植uboot的时候就是参考zynqmp这个文件夹来定义我们的开发板。 3. configs文件夹 此文件夹为uboot配置文件,uboot是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”,xxx表示开发板名字,这些defconfig文件都存放在configs文件夹,因此,Xilinx官方开发板的配置文件肯定也在这个文件夹中,如下图所示: 图 12.1.10 Xilinx芯片系列开发板配置文件 上图中的以“xilinx”开头的文件都是xilinx芯片系列的配置文件。其中“xilinx_zynqmp_zcu102_rev1_0_defconfig”、“xilinx_zynqmp_zcu102_revA_defconfig”、“xilinx_zynqmp_zcu102_revB_defconfig”是我们参考的Xilinx官方的ZYNQ ZCU102开发板配置文件的不同版本,后面我们使用“xilinx_zynqmp_zcu102_rev1_0_defconfig”这个版本的配置文件。 4. Makefile文件 这个是顶层Makefile文件,Makefile是支持嵌套的,也就是顶层Makefile可以调用子目录中的Makefile文件。Makefile嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个Makefile,这个Makefile只处理本模块的编译链接工作,这样所有的编译链接工作就不用全部放到一个Makefile中,可以使得Makefile变得简洁明了。 uboot源码根目录下的Makefile是顶层Makefile,它会调用其它的模块的Makefile文件,比如drivers/cpu/Makefile。当然了,顶层Makefile要做的工作可远不止调用子目录Makefile这么简单。 5. README README文件描述了uboot的详细信息,包括uboot该如何编译、uboot中各文件夹的含义、相应的命令等等。建议大家详细的阅读此文件,可以进一步增加对uboot的认识。 关于uboot根目录中的文件和文件夹的含义就讲解到这里,接下来就要开始移植uboot了。
1.2 Petalinux使用外部U-Boot源码上一节我们将Petalinux生成的uboot源码移动到~/git.d/u-boot-xlnx目录(绝对路径/home/shang/git.d/u-boot-xlnx),这样导致Petalinux工程无法使用访问uboot源码了,所以在移植uboot之前,我们了解下如何让Petalinux能访问移动后的uboot源码。 方法如下: 1. 进入到Petalinux工程目录下,设置好Petalinux工作环境后,输入“petalinux-config”命令配置Petalinux工程。 设置Linux Components Selection ---> u-boot (u-boot-xlnx) --->为“ext-local-src”,如下图所示: 该配置项将u-boot来源配置为外部的本地源。设置好后按回车键返回。设置External u-boot local source settings ---> External u-boot localsource path为“/home/shang/git.d/u-boot-xlnx”,也就是当前uboot源码存放的目录,结果如下图所示: 图 12.2.2 配置External u-boot local source path 保存配置并退出,现在该Petalinux工程就可以访问和使用/home/shang/git.d/u-boot-xlnx中的源码了。 但是笔者在使用petalinux2019.2时,按照上面步骤设置后,编译petalinux工程会出现报错,猜测可能是这个版本的petalinux存在bug。解决的方法是在u-boot-xlnx原来的位置建立一个指向/home/shang/git.d/u-boot-xlnx的链接,如下图所示: 需要注意的一点是在Petalinux工程中配置和编译u-boot时需要先清理~/git.d/u-boot-xlnx中的源码(命令make distclean),否则配置和编译会报错,如下图所示: 1.3 Xilinx官方开发板uboot编译测试uboot的移植并不是说我们完完全全的从零开始将uboot移植到我们现在所使用的开发板或者开发平台上。这个对于我们来说基本是不可能的,这个工作一般是半导体厂商做的,半导体厂商负责将uboot移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这个开发板就叫做原厂开发板,比如大家学习STM32的时候听说过的discover开发板就是ST自己做的。半导体厂商会将uboot移植到他们自己的原厂开发板上,测试好以后就会将这个uboot发布出去,这就是大家常说的原厂BSP包。我们一般做产品的时候就会参考原厂的开发板做硬件,然后在原厂提供的BSP包上做修改,将uboot或者linux kernel移植到我们的硬件上。这个就是uboot移植的一般流程: ① 在uboot中找到参考的开发平台,一般是原厂的开发板。 ② 参考原厂开发板移植uboot到我们所使用的开发板上。 正点原子的ZYNQ MPSoC开发板参考的是Xilinx官方的ZYNQ ZCU102开发板做的硬件,因此我们在移植uboot的时候就可以以Xilinx官方的ZYNQ ZCU102开发板为蓝本。 在移植之前,我们先编译一下Xilinx官方ZCU102开发板对应的uboot。编译uboot源码之前,需要先添加交叉编译工具链路径,然后设置环境变量ARCH和CROSS_COMPILE。ARCH指定源码适配的芯片架构,即编译好的uboot运行在什么平台上,CROSS_COMPILE指定所用的交叉编译工具前缀。比如对于ZYNQ MPSoC而言,可以按照如下方式设置: - export ARCH=arm
- exportCROSS_COMPILE=arm-linux-gnueabihf-
复制代码而对于我们使用的ZYNQ MPSoC开发板,不用上面的方法设置环境变量,只需要执行10.5节的设置SDK的工作环境即可,SDK会自动设置相应的环境变量,如下图所示: 1.3.1 查找Xilinx官方的开发板默认配置文件在12.1.2节U-Boot工程目录分析章节中,configs目录下存放了很多跟Zynq MPSoC有关的配置,如下图所示, 图 12.3.2 Xilinx官方Zynq MPsoc默认配置文件 从上图可以看出有很多的默认配置文件,其中以xilinx_zynqmp开头的是ZYNQ MPSoc相关开发板的配置文件。其中“xilinx_zynqmp_zcu102_rev1_0_defconfig”、“xilinx_zynqmp_zcu102_revA_defconfig”、“xilinx_zynqmp_zcu102_revB_defconfig”是ZYNQ ZCU102开发板的配置文件。 1.3.2 编译Xilinx官方开发板对应的uboot注:需要先执行10.5节设置SDK的工作环境。 找到Xilinx官方ZYNQ ZCU102开发板对应的默认配置文件以后可以编译一下,这里我们使用“xilinx_zynqmp_zcu102_rev1_0_defconfig”配置文件。编译uboot命令如下: - make distclean
- make xilinx_zynqmp_zcu102_rev1_0_defconfig
- make -j8
复制代码编译完成以后结果如下图所示: 从上图可以看出,编译成功。其中“make distclean”表示清除所有生成的文件,“make -j8”表示使用8核来编译uboot。“-j”参数用于设置主机使用多少个核来编译uboot,设置的核越多,编译速度越快。-j8表示使用8个核编译uboot,具体设置多少个要根据自己的虚拟机或者电脑配置,如果你给VMware分配了4个核,那么最多只能使用-j4。 编译完成以后会生成u-boot.bin、u-boot.elf、u-boot.dtb等文件。需要下载到开发板上运行的文件有u-boot.elf、u-boot.dtb。这两个文件是运行uboot必不可少的。 1.3.3 验证与驱动测试使用Petalinux工具,测试还是比较方便的,可以直接生成BOOT.bin文件,不过每次生成BOOT.bin文件并将其拷贝到SD卡还是比较麻烦的。最简便的方法是直接使用JTAG下载,使用JTAG下载需要做的准备工作如下: 1) 需要手动在Ubuntu虚拟机中安装JTAG驱动,安装方式见5.5小节Linux系统安装JTAG cable驱动; 2) 用下载器连接开发板和电脑,连接完成后,进入如下操作将下载器对接到虚拟机中——在Vmware软件的菜单栏点击“虚拟机(M)”菜单,在弹出的子菜单中移动到“可移动设备(D)”,会弹出相应的移动设备,里面带有“Digilent USB”的是JTAG的USB接口,连接该USB接口,如下图所示: 图12.3.4在Vmware中连接JTAG的USB接口到虚拟机内 3) 开发板的启动模式设置成JTAG启动,开发板上电后,按下PS的复位按键; 4) 打开串口软件如SecureCRT或Putty,设置好MPSoc开发板所使用的串口并打开。 做好以上准备工作后,就可以使用JTAG进行下载了。 当然了,使用JTAG下载还是需要借助Petalinux工具的。首先我们设置好Petalinux的工作环境,然后进入第六章Petalinux设计流程实战章节建立的Petalinux工程目录中。由于编译生成的uboot文件不在Petalinux工程范围内,Petalinux无法使用,怎么解决呢? 用软链接就可以了,方法如下: 首先备份Petalinux工程images/linux目录下的u-boot.elf和system.dtb文件,命令如下: - cd images/linux
- mv u-boot.elf u-boot.elf.bak
- mv system.dtb system.dtb.bak
复制代码然后软链接编译生成的u-boot.elf和system.dtb文件,命令如下: - ln -s ~/git.d/u-boot-xlnx/u-boot.elf u-boot.elf
- ln -s ~/git.d/u-boot-xlnx/u-boot.dtb system.dtb
复制代码结果如下图所示: 图 12.3.5 软链接u-boot.elf和system.dtb 前面我们说过使用SD卡下载比较麻烦,所以使用JTAG下载,但是笔者通过JTAG下载后,发现不能通过uboot启动内核,原因是对于MPSoc器件,petalinux2019.2不支持petalinux-boot命令下uboot启动linux内核,所以本次实验需要先将linux镜像文件放在SD卡中,然后uboot从SD卡启动镜像。接下来将linux镜像文件image.ub复制到SD卡分区1(boot分区)中,复制完成后按照9.6节拷贝根文件系统到SD卡的ext4分区中的命令卸载SD卡,并将SD卡插到开发板上,如下图所示: 图 12.3.6 复制image.ub到sd卡分区1 现在用JTAG下载u-boot文件,命令如下(注意,下载前要先设置petalinux环境变量): - petalinux-boot --jtag --fpga --u-boot
复制代码在更高版本的petalinux中,可以使用“petalinux-boot --jtag--fpga --u-boot --kernel”命令通过JTAG下载uboot并启动linux内核,但是petalinux2019.2不支持直接通过JTAG下载uboot并启动linux内核。本次测试,我们通过“petalinux-boot --jtag--fpga --u-boot”命令,先将uboot下载到开发板上,然后进入uboot,通过sd卡启动内核。 上面的命令将下载fpga(system.bit)、pmu firmware、FSBL、uboot和ATF(bl31.elf)。执行结果如下图所示(下载前需要按下开发板的PS复位按键,否则会下载失败): 观察串口接收软件,uboot启动倒计时很短,只有两秒,当出现倒计时的时候,立即按“enter”键进入uboot,如下图所示: 进入uboot后,使用“iminfo”命令查询镜像的起始地址为“0x8000000”,然后使用“fatload”文件系统命令将镜像文件image.ub从SD卡传输到内存中地址0x8000000处,最后通过“bootm”命令启动内核镜像,如下图所示: 从上图可以看到,除了因为以太网的PHY地址不对导致不能找到以太网设备外,是可以正常启动linux内核的。当然了还有一些其他的小问题,比如只检测到了mmc0,这些问题主要跟设备树有关。至于启动linux内核后出现的问题,就不归属于uboot了,后面的章节会解决。
1.4 在U-Boot中添加自己的开发板
1.4.1 添加开发板默认配置文件先在configs目录下创建MPSoC开发板的默认配置文件。复制xilinx_zynqmp_zcu102_rev1_0_defconfig,然后重命名为zynqmp_altk_defconfig,命令如下: - cd configs
- cp xilinx_zynqmp_zcu102_rev1_0_defconfig zynqmp_altk_defconfig
复制代码然后修改zynqmp_altk_defconfig文件,修改后的文件内容如下(因文件较长,故部分未改动内容以“……”代替): - 示例代码 zynqmp_altk_defconfig文件
- 1 CONFIG_ARM=y
- 2 CONFIG_SYS_CONFIG_NAME="zynqmp_altk" //指定开发板头文件
- 3 CONFIG_ARCH_ZYNQMP=y
- 4 CONFIG_SYS_TEXT_BASE=0x8000000
- 5 CONFIG_SYS_MALLOC_F_LEN=0x8000
- 6 CONFIG_SPL=y
- 7 CONFIG_DEBUG_UART_BASE=0xff000000
- 8 CONFIG_DEBUG_UART_CLOCK=100000000
- 9 CONFIG_SPL_SPI_FLASH_SUPPORT=y
- 10 CONFIG_SPL_SPI_SUPPORT=y
- 11 CONFIG_ZYNQMP_USB=y
- 12 CONFIG_DEBUG_UART=y
- 13 CONFIG_AHCI=y
- 14 CONFIG_DISTRO_DEFAULTS=y
- 15 CONFIG_FIT=y
- 16 CONFIG_FIT_VERBOSE=y
- 17 CONFIG_SPL_LOAD_FIT=y
- 18 # CONFIG_DISPLAY_CPUINFOis not set
- 19 CONFIG_BOARD_EARLY_INIT_R=y
- 20 CONFIG_SPL_OS_BOOT=y
- 21 CONFIG_SPL_RAM_SUPPORT=y
- 22 CONFIG_SPL_RAM_DEVICE=y
- 23 CONFIG_SPL_ATF=y
- 24 CONFIG_SYS_PROMPT="ZynqMP> "
- ……
- 47 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-altk" //指定设备树
- 48 CONFIG_ENV_IS_IN_FAT=y
- 49 CONFIG_NET_RANDOM_ETHADDR=y
- 50 CONFIG_SPL_DM=y
- 51 CONFIG_SPL_DM_SEQ_ALIAS=y
- 52 CONFIG_SCSI_AHCI=y
- 53 CONFIG_SATA_CEVA=y
- 54 CONFIG_CLK_ZYNQMP=y
- 55 CONFIG_DFU_RAM=y
- 56 CONFIG_USB_FUNCTION_FASTBOOT=y
- 57 CONFIG_FASTBOOT_FLASH=y
- 58 CONFIG_FASTBOOT_FLASH_MMC_DEV=0
- 59 CONFIG_FASTBOOT_CMD_OEM_FORMAT=y
- 60 CONFIG_FPGA_XILINX=y
- 61 CONFIG_FPGA_ZYNQMPPL=y
- 62 CONFIG_DM_GPIO=y
- 63 CONFIG_XILINX_GPIO=y
- 64 CONFIG_DM_I2C=y
- 65 CONFIG_SYS_I2C_CADENCE=y
- 66 CONFIG_I2C_MUX=y
- 67 CONFIG_I2C_MUX_PCA954x=y
- 68 CONFIG_LED=y
- 69 CONFIG_LED_GPIO=y
- 70 CONFIG_MISC=y
- 71 CONFIG_I2C_EEPROM=y
- 72 CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x20
- 73 CONFIG_SYS_I2C_EEPROM_ADDR=0x0
- 74 CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW=0x0
- 75 CONFIG_MMC_IO_VOLTAGE=y
- 76 CONFIG_MMC_UHS_SUPPORT=y
- 77 CONFIG_MMC_SDHCI=y
- 78 CONFIG_MMC_SDHCI_ZYNQ=y
- 79 CONFIG_SPI_FLASH=y
- ……
- 116 CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
- 117 CONFIG_USB_GADGET_VENDOR_NUM=0x03FD
- 118 CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
- 119 CONFIG_USB_FUNCTION_THOR=y
- 120 CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
- 121 CONFIG_BOOTCOMMAND="rundefault_bootcmd"
复制代码可以看出,zynqmp_altk_defconfig文件基本和xilinx_zynqmp_zcu102_rev1_0_defconfig文件中的内容一样。修改的内容如下: 首先修改第2行,在第2行添加宏定义CONFIG_SYS_CONFIG_NAME="zynqmp_altk"。 然后修改第47行,指定MPSoC开发板的设备树文件"zynqmp-altk",对应的是我们在12.4.4节创建的MPSoC开发板的设备树文件名; 在最后一行添加宏定义CONFIG_BOOTCOMMAND="run default_bootcmd"。 1.4.2 添加开发板对应的头文件在目录include/configs下添加MPSoC开发板对应的头文件。这里使用xilinx官方开发板的头文件xilinx_zynqmp.h并进行修改。在终端中输入如下命令: - cd ../include/configs/
- cp xilinx_zynqmp.h zynqmp_altk.h //复制xilinx_zynqmp.h为zynqmp_altk.h
复制代码执行结果如下图所示: zynqmp_altk.h文件的内容如下所示(无需修改): - 示例代码zynq_altk.h文件
- 1 #ifndef __XILINX_ZYNQMP_H
- 2 #define __XILINX_ZYNQMP_H
- 3
- 4 #define CONFIG_REMAKE_ELF
- 5
- 6 /* #defineCONFIG_ARMV8_SWITCH_TO_EL1 */
- 7
- 8 /* Generic InterruptController Definitions */
- 9 #define CONFIG_GICV2
- 10 #define GICD_BASE 0xF9010000
- 11 #define GICC_BASE 0xF9020000
- ……
- 95 /* Xilinx initialenvironment variables */
- 96 #ifndef CONFIG_EXTRA_ENV_BOARD_SETTINGS
- 97 #define CONFIG_EXTRA_ENV_BOARD_SETTINGS \
- 98 "kernel_addr=0x80000\0" \
- 99 "initrd_addr=0xa00000\0" \
- 100 "initrd_size=0x2000000\0" \
- 101 "fdt_addr=4000000\0" \
- 102 "fdt_high=0x10000000\0" \
- 103 "loadbootenv_addr=0x100000\0" \
- 104 "sdbootdev=0\0"\
- ……
- 170 "usb_dfu_spl=booti$kernel_addr - $fdt_addr\0" \
- 171 "usbhostboot=usbstart && load usb 0 $fdt_addr system.dtb && " \
- 172 "load usb 0 $kernel_addr Image && " \
- 173 "booti $kernel_addr - $fdt_addr\0" \
- 174 "xilinxcmd=echo!!! && echo !!! Booting cmd is deprecated (will be removed in 2020).&& echo !!! Please move to distro bootcmd. && echo !!!\0" \
- 175 PARTS_DEFAULT
- 176 #endif
- 177
- 178 /* Monitor Command Prompt */
- 179 /* Console I/O Buffer Size */
- 180 #define CONFIG_SYS_CBSIZE 2048
- 181 #define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
- 182 #define CONFIG_PANIC_HANG
- 183 #define CONFIG_SYS_MAXARGS 64
- ……
- 352 #defineCONFIG_SYS_SPL_MALLOC_START 0x20000000
- 353 #defineCONFIG_SYS_SPL_MALLOC_SIZE 0x100000
- 354
- 355 #ifdefCONFIG_SPL_SYS_MALLOC_SIMPLE
- 356 # error "Disable CONFIG_SPL_SYS_MALLOC_SIMPLE. Full mallocneeds to be used"
- 357 #endif
- 358
- 359 #define CONFIG_BOARD_EARLY_INIT_F
- 360
- 361 #endif /* __XILINX_ZYNQMP_H */
复制代码可以看到zynqmp_altk.h里面有一些以“CONFIG_”开头的宏定义,这些宏定义可以用于配置或者裁剪uboot。如果我们要想使能或者禁止uboot的某些功能,可以在该文件中添加这个功能对应的CONFIG_XXX宏即可,如果不需要某个功能的话就删除掉对应的宏。 1.4.3 添加开发板对应的板级文件夹uboot中每个板子都有一个对应的文件夹来存放板级文件,比如开发板上外设驱动文件等。Xilinx的ZYNQ MPSoC系列芯片的所有板级文件夹都存放在board/xilinx/zynqmp目录下,在这个目录下有个名为zynqmp-zcu102-rev1.0的文件夹,这个文件夹就是Xilinx官方ZC102开发板的板级文件夹。复制zynqmp-zcu102-rev1.0,将其重命名为zynqmp-altk,命令如下: - cd board/xilinx/zynqmp/
- cp -r zynqmp-zcu102-rev1.0 zynqmp-altk
复制代码进入zynqmp-altk目录中,可以看到只有一个名为“psu_init_gpl.c”的文件,该文件是PS的初始化文件,可以用于我们的MPSoc开发板。 1.4.4 添加开发板对应的设备树uboot支持设备树,每个开发板都有一个对应的设备树文件。Xilinx的ZYNQ MPSoC系列芯片的所有设备树文件夹都存放在arch/arm64/dts/目录下,我们先看下该目录下Zynq UltraScale+ MPSoC相关的设备树文件,命令如下: - cd ~/git.d/u-boot-xlnx
- ls arch/arm/dts/zynqmp*
复制代码结果如下图所示: 不同的开发板有不同的设备树文件,我们自己的开发板当然得用我们自己的设备树文件。设备树文件从哪来,可以参考其他开发板的设备树文件,手动编写,不过这样做工作量太大,一般不推荐这种方法。最简便直接的方法是用Petalinux工具生成的设备树文件。Petalinux工具会根据我们提供的开发板xsa文件自动生成相应的设备树文件,生成的设备树文件在Petalinux工程(第六章Petalinux设计流程实战章节建立的Petalinux工程)的components/plnx_workspace/device-tree/device-tree目录下,如下图所示: 后缀为dtsi和dts的都是设备树文件,是Petalinux根据xsa文件自动生成的。下面介绍这几个设备树文件的含义: zynqmp.dtsi:Zynq UltraScale+ MPSoc系列芯片通用的PS部分的设备树文件; zynqmp-clk-ccf.dtsi:Zynq UltraScale+ MPSoC系列芯片通用的时钟相关的设备树文件; pcw.dtsi:开发板ps部分的设备树文件,在zynqmp.dtsi基础上生成的,使能相应的外设; pl.dtsi:开发板pl部分IP的设备树文件(Xilinx发布的包含驱动的IP); system-top.dts:Petalinux生成设备树镜像文件dtb的核心文件,该文件include上面介绍的文件,以及Petalinux用户可编辑的system-user.dtsi文件,system-user.dtsi文件在6.3.7节使用过; system-conf.dtsi:Petalinux根据用户的配置生成的额外的设备树文件,不同于上面介绍的设备树文件,是根据xsa文件自动生成的,xsa文件不变,它们也不变,该文件会随着用户对Petalinux工程的不同配置而相应变动。 要想在uboot源码中添加开发板的设备树文件,可以将system-top.dts文件及其依赖文件添加到uboot源码中。打开system-top.dts文件,其内容如下图所示: 图 12.4.4 system-top.dts文件的内容 可以看到总共include五个设备树文件,其中zynqmp.dtsi和zynqmp-clk-ccf.dtsi是通用文件,不用添加,剩下的pcw.dtsi、pl.dtsi和system-user.dtsi需要添加。进入到第六章创建的Petalinux工程的components/plnx_workspace/device-tree/device-tree目录下,然后输入如下命令将设备树文件复制到uboot源码相应目录: - cp pcw.dtsi pl.dtsi ~/git.d/u-boot-xlnx/arch/arm/dts/
- cp system-top.dts~/git.d/u-boot-xlnx/arch/arm/dts/zynqmp-altk.dts
- cp ~/workspace/petalinux/ALIENTEK-ZYNQ/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi~/git.d/u-boot-xlnx/arch/arm/dts/
复制代码其中我们将system-top.dts文件重命名为zynqmp-altk.dts,与12.4.1节保持一致。结果如下图所示: 添加完开发板的设备树文件后,还需要进行相应的修改才可以使用。 进入到uboot源码的arch/arm/dts目录下,编辑system-user.dtsi文件,只需改前10行的内容即可。 修改前的前10行的内容: - /include/ "system-conf.dtsi"
- #include<dt-bindings/gpio/gpio.h>
- #include<dt-bindings/input/input.h>
- / {
- model = "Alientek Zynq MpSoc Development Board";
- leds {
- compatible = "gpio-leds";
复制代码修改后的前10行的内容: - #include<dt-bindings/gpio/gpio.h>
- #include <dt-bindings/input/input.h>
- / {
- model = "Alientek Zynq MpSoc Development Board";
- compatible = "xlnx,zynqmp-altk","xlnx,zynqmp";
- leds {
- compatible = "gpio-leds";
复制代码删除了原内容第一行的“/include/"system-conf.dtsi"”,添加了“compatible = "xlnx,zynqmp-altk", "xlnx,zynqmp";”。关于设备树的内容后面在讲解linux驱动的时候会详细讲解。 接下来在arch/arm/dts目录中的Makefile中添加开发板的设备树文件。打开arch/arm/dts/Makefile文件,找到“dtb-$(CONFIG_ARCH_ZYNQMP)”所在行,在其下方添加“zynqmp-altk.dtb \”,如下图所示: 到此为止,正点原子MPSoc开发板就已经添加到uboot中了。 在uboot源码目录中输入“git status”命令,可以看到移植过程中,我们修改了哪些文件,如下图所示: 接下来就是编译移植后的uboot。 1.4.5 修改U-Boot图形界面配置文件uboot支持图形界面配置,关于uboot的图形界面配置下一章会详细的讲解。修改文件arch/arm/mach-zynq/Kconfig,将第48行的SYS_CONFIG_NAME配置项的内容修改如下: - 示例代码Kconfig文件
- 48 config SYS_CONFIG_NAME
- 49 string "Board configuration name"
- 50 default"zynqmp_altk"
- 51 help
- 52 This option contains information about board configuration name.
- 53 Based on this optioninclude/configs/<CONFIG_SYS_CONFIG_NAME>.hheader
- 54 will be used for boardconfiguration.
复制代码修改完成以后的Kconfig文件如下图所示: 到此为止,DFZU2EG_4EV MPSoC开发板就已经添加到uboot中了,接下来就是编译这个新添加的开发板。 1.4.6 使用新添加的板子配置编译uboot在uboot源码根目录下新建一个名为zynqmp.sh的shell脚本,在这个shell脚本里面输入如下内容: - 示例代码zynq.sh脚本文件
- 1 #!/bin/bash
- 2 make distclean
- 3 make zynqmp_altk_defconfig
- 4 make -j8
复制代码第3行我们使用的默认配置文件就是12.4.1节中新建的zynqmp_altk_defconfig配置文件。给予zynqmp.sh可执行权限,然后运行脚本来完成编译,命令如下: - chmod 777 zynqmp.sh //给予可执行权限
- ./zynqmp.sh //运行脚本编译uboot
复制代码等待编译完成,编译完成以后输入如下命令,查看一下12.4.2小节中添加的zynqmp_altk.h这个头文件有没有被引用。 如果有很多文件都引用了zynqmp_altk.h这个头文件,那就说明新板子添加成功,如下图所示: 编译完成以后就可以使用12.3.3验证与驱动测试小节中的方法进行下载测试。串口软件输出结果如下图所示: 从上图可以看到,我们基本移植成功了,也验证了这种下载方式是没有问题的。uboot的最终目的就是启动Linux内核,所以还是需要通过启动Linux内核来判断uboot移植是否真的成功。在启动Linux内核之前我们先来学习两个重要的环境变量bootcmd和bootargs。 |