摄像头的硬件原理图如下:
拿到原理图,我们需要关注的是1、2两个管脚分别连接到I2C_SDA1和I2C_SCL1,这说明可以通过I2C控制器1来配置摄像头。另外调试摄像头的时候,可以根据这个原理图使用示波器来测量波形以验证代码是否正确。
这里还需要注意的是开发驱动之前最好用万用表测量摄像头的各个管脚是否和芯片连接正确,否则即使代码没有问题也看不到图像。
另外,还需要仔细阅读芯片手册里Camera控制器一章的描述。主要是明确以下信息:
FIMC支持以上三种视频工业标准,OV9650支持ITU-R 601 YcbCr 8-bit mode,这对后面的驱动编写非常重要。
MPLL和APLL都可以作为摄像头的时钟源,不过推荐使用MPLL。这对后面的驱动开发也有帮助。
4. 软件接口(如何和FIMC驱动对接)
硬件的问题搞清楚之后就可以集中精力关注软件的接口了。驱动可以有两种实现方法:第一种是把摄像头驱动做成普通的V4L2设备,直接调用FIMC里的寄存器实现视频数据的捕捉和处理;第二种利用内核已经实现好的FIMC的驱动,通过某种接口形式,把我们的摄像头驱动挂接在FIMC驱动之下。
这两种方法第一种实现起来代码量比较大,因为需要直接操作FIMC的寄存器,难度也大一些;第二种方法是利用内核已经做好的FIMC驱动,难点在于如何把摄像头驱动和FIMC驱动整合起来。
在Android下面,第一种方法并不可行,因为FIMC这个模块不仅仅是一个摄像头的控制接口,它还承担着V4L2的output功能和overlay(显示叠层)的功能,这两个功能对Android的显示系统非常重要。因此最好的方案还是第二种,找到摄像头驱动和FIMC驱动对接的接口,只要明确了这个接口,后面的事情就好办了,工作量也不大。