第二章 开发环境搭建: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文件,说明你的交叉编译链和内核源码都配置对了。这一步走通了,后面的驱动开发才有基础。

最后提醒一句:环境搭建这事儿,急不得。我见过太多人为了省那半小时,结果后面花了两天来排查问题。慢慢来,每一步都验证通过再往下走,这才是老司机的做法。