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 开发环境整体架构

下图展示了宿主机、交叉编译工具链、内核源码与目标设备之间的数据流和调试链路:

SA8155 Adreno 驱动开发环境架构 宿主机 (x86_64 Linux) 交叉编译工具链 aarch64-linux-gnu-gcc Android NDK clang 内核源码树 msm-4.19 / LA.UM.9.12 drivers/gpu/drm/msm 调试工具 adb / fastboot QFIL / EDL 编译输出 Image / dtb / msm.ko adreno_kgsl.ko 传输层 USB 3.0 / PCIe / UART (fastboot / adb 协议) 目标设备 (SA8155 / ARM64) 内核空间 msm.ko (kgsl 核心) adreno_kgsl.ko (GPU 驱动) ion.ko (内存分配) 用户空间 libadreno_utils.so libgsl.so (用户态接口) adb shell / logcat 调试接口 /sys/kernel/debug/kgsl /d/kgsl/proc/*/mem dmesg / trace events

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 追踪变更,避免遗漏关键选项。