4. Camera HAL与驱动栈
在高通骁龙平台上,从应用层调用相机到Sensor真正出图,中间横跨了一条相当长的软硬件栈。很多成像问题——比如首帧慢、对焦不准、镜头阴影校正异常、模组个体差异导致画面偏色——根源往往不在ISP算法本身,而在这条栈的某一层没有把数据或时序传递正确。理解这条栈的结构与数据流,是后续调试和定制的基础。
一、整体分层:从App到Sensor
自上而下,这条栈大致分为四层。最上层是相机应用,通过Android标准的Camera2/CameraX API发起请求。往下是相机Provider(Camera Provider),它是Android Camera HAL框架与厂商实现之间的桥梁,负责枚举相机设备、管理HAL进程生命周期,并把Camera2的CaptureRequest转发给具体HAL实现。在高通平台上,这个HAL实现就是CamX。CamX再通过CHI(Camera Hardware Interface)与厂商/客户自定义的算法与配置对接,最终经由CSL(Camera Service Layer)和内核驱动,落到Sensor、Actuator、EEPROM等物理器件上。
需要强调的是,CamX是高通提供的HAL核心,它把通用的管线调度、请求管理、3A框架、流管理都封装好了;而CHI则是留给OEM/ODM做差异化的接口层。厂商通过CHI注入自己的用例(Usecase)、特性(Feature)、节点(Node)和调优数据,而不必改动CamX主体。这种“核心稳定、扩展开放”的设计,是高通相机栈最重要的架构特征。
二、CHI API:差异化的注入点
CHI的核心概念包括Usecase、Feature和Node。Usecase描述一种拍摄场景的完整管线,例如“预览+拍照”“夜景多帧”“人像虚化”。每个Usecase由若干Feature组成,Feature是功能单元,比如HDR、降噪、美颜。Feature内部又由Node构成,Node是管线中的处理节点,比如IFE(图像前端)、IPE(图像处理引擎)、BPS(双像素处理)等硬件模块对应的节点,以及厂商自定义的软件节点。
厂商在CHI中做的事情,本质上是:定义自己的Usecase XML/配置,声明Feature与Node的连接关系,注册自定义Node的回调实现,并提供对应的Tuning数据。CamX在运行时根据当前场景选择合适的Usecase,构建Node图,按请求驱动数据在节点间流动。因此,当出现“某个场景没有走预期算法”的问题时,排查方向通常是:Usecase是否被正确选中、Feature是否被使能、Node是否正确连接、Tuning数据是否匹配当前Sensor与模组。
三、Sensor驱动与上电时序
Sensor驱动负责把CamX下发的配置翻译成I2C寄存器写入,并管理上电、时钟、复位、MIPI输出等时序。一个典型的Sensor驱动包含:电源序列(AVDD/DVDD/DOVDD上电顺序)、时钟配置(MCLK频率)、复位与待机控制、寄存器初始化表(通常按分辨率、帧率、HDR模式分组)、曝光与增益控制、帧同步与Group Hold。
以常见的示例参数为例:某Sensor要求MCLK为24MHz,AVDD 2.8V、DVDD 1.2V、DOVDD 1.8V,上电顺序为DOVDD→DVDD→AVDD,复位释放后需延时1ms再写初始化寄存器。这些时序如果写错,表现为Sensor不出图、出图花屏或首帧异常。驱动中通常用msleep()或udelay()保证延时,用Group Hold把曝光、增益、帧长等寄存器打包在同一帧生效,避免撕裂。
四、Actuator驱动与对焦
Actuator驱动控制VCM(音圈马达)推动镜头完成对焦。它通过DAC码值控制电流,进而控制镜头位置。驱动需要提供:DAC码值范围(如0~1023)、方向定义(码值增大是远焦还是近焦)、步进延迟、初始位置。3A算法中的AF模块根据对比度或PDAF相位差计算出目标码值,经驱动写入Actuator。
实际调试中,常见问题是“对焦方向反了”或“对焦行程不够”。方向反了表现为AF越搜越远,需要在驱动中翻转方向标志;行程不够表现为近处无法合焦,需要检查DAC上限是否被限制。此外,Actuator的 ringing(振荡)与步进延迟设置有关,延迟过小会导致镜头未稳定就采图,画面反复模糊。
五、EEPROM与OTP数据加载流程
EEPROM和OTP承载模组个体校准数据,是保证不同模组成像一致性的关键。典型流程如下:
- 上电与探测:模组上电后,驱动通过I2C读取EEPROM的固定地址,确认器件存在并获取数据布局版本。
- 读取校准数据:按页读取,常见内容包括AWB金样比(Golden Ratio)、LSC(镜头阴影校正)网格、AF的DAC近焦/远焦位置、SPC(坏点)表、模组序列号与供应商ID。
- 校验:检查校验和或CRC,若失败则回退到默认数据并上报。
- 解析与下发:把原始字节解析为CamX/CHI可用的结构,写入对应的Tuning数据槽位,供3A与ISP模块使用。
- 运行时使用:AWB用金样比修正色温,LSC用网格做逐像素增益补偿,AF用DAC范围限定搜索区间。
OTP与EEPROM的区别在于:OTP是一次性烧录,通常容量小、只存关键参数;EEPROM可反复读写,容量较大,可存完整校准表。部分模组两者并存,OTP存模组身份与关键校准,EEPROM存扩展数据。
六、数据流与调试切入点
把上述内容串起来看,一次拍照请求的数据流是:App发起CaptureRequest → Provider转发 → CamX选中Usecase → CHI构建Node图 → 3A计算曝光/对焦/白平衡 → 驱动写Sensor与Actuator寄存器 → Sensor出RAW → ISP节点处理 → 回传结果。EEPROM/OTP数据在初始化阶段加载,贯穿整个3A与ISP处理过程。
调试时,可以按这条链路逐段确认:用dmesg看驱动上电与I2C是否成功;用CamX日志确认Usecase与Node是否按预期构建;用CHI的Tuning工具确认校准数据是否被正确加载;用抓帧工具确认RAW与最终输出的差异。每一段都有对应的观察点,而不是笼统地“调相机”。
理解这条栈的分层与数据流,是后续学习3A算法、ISP管线配置和模组调试的前提。CamX提供稳定核心,CHI提供扩展入口,驱动负责时序与寄存器,EEPROM/OTP提供个体校准——四者各司其职,任何一环出错都会在最终画面上体现出来。