본 글은 외장 모니터의 EDID를 읽어서 정상인 경우에만 연결하지 않고, 무조건 연결하는 방법에 대한 것입니다.

 

외장 모니터(HDMI)를 잘 쓰다가, 갑자기 연결이 되지 않는 문제가 발생했습니다.

 

xrandr 명령어를 이용하면 HDMI가 연결되지 않았습니다.

$ xrandr
...
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)

dmesg로 확인해 보니 아래와 같은 메시지를 확인할 수 있었습니다.

[00] BAD  00 ff ff ff ff ff ff 00 05 e3 53 23 ec 02 00 00
[00] BAD  28 15 01 03 80 33 1d 78 2a 6e 95 a3 54 4f 9f 26
[00] BAD  00 50 54 bf ef 00 d1 c0 b3 00 95 00 81 80 81 40
[00] BAD  81 c0 01 01 01 01 02 3a 80 18 71 38 2d 40 58 2c
[00] BAD  45 00 fd 1e 11 00 00 1e 00 00 00 fd 00 32 4c 1e
[00] BAD  53 11 00 0a 20 20 20 20 20 20 00 00 00 fc 00 32
[00] BAD  33 35 33 0a 20 20 20 20 20 20 20 20 00 00 00 ff
[00] BAD  00 41 49 4a 42 41 4f 41 30 30 30 37 34 38 01 05

때로는 메시지 위에 "EDID is invalid:"라는 메시지가 보이기도 했습니다.

 

EDID(위키피디아)는 모니터 정보를 PC에 전달하는 것으로, 결론적으로 EDID 에러 때문에 PC가 외장 모니터를 인식하지 못하는 이슈입니다.

EDID는 EEPROM에 저장되는데 문제가 발생하기도 하는 것 같습니다. - "Some people say hot-plugging the cables can cause corruption."(링크 1)

링크 2를 참고해서, 아래 명령을 실행했지만 edid.bin이 생성되지 않았습니다. (read-edid edid-decode 설치 후 실행)

$ sudo get-edid -m 0 > edid.bin

그래서, 앞서 dmesg로 확인한 EDID를 c 프로그램을 이용해서 binary 파일(edid.bin)을 생성하고 아래 명령을 수행해 보았습니다.

$ parse-edid < edid.bin
Partial Read... Try again

EDID는 256 bytes 인데, 128 bytes만 변환해서 나오는 에러입니다. 나머지 128 bytes를 모두 0으로 채워서 edid.bin을 생성한 후 명령어를 실행하면,

$ parse-edid < edid.bin
WARNING: Checksum failed
Trying to continue...
Section "Monitor"
...

모니터에 대한 정보는 잘 나오는데, Checksum에러가 발생한 것을 확인할 수 있었습니다.

다시 아래 명령을 실행하면,

$ cat edid.bin | edid-decode
edid-decode (hex):
...
Has 1 extension block
Checksum: 0x5 (should be 0x16)
...

Checksum이 원래 0x16이어야 하는데 0x5로 잘못되었다는 내용을 확인할 수 있습니다.

위키피디아를 확인하면 Checksum의 위치는 128 bytes의 맨 마지막 byte입니다.

이를 0x05 -> 0x16으로 변경 후 edid.bin을 새로 생성해서 위 명령들을 수행하면 정상적으로 수행되는 것을 확인할 수 있었습니다.

 

결론적으로 외부 모니터로부터 EDID를 읽었는데 Checksum이 틀려서 발생하는 문제였습니다.

 

링크 3을 참조하면, edid.bin 파일은 /lib/firmware/에 위치하는 것으로 보입니다. 그래서 아래 명령어로 edid.bin을 복사했습니다.

$ cp edid.bin /lib/firmware/edid.bin

그리고 링크 2를 참고해서 grub을 변경했습니다.

$ sudo vi /etc/default/grub

# 원래 내용
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# 수정 내용
GRUB_CMDLINE_LINUX_DEFAULT="drm.edid_firmware=HDMI-A-1:edid.bin video=HDMI-A-1:D quiet splash"

위 명령어는 /lib/firmware/ 폴더에 있는 edid.bin 파일을 이용해서 HDMI-A-1를 연결하겠다는 내용으로 이해됩니다.

내용을 저장한 후 grub을 업데이트 해 줍니다.

$ sudo update-grub

이후 다시 부팅했더니 외부 모니터가 정상 동작합니다.

 

[주의사항]

노트북에서 사용하다 보니 문제점을 확인했습니다.

강제로 EDID를 인식시키는 방법이므로, 외장 모니터가 연결되어 있지 않아도 외장 모니터가 있다고 인식합니다.

따라서 어플리케이션이 다른 화면에 나타나서 컨트롤이 어려울 수 있고, 마우스의 움직임도 이상합니다.

이때는 grub에서 예전에 사용하던 설정으로 변경하여 EDID 파일을 사용하지 않도록 했습니다.

EDID를 외장모니터에 직접 write하는 것도 방법이라고 하는데, 해당 방법은 아직 진행하지 못했습니다.

 

- End -

 

링크 1) https://wiki.debian.org/RepairEDID

링크 2) https://kodi.wiki/view/Archive:Creating_and_using_edid.bin_via_xorg.conf

링크 3) https://askubuntu.com/questions/1011098/how-to-eliminate-edid-checksum-errors

 

반응형

+ Recent posts