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操作。
CAM_REQ_MGR_CREATE_SESSION/CAM_REQ_MGR_DESTROY_SESSION: 分别表示了Session的创建和销毁,该Session保持着与CamX-CHI的一一对应关系。
CAM_REQ_MGR_LINK/CAM_REQ_MGR_UNLINK: 分别表示了Link的创建和