高通对于 camera 的代码组织大体是遵循 Android 架构的,但对于最核心的 sensor 端底层设
置、ISP 效果参数等进行了单独的剥离,放在 daemon 进程中进行。
一.camera daemon 进程
daemon 进程作为单一进程,main 函数的入口,位置如下:
/project/vendor/qcom/proprietary/mm-camera/mm-camera2/server-imaging/server.c
/project/vendor/qcom/proprietary/mm-camera/mm-camera2/serverimaging/server_process.c
在此函数中,主要做以下几件事情:
1.找到服务节点名称并打开:
boolean get_server_node_name(char *node_name)
2.初始化模块
boolean server_process_module_init
….....temp = modules_list[i].init_mod(modules_list[i].name);....
此处加载 MCT 下的六大模块(树结构下的六大模块) 3.进入主循环处理 HAL 层以及 MCT 的时间和消息,看其枚举定义:
typedef enum _read_fd_type {
RD_FD_HAL, ----------------server_process_hal_event()---返回真,说明消息传递给 MCT;反之没有;
RD_DS_FD_HAL, ----------server_process_hal_ds_packet()---通过domain socket 传来自 HAL 层的消息;
RD_PIPE_FD_MCT, ----------------来自 media controller 的消息;
RD_FD_NONE
} read_fd_type;
二.驱动代码架构
camera deamon 代码位于 vendor/qcom/proprietary/mm-camera/mm-camera2 目录下,
在此目录下有 media-controller,server-tuning,server-imaging,我们需要关注的是 mediacontroller 目录,整个树形结构如下:
而在 kernel 部分只是进行了 V4L2 的设备注册,IIC 设备注册等简单的动作,主文件
是 msm.c,负责设备的具体注册和相关方法的填充;在 msm_sensor.c 中,主要是维护一个
sensor 结构体 msm_sensor_ctrl_t,同时吧 dts 文件中的配置信息读出来。
come from :
那么如何来定义这个模块的结构呢?
1.端口——端口属于模块,如果这个模块只有source端口,那么它就是一个src模块;
如果只有sink端口就是sink模块,如果都有就是中间模块。
没有端口的模块是不能连接到流中的,但他可以完成一些其他的功能,比如接收引擎的设置,报告事件到bus等。
连接到流中的端口,也就是说流事件(set/get)主要通过端口来处理。而来自于引擎的(set/get)通过模块来处理,当然端口也可以把事件交给模块来处理。模块内部的端口可以通过模块来建立关系,也可以建立内部的连接,端口有关get/set process。
2.模块线程——每个模块可以有一个线程来处理模块的事情。一个线程对应一个队列,线程就是从队列中取出数据处理,然后应答回去。
3.总线回调——挡一个模块向总线注册时,总线向其提供一个回调函数,当模块有事件发生时,调用这个函数向bus发消息,然后总线把这个消息提交给管道,管道把这个消息顺着流发下去。
4.模块的get、set以及process。
管道、引擎与会话
管道有两端,一端用于读,一端用于写。camera引擎负责对管道的监控,而会话管理camera引擎。
从代码结构上来看这种新的驱动架构
高通的camera deamon代码放置在vendor\qcom\proprietary\mm-camera目录下,而此目录下的mm-camera2就是新的camera架构位置,进入里面可以看到media-controller、server-imaging、server-tuning及其它几个目录,我们这里需要关注的就是media-controller目录。
media-controller
|- mct——应该就是camera的引擎?里面包含了引擎、pipiline、bus、module、stream及event等定义及封装。
|- modules——这里面就是划分好的一些模块代码,各模块大致功能如下
|- sensor —— sensor 的驱动模块? —— src模块
|- iface —— ISP interface模块 —— inter模块
|- isp —— 主要是ISP的处理,其内部又包含了众多的模块 —— inter模块
|- stats —— 一些统计算法模块,如3A,ASD,AFD,IS,GRRO等数据统计的处理 —— sink模块
|- pproc —— post process处理 —— inter模块
|- imglib —— 主要是图片的一些后端处理,如HDR等 —— sink模块
以上各模块内部又包含了众多的模块,具体需要看代码分析。