2. 开发环境搭建:高通平台Camera驱动开发环境
在骁龙Camera驱动移植工程中,寄存器配置校验的成败高度依赖开发环境的完整性与一致性。本章将系统讲解高通平台Camera驱动开发所需的双系统环境(Linux + QNX)、源码获取与编译流程,以及ADB与调试工具链的配置方法。环境搭建是后续所有寄存器读写验证、时序分析、硬件抽象层调试的基础,必须严格遵循以下步骤。
2.1 双系统架构概述
高通骁龙平台的Camera子系统采用异构计算架构:APPS(应用处理器)运行Linux/Android,负责上层框架与ISP配置;CDSP(计算数字信号处理器)或ADSP(音频数字信号处理器)运行QNX或自定义RTOS,负责实时传感器控制与像素处理管线。驱动开发环境必须同时覆盖这两个域。
2.2 Linux 开发主机环境配置
Linux主机是驱动开发的核心工作站,负责代码编辑、交叉编译、版本管理以及寄存器配置脚本的编写与验证。推荐使用Ubuntu 20.04 LTS或22.04 LTS,以下为关键组件安装步骤。
2.2.1 基础依赖包安装
# 更新包索引
sudo apt update
# 安装基础编译工具
sudo apt install -y build-essential git repo curl wget \
python3 python3-pip python3-venv \
flex bison libncurses-dev \
libssl-dev libelf-dev \
device-tree-compiler
# 安装QNX交叉编译依赖(32位兼容库)
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install -y libc6:i386 libncurses5:i386 libstdc++6:i386
# 安装ADB与Fastboot
sudo apt install -y android-tools-adb android-tools-fastboot
gcc --version 确认GCC版本 ≥ 9.4;执行 adb version 确认ADB版本 ≥ 1.0.41。
2.2.2 交叉编译工具链配置
高通Camera驱动需要针对ARM64架构进行交叉编译。工具链可从CodeSourcery或Linaro获取,也可使用高通官方提供的QNX SDK内置工具链。以下为Linaro工具链配置示例:
# 下载Linaro AArch64工具链(以gcc-arm-9.2-2019.12为例)
wget https://releases.linaro.org/components/toolchain/binaries/9.2-2019.12/aarch64-linux-gnu/gcc-linaro-9.2.1-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 解压到 /opt 目录
sudo tar -xvf gcc-linaro-9.2.1-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/
# 设置环境变量(建议写入 ~/.bashrc)
export PATH=/opt/gcc-linaro-9.2.1-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
| 参数 | 值 | 说明 |
|---|---|---|
| 目标架构 | ARM64 (AArch64) | 骁龙8系列SoC核心架构 |
| GCC版本 | ≥ 9.2 | 支持C11/C++17,满足QNX 7.1要求 |
| Glibc版本 | ≥ 2.28 | 与目标机QNX libc兼容 |
| 工具链前缀 | aarch64-linux-gnu- | 用于Makefile中的CROSS_COMPILE变量 |
2.3 源码获取与版本管理
高通Camera驱动源码通常通过Repo工具从多个Git仓库同步。典型的源码结构包括:内核驱动(kernel/msm-5.10)、QNX侧驱动(qnx/src)、传感器驱动(vendor/qcom/camera)、寄存器配置文件(vendor/qcom/camera/reg_config)。
2.3.1 Repo初始化与同步
# 创建工作目录
mkdir -p ~/qcom_camera_driver
cd ~/qcom_camera_driver
# 初始化Repo(使用高通官方manifest)
repo init -u https://source.codeaurora.org/quic/la/platform/manifest \
-b release -m qcom-camera-5.10.xml
# 同步所有仓库(首次同步约需30-60分钟)
repo sync -j$(nproc) --no-tags
2.3.2 关键源码目录结构
| 目录路径 | 内容说明 | 寄存器校验相关 |
|---|---|---|
| kernel/msm-5.10/drivers/media/platform/msm/camera | Linux侧Camera V4L2驱动 | 包含ISP寄存器映射头文件 |
| vendor/qcom/proprietary/camera | 高通私有Camera HAL与算法库 | 寄存器配置XML/JSON文件 |
| qnx/src/drivers/camera | QNX侧Camera ISP驱动 | 运行时寄存器读写接口 |
| vendor/qcom/camera/sensor | 传感器驱动与初始化序列 | 传感器寄存器配置表 |
| tools/reg_check | 寄存器校验工具源码 | 校验脚本与参考值数据库 |
vendor/qcom/camera/reg_config/ 目录下。
2.4 QNX 开发环境配置
QNX作为实时操作系统,其开发环境与Linux有显著差异。需要安装QNX Software Development Platform (SDP) 7.1及以上版本,并配置QNX目标机镜像。
2.4.1 QNX SDP安装
# 下载QNX SDP 7.1安装包(需QNX官网账号)
# 假设安装包为 qnx-sdp-7.1.0-linux-x64.run
# 赋予执行权限并安装
chmod +x qnx-sdp-7.1.0-linux-x64.run
sudo ./qnx-sdp-7.1.0-linux-x64.run --mode unattended \
--prefix /opt/qnx710
# 设置QNX环境变量(写入 ~/.bashrc)
export QNX_HOST=/opt/qnx710/host/linux/x86_64
export QNX_TARGET=/opt/qnx710/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
2.4.2 QNX目标机镜像构建
Camera驱动需要在QNX目标机上运行,因此需要构建包含Camera驱动的QNX镜像。使用QNX的mkifs工具生成IFS(Image Filesystem)镜像:
# 进入Camera驱动源码目录
cd ~/qcom_camera_driver/qnx/src/drivers/camera
# 编译Camera驱动(使用QNX Makefile)
make -j$(nproc) \
QNX_TARGET=$QNX_TARGET \
QNX_HOST=$QNX_HOST
# 构建目标机镜像(假设build文件为 camera_ifs.build)
mkifs -vv camera_ifs.build camera_ifs.bin
# 将镜像烧录到目标机(通过fastboot)
fastboot flash system camera_ifs.bin
fastboot reboot
2.5 ADB与调试工具链配置
ADB(Android Debug Bridge)是连接Linux开发主机与QNX目标机的主要调试通道。在Camera驱动开发中,ADB用于寄存器读写、日志抓取、文件传输以及远程shell执行。
2.5.1 ADB服务端配置
# 确认ADB服务端运行
adb start-server
# 列出已连接的设备
adb devices
# 预期输出示例:
# List of devices attached
# 1234567890abcdef device
# 如果设备未显示,检查USB权限
lsusb # 查看设备VID/PID
sudo adb kill-server
sudo adb start-server
2.5.2 寄存器调试专用工具链
除了标准ADB命令,Camera驱动开发还需要以下专用工具:
| 工具名称 | 用途 | 安装方式 |
|---|---|---|
| i2cget/i2cset | I2C总线寄存器读写 | 交叉编译自busybox或i2c-tools |
| devmem2 | 直接物理内存寄存器访问 | 预编译二进制,推送到目标机 |
| reg_dump | 批量寄存器配置校验工具 | 高通私有工具,随SDK提供 |
| cam_logger | Camera驱动日志过滤与格式化 | Python脚本,位于tools/目录 |
| trace32 | JTAG/SWD硬件调试器 | 独立安装,需硬件调试器 |
2.5.3 ADB寄存器读写实战示例
以下是通过ADB shell在目标机上直接读写Camera传感器寄存器的典型操作:
# 通过ADB进入目标机shell
adb shell
# 查看Camera I2C设备节点(假设传感器挂载在I2C-3)
ls -l /dev/i2c-3
# 使用i2cget读取传感器寄存器0x0012(8位地址)
i2cget -y 3 0x10 0x12
# 使用i2cset写入寄存器0x0012值为0x80
i2cset -y 3 0x10 0x12 0x80
# 使用devmem2读取ISP寄存器(物理地址0xAC000000)
devmem2 0xAC000000
# 使用高通私有工具批量校验寄存器配置
reg_dump --config /data/camera/reg_config.xml --output /data/camera/reg_dump.log
adb logcat -s CAM 实时监控Camera驱动日志输出。这样可以快速定位寄存器配置与驱动行为之间的因果关系。
2.6 环境验证清单
完成上述配置后,建议执行以下验证步骤,确保开发环境完整可用:
- 交叉编译验证: 编写一个简单的Hello World程序,使用aarch64-linux-gnu-gcc编译,确认生成ARM64可执行文件。
- ADB连通性验证: 执行
adb devices确认设备状态为device,执行adb shell uname -a确认目标机内核信息。 - QNX驱动加载验证: 重启目标机后,执行
adb shell slog2info | grep camera确认Camera驱动加载日志无错误。 - 寄存器读写验证: 使用i2cget读取传感器ID寄存器,确认返回值与数据手册一致(例如OV64B传感器ID应为0x64)。
- 源码编译验证: 在Linux主机上执行
make -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-编译Camera内核驱动,确认无编译错误。