OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 532|回复: 0

《DFZU2EG_4EV MPSoC开发板之嵌入式Linux 驱动开发指南》第十二章 U-Boot移植(上)

[复制链接]

1070

主题

1081

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4443
金钱
4443
注册时间
2019-5-8
在线时间
1199 小时
发表于 2024-2-21 10:49:51 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-2-21 10:47 编辑

第十二章 U-Boot移植
1)实验平台:正点原子 DFZU2EG_4EV MPSoC开发板

2) 章节摘自【正点原子】DFZU2EG_4EV MPSoC开发板之嵌入式Linux 驱动开发指南 V1.0


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/fpga/zdyz-MPSOC.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)Linux技术交流QQ群:887820935

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

上一章节我们讲解了uboot的使用,对uboot有了一个初步的了解。前两章我们都是使用的正点原子提供的uboot,本章我们就来学习如何将Xilinx官方的uboot移植到正点原子的ZYNQ MPSoC开发板上,学习如何在uboot中添加我们自己的板子。

1.1 U-Boot源码获取及目录分析
1.1.1 获取U-Boot源码
Xilinx官方提供的uboot源码发布在github网站https://github.com/Xilinx/u-boot-xlnx,如下图所示:                        
image001.png
图 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源码拷贝到该文件夹下,如下图所示:
image003.png
图 12.1.2 拷贝uboot源码到git.d目录
进入~/git.d/u-boot-xlnx目录,输入“git status”和“git remote -v”命令,如下图所示:
image005.png
图 12.1.3 git status
可以看到当前uboot源码位于devtool分支,而且与Xilinx发布在github网站的uboot源码是同步的,没有做任何修改。由于笔者没有在github网站找到devtool分支以及tags,所以将其切换到与Petalinux 2019.2版本兼容的最新的tags标签上,也就是tag xilinx-v2019.2,并在此tag上创建分支u-boot-xlnx,命令如下:
  1. git fetch origin tag xilinx-v2019.2
  2. git checkout tags/xilinx-v2019.2-b u-boot-xlnx
复制代码
结果如下图所示:
image007.png
图 12.1.4 创建u-boot-xlnx分支
当然了,也可以使用默认的devtool分支,没有实质上的区别。
1.1.2 U-Boot工程目录分析
在移植uboot之前,我们需要先了解uboot工程目录结构,如下图所示:
image009.png
图 12.1.5解压后的uboot
上图中除了oe-logs、oe-workdir和oe-local-files这三个Petalinux工具相关的文件外,其他的文件和文件夹都是uboot源码本身的。这些文件夹或文件的含义如下表所示:
QQ截图20240221104243.png
表 12.1.1 uboot目录列表
上表中的很多文件夹和文件我们都不需要去关注,我们要关注的文件夹或文件如下:
1.       arch文件夹
这个文件夹里面存放着和芯片架构有关的文件,如下图所示:
image011.png
图 12.1.6 arch文件夹
从上图可以看出有很多架构,比如arm、x86、riscv等,我们现在用的是ARM芯片,所以只需要关注arm文件夹即可,进入arm文件夹里面内容如下图所示:
image012.png
图 12.1.7 arm文件夹
mach开头的文件夹是跟具体的设备有关的,比如“mach-exynos”就是跟三星的exyons系列CPU有关的文件。我们使用的是Zynq UltraScale+ MPSoC,所以要关注“mach-zynqmp”这个文件夹。另外“cpu”这个文件夹也是和cpu架构有关的,文件夹内容如下图所示:
image014.png
图 12.1.8 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的芯片系列,如下图所示:
image015.png
图 12.1.9 xilinx文件夹
所有使用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官方开发板的配置文件肯定也在这个文件夹中,如下图所示:
image016.png
图 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”,如下图所示:
image018.png
图 12.2.1配置u-boot
该配置项将u-boot来源配置为外部的本地源。设置好后按回车键返回。设置External u-boot local source settings ---> External u-boot localsource path为“/home/shang/git.d/u-boot-xlnx”,也就是当前uboot源码存放的目录,结果如下图所示:
image020.png
图 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的链接,如下图所示:
image022.png
图 12.2.3 建立u-boot-xlnx链接
需要注意的一点是在Petalinux工程中配置和编译u-boot时需要先清理~/git.d/u-boot-xlnx中的源码(命令make distclean),否则配置和编译会报错,如下图所示:
image024.png
图 12.2.4 编译petalinux工程
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而言,可以按照如下方式设置:
  1. export ARCH=arm
  2. exportCROSS_COMPILE=arm-linux-gnueabihf-
复制代码
而对于我们使用的ZYNQ MPSoC开发板,不用上面的方法设置环境变量,只需要执行10.5节的设置SDK的工作环境即可,SDK会自动设置相应的环境变量,如下图所示:
image026.png
图 12.3.1 设置SDK的工作环境
1.3.1 查找Xilinx官方的开发板默认配置文件
在12.1.2节U-Boot工程目录分析章节中,configs目录下存放了很多跟Zynq MPSoC有关的配置,如下图所示,
image028.png
图 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命令如下:
  1. make distclean
  2. make xilinx_zynqmp_zcu102_rev1_0_defconfig
  3. make -j8
复制代码
编译完成以后结果如下图所示:
image030.png
图 12.3.3编译结果
从上图可以看出,编译成功。其中“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接口,如下图所示:
image032.png
图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文件,命令如下:
  1. cd images/linux
  2. mv u-boot.elf u-boot.elf.bak
  3. mv system.dtb system.dtb.bak
复制代码
然后软链接编译生成的u-boot.elf和system.dtb文件,命令如下:
  1. ln -s ~/git.d/u-boot-xlnx/u-boot.elf u-boot.elf
  2. ln -s ~/git.d/u-boot-xlnx/u-boot.dtb system.dtb
复制代码
结果如下图所示:
image034.png
图 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卡插到开发板上,如下图所示:
image036.png
图 12.3.6 复制image.ub到sd卡分区1
现在用JTAG下载u-boot文件,命令如下(注意,下载前要先设置petalinux环境变量):
  1. 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复位按键,否则会下载失败):
image038.png
图 12.3.7 下载u-boot
观察串口接收软件,uboot启动倒计时很短,只有两秒,当出现倒计时的时候,立即按“enter”键进入uboot,如下图所示:
image040.png
图 12.3.8 进入uboot
进入uboot后,使用“iminfo”命令查询镜像的起始地址为“0x8000000”,然后使用“fatload”文件系统命令将镜像文件image.ub从SD卡传输到内存中地址0x8000000处,最后通过“bootm”命令启动内核镜像,如下图所示:
image042.png
图 12.3.9 串口软件接收情况
从上图可以看到,除了因为以太网的PHY地址不对导致不能找到以太网设备外,是可以正常启动linux内核的。当然了还有一些其他的小问题,比如只检测到了mmc0,这些问题主要跟设备树有关。至于启动linux内核后出现的问题,就不归属于uboot了,后面的章节会解决。

1.4 在U-Boot中添加自己的开发板
1.4.1 添加开发板默认配置文件
先在configs目录下创建MPSoC开发板的默认配置文件。复制xilinx_zynqmp_zcu102_rev1_0_defconfig,然后重命名为zynqmp_altk_defconfig,命令如下:
  1. cd configs
  2. cp xilinx_zynqmp_zcu102_rev1_0_defconfig zynqmp_altk_defconfig
复制代码
然后修改zynqmp_altk_defconfig文件,修改后的文件内容如下(因文件较长,故部分未改动内容以“……”代替):
  1. 示例代码 zynqmp_altk_defconfig文件
  2. 1  CONFIG_ARM=y
  3. 2  CONFIG_SYS_CONFIG_NAME="zynqmp_altk"        //指定开发板头文件
  4. 3  CONFIG_ARCH_ZYNQMP=y
  5. 4  CONFIG_SYS_TEXT_BASE=0x8000000
  6. 5  CONFIG_SYS_MALLOC_F_LEN=0x8000
  7. 6  CONFIG_SPL=y
  8. 7  CONFIG_DEBUG_UART_BASE=0xff000000
  9. 8  CONFIG_DEBUG_UART_CLOCK=100000000
  10. 9  CONFIG_SPL_SPI_FLASH_SUPPORT=y
  11. 10 CONFIG_SPL_SPI_SUPPORT=y
  12. 11 CONFIG_ZYNQMP_USB=y
  13. 12 CONFIG_DEBUG_UART=y
  14. 13 CONFIG_AHCI=y
  15. 14 CONFIG_DISTRO_DEFAULTS=y
  16. 15 CONFIG_FIT=y
  17. 16 CONFIG_FIT_VERBOSE=y
  18. 17 CONFIG_SPL_LOAD_FIT=y
  19. 18 # CONFIG_DISPLAY_CPUINFOis not set
  20. 19 CONFIG_BOARD_EARLY_INIT_R=y
  21. 20 CONFIG_SPL_OS_BOOT=y
  22. 21 CONFIG_SPL_RAM_SUPPORT=y
  23. 22 CONFIG_SPL_RAM_DEVICE=y
  24. 23 CONFIG_SPL_ATF=y
  25. 24 CONFIG_SYS_PROMPT="ZynqMP> "
  26. ……
  27. 47 CONFIG_DEFAULT_DEVICE_TREE="zynqmp-altk"    //指定设备树
  28. 48 CONFIG_ENV_IS_IN_FAT=y
  29. 49 CONFIG_NET_RANDOM_ETHADDR=y
  30. 50 CONFIG_SPL_DM=y
  31. 51 CONFIG_SPL_DM_SEQ_ALIAS=y
  32. 52 CONFIG_SCSI_AHCI=y
  33. 53 CONFIG_SATA_CEVA=y
  34. 54 CONFIG_CLK_ZYNQMP=y
  35. 55 CONFIG_DFU_RAM=y
  36. 56 CONFIG_USB_FUNCTION_FASTBOOT=y
  37. 57 CONFIG_FASTBOOT_FLASH=y
  38. 58 CONFIG_FASTBOOT_FLASH_MMC_DEV=0
  39. 59 CONFIG_FASTBOOT_CMD_OEM_FORMAT=y
  40. 60 CONFIG_FPGA_XILINX=y
  41. 61 CONFIG_FPGA_ZYNQMPPL=y
  42. 62 CONFIG_DM_GPIO=y
  43. 63 CONFIG_XILINX_GPIO=y
  44. 64 CONFIG_DM_I2C=y
  45. 65 CONFIG_SYS_I2C_CADENCE=y
  46. 66 CONFIG_I2C_MUX=y
  47. 67 CONFIG_I2C_MUX_PCA954x=y
  48. 68 CONFIG_LED=y
  49. 69 CONFIG_LED_GPIO=y
  50. 70 CONFIG_MISC=y
  51. 71 CONFIG_I2C_EEPROM=y
  52. 72 CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x20
  53. 73 CONFIG_SYS_I2C_EEPROM_ADDR=0x0
  54. 74 CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW=0x0
  55. 75 CONFIG_MMC_IO_VOLTAGE=y
  56. 76 CONFIG_MMC_UHS_SUPPORT=y
  57. 77 CONFIG_MMC_SDHCI=y
  58. 78 CONFIG_MMC_SDHCI_ZYNQ=y
  59. 79 CONFIG_SPI_FLASH=y
  60. ……
  61. 116 CONFIG_USB_GADGET_MANUFACTURER="Xilinx"
  62. 117 CONFIG_USB_GADGET_VENDOR_NUM=0x03FD
  63. 118 CONFIG_USB_GADGET_PRODUCT_NUM=0x0300
  64. 119 CONFIG_USB_FUNCTION_THOR=y
  65. 120 CONFIG_EFI_LOADER_BOUNCE_BUFFER=y
  66. 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并进行修改。在终端中输入如下命令:
  1. cd ../include/configs/
  2. cp xilinx_zynqmp.h zynqmp_altk.h       //复制xilinx_zynqmp.h为zynqmp_altk.h
复制代码
执行结果如下图所示:
image044.png
图 12.4.1 添加头文件
zynqmp_altk.h文件的内容如下所示(无需修改):
  1. 示例代码zynq_altk.h文件
  2. 1  #ifndef __XILINX_ZYNQMP_H
  3. 2  #define __XILINX_ZYNQMP_H
  4. 3  
  5. 4  #define CONFIG_REMAKE_ELF
  6. 5  
  7. 6  /* #defineCONFIG_ARMV8_SWITCH_TO_EL1 */
  8. 7  
  9. 8  /* Generic InterruptController Definitions */
  10. 9  #define CONFIG_GICV2
  11. 10 #define GICD_BASE   0xF9010000
  12. 11 #define GICC_BASE   0xF9020000
  13. ……  
  14. 95 /* Xilinx initialenvironment variables */
  15. 96 #ifndef CONFIG_EXTRA_ENV_BOARD_SETTINGS
  16. 97 #define CONFIG_EXTRA_ENV_BOARD_SETTINGS \
  17. 98      "kernel_addr=0x80000\0" \
  18. 99      "initrd_addr=0xa00000\0" \
  19. 100     "initrd_size=0x2000000\0" \
  20. 101     "fdt_addr=4000000\0" \
  21. 102     "fdt_high=0x10000000\0" \
  22. 103     "loadbootenv_addr=0x100000\0" \
  23. 104     "sdbootdev=0\0"\
  24. ……
  25. 170     "usb_dfu_spl=booti$kernel_addr - $fdt_addr\0" \
  26. 171     "usbhostboot=usbstart && load usb 0 $fdt_addr system.dtb && " \
  27. 172              "load usb 0 $kernel_addr Image && " \
  28. 173              "booti $kernel_addr - $fdt_addr\0" \
  29. 174     "xilinxcmd=echo!!! && echo !!! Booting cmd is deprecated (will be removed in 2020).&& echo !!! Please move to distro bootcmd. && echo !!!\0" \
  30. 175     PARTS_DEFAULT
  31. 176 #endif
  32. 177
  33. 178 /* Monitor Command Prompt */
  34. 179 /* Console I/O Buffer Size */
  35. 180 #define CONFIG_SYS_CBSIZE       2048
  36. 181 #define CONFIG_SYS_BARGSIZE     CONFIG_SYS_CBSIZE
  37. 182 #define CONFIG_PANIC_HANG
  38. 183 #define CONFIG_SYS_MAXARGS      64
  39. ……
  40. 352 #defineCONFIG_SYS_SPL_MALLOC_START 0x20000000
  41. 353 #defineCONFIG_SYS_SPL_MALLOC_SIZE  0x100000
  42. 354
  43. 355 #ifdefCONFIG_SPL_SYS_MALLOC_SIMPLE
  44. 356 # error "Disable CONFIG_SPL_SYS_MALLOC_SIMPLE. Full mallocneeds to be used"
  45. 357 #endif
  46. 358
  47. 359 #define CONFIG_BOARD_EARLY_INIT_F
  48. 360
  49. 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,命令如下:
  1. cd board/xilinx/zynqmp/
  2. 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相关的设备树文件,命令如下:
  1. cd ~/git.d/u-boot-xlnx
  2. ls arch/arm/dts/zynqmp*
复制代码
结果如下图所示:
image046.png
图 12.4.2 zynqmp相关设备树文件
不同的开发板有不同的设备树文件,我们自己的开发板当然得用我们自己的设备树文件。设备树文件从哪来,可以参考其他开发板的设备树文件,手动编写,不过这样做工作量太大,一般不推荐这种方法。最简便直接的方法是用Petalinux工具生成的设备树文件。Petalinux工具会根据我们提供的开发板xsa文件自动生成相应的设备树文件,生成的设备树文件在Petalinux工程(第六章Petalinux设计流程实战章节建立的Petalinux工程)的components/plnx_workspace/device-tree/device-tree目录下,如下图所示:
image048.png
图 12.4.3 Petalinux生成的设备树
后缀为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文件,其内容如下图所示:
image050.png
图 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源码相应目录:
  1. cp pcw.dtsi pl.dtsi ~/git.d/u-boot-xlnx/arch/arm/dts/
  2. cp system-top.dts~/git.d/u-boot-xlnx/arch/arm/dts/zynqmp-altk.dts
  3. 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节保持一致。结果如下图所示:
image052.png
图 12.4.5 添加设备树文件
添加完开发板的设备树文件后,还需要进行相应的修改才可以使用。
进入到uboot源码的arch/arm/dts目录下,编辑system-user.dtsi文件,只需改前10行的内容即可。
修改前的前10行的内容:
  1. /include/ "system-conf.dtsi"
  2. #include<dt-bindings/gpio/gpio.h>
  3. #include<dt-bindings/input/input.h>
  4. / {
  5.     model = "Alientek Zynq MpSoc Development Board";
  6.     leds {
  7.         compatible = "gpio-leds";
复制代码
修改后的前10行的内容:
  1. #include<dt-bindings/gpio/gpio.h>
  2. #include <dt-bindings/input/input.h>
  3. / {
  4.     model = "Alientek Zynq MpSoc Development Board";
  5.     compatible = "xlnx,zynqmp-altk","xlnx,zynqmp";
  6.     leds {
  7.         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 \”,如下图所示:
image054.png
图 12.4.6修改Makefile文件
到此为止,正点原子MPSoc开发板就已经添加到uboot中了。
在uboot源码目录中输入“git status”命令,可以看到移植过程中,我们修改了哪些文件,如下图所示:
image056.png
图 12.4.7移植中修改的文件
接下来就是编译移植后的uboot。
1.4.5 修改U-Boot图形界面配置文件
uboot支持图形界面配置,关于uboot的图形界面配置下一章会详细的讲解。修改文件arch/arm/mach-zynq/Kconfig,将第48行的SYS_CONFIG_NAME配置项的内容修改如下:
  1. 示例代码Kconfig文件
  2. 48 config SYS_CONFIG_NAME
  3. 49 string "Board configuration name"
  4. 50  default"zynqmp_altk"
  5. 51 help
  6. 52   This option contains information about board configuration name.
  7. 53   Based on this optioninclude/configs/<CONFIG_SYS_CONFIG_NAME>.hheader
  8. 54   will be used for boardconfiguration.
复制代码
修改完成以后的Kconfig文件如下图所示:
image058.png
图 12.4.8修改后的Kconfig文件
到此为止,DFZU2EG_4EV MPSoC开发板就已经添加到uboot中了,接下来就是编译这个新添加的开发板。
1.4.6 使用新添加的板子配置编译uboot
在uboot源码根目录下新建一个名为zynqmp.sh的shell脚本,在这个shell脚本里面输入如下内容:
  1. 示例代码zynq.sh脚本文件
  2. 1 #!/bin/bash
  3. 2 make distclean
  4. 3 make zynqmp_altk_defconfig
  5. 4 make -j8
复制代码
第3行我们使用的默认配置文件就是12.4.1节中新建的zynqmp_altk_defconfig配置文件。给予zynqmp.sh可执行权限,然后运行脚本来完成编译,命令如下:
  1. chmod 777 zynqmp.sh               //给予可执行权限
  2. ./zynqmp.sh                                 //运行脚本编译uboot
复制代码
等待编译完成,编译完成以后输入如下命令,查看一下12.4.2小节中添加的zynqmp_altk.h这个头文件有没有被引用。
  1. grep -nR "zynqmp_altk.h"
复制代码
如果有很多文件都引用了zynqmp_altk.h这个头文件,那就说明新板子添加成功,如下图所示:
image060.png
图 12.4.9查找结果
编译完成以后就可以使用12.3.3验证与驱动测试小节中的方法进行下载测试。串口软件输出结果如下图所示:
image062.png
图 12.4.10 uboot启动过程
从上图可以看到,我们基本移植成功了,也验证了这种下载方式是没有问题的。uboot的最终目的就是启动Linux内核,所以还是需要通过启动Linux内核来判断uboot移植是否真的成功。在启动Linux内核之前我们先来学习两个重要的环境变量bootcmd和bootargs。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 01:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表