一文读懂UEFI系统:从应用场景到RK平台开发全攻略 电子说
在嵌入式开发领域,UEFI(统一可扩展固件接口)早已不是陌生词汇。它作为传统BIOS的升级替代方案,凭借更强大的功能、更灵活的扩展性,正在成为嵌入式平台固件开发的核心选择。尤其在瑞芯微(Rockchip)RK系列平台上,UEFI的深度集成让开发者能够更高效地搭建Linux系统开发环境。今天,我们就来详细聊聊UEFI系统的应用场景,以及RK平台下的完整开发流程。

一、UEFI系统:不止是固件,更是嵌入式开发的“桥梁”
1. 什么是UEFI?
UEFI是一种介于硬件和操作系统之间的固件接口标准,负责启动过程中的硬件初始化、引导操作系统加载。与传统BIOS相比,UEFI支持更大容量的存储设备、更快的启动速度、更丰富的驱动支持,同时提供了统一的开发接口,让跨平台开发更便捷。在RK平台中,UEFI被深度集成到Linux SDK中,成为连接硬件与Buildroot/Debian/Yocto等Linux系统的关键桥梁。
2. UEFI的核心应用场景
•嵌入式智能硬件开发:适用于RK3588、RK3568等高性能嵌入式芯片,支撑智能终端、边缘计算设备、工业控制单元等产品的启动与硬件管理。
•多系统引导场景:支持Android Boot与Grub双启动方式,满足嵌入式设备灵活切换操作系统的需求,比如同时兼容嵌入式Linux和Android系统。
•复杂硬件配置管理:针对PCIE、USB、SPI Nor Flash、显示模块等外设,提供标准化的配置接口,适配不同硬件方案的定制化需求。
•企业级嵌入式方案:在需要高可靠性、可扩展性的工业设备、服务器级嵌入式产品中,UEFI的稳定性和兼容性能够大幅降低开发风险。
二、RK平台UEFI开发全流程:从环境搭建到配置优化
瑞芯微RK系列(以主流的RK3588为例)提供了完善的UEFI开发支持,从代码获取、编译、烧录到启动调试,每一步都有清晰的标准化流程。以下是详细开发步骤拆解:
1. 前期准备:确认开发环境与代码结构
(1)环境要求
•安装RK3588 Linux SDK,确保SDK中包含uefi目录(核心开发目录)。
•预装交叉编译工具链(如aarch64-none-linux-gnu-gcc),并配置好环境变量。
•准备瑞芯微开发工具(用于固件烧录)。
(2)核心代码结构
RK平台的UEFI代码主要分布在两个关键目录,清晰的结构便于开发者定位和修改:
•edk2-platforms/Silicon/Rockchip:包含通用驱动、头文件、库文件,以及RK3588/RK3568等芯片的专有IP驱动,同时提供Rockchip.dsc.inc等通用配置文件。
•edk2-platforms/Platform/Rockchip:存放设备树文件(如rk3588.dtb)、ACPI表、启动logo资源等平台相关配置,其中RK3588子目录包含该芯片的专属编译配置(.dsc/.fdf文件)和驱动模块。
2. 编译UEFI固件:两种高效编译方式
RK3588 Linux SDK提供了两种编译方案,满足不同开发习惯,编译后将生成可直接烧录的固件文件:
方式一:直接使用uefi目录脚本
进入SDK的uefi目录,执行以下命令(默认编译RK3588芯片):
./make.sh rk3588
注意:此方式需手动拷贝设备树文件到指定路
cp kernel/arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4-v10-linux.dtb uefi/edk2-platforms/Platform/Rockchip/DeviceTree/rk3588.dtb
方式二:使用SDK根目录build.sh脚本
在SDK根目录执行,自动配置EDK2环境变量并编译u-boot
./build.sh uefi
优势:无需手动拷贝设备树文件,编译过程中会自动同步Kernel的DTB文件。
编译结果
两种方式均会生成两个核心固件:
•uboot_uefi.img:适用于EMMC启动的开发板。
•RK3588_NOR_FLASH.img:适用于SPI Nor Flash启动的开发板。
3. 固件烧录:分场景选择烧录方案
根据开发板的存储启动方式,选择对应的烧录文件和流程,核心分为EMMC启动和SPI Nor Flash启动两种场景:
场景一:EMMC启动(主流方案)
需烧录3个关键文件,且必须包含parameter.txt分区配置文件:
1.烧录文件清单:
○u-boot/rk3588_spl_loader_v1.07.111.bin(引导加载器)
○parameter.txt(分区配置文件)
○uefi/uboot_uefi.img(UEFI固件)
2.关键配置:parameter.txt中需指定uboot分区起始地址(默认0x4000)和大小(不超过0x2000,单位512Byte),并添加boot分区UUID:
uuid:boot=7A3F0000-0000-446A-8000-702F00006273
场景二:SPI Nor Flash启动
无需parameter.txt文件,仅需烧录两个文件:
•boot/rk3588_spl_loader_v1.07.111.bin(引导加载器)
•uefi/RK3588_NOR_FLASH.img(UEFI固件)
操作提示:使用瑞芯微开发工具,选择“下载升级固件”功能,按工具提示选择对应文件和地址即可。
4. 系统启动:两种启动方式灵活选择
RK平台UEFI支持Android Boot和Grub两种启动方式,可根据实际需求切换:
方式一:Android Boot启动
•核心特点:与RK3588通用Linux启动方式一致,仅需用uboot_uefi.img和boot_uefi.img替换原uboot和boot分区。
•关键要求:boot分区需采用Android格式打包(而非FIT格式),且分区的UUID、offset、size需与RK3588.dsc文件中的PcdAndroidBootDevicePath变量一致,否则会启动失败。
方式二:Grub启动(推荐Linux系统)
•核心逻辑:UEFI自动查找ESP分区中的/efi/boot/grubaa64.efi文件,通过grub.cfg配置文件加载kernel和initrd。
•编译kernel:需先编译RK3588内核生成deb包和Image文件,拷贝到系统安装盘:
cp kernel/arch/arm64/boot/Image /udisk/install.a64/vmlinuz
•cmdline传递:如需使用ttyS作为调试串口,需修改grub.cfg:
linux /install.a64/vmlinuz earlycon=uart8250,mmio32,0xfeb50000 console=ttyS2,1500000n8 --- quiet
5. 定制化配置:硬件功能按需开启
RK平台UEFI支持灵活的硬件配置,核心配置文件包括[make.sh](make.sh)(编译开关)、RK3588.dsc(变量定义)、RockchipPlatfromLib.c(硬件信息),以下是常用配置场景:
(1)SPI Nor配置
•修改IO管脚:在RockchipPlatfromLib.c的NorFspiIomux函数中,根据硬件原理图选择FSPI_M0/M1/M2模式,配置对应GPIO管脚。
•关闭模拟NV变量:修改RK3588.dsc文件,将PcdEmuVariableNvModeEnable设为FALSE。
(2)PCIE配置
•开启编译开关:在make.sh中添加-D ROCKCHIP_PCIE30。
•电源与复位配置:在Pcie30IoInit/Pcie30PowerEn函数中,根据TRM修改寄存器,配置PCIE的电源和复位GPIO。
(3)显示配置
默认关闭显示功能,需在make.sh中添加-D ROCKCHIP_VOPEN,开启显示支持。
(4)USB配置
USB2.0和Type-C host功能默认开启,如需适配自定义硬件,修改UsbPortPowerEnable函数,配置VBUS供电的GPIO管脚。
三、总结
UEFI系统以其强大的扩展性和兼容性,成为RK平台嵌入式开发的核心支撑,广泛应用于智能硬件、工业控制、边缘计算等场景。对于开发者而言,遵循“代码准备→编译固件→烧录启动→配置优化”的标准化流程,即可快速上手RK平台的UEFI开发。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !