第二章 开发环境搭建:高通SDK安装配置、交叉编译工具链、ADB与设备调试、QNX/Android系统环境准备
做ISP算法开发,环境搭建是第一道坎。很多人觉得不就是装个SDK嘛,结果一折腾就是两三天。我刚开始接触高通平台时也踩过不少坑,今天把这些经验梳理出来,希望能帮你少走弯路。
2.1 高通SDK安装与配置
高通平台ISP开发主要依赖两个SDK:Qualcomm Camera SDK 和 Qualcomm Machine Vision SDK。前者侧重传统ISP pipeline,后者偏向AI视觉处理。实际项目中,我通常两个都装。
2.1.1 SDK版本选择
高通SDK版本跟芯片平台强相关。选错了版本,后面编译全是泪。下面这张表是我整理的常见对应关系:
| 芯片平台 | 推荐SDK版本 | API Level | 备注 |
|---|---|---|---|
| SM8450 (Snapdragon 8 Gen1) | Camera SDK v3.2+ | 30 | 支持Triple ISP |
| SM8550 (Snapdragon 8 Gen2) | Camera SDK v4.0+ | 31 | 新增AI-ISP单元 |
| SM8650 (Snapdragon 8 Gen3) | Camera SDK v4.5+ | 32 | Hexagon DSP深度集成 |
| QCS8250 (IoT/机器人) | Machine Vision SDK v2.8+ | 29 | 无显示输出,纯计算 |
2.1.2 安装步骤
高通SDK的安装其实不复杂,但有几个关键点容易忽略。我习惯按下面这个流程来:
- 下载SDK包 — 从Qualcomm CreatePoint平台获取,需要注册开发者账号。注意区分Linux和Windows版本。
- 解压到固定路径 — 我一般放在
/opt/qcom/下,避免路径中有空格或中文。 - 设置环境变量 — 这是最容易出问题的一步。需要配置
QCAMERA_SDK_ROOT和QMV_SDK_ROOT。 - 验证安装 — 运行SDK自带的sample程序,确认编译通过。
环境变量配置示例:
# 在 ~/.bashrc 中添加
export QCAMERA_SDK_ROOT=/opt/qcom/camera_sdk/v4.0
export QMV_SDK_ROOT=/opt/qcom/machine_vision_sdk/v2.8
export PATH=$PATH:$QCAMERA_SDK_ROOT/bin:$QMV_SDK_ROOT/bin
# 使配置生效
source ~/.bashrc
~/.bashrc 里加一个 alias qcom_env='source /opt/qcom/setup_env.sh',这样每次切换项目时只需要执行这个别名,不用反复改环境变量。
2.2 交叉编译工具链配置
高通平台ISP算法开发,说白了就是在PC上写代码,然后编译成能在ARM架构设备上跑的可执行文件。这就离不开交叉编译工具链。
2.2.1 工具链选择
高通官方推荐使用 Qualcomm LLVM/Clang 工具链,但实际项目中,很多人也用 ARM GCC。我个人更倾向LLVM,因为它在编译优化上更激进,生成的代码在Hexagon DSP上性能更好。
| 工具链 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Qualcomm LLVM/Clang | ISP算法、DSP加速 | 优化好,支持Hexagon | 安装包大,配置复杂 |
| ARM GCC (linaro) | 通用应用、驱动开发 | 社区活跃,文档多 | 对DSP支持弱 |
| Android NDK | Android平台应用 | 与Android系统集成好 | 只支持Android |
2.2.2 配置步骤
以Qualcomm LLVM为例,配置过程如下:
- 下载工具链包(约2GB),解压到
/opt/qcom/llvm。 - 设置
CC和CXX环境变量指向LLVM的clang和clang++。 - 配置
CMAKE_TOOLCHAIN_FILE,指向高通提供的cmake配置。 - 测试编译一个简单的hello world程序,确认能生成ARM架构的可执行文件。
CMake交叉编译配置示例:
# toolchain_qcom.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER /opt/qcom/llvm/bin/clang)
set(CMAKE_CXX_COMPILER /opt/qcom/llvm/bin/clang++)
set(CMAKE_FIND_ROOT_PATH /opt/qcom/sysroot)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
sysroot 必须指向目标设备的根文件系统。我曾经因为sysroot路径配错,导致链接时找不到libc.so,排查了半天才发现是路径问题。
2.3 ADB与设备调试
ADB(Android Debug Bridge)是连接PC和高通设备的核心工具。不管是Android还是QNX系统,ADB都是调试利器。
2.3.1 ADB安装与配置
ADB通常随Android SDK一起安装,但也可以单独下载。我建议用最新版,因为高通设备对ADB版本有要求。
# 安装ADB(Ubuntu)
sudo apt install adb
# 验证版本
adb version
# 连接设备
adb devices
如果 adb devices 看不到设备,别慌。先检查USB驱动,再确认设备是否开启了开发者模式。我遇到过好几次,都是因为USB线质量不好导致连接不稳定。
2.3.2 常用调试命令
ISP算法开发中,下面这些ADB命令我几乎天天用:
| 命令 | 用途 | 示例 |
|---|---|---|
adb push |
将PC文件推送到设备 | adb push isp_test /data/local/tmp/ |
adb pull |
从设备拉取文件到PC | adb pull /data/capture.raw ./ |
adb shell |
进入设备shell | adb shell |
adb logcat |
查看设备日志 | adb logcat -s ISP_TAG |
adb forward |
端口转发 | adb forward tcp:8888 tcp:8888 |
__android_log_print(ANDROID_LOG_DEBUG, "ISP_TAG", "value=%d", val);,然后用 adb logcat -s ISP_TAG 过滤日志。这样调试信息一目了然,不会被系统日志淹没。
2.4 QNX/Android系统环境准备
高通平台ISP算法可以运行在Android或QNX系统上。两者差异很大,需要分别准备环境。
2.4.1 Android系统环境
Android环境相对简单,因为高通SDK对Android支持最好。需要准备:
- Android SDK — 至少API Level 30以上。
- NDK — 用于编译原生代码。
- 设备权限 — 需要root权限才能访问ISP硬件寄存器。
我建议在Android设备上先跑一遍高通官方的Camera HAL测试用例,确认ISP pipeline能正常工作。
2.4.2 QNX系统环境
QNX环境就复杂多了。QNX是一个实时操作系统,常用于车载和工业场景。配置QNX环境时,有几个关键点:
- QNX SDP — 需要安装QNX Software Development Platform,这是开发QNX应用的基础。
- 高通BSP — 针对具体芯片的板级支持包,包含ISP驱动和库文件。
- 网络调试 — QNX设备通常通过以太网连接,需要配置IP地址。
QNX环境变量配置示例:
# QNX环境变量
export QNX_HOST=/opt/qnx/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx/qnx710/target/qnx7
export PATH=$PATH:$QNX_HOST/usr/bin
# 高通BSP路径
export QCAMERA_BSP=/opt/qcom/bsp/sm8550_qnx
export LD_LIBRARY_PATH=$QCAMERA_BSP/lib:$LD_LIBRARY_PATH
qconn 或 ssh 连接设备。我第一次用QNX时,找了半天才发现没有 adb logcat,只能用 slog2info 看日志。
2.5 环境搭建知识体系
下面这张图总结了本章的核心内容,帮你理清各个组件之间的关系:
2.6 常见问题与避坑指南
环境搭建过程中,有几个问题几乎每个人都会遇到。我把自己踩过的坑整理了一下:
原因通常是环境变量没配好,或者SDK路径有空格。我曾经因为把SDK放在
/home/user/my sdk/ 下,编译时死活找不到头文件,折腾了半天才发现是路径空格的问题。
先检查USB线,再确认设备驱动。我遇到过最奇葩的一次,是USB3.0线不兼容,换成USB2.0线就好了。
通常是BSP版本和SDK版本不匹配。建议先查看高通Release Notes,确认BSP和SDK的对应关系。
嗯,环境搭建这部分就讲到这里。记住一个原则:版本匹配是王道,路径配置要小心。把这些基础打牢了,后面写ISP算法才能顺风顺水。