IT News: Digital Camera, OS, Laptop, Smartphone, Smart TV, Sound...

The Author's Project by Valeri N.Kravchuk
Сайт проверен Dr.Web
Меню сайта
  • Главная страница
  • Информация о сайте
  • Дневник
  • Каталог файлов
  • Обратная связь
  • Каталог сайтов
  • FAQ
  • Доска объявлений
  • Форум
  • Фотоальбом
  • Категории раздела
    Измерительная техника, инструменты [278]
    Drones, boats, cars... [99]
    Накопители данных [186]
    Гаджеты для спорта и здоровья... [166]
    Автомобильные гаджеты... [159]
    Сети, сетевые технологии, оборудование... [211]
    Гаджеты, аксессуары... [604]
    News IT, Это интересно, ликбез... [1048]
    Linux и не только [4195]
    Windows 10... [271]
    Планшеты [738]
    Нетбуки, Ноутбуки, Ультрабуки [618]
    Смартфоны, фаблеты.. [4986]
    GPS-навигаторы, трекеры... [49]
    Видеорегистраторы [195]
    mini computers и не только... [365]
    Своими руками [322]
    CB, LPD, PMR- связь... [110]
    Smart TV, UltraHD, приставки, проекторы... [404]
    Радар-детекторы [22]
    DECT, IP-телефоны [18]
    Мультиварки, блендеры и не только... [122]
    Smart Watch [225]
    Блоки питания, Power Banks, зарядки... [340]
    Sound: наушники, плееры, усилители... [568]
    Безопасность IT [478]
    Электронные книги [75]
    Роботы-пылесосы [26]
    electric cars [28]
    Фотокамеры, объективы, искусство фотографии.. [433]
    Время

    Интересные ссылки

    COMPIZOMANIA

    Наш опрос
    Оцените мой сайт
    Всего ответов: 1243
    Статистика
    Анализ веб сайтов

    Яндекс.Метрика

    Рейтинг@Mail.ru Яндекс цитирования

    Russian America Top. Рейтинг ресурсов Русской Америки.

    eXTReMe Tracker

    Правильный CSS!


    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Locations of visitors to this page
    Форма входа
    Главная » 2014 » Март » 31 » Патчим EDID телевизора из-под Linux
    11:08
    Патчим EDID телевизора из-под Linux

    Патчим EDID телевизора из-под Linux

    LG 32LG5000

    Мой телевизор («старая» модель LG 32LG5000) никогда не работал в Linux. Каждый раз, когда я подключал его через HDMI-порт, ядро сообщало мне ошибку:

    kernel: [ 869.677850] [drm:drm_edid_block_valid] *ERROR* EDI has major version 2, instead of 1


    и полностью игнорировало его.

    Эта проблема меня не сильно-то и беспокоила, т.к. я не часто им пользовался, да и VGA-порт работал, хоть и с максимальным разрешением 1360×768. Однако сегодня, когда я решил посмотреть фильм, качество вывода через VGA было невероятно хреновым, и я решил с этим покончить.
     

    Анализируем EDID


    Для тех, кто не знает, EDID — небольшое количество данных, содержащих в себе информацию о возможностях монитора, в основном разрешения и тайминги, которые он поддерживает. Сообщение об ошибке интересно тем, что в нем говорится об EDID 2.0, которого (почти) никогда не существовало. Вот что нам говорит Wikipedia:

    Структура EDID имеет версии от v1.0 до v1.4 размером в 128 байт, каждая последующая версия обратно совместима с предыдущей. Структура EDID v2.0 была размером 256 байт, однако позже была объявлена устаревшей и на замену ей пришла v1.3.


    Похоже, EDID 2.0 был объявлен устаревшим где-то в 2000. Довольно забавно, что ТВ 2008 года использовал именно эту версию.

    После непродолжительного гуглинга, я нашел сообщения об ошибке EDID в этой модели, и что на самом деле это EDID 1.3. Я попробовал обновить прошивку на последнюю версию, однако это никак не помогло. Итак, у меня было два выхода:

    1. Пропатчить ядро и убрать проверку версии. Это некрасиво, да и придется, как минимум, drm-модуль пересобирать с каждым обновлением ядра.
    2. Пропатчить EDID и заставить либо ядро, либо ТВ использовать его.


    Я жаждил приключений, поэтому выбрал второе. Загружаем модуль i2c-dev получаем прямой i2c доступ к EDID, используем get-edid:

    # get-edid > /tmp/edid.bin
    This is read-edid version 3.0.1. Prepare for some fun.
    Attempting to use i2c interface
    No EDID on bus 0
    No EDID on bus 1
    No EDID on bus 2
    No EDID on bus 4
    No EDID on bus 5
    No EDID on bus 7
    2 potential busses found: 3 6
    Will scan through until the first EDID is found.
    Pass a bus number as an option to this program to go only for that one.
    256-byte EDID successfully retrieved from i2c bus 3
    Looks like i2c was successful. Have a good day.


    Получили EDID из i2c bus 3. Теперь посмотрим, что же там.

    # parse-edid < /tmp/edid.bin
    Checksum Correct
    
    Section "Monitor"
     Identifier "32LG5000"
     ModelName "32LG5000"
     VendorName "GSM"
     # Monitor Manufactured week 9 of 2008
     # EDID version 2.0
     # Digital Display
     DisplaySize 700 390
     Gamma 2.20
     Option "DPMS" "true"
     Horizsync 28-67
     VertRefresh 50-75
     # Maximum pixel clock is 150MHz
     #Not giving standard mode: 640x480, 60Hz
     #Not giving standard mode: 800x600, 60Hz
     #Not giving standard mode: 1024x768, 60Hz
     #Not giving standard mode: 1920x1080, 60Hz
    
     #Extension block found. Parsing...
     Modeline "Mode 16" +hsync +vsync
     Modeline "Mode 0" -hsync -vsync
     Modeline "Mode 1" -hsync +vsync
     Modeline "Mode 2" 27.027 720 736 798 858 480 489 495 525 -hsync -vsync
     Modeline "Mode 3" 27.000 720 732 796 864 576 581 586 625 -hsync -vsync
     Modeline "Mode 4" 25.200 640 656 752 800 480 490 492 525 -hsync -vsync
     Modeline "Mode 5" 27.027 720 736 798 858 480 489 495 525 -hsync -vsync
     Modeline "Mode 6" 27.000 720 732 796 864 576 581 586 625 -hsync -vsync
     Modeline "Mode 7" 74.250 1280 1720 1760 1980 720 725 730 750 +hsync +vsync
     Modeline "Mode 8" 74.250 1280 1390 1420 1650 720 725 730 750 +hsync +vsync
     Modeline "Mode 9" 74.250 1920 2448 2492 2640 1080 1082 1089 1125 +hsync +vsync interlace
     Modeline "Mode 10" 74.250 1920 2008 2052 2200 1080 1082 1087 1125 +hsync +vsync interlace
     Modeline "Mode 11" 74.250 1920 2448 2492 2640 1080 1084 1089 1125 +hsync +vsync
     Modeline "Mode 12" 148.500 1920 2448 2492 2640 1080 1084 1089 1125 +hsync +vsync
     Modeline "Mode 13" 74.250 1920 2558 2602 2750 1080 1084 1089 1125 +hsync +vsync
     Modeline "Mode 14" 74.250 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync
     Modeline "Mode 15" 148.500 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync
     Modeline "Mode 17" +hsync +vsync
     Modeline "Mode 18" +hsync +vsync interlace
     Modeline "Mode 19" -hsync -vsync
     Option "PreferredMode" "Mode 16"
    EndSection


    Убеждаемся, что это правильный EDID, по идентификатору модели. Видим EDID version 2.0, которую сообщает parse-edid, на что собственно ядро и ругается. Также можем видеть, что parse-edid нашел блок с таймингами и разрешениями, которые ТВ поддерживает. Теперь взглянем на RAW-данные:

    # hd /tmp/edid.bin
    00000000 00 ff ff ff ff ff ff 00 1e 6d f0 75 01 01 01 01 |.........m.u....|
    00000010 09 12 02 00 80 46 27 78 ea d9 b0 a3 57 49 9c 25 |.....F'x....WI.%|
    00000020 11 49 4b a5 6e 00 31 40 45 40 61 40 d1 c0 01 01 |.IK.n.1@E@a@....|
    00000030 01 01 01 01 01 01 26 36 80 a0 70 38 1f 40 50 20 |......&6..p8.@P |
    00000040 85 00 bc 86 21 00 00 18 1b 21 50 a0 51 00 1e 30 |....!....!P.Q..0|
    00000050 48 88 35 00 bc 86 21 00 00 1c 00 00 00 fc 00 33 |H.5...!........3|
    00000060 32 4c 47 35 30 30 30 0a 20 20 20 20 00 00 00 fd |2LG5000. ....|
    00000070 00 32 4b 1c 43 0f 00 0a 20 20 20 20 20 20 01 f9 |.2K.C... ..|
    
    00000080 02 03 21 f1 4e 02 11 01 03 12 13 04 14 05 21 1f |..!.N.........!.|
    00000090 20 22 10 23 09 07 07 83 01 00 00 65 03 0c 00 30 | ".#.......e...0|
    000000a0 00 01 1d 00 bc 52 d0 1e 20 b8 28 55 40 c4 8e 21 |.....R.. .(U@..!|
    000000b0 00 00 1e 01 1d 00 72 51 d0 1e 20 6e 28 55 00 c4 |......rQ.. n(U..|
    000000c0 8e 21 00 00 1e 01 1d 80 d0 72 1c 16 20 10 2c 25 |.!.......r.. .,%|
    000000d0 80 c4 8e 21 00 00 9e 8c 0a d0 90 20 40 31 20 0c |...!....... @1 .|
    000000e0 40 55 00 c4 8e 21 00 00 18 4e 1f 00 80 51 00 1e |@U...!...N...Q..|
    000000f0 30 40 80 37 00 bc 88 21 00 00 18 00 00 00 00 ac |0@.7...!........|
    00000100


    EDID состоит из 2 секций, каждая размером по 128 байт (мы же помним, что это EDID 1.3, некорректно названый 2.0).
    Первая секция основная, а вторая — дополнительная, EIA/CEA-861 extension block, которая содержит информацию о разрешениях и таймингах. Используя статью в Wikipedia понимаем, что байты по смещению 0x12 и 0x13 содержат версию EDID (0x02 и 0x00 в нашем случае), а смещение 0xf7 содержит контрольную сумму (0xf9).
     

    Патчим EDID наживую


    По идее, если мы заменим значения по смещению 0x12 и 0x13 на 0x01 и 0x03 соответственно и подправим контрольную сумму, мы получим правильный EDID. Это легко можно сделать в HEX-редакторе; контрольную сумму установим в 0xf7 (сумма всех 128 байт по модулю 256 должна быть равна нулю).
    Попробуем распарсить измененный EDID:

    $ diff -u <(parse-edid </tmp/edid.bin) <(parse-edid </tmp/edid-fixed.bin)
    Checksum Correct
    
    Checksum Correct
    
    --- /proc/self/fd/11 2014-03-22 02:18:52.614474422 +0200
    +++ /proc/self/fd/12 2014-03-22 02:18:52.614474422 +0200
    @@ -3,7 +3,7 @@
     ModelName "32LG5000"
     VendorName "GSM"
     # Monitor Manufactured week 9 of 2008
    - # EDID version 2.0
    + # EDID version 1.3
     # Digital Display
     DisplaySize 700 390
     Gamma 2.20



    Теперь, когда у нас есть правильный EDID, нам нужно как-то попробовать записать его в телевизор (да и, похоже, есть люди, у которых это получалось). В Debian есть пакет i2c-tools, в котором есть утилиты i2cget для чтения и i2cset для записи в I²C-устройство. Вспомним, что get-edid читал из шины 3, а EDID находится по адресу 0x50, так что давайте попробуем прочитать наши байты напрямую:

    # for byte in 0x12 0x13 0x7f; do i2cget -y 3 0x50 $byte; done
    0x02
    0x00
    0xf9


    Получилось! Невзирая на риск брикнуть (и так бесполезный) HDMI-порт, я решил перезаписать байты напрямую.

    Внимание! Повторяйте это действие на свой страх и риск и только если понимаете возможные последствия. Вас предупреждали.

     

    # i2cset -y 3 0x50 0x12 0x01
    # i2cset -y 3 0x50 0x13 0x03
    # i2cset -y 3 0x50 0x7f 0xf7


    Никаких ошибок нет. Проверим, получилось ли:

    $ xrandr -q
    Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
    eDP1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 294mm x 165mm
     1920x1080 60.0*+ 59.9 40.0
     1680x1050 60.0 59.9
     1600x1024 60.2
     1400x1050 60.0
     1280x1024 60.0
     1440x900 59.9
     1280x960 60.0
     1360x768 59.8 60.0
     1152x864 60.0
     1024x768 60.0
     800x600 60.3 56.2
     640x480 59.9
    VGA1 disconnected (normal left inverted right x axis y axis)
    HDMI1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 700mm x 390mm
     1920x1080 60.0*+ 60.0 50.0 59.9 30.0 25.0 24.0 30.0 24.0
     1920x1080i 60.1 50.0 60.0
     1360x768 59.8
     1280x768 60.4
     1280x720 60.0 50.0 59.9
     1024x768 75.1 70.1 60.0
     832x624 74.6
     800x600 75.0 60.3
     720x576 50.0
     720x480 60.0 59.9
     640x480 75.0 60.0 59.9 59.9
     720x400 70.1
    DP1 disconnected (normal left inverted right x axis y axis)


    Ага! У меня получилось выставить разрешение 1080p через xrandr. Похоже, изменение постоянное, так что не придется каждый раз перезаписывать байты при каждом выключении ТВ.

    От переводчика: на этом ТВ матрица с разрешением 1366×768, поэтому не совсем понятно, откуда такое желание выставить 1920×1080, оно все равно через скейлер пойдет.

    http://habrahabr.ru/post/217583/

    Категория: Linux и не только | Просмотров: 379 | Добавил: laptop | Рейтинг: 4.0/1
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Волк слабее льва и тигра, но в цирке волк не выступает!
    Волк слабее льва и тигра, но в цирке волк не выступает!
    Волк - единственный из зверей, который может пойти в бой на более сильного противника.
    Если же он проиграл бой, то до последнего вздоха смотрит в глаза противника. После этого умирает...

    Праздники сегодня

    Погода
    Погода в Нью-Йорке Погода в Бреcте
    Поиск
    Календарь
    Архив записей
    Друзья сайта
  • Официальный блог
  • JEEP - the best! Mercedes - the best! Автомобильный портал города Бреста: технические характеристики с фото, авторынок, автоспорт...
    Наша кнопка
    IT новости с моего лаптопа...

    Внимание!
    Администратор сайта laptop.ucoz.ru не несет ответственности за содержание рекламных объявлений. Все используемые на сайте зарегистрированные товарные знаки принадлежат своим законным владельцам! Используемая со сторонних источников информация публикуется с обязательными ссылками на эти источники.
    Copyright Valeri N.Kravchuk © 2007-2019