LoongArch平台UEFI固件的编译,目前支持两种编译方法。
1、X86平台交叉编译:需要搭建相应的编译环境,搭建方法如下面章节所述。
2、LoongArch平台本地编译:如使用3A5000机器,只需要按照下面编译方法进行编译即可。
本文以X86平台交叉编译为例进行介绍。
源码名称: uefi-loongarch
**编译工具:**现支持GCC8.3 编译器
**基线版本:**基于 TianoCore 的 UDK2018
**编译器:**loongarch64-linux-gnu-2021-08-09-vector.tgz
**开发机系统:**Ubuntu 17.10为例进行操作步骤。
解压编译器到/opt目录下。
# tar xf loongarch64-linux-gnu-2021-08-09-vector.tar.gz -C /opt/
设置环境变量的方法有两种:临时设置和永久设置。
临时设置的方法
1、创建一个脚本文件env.sh
文件内容如下:
#!/bin/bash
set -x
CC_PREFIX=/opt/loongarch64-linux-gnu-2021-08-09-vector
export PATH=$CC_PREFIX/bin/:$PATH
export LD_LIBRARY_PATH=$CC_PREFIX/lib:$LD_LIBRARY_PATH
set +x
2、给env.sh添加可执行权限
#chmod +x env.sh
3、执行脚本,生效环境变量
#source env.sh
4、查看是否生效
命令行下输入loongarch然后按Tab键看是否出现loongarch64-linux-gnu相关信息。如出现如下信息,则说明交叉编译器的环境配置成功。接下来只需要在当前终端命令行进行编译UEFI源码即可。
# loongarch
loongarch64-linux-gnu-cpp loongarch64-linux-gnu-gcc-nm loongarch64-linux-gnu-gprof loongarch64-linux-gnu-ranlib
loongarch64-linux-gnu-addr2line loongarch64-linux-gnu-elfedit loongarch64-linux-gnu-gcc-ranlib loongarch64-linux-gnu-ld loongarch64-linux-gnu-readelf
loongarch64-linux-gnu-ar loongarch64-linux-gnu-g++ loongarch64-linux-gnu-gcov loongarch64-linux-gnu-ld.bfd loongarch64-linux-gnu-size
loongarch64-linux-gnu-as loongarch64-linux-gnu-gcc loongarch64-linux-gnu-gcov-dump loongarch64-linux-gnu-nm loongarch64-linux-gnu-strings
loongarch64-linux-gnu-c++ loongarch64-linux-gnu-gcc-8.3.0 loongarch64-linux-gnu-gcov-tool loongarch64-linux-gnu-objcopy loongarch64-linux-gnu-strip
loongarch64-linux-gnu-c++filt loongarch64-linux-gnu-gcc-ar loongarch64-linux-gnu-gfortran loongarch64-linux-gnu-objdump loongarch64-mips-gcc
永久设置方法
临时设置环境变量仅在当前终端窗口的命令行有效,更换终端窗口则需要重新配置。永久配置就是将环境变量写入一些系统启动过程中自动生效的配置文件中,如.bashrc配置文件。这样就不用每次编译之前去执行env.sh脚本了。
1、开打文件,将设置内容写入文件.bashrc文件的末尾
#vim ~/.bashrc
设置内容如下:
export PATH=/opt/loongarch64-linux-gnu-2021-08-09/bin:$PATH
export LD_LIBRARY_PATH=/opt/loongarch64-linux-gnu-2021-08-09/lib:/opt/loongarch64-linux-gnu-2021-08-09/loongarch64-linux-gnu/lib:$LD_LIBRARY_PATH
export CROSS_COMPILE=loongarch64-linux-gnu-
export ARCH=loongarch
保存退出。
2、生效环境变量
生效环境变量的方法有两种:
(1) 可以在命令行通过如下命令进行生效操作
#source ./bashrc
(2) 通过重启系统的方式进行生效操作
#reboot
3、查看是否生效
命令行下输入loongarch然后按Tab键,同上文所述。
UDK2018龙芯版本的编译引入了配置文件,具体见LsRefCodePkg/SampleCode/Desktop/Script/Desktop.cfg文件中的配置选项。
1、解压源码
# tar xf uefi-loongarch.tgz
2、进入编译目录
#cd uefi-loongarch/LsRefCodePkg/SampleCode/Desktop/Script
3、修改配置文件
#vim Desktop.cfg
打开配置就是将配置项前面"#“去掉,去掉相应的配置项则在配置项前面加”#根"据自己需求进行更改,不修改则按照默认配置进行编译。
4、编译源码
#./build.sh
编译完成后,会在目录LsRefCodePkg/SampleCode/Desktop/Script下生成一个LS3A50007A.fd文件。
5、编译方式切换
编译的文件分为两个版本,一个是DEBUG版本,方便大家调试使用。另外一个是RELEASE版本,去掉很多调试信息,能快速启动,可以用于正式产品。源码包中的Desktop.cfg配置文件中默认的是DEBUG版本。如果更改成RELEASE版本则直接按照如下修改Desktop.cfg文件中的配置:
#########################################
#
# Compile Type: DEBUG, RELEASE ...
#
#########################################
# DEFINE COMP_TYPE = DEBUG
DEFINE COMP_TYPE = RELEASE
同样会在目录LsRefCodePkg/SampleCode/Desktop/Script下生成一个LS3A50007A.fd文件。同时生成一个目录Build,不同的模式下编译生成的二进制文件存放目录不同。
DEBUG模式:
Build/Ls3a50007a/DEBUG_GCC83/FV/LS3A50007A.fd
RELEASE模式:
Build/Ls3a50007a/RELEASE_GCC83/FV/LS3A50007A.fd
6、编译过程中可能出现的问题
(1) 编译过程中出现如下错误。
Building ... /uefi-loongarch/MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf [LOONGARCH64]
Building ... /uefi-loongarch/MdePkg/Library/BaseLib/BaseLib.inf [LOONGARCH64]
/bin/sh: 1: /loongarch64-linux-gnu-gcc: not found
make: *** [/uefi-loongarch/Build/Ls3a50007a/DEBUG_GCC83/LOONGARCH64/MdePkg/Library/BasePcdLibNull/BasePcdLibNull/OUTPUT/PcdLib.obj] Error 127
解决方法:
a、确认编译的环境变量是否生效,保证环境变量生效能找到编译器。
b、在编译代码之前执行./build.sh clean,对上次编译代码的中间文件进行清理。
c、再次编译即可。
(2) 编译过程中出现如下错误:
bin/sh: 1: iasl: not found
GNUmakefile:302: recipe for target '/uefi-loongarch/Build/Ls3a50007a/DEBUG_GCC83/LOONGARCH64/LsRefCodePkg/SampleCode/Desktop/Acpi/AcpiTables/AcpiTables/OUTPUT/Dsdt.aml' failed
make: *** [/uefi-loongarch/Build/Ls3a50007a/DEBUG_GCC83/LOONGARCH64/LsRefCodePkg/SampleCode/Desktop/Acpi/AcpiTables/AcpiTables/OUTPUT/Dsdt.aml] Error 127
解决方法:
安装iasl
#apt install iasl
再次编译即可。
LoongArch平台UEFI固件的烧写方式与MIPS平台UEFI的烧写方式一致。主要通过JTAG烧写、编程器烧写和UEFI在线烧写及PMON下更新UEFI和UEFI下更新PMON。
注意:LS3A50007A.fd文件大小为4MB,因此烧写固件的flash大小不能小于4MB。龙芯3A5000-7A1000单路开发板存放UEFI固件SPI flash型号为:Wb25Q32(该flash为低压1.8V芯片非3.3V)。
编程器烧写方法
从板卡上取出Flash芯片放入编程器的座内,选择编程器中对应的Flash型号,导入需要烧写的二进制文件LS3A50007A.fd。点击烧写并等待烧写完毕。由于烧写器型号不一,这里不再进行详细介绍,根据烧写器的说明进行操作即可。
UEFI在线烧写方法
1、将烧写的UEFI二进制文件LS3A50007A.fd放入U盘。
2、板卡启动之前将U盘插入USB口。
3、启动板卡,等待运行到出现“LOONGSON龙芯”图标,按"F12"键。
进入如下界面:
4、选择"UEFI Shell",进入UEFI的shell界面。
5、根据显示上方的设备列表,输入"FS1:“进入U盘设备,执行烧写命令"spi -u LS3A50007A.fd”,如下图所示:
6、通过输入"reset"命令重启后即为更新后的UEFI固件。
PMON下更新成UEFI
1、将烧写的UEFI二进制文件LS3A50007A.fd放入U盘。
2、板卡启动之前将U盘插入USB口。
3、启动板卡到PMON shell命令行,执行如下烧写命令即可。
4、输入重启命令即可启动更新后的UEFI。
PMON>reboot
UEFI下更新成PMON
1、将烧写的PMON二进制文件gzrom.bin放入U盘。
2、同UEFI在线烧写方法步骤2-4。
3、根据显示上方的设备列表,输入"FS1:“进入U盘设备,执行烧写命令"spi -u gzrom.bin”
4、通过输入"reset"命令重启后即为更新后的PMON固件。
–end–
想了解更多相关知识请关注公众号。