2. HAL层移植环境搭建:配置高通Camera开发环境
HAL层移植的第一步是构建一个完整、可复现的开发环境。高通Camera子系统的开发环境涉及交叉编译工具链、内核头文件、平台SDK以及调试通道四个核心维度。本章将逐一拆解每个组件的配置要点,并提供环境验证方法。
环境概览: 高通Camera HAL层开发环境通常部署在Ubuntu 20.04/22.04 x86_64主机上,目标平台为高通骁龙6/7/8系列SoC。以下配置均以QCM6490(高通QCS6490 / QCM6490 IoT套件)为参考平台。
2.1 交叉编译工具链配置
高通Camera HAL模块必须使用与目标内核匹配的交叉编译器进行编译。推荐使用高通官方提供的GCC ARM64工具链(aarch64-linux-android- 或 aarch64-linux-gnu-)。
| 工具链类型 | 适用场景 | 下载来源 | 安装路径示例 |
|---|---|---|---|
| aarch64-linux-android- | Android HAL模块(libcamera_xxx.so) | 高通BOOT.BF.3.3或LE.1.0发布包 | /opt/qcom/toolchain/android-ndk-r23c |
| aarch64-linux-gnu- | Linux Yocto / QNX HAL模块 | Linaro GCC 12.2 / ARM官网 | /opt/gcc-arm-12.2-aarch64 |
| clang + llvm | 高通最新CHI架构(Camera HAL v3) | 高通SDK内置或AOSP prebuilts | ${QCM_SDK}/prebuilts/clang |
# 以aarch64-linux-gnu-工具链为例,解压并设置环境变量
wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
sudo tar -xf arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
export PATH=/opt/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH
# 验证工具链
aarch64-none-linux-gnu-gcc --version
# 输出应包含 "aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture) 12.2.rel1"
避坑提示: 不要混用不同版本的GCC编译内核模块和HAL用户态库。内核模块必须使用与目标内核完全一致的GCC版本(通常由高通BSP指定),否则会导致内核模块加载失败(
Unknown symbol 或 version magic mismatch)。
2.2 内核头文件与Kernel API对齐
Camera HAL层通过V4L2、ION/DMA-BUF、Media Controller等内核接口与驱动交互。编译HAL时必须包含目标平台的内核头文件,确保结构体定义、ioctl号、枚举值一致。
# 从高通BSP包中提取内核头文件
# 假设BSP解压路径为 ~/qcom_la.um.8.6_r1
KERNEL_SRC=~/qcom_la.um.8.6_r1/kernel_platform
HEADER_DEST=/opt/qcom/kernel-headers/qcm6490
mkdir -p $HEADER_DEST
# 复制用户态可见的头文件
cp -r $KERNEL_SRC/msm-kernel/include/uapi $HEADER_DEST/
cp -r $KERNEL_SRC/msm-kernel/include/linux $HEADER_DEST/
# 高通Camera专用头文件(如cam_sensor.h, cam_req_mgr.h)
cp -r $KERNEL_SRC/msm-kernel/drivers/cam_req_mgr $HEADER_DEST/
cp -r $KERNEL_SRC/msm-kernel/drivers/cam_sensor_module $HEADER_DEST/
# 设置CFLAGS
export CFLAGS="-I/opt/qcom/kernel-headers/qcm6490/uapi -I/opt/qcom/kernel-headers/qcm6490/linux"
关键检查点: 编译HAL时,务必确认
linux/media.h 中的 MEDIA_ENT_F_* 宏定义与目标内核一致。高通Camera使用自定义的 MEDIA_ENT_F_PIXEL_QUALITY 等扩展实体,若头文件版本不匹配,HAL将无法正确枚举Camera设备节点。
2.3 QCM SDK安装与配置
高通QCM(Qualcomm Commercial Module)SDK是Camera HAL移植的核心依赖,包含CHI API头文件、libcamx、libchi HAL实现、以及编译脚本模板。SDK通常以压缩包形式随BSP发布。
# 解压QCM SDK
unzip QCM6490_SDK_LA.UM.10.3.1.zip -d /opt/qcom/qcm_sdk_v2.0
# SDK目录结构
tree -L 2 /opt/qcom/qcm_sdk_v2.0/
/opt/qcom/qcm_sdk_v2.0/
├── CHIApi/ # CHI API头文件(核心)
│ ├── inc/
│ │ ├── chi_common.h
│ │ ├── chi_metadata.h
│ │ ├── chi_ois.h
│ │ └── chi_isp.h
│ └── lib/
│ ├── libchi_common.so
│ └── libchi_isp.so
├── camx/ # Camera HAL核心库源码
│ ├── src/
│ ├── include/
│ └── build/
├── oem/ # OEM定制层(Sensor/Flash/AF适配)
│ ├── sensor/
│ ├── actuator/
│ └── eeprom/
├── tools/ # 调试与性能工具
│ ├── cam_trace/
│ └── cam_perf/
└── build_scripts/ # CMake / Makefile模板
├── android.bp
└── qcm_hal.mk
SDK版本匹配: 务必使用与目标Android/Linux版本匹配的SDK。例如,Android 13对应QCM SDK v2.0+,Android 12对应v1.9。版本不匹配会导致CHI API接口函数签名不一致,编译时报错
implicit function declaration。
2.4 ADB调试环境搭建
ADB(Android Debug Bridge)是HAL层开发中最常用的调试通道,用于推送HAL库、抓取logcat、执行测试用例以及捕获Camera dump数据。
| 组件 | 版本要求 | 配置要点 |
|---|---|---|
| adb (host) | ≥ 1.0.41 (Android SDK Platform-Tools) | 添加到 $PATH;执行 adb devices 验证 |
| fastboot | ≥ 1.0.41 | 用于刷写boot image或recovery |
| USB驱动 (Linux) | udev规则 | 创建 /etc/udev/rules.d/51-android.rules |
| 目标板USB模式 | USB Gadget配置 | 确保目标板开启ADB over USB或ADB over TCP/IP |
# 安装ADB
sudo apt install adb fastboot
# 配置udev规则(高通QCM6490 VID:PID通常为 18d1:4ee7)
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee7", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
# 验证连接
adb devices
# 输出示例:
# List of devices attached
# 1234567890abcdef device
# 如果目标板没有USB ADB,使用TCP/IP方式
adb connect 192.168.1.100:5555
调试效率技巧: 在HAL开发中,建议同时开启两个终端:一个运行
adb logcat -s CAM_HAL:V CAM_DRV:V 实时过滤Camera日志;另一个用于推送HAL库并重启Camera服务:adb push libcamera_xxx.so /vendor/lib64/ && adb shell pkill -f cameraserver。
2.5 环境验证清单
完成上述配置后,执行以下验证步骤,确保环境可用。
- 工具链验证: 编译一个空的HAL桩文件,确认链接无报错。
- 内核头文件验证: 检查
linux/cam_sensor.h中CAM_SENSOR_PROBE_CMD宏定义是否存在。 - SDK完整性验证: 确认
CHIApi/inc/chi_common.h包含ChiCreate、ChiDestroy等核心API声明。 - ADB连通性验证: 执行
adb shell cat /proc/version确认内核版本与头文件匹配。 - Camera设备节点验证:
adb shell ls -l /dev/video*应列出至少3个video节点(ISP、JPEG、Sensor)。
2.6 常见环境问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
adb devices 显示 unauthorized |
目标板未授权当前主机RSA密钥 | 检查目标板屏幕授权弹窗;或执行 adb kill-server && adb start-server |
编译报错 fatal error: linux/cam_sensor.h: No such file or directory |
内核头文件路径未正确添加到CFLAGS | 确认 -I 指向包含 linux 子目录的父目录 |
链接报错 undefined reference to ChiCreate |
未链接 libchi_common.so |
在Makefile中添加 -lchi_common -L$(QCM_SDK)/CHIApi/lib |
HAL加载后 dmesg 显示 version magic mismatch |
内核模块与当前运行内核版本不一致 | 使用目标板运行内核的 Module.symvers 重新编译内核模块 |
重要提醒: 不要在生产开发机上直接使用
sudo make install 安装高通SDK到系统目录。始终使用独立的 /opt/qcom/ 或用户目录,避免污染系统GCC和头文件,导致其他项目编译失败。