Настройка видеорежимов в XFree86

© Антон Воронин (anton@urc.ac.ru), Январь 2001 г.

Данное руководство частично основывается на документе "XFree86 Video Timings Howto. Eric S. Raymond " из дистрибутива XFree86.


Основные понятия

Видеорежимы характеризуются прежде всего разрешением изображения (Resolution), то есть, количеством точек (пикселов) видимой области экрана по ширине и по высоте. Иногда говорят отдельно о горизонтальном разрешении (Horizontal Resolution, HR) и вертикальном разрешении (Vertical Resolution, VR). Существует ряд "стандартных" разрешений: 320x200, 320x240, 400x300, 480x300, 512x384, 640x400, 640x480, 800x600, 1024x480, 1152x864, 1280x960, 1280x1024, 1600x1200, 1792x1344, 1856x1392, 1920x1440. Это только для PC. Для платформы Sun, например, стандартным является разрешение 1152x900. На самом деле разрешения могут быть почти совершенно произвольными (например, 808x643) - ничто не мешает описать такой видеорежим, если системное ПО позволяет пользователю управлять видеоадаптером. Только горизонтальное разрешение для большинства видеоадаптеров должно быть кратно восьми, так как сингалы, как правило, программируются порциями, через 8-битный регистр. Считается, что для адекватного отображения объектов отношение вертикального разрешения к горизонтальному должно составлять примерно 3/4.

Луч электронной пушки пробегает не только видимую область, а весь экран, включая черные поля по сторонам. Вся область, охватываемая электронным лучом, называется фреймом (Frame). Фрейм описывается шириной (Horizontal Frame Length, HFL) и высотой (Vertical Frame Length, VFL), также измеряемых количеством точек. Точнее, высота фрейма - это количество строк, пробегаемых лучом. Обычно при разных видеорежимах ширина и высота фрейма разные, но это вовсе не обязательно. Значение ширины фрейма обычно кратно восьми по той же причине, что и горизонтальное разрешение.

Один цикл пробегания электронным лучом всего фрейма, называется кадром (Refresh).

Обычно не говорят о разрешении фрейма, поскольку память видеоадаптера не расходуется на точки за пределами изображения. Однако генерируются эти точки все равно сигналами видеоадаптера. Каждой точке, пробегаемой электронным лучом, соответствует один сигнал (Timing или Tick), поступающий с видеоадаптера один раз в течение каждого кадра. Количество этих сигналов в секунду в англоязычной документации называется Dot Clock Frequency (DCF), или просто DotClock и измеряется в мегагерцах. Обычно при разных видеорежимах используется разная частота сигналов, но не обязательно.

Максимальная частота сигналов адаптера может превышать ту, которую способен воспринимать монитор. Если на выходе адаптера слишком большая частота сигналов, это может привести к нестабильности изображения и увеличению уровня радиоизлучения (в том числе и рентгеновского), а в худшем случае даже к выходу из строя цепей развертки монитора, если он не оборудован специальной защитой. Особенно опасно превышать допустимую частоту сигналов для мониторов, поддерживающих только фиксированные значения частоты. Кроме того, при увеличении частоты изменяются и значения входного импеданса монитора, что может привести к увеличению мощности отражаемых сигналов и помехам изображения. Максимально допустимая частота сигналов на входе монитора называется Video Bandwidth, VB.

Обычно этот параметр не указывается в спецификациях мониторов, однако в них указываются диапазоны строчной частоты (Line Frequencу, LF или Horizontal Sync Frequency, HSF), т.е., количество строк, пробегаемых лучом в секунду, и кадровой частоты (Refresh Rate, RR или Vertical Sync Frequency, VSF), то есть, количество полных экранов, пробегаемых лучом в секунду. Соблюдение этих диапазонов не позволит превысить максимально допустимую для монитора частоту сигналов. Строчная частота обычно измеряется в килогерцах, а кадровая - в герцах. Кадровая частота, кроме того, является важнейшим эргономическим параметром и очень влияет на организм человека, особенно, на зрение. В соответствии со стандартом VESA, для комфортной работы за дисплеем кадровая частота должна быть не менее 72 Гц. Конечно, у разных людей глаза имеют разную чувствительность, но я, например, уже не могу сидеть за диселеем, экран которого обновляется с частотой меньше 65 Гц.

Видеоадаптер может "диктовать" монитору, какие значения строчной и кадровой частот использовать, и, таким образом, задавать ширину и высоту фрейма. Для согласования строчной частоты между видеоадаптером и монитором используется горизонтальный импульс синхронизации (Horizontal Syncronization Pulse, HSP), который генерируется видеоадаптером в то время, когда электронный луч пробегает область фрейма за пределами изображения, и длится 3.5-4 мкс. Его длина измеряетя в количестве сигналов, пробегаемых лучом за это время, и зависит от частоты сигналов видеоадаптера, но в любом случае она должна быть кратна восьми. Переход луча на новую строку также осуществляется во время горизонтального импульса синхронизации, поэтому от его временнОго расположения между крайними информационными сигналами (то есть, последним и первым пикселами изображения в строке) зависит горизонтальное смещение изображения.

Аналогично, для согласования частоты обновления кадров используется вертикальный импульс синхронизации (Vertical Syncronization Pulse, VSP), его длина обычно составляет время, необходимое для пробегания электронным лучом двух-трех строк фрейма. Так как он обычно измеряется в количестве строк, а не сигналов, то его длина не обязана быть кратной восьми. От временнОго расположения этого импульса между последней и первой строками изображения, зависит вертикальное смещение изображения.

Однако, горизонтальный импульс синхронизации не примыкает вплотную к границам изображения, то есть, между сигналами, определяющими крайние пискелы строк изображения, и сигналами, входящими в импульс синхронизации, есть еще ненулевые промежутки - Horizontal Guard Time, HGT. Обычно каждый из них состоит из 32 сигналов, но они могут быть и изменены произвольно, и должны быть кратны восьми, поскольку измеряются в количестве сигналов.

Аналогично, от первого и последнего пикселов изображения вертикальный импульс синхронизации отделяется промежутками, называемыми Vertical Guard Time, VGT, и измеряемыми количеством строк. Но они могут быть нулевыми и, к тому же, не обязаны быть кратными восьми.

Из всего вышесказанного стОит запомнить следующее:

  • Ширина фрейма равна сумме горизонтального разрешения, длины горизонтального импульса синхронизации и длин двух промежутков по обеим сторонам горизонтального импульса синхронизации:
    HFL = HR + HGT1 + HSP + HGT2    (*)
    
    причем, все эти слагаемые кратны восьми.

    Аналогично, высота фрейма равна сумме вертикального разрешения, длины вертикального импульса синхронизации и длин двух промежутков по обеим сторонам вертикального импульса синхронизации:

    VFL = VR + VGT1 + VSP + VGT2    (**)
    
  • Строчная частота зависит от частоты сигналов видеоадаптера и количества точек в строке (то есть, ширины фрейма):
          DCF
    HSF = ---                       (***)
          HFL
    
  • Самый важный параметр - кадровая частота - зависит от строчной частоты и количества строк экрана (то есть, высоты фрейма):
          HSF      DCF
    VSF = --- = ---------           (****)
          VFL   HFL * VFL
    


Параметры видеорежима в XF86Config

В конфигурации видеорежимов в XFree86 в большинстве параметров величиной измерения является количество сигналов (timings). Но поскольку один сигнал определяет одну точку (пиксел) экрана, то количество сигналов, в каком бы контексте оно не рассматривалось, равно количеству точек (пикселов) какой-либо области экрана.

В конфигурационном файле XF86Config для настройки видеорежимов используются директивы Modeline или, как альтернативный вариант, блоки Mode. И те, и другие состоят из 10 параметров:

  • dot clock - частота сигналов видеоадаптера DCF, (МГц).
  • hdisp - горизонтальное разрешение HR (точек).
  • hsyncstart - начало горизонтального импульса синхронизации HSP внутри строки фрейма (точек).
  • hsyncsend - конец горизонтального импульса синхронизации HSP внутри строки фрейма (точек).
  • htotal - ширина фрейма HFL (точек).
  • vdisp - вертикальное разрешение HR (строк).
  • vsyncstart - начало вертикального импульса синхронизации HSP внутри строки фрейма (строк).
  • vsyncsend - конец вертикального импульса синхронизации HSP внутри строки фрейма (строк).
  • vtotal - высота фрейма HFL (строк).
  • flags - флаги видеорежимов.
Очевидно, что разница между hsyncend и hsyncstart задает длину горизонтального импульса синхронизации, разница между hsyncstart и hdisp - длину промежутка HGT1, разница между htotal и hsyncend - длину промежутка HGT2. Аналогично для вертикальных значений.

Флаги видеорежимов описаны в XF86Config(5).


Диаграмма монитора

Диаграмма монитора - это двумерная область допустимых частот в системе координат кадровой частоты (VSF, или RR) и частоты сигналов видеоадаптера (DCF), ограниченная линиями:

VSF = minVSF  (1)
VSF = maxVSF  (2)
HSF = minHSF  (3)
HSF = maxHSF  (4)
DCF = min( maxDCF, VB )  (5)
С (1), (2) и (5) все ясно - это горизонтальные и вертикальная прямые. Что касается (3) и (4), то в системе координат VSF и DCF они выражаются следующим образом:
      maxHSF ** 2
VSF = -----------       (a)
      DCF * 0.63
и
      minHSF ** 2
VSF = -----------       (b)
      DCF * 0.63
Как видно, это гиперболы. Получаются они из зависимости (****):
         DCF
VSF = ---------
      HFL * VFL
при этом берется, соответственно,
       DCF
HFL = ------            (c)
      minHSF
или
       DCF
HFL = ------            (d)
      maxHSF
а ширина фрейма (VFL) берется в 1.05 раз большей вертикального разрешения, при этом предполагается, что вертикальное разрешение составляет 3/4 горизонтального, которое, в свою очередь, равно:

VR = HFL - 64 - 0.0000038 * DCF в соответствии с (*), однако для упрощения берется:

VR = 0.8 * HFL
В результате получается, что
VFL = 0.63 * HFL        (e)
При подставлении (c) и (e) или (d) и (e) в (****) получаются зависимости (a) и (b).

В этой же системе координат строятся графики частот для различных разрешений, описывающие множество значений кадровой частоты и частоты сигналов видеоадаптера, обеспечивающих заданное разрешение. Они представляют из себя прямые, заданные функцией

         DCF             DCF
VSF = --------- = ---------------------         (6)
      HFL * VFL   HR * 1.25 * VR * 1.05

Данный скрипт позволяет построить диаграмму монитора по заданным ограничениям частот (для его работы требуется пакет gnuplot). Его написал Eric S. Raymond (esr@snark.thyrsus.com), я же добавил в него построение еще нескольких графиков для малых разрешений.

Для моего монитора "Sun Microsystems 447Z" диапазон строчных частот составляет 31-72 КГц, а диапазон кадровых частот 50-120 Гц.

Максимальное значение частоты сигналов видеоадаптера (DCF) можно узнать из логов X-сервера, а допустимое значение частоты сигналов для монитора (VB) - из спецификации монитора, если оно там приведено. Для моего монитора это значение в спецификации отсутствует, поэтому придется опираться только на ограничение частоты сигналов видеоадаптера. Для моего интегрированного видеоадаптера на чипсете Intel i810 запись в логах X-сервера выглядит следующим образом:

(II) I810(0): Clock range:  12.00 to 136.00 MHz
То есть, верхняя граница составляет 136 МГц.

В соответствии с этими данными диаграмма моего монитора выглядит следующим образом:


Выбор параметров для видеорежима

В XFree86 параметры для многих разрешений заданы по умолчанию, и их не обязательно настраивать в XF86Config. Однако, во-первых, определены только стандартные VESA-режимы, начиная с 640x400, то есть, отсутствуют описания по умолчанию для режимов 320x200, 320x240, 400x300, 480x300 и 512x384, а во-вторых, описания по умолчанию являются усредненными и потому не гарантируют работы видеорежимов на всех мониторах, а также не обеспечивают максимально возможной кадровой частоты для любого монитора.

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

  • В качестве значений параметров hdisp и vdisp использовать требуемые горизонтальное и вертикальное разрешение.
  • Для графика нужного разрешения выбирать самую верхнюю точку внутри области допустимых значений строчной и кадровой частот. На вертикальной оси она соответствует максимальной кадровой частоте (VSF), возможной при данном разрешении, а на горизонтальной оси - частоте сигналов видеоадаптера (DCF), при которой данная кадровая частота возможна. Найденное значение DCF использовать в качестве значения параметра dot clock.
  • В качестве значения параметра hsyncstart использовать (hdisp + 32).
  • Вычислить длину импульса горизонтальной синхронизации в точках:
    HSP = 3.8 (мкс) * DCF (МГц)
    
    Округлить его до ближайшего числа, кратного восьми. В качестве значения параметра hsyncend использовать (hsyncstart + HSP).
  • В качестве значения параметра htotal использовать (hsyncend + 32). Это и будет ширина фрейма (HFL).
  • Для выбранных значений кадровой частоты, частоты сигналов видеоадаптера и ширины фрейма определить соответствующую высоту фрейма, исходя из (****):
          HSF      DCF
    VFL = --- = ---------
          VSF   VSF * HFL
    
    Это значение нужно присвоить параметру vtotal.
  • Выбрать значения параметров vsyncstart и vsyncend примерно посередине между значениями vdisp и vtotal так чтобы между собой они отличались на 2-3 строки.
Вот и все.

Для некоторых мониторов в спецификации приводятся так называемые Timing Charts, то есть, продолжительности последовательностей сигналов (в микросекундах), соответствующих изображению, первому и второму guard time и импульсу синхронизации, как по горизонтали, так и по вертикали, для каждого разрешения. В этом случае вообще все просто, не нужно прибегать к диаграммам монитора, нужно только определить необходимую частоту сигналов (DCF), разделив горизонтальное разрешение на продолжительность соответствующей ему последовательности сигналов, и пересчитать все промежутки из микросекунд в пикселы, умножая их на DCF.

Конечно, не сложно написать программку, которая будет определять все параметры в соответствии с timing charts или с диаграммой монитора. В случае диаграммы вместо ее построения и визуальлного поиска значений VSF и DCF ей нужно будет определить DCF, исходя из равенства, полученного приравниванием (a) и (6):

maxHSF ** 2            DCF
----------- = ---------------------
DCF * 0.63    HR * 1.25 * VR * 1.05
то есть,
           ________________________________________
     \    / ( maxHSF ** 2 ) * HR * 1.25 * VR * 1.05
DCF = \  / ----------------------------------------
       \/                 0.63
при ограничениях
DCF <= maxDCF
и
          DCF
--------------------- <= maxVSF 
HR * 1.25 * VR * 1.05
то есть,
DCF <= maxVSF * HR * 1.25 * VR * 1.05

И так, параметры конфигурации видеорежима выбраны. Если при них изображение получилось сдвинутое, суженное или растянутое, см. следующий раздел.

Если изображение нестабильно или отстствует, значит ваш монитор не соответствует своей спецификации. Попробуйте выбрать точку на графике, соответствующую несколько меньшим значениям кадровой частоты и частоты сигналов видеоадаптера, и определите остальные параметры заново.

После того, как видеорежим установлен, можно попробовать еще немного поднять кадровую частоту путем пробного уменьшения ширины и высоты фрейма (при этом нужно следить, чтобы строчная и кадровая частоты не вышли за пределы своих максимально допустимых значений, поглядывая в логи X-сервера). Уменьшение размеров фрейма лучше производить засчет уменьшения промежутков HGT и VGT. Но можно также немного сократить и горизонтальный импульс синхронизации - ведь при расчетах он брался равным 3.8 мкс, а иногда он может быть уменьшен и до 3.5 мкс (точнее, до количества точек, соответствующих 3.5 мкс)

Если даже выбранная, наибольшая для данного видеорежима, кадровая частота вас не удовлетворяет, ощущается мирцание на светлых тонах, то, если ваши монитор и адаптер поддерживают interlaced-режим, можно попробовать включить его (параметру flags задать значение "interlace"), тогда строки на экране будут рисоваться через одну - сначала нечетные, а потом четные, какбы увеличивая частоту, и уменьшая мирцание изображения. При этом значения параметров vdisp и vtotal обязательно должны быть четными. Заметьте, что в в этом режиме мелкие детали на экране будут хуже различимы.

Может также оказаться, что график, соответствующий нужному вам разрешению, вообще не проходит через область допустимых значений строчной и кадровой частот, как например, для разрешений 320x200 и 1600x1200 на моем графике.

В первом случае можно использовать бОльшие значения высоты и ширины фрейма (засчет увеличения промежутков HGT), правда, тогда изображение получится несколько сжатым сверху и снизу. Например, для 320x200 использовать те же высоту и ширину фрейма, что и для 320x240. Или же просто можно рассчитывать параметры для вдвое бОльших вертикального разрешения и высоты фрейма, но после рассчета поделить получившиеся значения параметров vdisp, vsyncstart, vsyncend и vtotal на два, и параметру flags задать значение "doublescan" - тогда каждая строка экрана будет пробегаться электронным лучом дважды, и вы получите достаточно малое разрешение при значении строчной частоты не ниже минимально допустимого.

Во втором случае можно попробовать выбрать ширину фрейма, соответствующую строчной частоте, на пару килогерц превышающей максимальную, указанную в спецификации - для большинства мониторов этот показатель чуть занижен. При этом нужно исходить из отношения (***).

Если же это все равно не позволяет "дотянуть" область допустимых значений частот до графика, соответствующего нужному разрешению, тогда остается лишь несколько уменьшить разрешение (то есть, например, вместо 1600x1200 использовать 1450x1100).


Как изменить размер или смещение изображения

Хорошо, когда на панели управления монитора есть регуляторы размера и смещения изображения, но на старых мониторах они нередко отсутствуют. Например, на моем домашнем мониторе тайваньской марки "Bridge", выпущенном еще в 1994 году, есть регуляторы смещения и вертикального размера изображения, но нет регулятора горизонтального размера изображения.

Кроме того, вы можете часто переключаться между различными графическими режимами, а также консольным (текстовым) режимом. При этом, почти наверняка, в разных режимах у вас будет разный размер изображения и разное его смещение. Если вам не хочется каждый раз поправлять его органами управления монитора (иногда это довольно медленная процедура, если ваш монитор использует графическое меню), тогда можно попытаться настроить все видеорежимы более-менее одинаково.

Конечно, для этого можно воспользоваться программой xvidtune, входящей в дистрибутив XFree86, но даже при ее использовании лучше знать, что именно вы делаете.

Если изображение (видимая область экрана монитора) сдвинуто влево или вправо, то для его нормализации в описании видеорежима необходимо сдвинуть горизонтальный импульс синхронизации в обратную сторону, то есть, соответственно, уменьшить или увеличить значения параметров hsyncstart и hsyncend на одинаквое число (чтобы не изменить длину импульса), кратное восьми, но так чтобы они по-прежнему оставались в диапазоне между значениями параметров hdisp и htotal.

Если изображение сдвинуто вверх или вниз, то для его нормализации в описании видеорежима необходимо сдвинуть вертикальный импульс синхронизации в обратную сторону, то есть, соответственно, уменьшить или увеличить значения параметров vsyncstart и vsyncend на одинаковое число (чтобы не изменить длину импульса), но так чтобы они по-прежнему оставались в диапазоне между значениями параметров vdisp и vtotal. Заметьте, что здесь не требуется кратности восьми.

Если изображение слишком растянуто или сжато по горизонтали, то для его нормализации следует, соответственно, увеличить либо уменьшить ширину фрейма (параметр htotal) на число, кратное восьми. При этом нужно сдвинуть и горизонтальный импульс синхронизации в сторону изменения ширины фрейма, но на примерно вдвое меньшее значение, также кратное восьми, чтобы не вызвать горизонтального смещения изображения. Распространенной ошибкой среди пользователей является увеличение горизонтального разрешения вместо уменьшения ширины фрейма; это, в свою очередь, обычно требует увеличения ширины фрейма, что приводит к уменьшению строчной частоты, а следовательно и кадровой частоты (при неизменных высоте фрейма и частоте сигналов).

Если изображение слишком растянуто или сжато по вертикали, то для его нормализации следует, соответственно, несколько увеличить либо уменьшить высоту фрейма (параметр vtotal). При этом нужно сдвинуть и вертикальный импульс синхронизации в сторону изменения высоты фрейма, но на примерно вдвое меньшее значение, чтобы не вызвать вертикального смещения изображения. Кратности восьми здесь не требуется. Распространенной ошибкой среди пользователей является увеличение вертикального разрешения вместо уменьшения высоты фрейма; это, в свою очередь, обычно требует увеличения высоты фрейма, что при неизменных ширине фрейма и частоте сигналов приводит к нежелательному уменьшению кадровой частоты.



Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости