Micron sensor 驱动与调试小结

时间:2021-07-18 09:19:43


目录:

前言

驱动篇:
1、 Micron sensor ISP的原理图
2、 sensor 的原理框架
3、Sensor 的初始化步骤
4、Preview时候的sensor设置
5、Capture时候的sensor设置
6、工频干扰的调试
7、亮度以及夜景模式

调试篇:
1、 清晰度的测试
2、 灰阶重现
3、 画面的均匀性以及暗脚补偿
4、 畸变
5、 白平衡的调试

前言
Micron sensor 是我们公司所用最多的图像传感器,也是目前市场上评价很高的主流sensor产品。写这篇文章的目的在于让后继调试sensor者对sensor的调试有初步的思路和对micron sensor的一些特性有一定的了解,希望以后的调试工作能够少走一些弯路。具体的sensor的工作原理和更深入的图像工程方面的知识,可以参看各个sensor的datasheet和上网查找一些关于camera的测试资料。

驱动篇:
Micron sensor ISP的原理图:
Micron sensor 驱动与调试小结
下图是sensor的功能框架构图:
Micron sensor 驱动与调试小结

         Sensor Core register是实际上控制sensor的register.是直接控制sensor的寄存器(对应的是sensor 寄存器的page 0)。
         Image Flow Processor 里的register主要是一些控制sensor的算法的寄存器。其中color Pipeline主要是对输出数据和信号的一些控制。比如 Base configuration, lens shading, resize, output format(page 1)
        Camera control集中了对sensor core的控制算法,控制sensor core的工作都是在这个寄存器组中完成。(page 2)比如AE, AWB, Flicker, Camera control sequencer。

Sensor 的初始化步骤:

一般sensor的初始化通常包含以下几个步骤:
1、 sensor的上电。Micron sensor的电源分为数字电源,模拟电源和IO电压。这三个电源并没有严格的先后上电顺序,可以在代码中同时打开。
2、 对sensor输出MCLK,配置对PCLK采样输出频率,这是能否正常接收sensor数据的关键。
3、 配置V,H同步信号的输出极性,如果极性配置不对,将造成图象不能正常采集,自然显示混乱。
4、 硬件的reset。 Micron sensor的reset为低reset,并且至少持续1US,
5、 软件的reset。既然为软件的reset,那就必须要求BB或者多媒体MAP能够对sensor进行写寄存器。也就是要保证IIC能够正常地写数据进入sensor ISP,这点是保证软件能够进行调试的基础。软件reset通常根据sensor的不同会有所变化,如mt9d111内带一个MCU,所以在reset的时候要对MCU同时进行reset。而mt9m11就没有带MCU。注意硬件reset后要保留一些时间才能使用IIC总线。通常在10个US以上。
6、 Micron sensor mtd9111 系列的带ISP的2M sensor在ISP中默认了一组寄存器,能够在reset后不用IIC写任何寄存器就能输出图象,这个时候sensor的input clock是output clock的两倍,前期可以用这个方法来验证硬件和软件供电,复位等是否正确,当后端接受的图象engine只能用mclk来同步工作时候,必须要正确配置接收的采样频率,否
则不能得出正确的图象。
Micron sensor 驱动与调试小结
上图就是采样频率不匹配的现象。请注意与YUV,RGB顺序配置错误的现象有什么区别。下图是顺序倒置:
Micron sensor 驱动与调试小结 

7、 写入micron 工程师给的初始化寄存器,并配置输出频率和输出图象的分辨率。
8、 读取sensor的版本号,如果与我们所用产品的version一致,就代表初始化工作正确完成。
初始化sensor的道理很简单,而且如果平台比较成熟,有可能一次性就能正确的初始化,也有可能会花很多时间去查问题,特别是如果你遇到了iic写给sensor的时候出现不稳定的现象或者sensor接收到iic命令和数据,却不按正常地输出,那就比较麻烦了,不过2m sensor的ISP既然已经带了MCU,不妨把它当成一个应用处理器去维护,在写某些改变sensor内部工作状态的寄存器时要注意延时。有些时候对一个寄存器可以多次写入保证其能正常地工作,这是一个还没有想出原因的经验。按照以上的流程检查应该能够准确定位80%以上的问题。

IIC 总线协议
        I2C串行总线有两根信号线:一根双向的数据线SDA;另一根是时钟线SCL。所有接到I2C总线上的设备的串行数据都接到总线的SDA线,各设备的时钟线SCL接到总线的SCL。在Vienna平台上, I2C连了两个器件,分别是sensor和audio codec,,主控设备(MAP)发送不同的器件ID与两个设备进行数据传输。
        在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件,当SCL保持“高”,SDA由“高”变为“低”时为开始条件;SCL保持“高”,SDA由“低”变为“高”是为停止条件。开始和停止条件由主控器产生。使用硬件接口可以很容易地检测开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样以使检测这种变化。
        下图对就是IIC的一次写操作,具体的IIC协议很容易在网站上可以找到,micron 的datasheet也能找到一些介绍。
Micron sensor 驱动与调试小结 

Preview时候的sensor设置:

        在preview的时候为了得到更高的帧率,通常采用低分辨率的输出,也就是长宽都只有最高分辨率的一半,本来能够设置更小的分辨率输出,这个时候sensor的输出是间隔输出,并不是对象素采样后的均匀输出。但是由于多媒体芯片corelogic的无法接收不规则的pclk的原因,只有作罢。而有些平台的camera interface就不存在这个问题。从而能直接输出屏幕大小的图象,减少后端处理的繁琐和节约为preview所开的buffer大小。

Capture时候的sensor设置:

        Capture为了获得更大的分辨率和更好的图象质量,所以必须采用高分辨率的输出,那么在切换到capture的时候就需要对sensor进行一组寄存器设置,micron sensor 为用户提供了两个相对独立的context,能够存两个寄存器组,默认的设置是将preview用context A, capture 用context B, context A通常是low power mode,而context B用的是full power mode ,由于corelogic只能用mclk去同步采样,这样它便只能接受规则的pclk,不然采样就会有问题,那么这样就要求context A与context B的都为full power mode,这样就能保证无论preview还是capture,sensor都能以已固定的频率的输出pclk,后端MAP就能正常地接收图象信息,不至于出现花屏和颜色不对。由于这样的解决办法并不是micron 推荐的方案,而是自己想出的弥补方法。所以Vienna平台上至少一半以上的问题都是由corelogic的这个缺陷,以及为了弥补这个缺陷所修改的sensor输出引起的,以后如果要换多媒体应用处理器,请考虑到MAP是否支持接受不规则的pclk。目前Vienna 和高通平台都不支持变化的PCLK,而Vision平台是支持的。
Micron sensor 驱动与调试小结
lower power 模式下的输出
Micron sensor 驱动与调试小结 
full power 模式下的输出
证明corelogic不能接受lower power mode的sensor输出。

        由于输出的时钟频率preview与capture固定,CMOS sensor暴光原理是行暴光,暴光时间等于行暴光时间,line time=hsync time +hblank time。130万象素的的sensor为例,preview的时候输出VGA,hsync time=640*k, K为shutter width(快门时间)。而capture的时候hsync time=1280*k, 在k不变的情况下,hsync time发生了巨大的变化,这样暴光时间也发生了巨大的变化,现象是拍照的时候的图片明显过曝。不过micron 给出了一个可以改变shutter width的寄存器,通过改变这个寄存器能够调整综合暴光时间,这样就能解决这个问题,在老化测试的时候经常出现暴光不对,就是因为这个寄存器没写入或写入后sensor没有反映造成的,由于preview->capture->preview中间的转化值都是用软件来实时计算出来的,所以无论是iic读或者写,还是环境亮度引起sensor亮度计算错误,都会影响到暴光,维护这段代码的时候要特别小心。如果遇到拍照的时候与preview的图像质量差别很大,请从这段代码开始查。


// sensor在进行模式切换
IIC_Write16bit(0xf0, 0x0001);
IIC_Write16bit(0xC6, 0xA104);
//判断模式切换是否成功
dataTemp=IIC_Read16bit(0xc8);
if(g_nightmode)
{
waittime=1000;
}
else
{
waittime=50;
}
//判断模式切换是否成功,请注意这个不一定会成功。
while (dataTemp != 7)
{
dataTemp = IIC_Read16bit(0xC8);
WaitTime_ms(1);
i++;
if(i>waittime)
{
AMOIT(" the sensor change mega mode fail!-----\n");
break;
}
}
AMOIT1("------i=%d-----\n",i);
//以下这段就是在进行暴光控制
IIC_Write16bit(0xf0, 0x0000);
dataTemp = IIC_Read16bit(0x09);
gCurbrightness1 = dataTemp;
IIC_Read16bit(0x09);
WaitTime_ms(10);
IIC_Write16bit(0x09, dataTemp*2/7);
IIC_Write16bit(0xf0, 0x0001);
IIC_Write16bit(0xc6, 0x2225);
dataTemp = IIC_Read16bit (0xc8);
gCurbrightness2 = dataTemp;
WaitTime_ms(10);
IIC_Write16bit(0xf0, 0x0000);
IIC_Write16bit(0x65, 0xB000); // CLOCK_ENABLING
IIC_Write16bit(0x65, 0xE000); // CLOCK_ENABLING
WaitTime_ms(600); // Wait 1 frame time
Micron sensor 驱动与调试小结
preview的时候输出的图象。
Micron sensor 驱动与调试小结
capture 下来的图象,可以看见明显的过暴现象。

        根据经验并非模式切换失败就一定不能正常输出百万象素,而不能正常输出多半就是模式切换失败。模式切换的时间与成功率与帧率有一定的关系,一般说来,帧率越快,时间越短,成功率越高。再从capture->preview的时候也必须设置暴光值,以保证图像不会突然变暗,如果发现拍照越来越暗,多半就是返回preview的时候设置失败。
        注意:模式切换的时候,用示波器可以看到sensor在做切换的时候会出现突然拉低VSNYC信号,形成一个较长的消隐(blank)信号,然后输出另外一个MODE的下的信号,有时候不稳定的现象就是这个blank信号过长,特别是发生在低帧率的情况下,会使后端ISP或者DSP无法采集到数据,没有办法产生拍照的中断,造成task被挂起(进入 idle task)或者死机重启(被狗咬)的现象,具体原因和对策可以根据不同平台的实现方法去分析解决。
       到了这里sensor的两个基本状态的调试就算基本完成了,后期就是对这段代码的维护工作。

工频干扰:

        如果手机出现以如下图的这种水波纹就是工频干扰。工频干扰是由于室内日光灯闪烁造成的。CMOS与CCD 两种不同的工艺制造出来的sensor工频干扰现象是不一样的,这是由暴光的方式不同造成的。
        CMOS是行暴光,也就是在每行暴光时间决定了画面的亮度,举例:一个50HZ的光源,电压曲线为正弦曲线,那能量曲线定性分析可以认为是取了绝对值的电压曲线。那就是能量做1/100秒的周期变化。那就要求暴光的时间必须是1/100秒的整数倍。如果没有把暴光时间调整到1/100秒的整数倍,就有可能会有每行的暴光值不一样,造成同一个image上有水波纹现象。CCD是整帧同时暴光,所以,工频干扰表现的就是图像有轻微的闪烁。产生的原理与CMOS sensor的原理相似。
        如果有发现这样的问题,可先计算出暴光时间,再在这个基础上进行微调。相信很快就能调到没有工频干扰。
Micron 有个寄存器能够调整暴光,以达到消除工频干扰的目的。
算法:line time *0x58(page 2)/PCLK=N/100(用这个公式算出来的值还要进行微调试,reg 0x58是mt9m111的寄存器,不同的sensor是不一样的,但一定能找到一个类似的寄存器,N是自然数,datasheet里面没有介绍,呵呵,不过如果你了解cmos的暴光原理,相信很容易明白的)。

亮度以及夜景模式:

       相信现在大家都知道图象的亮度与暴光时间相关,所以为了让暗处的图片能够清晰地显示必须增加sensor对暗处图象的暴光时间,也就是line time会设置得比普通模式的时候要大许多,这样能使CMOS sensor拥有更多的暴光时间,从而提高亮度。
Micron sensor 驱动与调试小结
         上图为没有采用夜景模式的照片,下图为使用夜景模式的照片
Micron sensor 驱动与调试小结
        我们有两种方法来控制图像亮度,一种是使用AE target,一种是加大灰度增益。我们使用的是AE target方式,这样的图片色彩更逼真。用这种办法会影响到frame rate,当帧率达到我们限制的极限的时候,就要用增加模拟增益来做了,这样会同时放大图像噪声。一般不用增加数字放大增益来调整图像亮度。

调试篇

        与一般IC的驱动不同,sensor除了要工作起来和稳定性之外,还需要调试图象质量。在这点上,所有的sensor都要经过相同的评估测试,调试。通常camera的调试会有下面主要几个方面:

清晰度的测试

使用ISO12233标板测试
Micron sensor 驱动与调试小结
中心垂直分辨率
Micron sensor 驱动与调试小结 

中心水平分辨率
Micron sensor 驱动与调试小结
        
        主要看肉眼刚好能够分清线条时候的刻度值。
        清晰度主要由sensor制作工艺水平和镜头参数决定,但可以通过调试锐度(sharp)来增强清晰度。
        副作用是较高的锐度对图像的平滑性有影响,会使物体边缘特别明显,甚至出现锯齿现象。

灰阶重现测试


Micron sensor 驱动与调试小结
Micron sensor 驱动与调试小结 
        一般sensor都会有一组寄存器用来调整gamma曲线,也就是我们所说的gamma table,由于本人水平有限,这个调试一般由micron 的工程师完成。
Micron sensor 驱动与调试小结
gamma 曲线图

画面的均匀性以及暗脚补偿:


Micron sensor 驱动与调试小结 
        通过上图我们可以发现画面不是很均匀,中心和边缘的亮度有明显的差别,由于镜头的原因,sensor总是中间的象素暴光比较充分。Micron 能够调试lens shading来解决这个问题,能将画面调试得更加均匀。

        调试过后的图片
Micron sensor 驱动与调试小结
        这个调试过程中要防止出现光圈现象。

畸变:

        畸变是由镜头形成的,由camera的制造工艺决定,所以无法通过改变ISP的设置改善。
        下图为测试畸变的样板。
Micron sensor 驱动与调试小结

白平衡:

        要说到白平衡就要先建立色温的概念。
       其实在摄影领域,光源大多是根据它们的色温来定义。色温的单位是开尔文,在不同温度下呈现出的色彩就是色温。当一个黑色物体受热后便开始发光,它会先变成暗红色,随着温度的继续升高会变成黄色,然后变成白色,最后就会变成蓝色(大家可以观察一下灯泡中的灯丝,不过由于受到温度的限制,大家一般不会看到它变成蓝色)。总之,这种现象在日常生活中是非常普遍的。
Micron sensor 驱动与调试小结
        上图就是不同的色温的光源照射下的同一组物体的图片。

        人的大脑能仔细分析出从眼睛接受的信号,因而能感知不同的色温(color temperature)来显示相同的白色。但camera 却不能,在早晨时分的相片偏红,而黄昏时候的却偏黄,就算同一张白纸在不同的环境下被拍摄,如不同的时间,不同的光源,都会出现不同程度的偏差。
调整白平衡,就是要给白色一个定义,能正确记录我们眼睛所看到的颜色。 Micron sensor 给出了两种白平衡的控制方法,一种是自动白平衡(AWB),一种是手动白平衡(MWB)。
        自动白平衡为sensor内部ISP的默认设置,ISP中有一结构复杂的矩形图,它可决定画面中的白平衡基准点,以此来达到白平衡调校。由于手机camera不属于色彩要求很高的照相机范畴,所以我们一般使用自动白平衡,自动白平衡在光源不是特别复杂的时候有较好的效果。
        手动白平衡需要自己设置R,G,B的gain值,micron给我们的寄存器中有专门设置这三个值的寄存器。
Micron sensor 驱动与调试小结
       作者水平有限,或许会有些不准确之处,欢迎指正批评。