3. 开发环境搭建与源码获取:高通平台Camera HAL源码目录结构,QNX/Android侧编译环境配置,关键工具链准备
在高通Camera HAL层移植项目中,开发环境的搭建是决定后续调试效率的关键环节。本章将系统梳理高通平台Camera HAL的源码目录结构、QNX与Android双系统的编译环境配置方法,以及必备工具链的准备清单。掌握这些基础,才能在实际适配中快速定位编译错误与链接问题。
3.1 高通Camera HAL源码目录结构
高通Camera HAL源码通常位于 vendor/qcom/proprietary/camera 或 vendor/qcom/opensource/camera 目录下,其核心模块组织如下表所示:
| 目录/文件 | 功能描述 | 关键子模块 |
|---|---|---|
camera_hal/ | HAL层主入口,实现Camera HAL3接口 | QCamera2HAL.cpp, QCamera3HAL.cpp |
mm-camera2/ | 多媒体框架层,包含ISP、JPEG、Sensor等 | isp/, sensor/, jpeg/ |
camera_metadata/ | Camera元数据解析与封装 | metadata_parser.cpp |
camera_common/ | 公共工具库,如日志、内存管理 | cam_log.cpp, cam_mem.cpp |
camera_plugin/ | 第三方算法插件接口 | plugin_manager.cpp |
camera_test/ | HAL层单元测试与压力测试 | test_camera3.cpp |
目录结构要点: 移植时重点关注 mm-camera2/sensor/ 下的Sensor驱动适配,以及 camera_hal/ 中的HAL接口实现。不同平台(如SM8450、SM8550)的目录布局基本一致,但部分模块路径可能因QSSI(Qualcomm Single System Image)策略有所调整。
3.2 QNX侧编译环境配置
QNX侧Camera HAL编译依赖高通提供的QNX SDK和Board Support Package(BSP)。配置步骤如下:
- 安装QNX SDK:从高通官方获取QNX 7.1或8.0的SDK安装包,执行
qnx710-install脚本。 - 设置环境变量:在
~/.bashrc中添加QNX工具链路径。 - 配置BSP:将平台BSP(如
qcs8250_bsp)解压到$QNX_TARGET目录。 - 编译Camera HAL模块:使用
make或qmake构建。
QNX环境变量配置示例:
export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
export MAKEFLAGS="-j16"
| 环境变量 | 说明 | 典型值 |
|---|---|---|
QNX_HOST | 主机工具链路径 | /opt/qnx710/host/linux/x86_64 |
QNX_TARGET | 目标系统根目录 | /opt/qnx710/target/qnx7 |
QNX_BSP | 平台BSP路径 | /opt/qnx710/target/qnx7/bsp/qcs8250 |
CAMERA_HAL_PATH | Camera HAL源码路径 | /home/user/camera_hal_qnx |
常见问题: QNX侧编译时容易遇到 libcamx 或 libcamera 的链接错误,通常是因为BSP版本与SDK不匹配。建议使用高通官方提供的 manifest.xml 文件进行版本对齐。
3.3 Android侧编译环境配置
Android侧Camera HAL编译集成在AOSP(Android Open Source Project)构建系统中。配置要点如下:
- 初始化AOSP环境:执行
source build/envsetup.sh和lunch选择目标平台(如lunch qssi-userdebug)。 - Camera HAL模块路径:在
device/qcom/或vendor/qcom/下的BoardConfig.mk中配置CAMERA_HAL_PATH。 - 编译命令:使用
mmma或make编译指定模块。
Android侧编译命令示例:
source build/envsetup.sh
lunch qssi-userdebug
cd vendor/qcom/opensource/camera
mmma -j16
| 编译目标 | 命令 | 输出产物 |
|---|---|---|
| 完整HAL模块 | mmma vendor/qcom/opensource/camera | camera.qcom.so |
| 单个Sensor驱动 | mmma vendor/qcom/opensource/camera/mm-camera2/sensor | libsensor.so |
| 测试用例 | mmma vendor/qcom/opensource/camera/camera_test | camera_test |
Android侧注意事项: 如果使用QSSI(Qualcomm Single System Image)架构,Camera HAL可能位于 vendor/qcom/opensource/camera 而非 vendor/qcom/proprietary。编译前务必确认 Android.bp 或 Android.mk 中的依赖路径是否正确。
3.4 关键工具链准备
无论是QNX还是Android侧,以下工具链都是Camera HAL移植的必备组件:
| 工具/工具链 | 用途 | 获取方式 |
|---|---|---|
| GCC/Clang交叉编译器 | 编译目标平台二进制 | QNX SDK自带;Android NDK |
| Make/CMake | 构建系统 | 系统包管理器安装 |
| Python 3.x | 脚本支持、代码生成 | 系统包管理器安装 |
| Repo工具 | 管理多Git仓库源码 | apt install repo |
| ADB/Fastboot | 设备调试与刷机 | Android SDK Platform Tools |
| QNX Momentics IDE | QNX侧调试与分析 | 高通QNX SDK安装包 |
| Perf/Simpleperf | 性能分析 | Android NDK内置 |
工具链版本对齐: 高通Camera HAL对编译器版本敏感。例如,SM8450平台要求Clang 12.0以上,而SM8550要求Clang 14.0。使用错误版本会导致 undefined reference 或 ABI mismatch 错误。建议在 BoardConfig.mk 中显式指定 TARGET_TOOLCHAIN_VERSION。
3.5 源码获取与版本管理
高通Camera HAL源码通常通过 repo 工具从多个Git仓库同步。获取流程如下:
- 初始化Repo工作区:使用高通提供的
manifest.xml文件。 - 同步源码:执行
repo sync -c -j16拉取所有仓库。 - 切换分支:根据平台标签(如
LA.VM.1.2.1.r1)切换到对应分支。
Repo初始化命令示例:
mkdir camera_hal_workspace
cd camera_hal_workspace
repo init -u https://source.codeaurora.org/quic/la/platform/manifest -b release -m qssi_manifest.xml
repo sync -c -j16
版本管理建议: 在移植过程中,建议使用 git tag 标记每次适配的基线版本,方便后续回溯。同时,将修改的HAL代码单独放在 vendor/ 目录下的私有仓库中,避免与高通原生代码冲突。