RK628F HDMI-IN调试

这篇文章我们介绍一下RK628作为HDMI-IN功能的调试,我们使用的主控是RK3588,使用RK628F来实现4K60的HDMI-IN功能,对应的安卓版本是安卓13。

目录

(1)概述

(2)RK628F驱动调试

1.系统框架

2.驱动代码

3.DTS配置

4.链路配置

5.双MIPI功能

6.DSI配置

7.scaler配置

(3)HDMI-IN 功能预览

1.camera框架适配

2.TV框架适配

3.TV与camera预览差异

(4)调试方法

1.查询hdmiin  timing信息

2.查看media拓扑

3.查看RK628F/H HDMI-RX状态

4.RK628F/H 设置pattern输出

5.寄存器读写

6.开启图像数据流

7.抓取图像

(5)总结


(1)概述

RK628是RK发布的视频桥接芯片,支持HDMI,RGB等输入,支持MIPI-CSI、MIPI-DSI、BT1120、RGB、LVDS等输出。所以可以利用HDMI-》MIPI的接口来实现HDMI-IN的功能,早期的版本是RK628D,HDMI只能支持到1.4,最大分辨率只有4K30,只有一路MIPI-CSI 输出,且RGB转YUV的时候存在下采样色偏的问题,难以解决。后面更新了RK628F的版本,支持HDMI2.0,支持两路MIPI输出,可以支持4K60,同时也解决了下采样色偏的问题。

RK628F对比RK628D的改进点如下图所示(仅HDMI-CSI通路)

模块改进点 
HDMIRX

支持 HDMI2.0

支持 RGB 4K60 输入

增加更多频点支持

支持 DVI mode

锁定更快更稳定

MIPI-CSI

解决了不同图像格式输入,格式转换下采样引入的色偏问题

增加一路 MIPI-CSI,双 MIPI-CSI 支持 4K60 输出

CSC新增 matrix,可对图像色域做更灵活转换

本文后续以RK628F搭配RK3588主控为例,介绍HDMI-IN功能的实现。

(2)RK628F驱动调试

1.系统框架

RK628F的框架流程如下图所示:

2.驱动代码

驱动目录结构如下所示,基于V4L2框架开发,将RK628F当做类camera的设备设计开发,再增加热拔插与切换分辨率的功能。

drivers/media/i2c/rk628
├── Makefile
├── rk628_bt1120_v4l2.c
├── rk628.c
├── rk628_combrxphy.c
├── rk628_combrxphy.h
├── rk628_combtxphy.c
├── rk628_combtxphy.h
├── rk628_cru.c
├── rk628_cru.h
├── rk628_csi.c
├── rk628_csi.h
├── rk628_csi_v4l2.c
├── rk628_dsi.c
├── rk628_dsi.h
├── rk628.h
├── rk628_hdmirx.c
├── rk628_hdmirx.h
├── rk628_mipi_dphy.c
├── rk628_mipi_dphy.h
├── rk628_post_process.c
└── rk628_post_process.h

3.DTS配置

RK628F是i2c设备,所以需要配置在i2c的总线下:

&i2c5 {
	status = "okay";
	pinctrl-0 = <&i2c5m3_xfer>;
	clock-frequency = <400000>;

	rk628_csi: rk628_csi@50 {
		reg = <0x50>;
		compatible = "rockchip,rk628-csi-v4l2";
		status = "okay";
		power-domains = <&power RK3576_PD_VI>;
		pinctrl-names = "default";
		pinctrl-0 = <&rk628_pin>;
		interrupt-parent = <&gpio3>;
		interrupts = <RK_PB0 IRQ_TYPE_LEVEL_HIGH>;
		enable-gpios = <&gpio3 RK_PD0 GPIO_ACTIVE_HIGH>;
		reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
		plugin-det-gpios = <&gpio3 RK_PD5 GPIO_ACTIVE_LOW>;
		continues-clk = <1>;
		cec-enable;
		#sound-dai-cells = <0>;

		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "HDMI-MIPI1";
		rockchip,camera-module-lens-name = "RK628-CSI";

		multi-dev-info {
			dev-idx-l = <1>;
			dev-idx-r = <3>;
			combine-idx = <1>;
			pixel-offset = <0>;
			dev-num = <2>;
		};

		port {
			hdmiin_out: endpoint {
				remote-endpoint = <&hdmi_mipi_in>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};
  • interrupt-parent/ interrupts:连接RK628中断的GPIO引脚;

  • enable-gpios:RK628供电控制GPIO引脚(若为常供电可不配置);

  • reset-gpios:RK628复位控制GPIO引脚

  • hpd-output-inverted:HPD输出取反配置,若HPD输出电平在电路上做了取反,则需要使能此配置项;

  • plugin-det-gpios:HDMI插入检测GPIO引脚,注意电路上是否有对电平取反,有效电平需要配置正确;

  • rockchip,camera-module-name:对接TIF框架,该属性必须严格按照如下规律配置:HDMI-MIPIx,其中x为硬件实际接到哪个MIPI就配置哪个。RK3588按照如下规律配置。

若硬件接的是MIPI D/C PHY0 ,则为HDMI-MIPI0或者HDMI-MIPI

若硬件接的是MIPI D/C PHY1 ,则为HDMI-MIPI1

若硬件接的是MIPI CSI RX0 (4lane),则为HDMI-MIPI2

若硬件接的是MIPI CSI RX0 (2lane-lane01),则为HDMI-MIPI2

若硬件接的是MIPI CSI RX0 (2lane-lane23),则为HDMI-MIPI3

若硬件接的是MIPI CSI RX1 (4lane),则为HDMI-MIPI4

若硬件接的是MIPI CSI RX1 (2lane-lane01),则为HDMI-MIPI4

若硬件接的是MIPI CSI RX1 (2lane-lane23),则为HDMI-MIPI5

另外从DTS的pipeline链路也可以看出实际的配置,该属性与rkcif_mipi_lvds对应,rkcif_mipi_lvds对接的index是多少,则该属性也配置为多少。

4.链路配置

图像接收链路需要根据接的硬件接口进行配置,RK3588/RK3576有多路MIPI,需要根据实际链路进行配置。RK3588图像链路可参考如下:

5.双MIPI功能

RK628F/H 受限于 MIPI DPHY 速率,一路 MIPI 最大只能支持 4K30,RK628F/H 有两路 MIPI-CSI,在对接 RK3588/RK3576 等时,4K60 的场景下,可以将 4K60 视频数据拆分成左右两半图像分别通过两路 4lane 的 MIPI-CSI/DSI 进行传输,由主控平台将图像进行合成为 4K60。

注:对接 RK3588/RK3576 SOC 平台,图像拼接合成直接在 VI 驱动完成,不会额外增加延时以及负载。

RK628F/H 内部支持可以将 HDMIRX 接收的图像 split 分割成左右两半,分别给到两路 MIPI-CSI/DSI 进行传输,如下图所示:

基于上述,在对接 RK3588/RK3576 有多路 MIPI 接口的 SOC 平台时,就可以采用双 MIPI 模式,接收下 4K60 分辨率的图像数据,功能流程如下图所示。

RK628F/H若采用双MIPI的方案,Pipeline链路的配置与单MIPI基本无差别,pipeline按照CSI0的进行配置即可,RK628F/H的设备节点需要增加multi-dev-info的配置,解析如下:

dev-idx-l:左半边图像对应的 mipi 接口编号

dev-idx-r:右半边图像对应的 mipi 接口编号

combine-idx:将左右两张图想合并到其中的一个 idx,dts 的链路以这个 idx 为准

pixel-offset:像素偏移,默认设置 0

dev-num:多少个 mipi 设备进行拼接

注:如果没有4K60的需求,只使用一个MIPI PORT的话,则不需要配置multi-dev-info的参数。

6.DSI配置

RK628F/H支持HDMI转MIPI-CSI或者DSI,MIPI-CSI仅支持YUV422格式输出,MIPI-DSI支持RGB888格式输出,若需要RGB888格式,则需要修改为DSI模式,DTS配置如下:

compatible = "rockchip,rk628-dsi-v4l2";

注:CSI模式仅支持YUV422输出,DSI模式仅支持RGB888输出,RGB888一般用在大屏对图像画质要求高的场景,要求RGB格式直接送显示,减少画质丢失,可走TV框架加速送显。在Camera框架下,HAL会将格式转换为NV12,同样存在画质丢失。

7.scaler配置

RK628F/H 支持无论HDMI什么分辨率输入都固定缩放成固定的分辨率输出,DTS打开scaler的配置,驱动默认是按照1080P60进行设置。

DTS配置:

scaler-en = <1>;

驱动固定输出分辨率,若需要其他分辨率,可自行修改。

static struct v4l2_dv_timings dst_timing = {
	.type = V4L2_DV_BT_656_1120,
	.bt = {
		.interlaced = V4L2_DV_PROGRESSIVE,
		.width = 1920,
		.height = 1080,
		.hfrontporch = 88,
		.hsync = 44,
		.hbackporch = 148,
		.vfrontporch = 4,
		.vsync = 5,
		.vbackporch = 36,
		.pixelclock = 148500000,
	},
};

(3)HDMI-IN 功能预览

1.camera框架适配

参考上一篇文章,需要配置camera3_profiles.xml,注册cameraID,后续就可以使用标准的cameraAPI打开预览camera。

2.TV框架适配

SDK默认代码HDMI IN功能是关闭的,使能HDMI IN功能,需配置如下属性,开启后会编译含上述 APK在内的相关模块:

vim device/rockchip/rk3588/BoardConfig.mk
BOARD_HDMI_IN_SUPPORT := true

3.TV与camera预览差异

TIFcamera
优点延迟低app端能够拿到预览数据进行后处理
缺点

不支持屏幕旋转、分屏、画中画功能;

app端拿不到预览buffer数据;

不支持screencap方式的截图命令

延迟高于TIF

(4)调试方法

1.查询hdmiin  timing信息

rk3588_s:/ # v4l2-ctl -d /dev/v4l-subdev2 --query-dv-timings
    Active width: 1920
    Active height: 1080
    Total width: 2200
    Total height: 1125
    Frame format: progressive
    Polarities: -vsync -hsync
    Pixelclock: 0 Hz (0.00 frames per second)
    Horizontal frontporch: 88
    Horizontal sync: 0
    Horizontal backporch: 192
    Vertical frontporch: 9
    Vertical sync: 0
    Vertical backporch: 36
    Standards:

2.查看media拓扑

media-ctl -d /dev/mediaX -p      //X=0123...

|rk3588_s:/ # media-ctl -p
Opening media device /dev/media0
Enumerating entities
Found 14 entities
Enumerating pads and links
Media controller API version 0.0.160

Media device information
------------------------
driver          rkcif
model           rkcif-mipi-lvds
serial
bus info
hw revision     0x0
driver version  0.0.160

Device topology
- entity 1: stream_cif_mipi_id0 (1 pad, 11 links)
            type Node subtype V4L
            device node name /dev/video0
        pad0: Sink
                <- "rockchip-mipi-csi2":1 [ENABLED]
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 5: stream_cif_mipi_id1 (1 pad, 11 links)
            type Node subtype V4L
            device node name /dev/video1
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 [ENABLED]
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 9: stream_cif_mipi_id2 (1 pad, 11 links)
            type Node subtype V4L
            device node name /dev/video2
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 [ENABLED]
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 13: stream_cif_mipi_id3 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video3
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 [ENABLED]
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 17: rkcif_scale_ch0 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video4
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 [ENABLED]
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 21: rkcif_scale_ch1 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video5
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 [ENABLED]
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 25: rkcif_scale_ch2 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video6
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 [ENABLED]
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 29: rkcif_scale_ch3 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video7
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 [ENABLED]
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 33: rkcif_tools_id0 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video8
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 [ENABLED]
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 []

- entity 37: rkcif_tools_id1 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video9
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 [ENABLED]
                <- "rockchip-mipi-csi2":11 []

- entity 41: rkcif_tools_id2 (1 pad, 11 links)
             type Node subtype V4L
             device node name /dev/video10
        pad0: Sink
                <- "rockchip-mipi-csi2":1 []
                <- "rockchip-mipi-csi2":2 []
                <- "rockchip-mipi-csi2":3 []
                <- "rockchip-mipi-csi2":4 []
                <- "rockchip-mipi-csi2":5 []
                <- "rockchip-mipi-csi2":6 []
                <- "rockchip-mipi-csi2":7 []
                <- "rockchip-mipi-csi2":8 []
                <- "rockchip-mipi-csi2":9 []
                <- "rockchip-mipi-csi2":10 []
                <- "rockchip-mipi-csi2":11 [ENABLED]

- entity 45: rockchip-mipi-csi2 (12 pads, 122 links)
             type V4L2 subdev subtype Unknown
             device node name /dev/v4l-subdev0
        pad0: Sink
                [fmt:UYVY2X8/1920x1080
                 crop.bounds:(0,0)/1920x1080
                 crop:(0,0)/1920x1080]
                <- "rockchip-csi2-dphy0":1 [ENABLED]
        pad1: Source
                -> "stream_cif_mipi_id0":0 [ENABLED]
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad2: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 [ENABLED]
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad3: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 [ENABLED]
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad4: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 [ENABLED]
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad5: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 [ENABLED]
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad6: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 [ENABLED]
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad7: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 [ENABLED]
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad8: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 [ENABLED]
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad9: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 [ENABLED]
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 []
        pad10: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 [ENABLED]
                -> "rkcif_tools_id2":0 []
        pad11: Source
                -> "stream_cif_mipi_id0":0 []
                -> "stream_cif_mipi_id1":0 []
                -> "stream_cif_mipi_id2":0 []
                -> "stream_cif_mipi_id3":0 []
                -> "rkcif_scale_ch0":0 []
                -> "rkcif_scale_ch1":0 []
                -> "rkcif_scale_ch2":0 []
                -> "rkcif_scale_ch3":0 []
                -> "rkcif_tools_id0":0 []
                -> "rkcif_tools_id1":0 []
                -> "rkcif_tools_id2":0 [ENABLED]

- entity 58: rockchip-csi2-dphy0 (2 pads, 2 links)
             type V4L2 subdev subtype Unknown
             device node name /dev/v4l-subdev1
        pad0: Sink
                [fmt:UYVY2X8/1920x1080]
                <- "m00_b_rk628-csi 5-0050":0 [ENABLED]
        pad1: Source
                -> "rockchip-mipi-csi2":0 [ENABLED]

- entity 63: m00_b_rk628-csi 5-0050 (1 pad, 1 link)
             type V4L2 subdev subtype Sensor
             device node name /dev/v4l-subdev2
        pad0: Source
                [fmt:UYVY2X8/1920x1080]
                -> "rockchip-csi2-dphy0":0 [ENABLED]

3.查看RK628F/H HDMI-RX状态

可通过如下指令读取RK628F HDMI-RX的信息,包括分辨率信息、锁定状态、拔插状态、颜色格式等等:

console:/ # cat /sys/kernel/debug/rk628/3-0050/hdmirx/status
status: plugin
Clk-Ch:Lock     Ch0:Lock        Ch1:Lock        Ch2:Lock
Color Format: RGB
Timing: 1920x1080p60 (2200x1125)                hfp:88  hs:45  hbp:147  vfp:4  vs:5  vbp:36
Pixel Clk: 148500000
Mode: HDMI
Color Depth: 8 bit
Color Range: Limited
Color Space: RGB

4.RK628F/H 设置pattern输出

RK628F 支持设置scaler color bar输出,具体使用命令如下:

echo 1 > /sys/kernel/debug/rk628/3-0050/scaler_color_bar

//pattern 模式选择
echo 2 > /sys/kernel/debug/rk628/3-0050/scaler_color_bar

5.寄存器读写

RK628 寄存器调试节点如下,当前示例 RK628 接在 I2C3,地址为 0x50:

console:/ # ls /sys/kernel/debug/rk628/3-0050/registers/
adapter    combtxphy  csi   dsi0  gpio0  gpio2  grf     hdmirxphy
combrxphy  cru        csi1  dsi1  gpio1  gpio3  hdmirx

6.开启图像数据流

开启图像数据流命令如下所示,需要根据实际情况,设置video节点、分辨率、格式等信息,video节点可以按照如下方法确认:使用上述查看media拓扑命令找到转接芯片所在的media节点并查看对应的pipeline,pipeline中节点名为:stream_cif_mipi_id0所对应的video节点既是取流的节点:

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4

7.抓取图像

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=3 --stream-skip=4 --stream-to=/data/3840x2160_nv12.yuv --stream-count=5 --stream-poll

(5)总结

本篇文章简单介绍了rk628f实现hdmi-in功能的调试过程与实现原理,其中还有很多内容,后续我们再进一步深入分析,框架是如何实现热拔插监测、切换分辨率预览等的流程的,另外DSI RGB模式、低延时等功能我们后续文章也会再重新介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人生苦短,菜的抠脚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值