本文主要分享高通camera驱动中minHorizontalBlanking(最小水平消隐)和minVerticalBlanking(最小垂直消隐)配置项的计算方法;
IFE时钟频率由以下sensor参数所决定:
对应sensor mode的输入IFE的帧尺寸(width&height);
水平和垂直消隐周期(horizontal and vertical blanking periods);
输出时钟频率(output clock rate);
输入IFE的帧尺寸和消隐周期由对应sensor的XML配置文件指定,例如下列的典型某一sensor mode的相关配置:
<resolutionData>
<colorFilterArrangement>BAYER_BGGR</colorFilterArrangement>
<streamInfo>
<streamConfiguration>
<vc range="[0,3]">0</vc>
<dt>43</dt>
<frameDimension>
<xStart>0</xStart>
<yStart>0</yStart>
<width>3264</width>
<height>2448</height>
</frameDimension>
<bitWidth>10</bitWidth>
<type>IMAGE</type>
</streamConfiguration>
</streamInfo>
<lineLengthPixelClock>1932</lineLengthPixelClock>
<frameLengthLines>2482</frameLengthLines>
<minHorizontalBlanking>0</minHorizontalBlanking>
<minVerticalBlanking>0</minVerticalBlanking>
<outputPixelClock>288000000</outputPixelClock>
......
上面是高通平台Camera的驱动文件的示例,其中各个sensor mode(每一组resolutionData)中的frameDimension、lineLengthPixelClock frameLengthLines、minHorizontalBlanking、minVerticalBlanking等数据,包括寄存器配置一般都是由sensor供应商(sensor vendor/FAE)提供;但是XML中的HBI(minHorizontalBlanking)和VBI(minVerticalBlanking)只是供应商依据sensor系列的平均值给出的,不一定就是最小的消隐周期;有时如果采用供应商提供的该项平均值,有可能会影响IFE的时钟频率与实际sensor输出速率不匹配,进而导致CAMIF(camera interface)发生溢出(overflow);
为了获取到最佳且正确的消隐周期,高通给出的计算方法(Spectra HW’s ability,含义不明待补充)如下:
1. 打开KMD csid和camif的log等级获取信息:
adb shell "echo 0x80 > /sys/kernel/debug/camera_ife/ife_csid_debug"
adb shell "echo 0x1 > /sys/kernel/debug/camera_ife/ife_camif_debug"
adb logcat -b kernel > kmd.log(或adb shell dmesg > kmd.log)
*高通KMD log各等级开启请参考:高通 Camx debug log控制_小驰笔记的博客-CSDN博客
2.在log中搜索关键字 cam_ife_csid_get_hbi_vbi 可以获取到csidHBIcycles[11:0]和csidVBIcycles[31:0],下面是高通示例log:
07-25 03:52:51.427 0 0 W cam_ife_csid_get_hbi_vbi: 292 callbacks suppressed
07-25 03:52:51.427 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 0 Resource 4 HBI: 0x665016d VBI: 0x32e98
07-25 03:52:51.427 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 1 Resource 4 HBI: 0x665016d VBI: 0x32e98
07-25 03:52:51.461 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 0 Resource 4 HBI: 0x665016d VBI: 0x32e99
07-25 03:52:51.461 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 1 Resource 4 HBI: 0x665016d VBI: 0x32e99
07-25 03:52:51.494 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 0 Resource 4 HBI: 0x665016d VBI: 0x32e98
07-25 03:52:51.494 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 1 Resource 4 HBI: 0x665016d VBI: 0x32e98
07-25 03:52:51.527 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 0 Resource 4 HBI: 0x665016d VBI: 0x32e98
07-25 03:52:51.527 0 0 I CAM_INFO: CAM-ISP: cam_ife_csid_get_hbi_vbi: 3090 Device csid4 index 1 Resource 4 HBI: 0x665016d VBI: 0x32e98
即csidHBIcycles为0x665016d 的后12位(HBI[11:0]),则数据为0x16d;
同理csidVBIcycles为0x32e98 的后32位,因为数据本身不足32位,则数据为0x00032e98;
我们需要使用以下公式获取min HBI:
*RoundUp是向上取整
- csidHBIcycles就是上文通过log获取到的HBI后12位信息;
- outputPixClkRate是sensor XML中的outputPixelClock配置项;
- CSIDclockRate是用于此usecase的CSID块的时钟速率。当usecase处于活动状态时,可以使用这些命令来读取:
adb shell cat /d/clk/cam_cc_ife_0_csid_clk/clk_measure
adb shell cat /d/clk/cam_cc_ife_1_csid_clk/clk_measure
要根据usecase使用的是IFE_0还是IFE_1来选择正确的频率;
获取min VBI需要使用以下公式:
其中的minCSIDVerticalBlanking计算公式为:
*Ceiling(a,b)函数是指将a向上取整至最接近b的倍数
- outputWidthPixels指的是sensor XML中对应sensor mode下的frameDimension中的width;
*本文内容来自《80-p9301-97_p_camera_sensor_driver_bring-up_guide》3.2.5节
*适用平台SM8150/SM8250