整体驱动理解以下:api
1:如何在设备上建立一个摄像头文件,具体api是什么?架构
2:内核板级bsp作了什么?是如何与V4L2框架链接起来的?框架
3:我到底如何给板级bsp什么参数,才能让摄像头工做?ide
=============================================================函数
以前没有作过相关的camear 驱动经验,只是对V4L2 有所耳闻,可是知道一些基本的原生框架的API,因而我决定看看板级bsp作了什么让开发变得简洁。看了几天整理了如上内容决定依次解答。spa
1:对于原生V4L2 架构的API ,是 video_register_device(),该函数是会建立 /dev/videox 节点的,可是对于咱们这款单板bsp ,官方api是 v4l2_int_device_register() ,其内部调用了原生api。接口
2:经阅读,发现mxc_v4l2_capture.c文件是作了一个camera的开天辟地的驱动。具体分析见 个人第三篇文章,这里作出一个总结。ip
2-1:Camera驱动是作了驱动和设备信息的分离,该文件是driver框架的一部分,用于读取设备信息如 ipu_id 和csi_id ,sensor的分辨率,引脚复用等等,用来填充一个cam_data结构体,开发
这个cam_data相当重要,在之后的任何与设备的操做中,均要读取cam_data的信息。it
2-2 :camera驱动是分主从的,驱动主体做为主,设备驱动做为从,因而须要一个主从的匹配,匹配的过程是根据ipu_id 和csi_id 的。匹配成功会调用一个attach函数,这个attach会作一些默认操做和检查。
2-3:任何对于 设备结点的 系统调用如 open Write ioctl 均会最终调用到 mxc_v4l_open ,mxc_v4l_close ,mxc_v4l_do_ioctl,等等。
3:
这块是要进行区分,imx6q 支持并口输入和mipi输入,这两个须要设备驱动提供的参数也不尽相同。
对于并口传输要作如下步骤
1: csi_id , ipu_id ,camera_width,camera_height ,数据线的复用使能,i2c控制接口使能。
2:在你的设备驱动里根据板机文件或者设备树 解析这些部分,获取到这些信息
对于mipi接口 :
1: csi_id , ipu_id ,camera_width,camera_height ,mclock
2 : 获取这些信息填充一个sensor_data结构体,并使能时钟。