MM-Camera架构-驱动代码架构

mm-camera 概述

流程

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

模块结构

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

1.端口——端口属于模块,如果这个模块只有source端口,那么它就是一个src模块;如果只有sink端口就是sink模块,如果都有就是中间模块。没有端口的模块是不能连接到流中的,但他可以完成一些其他的功能,比如接收引擎的设置,报告事件到bus等。连接到流中的端口,也就是说流事件(set/get)主要通过端口来处理。而来自于引擎的(set/get)通过模块来处理,当然端口也可以把事件交给模块来处理。模块内部的端口可以通过模块来建立关系,也可以建立内部的连接,端口有关get/set process。
2.模块线程——每个模块可以有一个线程来处理模块的事情。一个线程对应一个队列,线程就是从队列中取出数据处理,然后应答回去。
3.总线回调——当一个模块向总线注册时,总线向其提供一个回调函数,当模块有事件发生时,调用这个函数向bus发消息,然后总线把这个消息提交给管道,管道把这个消息顺着流发下去。
4.模块的get、set以及process。

框架

管道(pipeline)、引擎(mct)与会话(session)
管道有两端,一端用于读,一端用于写。camera引擎负责对管道的监控,而会话(session)管理camera引擎。

代码位于 vendor/qcom/proprietary/mm-camera/mm-camera2 目录下,
在此目录下有 media-controllerserver-tuningserver-imaging,我们需要关注的是 media-controller 目录,整个树形结构如下:

|- mct ——应该就是camera的引擎() 里面包含了引擎、pipiline、bus、module、stream及event等定义及封装。
|- modules —— 这里面就是划分好的一些模块代码,各模块大致功能如下 :
    |- sensor —— sensor 的驱动模块(src模块)
        |- actuator_libs,actuators 马达基本配置以及效果参数
        |- sensor_libs,chromatix camera模组基本配置以及效果参数,模组这块最重要的两部分
        |- eeprom_libs,eeprom eeprom配置以及参数,现在基本不用
        |- strobe_flash,led_flash strobe,led flash驱动
    |- iface    —— ISP interface模块
    |- isp      —— 主要是ISP的处理,其内部又包含了众多的模块(inter模块)
    |- stats    —— 一些统计算法模块,如3A,ASD,AFD,IS,GRRO等数据统计的处理(sink模块)
    |- pproc    —— post process处理(inter模块)
    |- imglib —— 主要是图片的一些后端处理,如HDR,人脸识别等(sink模块)

mm-camera架构有2个版本
(1)最老的版本是有一个守护进程mm-qcamera-daemon的,
如msm8909平台,后来新版的架构改过,移除了这个守护进程,如msm8937(sdm429)平台。
(2) Android O 中,系统启动时,就会启动 CameraProvider 服务。它将 Camera HAL 从 cameraserver 进程中分离出来,做为一个独立进程 [email protected] 来控制 HAL。这两个进程之间经过 HIDL 机制进行通讯

media controller线程

MCT线程是camera新架构的引擎部分,负责对管道的监控,由此来完成一个camera设备的控制运转。

旧版本

运行在daemon进程空间,由MSM_CAMERA_NEW_SESSION事件来开启,具体开启函数为server_process_hal_event—>mct_controller_new()。
server_process_hal_event() -> mct_controller_new() //“vendor/qcom/proprietary/mm-camera/mm-camera2/server-imaging/server.c”

新版本
path:hardware/qcom/camera/QCamera2/stack/mm-camera-interface/src/mm_camera_interface.c

mm_camera_module_open_session() 
shim_ops_tbl->mm_camera_shim_open_session = mct_shimlayer_start_session;

path:vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct_shim_layer/mct_shim_layer.c
mct_shimlayer_start_session -> mct_controller_new()

你可能感兴趣的:(camera,camera)