Извиняюсь за некропостинг, но может кому-то пригодится.
Производить чтение/запись EDID очень просто с помощью пакета i2c-tools, имеющегося во всех популярных дистрибутивах Linux. Также могут пригодиться read-edid и edid-decode. Большая база дампов EDID расположена на Github
https://github.com/linuxhw/EDIDПолучаем список имеющихся шин i2c:
i2cdetect -l
i2c-3 i2c NVIDIA i2c adapter 5 at 1:00.0 I2C adapter
i2c-1 i2c NVIDIA i2c adapter 1 at 1:00.0 I2C adapter
i2c-4 i2c NVIDIA i2c adapter 6 at 1:00.0 I2C adapter
i2c-2 i2c NVIDIA i2c adapter 2 at 1:00.0 I2C adapter
i2c-0 i2c NVIDIA i2c adapter 0 at 1:00.0 I2C adapter
Ищем EDID EEPROM на всех шинах, она отзывается по адресу 0x50.
i2cdetect -y 2
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
i2cdetect -y 4
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- 37 -- -- 3a -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- 49 -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- 59 -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Как видно выше, у меня EEPROM EDID обнаруживается на шине 2 (LVDS - это EDID EEPROM матрицы ноутбука) и 4 (HDMI - EDID EEPROM матрицы ноутбука). Если подключить ещё один монитор по VGA, его EDID EEPROM отзовётся на шине номер 3. Если вместо адреса вы видите прочерки "--" это значит, что по этому адресу никто на шине не отозвался.
Теперь мы можем снять дампы EDID нашей матрицы и монитора. Это можно сделать как минимум двумя способами - с помощью i2cdump или get-edid:
get-edid -b 2 | edid-decode
2
This is read-edid version 3.0.2. Prepare for some fun.
Attempting to use i2c interface
Only trying 2 as per your request.
128-byte EDID successfully retrieved from i2c bus 2
Looks like i2c was successful. Have a good day.
Extracted contents:
header: 00 ff ff ff ff ff ff 00
serial number: 30 e4 30 02 00 00 00 00 00 13
version: 01 03
basic params: 80 22 13 78 0a
chroma info: 62 25 9f 5d 57 9b 25 19 50 54
established: 00 00 00
standard: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
descriptor 1: 3e 1c 56 a0 50 00 16 30 30 20 35 00 58 c2 10 00 00 19
descriptor 2: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
descriptor 3: 00 00 00 fe 00 4c 47 20 44 69 73 70 6c 61 79 0a 20 20
descriptor 4: 00 00 00 fc 00 4c 50 31 35 36 57 48 32 2d 54 4c 41 41
extensions: 00
checksum: 38
Manufacturer: LGD Model 230 Serial Number 0
Made week 0 of 2009
EDID version: 1.3
Digital display
Maximum image size: 34 cm x 19 cm
Gamma: 2.20
Supported color formats: RGB 4:4:4, YCrCb 4:4:4
First detailed timing is preferred timing
Established timings supported:
Standard timings supported:
Detailed mode: Clock 72.300 MHz, 344 mm x 194 mm
1366 1414 1446 1526 hborder 0
768 771 776 790 vborder 0
-hsync -vsync
Manufacturer-specified data, tag 0
ASCII string: LG
Checksum: 0x38 (valid)
EDID block does NOT conform to EDID 1.3!
Name descriptor not terminated with a newline
Missing monitor ranges
Detailed block string not properly terminated
Я предпочитаю использовать i2cdump, так как он дампит всё содержимое, а не только первые 256 байт:
i2cdump -y 2 0x50
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 00 ff ff ff ff ff ff 00 30 e4 30 02 00 00 00 00 ........0?0?....
10: 00 13 01 03 80 22 13 78 0a 62 25 9f 5d 57 9b 25 .????"?x?b%?]W?%
20: 19 50 54 00 00 00 01 01 01 01 01 01 01 01 01 01 ?PT...??????????
30: 01 01 01 01 01 01 3e 1c 56 a0 50 00 16 30 30 20 ??????>?V?P.?00
40: 35 00 58 c2 10 00 00 19 00 00 00 00 00 00 00 00 5.X??..?........
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 fe 00 4c .............?.L
60: 47 20 44 69 73 70 6c 61 79 0a 20 20 00 00 00 fc G Display? ...?
70: 00 4c 50 31 35 36 57 48 32 2d 54 4c 41 41 00 38 .LP156WH2-TLAA.8
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
Для записи EDID EEPROM я написал следующий скрипт:
#!/bin/bash
echo "usage: $0 <I2C-BUS-ID> <EDID-BINARY>"
BUS=$1
HEX=$(hexdump -v -e '/1 "%02X "' $2)
ADR=0
for VAL in $HEX; do
echo -n "$VAL"
i2cset -y $BUS 0x50 0x$(printf '%x' $ADR) 0x$VAL
ADR=$((ADR+1))
done
echo