基于G9-X芯片的U-Boot移植
2022-10-27安昱昕
安昱昕,杜 彬,田 彬
(陕西重型汽车有限公司汽车工程研究院,陕西 西安 710200)
随着域、集中式车载电子电器架构的发展,基于SoC芯片的车载控制器及车用操作系统研发成为构建域、集中式电子电器架构软硬件平台的落地方向,而引导加载程序是车用操作系统加载运行的必要组成,U-Boot作为主流的嵌入式操作系统内核引导加载程序,其稳定性、易移植性已被广泛验证。本文介绍了基于G9-X芯片,移植U-Boot引导加载程序的方法,为车用操作系统移植以及后续软件开发工作提供参考。
1 U-Boot介绍
1.1 U-Boot作用及原理
U-Boot负责启动操作系统内核,并向内核传递根文件系统路径、网络配置信息、内存地址等重要参数。U-Boot设计目的在于满足多平台通用性,通过抽取不同硬件平台系统启动的共性特征,形成一套平台通用引导系统架构。各个芯片厂商根据自己芯片特性进一步完成引导系统的定制化开发或移植,提高开发效率同时减少开发成本。
1.2 U-Boot启动流程
U-Boot启动流程主要分为两个阶段:CPU初始化和目标板初始化。CPU初始化阶段中通过汇编语言初始化SoC芯片相关硬件,如设置CPU模式、关闭MMU、初始化DDR和时钟等,以及准备C语言运行环境。在准备好C语言运行环境后,CPU便可以处理C程序了,这时如初始化目标板外设,检测系统内存映射,启动内核等C程序将被运行,如图1所示。
图1 U-Boot启动流程
2 U-Boot移植流程
2.1 编译环境搭建
由于SoC芯片平台与PC平台芯片架构不同,需要在PC平台搭建SoC平台的编译环境完成系统编译,编译后的镜像烧录到目标板中运行。本文采用基于ARM内核SoC芯片,交叉编译工具使用ARM官方提供的arm-linux-gcc编译工具,并在Linux系统下完成交叉编译环境的构建。
2.2 移植文件介绍
本文基于DENX官方U-Boot2016-3完成SoC芯片适配和目标板适配。参考第1.2节U-Boot启动流程,U-Boot主要分为两类文件:芯片启动文件和目标板描述文件,主要包含UBoot官方提供的已适配芯片平台和目标板文件,如图2所示。
图2 U-Boot文件目录
arch/、board/、drivers/这3个文件目录包括芯片、目标板相关信息,U-Boot移植主要工作是在这3个目录下添加芯片及目标板适配程序和配置文件等,见表1。
表1 芯片及目标板相关文件目录
2.3 移植步骤介绍
芯片适配主要完成SoC芯片内核架构适配以确保内核完成初始化、程序自拷贝、启动运行等一系列的工作。本文所适配的控制器芯片为ARM架构,U-Boot提供了完整的适配程序,我们可将相应内核目录下Kconfig文件中内核名应用到目标板适配的配置文件中即可。
对于目标板适配,是将目标板所用的SoC芯片外设信息数据配置到U-Boot程序中,主要有以下步骤。
1)在board/目标板目录下创建目标板目录,包括Kconfig、Maintainers、Makefile以及${boardname}.c程序4种文件,如图3所示。
图3 board/目录下文件
其中,Makefile文件中加入指定编译对象文件:
MAINTAINERS中添加指定配置相关文件目录:
Kconfig中添加配置编译信息:
myboard.c程序中主要负责分配外设GPIO接口,以及完成驱动初始化工作,如I2C、EMMC、USB等,在其中加入初始化程序以及GPIO配置宏定义。
2)在include/configs目录下新建目标板配置头文件${boardname}.h,通过宏定义存放配置信息,这里创建myboard.h文件:
通过宏定义配置启动boot地址、串口波特率、Fuses、GPIO、文件系统支持等,添加以下配置选项。
此外,根据需要使用的外设完成配置项,表示使用该外设,如以太网、MMC、I2C、USB等,也包括U-Boot默认环境变量的定义,添加如以下配置选项:
3)根据CPU架构,在arch/各级目录下(表1)Kconfig文件中添加目标板配置信息,arch/下Kconfig中添加CPU和目标板配置信息、设备信息和编译头文件名称,并将第一级配置信息名称添加到defconfig文件中,常用配置关键字如表2所示。
表2 Kconfig关键字
根据本文芯片架构,调用ARMv8目录的所有程序,以及设备驱动模型程序,添加配置信息如下:config TARGET_MYBOARD
4)在configs/目录下新建defconfig配置文件,存放各级Kconfig的具体配置:
myboard_defconfig文件中配置项用于确定Kconfig中哪些配置项被激活,即最终编译哪些文件,本文采用芯片基于ARM架构,并已构建目标板配置文件myboard.h,以及在arch/Kconfig中完成配置信息声明,如使用新添加的
3 实验验证
完成移植后,根目录下执行命令配置编译目标设备并开始编译:
通过交叉编译环境完成U-Boot镜像编译后,使用烧录工具将镜像烧录到SD卡中。如图4所示,编译生成的u-boot.bin为烧录所需的镜像文件,一般芯片启动会需要如校验等具有固定格式数据信息,所以只烧录u-boot.bin通常无法成功启动U-Boot。根据芯片手册定义的芯片启动数据格式,将数据按格式要求添加到SD卡中,保证SD卡烧录的所有数据能够正确启动芯片。
图4 U-Boot编译结果
烧录镜像前通过fdisk命令对SD卡分区,并通过mkfs.vfat命令格式化分区。本文通过dd命令将镜像拷贝到SD卡中,根据芯片启动流程及数据格式,设置参数以确定数据写入位置。
通过SD卡启动目标板中,根据CPU启动流程,内部ROM执行初始化后会完成自拷贝,通过将SD卡指定位置的数据拷贝到RAM中执行,后续程序开始执行,测试U-Boot系统开始运行,如图5所示。
图5 U-Boot启动运行界面
本文通过U-Boot能否加载系统内核并挂载文件系统测试移植是否成功,采用内核版本为Linux Kernel4.1.15。如图6所示,通过设置U-Boot环境变量参数,通过nfs服务远程加载PC服务端内核镜像及根文件系统文件,能够成功启动操作系统。
图6 U-Boot引导启动操作系统
图6中所示,通过U-Boot命令设置环境变量可指定系统内核启动位置,由于本文通过nfs服务从上位机加载内核及文件系统,所以需要设置网络IP地址等信息,如本文设置IP采用以下命令。
4 结论
综上,U-Boot减少了芯片及目标板适配的难度及周期,达到了快速移植操作系统的目的,其灵活性和易用性提高了开发效率。此外,移植U-Boot需要对SoC芯片的启动流程及U-Boot软件架构有清晰的理解和掌握,这对理解操作系统原理也具有参考意义和价值。