linux 下camera调试笔记【转】
转自:https://blog.csdn.net/kevinx_xu/article/details/8801931
作者:刘旭晖 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调试笔记【转】的更多相关文章
- Linux知识(5)----LINUX下GDB调试
命令 解释 示例 file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r c Run的简 ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- Linux下iptables学习笔记
Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...
- Linux下为知笔记和蚂蚁笔记测评,推荐蚂蚁笔记!(非广告)
本人由于学习Linux,需要一款可以在Linux平台下可以运行的一款软件,了解到为知笔记之笔记(下文以W代替)和蚂蚁笔记(下文以M代替)比较出名,由于某云和某象笔记在linux平台下没有对应的软件,所 ...
- HDP2.0.6+hadoop2.2.0+eclipse(windows和linux下)调试环境搭建
花了好几天,搭建好windows和linux下连接HDP集群的调试环境,在此记录一下 hadoop2.2.0的版本比hadoop0.x和hadoop1.x结构变化很大,没有eclipse-hadoop ...
- linux下线程调试 ulimit core
在linux 下写线程程序的同学预计都遇到过找bug找到崩溃的情况.多线程情况下bug的追踪实在是不easy. 如今我来介绍一个好用的方法 ulimit core. 先简介一下ulimit是个什么(你 ...
- linux下dubbo调试 ---telnet命令
linux下启动dubbo服务端, 怎么调试? 方法有二: 1. 自己写简单消费者功能,进行各种情况测试.(这确实是有必要的) 2. 使用telnet直接连接上dubbo,使用命令调用,然后调试.(这 ...
- Linux 下如何调试 Python?
一般开发者都是在 IDE 中进行程序的调试,当然,有 IDE 的话,当然首选 IDE 进行调试. 但是,有时我们的业务场景,限制只能在 Linux 命令行模式进行调试. 这时该怎么办呢? 今天,就给大 ...
- 嵌入式Linux下Camera编程--V4L2【转】
转自:http://blog.csdn.net/fwqlzz/article/details/51126653 版权声明:本文为博主原创文章,未经博主允许不得转载. USB video class(又 ...
随机推荐
- 自学Aruba6.1-基本网络参数配置(web页面配置)
点击返回:自学Aruba之路 自学Aruba6.1-基本网络参数配置(web页面配置) 1 配置VLAN 1.1 新建VLAN Configuration---VLANs中,VLANID选项卡下的A ...
- 51nod 1061 最复杂的数V2
题目链接 51nod 1061 题面简述 求\([1, n]\)中约数个数最多的数. \(n \le 10^{200}\) 题解 首先,答案一定是一个反素数. 什么是反素数? 一个正整数\(x\)是反 ...
- shell(3)-mysql主从监控shell
需要先明白数据库主从同步正常的标准是来查看两个线程Slave_IO和Slave_SQL两个线程的工作状态: #!/bin/bash #Check MySQL Slave's Runnning Stat ...
- 监控(2)-php-fpm进程监控 shell
#!/bin/bash #监控的网页地址url="http://dev2.jwsmed.com" #fastcgi启动/重启/停止脚本路径PROG=/data/fistsoft/p ...
- /dev/null与/dev/zero区别
/dev/null和/dev/zero的区别 /dev/null,外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着! /dev/zero,是一个输入设备,你可你用它来初始化文件.该设备无穷尽 ...
- 爬虫json数据的处理
在爬网页的过程中,最喜欢遇到的就是json数据接口,省了不少麻烦,但是json数据也有多种格式. 类型一:标准的json result = json.loads(html.text),将str转成py ...
- N皇后问题(DFS)
题目:在N*N的国际象棋棋盘上放置N个皇后彼此不受攻击(即在棋盘的任一行,任一列和任意对角线上不能放置2个皇后),求解所有摆放方案的总数. 样例输入: 1 8 样例输出: 1 92 解题思路:由于皇后 ...
- SQLite 学习笔记(一)
(1)创建数据库 在命令行中切换到sqlite.exe所在的文件夹 在命令中键入sqlite3 test.db;即可创建了一个名为test.db的数据库 由于此时的数据库中没有任何表及 ...
- CF294C Shaass and Lights
题目大意: 有n盏灯,(0<=n<=1000),有m盏已经点亮,每次只能点亮与已经点亮的灯相邻的灯,求总方案数,答案对1e9+7取模 第一行:两个整数n,m表示灯的总数和已点亮的灯的数目 ...
- jsp关闭或刷新浏览器(解决浏览器不兼容),请求后台onbeforeunload、onunload
jsp关闭或刷新浏览器(解决浏览器不兼容),请求后台 onbeforeunload.onunload 1.看代码: function test(e) { var json = "退出,清理 ...