高通camera整体架构分析之端口模块篇

xiaoxiao2021-02-28  144

高通camera驱动架构设计的大致原理:将camera的所有功能划分为不同的模块,让模块自己来决定自己做的事情(高内聚,低耦合),不过要保证模块有统一的接口和格式。每个模块都会有端口,通过端口可以把模块之间连接起来,另外也可以把模块挂载到总线上。每一个端口之间的连接就是一个流,这些流用pipeline来管理。每次启动一个camera,就创建一个会话,由这个会话来管理camera的一切事物。对于每一个会话中,模块是共享的,它可以是camera的硬件资源也可以是其他资源(如一些软件算法等)。

那么如何定义这个模块的结构呢?

1、端口 — — 端口属于模块。如果这个模块只有source端口,那么它就是一个src模块;如果只有sink端口,那么它就是sink模块;如果两个端口都有,那么它就是中间模块。没有端口的模块是不能被连接到流中的,但它可以完成一些其他的功能,比如接收引擎的设置,报告事件到bus等。连接到流中的端口,也可以说是流事件(set/get),主要通过端口来处理。而来自于引擎的(set/get)通过模块来处理,当然端口也可以把事件交给模块来处理。模块内部的端口可以通过模块来建立关系,也可以建立内部的连接。

2、模块线程 — — 每个模块可以有一个线程来处理模块的事情。一个线程对应一个队列,线程就是从队列中取出数据处理,然后应答出去。

3、总线回调 — — 当一个模块向总线注册时,总线向其提供一个回调函数,当模块有事件发生时,调用这个函数向总线发消息,然后总线把这个消息提交给管道,管道把这个消息顺着流发下去。

camera daemon进程

代码放置在 vendor/qcom/proprietary/mm-camera/mm-camera2/

进入里面可以看到media-controller、 server-imaging、server-tuning及其他几个目录,我们这里需要关注的主要是media-controller目录。

media-controller

| -  mct — — 里面包含了camera引擎、pipeline、bus、module、stream及event等定义和封装

| -  modules — — 这里面就是划分好的一些模块代码,各模块大致功能如下:

     | - sensor — — sensor的驱动模块                                                                              — —  src 模块

     | - iface — — ISP interface 模块                                                                                  — —  inter 模块

     | - isp — — 主要是ISP的处理                                                                                      — —  inter 模块

     | - stats — — 一些统计算法模块,如3A、ASD、AFD、IS等数据统计的处理               — —  sink 模块

     | - pproc — — post process 处理                                                                                — —  inter 模块

     | - imglib — —  主要是图片的一些后端处理,如HDR等                                               — —  sink 模块

以上模块内部又包含众多的模块,具体需要看代码分析。

转载请注明原文地址: https://www.6miu.com/read-71639.html

最新回复(0)