|||
MT9M111摄像头驱动早就完成了,一直没时间做文字总结,时间长了真会忘记。
*****************************************
1. 主要的资料来源于网络,包括Datasheet和寄存器配置例程。
寄存器配置例程有4份:
guangwu的STM32开源例程,这是一串直接写寄存器,似乎就是直接I2C读出的寄存器值。硬件平台不同,测试了一下,不工作,也不好修改,丢弃。
pudn上下载的两个文件MISOC1310_BA.INI, MT9M111-REV4.INI,这不是C语言程序,似乎是Micron Demo板上的配置数据,但对寄存器的说明对Datasheet有补充作用,可作参考。
Koders上Motorola A1200 project中mt9m111的例程,本来对它希望比较大,参考得也较多,但有严重问题,有些地方反而被它拖累。
Linux中关于mt9m111的driver,打酱油的,只是给出一个上层的框架,底层实现找不到。
Datasheet几个版本大同小异,都有错误和未开放的地方,这是样子货,FAE建议不看实际又不得不看的东西。
2. 工作步骤
先用一个init()直接写全部初始化寄存器,不工作。逐个对照Datasheet寄存器定义表,修改值,调整与硬件接口timing相关定义,有图像出来,但很勉强:不能进入Context-A预览模式,图像质量一塌糊涂!不过总算调妥了最底层的信号接口。
放弃一堆写寄存器的方式,改成分组功能函数的形式,把明显成组的寄存器,如gamma, color correction,lens shading correction分离出来,重写一个初始化架构。倒退几步后再前进,感觉好多了,不过图像还是一塌糊涂,明细是过度曝光,颜色也不正确。
寄存器基本分成两类,一类是参数表,一类是控制相关的,参数表只能Copy别人的,控制寄存器则尝试修改调整,慢慢的对AE、AWB有了概念,问题应该在这里,但是就找不到!无聊之下把各种参数表调来调去,调到最不起眼的gamma表时,突然发现可行了,虽然图像质量还一般,但颜色和亮度的失真没有了! copy来的gamma表有问题。
后续就顺利多了,彻底归类寄存器,分割到各功能函数,各控制寄存器对照资料,能试的都试一下,模式中图像质量一点点提高,没多大变化了,再重新写一个初始化框架。
图像都只是在2.8寸LCD上显示,高质量就看不出来了,只能是RGB565,切换到YUV格式,连接usb video class程序,以USB摄像头的形式接入PC,虽然是320x240,但感觉好极了!比起ov7670,本质上的提高! LCD这时只能显示黑白图,不过可以丢开了。
在PC上的图像就可以关注细节,调整preview, capture不同的模式,不同的分辨率,由发现一些尴尬的细节问题,Preview模式windows size的设置等,运气好起来,一一解决,有些是资料中无人提及的。再挖掘一些边缘功能,LED_Flash, style setup等,没惊喜。
继续上去,增加一些上层函数,设置饱和度、亮度,关闭AE,切换模式等,这些是应用级的,能做就做一些,基本的平台验证这些已经不大够用了,基本完成啦。
再次实验,发现:
a. 帧率可用0x237寄存器调整,但对图像质量有影响。640x480 preview模式,最慢5fps时,周期约150ms, 图像明亮; 最快15fps时,周期48.5ms,图像暗淡,有噪音。
b. YUV调试比RGB565调试好,有些时候YUV下图像不错,RGB在LCD上显示明显有颜色错误; LCD下不行的 几个Gamma表,JPEG转出到UVC显示,又没有错误。
3. 主要经验总结
做这个接口,完全推翻了固有已久的数字视频源概念,什么HSYN/VSYN, 行频场频, BT.656,过时了! CMOS Camera Sensor,就要把它看成一大堆感光Sensor堆在一起的块块,感光,处理,读出,都要干预,不能把它简单看作一个图像源。
其中的核心是曝光和白平衡,AE & AWB,直接影响图像质量。输出的Line_Valid/_Valid时间虽然还按Pixel timing,但帧率主要是曝光时间控制。控制Sensor要一大堆系数、参数,没有标准值,有些厂家资料又故意隐瞒,只能靠google。 一大堆寄存器,很多是互相关联的,要联动式修改。datasheet给出的default值未必正确,上电也未必是default值,有些寄存器写入未必成功,或者成功了又未必按意图工作,要看人品!
设置了寄存器,工作还得看场景,MT9M111分成preview(viewfinder)/capture(snapshot)两种工作方式,不同的context配置,两者都要搞定,大大增加难度,不过这也是百万以上象素Sensor的趋势,大都如此,无奈。
但成功后的图像质量,还是令人惊喜的,比起ov7670,天壤之别! 130万就是比30万强,即使同时缩小到320x240分辨率。另外也引发新的思考:ov7670放弃一次成堆写入全部寄存器的方式,按功能分项控制,仔细调整AE & AWB,图像质量能不能提高?
4. 剩余问题和待提升空间
硬件相关:现在的主时钟输入为20M,调整主频,还要调整多少?
镜头,都用4mm简易镜头,换镜头要怎么调?
帧率低,曝光时间长,能否加快? 和照明如果联系起来调?
应用级,调整亮度、对比度等参数;
应用中如果避免帧率变化的影响?
与usb video class接口升级,直接capture单帧1280x1024图像到PC,进行细节分析。有些问题要在高分辨率下才有可能发现。
将Camera Sensor、接口逻辑、SDRAM分离出来,以一个简单的fsmc接口提供给STM32,做成独立模块,命名为fsmc-Camera。这样在以后一段时间内不必花太多心思在图像源上,玩图像而不是玩摄像头!