Мне было интересно, где разместить этот кусок текста. Собственный сайт является возможным кандидатом, или найдите какую-нибудь ветку на superuser.com, которая ближе всего подходит к моей теме (и, возможно, помогла мне). Вот как я сюда попал :-)
Моя конкретная проблема заключалась в том, как принудительно включить определенный видеорежим в мои текстовые консоли. Настройка системы: Debian 9 Stretch на аппаратном обеспечении Haswell, его IGP обрабатывается драйвером i915 в Linux (теперь уже довольно давно поддерживает KVM и DRI / DRM). Какой-то глупый аналоговый KVM-переключатель, сообщающий ПК через DDC / EDID, что максимальное разрешение было 1600x1200, но на самом деле он питает ЖК-дисплей с разрешением 1280x1024 :-)
Я начал играть с vbetool
и fbset
, которые, однако, устарели / не подходят для этой цели, потому что они несовместимы с KMS + DRM. «Inteldrmfb», похоже, просто оболочка над KMS + DRM (и, похоже, не реализован в собственном модуле ядра). Параметры геометрии доступны только для чтения. Ну, по крайней мере, fbset может пассивно отображать активное разрешение, которое имеет некоторую информационную ценность.
Тем не менее, представляется, что у нас с вами есть возможность установить разрешение и частоту обновления кадров AKA по вертикали из командной строки ядра (параметры начального загрузчика в строке, начинающейся с «linux», которая находится в конце современного многострочный раздел grub.conf).
Вы можете поиграть с параметрами во время загрузки, если вы нажмете, e
пока Grub отсчитывает время ожидания. Следуйте за помощью оттуда. Когда вы будете довольны своими изменениями, нажмите Ctrl + X или F10, чтобы загрузить измененный профиль. (Ваши изменения эфемерны - они будут отображаться в / proc / cmdline в вашем работающем ядре при этой загрузке, но не записываются в grub.conf.) Для постоянного хранения ваших дополнительных параметров загрузки (аргументов ядра cmdline) в Debian Вы должны ввести их /etc/default/grub
в переменную с именем GRUB_CMDLINE_LINUX_DEFAULT
. И беги update-grub
.
Теперь о аргументах. Во-первых, вам нужно i915.modeset=1
(при условии, что ваша графическая подсистема является Intel IGP). Если вы страдаете от той же проблемы, что и я, то есть то, что ядро устанавливает слишком высокое разрешение, скорее всего, у вас уже установлен modeset = 1 (скомпилированный в ядре). Пока вы боретесь с синтаксисом проклятий cmdline, и иногда вам нужен просто какой-нибудь рабочий графический режим, вы можете попробовать i915.modeset=0
. Это, по-видимому, полностью предотвращает изменения графического режима, и у вас остается почти классическая консоль 80x25 символов, вплоть до входа в консоль. Вы также заметите, что в dmesg нет / dev / fb0 и отладочных сообщений DRM (подробности читайте дальше).
Также обратите внимание на вариант quiet
. Это работает с или без настройки режима. Очевидно, что он предотвращает печать сообщений ядра на вашу консоль (/ dev / tty) = вы получаете пустой темный экран в течение нескольких секунд, а затем вас приветствует приглашение для входа в систему. Это значение по умолчанию в Debian. (На самом деле в современном Debian с systemd вы, вероятно, получаете на экране загрузочные сообщения systemd, а не журнал ядра ...) Суть в том, что если вы хотите вернуть сообщения ядра, вам просто нужно стереть слово «quiet» из командной строки ядра, и используйте эту командную строку только для одной загрузки (нажмите «e» в Grub, отредактируйте, ctrl + x для продолжения) или навсегда (отредактируйте / etc / default / grub && update-grub).
Теперь, наконец, к сути: если у вас есть i915.modeset=1
, вам также нужно добавить video=<xres>x<yres>@framerate
. Например, в моем случае, video=1280x1024@60
или video=1024x768@60
. Существуют и другие возможные варианты, см. Соответствующую главу в Arch wiki . Например, вы также можете указать глубину цвета или применить режим только к одному порту вывода видео (называемый «разъем» в кишках DRM). Обратите внимание, что указанный вами режим, вероятно, должен соответствовать одному из режимов, известных ядру, то есть одному из «EDID modelines». Ядро хранит список этих блоков данных, полученных либо через DDC с монитора, либо из / lib / firmware, либо, возможно, скомпилированных в. Т.е. вы не можете указать только какую-то нечетную геометрию.
В некоторых документах вы найдете просто video=<xres>x<yres>
, например video=1024x768
. Это имеет желаемый эффект в том смысле, что разрешение действительно появляется на выходе - но вы позволили решать вопрос о частоте кадров до драйверов, которые стремятся выбрать максимально возможную частоту кадров (среди «линий режима», доступных в набор блоков EDID). Например, в моем случае оказалось, что драйвер выбрал 1024x768@85
, что было бы хорошим выбором еще в эпоху ЭЛТ, но для многих сегодняшних ЖК-мониторов крайне недоступно. Обратите внимание, что дешевые современные ЖК-дисплеи (до FreeSync) обычно используют частоту кадров 60 Гц, так что это то, что вам нужно установить явно, если ваш DDC отсутствует или помешан.
Во время поиска некоторых ответов я все время спотыкался о ссылках на этот патч, установленный Дейвом Эйрли - который приводит к обработке аргумента video = cmdline. Оказывается, это было объединено с ванильным Linux несколько лет назад.
В моем случае монитор работал с разрешением 1600x1200 и показывал «вне диапазона», потому что он не мог справиться. Когда я пробовал различные аргументы cmdline, я пытался просто video=1024x768
, что приводило к «вне диапазона» на мониторе. Внешне, из-за смутного сообщения об ошибке, казалось, что аргумент cmdline никак не влиял. Только позже я узнал, что мне не хватало только @60
суффикса :-)
Интересное здесь то, как я узнал. Есть другой аргумент cmdline ядра, который заставляет подсистему DRI / DRM печатать более болтливый журнал отладки:
версия ядра ниже 4.1:
drm.debug=0xe
версия ядра 4.1 или новее:
drm.debug=0x1e log_buf_len=1M
( источник )
Я прилагаю пример журнала отладки с моей машины . Вещи, чтобы сосредоточиться на (ключевые слова для поиска): Kernel command line
, cmdline
, adjusted mode
,[drm:
Отсюда можно почерпнуть «имена соединителей»: ls /sys/class/drm/
и обратите внимание, что синтаксис video = ... cmdline arg не принимает префикс «card-», который вы можете увидеть в / sys / class / drm. Синтаксис video = и имен коннекторов подробно описан в соответствующей главе вики Arch Linux .
Теперь позвольте мне переключить передачи / немного изменить тему.
Первоначальный вопрос в этой теме был о том, как изменить геометрию режима видео. Я делал это раньше в X и в Windows (используя позднюю версию Intel IEGD). В Linux под kvm + drm, единственный способ настроить геометрию и синхронизацию - это, по-видимому, передать свой собственный файл EDID, который вы сначала должны изготовить вручную. Ну, почти.
Конструкция EDID кратко описана в одном фрагменте документации, включенной в исходный код ядра vanilla.
Makefile и примерные определения EDID находятся в своем родительском каталоге .
В качестве примера выберите .S, скопируйте в свой собственный файл (см. Соглашение об именах в верхней части Makefile), отредактируйте время, соберите двоичный файл EDID и ... надеюсь, это решит вашу проблему :-)
Время / количество пикселей требуют математики, чтобы получить правильные значения. И есть несколько альтернативных исторических стандартов, которых вы должны придерживаться и которые конфликтуют друг с другом (это этапы эволюции стандартов синхронизации отображения):
- ЭЛТ-эра
GTF
, - эра ЖК
DMT
илиCVT
, - а затем
CVT-RB
(уменьшение гашения).
Ваша конкретная проблема может быть решена путем смещения импульса HSYNC вправо (вы также можете попробовать изменить его полярность), или сделав импульс синхронизации и / или общее время гашения относительно более широким, или (как вы предложили), уменьшив видимое / отображаемое разрешение в пикселях (кратно 8). Если вы делаете гашение шире, вам может потребоваться увеличить тактовую частоту пикселей, чтобы сохранить исходную частоту кадров.