本文基於RockPI 4A
單板Debian
系統Linux 4.4內核DRM框架介紹HDMI
接口 EDID
獲取方法。ubuntu
1、EDID介紹
EDID(Extended display identification data)
:擴展顯示器識別數據,通常存儲在顯示器的EEPROM
中。數據結構
在EDID1.0->EDID1.3
版本中,EDID
的容量是128Byte,從EDID1.3
版本之後,數據容量擴展到256Byte。框架
通常經過DDC
(或I2C
)通道讀取EDID
,從設備地址是0x50
。ide
EDID1.3
版本的數據結構見下圖:函數
2、EDID獲取
應用程序調用libdrm
代碼中的drmModeGetConnector()
函數,經過ioctl
傳遞宏DRM_IOCTL_MODE_GETCONNECTOR
通知Linux內核要獲取相關數據(包括EDID
)。測試
在Linux內核中,若是定義了宏CONFIG_DRM_LOAD_EDID_FIRMWARE
,內核會先調用drm_load_edid_firmware()
函數,從/lib/firmware
路徑下的對應文件中讀取EDID
數據;若讀取失敗或未定義宏CONFIG_DRM_LOAD_EDID_FIRMWARE
,內核經過DDC
通道和顯示器進行通訊,獲取EDID
數據。spa
一、EDID獲取流程3d
注:上面流程圖中提到了DRM Connector
的一些函數,後續介紹Connector
的初始化過程。調試
二、DDC通訊流程code
三、EDID調試
可經過下面兩種方法顯示EDID
數據。
1)、系統dump
## 一、進入單板系統 root@linaro-alip:/sys/class/drm/card0-HDMI-A-1# ls audioformat device edid mode power subsystem content_protection dpms enabled modes status uevent root@linaro-alip:/sys/class/drm/card0-HDMI-A-1# cat edid > edid.bin ## 二、若是單板系統沒有hexdump命令,則拷貝到pc root@ubuntu:/home/run/code# hexdump -C -n 256 edid.bin 00000000 00 ff ff ff ff ff ff 00 41 0c 55 55 01 01 01 01 |........A.UU....| 00000010 0a 19 01 03 80 79 44 78 2a 16 4d 9f 5a 52 9f 26 |.....yDx*.M.ZR.&| 00000020 0e 47 4a a1 08 00 95 00 b3 00 01 01 01 01 01 01 |.GJ.............| 00000030 01 01 01 01 01 01 02 3a 80 18 71 38 2d 40 58 2c |.......:..q8-@X,| 00000040 45 00 b9 a8 42 00 00 1e 66 21 50 b0 51 00 1b 30 |E...B...f!P.Q..0| 00000050 40 70 36 00 b9 a8 42 00 00 18 00 00 00 fd 00 14 |@p6...B.........| 00000060 4c 1e 53 0f 00 0a 20 20 20 20 20 20 00 00 00 fc |L.S... ....| 00000070 00 50 68 69 6c 69 70 73 20 54 56 0a 20 20 01 2d |.Philips TV. .-| 00000080 02 03 28 f1 4d 1f 90 14 05 13 04 02 03 20 01 12 |..(.M........ ..| 00000090 06 07 29 09 07 07 15 07 50 57 06 00 83 01 00 00 |..).....PW......| 000000a0 67 03 0c 00 10 00 b0 2d 02 3a 80 18 71 38 2d 40 |g......-.:..q8-@| 000000b0 58 2c 25 00 b9 a8 42 00 00 1e 8c 0a a0 14 51 f0 |X,%...B.......Q.| 000000c0 16 00 26 7c 43 00 b9 a8 42 00 00 98 01 1d 80 18 |..&|C...B.......| 000000d0 71 1c 16 20 58 2c 25 00 b9 a8 42 00 00 9e 8c 0a |q.. X,%...B.....| 000000e0 d0 8a 20 e0 2d 10 10 3e 96 00 b9 a8 42 00 00 18 |.. .-..>....B...| 000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3d |...............=| 00000100
2)、modetest命令
使用modetest
命令前,先中止使用/dev/dri/card0
節點的應用程序。
在「Linux DRM那些事-libdrm調試準備」中,提到使用killall
命令,後續調試時發現比較麻煩(緣由:系統會自啓動桌面顯示)。能夠使用systemctl
命令,中止桌面顯示服務,而後使用modetest
命令測試。
## 1.中止桌面顯示 root@linaro-alip:~# systemctl stop lightdm.service [ 682.983722] rockchip-vop ff900000.vop: [drm:vop_crtc_enable] Update mode to 1024x768p60, type: 11 ## 2.modetest測試 root@linaro-alip:~# ./modetest trying to open device 'rockchip'...done Encoders: id crtc type possible crtcs possible clones 87 61 TMDS 0x00000001 0x00000000 Connectors: id encoder status name size (mm) modes encoders 88 87 connected HDMI-A-1 1210x680 26 87 modes: name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot) 1920x1080 60 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: preferred, driver 1920x1080 60 1920 2008 2052 2200 1080 1082 1087 1125 148500 flags: phsync, pvsync; type: driver ... props: 1 EDID: flags: immutable blob blobs: value: 00ffffffffffff00410c555501010101 0a190103807944782a164d9f5a529f26 0e474aa108009500b300010101010101 010101010101023a801871382d40582c 4500b9a84200001e662150b051001b30 40703600b9a842000018000000fd0014 4c1e530f000a202020202020000000fc 005068696c6970732054560a2020012d 020328f14d1f90140513040203200112 06072909070715075057060083010000 67030c001000b02d023a801871382d40 582c2500b9a84200001e8c0aa01451f0 1600267c4300b9a842000098011d8018 711c1620582c2500b9a84200009e8c0a d08a20e02d10103e9600b9a842000018 0000000000000000000000000000003d ... ## 3.恢復桌面顯示 root@linaro-alip:~# systemctl start lightdm.service