前提情况:
IMX890 在度信盒子上点不亮,在mtk6855 demothone上可以点亮。
分析原因:
可能由于两者的ISP处理能不一样,度信盒子ISP的处理能力有限导致统一一套IMX890配置参数在mtk6855 demothone上可以点亮,在度信盒子上点不亮。
调试方向:
通过降低度信盒子上的IMX890 mipi速率,来尝试点亮sensor
查看IMX890软件手册
如上IOP System Clock Divider既为IOP_SYCK_DIV
在PHY_CTRL=0的模式下(sensor默认设置PHY_CTRL=0),Mipi速率计算公式如下:
Bitrate = ( INCK/IOP_PREPLLCK_DIV)*IOP_PLL_MPY/IOP_SYCK_DIV
额外说明:
PHY_CTRL=2的模式下,并非是设置mipi 速率,而是设置mipi 数据长包短包等时序,一般情况下我们不要去动他们
我们再继续通过查看IMX890软件手册,查看得知INCK,IOP_PREPLLCK_DIV,IOP_PLL_MPY,IOP_SYCK_DIV的配置
平台端如果配置MIPI clock为24M,那么sensor也需要配置外部时钟为24M,相当于告诉sensor芯片,外部给了一个24M的INCK。
通过如上参数设置得知mipi速率设置为800Mbps :
Bitrate = ( INCK/IOP_PREPLLCK_DIV)*IOP_PLL_MPY/IOP_SYCK_DIV
= (24M/0x03)*0x190/0x04
= (24M/3)*400/4
= 800Mbps
从上得知,通过降低IOP_PLL_MPY即可降低mipi速率,
将IOP_PLL_MPY从400改为200,300,350,在度信盒子和MTK demophone上都点不亮,显示黑屏
如下为MTK demophone上IOP_PLL_MPY设置为350的kernel LOG表现:
Main log
adb shell setprop vendor.debug.seninf.log 1
adb shell sentest 1 1
MTK端接收到的sensor数据为宽0xb88=2592 ,高0x1000=4096
而实际上设置sensor输出数据为3072*4096,说明sensor mipi输出数据不足
通过比特率计算公式,
Bitrate = ( INCK/IOP_PREPLLCK_DIV)*IOP_PLL_MPY/IOP_SYCK_DIV
我们试着通过降低 INCK来降低比特率,将INCK降低到22M,20M,12M,度信盒子均可点亮sensor。
通过上面的分析得出结论:
- 通过降低IOP_PLL_MPY来降低mipi速率,sensor点不亮
- 通过降低 INCK来降低mipi速率,sensor点亮
再次查看imx890 软件手册,分析下图得知:
- 降低IOP_PLL_MPY,只降低了其中IOPCK 一路时钟,仅仅只降低了mipi 速率
- 降低INCK,同时降低了IVTCK和IOPCK两路时钟,即同时降低了mipi速率和sensor内部处理图像的速度
总结:
要让sensor点亮,需要降低mipi速率的同时,还要降低sensor内部像素速率(Pixel rate),要不然前面sensor出数据太快,但是后面mipi的输出速度跟不上,导致丢掉一些数据,最后还是点不亮。
从这里也可以看出上面MTK demophone 在降低IOP_PLL_MPY时,sensor mipi输出数据不足的原因了。
一般INCK作为外部时钟,我们尽量不要去改动,那么要让sensor点亮,我们可以将IOP_PLL_MPY和IVT_PLL_MPY 同比例增加即可。
如下表一是原始寄存器配置,将IOP_PLL_MPY和IVT_PLL_MPY对应降低 ¾ ,寄存器配置为如下表二,在度信板子上和MTK demophone上都可以点亮,并且对应帧率相比之前降低 ¾ 。
表一
表二
表三
两点疑问:
1.将IOP_PLL_MPY和IVT_PLL_MPY对应降低一半,即配置为上图表三,在度信板上可以点亮,在MTK demophone上点不亮分析原因可能是因为IOP_PLL_MPY减半后,IOPCK计算得到的值超出下图的范围,IOPCK=( INCK/IOP_PREPLLCK_DIV)*IOP_PLL_MPY= (24M/3)*200=1600M。
但是在度信板子上为什么可以点亮,不得而知。
2.通过降低IVTCK可以降低sensor像素输出速率,既可以通过调整IVT_PLL_MPY来调整帧率,但是如何通过IVTCK计算帧率,还未知,有知道怎么计算的可以相互交流。