在上一篇文章中介绍了camera的基础知识和相关概念,我们一起来了解一下驱动相关的代码结构。本文以高通+android平台为示例,首先看一下整体框图:
这张图是从整体上来看的
1,图中最下面的是kernel层的驱动,其中按照V4L2架构实现了camera sensor等驱动,向用户空间提供/dev/video0节点
2,在往上是HAL层,高通代码实现了对/dev/video0的基本操作,对接了android的camera相关的interface。(ps,HAL层的库中也封装了sensor端一些核心逻辑代码。将驱动的操作逻辑放在HAL层是为了避免linux的开源属性对厂商私有技术的泄露)3,在之上就是android的架构对camera的处理,不是本文重点,暂不展开。
V4L2架构图
本小节内容摘自(http://blog.csdn.net/rubyboss/article/details/14053523)
V4L2支持三类设备:视频输入输出设备、VBI设备和radio设备(其实还支持更多类型的设备,暂不讨论),分别会在/dev目录下产生videoX、radioX和vbiX设备节点。
Linux系统中视频输入设备主要包括以下四个部分:
字符设备驱动程序核心:V4L2本身就是一个字符设备,具有字符设备所有的特性,暴露接口给用户空间;
V4L2驱动核心:主要是构建一个内核中标准视频设备驱动的框架,为视频操作提供统一的接口函数;
平台V4L2设备驱动:在V4L2框架下,根据平台自身的特性实现与平台相关的V4L2驱动部分,包括注册video_device和v4l2_dev。
具体的sensor驱动:主要上电、提供工作时钟、视频图像裁剪、流IO开启等,实现各种设备控制方法供上层调用并注册v4l2_subdev。
V4L2的核心源码位于drivers/media/v4l2-core,源码以实现的功能可以划分为四类:
核心模块实现:由v4l2-dev.c实现,主要作用申请字符主设备号、注册class和提供video device注册注销等相关函数;
V4L2框架:由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c等文件实现,构建V4L2框架;
Videobuf管理:由videobuf2-core.c、videobuf2-dma-contig.c、videobuf2-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件实现,完成videobuffer的分配、管理和注销。
Ioctl框架:由v4l2-ioctl.c文件实现,构建V4L2ioctl的框架。
kernel层高通关于camera的主要代码简图
由于高通将大部分驱动逻辑代码放到了HAL层,因此在kernel部分只进行了V4L2的设备注册、IIC设备驱动等基本动作。
camera在kernel层的主文件为msm.c,负责设备的具体注册及相关方法的填充;
在msm_sensor.c文件中,主要维护高通自己的一个sensor相关结构体—msm_sensor_ctrl_t,同时把dts文件中的配置信息读取出来;
kernel层对于不同的sensor对应自己的同一个驱动文件 — msm_sensor_driver.c,主要是把vendor下面的sensor_lib_t的设定填充到msm_sensor_ctrl_t中
在msm_sensor_init.c中主要是一些IOCTL处理,处理vendor传下来的IOCTL,vendor下面的power_setting,ret_setting等信息都是通过这里的ioctl传下来的
vendor目录下相关代码
在vendor目录下,高通把各个sensor实质性的代码放置在此。一部分代码是高通自己 实现的daemon进程和kernel层及HAL层进行通讯的框架代码;另一部分,则是和sensor 相关的 chromatix 效果代码和 sensor lib 部分代码(init setting、lens info、 output info)。
camera调试
对于kernel层的代码移植,实际上对dts文件的移植。因为kernel层驱动代码基本已经被高通的框架以及vendor下代码架空。 具体步骤为:
1. 在目录kernel/arch/arm/boot/dts/下的对应dtsi文件中新增camera节点,主要关注节点中的IIC地址、 sensro的ID信息、电压设定信息,例如:
设备树源文件为kernel/arch/arm/boot/dts/qcom/下的<target>_camera*.dtsi,例如msm8916-camera-sensor-mtp.dtsi。客户应使用如下所示的摄像头插槽:
qcom,camera@0 {
cell-index = <0>;
compatible = "qcom,camera";
. . .
}
2.高通关于camera的dts节点属性值解释,有关各个属性的解释,请参考以下目录下的文档:
kernel/Documentation/devicetree/bindings/media/video/
3,修改kernel下面的相关mk文件
Vendor下代码移植
Vendor下面的代码关系着camera是否点亮的代码主要是两部分,一个是sensor_libs目录下的sensor具体设定文件,另一个是chromatix下面的ISP效果文件。具体为:
1. sensor_libs目录下文件:包括一个Android.mk文件和一个.c文件。其中Android.mk文件参考同目录下其他.mk文件修改和对应sensor有关设定即可; .c文件中需要填充的为一个sensor_lib_t类型的结构体(ov7251填充示例):
2. chromatix目录下相关文件,在对应sensor目录下包含4个目录和一个Android文件,总共13个文件,这些文件都会由chromatix调试工具生成。下面为IMX179文件实例:
3. vendor下还有eeprom文件,模组自带的eeprom数据处理相关; AF相关文件,调试工具生成的关于AF的效果文件;配置文件,把需要编译的模块填进配置文件中。