高通板支持包 BSP 编译指南
大环境准备
操作系统
高通官方推荐比较老的 Ubuntu 14.04, 18.04 LTS等,但我不信邪,偏用 Debain 12.
软件包
系统软件包
Python2 & pip2
安装 Python 2.7 并设置 /usr/bin/python 为 python2
首先引入 Debian 11 的主软件源,并执行sudo apt update
。
随后安装python2
和python2-minimal
包。
sudo rm -f /usr/bin/python sudo ln -s /usr/bin/python2 /usr/bin/python
安装 pip2 并安装 python2 相关库。
(如果有 pip3,则修改 pip 链接到 pip2)pip install pycryptodome future six
OpenSSL 1.1.1
Debian 12 自带 OpenSSL 3,而且版本会越来越新,因此我们需要手动编译安装 OpenSSL 1.1.1,并且将其设置为默认openssl
命令的执行程序。
2.1. 编译 OpenSSL 1.1.1wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz tar zxf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl make -j$(nproc) make install
2.2. 链接并设置为默认程序
sudo mv /usr/bin/openssl /usr/bin/openssl3 sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl1 sudo ln -s /usr/bin/openssl1 /usr/bin/openssl
GCC 9 & g++ 9
由于高通的 Bootloader (XBL) 源码中包含 EDK II 项目代码,又由于 EDK II 旧版的部分代码没有修复在新版 GCC 编译器上出现的问题,因此除非手动修改部分程序(如GetFds
)的代码,否则我们还需要安装 GCC 9 和 g++ 9。sudo apt update && sudo apt install gcc-9 g++-9
高通软件包
编译高通的系统组件还需要高通自己修改的 LLVM 和 Linaro GCC 等工具,通常情况我们只需要保证下载的工具的主要版本(X.Y)匹配即可,对于小的 Rev 则可以选用最新的。
- 下载 Linaro GCC 4.9-2014.07
此工具可以直接在 Linaro 网站上下载。 - 下载 Qualcomm Snapdragon LLVM Compiler for Linux
我们需要下载 v4.0.17 和 v8.0.3 两个版本,高通要求其私有 Linux 软件包只能通过 QPM3 下载,由于 QPM3 无法在 Debian 12 上正常运行(截至2025年1月17日),所以我们可以直接在高通 QCS8250 的产品页面上,登录高通账号下载。
也可以在 Ubuntu 18.04 中安装 QPM3,登录高通账号下载安装后手动导出。
下载后解压到特定目录,并记住每个版本文件夹的路径。(如/home/levi/toolchains/qualcomm-sd-llvm-4.0.17
等)
编译板支持包 BSP
登录高通 ChipCode 门户,在 Product 中选择产品 QCS8250
,选择 qcs8250-la-2-0_ap_standard_oem
,进入页面后复制仓库地址。提前设置 http.followRedirects
为 true
,随后使用 git clone 下载。
需要注意,1.x本和 2.0 的包目录结构不一样,会在外面套一个用于分类软件包的文件夹。例如在 1.x 版本的 BSP 中,直接就是 boot_images/
文件夹,但在 2.0 中会变成 BOOT.XF.3.2/boot_images/
。
p.s. 高通就把 Board Support Package 翻译成“板支持包”。
环境准备
Bootloader (XBL) 编译环境准备
高通在 QCS8250 的 2.0 版本的 BSP 中引入了 UEFI (EDK II),所以编译 XBL 的过程中也编译了 EDK II 的部分源码,因此需要确保 EDK II 的BaseTools
被正确编译。(否则编译过程会报错 7000,提示无法调用 minigzip)
执行命令:cd <workspace>/qcs8250-la-2-0_ap_standard_oem/BOOT.XF.3.2/boot_images/BaseTools make
需要注意,编译时脚本会自动设置 Sectools 签名策略为
MULTIPLE_DEFAULT_SIGN
,不需要再手动设置 Sectools 签名策略。Sectools 的签名策略有下面几个选项:DEFAULT_SIGN
,DEFAULT_INTEGRITY_SIGN_ATTR
,DEFAULT_SIGN_UPDATE_UNSIGN
,DEFAULT_UNSIGN
,DEFAULT_SUBFOLDER_SIGN
,DEFAULT_SUBFOLDER_INTEGRITY_SIGN_ATTR
,SUBFOLDER_MULTIPLE_SIGN_AND_ENCRYPT
,MULTIPLE_DEFAULT_SIGN
,MULTIPLE_DEFAULT_SIGN_ENCRYPT
如果需要设置的话,直接使用export
命令设置任意一个策略为1
就好了,需要注意的是,每次只有一个签名策略被启用,不能同时有两个以上。
还需要注意,如果没有安装和使用 OpenSSL 1.1.1 版本,编译过程会因为 Sectools 失败而中止。
在 QcomPkg/toolchainconfig.json
中修改 CLANG40
、CLANG80
中 LINUX
项的值为你安装的 Qualcomm Snapdragon LLVM for Linux 对应的 4.0.X
和 8.0.3
的目录。
编译
使用高通提供的用户手册内的编译命令进行编译即可。为防止泄密,不贴出编译命令,毕竟高通给的所有文件里都有水印,还写着“Confidential - May Contain Trade Secrets”(笑)。
困惑和问题
- 观察 Bootloader (XBL) 的编译过程发现,在固件签名时,似乎使用的是默认的
secimagev3.xml
配置文件,为什么不用 QCS8250 (SM8250) 的专用配置文件sm8250_secimage.xml
呢?