现象
编码帧率设置的是25帧,出来的却是26帧。如果设置30帧,出来的是31帧。
解决思路
- 确定isp组件收到的是25帧,并且正确设置下去了
- 判断是编码出了问题还是硬件出了问题
- 确定寄存器组选择正确
- 确定寄存器配置是否正确
- 确定时钟是否正常
- 如果实在找不出来,就通过修改寄存器HMAX来修改帧率
过程
- isp组件收到的是25帧,编码没有丢帧
- 查看isp中断,确实是26帧,是否可能是设备的时钟有偏移?有没有可能sensor是25帧,但是设备的时钟快了?
- 找硬件测量sensor的帧率。由于模组的帧同步信号没有引出来,测量不到。只能测量主时钟和MIPI了
- 仅通过MIPI量不出帧率
- 通过其他的手段进行帧率的判断,如是否频闪。如果放在很亮的日光灯下,会有横条纹。如果横条纹静止不动,可以判断为帧率是准确的25帧。如果横条纹在滚动,帧率就不是准确的25帧。
- 确定了硬件sensor的问题之后,就主要排查寄存器配置是否正确
- 确定寄存器是否正确,和帧率相关的寄存器主要有两个:HMAX和VMAX。HMAX是每个曝光行的时间(时钟数),VMAX是每帧时长(曝光行数)。这里都没有问题
- 确定寄存器设置下去了,也没有问题
- 排除其他寄存器的问题,把所有的寄存器的设置都正确设置了,甚至上电时序都正常
- 确定主时钟MCLK是否正常,MCLK是CPU给的,配置是37.125MHz,我这里配置没有问题
- 但是找硬件测量一下MCLK的频率,是38.4MHz
- 和驱动确认了一下,参考的时钟源不一样,需要重新配置
- 由于CPU的时钟输出是从参考时钟源倍频出来的,不能够达到标准的37.125MHz。测试发现,水波纹还是会跳动,不过比原来好了一点。
- 当帧率大于25帧,水波纹向下滚动,当帧率小于25帧,水波纹向上滚动。
- 问高通的人,他们说只验证过24和26M,37.125M太高了。驱动最多可以配置到37.17M,经过测试,日光灯的横条纹滚动已经不明显了,但是长时间还是有一些滚动的
- 将寄存器HMAX的值按照实际频率和理想频率的比值进行一次缩放。同时修改和高通帧率以及曝光时间对应的参数值,进行适配。
//修改HMAX
{ \
...
{0x301C, 0xA5, 0x00}, /*HMAX*/\
}
//修改高通有关帧率计算和曝光时间计算的配置
.out_info =
{
/* Res 0 */
{
.x_output = 1948, /* 4+8+1920+9+4+3 */
.y_output = 1097, //1109 /* 8+1080+9 */
.line_length_pclk = 5285, /* 37161290 / 37125000 x 5280 */
.frame_length_lines = 1125,
.vt_pixel_clk = 148640625, /* 5285 x 1125 x 25 */
.op_pixel_clk = 237600000,
.binning_factor = 1,
.binning_method = 0,
.min_fps = 15.00,
.max_fps = 25.00,
.mode = SENSOR_DEFAULT_MODE,
.offset_x = 0,
.offset_y = 0,
.scale_factor = 1.0,
.is_pdaf_supported = 0,
},
}
小结
- 和帧率相关的寄存器,主要就是HMAX和VMAX。和帧率相关的硬件,主要是时钟频率。
- 出图正常的情况下,帧率异常需要注意时钟频率是否正常。
- 当帧率大于25帧,水波纹向下滚动,当帧率小于25帧,水波纹向上滚动,这个滚动的方向和sensor安装方向有关。可以用来初步的判断帧率的大小。
- 如果时钟频率不对,可以通过配置HMAX对帧率进行微调,同时需要注意高通对帧率以及曝光计算的配置也需要一同修改。
- 需要提前订好解决思路,并严格执行。先从大局来看问题,不能钻到一个小的问题里面出不来
- 多问多交流,别人会给你提供不一样的思路