好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

深入理解高通CamxCHI架构.pdf

15页
  • 卖家[上传人]:lil****ar
  • 文档编号:333428643
  • 上传时间:2022-09-02
  • 文档格式:PDF
  • 文档大小:751.15KB
  • / 15 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 深理解通CamxCHI架构深理解通CamxCHI架构和你起终学习,这是程序员 Android和你起终学习,这是程序员 Android本篇章主要介绍 Android 开发中的部分知识点,通过阅读本篇章,您将收获以下内容:、概览、基本组件概念三、组件结构关系四、关键流程详解、概览、概览回顾通平台Camera HAL历史,之前通采的是QCamera & MM-Camera架构,但是为了更精细化控制底层硬件(Sensor/ISP等关键硬件),同时便机商定义些功能,现在提出了CamX-CHI架构,由于在CamX-CHI中完全看不到之前架构的影,所以它完全是个全新的架构,它将些度统的功能性接抽离出来放到CamX中,将可定制化的部分放在CHI中供不同商进修改,实现各独有的特功能,这样设计的好处显易见,那便是即便开发者对于CamX并不是很了解,但是依然可以很便的加定义的功能,从降低了开发者在通平台的开发门槛接下来我们以最直观的录结构对该架构做个简单的认识,以下便是CamX-CHI基本录结构:image该部分代码主要位于 vendor/qcom/proprietary/ 录下:其中 camx 代表了通功能性接的代码实现集合(CamX),chi-cdk代表了可定制化需求的代码实现集合(CHI),从图中可以看出Camx部分对上作为HAL3接的实现,对下通过v4l2框架与Kernel保持通讯,中间通过互相dlopen so库并获取对操作接的式保持着与CHI的交互。

      camx/中有如下个主要录:core/ : 于存放camx的核实现模块,其中还包含了主要于实现hal3接的hal/录,以及负责与CHI进交互的chi/录csl/: 于存放主要负责camx与camera driver的通讯模块,为camx提供了统的Camera driver控制接hwl/: 于存放具有独运算能的硬件node,该部分node受csl管理swl/: 于存放并不具有独运算能,必须依靠CPU才能实现的nodechi-cdk/中有如下个主要录:chioverride/: 于存放CHI实现的核模块,负责与camx进交互并且实现了CHI的总体框架以及具体的业务处理bin/: 于存放平台相关的配置项topology/: 于存放户定的Usecase xml配置件node/: 于存放户定义功能的nodemodule/: 于存放不同sensor的配置件,该部分在初始化sensor的时候需要到tuning/: 于存放不同场景下的效果参数的配置件sensor/: 于存放不同sensor的私有信息以及寄存器配置参数actuator/: 于存放不同对焦模块的配置信息ois/: 于存放防抖模块的配置信息flash/: 存放着闪光灯模块的配置信息eeprom/: 存放着eeprom外部存储模块的配置信息fd/: 存放了脸识别模块的配置信息、基本组件概念、基本组件概念1. Usecase1. Usecase作为CamX-CHI中最的抽象概念,其中包含了多条实现特定功能的Pipeline,具体实现是在CHI中通过Usecase类完成的,该类主要负责了其中的业务处理以及资源的管理。

      Usecase类,提供了系列通接,作为现有的所有Usecase的基类,其中,AdvancedCameraUsecase继承于CameraUsecaseBase,相机中绝部分场景会通过实例化AdvancedCameraUsecase来完成,它包括了个主要接:Create(): 该法是静态法,于创建个AdvancedCameraUsecase实例,在其构造法中会去获取XML中的相应的Usecase配置信息ExecuteCaptureRequest(): 该法于下发次Request请求ProcessResultCb(): 该法会在创建Session的过程中,作为回调法注册到其中,旦Session数据处理完成的时候便会调该法将结果发送到AdvancedCameraUsecase中ProcessDriverPartialCaptureResult(): 该法会在创建Session的过程中,作为回调法注册到其中,旦Session中产了partial metadata的时候,便会调该法将其发送AdvancedCameraUsecase中ProcessMessageCb(): 该法会在创建Session的过程中,作为回调法注册到其中,旦Session产任何事件,便会调该法通知到AdvancedCameraUsecase中。

      ExecuteFlush(): 该法于刷新AdvancedCameraUsecaseDestroy(): 该法于安全销毁AdvancedCameraUsecaseUsecase的可定制化部分被抽象出来放在了common_usecase.xml件中,这简单介绍其中的个主要的标签含义:UsecaseUsecaseName: 代表了该Usecase的名字,后期根据这个名字找到这个Usecase的定义Targets: 于表于输出的数据流的集合,其中包括了数据流的格式,输出Size的范围等Pipeline: 于定义该Usecase可以是使的所有Pipeline,这必须少定义条Pipeline2. Feature2. Feature代表了个特定的功能,该功能需要多条Pipeline组合起来实现,受Usecase统管理,在CHI中通过Feature类进实现,在XML中没有对应的定义,具体的Feature选取作是在Usecase中完成的,通过在创建Feature的时候,传Usecase的实例的式,来和Usecase进相互访问各的资源以下是现有的Feature,其中Feature作为基类存在,定义了系列通法。

      image个常的Feature:FeatureHDR: 于实现HDR功能,它负责管理内部的条或者条pipeline的资源以及它们的流转,最终输出具有HDR效果的图像FeatureMFNR: 于实现MFNR功能,内部分为个的流程,分别包括Prefiltering、Blending、Postfilter以及最终的OfflineNoiseReproces(这个是可选择使能的),每个功能中包含了各的pipelineFeatureASD: 于AI功能的实现,在预览的时候,接收每帧数据,并且进分析当前场景的AI识别输出结果,并其通过诸如到metadata式给到上层,进后续的处理3. Session3. Session于管理pipeline的抽象控制单元,个Session中少拥有个pipeine,并且控制着所有的硬件资源,管控着每个内部pipeline的request的流转以及数据的输输出,它没有可定制化的部分,所以在CHI中的XML件中并没有将Session作为个独的单元进定义Session的实现主要通过CamX中的Session类,其主要接如下:Initialize(): 根据传的参数SessionCreateData进Session的初始化作。

      NotifyResult(): 内部的Pipeline通过该接将结果发送到Session中ProcessCaptureRequest(): 该法于户决定发送个Request到Session中的时候调StreamOn(): 通过传的Pipeline句柄,开始硬件的数据传输StreamOff(): 通过传的Pipeline句柄,停硬件的数据传输4. Pipeline4. Pipeline作为提供单特定功能的所有资源的集合,维护着所有硬件资源以及数据的流转,每个Pipeline包括了其中的Node/Link,在CamX中通过Pipeline类进实现,负责整条Pipeline的软硬件资源的维护以及业务逻辑的处理,接下来我们简单看下该类的个主要接:Create(): 该法是个静态法,根据传的PipelineCreateInputData信息来实例化个Pipeline对象StreamOn(): 通知Pipeline开始硬件的数据传输StreamOff(): 通知Pipeline停硬件的数据传输FinalizePipeline(): 于完成Pipeline的设置作OpenRequest(): open个CSL于流转的RequestProcessRequest(): 开始下发RequestNotifyNodeMetadataDone(): 该法是Pipeline提供给Node,当Node内部成了metadata,便会调该法来通知metadata已经完成,最后当所有Node都通知Pipeline metadata已经完成,Pipeline 便会调ProcessMetadataRequestIdDone通知Session。

      NotifyNodePartialMetadataDone(): 该法是Pipeline提供给Node,当Node内部成了partial metadata,便会调该法来通知metadata已经完成,最后当所有Node都通知Pipeline metadata已经完成,Pipeline 便会调ProcessPartialMetadataRequestIdDone通知SessionSinkPortFenceSignaled(): 来通知Session 某个sink port的fence处于被触发的状态NonSinkPortFenceSignaled(): 来通知Session 某个non sink port的fence处于被触发的状态Pipeline中的Node以及连接式都在XML中被定义,其主要包含了以下个标签定义:PipelineName: 来定义该条Pipeline的名称NodeList: 该标签中定义了该条Pipeline的所有的NodePortLinkages: 该标签定义了Node上不同端之间的连接关系5. Node5. Node作为单个具有独处理功能的抽象模块,可以是硬件单元也可以是软件单元,关于Node的具体实现是CamX中的Node类来完成的,其中CamX-CHI中主要分为两个类,个是通实现的Node包括硬件Node,个是CHI中提供给户进实现的Node,其主要法如下:Create(): 该法是静态法,于实例化个Node对象。

      ExecuteProcessRequest(): 该法于针对hwl node下发request的操作ProcessRequestIdDone(): 旦该Node当前request已经处理完成,便会通过调该法通知PipelineProcessMetadataDone(): 旦该Node的当前request的metadata已经成,便会通过调该法通知到PipelineProcessPartialMetadataDone(): 旦该Node的当前request的partial metadata已经成,便会通过调该法通知到PipelineCreateImageBufferManager(): 创建ImageBufferManager其可定制化的部分作为标签在XML中进定义:NodeName: 来定义该Node的名称NodeId: 来指定该Node的ID,其中IPE NodeId为65538,IFE NodeId为65536,户定义的NodeId为255NodeInstance: 于定义该Node的当前实例的名称NodeInstanceId: 于指定该Node实例的Id6. Link6. Link于定义不同Port的连接,个Port可以根据需要建多条与其它从属于不同Node的Port的连接,它通过标签来进定义,其中包括了作为输端,作为输出端。

      个Link中包含了个SrcPort和个DstPort,分别代表了输端和输出端,然后BufferProperties于表两个端之间的buffer配置7. Port7. Port作为Node的输输出的端,在XML件中,标签来定义个输端,标签来定义输出端,每个Node都可以根据需要使个或。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.