以高通(Qualcomm)架构为例,预览(Preview)流程是一个复杂的异步过程。我们将这个过程简化为从 App 到 Kernel 的函数调用/逻辑链条。
这里采用了 Camera2 API + HAL3 + CamX/CHI 架构。
第一阶段:打开相机与配置流(Setup Phase)
在预览开始前,必须先建立管道(Pipeline)。
1. APP 层 (Java)
cameraManager.openCamera():请求打开相机。cameraDevice.createCaptureSession():传入用于显示的Surface(通常来自 SurfaceView 或 TextureView)。
2. Framework 层 (CameraService - Native)
CameraService::connectDevice():接收 App 请求。CameraDeviceClient::initialize():初始化客户端。Camera3Device::configureStreams():核心步骤,将 App 的 Surface 转换为 HAL 可理解的camera3_stream_t。
3. HAL3 接口层 (HIDL/AIDL)
ICameraDeviceSession::configureStreams():跨进程调用进入 HAL。
4. 高通 CamX 层 (UMD - User Mode Driver)
CamX::HAL3Device::ConfigureStreams():解析 Stream 需求。CamX::StaticProperties::GetHwEnvironment():读取系统配置。CamX::Pipeline::Create():关键,根据 XML 拓扑文件(Topology)选择预览路径(如:IFE -> BPS -> IPE)。
第二阶段:下发预览请求(Request Loop)
预览是一个不断的循环过程(Repeating Request)。
1. APP 层 (Java)
CaptureRequest.Builder.addTarget(surface):指定数据去向。cameraCaptureSession.setRepeatingRequest(request):开启循环请求。
2. Framework 层 (CameraService - Native)
Camera3Device::RequestThread::threadLoop():一个死循环线程,不断处理请求。Camera3Device::processCaptureRequest():将请求封装发送给 HAL。
3. HAL3 接口层 (HIDL/AIDL)
ICameraDeviceSession::process_capture_request():传送包含 Buffer 句柄的请求。
4. 高通 CamX 层 (UMD)
CamX::HAL3Entry::process_capture_request():入口函数。CamX::ChiContext::ProcessCaptureRequest():如果是使用 CHI 架构(现代高通方案),会进入 CHI 外部算法控制层。CamX::Request::Activate():激活一个请求实例。CamX::Node::ProcessRequest():各节点(如 SensorNode, IFENode)开始处理。CamX::HwDevice::SubmitRequest():准备好指令包(Packet),交给底层硬件。
第三阶段:底层驱动与硬件执行(Kernel Phase)
硬件真正开始干活。
1. Kernel 层 (KMD - Kernel Mode Driver)
cam_isp_mgr_apply_request():ISP 管理器接收请求。v4l2_subdev_call(ops->s_stream):通过 V4L2 子设备调用启动流。- 驱动读取 XML 配置:
cam_sensor_driver_i2c_write():根据 XML 定义的寄存器序列,通过 I2C 设置 Sensor(曝光、增益等)。cam_isp_hw_config():配置 IFE (Image Front End) 的硬件寄存器。
2. 硬件执行 (Hardware - ISP/Sensor)
- Sensor:感光并输出数据(通常是 MIPI RAW)。
- CSIPHY/CSID:接收 MIPI 信号。
- IFE (VFE):进行初步处理(黑电平校正、抠图等)。
- IPE (Image Processing Engine):进行 3A 后的色彩转换、降噪、缩放(输出 YUV 格式)。
第四阶段:数据回传(Result/Buffer Return)
图像处理完成后,回传给 App 显示。
- Kernel:产生中断(IRQ),通知数据已写入内存。
- CamX:
CamX::HwDevice::OnInterrupt(),标志着硬件处理完成。 - CamX:
CamX::HAL3Entry::process_capture_result(),将填好数据的 Buffer 返还给 Framework。 - Framework:
Camera3Device::returnOutputBuffers()。 - App:
Surface自动刷新,你在屏幕上看到了预览画面。
总结:关键术语与高通特色
- XML 配置文件:在高通架构中,摄像头的拓扑结构(Pipeline 如何连通)、Sensor 的初始化参数、3A 的参数全部定义在 XML 文件中(位于
/vendor/etc/camera/)。CamX 会在初始化阶段解析这些 XML。 - CamX vs CHI:
- CamX 是通用核心逻辑,负责与 Kernel 交互、管理硬件资源。
- CHI (Camera Hardware Interface) 是高通为了方便厂商定制(如加水印、美颜、多摄逻辑)而剥离出来的插件层。
- Buffer 传递:全过程不涉及图像数据的拷贝,只传递 Buffer 句柄(fd),所有层级都直接在同一块内存上通过硬件进行读写。