본 글은 외장 모니터의 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
'프로그래밍 > Troubleshoot' 카테고리의 다른 글
[우분투] 부팅되지 않을 때 (0) | 2022.02.13 |
---|---|
[우분투] Chrome이 실행되지 않을 때 (0) | 2020.02.23 |
[우분투] 바탕 화면만 나올 때 (0) | 2019.12.15 |
[Python] ImportError: No module named 'tensorflow.examples.tutorials' (0) | 2019.10.09 |