这篇文章我们介绍一下RK628作为HDMI-IN功能的调试,我们使用的主控是RK3588,使用RK628F来实现4K60的HDMI-IN功能,对应的安卓版本是安卓13。
目录
(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预览差异
TIF | camera | |
优点 | 延迟低 | 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模式、低延时等功能我们后续文章也会再重新介绍。