CPHY也是MIPI物理层的接口一种,相比于DPHY,CPHY没有单独的时钟信号线,时钟信号内嵌到data信号线中,3组信号线,每组有ABC 3跟组成,相比于DPHY,CPHY可以具有更高的带宽。更多有关于CPHY的介绍,后面单独介绍。目前DPHY的应用明显比CPHY更多,但是随着应用场景对画质越来越高,数据带宽也必然会增加,那么CPHY的应用也会逐渐普及。RK3588 的DC PHY支持作为CPHY使用,这篇文章介绍一下RK3588 CPHY的sensor的调试。
(1)RK3588 MIPI CPHY规格介绍
RK3588 有4个MIPI PHY,其中两个是MIPI D/C comb PHY,顾名思义,就是既可以作为DPHY使用,又可以作为CPHY使用。RK3588的CPHY是V1.1的版本,最大速率支持到2.5Gsps,这里说明一下sps符号速率与我们常认为的bps的换算关系:sps = 2.28 bps,所以RK3588 CPHY的总带宽就可以达到(2.5G * 2.28)* 3,达到17.1Gbps带宽。
(2)LT7911UXC:CPHY sensor
RK3588支持CPHY接收,需要搭配支持CPHY TX的sensor才能正常使用,这边介绍调试过的LT7911UXC为例,LT7911UXC支持CPHY的输出,支持CPHY V1.0的版本,1组数据线的速率是5.7Gbps,总带宽是17.1Gbps。
(3)驱动配置
基于v4l2的框架,介绍一下CPHY对应的驱动调试,以及与DPHY之间的差异。其实相比于DPHY,主要的不同就是在于接口g_mbus_config的配置,重点差异上的配置如下,其余可自行参考其余文章,这里不再赘述。
①g_mbus_config配置
lt7911uxc对应的实现如下:
static int lt7911uxc_g_mbus_config(struct v4l2_subdev *sd,
unsigned int pad, struct v4l2_mbus_config *cfg)
{
struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd);
u32 lane_num = lt7911uxc->bus_cfg.bus.mipi_csi2.num_data_lanes;
u32 val = 0;
val = 1 << (lane_num - 1) |
V4L2_MBUS_CSI2_CHANNEL_0 |
V4L2_MBUS_CSI2_CONTINUOUS_CLOCK;
cfg->type = lt7911uxc->bus_cfg.bus_type;
cfg->flags = val;
return 0;
}
重点关注type的配置项,这里的驱动是根据dts配置来获取的,dts配置后面介绍。此处也可直接修改为:
cfg->type = V4L2_MBUS_CSI2_CPHY;
②dts配置
dts配置主要是lt7911uxc对应的port的配置,需要指定bus-type为1,如果缺省没有配置,就默认为DPHY接口,data-lane设置为3lane形式。
port {
lt7911_out0: endpoint {
remote-endpoint = <&hdmi_mipi0_in>;
bus-type = <1>;
data-lanes = <1 2 3>;
};
};
③link-freq的配置
驱动调试过程中,需要注意的是link-freq的配置,在之前的文章中,有说过,link-freq指示的是MIPI时钟,在CPHY的模式下,也可以认为是速率的一半,可以参照如下进行计算:
4K60的分辨率,YUV422格式:
4400*2250*16*60 /3 /2 /2.28
(4)功能调试
①抓图抓数据流
参照之前文章,基本类似
②常见错误排查
如果抓不到数据流,建议先测量MIPI信号是否正常,测量9 line是否都正常,如果正常,就需要分析MIPI信号是否符合spec要求,常见的是prepare太小导致无法抓图。