




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
厦门三五信息技术有限公司5m sensor调试总结anchiano文件状态草稿正式修改编 号pro_项目号_类型_编号_rx.yy拟 制审 核批 准发布日期2010-8-20anchiano5m sensor调试总结版本历史记录版本制订者生效时间更改内容审核人审核意见变更申请单号第 12 页 共 12 页编号:pro_项目号_类型_编号_rx.yy目 录1.目的42.适用范围43.参考文档44.缩写45.名词定义46.linux2.6.28内核调试56.1.ov5642驱动编写56.2.ov5642曝光控制76.3.ov5642闪光灯控制、自动对焦76.4.ov5642拍照速度以及启动速度优化87.cupcake调试87.1.自动对焦87.2.闪光灯控制107.3.多分辨率拍照118.总结121. 目的在android 1.5和linux2.6.28环境下调试ov5642(5m camera),实现大部分的拍照功能,比如:多分辨率(最高2592*1944)、预览拍照曝光、闪光灯控制和自动对焦等等2. 适用范围3. 参考文档4. 缩写缩写英文全称中文全称5. 名词定义名词定 义6. linux2.6.28内核调试原来的内核驱动是针对ov3640,这个sensor是3.2m camera,通过对比ov5642和ov3640的datasheet,用的都是同样的i2c地址,寄存器读写都是16bit的,所以可以用ov3640的驱动修改成ov5642的驱动,但是ov5642毕竟是5m的camera,camera.c驱动也要做一些修改以便支持最高像素的拍照。6.1. ov5642驱动编写ov5642.c驱动就按照ov3640.c进行修改,把所有3640都体会成5642,需要注意的是ov5642的型号寄存器,做如下修改:/* revision constants */#define pid_verh0x56#define pid_verl 0x42#define pid_adrrh 0x300a#define pid_adrrl 0x300bov5642软件复位寄存器做如下修改:void ov5642hw_reset(void)printk(sensor resetn);write_sensor_reg(0x3008,0x80);printk(reset overn);mdelay(50);return;然后跟ov fae拿ov5642的相关寄存器配置,以及精简寄存器等等,其实这阶段很费时间,具体寄存器配置不介绍。修改完ov5642驱动,还要修改相应目录下的makefile以及修改littleton.c里面把ov3640替换成ov5642,同时屏蔽掉ov3640的代码。之后,应该可以正常preview和拍照了。不过,在最高像素capture时,需要内核camera.c做一些调整,主要是提高camera dma buffer,原来是只有2m,现在需要提高到32m。具体计算结果如下:最高像素:2592x1944yuv 两帧buffer:2592x1944x2 (yuv422需要*2)x2(两帧) n = 2592x1944x2x2/1024/1024,算出来约等于20,所以下面的reserve_dma_buffer需要定义为如下大小,通过下面的代码计算出来g_order=13,对应dma内存为32m通过这些修改,ov5642 最高像素拍照就不会出问题了,可是却导致了视频播放的一个问题出现,由于视频播放需要用到marvell的bmm设备,bmm.ko已经是marvell在cupcake上提供出来的内核模块,默认需要分配8m dma内存,由于500w camera内核加载时已经分配了32m dma buffer,直接导致后面的bmm.ko无法正常分配到8m dma buffer。从qt版本的marvell内核代码中找到bmm模块的源代码(bmm_drv.c,bmm_drv.h),这个编译后就是bmm.ko,我们可以直接把这个模块编译进内核,在内核加载时或者更确切的说是在ov5642初始化前就加载bmm分配好8m buffer,原来直接使用的bmm.ko是在内核完全加载启动完毕后才从cupcake目录加载过来,所以就出问题了。把bmm_drv.c和bmm_drv.h放置在linux内核drivers/misc目录下,修改相应的makefile和kconfig,重新编译内核就可以把bmm模块加入了。在内核root目录下的init.marvell.rc文件,需要屏蔽掉加载cupcake bmm.ko的代码,如下所示:marvell pxa310平台能很好支持300w camera,对于500w camera,有些问题还是预料不到的。完成了上面的所有修改步骤,ov5642拍照最高像素时,能成功拍照,但是每次拍照图片都会有一大条绿色的纹路,ov fae也找不出问题所在,最后需要修改camera.c一个宏定义,问题解决。据marvell技术支持介绍,把single_dma_desc这个定义去掉,可以支持高像素拍照,去掉这个定义后,500w拍照图像正常。6.2. ov5642曝光控制在没做曝光控制之前,采用的是aec自动曝光,拍照图片比preview图像暗,所以最好做一下preview-capture的曝光切换控制。具体思路如下步骤:1. 在preview到capture之间读取preview的曝光增益等参数:ov5642_parameter_record2. 在写完capture setting后设置曝光增益等参数:ov5642_sensor_preview2snap需要注意的是,preview时要打开aec、agc等寄存器配置,capture时要把这些自动配置去掉改成手动配置,具体查看datasheet中的0x3503这个寄存器。相关代码请查阅ov5642.c6.3. ov5642闪光灯控制、自动对焦根据ov5642的datasheet,本以为只要对0x3b00设置就能打开sensor的ctl闪光灯控制脚,结果单单这个配置还不行,还要配置下面的相关寄存器:自动对焦时,在preview阶段写入af firmware的setting,而且只需要加载一次setting就可以了,af firmware 的寄存器有近一万个,加载很耗时。为了实现只一次加载的效果提高速度,在写入preview的setting后还要对af firmware进行复位,代码如下:实现自动对焦的相关代码如下:不过,现在这个af的启动不在内核做,而是在cupcake的libcamera里面,具体下面有介绍。6.4. ov5642拍照速度以及启动速度优化拍照速度:原来的pclk是26m,拍照的fps估计才2点多,要提高pclk才能提高fps。直接提高pclk到26*2m或是更高,拍照时,串口一直输出camera驱动poll failed的错误,很明显这是pxa310无法获取sensor的图像数据。用示波器测试了下ov5642的输出幅度很低,低于正常的marvell pxa310能够识别的1.2v,所以就无法获取到data。注意下ov5642的datasheet:设置这个寄存器,让其工作在4x的output drive,这样当pclk达到52m时,输出幅度能大于1.2v,pxa310也能正常接收到ov5642的数据,拍照速度比原来快了不少,fps大概5帧左右。启动速度:由于ov5642的不断电的,所以一次写入寄存器只要不复位,就不会丢失,居于这个原则,可以优化ov5642的yuv init setting和af firmware的setting调用,做到只要不断电就只加载一次,这样ov5642的预览和摄像头切换速度大大提高。具体修改,请查看ov5642.c7. cupcake调试原来cupcake主要支持的是ov3640(3m camera),现在针对ov5642,主要增加自动对焦、闪光灯控制、多拍照分辨率等等功能。7.1. 自动对焦marvell的libcamera已经做好了这方面的调用命令接口,代码:cam_sendcommand(mcehandle, cam_autocam_af_start, -1, null),这个是用于启动camera的af,libcameracamerahardware.cpp中的调用代码如下所示:这个上层的af调用命令最后会调用到libcameraenginesrcsubcomp_stub.c的subcomp_command函数,case:cam_isp_start_af,现在启动af所有的步骤都放在这边实现,还没做af失败的处理,具体代码如下:其实这是通过上层调用v4l2的ioctl直接控制写入af启动寄存器,其中wcam_vidiocscamreg是写寄存器,wcam_vidiocgcamreg是读寄存器。通过上面的修改,配合内核camera.c ioctl的修改,上层就可以成功控制启动ov5642的af firmware实现自动对焦功能。7.2. 闪光灯控制闪光灯控制是通过对pwm设备(camera_flash /sys/class/backlight/pxa3xx_pwm_flash/brightness)进行读写,实现闪光灯开关亮度调整。对brightness这个文件写入0:关闭闪光灯,写入1023:最大亮度打开闪光灯,可以写入01023之间的任何正数,实现亮度调整。在文件:donuthardwarelibhardware_legacyflashlight.c中进行修改,主要修改pwm设备文件地址其实这样修改完就可以控制了闪光灯开关了。在flashlight.c有个函数:int enable_camera_flash(int milliseconds),从字面意思应该是控制闪光灯亮的时间,现在这个函数只是简单的控制闪光灯开关,后面又接着写了个函数控制闪光灯时间,以便以后有用,具体看flashlight.c。最后,会编译生成libhardware_legacy.so这个动态库,libcamera这边要调用闪光灯需要加入相应的头文件和这个动态库。首先,在libcamera的mdroid.mk中修改一下:然后,在camerahardware.cpp需要调用闪光灯的地方加入enable_camera_flash函数,enable_camera_flash(1023)表示最大亮度打开,enable_camera_flash(0)表示关闭闪光灯。这些只是简单的控制闪光灯,按照设计,ov5642会在拍照的第三帧发送ctl信号给flashlight,然后闪光灯才突然变量。现在由于硬件问题,ov5642发送ctl信号的瞬间,闪光灯亮度变化微弱,这个后期硬件配合修改。7.3. 多分辨率拍照原来在cupcake上面,libcamera做的多分辨率拍照只有320*240和最大分辨率,现在需要修改libcamera以便上层应用能实现更多的ov5642内核驱动支持的多分辨率拍照。cupcake应该支持如下分辨率的capture,对于其他任意的分辨率会自适应调整:#define ov5642_size_qvga 1 /320x240#define ov5642_size_vga 2 /640x480#define ov5642_size_sxga 6 /1280x1024#define ov5642_size_uxga 7 /1600x1200#define ov5642_size_qxga 8 /2048x1536#define ov5642_size_qsxga 9 /2592x1944qvga是用于camera preview的,其他都是capture的分辨率。首先,在donutvendormarvelllittletonlibcameraenginesrcsensor_stub.c中修改添加libcamera支持的分辨率,如下所示:然后,在camerahardware.cpp的camerahardware:cestartcapture()函数添加下面的分辨率自适应处理,默认是最高分辨率(2592x1944)的拍照。通过cam_autocam_set_capture_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论