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 等硬件,完成图像采集、参数控制与数据流管理。
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-5章):环境搭建、V4L2 核心 API、HAL3 数据结构、第一个 HAL3 空模块。
- 原理篇 (第6-12章):pipeline 深度解析、metadata 全流程、buffer 管理、stream 配置、3A 集成。
- 实践篇 (第13-22章):基于 V4L2 实现 preview/capture、HAL3 特性支持、CTS 调试、性能分析。
- 项目篇 (第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章的学习。