LINUX.ORG.RU

Принудительно выставить разрешение экрана

 , , , ,


0

3

Имеется одноплатный компьютер olimex A10, на котором стоит кастомный образ armbian'а на базе убунты 14.04

Через hdmi подключен дисплей с тачскрином (тачскрин и питание - по usb), его нормальное разрешение - 800x480. До вчерашнего дня, если дисплей был нормально запитан - еще в загрузчике подхватывался нормальный видеорежим (а если usb дополнительно не питать, или воткнуть в сам одноплатник, а не внешний хаб - тогда видеорежим неправильный, навскидку 1024x768).

И вот сегодня утром все должно быть нормально, но видеорежим нормальный не выставляется, а u-boot пишет что:

edid block 0 checksum error

Попробовал так:

root@lime-a10:~# get-edid
This is read-edid version 3.0.1. Prepare for some fun.
Attempting to use i2c interface
No EDID on bus 0

Написал /usr/share/X11/xorg.conf.d/60-screen.conf

Section "Device"
    Identifier          "main"
    Driver              "fbdev"
    Option "UseEDID"    "False"
EndSection

Section "Monitor"
    # 800x480 @ 60.00 Hz (GTF) hsync: 29.82 kHz; pclk: 29.58 MHz
    Identifier          "LCD_800x480"
    Modeline            "800x480_60.00"  29.58  800 816 896 992  480 481 484 497  -HSync +Vsync
EndSection

Section "Screen"
    Identifier          "Screen0"
    Monitor             "LCD_800x480"
    Device              "main"
    DefaultDepth         24
    SubSection          "Display"
        Depth            24
        Modes           "800x480_60.00"
    EndSubSection
EndSection

Все без толку. Как принудительно дать понять ему, что нужно разрешение 800x480? Мерцания нет.

★★

Ответ на: комментарий от darkenshvein

xrandr не работает, пробовал его еще месяц назад со штатным образом дебиана, который рекомендуется для одноплатника.

wolph ★★ ()
Ответ на: комментарий от Elyas

Как? У rasbian'а есть файлик /boot/config.txt, куда можно вписывать разные параметры, в том числе и по hdmi и usb. Тут и близко нет ничего такого.

wolph ★★ ()
Ответ на: комментарий от darkenshvein
$ xrandr --newmode "800x480_60.00" 29.58 800 816 896 992 480 481 484 497 -HSync +Vsync
xrandr: Failed to get size of gamma for output default

$ xrandr --addmode default "800x480_60.00"
xrandr: Failed to get size of gamma for output default

$ xrandr --output default --mode 800x480_60.00
xrandr: Failed to get size of gamma for output default
xrandr: Configure crtc 0 failed
wolph ★★ ()
Ответ на: комментарий от darkenshvein

Ну раньше держало, когда режим сам подхватывался.

wolph ★★ ()
Ответ на: комментарий от wolph

Как это нет?

hdmi_edid_file when set to 1, will read the edid data from the edid.dat file instead of from the monitor.[1]

hdmi_edid_file=1

Это как раз для ядра по факту

Elyas ★★★★★ ()
Ответ на: комментарий от anonymous

Попросил пропаять разъем на одноплатнике - не помогло, ничего не изменилось. Кабель нормальный и короткий - 10см всего, а дисплей вообще идеальный.

Есть вообще способ выдрать этот edid иначе и скормить ядру без попыток прочитать его?

wolph ★★ ()

1. Покажи лог, снятый без xorg.conf (на pastebin.com выложи).

Написал /usr/share/X11/xorg.conf.d/60-screen.conf

2. И этот лог, когда ты свой xorg.conf написал, покажи на всякий случай.

3. Что за монитор? Модель, спецификация.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1 )
Ответ на: комментарий от wolph

Если аппаратуру невозможно починить, следует указать необходимые параметры (разрешение или EDID) либо прямо драйверу фреймбуфера в ядре, либо drm_kms_helper

Elyas ★★★★★ ()

правильно говорят насчет xrandr, однако перед его использованием надо новый режим добавлять, иначе будет ругаться на его отсутствие. Как добавить режим не помню, мб потом загуглю...

reprimand ★★★★★ ()
Ответ на: комментарий от reprimand

В винде одной утилитой удалось выдрать это http://pastebin.com/BFQjYppR

Там, кстати, разрешение тоже не подхватывается - дефолт 1024x768, получается поставить 640x480 или 800x640.

128 байт сырого EDID'а там есть. Где искать, как их скормить иксам или ядру?

wolph ★★ ()
Ответ на: комментарий от reprimand

Я это уже пробовал - смотри сообщения в самом верху. И режим добавлял, при попытке его использовать -

Configure crtc 0 failed

wolph ★★ ()
Ответ на: комментарий от wolph

В винде одной утилитой удалось выдрать это http://pastebin.com/BFQjYppR

Странный какой-то EDID. Основной режим есть, я могу написать для него правильный ModeLine. Но вот параметры монитора (частоты) - все нули почему-то. То есть максимальные значения 0, поэтому автоматом, скорее всего, и винды, и Xorg переходят в режимы default (то есть VESA).

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Что самое смешное - этот экранчик уже работал в своем нормальном режиме - недели две, вплоть до сегоднчшнего дня. И автоматом, без телодвижений. И перестал на ровном месте. Магия, блин.

wolph ★★ ()
Ответ на: комментарий от wolph

Попробуй так, но fbdev не умеет выставлять тайминги по ModeLine. Он берет данные из того, что ядро поставило. Поэтому прописывать режим надо в ядро. ModeLine я тебе восстановил по EDID. А диапазоны горизонтальной частоты и частоты кадров подобрал.

Section"Monitor"
  Identifier "<default monitor>"
  HorizSync 32-61
  VertRefresh 50-70
  Option "PreferredMode" "800x480_65.00"
  ModeLine "800x480_65.00" 32.00 800 840 888 928 480 493 496 525 +hsync +vsync
EndSection

UPD. Поправил на 65 Гц.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 6 )
Ответ на: комментарий от wolph

Я тут поправил строчку ModeLine. Ошибся пару раз. И еще "-vsync -hsync" попробуй.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1 )
Ответ на: комментарий от wolph

Что самое смешное - этот экранчик уже работал в своем нормальном режиме - недели две, вплоть до сегоднчшнего дня.

Хм.Бывает так, что запарывается EDID, хотя это редко. То, что ты его получил в виндах, говорит о том что кабель не нарушен. А вот то, что никто ничего выставлять не хочет, говорит о том, что где-то беда. Пока я думаю, что он смущается от нулевых диапазонов входных частот. А если они раньше были другими, а сейчас нулевые, то, может, они затерлись? Но тогда все равно странно - должна не сойтись контрольная сумма EDID и он бы написал, что EDID Check sum error или что-то в этом роде.

Zubok ★★★★★ ()

И вот сегодня утром все должно быть нормально, но видеорежим нормальный не выставляется, а u-boot пишет что:

edid block 0 checksum error

Ай, вот он и пишет! У тебя в посте об этом, а я сам написал, что должен написать, а потом еще раз перечитал. Ну, тогда все понятно. Тогда ясно, что тебя как раз испортился EDID в мониторе. И прописались нули в диапазоны частот.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2 )
Ответ на: комментарий от Zubok

Но тогда все равно странно - должна не сойтись контрольная сумма EDID и он бы написал, что EDID Check sum error или что-то в этом роде.

Так и есть - загрузчик одноплатника пишет, что у EDID не сошлась контрольная сумма.

А до понедельника я конфиг попробовать не могу - и одноплатник, и экраник рабочие, а не личные.

Вопрос в другом - возможно ли в принципе работа экрана с нормальным режимом без EDID, принудительно. Одноплатник с экраном будет использоваться как сенсорная панель для промышленного оборудования, таких будет 3 штуки, так что если что то запорото - можно будет стянуть с других экземпляров, а для отладки обойтись и обычным LCD с резистивным экраном.

wolph ★★ ()
Ответ на: комментарий от wolph

Возможно ли утянуть EDID с другого экземпляра экрана, и перезаписать-восстановить первый?

Утянуть-то можно без проблем. Это будет файл 128 байт. А вот перезаписать - сомневаюсь, но все может быть. Это либо надо через программатор, либо у производителя какие-то утилиты сервисные могут быть. Но это надо у них спросить. Если у вас есть электронщики в штате, то могут глянуть.

А можно не заморачиваться, а попробовать со стороны компьютера решить. Варианта два:

1. Подсунуть рабочий EDID от такого же монитора.

2. Прописать ModeLine и необходимые параметры вручную. Уточнить строчку выше, можно списав EDID из рабочих моников и распарсив их. Тогда с параметрами монитора по частотам гадать не придется.

Если есть такие же мониторы, то самый лучший способ - утащить из них EDID и его подсовывать. Вот для начала попробовать так:

https://wiki.archlinux.org/index.php/Kernel_mode_setting#Forcing_modes_and_EDID

Если не получится, то уже дальше думать будем.

Zubok ★★★★★ ()
Ответ на: комментарий от wolph

И, кстати, я внезапно вспомнил, что тут была интересная тема, как запоролса EDID программно. Видимо, EEPROM не защищена от записи и EDID испортила программа опроса шины i2c по адресу 0x50. Вот эта тема:

Как исправить EDID?

У меня есть предположение, что что-то такое и у тебя могло произойти. Вообще, интересная ситуация:

Как исправить EDID? (комментарий)

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2 )
Ответ на: комментарий от Zubok

Дисплей питается от usb, он же используется для тачскрина. От порта самого одноплатника тока не хватает - дисплей может плеваться полосами, а lsusb не видит тачскрина. Поэтому он подключается через usb-хаб, который имеет дополнительное питание. Я думаю, что не вынул вилку хаба из розетки, и при выключенном одноплатнике но поданном питании экран мог пробыть до следующего дня.

Это могло запороть EDID? Больше вроде с ним ничего не происходило, абсолютно.

wolph ★★ ()
Ответ на: комментарий от wolph

Это могло запороть EDID? Больше вроде с ним ничего не происходило, абсолютно.

Так это не с ним. Шина DDC - это i2c. Быть может, что запускались какие-то утилиты, которые опрашивают i2c порты. Типа пакета lm-sensors. Типа датчики на борде.

Это могло запороть EDID? Больше вроде с ним ничего не происходило, абсолютно.

Как-то сомневаюсь. НУ и что, что питание подано.

Запусти i2cdetect -l . Что пишет? Это пакет i2c-tools в Debian. Какой тебя дистр - не знаю.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 2 )
Ответ на: комментарий от Zubok

Нет, ничего такого не было. Когда уходил - видеорежим был нормальный, а на следующее утро - уже нет. Но ранее видеорежим не подхватывался, если в момент включения одноплатника питания на usb не хватало. Теперь не подхватывается вообще никогда.

Тогда наверное дождусь, как придут остальные экземпляры, надеюсь с ними все будет ок. Стяну EDID оттуда и уже буду смотреть, что можно сделать.

wolph ★★ ()
Ответ на: комментарий от Zubok

Это пакет i2c-tools в Debian. Какой тебя дистр - не знаю.

Armbian 4.5, на базе ubuntu 14.04. Образ самосборный - в дефолтном не хватало пары модулей ядра для работы тачскрина.

wolph ★★ ()
Ответ на: комментарий от wolph

Нет, ничего такого не было. Когда уходил - видеорежим был нормальный, а на следующее утро - уже нет.

Так EDID мог убиться как раз перед выключением. Если в процессе работы испортится EDID, то ты этого не заметишь, так как он будет считываться только при следующей загрузке. а в текущей сессии все будет ок. Ты нормально поработаешь на монике, выключишь, и только при следующем запуске узнаешь, что что-то не так. Надо вообще посмотреть, доступна ли вообще шина DDC программно, есть ли она в списке i2cdetect -l.

А сенсоры в теории может дергать любая утилита из твоего дистра, которая, например, температурку измеряет. Опросила датчики, нарвалась на открытый порт 0x50.

UPD. Вот припомни, что ты устанавливал и запускал в последней сессии перед выключением. Может, какие-то плагины к среде добавлял или еще что.

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 4 )
Ответ на: комментарий от wolph

Но ранее видеорежим не подхватывался, если в момент включения одноплатника питания на usb не хватало. Теперь не подхватывается вообще никогда.

Может, и сейчас не хватает, но теперь на постоянной основе, включай его или нет. Обрыв какой-нибудь или питание подгорело где-то. В общем, эту версию тоже как-то перепроверь. Попробуй на другом компе через Y-кабель USB.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Запусти i2cdetect -l . Что пишет? Это пакет i2c-tools в Debian. Какой тебя дистр - не знаю.

i2c-0  unknown  mv64xxx_i2c adapter N/A
wolph ★★ ()
9 декабря 2015 г.

Бамп вопросу. Подключил другой экранчик, исправный - на нем видеорежим сам подхватывается. Что делать то?

Попробовал править /boot/boot.scr - добавлял в аргументы disp.screen0_output_mode=800x480p60, эффекта ноль.

Грепал логи Xorg - текущий моделайн найти нигде не могу. Магия.

root@lime-a10:~# i2cdetect -l
i2c-0   i2c             mv64xxx_i2c adapter                     I2C adapter
root@lime-a10:~# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@lime-a10:~# i2cdump -y 0 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: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
root@lime-a10:~# xrandr -q
Screen 0: minimum 800 x 480, current 800 x 480, maximum 800 x 480
default connected 800x480+0+0 0mm x 0mm
   800x480         0.0*
wolph ★★ ()
Ответ на: комментарий от wolph

Выдрал из винды правильный EDID, закинул на одноплатник.

root@lime-a10:~# hexdump -C /lib/firmware/edid/waveshare.bin
00000000  00 ff ff ff ff ff ff 00  04 81 04 00 01 00 00 00  |................|
00000010  01 11 01 03 80 0f 0a 00  0a 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 01 01  01 01 01 01 01 01 01 01  |................|
00000030  01 01 01 01 01 01 80 0c  20 80 30 e0 2d 10 28 30  |........ .0.-.(0|
00000040  d3 00 6c 44 00 00 00 18  00 00 00 10 00 00 00 00  |..lD............|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 10 00 00  |................|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 10  |................|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 17  |................|
00000080

Загрузочный скрипт поправил - подсунул drm_kms_helper.edid_firmware=edid/waveshare.bin

root@lime-a10:~# cat /boot/boot.cmd
setenv edid_load "drm_kms_helper.edid_firmware=edid/waveshare.bin"
setenv bootargs "console=tty1 root=/dev/mmcblk0p1 ${edid_load} rootwait rootfstype=ext4 sunxi_ve_mem_reserve=0 sunxi_g2d_mem_reserve=0 sunxi_no_mali_mem_reserve sunxi_fb_mem_reserve=16 hdmi.audio=EDID:0 panic=10 consoleblank=0 enforcing=0 loglevel=1"
if ext4load mmc 0 0x00000000 /boot/.next || fatload mmc 0 0x00000000 .next
then
ext4load mmc 0 0x49000000 /boot/dtb/${fdtfile} || fatload mmc 0 0x49000000 /dtb/${fdtfile}
ext4load mmc 0 0x46000000 /boot/zImage || fatload mmc 0 0x46000000 zImage
env set fdt_high ffffffff
bootz 0x46000000 - 0x49000000
else
ext4load mmc 0 0x43000000 /boot/script.bin || fatload mmc 0 0x43000000 script.bin
ext4load mmc 0 0x48000000 /boot/zImage || fatload mmc 0 0x48000000 zImage
bootz 0x48000000
fi

Ноль эффекта. Как загружался 1024x768 - так и продолжает. Куда еще можно копать?

wolph ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.