第二章 开发环境搭建:Ubuntu系统安装、交叉编译工具链配置、高通CodeAurora源码下载与同步
说实话,做高通芯片驱动开发这么多年,我见过太多新手在环境搭建这一步就栽了跟头。有人装了个不兼容的Ubuntu版本,折腾三天连源码都编译不过。也有人交叉编译链配错了,跑起来全是段错误。嗯,这一章咱们就把这些坑一个个填平。
2.1 Ubuntu系统安装——选对版本很重要
我个人习惯用Ubuntu 18.04 LTS或20.04 LTS。为什么?因为高通CodeAurora官方文档里,测试最多的就是这两个版本。你想想看,用个22.04或者24.04,虽然新,但很多依赖包的版本对不上,反而给自己找麻烦。
推荐配置:
- 系统:Ubuntu 18.04.6 LTS 或 20.04.4 LTS
- 磁盘:至少200GB空闲空间(源码+编译产物很占地方)
- 内存:16GB以上(我试过8GB,编译到一半直接OOM)
- CPU:4核以上(多核编译能省不少时间)
安装时有个小细节——分区。我建议把/home单独分出来,至少给100GB。因为高通源码同步下来,光.git目录就十几个GB。有一次我同事没注意,根目录直接爆满,编译到99%失败了,那叫一个崩溃。
我的小技巧:装完系统第一件事,换国内源。别问为什么,你试试不换源去apt install一个包,等个十分钟你就懂了。
2.2 交叉编译工具链配置——别让工具链成为拦路虎
高通芯片驱动开发,说白了就是ARM架构的嵌入式开发。你得在x86的PC上编译出能在ARM芯片上跑的代码。这个中间人,就是交叉编译工具链。
高通官方推荐用aarch64-linux-gnu-这个前缀的工具链。我一般直接从Linaro官网下载预编译版本:
# 下载ARM64工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/
# 配置环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
我曾经遇到过一个问题:工具链版本太新,编译出来的内核模块加载时直接报错。后来查了半天,发现是工具链的ABI不兼容。所以我的建议是,用高通CodeAurora源码里推荐的版本,别自己瞎升级。
注意:环境变量最好写到~/.bashrc里,不然每次开新终端都要重新export。我见过有人忘了这茬,编译时一直报"command not found",急得直跺脚。
2.3 高通CodeAurora源码下载与同步——耐心是美德
CodeAurora是高通的开源代码托管平台。说白了你得从这里拉下来Linux内核、驱动框架、硬件抽象层这些代码。
首先,你得装个repo工具。这是Google搞的,专门用来管理多Git仓库的项目:
# 安装repo
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
然后,找到你要用的平台对应的manifest文件。比如我做过骁龙865(SM8250)的驱动开发,就用这个:
# 创建工作目录
mkdir -p ~/qcom_sm8250
cd ~/qcom_sm8250
# 初始化repo
repo init -u https://source.codeaurora.org/quic/la/platform/manifest -b release -m LA.UM.9.1.r1-12300-SM8250.0.xml
# 同步源码(这一步最耗时)
repo sync -j4
关于同步速度:
- 第一次同步大概需要2-4小时(看网速)
- 建议用-j4或-j8参数,多线程下载
- 如果中途断了,重新执行repo sync会断点续传
- 我试过用-j16,结果把路由器搞崩了...所以别太贪心
同步完成后,你会看到一堆目录。其中最重要的几个:
| 目录名 | 内容说明 |
|---|---|
| kernel/msm-4.19 | 高通MSM内核源码,驱动开发的主战场 |
| vendor/qcom | 高通私有驱动和HAL层代码 |
| device/qcom | 设备树、板级配置、init脚本 |
| hardware/qcom | 音频、显示、相机等硬件抽象层 |
嗯,这里要特别提醒一下。同步完成后,别急着编译。先检查一下.git/config文件,看看remote对不对。我遇到过有人同步时网络断了,结果有些仓库没拉全,编译到一半报"missing file"的错误。
避坑指南:我曾经在同步时用了--no-clone-bundle参数,结果速度慢得像蜗牛。后来发现,不加这个参数,repo会先下载一个bundle文件,能省不少时间。所以除非你网络实在不行,否则别加这个参数。
2.4 验证环境——跑个Hello World试试
环境搭好了,总得验证一下能不能用。我习惯先写个简单的内核模块:
// hello_qcom.c
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello from Qualcomm Driver!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye from Qualcomm Driver!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL v2");
然后写个Makefile:
obj-m := hello_qcom.o
KDIR := /path/to/your/kernel/msm-4.19
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
如果能编译出.ko文件,说明你的交叉编译链和内核源码都配置对了。这一步走通了,后面的驱动开发才有基础。
最后提醒一句:环境搭建这事儿,急不得。我见过太多人为了省那半小时,结果后面花了两天来排查问题。慢慢来,每一步都验证通过再往下走,这才是老司机的做法。