04、HDMI 对应驱动
一、设备树配置
RK3566 VOP2.0有3个Video Post接口,分别是VP0、VP1、VP2。
下图是RK3566 VP接口和各显示接口的连接关系,其中支持HDMI输出的有VP0、VP1接口:

二、设备树配置
希望 HDMI 连接在 vp0 上,则 dts 中需要做如下设置:
- 需要关闭用不到的那个 VOP
/* 配置hdmi使用vp0输出 */
&route_hdmi {
status = "okay";
connect = <&vp0_out_hdmi>;
};
&hdmi_in_vp0 {
status = "okay";
};
&hdmi_in_vp1 {
status = "disabled";
};
&hdmi {
status = "okay";
};2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
这个设备树描述的是与 HDMI 相关的硬件连接和状态配置。我们逐行进行解析:
三、route_hdmi
route_hdmi: route-hdmi {
status = "disabled";
logo,uboot = "logo.bmp";
logo,kernel = "logo_kernel.bmp";
logo,mode = "center";
charge_logo,mode = "center";
connect = <&vp1_out_hdmi>;
};2
3
4
5
6
7
8
&route_hdmi {
status = "okay";
connect = <&vp0_out_hdmi>;
};2
3
4
&route_hdmi是一个设备节点,表示 HDMI 路由的配置。status = "okay";表示这个节点的状态是启用的。通常在设备树中,“okay”意味着该硬件组件已经被启用并可以正常工作。connect = <&vp0_out_hdmi>;表示该节点连接到名为vp0_out_hdmi的输出节点。&vp0_out_hdmi可能是定义在其他地方的硬件接口,指向某个 HDMI 输出端口。
四、hdmi_in_vp0
&hdmi_in_vp0 {
status = "okay";
};2
3
五、hdmi
每个endpoint通过remote-endpoint属性和对应的显示接口组成一个连接通路,比如和hdmi显示接口的连接:
hdmi: hdmi@fe0a0000 {
compatible = "rockchip,rk3568-dw-hdmi";
reg = <0x0 0xfe0a0000 0x0 0x20000>;
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_HDMI_HOST>,
<&cru CLK_HDMI_SFR>,
<&cru CLK_HDMI_CEC>,
<&pmucru PLL_HPLL>,
<&cru HCLK_VOP>;
clock-names = "iahb", "isfr", "cec", "ref", "hclk";
power-domains = <&power RK3568_PD_VO>;
reg-io-width = <4>;
rockchip,grf = <&grf>;
#sound-dai-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&hdmitx_scl &hdmitx_sda &hdmitxm0_cec>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
hdmi_in_vp0: endpoint@0 {
reg = <0>;
remote-endpoint = <&vp0_out_hdmi>;
status = "disabled";
};
hdmi_in_vp1: endpoint@1 {
reg = <1>;
remote-endpoint = <&vp1_out_hdmi>;
status = "disabled";
};
};
};
};2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
&hdmi {
status = "okay";
};2
3
六、调试
6.1、VOP接口状态
cat /sys/kernel/debug/dri/0/summary


drwxr-xr-x 8 root root 0 Jan 1 1970 .
drwxr-xr-x 6 root root 0 Jan 1 1970 ..
drwxr-xr-x 2 root root 0 Jan 1 1970 HDMI-A-1
drwxr-xr-x 2 root root 0 Jan 1 1970 Writeback-1
-r--r--r-- 1 root root 0 Jan 1 1970 clients
drwxr-xr-x 3 root root 0 Jan 1 1970 crtc-0
drwxr-xr-x 3 root root 0 Jan 1 1970 crtc-1
-r--r--r-- 1 root root 0 Jan 1 1970 framebuffer
-r--r--r-- 1 root root 0 Jan 1 1970 gem_names
-r--r--r-- 1 root root 0 Jan 1 1970 internal_clients
-r--r--r-- 1 root root 0 Jan 1 1970 mm_dump
-r--r--r-- 1 root root 0 Jan 1 1970 name
-r--r--r-- 1 root root 0 Jan 1 1970 state
-r--r--r-- 1 root root 0 Jan 1 1970 summary
drwxr-xr-x 2 root root 0 Jan 1 1970 video_port0
drwxr-xr-x 2 root root 0 Jan 1 1970 video_port12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
6.2、DRM设备节点
在/dev/dri/ 目录下可以看到驱动注册的各个显卡,DRM设备节点为 /dev/dri/cardX,X为0-15的数值。

sysfs文件系统中:

card0-HDMI-A-1代表的是hdmi显示设备,是由drm_sysfs_connector_add函数创建的。查看card0-HDMI-A-1目录结构;

其中:
ddc:hdmi显示数据通道,指向i2c7,用来获取edid、hdcp密钥等内容;device:指向card0;edid:存储hdmi显示器的扩展显示标识数据;enabled:hdmi接口是否被启用或禁用;modes:连接的hdmi显示器以及当前hdmi控制器同时支持的分辨率列表;status:hdmi接口连接状态的信息;
6.2.1、查看分辨率
查看hdmi输出使能状态:
# cat /sys/class/drm/card0-HDMI-A-1/enabled
enabled2
如果将hdmi线拔掉:
# cat /sys/class/drm/card0-HDMI-A-1/enabled
disabled2
在使用cat命令读取enabled文件时调用enabled_show方法;
static ssize_t enabled_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct drm_connector *connector = to_drm_connector(device);
bool enabled;
enabled = READ_ONCE(connector->encoder);
return sysfs_emit(buf, enabled ? "enabled\n" : "disabled\n");
}2
3
4
5
6
7
8
9
10
11
6.2.2、查看**hdmi**连接状态
查看hdmi的插拔连接状态;
# cat /sys/class/drm/card0-HDMI-A-1/status
connected2
如果将hdmi线拔掉:
# cat /sys/class/drm/card0-HDMI-A-1/status
disconnected2
在使用cat命令读取status文件时调用status_show方法;
static ssize_t status_show(struct device *device,
struct device_attribute *attr,
char *buf)
{
struct drm_connector *connector = to_drm_connector(device);
enum drm_connector_status status;
status = READ_ONCE(connector->status);
return sysfs_emit(buf, "%s\n",
drm_get_connector_status_name(status));
}2
3
4
5
6
7
8
9
10
11
12
6.2.3、查查看edid
通过如下命令可以查看edid信息,一共256个字节;
root@rk3399:/# cat /sys/class/drm/card0-HDMI-A-1/edid > /data/edid.bin
root@rk3399:/# hexdump -C /data/edid.bin
00000000 00 ff ff ff ff ff ff 00 35 34 00 00 01 01 01 01 |........54......|
00000010 00 20 01 03 81 00 00 78 ee 8c 75 a9 54 45 98 22 |. .....x..u.TE."|
00000020 1e 50 54 2f cf 00 71 40 81 c0 81 80 95 00 a9 c0 |.PT/..q@........|
00000030 b3 00 d1 c0 d1 00 d3 bc 00 a0 a0 a0 29 50 30 20 |............)P0 |
00000040 35 00 b9 88 21 00 00 1a 56 5e 00 a0 a0 a0 29 50 |5...!...V^....)P|
00000050 30 20 35 00 b9 88 21 00 00 1a 67 e2 00 a0 a0 a0 |0 5...!...g.....|
00000060 29 50 30 20 35 00 b9 88 21 00 00 1a 00 00 00 fc |)P0 5...!.......|
00000070 00 4d 45 49 54 49 41 4e 48 41 4f 0a 20 20 01 0b |.MEITIANHAO. ..|
00000080 02 03 3a f2 4f 04 05 10 13 14 1f 6c 6c 6c 27 6c |..:.O......lll'l|
00000090 6c 6c 4b 4c e2 00 d5 e3 05 c0 00 23 09 7f 07 83 |llKL.......#....|
000000a0 01 00 00 67 03 0c 00 10 00 38 78 e6 06 05 01 69 |...g.....8x....i|
000000b0 69 4f 67 d8 5d c4 01 76 c0 00 02 3a 80 18 71 38 |iOg.]..v...:..q8|
000000c0 2d 40 58 2c 25 00 58 c3 10 00 00 1e d4 bc 00 a0 |-@X,%.X.........|
000000d0 a0 a0 29 50 30 20 35 00 b9 88 21 00 00 1e 98 e2 |..)P0 5...!.....|
000000e0 00 a0 a0 a0 29 50 30 20 35 00 b9 88 21 00 00 1e |....)P0 5...!...|
000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c4 |................|2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这里我们尝试通过EDID Manager工具去解析,首先需要去下载EDID Manager工具,然后将edid.bin下载到windows系统上,并加载文件解析内容如下:
6.2.4、分辨率
查看连接的hdmi显示器以及当前hdmi控制器同时支持的分辨率列表;

6.2.5、强制使能/禁用HDMI
echo on > /sys/class/drm/card0-HDMI-A-1/status
echo off > /sys/class/drm/card0-HDMI-A-1/status
echo detect > /sys/class/drm/card0-HDMI-A-1/status
6.3、/sys/kernel/debug/dw/hdmi


