Rockchip BT.656 TX 和 BT.1120 TX 开发指南
前言
文本主要介绍 ROCKCHIP 平台 BT.656 BT.1120 接口调试指南
产品版本
目录
文章目录 Rockchip BT.656 TX 和 BT.1120 TX 开发指南@[toc]基础概念P 制扫描时序I 制扫描时序定位基准码 RK 平台支持的情况硬件连接软件配置打开 BT.656/BT.1120时序配置 常见问题BT.656 和 BT.1120 输出的是 Full range 还是 Limited range怎么确认此时主控已经被配置为 BT.656 和 BT.1120 输出RK 平台输出的 BT.656 和 BT.1120 信号是否标准单沿触发还是双沿触发DTS 配置可以参考哪些文件第三方转换芯片如何驱动RK628 中 BT.1120 如何使用和 Camera 的 BT.656/BT.1120 是什么关系BT.656/BT.1120 和 VOP 什么关系BT.656/BT.1120 和 RGB 什么关系HSYNC/VSYNC/DEN 信号是否有引到外部 IO消隐期数据 基础概念BT.656 和 BT.1120 分别定义了 SDTV 和 HDTV 的接口协议,通过在消隐期传输 EAV、SAV 的定位基准码作为嵌入式同步信号,传输的数据格式为 YCbCr 4 : 2 : 2。BT.656 和 BT.1120 在一些文档和手册上也会被称为视频信号或者 YUV 信号,目前 RK 平台输出的 BT.656/BT.1120 图像数据和定位基准码的位深均为 8bit。
下面介绍一些 BT.656 和 BT.1120 的基础概念和协议,详细的信息可以参考文档《Rec. ITU-R BT.1120》和《Rec. ITU-R BT.656》。
P 制扫描时序 I 制扫描时序 定位基准码地位基准码前三个 word 固定为:0xFF, 0x00, 0x00,第四个 word 由不同的扫描位置决定:
Bit9: 固定为1
Bit8(F):F=0 表示为偶场,F=1 表示为奇场
Bit7(V):V=0 表示该行包含有效视频数据,V=1 表示该行没有有效视频数据
Bit6(H):H=0 表示为 SAV,H=1 表示为 EAV
Bit[5, 2] (P3,P2,P1,P0):由 Bit8~Bit6 计算得来,其中:
Bit5 = V XOR H
Bit4 = F XOR H
Bit3 = F XOR V
Bit2 = F XOR V XOR H
Bit[1, 0]: 固定为0,对于 RK 平台,位深为 8 BIT,可以认为没有这 2 个 Bit;
下面的表格根据不同的 EAV/SAV (F,V,H) 算好了对应的保护位的值(P3,P2,P1,P0):
结合以上信息,可以得到各个消隐期对应的定位基准码为:
BT.656 和 BT.1120 支持以下三种硬件连接,根据不同的连接方式软件在 DTS 文件或者对应的转换芯片驱动中要对 bus_format 做对应的适配。
软件配置 打开 BT.656/BT.1120 对接的设备在发送端不需要软件驱动(即不需要注册 DRM connector 的),这种可以在 dts 文件中的 panel 节点配置: panel { …… bus-format = MEDIA_BUS_FMT_YUYV8_1X16; //or MEDIA_BUS_FMT_YUYV8_1X16/MEDIA_BUS_FMT_UYVY8_1X16 …… } 对接的设备在发送端需要软件驱动(即需要注册 DRM connector 的),这种除了可以参考第一点在 dts 中适配,也可以考虑在对应 connector 驱动的 drm_connector_helper_funcs -> get_modes 函数中设定,可以参考 drivers/gpu/drm/bridge/sii902x.c 中的实现: static int sii902x_get_modes(struct drm_connector *connector) { u32 bus_format = MEDIA_BUS_FMT_YUYV8_1X16;//depend on hardware …… drm_display_info_set_bus_formats(&connector->display_info, &bus_format, 1); …… }通过第1/2 点对 bus_format 的配置, VOP 驱动会使能 BT.656/BT.1120,同时配置对应的引脚映射关系。
时序配置时序的配置有以下三种方法:
DTS 中配置对于支持固定的分辨率的产品,可以在 DTS panel中配置好对应的时序:
P 制时序 timing_1080p: timing-1080p { clock-frequency = <148500000>; hactive = <1920>; vactive = <1080>; hback-porch = <100>; hfront-porch = <200>; vback-porch = <10>; vfront-porch = <10>; hsync-len = <20>; vsync-len = <20>; hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <0>; }; I 制时序 timing_ntsc: timing-ntsc { clock-frequency = <13500000>; hactive = <720>; vactive = <480>; hback-porch = <43>; hfront-porch = <33>; vback-porch = <36>; vfront-porch = <3>; hsync-len = <62>; vsync-len = <6>; hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <0>; interlaced; doubleclk; //only NTSC(480i60) mode and PAL(576i50) mode need this property }; 读 EDID对于显示设备支持多个分辨率输入同时有 EDID 信息的,可以参考 sii902x 的驱动,通过 DDC/I2C 读取 EDID 信息获取显示设备支持的分辨率:
//dts &i2c3 { clock-frequency = <400000>; status = "okay"; sii9022: sii9022@39 { compatible = "sil,sii9022"; reg = <0x39>; pinctrl-names = "default"; …… ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; sii9022_in_rgb: endpoint { remote-endpoint = <&rgb_out_sii9022>; }; }; }; }; }; &rgb { status = "okay"; …… ports { port@1 { reg = <1>; #address-cells = <1>; #size-cells = <0>; rgb_out_sii9022: endpoint@0 { reg = <0>; remote-endpoint = <&sii9022_in_rgb>; }; }; }; }; //drivers/gpu/drm/bridge/sii902x.c static int sii902x_probe(struct i2c_client *client, const struct i2c_device_id *id) { …… i2c_set_clientdata(client, sii902x); sii902x->i2cmux = i2c_mux_alloc(client->adapter, dev, 1, 0, I2C_MUX_GATE, sii902x_i2c_bypass_select, sii902x_i2c_bypass_deselect); if (!sii902x->i2cmux) return -ENOMEM; sii902x->i2cmux->priv = sii902x; return i2c_mux_add_adapter(sii902x->i2cmux, 0, 0, 0); …… } static int sii902x_get_modes(struct drm_connector *connector) { struct sii902x *sii902x = connector_to_sii902x(connector); edid = drm_get_edid(connector, sii902x->i2cmux->adapter[0]); drm_connector_update_edid_property(connector, edid); if (edid) { if (drm_detect_hdmi_monitor(edid)) output_mode = SII902X_SYS_CTRL_OUTPUT_HDMI; num = drm_add_edid_modes(connector, edid); kfree(edid); } } connector 驱动中写好这种一般是在调试过程中为了方便或者没有I2C/DDC 通道读取EDID信息但是又需要支持多个分辨率的,可以直接在 connector 驱动中写好对应的分辨率,可以参考 sii902x.c 驱动中的实现:
static int sii902x_get_modes(struct drm_connector *connector) { struct sii902x *sii902x = connector_to_sii902x(connector); …… for (i = 0; i < ARRAY_SIZE(sii902x_default_modes); i++) { const struct drm_display_mode *ptr = &sii902x_default_modes[i]; mode = drm_mode_duplicate(connector->dev, ptr); if (mode) { if (!i) mode->type = DRM_MODE_TYPE_PREFERRED; drm_mode_probed_add(connector, mode); ret++; } } …… } 常见问题 BT.656 和 BT.1120 输出的是 Full range 还是 Limited range答:Limited range,即有效图像数据范围是 [16,235], 只有定位基准码才可能出现 0xFF, 0x00 的数据。
怎么确认此时主控已经被配置为 BT.656 和 BT.1120 输出答:通过 cat /sys/kernel/debug/dri/0/summary 可以看到对应 VOP/VP 节点下的 bus_format 值,和本文第3点中的表格对应:
cat /sys/kernel/debug/dri/0/summary Video Port0: ACTIVE …… bus_format[2025]: YUV8_1X24 …… RK 平台输出的 BT.656 和 BT.1120 信号是否标准答:是的,基于《Rec. ITU-R BT.656》和《Rec. ITU-R BT.1120》标准设计。
单沿触发还是双沿触发答:单沿触发,默认配置 clock 的上升沿在数据中间,如果接收端希望下降沿在数据中间,可以将 dts 中的 pixelclk-active 设定为1。
DTS 配置可以参考哪些文件答:可以参考下面这两个配置文件:
BT.656: arch/arm64/boot/dts/rockchip/rk3568-evb6-ddr3-v10-rk630-bt656-to-cvbs.dts
BT.1120: arch/arm64/boot/dts/rockchip/rk3568-evb2-lp4x-v10-bt1120-to-hdmi.dts
第三方转换芯片如何驱动答:分以下两种情况:
如果第三方转换芯片不需要单独配置寄存器,只需要上电就能正常使用的,这种只要在 dts 文件的 panel 节点中配置要对应的 GPIO、电源,确保转换芯片有正常供电,不需要编写额外的驱动,rockchip_rgb.c 文件会完成向 DRM 驱动框架注册 encoder 和 connector。如果第三方转换芯片需要单独配置寄存器,这种除了要在 dts 中正确配置 GPIO、电源,确保转换芯片有正常供电外,还需要编写转换芯片对应的驱动,此时 rockchip_rgb.c 会完成向 DRM 驱动框架注册 encoder,转换芯片的驱动完成向 DRM 驱动框架注册 connector,并通过 DRM bridge 桥接起来,具体可以参考内核代码:drivers/gpu/drm/bridge/sii902x.c 中的实现。 RK628 中 BT.1120 如何使用答:RK628 BT.1120 的使用方法请参考文档《Rockchip_DRM_RK628_Porting_Guide_CN》中的说明。
和 Camera 的 BT.656/BT.1120 是什么关系答:这边介绍的是 BT.656 TX 和 BT.1120 TX,是一种并行输出接口,而 Camera 对应的是 BT.656 RX 和 BT.1120 RX,是一种并行输入接口,两则在协议上是一致的,有关 BT.656 RX 和 BT.1120 RX 的开发文档,请从我司 FAE 窗口/ ISP 部门获取。
BT.656/BT.1120 和 VOP 什么关系答:BT.656 和 BT.1120 是一种嵌入式同步信号的并行输出接口,VOP 将多个图层[多块 buffer] 合成好的数据通过 BT.656/BT.1120 输出。
BT.656/BT.1120 和 RGB 什么关系答:BT.656 和 BT.1120 是嵌入式同步信号的并行输出接口,RGB 是有独立同步信号 [HSYNC/VSYNC/DEN] 的并行输出接口,他们都是独立的显示接口,在显示通路上没有直接关系,可能在 IO 上有复用关系。
HSYNC/VSYNC/DEN 信号是否有引到外部 IO答: RV1126/RV1109 的 BT.1120 这几个同步信号有引到外部 IO 上,但是 Data 会比 DEN 晚一个 cycle,RK356X 这几个同步信号没有引到外部 IO。
消隐期数据答:BT.656 消隐期数据为 0x80 0x10 0x80 0x10,BT.1120 Y 通道和 UV 通道也都是按 0x80 0x10 0x80 0x10 发送。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。 |