转自:https://blog.csdn.net/kevinx_xu/article/details/8801931

linux camera调试

2011-10-23 10:43:37|  分类: linux技术类|字号 订阅

作者:刘旭晖 Raymond转载请注明出处

Email:colorant@163.com

BLOG:http://blog.csdn.net/colorant/

主页:http://sites.google.com/site/rgbbones/

)
在嵌入式系统,如手机等平台上使用的Camera sensor通常是由类似I2C这样的总线进行寄存器控制,由CPU端的Controller提供所需的驱动时序,通常支持YUV和RGB等数据格式。有的Sensor需要由CPU进行图像处理工作,有的Sensor自己会集成图像处理芯片,完成一些基础的图像处理工作,还有些高像素的Sensor甚至自己完成JPEG的编码工作。因为硬件的多样性,我所遇到的问题可能和你的原因现象都不尽相同,分析内容仅供参考。
Sensor端I2C总线没有响应
症状

所有输入电压和时钟信号都正常,往I2C总线上写入读取寄存器数据的命令后,sensor没有响应,没有数据从I2C总线上输出。

分析

因为测量发现一切输出信号都正常,所以往往都会怀疑Sensor硬件存在问题,不过99%的情况,实际的原因总是因为I2C总线的ID值没有设置对,导致设备不响应命令。据我的观察,每次一个新的工程师在调试Sensor的时候几乎都会遇上这个问题。
 
    之所以这么容易设置错误的原因,是因为通常Camera Sensor的Spec上所写的I2C ID号,还包含了最后一位读写方向位。而这一位在I2C总线的定义中,严格来说,不属于ID的一部分,所以Linux I2C的驱动API中的调用参数里的ID号,通常是不考虑这一位的,读写方向位会在具体的读写操作中,在寄存器中进行设置。
 
解决
 
    例如Spec上会写 读写寄存器操作 I2C ID 分别为 0x64和0x65,实际调用API时应该使用0x32作为该设备的I2C ID
图像中有不断变化的细密的水平条纹
症状
    
    与荧光灯的频闪造成的大面积的滚动水平条纹不同,表现出来的是一个像素高的水平条纹状躁点,位置不固定,数量比较多,而且随光线强弱有一定的变化
 
分析
    
    因为设置某些sensor寄存器的时候,会影响到这些水平条纹的颜色,所以基本上排除是在数据传输过程中板子对数据造成的干扰,也排除接触不良的可能性,应该是数据在sensor内部已经存在这些水平条纹。
    此外相同的初始化序列,相同的sensor,在厂商的demo版上也没有发生这种情况,所以也基本排除软件的问题。
    最后,发现原先为了节省硬件成本,将sensor的两个电压相同的模拟电和数字电由同一芯片输出供给,导致两者之间互相干扰,影响了sensor的正常工作
 
解决
 
    将模拟电和数字电分离单独供电
 
图像上有固定的锯齿状垂直条纹
症状
    
    图像上有明显的垂直条纹,全屏分布,非常细密,好像百叶窗一样。
 
分析
    
    仔细看可以发觉该垂直条纹实际上是由于图像上相邻的两两像素互相错位造成的锯齿状条纹
 
    仔细分析spec可以看到,由于sensor是按字节送出图像数据,在RGB565模式下,两个字节表示一个像素。而在我所使用的CPU的Camera控制器中,数据是按4个字节也就是一个字为单位处理的,由于CPU这端是按LSB方式处理数据的,所以在一个字内部,未经调整的话,两个像素的顺序是颠倒过来的。也就是最终由DMA将数据送到内存的连续buffer中时,像素的顺序是:像素2,像素1,像素4,像素3。。。
 
解决
 
    用程序调整像素顺序,为了减少附加计算对CPU的负担,可以将这一步操作合并在其它类似颜色转换或PACK模式转Planer模式等操作中。
 
大尺寸时容易出现图像错位
症状
    
    当sensor工作在最大分辨率的情况下时,图像容易出现上下错位的现象。
 
分析
    
    跟踪程序可以看到这时候CPU的Camera控制器的FIFO缓存发生了溢出现象,也就是说DMA来不及将FIFO中的数据传送到内存中,该例中sensor在最大分辨率的情况下,输出数据的时钟工作在24MHZ,理论上说,DMA应该是来得急传送数据的,但是可能因为内存带宽还会被其它设备如CPU占用,导致来不及写入内存,使得DMA没有最大负荷的工作,所以来不及将FIFO中的数据读出,导致部分数据丢失,图像错位。
 
解决
 
    某些情况下,改变DMA传输的启动阙值可以解决该问题,但是有些情况是无效的
 
    考虑到最高分辨率仅在拍照的时候使用,预览的时候并不使用该分辨率,所以,在不影响预览桢数的情况下,可以在拍照的一瞬间改变分辨率的同时,修改sensor的时钟频率,降低到一个不会导致FIFO溢出的频率
 
    另外,在截获最高分辨率的图像的同时,尽量不执行其它的内存相关操作。截获完图像马上切换回预览用的分辨率。通过这些办法,减少发生FIFO溢出的可能性。
 
读取到的数据显示出来的时候是花屏
症状
    
    读取到的数据显示出来的时候是花屏,但是明显是随着所拍摄的对象的变化而变化的。
 
分析
    
    具体来说,常见的情况包括:
    显示的数据是完全的花屏,或者可以看出物体大致轮廓,但颜色完全不对,例如一片绿色。这种情况往往是因为图像数据格式不匹配,例如没有处理YUV2RGB,YUV的各个分量采样顺序与软件计算的取值顺序不匹配等。
 
    如果花屏的具体表现是图像不断变换,没有规律,通常有可能是数据接收的触发边沿有误,导致没有正确的接收数据。
    
    另外有一次,花屏的时候,仔细观察花屏的图案,发现有部分错位重复的图案的迹象。因此分析可能是Sensor的物理layout,其长宽比例与LCD刚好相反,仔细查看Spec得到确认。
 
解决
 
    具体情况具体处理了。

linux 下camera调试笔记【转】相关推荐

  1. linux下SVN配置笔记(转)

    linux下SVN配置笔记  李群林 转载了 皋军 的博文  [查看原文][转载时间:2012-09-20 10:40] 关键字: linux下svn配置笔记  一.安装SVN默认安装到/usr/lo ...

  2. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

  3. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  4. Linux下串口调试及使用shell编程接收数据

    串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联 ...

  5. UART和RS232/RS485的关系是什么?RS485在linux下的调试 ubuntu串口调试工具

    串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式.但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句 ...

  6. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  7. C++(Qt)软件调试---linux下生成/调试Core文件(3)

    #软件调试 C++(Qt)软件调试-linux下生成/调试Core文件(3) 文章目录 C++(Qt)软件调试---linux下生成/调试Core文件(3) 前言 1.C++生成Core和使用GDB调 ...

  8. Linux下gdb调试用法

    稍微小小介绍一下 gdb是GUN组织开发的Linux下的调试利器.一般用于调试C/C++程序. GDB主要有以下4个功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序. 2.可让被调 ...

  9. LINUX下GDB调试

    LINUX下GDB调试 (gdb) p result[2]=33 $5 = 33 (gdb) p printf("result[2]=%d\n", result[2]) resul ...

最新文章

  1. PCL基础3:点云程序运行时间计时
  2. JVM 老年代对象来源
  3. AD-NeRF:用于说话人头部合成的音频驱动神经辐射场
  4. 姚文详(Joseph Yiu):《ARM Cortex-M0权威指南》中文版目录
  5. SAP Spartacus cxPageTemplateStyle Directive的作用
  6. 征信一个月查40次,还能贷款吗?
  7. 机器学习算法总结之支持向量机(四)
  8. C#中的@符号的使用
  9. [转]解决xampp无法启动apache的问题
  10. linux指令ls -1,linux命令1--ls
  11. python如何表示未知数_用Python如何解数学方程
  12. 中国超级计算机扩大领先优势:TOP500总量首次超越美国
  13. 完整版通达OA2015-2017版本1day漏洞利用
  14. Android连接MySQL数据库
  15. 权游谁将领盒饭?AI告诉你
  16. kernel logo 生成方法
  17. 什么样的人适合当程序员?挺有意思的一篇文章
  18. python 实现轨迹数据可视化
  19. 无法识别的usb跟这台计算机,【实战成功】无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
  20. C 语言到底能做什么?What can C do?

热门文章

  1. Function类型
  2. Android Activity的生命周期
  3. ORACLE联机日志文件丢失或损坏的处理方法(转)
  4. javax/management/DynamicMBean
  5. php 提交的数据覆盖,如何高效的做数据覆盖操作
  6. python3.6爬虫环境安装要多少内存_Python3爬虫环境配置——解析库安装(附tesserocr安装方法)...
  7. .net安装_无需安装Python,就可以在.NET里调用Python库
  8. NB-Iot烟感01:烟感探测器原理和规格
  9. 学单片机之前要学什么?C语言和单片机有什么关系?
  10. 用C语言实现 静态通讯录+动态通讯录+文件实现“退出保存信息版本”(附上思路+项目展示+源代码)