Linux DRM那些事-HDMI接口EDID獲取

本文基於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,從設備地址是0x50ide

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
相關文章
相關標籤/搜索