Linux版本用的是TI的2.6.32,Android也是TI的,版本2.2.我们知道无论是Linux还是Android摄像头都是通过V4L2来工作的。在TI的Linux源码中具体为
drivers/media/video,这里有很多摄像头的驱动程序,比如omap34xxcam.c,ov3640.c。ov3640.c我理解,就是摄像头的驱动。但是omap34xxcam.c是干嘛用的?它与
V4L2层是如何联系的?因为ov3640.c里有ioctl的函数描述,omap34xxcam.c也有ioctl的函数描述。这不冲突吗?
还有Android源码中在camerahardware.cpp,v4l2camera.cpp中也有ioctl的函数描述,我的疑问就是V4L2既然在linux驱动层理有了为什么在Android层面还有呢?Android
层面里的东西是如何对驱动层施加影响的呢?
具体例子在camerahardware.cpp中有pixwidth和pixhight的宏定义,修改他们的值可以直接导致ov3640.c中是选择XGA配置还是QXGA配置。
Yaoming Qin:
你看看这个,这么细节的东西,只有通过读代码知道了
Yaoming Qin:
回复 Yaoming Qin:
链接 processors.wiki.ti.com/…/UserGuideOmap35xCaptureDriver_PSP_04.02.00.07
Jason Yuan:
回复 Yaoming Qin:
着篇文章里没有提到过Omap34xxcam这个“层”的作用(我觉得貌似是一个层)以及和v4l2的关系,但是却解释了V4L2层的很多函数的意义。同样遗憾的是我也没有能从看到从配置参数,比如文章中所说的图像格式、大小等是如何从Android层传到linux的驱动层的。这些还得麻烦您讲讲或给点资料。
Tuff Li:
回复 Jason Yuan:
Linux上的应用程序是先看到V4L2的,capture 驱动的是挂在V4L2下面的
所以这里你能看到两个ioctl,呵呵 😉
Jason Yuan:
回复 Tuff Li:
谢谢Tuff Li ,我表述下您的意思,您看看对不对。omap34xxcam相当于linux上的应用程序,所以会包含V4L2的ioctl,而capture驱动里是本来就有ioctl操作的。我这样理解对吗?
如果我理解的对的话,那么omap34xxcam中得ioctl和capture中得ioctl应该互相对应,请问他们是如何对应的呢?是名字一样的所以对应吗?
还有linux层面中得v4l2操作的ioctl和android层面的v4l2中得ioctl操作又是怎么碰上的呢?
Tuff Li:
回复 Jason Yuan:
不完全对,“omap34xxcam相当于linux上的应用程序”,这个理解不对
omap34xxcam是kernel driver,不是应该程序
Android是在v4l2上封了一层camera HAL的,Android上的应用程序是通过camera HAL来调用v4l2的
omap34xxcam有一个ops和v4l2关联的,Linux应用在调用v4l2的时候,会调用相关的omap34xxcam的ops
前提是omap34xxcam要注册到系统里才有
你仔细看看代码就明白了
Yaoming Qin:
回复 Tuff Li:
我还是建议您把时间都花在v4l2的接口上,也就是说camera hal上,具体driver里面的配置,暂时来看,需要修改的不多。
Tuff Li:
回复 Yaoming Qin:
通常情况下,如果需要修改和硬件相关的东西,比如sensor接口,sensor初始化,对焦等,才需要修改driver的东西(omap34xxcam),这个时候才需要调试v4l2
建议你找一个完全调试好的带camera的机器看看代码就明白了
Yaoming Qin:
回复 Tuff Li:
问题是,他们这个是module是带isp的,主要的驱动应该是在sesnor的驱动那边,,
Tuff Li:
回复 Yaoming Qin:
那和我讲的不矛盾,那就把相关的寄存器配置好就可以了