Overview

CamX-CHI架构是为了更精细化控制底层硬件,同时方便手机厂商自定义一些功能而提出的。它将一些高度统一的功能性接口抽离出来放到CamX中,将可定制化的部分放到CHI中供厂商修改以实现各自独有的特色功能。这样做的好处是:即便开发者对CamX不是很了解,也可以很方便地加入自定义的功能,从而降低开发者在高通平台的开发门槛。

目录结构

alt CamX-CHI目录结构

图中CamX代表了功能性接口的代码实现集合,CHI则代表了可定制化需求的代码实现集合。CamX对上作为HAL3接口的实现,对下通过V4L2框架与Kernel保持通讯,并以互相dlopen so库的方式与CHI交互以获取对方的操作接口。

各个目录的用途

待续……

各个部件

Usecase

Usecase是CamX-CHI中最大的抽象概念,其中包含这多条用于实现特定功能的Pipeline,其具体实现主要是通过Usecase类完成。Usecase主要负责业务处理及资源管理。

主要接口

待续……

Feature

一个Feature表示一个特定的功能,它需要多条Pipeline组合实现,受到Usecase的统一管理,其具体实现是CHI中的Feature类。在XML中没有对应的定义时,具体的Feature的选取是通过在Usecase中完成的,通过在创建Feature的时候,传入Usecase的实例的方式来和Usecase进行相互访问各自的资源。从Feature基类派生出了很多子类:

alt Feture Father and its Children

Session

Session是用于管理pipeline的抽象控制单元,一个Session中至少拥有一个pipeline。Session控制着所有的硬件资源,管控着内部的每一个pipeline的request的流转及数据的输入输出,它没有可定制化的部分,所以在CHI中的XML文件中没有将Session作为一个独立的单元进行定义。

主要接口

Session的主要实现是通过CamX中的Session类,其只要接口包括:

待续……

Pipeline

Pipeline是提供单一特定功能的所有资源的集合,它维护着所有硬件资源及数据的流转,每一个Pipeline包括了其中的Node/Line,在CamX中通过Pipeline类实现。

主要接口

待续……

Node

Node是具有独立处理功能的抽象模块,它可以是硬件单元,也可以是软件但愿。Node是的具体实现是CamX中的Node类,而在CamX-CHI中主要分为两大类:高通自己实现的Node包括硬件Node和CHI中提供给用户进行实现的Node。

具体接口

待续……

Link用于定于不同的Port连接。一个Port可以根据需要在与其从属不同的Port间建立多条连接。每个Link都包含了分别代表输入、输出端口的一个SrcPort和一个DstPort。两个端口之间的buffer配置用BufferProperties表示。

Port

Port是Node的输入或输出端口。在XML文件中,可以用标签来定义输入输出端口。每个Node均可以根据需要使用若干输入输出端口。

相关结构体

待续……

组件的结构关系

atl 组件结构

关键流程

Camera Provider 初始化

Camera Provider会随着系统的启动而启动,其在初始化的过程中会通过获取的camera_module_t调用其get_number_of_camera接口以获取底层支持的camera数量。第一次获取时还会进行一系列的初始化动作:
alt 获取camera数量

  1. 读取vendor/etc/camera/camxoverridesettings.txt
  2. 获取底层支持的硬件信息
  3. 读取/vendor/lib64/camera/components中的各个Node生成的so库,并存入ExternalComponentInfo中

除此之外,在初始化阶段,CamX与CHI还通过相互dlopen对方的so库获取了对方的入口方法,然后通过彼此的入口方法获取对方的操作方法集合,最后通过这些操作方法与对方进行通讯:

alt 初始化时CamX与CHI的交互

打开相机设备/初始化相机设备

待续……