目录
目录 2
上篇:camera系统架构 3
一.Camera硬件系统 3
1. 硬件要点 3
2. 硬件接口 3
3. 主要参数性能比较 3
二.Camera 软件系统 4
1. Camera Daemon 进程 5
2. Camera frontend 6
3. Hal 层和mm-camera-interface 7
4. Camera kernel 层 8
5. Imaging Server and Media Controller 9
6. Module Organization and Communication 9
7. 驱动代码组织架构 10
8. 最底层的Kernel 部分 11
下篇:移植基准流程 12
一. 如何添加camera 模组 12
1. Kernel部分 12
2. Verdor部分 12
二. 驱动调试 15
1. dts配置 15
2. sensor_lib_ptr 结构体 16
上篇:camera系统架构
一.Camera硬件系统
1. 硬件要点
a. AP 是一个Cortex-A53
b. 专用的CCI(camera control interface)接口
c. 强劲的VFE(video front end)
双isp;
主摄支持21M (4Lane)
d. JPEG decode/encode ---HW
Hw encode,sw decode
e. 后端处理CPP(camera postprocesser)
支持翻转/旋转、降噪、光滑/锐化,作物和高级特性
全尺寸VFE输出帧
2. 硬件接口
最多支持3个mipi 接口的camera
支持双4lane(前后camera)或4/2/1lane(三个mipi camera)
3. 主要参数性能比较
表一 性能参数比较
二.Camera 软件系统
基于android系统的camera 软件架构如下:
图一 android camera 软件架构
高通对于camera的代码组织大体是遵循Android架构的,但对于最核心的sensor端底层设置、ISP效果参数等进行了单独的剥离,放在daemon进程中进行。
图二 MSM8940 camera 架构
1. Camera Daemon 进程
daemon进程作为单一进程,在代码中就是mm-qcamera-daemon,其main 函数的 入口,位置如下:
/project/vendor/qcom/proprietary/mm-camera/mm-camera2/server-imaging/server.c
/project/vendor/qcom/proprietary/mm-camera/mm-camera2/server-imaging/server_process.c
在此函数中,主要做以下几件事情:
a . 找到服务节点名称并打开:
boolean get_server_node_name(char *node_name)
b. 初始化模块
boolean server_process_module_init
….....temp = modules_list[i].init_mod(modules_list[i].name);....
此处加载MCT下的六大模块(树结构下的六大模块)。
2. Camera frontend
图三 camera frontend 软件架构
3. Hal 层和mm-camera-interface
图四 camera hal 层和mm-camera-interface
4. Camera kernel 层
图五 camera kernel 层架构
5. Imaging Server and Media Controller
图六 Imaging Server and Media Controller 架构
6. Module Organization and Communication
图七 模块组织与关联
7. 驱动代码组织架构
camera deamon代码位于vendor/qcom/proprietary/mm-camera/mm-camera2目录下,在此目录下有media-controller,server-tuning,server-imaging,我们需要关注的是media-controller目录,整个树形结构如下:
|media-controller
|-mct camera的引擎部分,包括引擎,pipiline管理,bus,module,stream,event等定义和封装;
|-modules 这里面就是刚才进程中要加载的六大模块,功能如下:
|-sensors sensor的所有驱动集合
|-actuator 马达基本配置
|-sensor/libs,chromatix camera 模组基本配置以及效果参数,模 组这块最主要的两部分
|-eeprom/libs eeprom配置以及参数,现在基本不用
|- flash/libs led flash 驱动
|-configs camera xml 配备文件
|-iface2 ISP interface模块
|-isp/isp2 ISP的处理
|-stats 统计算法模块的集合,如3A,AFD等的处理
|-imglib 图片的后端处理,如HDR,人脸识别等
|-pproc post process 处理,如flip,rotate等
框图如下:
图八 代码组织图
8. 最底层的Kernel 部分
而在最底层的kernel部分只是进行了V4L2的设备注册,IIC设备注册等简单的动作,主文件是msm.c,负责设备的具体注册和相关方法的填充;在msm_sensor.c中,主要是维护一个sensor结构体msm_sensor_ctrl_t,同时吧dts文件中的配置信息读出来。
图九 kernel 层camera 代码会意简图
下篇:移植基准流程
一. 如何添加camera 模组
由上面的软件代码架构可知,Camera驱动代码的添加主要是两个部分,一个是kernel 目录下的驱动添加与配置,一个是vendor目录下代码的添加。
1. Kernel部分
主要是配置dts文件,供msm_sensor.c读取。
a. 确认配置menuconfig
在qcom 平台上,已经弱化了menuconfig,但是有的也需要配置下,如各种传感器等等。对于camera 部分,主要检查以下配置既可:
CONFIG_MEDIA_CAMERA_SUPPORT=y
CONFIG_MEDIA_RADIO_SUPPORT=y
CONFIG_MEDIA_CONTROLLER=y
CONFIG_VIDEO_V4L2_SUBDEV_API=y
CONFIG_VIDEOBUF2_MSM_MEM=y
CONFIG_V4L_PLATFORM_DRIVERS=y
CONFIG_MSMB_CAMERA=y
b. dts 部分
dts的配置,调试部分会有详细说明。
2.Verdor部分
而实质性的代码一般都放在vendor下,这部分是高通自己实现的daemon进程和kernel层以及hal层进行通讯的框架代码;另一部分是效果代码。
a. Xml 文件
① Xml文件接口
在MSM8909平台上,通过一个数组去初始化名称,把模组名称加载进去;MSM8940上第一次引入了xml这种格式,其实都是一样的,不过xml文件中还包含了很多其他的信息。
如,在sensor_init.c中,通过sensor_xml_util_load_file把xml 文件load进去,
#define CONFIG_XML "msm8937_camera.xml"
……
snprintf(config_xml_name, BUFF_SIZE_255, "%s%s",
CONFIG_XML_SYSTEM_PATH, CONFIG_XML);
}
……
/* Get the Root pointer and Document pointer of XMl file */
ret = sensor_xml_util_load_file(config_xml_name, &docPtr, &rootPtr,
"CameraConfigurationRoot");
……
② Xml 文件解析
如果你要在代码中加载那个sensor,就需要配置xml文件中做相应的配置,xml文件代码片段如下:
0
ov8856 /* 模组名称*/
pmic /* flashing 类型*/
dw9714 /*actuator 驱动IC名称*/
ov8856_chromatix /*chromatixname Name*/
1
BACK /*前后摄*/
90 /*角度*/
/*cs&&mipi 配置*/
0 /*cs0*/
0x7 /*phdy
config*/
0x4320
0
/*lens config*/
2.54
b. 配置vendor mak文件:
此处加载具体文件名称,路径如下:
vendor\qcom\proprietary\common\config\device-vendor.mk
配置如下:
表二 vendor mak配置文件list
c. Lib 驱动
Lib驱动部分和MSM8909相比,做了很多简化,sensor部分中把mipi的配置放到了xml文件中,其余的都差不多;而actuator部分如故,如下表所示:
表三 sensor lib 驱动
d. Chromatix para 文件列表
Chromatix tab para 和msm8909相比,可谓是千壤之别,文件列表如下,专就这部分的研究我会另写一个总结,这里不详述。
表四 chromatix para
二. 驱动调试
1. dts配置
在msm.c 和 msm_sensor.c中,高通已经帮我们写好了软件架构,一般不用修改代码,主要是配置dts文件:msm8937-camera_sensor-skuc.dtsi。
表五 dtsi中camera 设备节点截选
2. sensor_lib_ptr 结构体
在sensor lib中,有sensor基本驱动,主要是添加sensor_lib_t 结构体,这部分和MSM8909相比较,文件内容变化不大,形式变化较大,位于xx_lib.h 中:
表六 sensor_lib_t 成员截选图