现象

编码帧率设置的是25帧,出来的却是26帧。如果设置30帧,出来的是31帧。

解决思路

  1. 确定isp组件收到的是25帧,并且正确设置下去了
  2. 判断是编码出了问题还是硬件出了问题
  3. 确定寄存器组选择正确
  4. 确定寄存器配置是否正确
  5. 确定时钟是否正常
  6. 如果实在找不出来,就通过修改寄存器HMAX来修改帧率

过程

  1. isp组件收到的是25帧,编码没有丢帧
  2. 查看isp中断,确实是26帧,是否可能是设备的时钟有偏移?有没有可能sensor是25帧,但是设备的时钟快了?
  3. 找硬件测量sensor的帧率。由于模组的帧同步信号没有引出来,测量不到。只能测量主时钟和MIPI了
  4. 仅通过MIPI量不出帧率
  5. 通过其他的手段进行帧率的判断,如是否频闪。如果放在很亮的日光灯下,会有横条纹。如果横条纹静止不动,可以判断为帧率是准确的25帧。如果横条纹在滚动,帧率就不是准确的25帧。
  6. 确定了硬件sensor的问题之后,就主要排查寄存器配置是否正确
  7. 确定寄存器是否正确,和帧率相关的寄存器主要有两个:HMAXVMAX。HMAX是每个曝光行的时间(时钟数),VMAX是每帧时长(曝光行数)。这里都没有问题
  8. 确定寄存器设置下去了,也没有问题
  9. 排除其他寄存器的问题,把所有的寄存器的设置都正确设置了,甚至上电时序都正常
  10. 确定主时钟MCLK是否正常,MCLK是CPU给的,配置是37.125MHz,我这里配置没有问题
  11. 但是找硬件测量一下MCLK的频率,是38.4MHz
  12. 和驱动确认了一下,参考的时钟源不一样,需要重新配置
  13. 由于CPU的时钟输出是从参考时钟源倍频出来的,不能够达到标准的37.125MHz。测试发现,水波纹还是会跳动,不过比原来好了一点。
  14. 当帧率大于25帧,水波纹向下滚动,当帧率小于25帧,水波纹向上滚动。
  15. 问高通的人,他们说只验证过24和26M,37.125M太高了。驱动最多可以配置到37.17M,经过测试,日光灯的横条纹滚动已经不明显了,但是长时间还是有一些滚动的
  16. 将寄存器HMAX的值按照实际频率和理想频率的比值进行一次缩放。同时修改和高通帧率以及曝光时间对应的参数值,进行适配。
    //修改HMAX
    #define RES_1080P25_REG_ARRAY \
    { \
    ...
    {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,
    },
    }

小结

  1. 和帧率相关的寄存器,主要就是HMAX和VMAX。和帧率相关的硬件,主要是时钟频率。
  2. 出图正常的情况下,帧率异常需要注意时钟频率是否正常。
  3. 当帧率大于25帧,水波纹向下滚动,当帧率小于25帧,水波纹向上滚动,这个滚动的方向和sensor安装方向有关。可以用来初步的判断帧率的大小。
  4. 如果时钟频率不对,可以通过配置HMAX对帧率进行微调,同时需要注意高通对帧率以及曝光计算的配置也需要一同修改。
  5. 需要提前订好解决思路,并严格执行。先从大局来看问题,不能钻到一个小的问题里面出不来
  6. 多问多交流,别人会给你提供不一样的思路