1. 课程导论与预备知识

1.1 Camera HAL3 与 V4L2 在 Android 相机系统中的位置

Android 相机系统从上到下依次为 应用层、框架层 (Framework)、HAL 层 和 内核驱动层。Camera HAL3 是 Android 定义的相机硬件抽象层接口,负责将底层硬件能力抽象为上层可调用的标准 API;V4L2 (Video for Linux 2) 则是 Linux 内核中视频设备驱动的标准框架,是 HAL 层与硬件交互的核心通道。

核心关系: Camera HAL3 是“策略与协议”的制定者,V4L2 是“数据与命令”的搬运工。HAL3 通过 V4L2 接口操作摄像头传感器、ISP 等硬件,完成图像采集、参数控制与数据流管理。
Android 相机系统分层架构 应用层 (Camera App / SDK) 框架层 (Camera Framework / Service) HAL 层 (Camera HAL3 Implementation) camera3_device_t / camera3_callback_ops_t 内核驱动层 (V4L2 + Sensor Driver) video_device / v4l2_subdev / media_controller 硬件 (Camera Sensor / ISP) 本课程核心范围

1.2 课程目标

本课程旨在帮助嵌入式相机开发者系统掌握 Android Camera HAL3 架构与 V4L2 框架,具备从驱动调试到 HAL 层开发的全链路能力。完成本课程后,你将能够:

  • 理解架构:清晰描述 Camera HAL3 的 pipeline 模型、metadata 流转、buffer 管理机制。
  • 掌握 V4L2:熟练使用 V4L2 核心 ioctl、buffer 队列、subdev 与 media-controller 接口。
  • 独立开发:从零实现一个基于 V4L2 的 Camera HAL3 模块,支持预览、拍照、HAL3 特性。
  • 调试优化:使用 strace、dmesg、v4l2-ctl、gdb 等工具定位驱动与 HAL 层问题。
  • 实战落地:完成至少 2 个真实硬件平台(如 Rockchip、Qualcomm)的相机适配与调优。
能力维度 入门阶段 (第1-10章) 进阶阶段 (第11-20章) 实战阶段 (第21-30章)
HAL3 理论 pipeline 模型、metadata 结构 request 队列、buffer 管理、stream 配置 多 camera 协同、HAL3 扩展特性
V4L2 驱动 ioctl 基础、buffer 类型、subdev media-controller、crop/scale、frame interval 驱动调试、性能优化、稳定性
工程实践 环境搭建、v4l2-ctl 测试 HAL3 模块编写、CTS 测试 平台适配、产线校准、功耗优化

1.3 学习路径

课程按“基础 → 原理 → 实践 → 项目”四阶段递进,建议按顺序学习,每章配套实验与代码。

  1. 基础篇 (第1-5章):环境搭建、V4L2 核心 API、HAL3 数据结构、第一个 HAL3 空模块。
  2. 原理篇 (第6-12章):pipeline 深度解析、metadata 全流程、buffer 管理、stream 配置、3A 集成。
  3. 实践篇 (第13-22章):基于 V4L2 实现 preview/capture、HAL3 特性支持、CTS 调试、性能分析。
  4. 项目篇 (第23-30章):Rockchip 平台适配、Qualcomm 平台适配、产线校准、多 camera 方案、课程总结。
学习建议: 每章结束后务必完成课后实验,代码在 Ubuntu 20.04 + Android 12 模拟器或开发板上验证。遇到问题优先查阅 kernel/Documentation/media 和 hardware/libhardware/include/hardware/camera3.h。

1.4 所需软硬件环境

为保障课程实验顺利进行,请提前准备以下环境:

硬件要求

设备 最低配置 推荐配置 备注
开发主机 CPU 4核 / RAM 8GB / SSD 256GB CPU 8核 / RAM 16GB / SSD 512GB Ubuntu 20.04/22.04 LTS
开发板 Rockchip RK3566 / RK3588 RK3588 + MIPI CSI 摄像头模组 也可使用 QEMU 模拟
摄像头模组 USB UVC 摄像头 (免驱) MIPI CSI 接口 OV5640 / IMX219 用于 V4L2 实验
调试工具 USB 转串口模块 逻辑分析仪 / 示波器 驱动调试可选

软件环境

  • 操作系统:Ubuntu 20.04 LTS 或 22.04 LTS (推荐 20.04,与 Android 12 兼容性更好)
  • Android 源码:Android 12 (android-12.0.0_r34) 或更高版本,需包含 hardware/libhardware、system/media、kernel 目录
  • 交叉编译工具链:aarch64-linux-gnu-gcc (用于内核模块)、Android NDK r23+ (用于 HAL 模块)
  • V4L2 工具:v4l-utils (包含 v4l2-ctl、media-ctl、v4l2-compliance)
  • 调试工具:strace、gdb、ftrace、perf、dmesg
  • 代码编辑器:VS Code + C/C++ 插件 + Remote-SSH (用于开发板远程开发)
注意: 如果使用 USB UVC 摄像头进行前期实验,请确保内核已启用 CONFIG_UVC 和 CONFIG_MEDIA_CONTROLLER。MIPI CSI 摄像头需要根据具体 sensor 配置设备树,课程第5章会详细讲解。

环境验证命令

在终端执行以下命令,确认基础环境就绪:

# 检查 V4L2 设备
ls /dev/video*
v4l2-ctl --list-devices

# 检查内核配置
cat /boot/config-$(uname -r) | grep CONFIG_VIDEO_V4L2
cat /boot/config-$(uname -r) | grep CONFIG_MEDIA_CONTROLLER

# 检查 Android 源码目录结构
ls hardware/libhardware/include/hardware/camera3.h
ls system/media/camera/include/system/camera_metadata.h

# 检查交叉编译工具
aarch64-linux-gnu-gcc --version
ndk-build --version

如果以上命令均能正常输出,说明环境已准备完毕,可以开始第2章的学习。