tag 标签: 控制逻辑

相关博文
  • 热度 28
    2011-6-20 08:19
    5639 次阅读|
    18 个评论
        最近有两个项目都挺着急的,尤其是LINUX下OMAP3530接MT9P031的摄像头驱动弄了很长时间。本来是让新来的兄弟负责驱动来着,无奈兄弟没有接触过硬件,也没有linux下视频驱动开发的经验,捣鼓了一个多月还没理清驱动注册的流程,而且也没有什么思绪--的确,这个对一个刚毕业的学生来说的确难度比较大……想着这个项目对今年的计划非常重要,而项目还没赢利,我每月还要拿那么多银子,心里就待不住了。只有硬赶鸭子上树了,不管怎么着,今年的几个项目必须得做出来。上个月设计完一个新板子就马上转移精力到这个驱动开发上了。     开始看到一堆堆代码,一层层的看着就头大的不行。后来在网上查了些驱动架构的资料,又找了些SENSOR的驱动还有一些杂七杂八的材料就泡了起来。到现在现学驱动架构的话时间上来不急了,于是先找了一些OMAP3530相关的摄像头驱动,模拟的、数字的,各个LINUX内核版本下的驱动找了好几个。然后就是总结这些驱动的异同,这些异同一出来,相同的部分参考移植,不同的部分参考修改……只要这些异同不会整理错,直觉告诉我——能成……     计划实施的还算比较顺利,经过一周多时间这些异同都圈出来了,于是开始组装调试自己的驱动。驱动的调试还是挺麻烦的,以前用仿真器习惯了,现在调LINUX下的驱动,真是有力使不出啊。有时候一个小小的疏忽导致LINUX内核都跑不起来,串口什么打印信息也没有,只能使出硬件调试的野路子——在内核编译结果中查打印信息所在的内存地址,连上仿真器,直接去内存里面抓ASC码,抓寄存器……呵呵,相信很多做过N年LINUX开发的都没有见过这么干的……没有办法,虽然土,但也还有效果。     设备注册上了……     I2C检测到了MT9P031传感器型号(起初两块样板都有焊接问题,无法进行I2C通讯)……     OMAP3530 ISP输出时钟有了……     MT9P031设置通过了……     MT9P031锁相环配置通过了,所有输出与预期一致……     感觉每天都会有进展,心里总会不停的激动,似乎总能感觉到自己渴望的东西离自己越来越近,似乎就要能听到它的呼吸。     上周末的时候截取到了疑似图像帧,当前景亮度明显变化的时候可以看到帧内数据有规律的变化。于是断定,它不远了……     这周自己写了一个把MT9P031的BAYER格式图像数据转存bmp文件的应用程序,还写了一个将BAYER格式图像直接显示到电视机的程序。结果前两天都出一些奇怪的图。后来跟老师讨论这个奇怪现象的时候,老师发现了我应用程序里的一个移位的语法错误,修改后bmp文件赫然出现了清晰的图像……这就像不再是听它呼吸,而是看到了它清秀可人的面庞!虽然表面淡定,可心里还是那啥……     不过,还有一个问题,也是最后一个关键问题。当时虽然得到了图像,但LINUX并无法得知有可用帧准备好。当时获取图像是以非阻塞模式打开的摄像头,所以是硬把帧缓冲地址取出来做的处理。LINUX无法得知可用帧,怀疑要么没进帧中断,要么帧中断有问题而没有对帧缓冲作操作处理。     周五下午在茫茫码海里找到了那个帧中断,在里面加上了打印信息,从串口打印信息里可以推断,帧中断的确发生了,而且发生频率和自己配置的帧率一致。范围进一步缩小了,肯定是中断里没有通知操作系统……周五晚上有约,就没有进一步确认问题,但能肯定问题发生在什么地方了。     周六没什么事,心里放不下那么问题,就去加了下班。对比了一些其他版本内核的帧中断处理和我用的内核版本程序,发现我使用的代码里帧中断只处理了PAL或NTSC间行扫描类型的奇场,而一判断是逐行扫描的类型就直接退出了。不知道是这个版本本身就有的问题,还是给我们提供代码的开发板商修改过……于是在其中加入了逐行扫描的处理。     然后从串口打印信息里面可以推断出LINUX已经识别到了可用帧。最后一块石头终于落地了,所有能算得上困难的问题都解决了……心里一个舒畅,给同学打电话想聚众三国杀来着,居然不够人……哎,回家又是无聊,就在实验室里继续修改那个把视频显示到电视上的程序,不长时间就修改好了,在电视里可以实时的看到采集的视频图像。     所有的主要问题都搞定了,悲剧的是居然找不到人一起吃饭,只能晚上一个人去吃小火锅。     另外,这个过程中我还负责着另一个产品的样机生产和传感器控制逻辑编写,这周控制逻辑也写完了。     总的来看,这周相当给力!有我欠着人家饭的兄弟姐妹,以及觉得我该请吃饭的街坊邻居,下周抓紧联系啊……
相关资源