3. 开发环境搭建:交叉编译工具链配置、内核源码获取与编译、adb/fastboot调试环境准备
SA8155 平台的 Adreno 驱动调试依赖一套完整的交叉编译与调试链路。本章将逐步搭建从源码获取、工具链配置到设备通信的完整环境,确保后续章节的驱动编译、内核模块加载与 GPU 调试能够顺利执行。
3.1 交叉编译工具链配置
SA8155 基于 ARMv8-A 架构,宿主机通常为 x86_64 Linux 工作站。必须使用交叉编译工具链将驱动代码编译为 ARM64 目标文件。
3.1.1 工具链选择与安装
| 工具链类型 | 适用场景 | 推荐版本 |
|---|---|---|
| Linaro GCC (aarch64-linux-gnu) | 内核模块、用户态驱动编译 | gcc-arm-9.2-2019.12-x86_64-aarch64-linux-gnu |
| Android NDK (clang) | Android 用户态 HAL/驱动库 | android-ndk-r25c 或更高 |
| Qualcomm Hexagon SDK | Adreno GPU 固件/DSP 侧编译 | SDK v5.x 以上 |
提示: 内核模块编译必须使用与目标内核版本匹配的 GCC 版本。SA8155 的 LA.UM.9.12 分支推荐使用 Linaro GCC 9.2,过高版本可能引入 ABI 不兼容问题。
3.1.2 环境变量配置
将工具链路径加入 PATH,并设置交叉编译前缀:
# 设置 Linaro 工具链
export CROSS_COMPILE=/opt/toolchains/gcc-arm-9.2/bin/aarch64-linux-gnu-
export ARCH=arm64
export PATH=$PATH:/opt/toolchains/gcc-arm-9.2/bin
# 验证工具链
aarch64-linux-gnu-gcc --version
# 输出应显示 aarch64-linux-gnu-gcc (GCC) 9.2.1 20191025
常见错误: 如果使用 Android NDK 的 clang 编译内核模块,必须添加
--sysroot 参数指向 NDK 的 sysroot,否则链接阶段会报 crtbegin.o 缺失错误。
3.2 内核源码获取与编译
Adreno 驱动以内核模块形式存在,需要获取 SA8155 对应的 Qualcomm 内核源码树,并完成基础编译。
3.2.1 源码获取方式
| 来源 | 仓库地址/命令 | 分支/标签 |
|---|---|---|
| Code Aurora Forum (CAF) | git clone https://source.codeaurora.org/quic/la/kernel/msm-4.19 |
LA.UM.9.12.r1-12000-SA8155.0 |
| Qualcomm ChipCode | 通过 ChipCode 门户下载 tarball | SA8155P_LA.UM.9.12 |
| OEM BSP 包 | 由 Tier1 或车厂提供 | 按项目版本号 |
3.2.2 内核编译流程
以下步骤以 CAF 源码为例,编译 SA8155 内核及 Adreno 驱动模块:
# 1. 克隆内核源码
git clone https://source.codeaurora.org/quic/la/kernel/msm-4.19 -b LA.UM.9.12.r1-12000-SA8155.0
cd msm-4.19
# 2. 使用 SA8155 默认 defconfig
make ARCH=arm64 sa8155_defconfig
# 3. 编译内核 Image 和 dtb
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image dtbs
# 4. 编译 Adreno 驱动模块(msm kgsl)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- M=drivers/gpu/drm/msm modules
# 5. 输出文件位置
# arch/arm64/boot/Image
# arch/arm64/boot/dts/qcom/sa8155*.dtb
# drivers/gpu/drm/msm/msm.ko
关键检查点: 编译完成后,使用
file arch/arm64/boot/Image 确认输出为 ELF 64-bit LSB executable, ARM aarch64。使用 modinfo drivers/gpu/drm/msm/msm.ko 查看模块依赖,确认包含 kgsl 和 ion 符号。
3.3 adb/fastboot 调试环境准备
adb 和 fastboot 是连接 SA8155 开发板或目标设备的核心调试工具,用于刷写内核、推送驱动模块、捕获 GPU 日志。
3.3.1 工具安装与版本要求
| 工具 | 最低版本 | 安装方式 |
|---|---|---|
| adb | 1.0.41 (Android 12+) | sudo apt install adb 或下载 platform-tools |
| fastboot | 1.0.41+ | sudo apt install fastboot |
| Qualcomm EDL 工具 | QFIL v2.0.1.5 | Qualcomm 官方发布包 |
3.3.2 设备连接与验证
SA8155 开发板通常通过 USB Type-C 或 USB 3.0 连接到宿主机。连接后执行以下验证:
# 检查 adb 设备
adb devices
# 输出示例:
# List of devices attached
# 1234567890abcdef device
# 进入 fastboot 模式(重启到 bootloader)
adb reboot bootloader
# 检查 fastboot 设备
fastboot devices
# 输出示例:
# 1234567890abcdef fastboot
# 刷写内核测试
fastboot flash boot arch/arm64/boot/Image
fastboot reboot
驱动问题: 在 Linux 宿主机上,如果
adb devices 显示 no permissions,需要添加 udev 规则:echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666"' | sudo tee /etc/udev/rules.d/51-android.rules,然后 sudo udevadm control --reload-rules。
3.4 开发环境整体架构
下图展示了宿主机、交叉编译工具链、内核源码与目标设备之间的数据流和调试链路:
3.5 环境验证清单
完成上述步骤后,使用以下清单逐项确认环境就绪:
| 检查项 | 验证命令 | 预期结果 |
|---|---|---|
| 交叉编译器可用 | aarch64-linux-gnu-gcc --version |
显示 GCC 9.2.1 或更高 |
| 内核 defconfig 加载 | ls .config |
文件存在且包含 CONFIG_MSM_KGSL=y |
| 内核 Image 编译 | file arch/arm64/boot/Image |
ELF 64-bit LSB ARM aarch64 |
| Adreno 模块编译 | modinfo drivers/gpu/drm/msm/msm.ko |
显示模块描述包含 "MSM DRM" |
| adb 设备识别 | adb devices |
显示设备 serial 号及 "device" 状态 |
| fastboot 模式 | fastboot devices |
显示设备 serial 号及 "fastboot" 状态 |
实战建议: 在首次编译内核前,先执行
make ARCH=arm64 savedefconfig 备份默认配置。后续修改驱动配置时,使用 make ARCH=arm64 menuconfig 调整,再通过 diff .config .config.old 追踪变更,避免遗漏关键选项。