2. 开发环境搭建:高通SDK安装、交叉编译工具链配置、ADB与Fastboot调试环境
在SA8155平台的GPU驱动与MDP通路调试中,开发环境的搭建是后续所有工作的基础。本章将系统讲解高通SDK的安装流程、交叉编译工具链的配置方法,以及ADB与Fastboot调试环境的建立。一个稳定、可复现的开发环境能够显著提升调试效率,避免因环境不一致导致的“灵异问题”。
2.1 高通SDK安装
高通为SA8155平台提供了专用的SDK包,通常包含BSP(Board Support Package)、GPU驱动源码、MDP(Mobile Display Processor)驱动以及用户空间库。安装过程需严格遵循版本依赖关系。
2.1.1 安装包获取与解压
从高通官方或OEM厂商获取SDK压缩包(通常为 SA8155_LA.x.x.x.tar.gz 格式)。将其放置于工作目录并解压:
# 创建专用工作目录
mkdir -p ~/sa8155_workspace
cd ~/sa8155_workspace
# 解压SDK(以LA.UM.9.15.2.r1为例)
tar -xzf SA8155_LA.UM.9.15.2.r1.tar.gz
# 解压后目录结构示例
ls -l
drwxr-xr-x android # Android源码根目录
drwxr-xr-x vendor/qcom # 高通私有代码与驱动
drwxr-xr-x kernel # 内核源码
-rw-r--r-- build_instructions.pdf
2.1.2 依赖包安装
SDK编译需要大量宿主机依赖包。使用以下命令安装核心依赖:
sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
libncurses5-dev x11proto-core-dev libx11-dev libgl1-mesa-dev \
libxml2-utils xsltproc unzip python2 python3
python 命令指向 Python 2,否则编译会报错。建议使用 update-alternatives 进行管理。
2.1.3 SDK环境变量配置
将以下环境变量添加到 ~/.bashrc 中,以便每次打开终端时自动加载:
# SA8155 SDK 环境变量
export ANDROID_BUILD_TOP=~/sa8155_workspace/android
export PATH=$ANDROID_BUILD_TOP/out/host/linux-x86/bin:$PATH
export PATH=$ANDROID_BUILD_TOP/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
export PATH=$ANDROID_BUILD_TOP/prebuilts/clang/host/linux-x86/clang-r450784d/bin:$PATH
# 设置默认 Python 版本
alias python=python2
执行 source ~/.bashrc 使配置生效。
$ANDROID_BUILD_TOP 目录,执行 source build/envsetup.sh 并运行 lunch 命令。如果能看到 qssi-userdebug 或 sa8155-userdebug 等编译目标,则SDK安装成功。
2.2 交叉编译工具链配置
SA8155平台采用ARMv8-A架构,宿主机为x86_64架构,因此必须使用交叉编译工具链生成目标平台的可执行文件。工具链配置的准确性直接影响GPU驱动和MDP模块的编译结果。
2.2.1 工具链类型与选择
| 工具链类型 | 用途 | 路径示例 |
|---|---|---|
| aarch64-linux-android-4.9 | 内核模块、Bootloader编译 | prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin |
| clang-r450784d | Android用户空间、GPU驱动用户态库 | prebuilts/clang/host/linux-x86/clang-r450784d/bin |
| aarch64-linux-gnu- | 独立Linux应用、测试工具编译 | 需单独安装:sudo apt install gcc-aarch64-linux-gnu |
2.2.2 内核模块交叉编译配置
编译GPU驱动内核模块(如 msm_drm.ko)时,需要指定正确的交叉编译器和架构:
# 进入内核源码目录
cd $ANDROID_BUILD_TOP/kernel/msm-4.19
# 配置交叉编译环境
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export CLANG_TRIPLE=aarch64-linux-gnu-
export CC=clang
# 编译内核及GPU驱动模块
make defconfig # 使用SA8155默认配置
make -j$(nproc) Image dtbs modules
drivers/gpu/drm/msm/ 目录下是否生成了 msm.ko 文件。该文件是GPU和MDP驱动的核心内核模块。
2.2.3 用户空间库交叉编译
GPU驱动用户空间部分(如 libGLESv2_adreno.so、libq3dtools_adreno.so)通过Android的 Soong 构建系统编译。在SDK根目录执行:
cd $ANDROID_BUILD_TOP
source build/envsetup.sh
lunch sa8155-userdebug
# 编译GPU相关模块
make -j$(nproc) libGLESv2_adreno libq3dtools_adreno libgsl
cannot find -lc 错误,通常是因为工具链的 sysroot 路径未正确设置。检查 build/soong/cc/config/global.go 中的 ToolchainLocation 配置是否正确指向了SDK内的预编译工具链。
2.3 ADB与Fastboot调试环境
ADB(Android Debug Bridge)和Fastboot是SA8155平台最核心的调试工具。ADB用于运行时调试、日志抓取和文件传输;Fastboot用于刷写分区和恢复系统。
2.3.1 ADB环境配置
SA8155平台使用标准的ADB协议,但需要确保版本兼容性:
# 安装ADB(推荐使用SDK内置版本)
sudo apt install adb fastboot # 系统包管理器安装(版本可能较旧)
# 推荐使用SDK内置的ADB(版本更新,兼容性更好)
export PATH=$ANDROID_BUILD_TOP/prebuilts/misc/linux-x86/platform-tools/adb:$PATH
# 验证ADB版本
adb --version
# 输出示例:Android Debug Bridge version 1.0.41
2.3.2 设备连接与权限配置
通过USB连接SA8155开发板后,需要配置udev规则以确保ADB能够识别设备:
# 创建udev规则文件
sudo vim /etc/udev/rules.d/51-android.rules
# 添加高通设备规则(VID: 0x05C6)
SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
# 重新加载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger
# 重启ADB服务
adb kill-server
adb start-server
adb devices
adb devices 显示设备状态为 unauthorized,请检查开发板屏幕上的USB调试授权弹窗。对于无头设备,可通过 adb wait-for-device 命令等待设备就绪。
2.3.3 Fastboot模式与刷写
Fastboot用于在bootloader阶段与设备通信,常用于刷写GPU固件和MDP配置分区:
# 进入Fastboot模式(在ADB连接状态下)
adb reboot bootloader
# 或者通过按键组合进入(SA8155开发板通常为:按住音量上+电源键)
# 验证Fastboot连接
fastboot devices
# 常用Fastboot命令
fastboot flash boot boot.img # 刷写boot分区(包含内核)
fastboot flash vendor vendor.img # 刷写vendor分区(包含GPU驱动库)
fastboot flash dtbo dtbo.img # 刷写设备树覆盖层
fastboot flash persist persist.img # 刷写持久化分区(MDP校准数据)
# 重启设备
fastboot reboot
2.3.4 GPU驱动调试常用ADB命令
| 命令 | 用途 | 示例输出 |
|---|---|---|
adb shell dmesg | grep msm |
查看GPU/MDP内核日志 | [msm] msm_drm_init: msm_drm driver initialized |
adb shell cat /sys/kernel/debug/dri/0/state |
查看显示管道状态 | plane[0]: fb_id=123, crtc_id=0 |
adb shell getprop | grep gpu |
查看GPU系统属性 | [ro.gpu.driver]: [1.15] |
adb shell dumpsys display |
查看显示系统状态 | Display 0: state=ON, mode=1920x1080 |
fastboot getvar all 确认当前分区表和槽位(slot)。错误的刷写可能导致设备变砖。建议在刷写前备份原始分区镜像。
2.4 环境验证与常见问题
完成上述配置后,建议执行一个完整的编译-刷写-验证闭环,确保环境可用:
# 1. 编译内核模块
cd $ANDROID_BUILD_TOP/kernel/msm-4.19
make -j$(nproc) Image dtbs modules
# 2. 编译用户空间库
cd $ANDROID_BUILD_TOP
make -j$(nproc) libGLESv2_adreno
# 3. 打包并刷写
make -j$(nproc) bootimage
fastboot flash boot out/target/product/sa8155/boot.img
# 4. 验证GPU驱动加载
adb reboot
adb shell dmesg | grep -E "msm|adreno|mdp"
# 预期输出包含: adreno 5000000.gpu: [drm] adreno_init() done
- SDK安装:
lunch命令能否列出sa8155-userdebug目标? - 工具链:
aarch64-linux-android-gcc --version能否正常输出? - ADB:
adb devices是否显示设备状态为device? - Fastboot:
fastboot devices在bootloader模式下能否识别设备?