该系列文章总目录链接: https://blog.youkuaiyun.com/u012596975/article/details/107135938
本篇是《深入理解Android相机体系结构》连载文章的第八篇。
相机驱动层–高通KMD框架详解
一、概览
利用了V4L2可扩展这一特性,高通在相机驱动部分实现了自有的一套KMD框架,该框架通过V4L2标准方法在系统中创建设备节点,将控制接口直接暴露给UMD CSL进行访问,而其内部主要定义了一系列核心模块,包括CRM(Camera Request Manager),用于管理整个KMD的Session/Link的创建销毁以及Request的在子设备间的流转,该模块创建video0设备节点暴露关键接口给UMD,此外还包括了Sync模块,主要负责了UMD/KMD之间的数据同步与传输,创建video1设备节点暴露接口给UMD进行访问,除此之外,为了更精细化地控制一系列的硬件图像处理模块,包括ISP/IPE/Sensor等硬件模块,高通也分别为各自子模块创建了设备节点,进而暴露控制接口给UMD进行访问。
其中主要目录如下:
- cam_core/: 关于KMD核心函数的实现都放在这,主要包括了subdev、node、context的一些诸如创建/注册/销毁等标准方法。
- cam_req_mgr/: CRM的具体实现,用于创建v4l2_device,用于管理所有的子设备,同时生成video设备节点,暴露控制接口给UMD,主要包括了Session/Link的行为管理以及Request的同步与分发,此外,还创建了media_device,用于暴露枚举接口给UMD来轮询查找整个KMD的子设备。
- cam_sync/: 该部分主要实现了用于保持与UMD的图像数据的同步相关业务逻辑,由于该模块的特殊性,高通直接为其创建了一个单独的video设备节点,暴露了用于同步的一些控制接口。
- cam_utils/: 一些共有方法的实现,包括debug方法集等
- cam_smmu/: 高通自己实现了一套smmu api,供KMD使用
- cam_lrme/: 低分辨率运动估计模块的驱动实现
- cam_fd/: 人脸识别的驱动程序
- cam_isp/: isp的驱动程序
- cam_jpeg/: 编码器,可以通过该驱动完成jpeg的编码工作
- cam_cdm/: camera data mover,数据移动器的驱动实现,主要用于解析由CSL传入的命令信息,其中包括了寄存器的设置以及图像数据的处理等。
- cam_cpas/: 该模块主要用于CSL获取camera 平台驱动信息,IPE/BPS电源控制等
- cam_icp/: image control processor ,图像处理控制器驱动实现
- cam_sensor_module/: 类传感器的系列硬件模块
- cam_actuator/: 对焦马达的驱动实现
- cam_cci/: 实现了用于通讯的CCI接口,其中包括了I2C以及gpio的实现
- cam_csiphy: 基于MIPI CSI接口的物理层驱动,用于传输图像数据
- cam_sensor_io: 使用cam_cci,向上实现了控制sensor的IO接口
- cam_sensor: sensor 的驱动实现
- cam_sensor_util: sensor相关的公有方法的实现
- cam_eeprom: eeprom设备的驱动实现
- cam_ois : 光学防抖设备的驱动实现
- cam_flash: 闪光灯设备的驱动实现
二、核心模块解析
正如之前介绍的那样,整个框架主要由三个部分组成,CRM/Camera Sync以及子模块,接下来我们以下图为例简单讲解下各自的关系:
在系统初始化时,CRM内部会创建一个v4l2_device结构体,用于管理所有的子设备,与此同时每一个子设备在注册的时候都会创建各自的v4l2_subdev挂载到该v4l2_device上面。此外,CRM会创建一个video0设备节点提供关键接口给CSL来进行访问,而每个子设备也会在系统中生成各自的v4l2-sbudev设备节点,提供接口给CSL进行更为精细化的控制。而其中的Cam Sync在初始化的过程中,也创建了一个v4l2_device设备,并且生成了video1节点给CSL进行控制。这个框架主要就是围绕这三个部分进行的,CRM用于管理Session/Link的创建,控制Request在各个子设备中的流转,子设备受CSL控制进行配置以及图像处理工作,而一旦图像处理完成便会将结果发送至Cam Sync模块,进上传至CSL中。
1. CRM(Camera Request Manager)
该模块本质上是一个软件模块,主要做了以下几个事情:
- 接收来自CSL的Session/Link/Request请求,并且维护其在内核的状态。
- 在不同pipeline delay的子模块间,同步每一个Request状态,并按照需要发送给每一个子设备。
- 如果出现错误,负责上传至CSL。
- 负责针对实时子模块的flush操作。
其中针对Session/Link/Request的请求便是通过之前创建的video设备节点将接口暴露给CSL,一旦接收到命令便开始进行处理,而命令主要有以下几个:
- CAM_REQ_MGR_CREATE_SESSION/CAM_REQ_MGR_DESTROY_SESSION: 分别表示了Session的创建和销毁,该Session保持着与CamX-CHI的一一对应关系。
- CAM_REQ_MGR_LINK/CAM_REQ_M