2. 开发环境搭建:高通平台Camera开发板选型、Linux驱动环境配置、Android源码编译环境搭建
本章聚焦于高通Camera HAL3适配工程的硬件底座与软件栈搭建。正确的开发板选型、干净的Linux驱动环境以及可复现的Android源码编译环境,是后续所有HAL层调试与适配工作的前提。我们将按照“硬件选型 → 驱动环境 → 编译环境”的递进路径,逐一拆解关键步骤与避坑要点。
2.1 高通平台Camera开发板选型
高通平台Camera开发板选型需综合考虑SoC算力、ISP能力、MIPI CSI接口数量、驱动生态成熟度以及成本。下表对比了当前主流的几款高通Camera开发板,适用于HAL3适配工程。
| 开发板型号 | SoC | ISP能力 | MIPI CSI Lane | 推荐场景 |
|---|---|---|---|---|
| Qualcomm RB5 | QCS8250 | 双14-bit ISP,支持4K@60fps | 4路4-lane | 机器人、AI相机、多摄融合 |
| Qualcomm RB3 | QCS603/605 | 单14-bit ISP,支持1080p@60fps | 2路4-lane | 智能门锁、低功耗摄像头 |
| Thundercomm TurboX D845 | SDM845 | 双14-bit ISP,支持4K@30fps | 3路4-lane | 手机原型、平板Camera验证 |
| Thundercomm TurboX D920 | QCS6490 | 三14-bit ISP,支持8K@30fps | 4路4-lane + 2路2-lane | 高端AI相机、车载环视 |
选型时还需关注以下硬件细节:
- MIPI CSI接口类型:确认开发板支持MIPI D-PHY还是C-PHY,以及lane数是否满足目标sensor带宽需求。
- PMIC电源管理:Camera sensor的AVDD、DVDD、IOVDD供电是否可编程,是否支持独立上电时序控制。
- EEPROM/OTP支持:开发板是否预留I2C接口用于读取sensor校准数据,这对HAL3的camera_metadata生成至关重要。
- 调试接口:至少需要1路UART用于kernel log输出,1路USB Type-C用于ADB调试。
2.2 Linux驱动环境配置
高通Camera HAL3依赖Linux内核提供的V4L2(Video for Linux 2)框架以及高通私有的Camera Subsystem驱动。驱动环境配置分为内核配置、设备树修改、驱动编译与加载三个步骤。
2.2.1 内核配置要点
在Linux内核源码目录下执行 make menuconfig,确保以下选项被启用:
| 配置项 | 路径 | 说明 |
|---|---|---|
| CONFIG_MEDIA_SUPPORT | Device Drivers → Multimedia support | 多媒体框架总开关 |
| CONFIG_V4L2 | Multimedia support → V4L2 | V4L2核心框架 |
| CONFIG_VIDEO_QCOM_CAMSS | Multimedia support → Qualcomm camera drivers | 高通Camera Subsystem驱动 |
| CONFIG_MSM_CCI | Multimedia support → Qualcomm CCI | Camera控制接口(I2C/SPI) |
| CONFIG_MSM_CSIPHY | Multimedia support → Qualcomm CSIPHY | MIPI CSI物理层驱动 |
| CONFIG_MSM_CSID | Multimedia support → Qualcomm CSID | MIPI CSI解码器驱动 |
CONFIG_VIDEO_QCOM_CAMSS,HAL3在open camera时会出现 E/Camera3: openCamera: failed to open camera device 错误,且dmesg中无任何sensor probe信息。务必在编译前确认该选项已编译为模块或内建。
2.2.2 设备树(DTS)配置
设备树是连接硬件与驱动的桥梁。Camera节点通常定义在 arch/arm64/boot/dts/qcom/ 目录下。以下是一个典型的Camera sensor设备树节点示例:
// 文件: qcs8250-camera.dtsi
&cam_cci0 {
status = "okay";
sensor0: camera@10 {
compatible = "sony,imx586";
reg = <0x10>;
cci-master = <0>;
clocks = <&camcc CAM_CC_MCLK0_CLK>;
clock-names = "cam_mclk";
clock-frequency = <24000000>;
avdd-supply = <&pm8150_l17>;
dvdd-supply = <&pm8150_l18>;
iovdd-supply = <&pm8150_l6>;
port {
sensor0_ep: endpoint {
remote-endpoint = <&csiphy0_ep>;
data-lanes = <1 2 3 4>;
link-frequencies = /bits/ 64 <480000000>;
};
};
};
};
设备树配置完成后,使用 make dtbs 编译生成dtb文件,并烧录到开发板。
2.2.3 驱动编译与加载验证
驱动编译推荐使用交叉编译工具链。以下为基于高通SDK的编译流程:
# 设置交叉编译环境
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export PATH=$PATH:/opt/qcom/toolchain/bin
# 编译内核及驱动模块
make defconfig # 使用高通默认配置
make -j$(nproc) Image.gz dtbs modules
# 将驱动模块安装到rootfs
make modules_install INSTALL_MOD_PATH=/path/to/rootfs
# 验证驱动加载
adb shell "dmesg | grep -i camera"
# 预期输出: [ 1.234567] qcom-camss 1c00000.camss: probe successful
# [ 1.345678] imx586 0-0010: sensor initialized
dmesg 中的 EPROBE_DEFER 信息。这通常表示sensor依赖的时钟或电源尚未就绪。可以通过 cat /sys/kernel/debug/device_deferred 查看被延迟挂载的设备列表。
2.3 Android源码编译环境搭建
Android源码编译环境是HAL3适配的核心工作台。高通平台通常使用 Qualcomm LE(Linux Embedded) 或 Android AOSP 作为基础系统。以下以Android 13(API 33)为例,说明编译环境的完整搭建步骤。
2.3.1 主机环境要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 LTS | Ubuntu 22.04 LTS |
| CPU核心数 | 8核 | 16核及以上 |
| 内存 | 16 GB | 32 GB |
| 磁盘空间 | 250 GB(SSD) | 500 GB(NVMe SSD) |
| Python版本 | 3.8 | 3.10 |
| JDK版本 | OpenJDK 11 | OpenJDK 17 |
2.3.2 安装依赖包
# 更新软件源
sudo apt update && sudo apt upgrade -y
# 安装Android编译基础依赖
sudo apt 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 lib32z1-dev \
libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
# 安装repo工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin
2.3.3 下载高通BSP与Android源码
高通平台需要同时下载AOSP源码和高通BSP(Board Support Package)。BSP包含Camera HAL、驱动、固件等闭源二进制文件。
# 创建工作目录
mkdir -p ~/qcom_android13 && cd ~/qcom_android13
# 初始化repo仓库(使用高通manifest)
repo init -u https://source.codeaurora.org/quic/la/platform/manifest \
-b release -m LA.UM.9.15.r1-10000-KAMORTA.0.xml
# 同步源码(耗时较长,建议使用 -j4 避免网络超时)
repo sync -j4 -c --no-tags
# 下载高通BSP(需签署NDA后从高通QDN获取)
# 将BSP包解压到 vendor/qcom/ 目录
tar -xzf qcom_bsp_android13.tar.gz -C vendor/qcom/
vendor/qcom/proprietary/camera)是闭源的,且与Android版本严格绑定。如果BSP版本与AOSP版本不匹配,编译时会出现 undefined reference to 'camera3_ops' 等链接错误。务必确认manifest中的BSP tag与AOSP tag一致。
2.3.4 编译Android系统与Camera HAL
# 设置编译环境
source build/envsetup.sh
# 选择目标设备(以RB5为例)
lunch qcs8250-userdebug
# 编译整个系统(首次编译约2-4小时)
make -j$(nproc) 2>&1 | tee build.log
# 单独编译Camera HAL模块(调试阶段常用)
make -j$(nproc) camera.qcom
# 编译完成后,输出镜像位于 out/target/product/qcs8250/
ls out/target/product/qcs8250/*.img
2.3.5 刷机与验证
# 进入fastboot模式(开发板按住VOL-键上电)
adb reboot bootloader
# 刷入所有分区
fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash vendor vendor.img
fastboot flash dtbo dtbo.img
fastboot reboot
# 验证Camera HAL版本
adb shell "dumpsys media.camera | grep -i hal"
# 预期输出: Camera HAL version: 3.4
make -j$(nproc) camera.qcom 单独编译Camera模块,然后通过 adb push 将编译产物推送到开发板的 /vendor/lib/hw/ 目录,无需每次都刷全系统镜像。例如:adb push out/target/product/qcs8250/vendor/lib/hw/camera.qcom.so /vendor/lib/hw/
2.4 环境验证清单
在进入HAL3适配工程之前,建议逐项确认以下环境就绪状态:
| 检查项 | 验证方法 | 预期结果 |
|---|---|---|
| 开发板启动 | 串口观察U-Boot及kernel启动log | 无panic,文件系统挂载正常 |
| Camera驱动加载 | dmesg | grep -i camera |
显示probe successful |
| V4L2设备节点 | ls /dev/video* |
至少出现 /dev/video0 |
| Android HAL版本 | dumpsys media.camera | grep HAL |
Camera HAL version: 3.x |
| Camera服务运行 | ps -A | grep cameraserver |
cameraserver进程存在 |
| ADB连接 | adb devices |
设备状态为device |