3. 高通平台概述

说实话,做车载环视系统,环境搭建这一步最容易被低估。很多人觉得不就是装个SDK嘛,结果一上手就卡在交叉编译链上,一卡就是两三天。我当年第一次碰高通SA8155平台时,光是把QNX BSP的编译环境跑通,就折腾了整整一个周末。

这一章,我把这些年踩过的坑和总结的流程直接摊开讲。你跟着走,能省不少时间。

3.1 高通SDK与BSP获取

高通的车载芯片方案,比如SA8155、SA8295,它们的SDK和BSP不是公开下载的。你需要先拿到高通的授权,然后通过高通开发者网络(QDN)或者ChipCode门户获取。

组件 获取途径 说明
LE SDK(Linux Embedded) QDN / ChipCode 用于Android或Yocto Linux开发
QNX BSP QNX Software Center / 高通交付 包含Board Support Package和Hypervisor
Qualcomm Camera SDK QDN 环视算法依赖的ISP和摄像头驱动
FastCV / SNPE QDN 视觉算法加速库
我的习惯:拿到BSP后,第一件事不是编译,而是先看 release_notes.txt。里面通常会写明已知问题、依赖的编译器版本、以及补丁包。跳过这一步,后面编译报错你都不知道从哪查起。

3.2 交叉编译工具链配置

交叉编译,说白了就是在你的x86电脑上编译出能在ARM芯片上跑的程序。高通平台一般用aarch64架构。

3.2.1 工具链选择

高通官方推荐的是GCC Linaro或Android NDK。如果你做QNX开发,那就必须用QNX自家的QNX Momentics IDE自带的工具链。

# 以Android NDK为例,设置环境变量
export ANDROID_NDK_HOME=/opt/android-ndk-r25c
export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH

# 验证工具链
aarch64-linux-android21-clang++ --version
我曾经踩过的坑:工具链版本和BSP不匹配。有一次我用NDK r23编译的库,放到SA8155的Android 12系统上,一调用就段错误。查了两天才发现是NDK版本太新,ABI不兼容。后来我养成了习惯——BSP里带的工具链版本号是多少,我就用多少。

3.2.2 CMake交叉编译配置

我个人习惯用CMake管理项目。写一个toolchain.cmake文件,一劳永逸。

# toolchain.cmake for Qualcomm SA8155 Android
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21)
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a)
set(CMAKE_ANDROID_NDK /opt/android-ndk-r25c)
set(CMAKE_ANDROID_STL_TYPE c++_shared)

然后编译时这样调用:

mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake
make -j$(nproc)

3.3 ADB与Fastboot调试

这两个工具是Android平台调试的左右手。ADB负责运行时调试,Fastboot负责刷机和底层操作。

3.3.1 ADB常用命令

命令 用途 我的经验
adb devices 查看连接的设备 如果设备列表为空,先检查驱动
adb logcat 查看系统日志 配合 -s 过滤标签,比如 adb logcat -s SurroundView
adb shell 进入设备终端 调试环视算法时,我经常用这个看进程状态
adb push/pull 文件传输 把编译好的so库推到设备里测试
adb forward 端口转发 用于gdb远程调试

3.3.2 Fastboot刷机

做系统集成,刷机是家常便饭。Fastboot模式下,你可以刷写boot、system、vendor等分区。

# 进入Fastboot模式
adb reboot bootloader

# 刷写分区
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash vendor vendor.img

# 重启
fastboot reboot
避坑指南:刷机前一定要备份原始镜像。我曾经刷错vendor分区,导致摄像头驱动加载失败,环视画面全黑。还好有备份,不然得重新下载整个BSP。

3.4 Qualcomm Debugger (QD) 与 Trace32 基础

这两个工具是调试硬核问题的利器。QD是高通自己的调试器,Trace32是Lauterbach的通用调试工具。做底层驱动和BSP移植时,你几乎离不开它们。

3.4.1 Qualcomm Debugger (QD)

QD通常和JTAG/SWD调试器配合使用。它可以让你在芯片级别单步执行代码、查看寄存器状态、分析内存。

我一般在以下场景用QD:

  • 启动流程卡住,怀疑是PBL(Primary Boot Loader)问题
  • 摄像头ISP初始化失败,需要看硬件寄存器配置
  • 系统crash后,分析dump文件定位死机原因
# QD常用命令示例
# 连接目标设备
connect -device sa8155 -transport jtag

# 加载符号表
load -symbols /path/to/vmlinux

# 设置断点
breakpoint -set -address 0x80200000

# 单步执行
step -instruction

3.4.2 Trace32基础

Trace32功能更强大,但学习曲线也陡。说实话,我刚开始用Trace32时,光看那满屏的窗口就头疼。后来发现,你只需要掌握几个核心功能就行。

功能 操作 适用场景
加载ELF文件 Data.LOAD.Elf 调试裸机程序或RTOS
设置断点 Break.Set 定位代码执行路径
查看内存 Data.Dump 检查摄像头buffer数据
Trace记录 Trace.Start 分析时序问题
我的建议:如果你刚开始接触Trace32,别急着学所有功能。先学会怎么加载符号表、设置断点、查看变量值。这三个操作能解决80%的调试问题。剩下的20%,等你遇到了再查手册。

3.5 本章知识体系

下面这张图,把本章的核心内容串起来了。你可以把它当作环境搭建的路线图。

开发环境搭建与工具链知识体系 高通SDK / QNX BSP / Android BSP 获取 交叉编译工具链配置 (GCC / NDK / QNX) ADB / Fastboot 调试 QD Trace32 基础 应用层调试 / 日志分析 文件传输 / 刷机 底层驱动 寄存器调试 BSP移植 / 启动流程 时序分析 / Crash分析 目标:环视算法在目标平台稳定运行 环境搭建是环视系统集成的基石。工具链配不对,后面所有工作都白费。

嗯,这一章的内容就这些。环境搭建看着琐碎,但每一步都关系到后续开发效率。工具链配好了,调试工具用熟了,后面做环视算法集成时才能得心应手。