树莓派(RaspBerry) 是基于Arm架构的单板机,凭借着低廉的价格,丰富的社区资源风靡全球。
在Iot 大行其道的今天,微软也在树莓派上面开发了windows iot 的操作系统。为支持Windows,微软请Intel为树莓派开发了32位的UEFI 固件(项目地址)。但是微软的这个固件非常简陋,支持的功能也很有限。国外有位大神基于微软的项目又开发了64 位的UEFI 固件RaspberryPiPkg(项目地址),可以启动Arm 版的Windows/Linux/BSD等。微软的方案在Windows 下面编译起来非常简单,就不再赘述。这里只记录一下如何编译64位的RaspberryPiPkg 。
OS:这里要求用Linux环境,例如用的是Ubuntu 18.04.2 LTS X64
Step1:安装EDK2 build 所需的基本工具集,一个命令搞定:
sudo apt-get install build-essential git uuid-dev acpica-tools nasm python
Step2:下载安装64bit ARM 交叉编译工具集(这里与RaspberryPiPkg官方设置有差异,因为他用的是x86 OS),下载地址aarch64-linux-gnu for 64bit OS,放到工作目录下,并解压:
tar xvJf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz
Step3:下载RaspberryPiPkg:
git clone https://github.com/andreiw/RaspberryPiPkg.git
Step4:下载EDK2 code,因为某些原因要用指定的版本:
git clone git://github.com/tianocore/edk2.git
cd edk2
git reset --hard 66127011a544b90e800eb3619e84c2f94a354903
Step5:上面下载的EDK2 还需要打几个Patch:
git config --global user.email "charles@heart.com"
git config --global user.name "charles"
git am --ignore-whitespace ../RaspberryPiPkg/edk2Patches/*.patch
Step6:复制“RaspberryPiPkg\Scripts\build5”到工作目录下。并且执行它:
#最终的目录结构应该是像下面一样:
# \
# \edk2
# \RaspberryPiPkg
# \gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu
# \build5
#
修改build5里面的编译工具路径:
#export PATH=$PATH:$PWD/gcc-linaro-5.5.0-2017.10-i686_aarch64-linux-gnu/bin
export PATH=$PATH:$PWD/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin
执行build5,注意不要用root 权限来执行:
./build5
可以看到最终顺利生成 RPI_EFI.fd,这就是树莓派的UEFI 固件文件。这个文件加上闭源的GPU 固件和配置文件,放到SD卡里面就可以顺利进入UEFI Shell。
补充:
1.关于aarch64-linux-gnu,使用“sudo apt-get install gcc-aarch64-linux-gnu” 来安装的话,安装的版本是最新7.4版本。也可以正常编译,但是Release 版的文件会有奇怪的问题。所以采用RaspberryPiPkg 一致的5.5.0版本。
2.GCC 虽然要求GCC5 但是通过测试来看,使用GCC5 和GCC7 都可以正常Build 也可以启动,所以这里没有去改动GCC 的版本。想要使用GCC5的话请参考下面设定:
#下载安装gcc 5
sudo apt-get install gcc-5
#链接gcc 5到gcc
cd /usr/bin
sudo rm gcc
sudo ln -s gcc-5 gcc