XFree-Xinside в Linux
Предположим, что у вас имеется любимый видеорежим XFree86, и вы хотите перенести его в Xinside: для этого следуйте приведенным ниже инструкциям, у вас все должно получиться; в примере я использую мой любимый режим и объясню, как преобразовал его для XInside.
Строка Xfree86 выглядит примерно так:
Modeline "blahblah" DOTCLK A B C D a b c d
Каждое из чисел A-D и a-d имеет конкретное значение: если хотите, можете взглянуть в 'Руководство по настройке видеорежимов X386/XFree86' (/usr/lib/X11/doc/VideoModes.doc), но для преобразования одного формата в другой эта теория вам абсолютно не нужна...
Моя строка видеорежима в /usr/lib/X11/XF86Config выглядит так:
Modeline "1168x876" 105 1168 1256 1544 1640 876 877 891 900
| | | | | | | | |
DOT_CLK A B C D a b c d
В Xinside, вам надо добавить секцию в файл Xtimings, который находится в etc/ (с этого момента я предполагаю, что вы находитесь в каталоге Xaccel, предположим /usr/X11/lib/X11/AcceleratedX)
! Где-то в файле. Поместите здесь необходимое название режима
[PREADJUSTED_TIMING]
PreadjustedTimingName = "1168x876 @ 72Hz";
!
! Эти четыре значения очевидны
!
HorPixel = 1168; // точек
VerPixel = 876; // строк
PixelWidthRatio = 4;
PixelHeightRatio = 3;
!
! hsync: DOT_CLK / D * 1000 [кГц]
!
! hsync = 105 / 1640 * 1000 = 64.024 кГц
!
! vsync: ( 1 / (( D / DOT_CLK ) * d) ) * 1,000,000 [Гц]
!
! vsync: ( 1 / (( 1640 / 105 ) * 900) ) * 1,000,000
! ( 1 / 14057.1428571 ) * 1,000,000 = 71.138 Гц
!
HorFrequency = 64.180; // кГц
VerFrequency = 71.138; // Гц
! Очевидное значение
ScanType = NONINTERLACED;
!
! Здесь проставьте значения соответственно параметрам +/-hsync и +/-vsync из настроек XFree86
!
HorSyncPolarity = POSITIVE;
VerSyncPolarity = POSITIVE;
! Не изменяйте
CharacterWidth = 8; // pixels
! Здесь укажите значение DOT_CLK
PixelClock = 105.000; // MHz
!
!
! интервалы горизонтальной развертки: [мкс]
!
HorTotalTime = D / DOT_CLK = 15.619;
HorAddrTime = A / DOT_CLK = 11.124;
HorBlankStart = A / DOT_CLK = 11.124;
HorBlankTime = HorTotalTime - HorBlankStart = 4.495;
HorSyncStart = B / DOT_CLK = 11.962;
HorSyncTime = C / DOT_CLK - HorSyncStart = 2.743;
!
! интервалы вертикальной развертки: [мс]
!
VerTotalTime = ( HorTotalTime * d ) / 1000 = 14.057;
VerAddrTime = ( HorTotalTime * a ) / 1000 = 13.682;
VerBlankStart = ( HorTotalTime * a ) / 1000 = 13.682;
VerBlankTime = VerTotalTime - VerBlankStart = 0.375;
VerSyncStart = ( HorTotalTime * b ) / 1000 = 13.698;
VerSyncTime = ( HorTotalTime * ( c - b ) ) / 1000
= 0.219
! И все!
Этот вновь созданный видеорежим необходимо поместить в соответствующее место в файлах, которые я перечислю ниже.
[ESTABLISHED_TIMINGS]
"640x480 @ 60Hz",
"640x480 @ 72Hz",
"640x480 @ 75Hz",
"800x600 @ 56Hz",
"800x600 @ 60Hz",
"800x600 @ 72Hz",
"800x600 @ 75Hz",
"1024x768 Interlaced",
"1024x768 @ 60Hz",
"1024x768 @ 70Hz",
"1024x768 @ 75Hz",
"1152x900 Interlaced",
"1152x900 @ 60Hz",
"1152x900 @ 67Hz",
-> "1168x876 @ 72Hz",
"1280x1024 Interlaced",
"1280x1024 @ 60Hz",
"1600x1200 Interlaced";
Файл конфигурации видеокарты (у меня это boards/s3/764-2.xqa , Мне очень интересно, почему в их в файле есть почти все карты Hercules, кроме МОЕЙ: Terminator 64/Dram )
[VISUAL]
BitsPerPixel = 8;
MemoryModel = Packed;
ColorModel = Indexed;
BitsRGB = 6;
NumberOfColors = 256;
[RESOLUTIONS]
640x480,
800x600,
1024x768,
-> 1168x876,
1152x900,
1280x1024
[DESKTOPS]
640x480,
800x600,
1024x768,
1152x900,
-> 1168x876,
1280x1024,
1600x1200
Если частота вывода точек достаточно мала (так НЕ было в моем случае), то вы можете поместить эти строки и в секции 16-битных и 32-битных видеорежимов.
Файл /etc/Xaccel.ini будет выглядет примерно так
--------------------------------------------------------------
Board = "s3/764-2.xqa";
Monitor = "mfreq/mfreq64.vda";
Depth = 8;
-> Desktop = 1168x876;
[RESOLUTIONS]
-> 1168x876,
1024x768;
Настоящий раздел определения видеорежима в файле etc/Xtimings
--------------------------------------------------------------
[PREADJUSTED_TIMING]
PreadjustedTimingName = "1168x876 @ 72Hz";
HorPixel = 1168; // pixels
VerPixel = 876; // lines
PixelWidthRatio = 4;
PixelHeightRatio = 3;
HorFrequency = 64.024; // kHz
VerFrequency = 71.138; // Hz
ScanType = NONINTERLACED;
HorSyncPolarity = POSITIVE;
VerSyncPolarity = POSITIVE;
CharacterWidth = 8; // pixels
PixelClock = 105.000; // MHz
HorTotalTime = 15.619; // (usec) = 205 chars
HorAddrTime = 11.124; // (usec) = 146 chars
HorBlankStart = 11.124; // (usec) = 146 chars
HorBlankTime = 4.495; // (usec) = 59 chars
HorSyncStart = 11.962; // (usec) = 157 chars
HorSyncTime = 2.743; // (usec) = 36 chars
VerTotalTime = 14.057; // (msec) = 900 lines
VerAddrTime = 13.682; // (msec) = 876 lines
VerBlankStart = 13.682; // (msec) = 876 lines
VerBlankTime = 0.375; // (msec) = 24 lines
VerSyncStart = 13.698; // (msec) = 877 lines
VerSyncTime = 0.219; // (msec) = 14 lines
Вы можете проверить качество преобразования формата следующим образом: запустите в сервере XInside программу vgaset: вы увидите строку, похожую на формат XFree, и, если все нормально, должны получить строку, почти аналогичную исходной (я так и не смог добиться равенства изначально совпадавших b и c, лучший вариант оказался следующим: c=b+1 ).
И все...
И все! Я надеюсь, вам помогут эти советы. Я не думаю, что в ближайшем будущем куплю сервер XiGraphics - XFree86 версии 3.2 избавился от проблем с текстом, которые возникали на моей скромной видеокарте Trio 64 ;)
Однако, по-видимому, сервер XiGraphics поддерживает значительно больший спектр чипсетов и видеокарт, и, может так случиться, что у вас просто не будет другого выбора. Если так случится, и вы купите сервер XiGraphics, я буду очень рад узнать, пригодилась ли эта информация, или это все очень сложно, или вообще что-нибудь.
Автоматизация
Этот небольшой скрипт делает практически все за вас. Будьте очень осторожны со строками ScanType и Polarity: скрипт их не исправляет, и если вы поленитесь исправить их вручную, то шанс взорвать монитор немного увеличивается.
Заметьте также, что я не знаю, имеет ли значение в XInside флаг 'Doublescan': если вы будете пытаться конвертировать удвоенный режим с низким разрешением - будьте ОСТОРОЖНЫ - вы можете легко сломать свой монитор, если частота развертки удвоится (у меня 400x300@72Hz стал 400x300@144Hz!).
#!/bin/sh
##########################################################################
# XF2XInside
#
# Этот скрипт преобразует строки определения видеорежимов XF86Config в
# формат XInside, необходимый для файла etc/Xtiming.
#
# Этот скрипт набросан в спешке, поэтому здесь нет жесткого контроля
# ошибок в значениях (не говоря уже о дружественности интерфейса).
#
# Если вы запустите его без параметров, то он напишет вам, что надо делать.
#
# ( Июль 1996, hcz@tazlwurm.bb.bawue.de)
#
# Кстати: новые видеорежимы, созданные при помощи этого HOWTO работают,
# но не появляются в меню Xsetup. Кто-нибудь знает причину?
#
##########################################################################
#----------------------------------------------- Итак:
# Измените эту строку, если ваш файл с видеорежимами находится в другом месте:
XF=/usr/X11/lib/X11/XF86Config
if [ $# -ne 1 ] ; then
echo "использование: ${0##*/} <mode>"
echo "пример: ${0##*/} 1024x764"
echo -e "Конвертирование строки видеорежима из $XF в формат Xinside"
exit 1
fi
egrep -i "^[\t ]*modeline.+\"$1\"" /usr/X11/lib/X11/XF86Config |
gawk '
NF < 11 { print "! неверная строка Modeline:\n! " $0 "\n!"; next }
{
print "//", $0 ":"
name = $2
DOT_CLK = $3;
A = $4;
B = $5;
C = $6;
D = $7;
a = $8;
b = $9;
c = $10;
d = $11;
VerFrequency = 1000000 / ((D / DOT_CLK) * d)
print "[PREADJUSTED_TIMING]"
printf " PreadjustedTimingName = \"%dx%d @ %.0dHz\";\n", A, a, VerFrequency
print " HorPixel\t\t= " A ";"
print " VerPixel\t\t= " a ";"
print " PixelWidthRatio\t= 4;\n PixelHeightRatio\t= 3;"
print " HorFrequency\t\t= " DOT_CLK / D * 1000 ";\t// kHz"
print " VerFrequency\t\t= " VerFrequency ";\t// Hz"
print " ScanType\t\t= NONINTERLACED;\t\t// *CHECK*"
print " HorSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
print " VerSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
print " CharacterWidth\t= 8;"
print " PixelClock\t\t= " DOT_CLK ";"
HorTotalTime = D / DOT_CLK
print " HorTotalTime\t\t= " HorTotalTime ";"
print " HorAddrTime \t\t= " A / DOT_CLK ";"
print " HorBlankStart\t\t= " A / DOT_CLK ";"
print " HorBlankTime\t\t= " D / DOT_CLK - A / DOT_CLK ";"
print " HorSyncStart\t\t= " B / DOT_CLK ";"
print " HorSyncTime\t\t= " C / DOT_CLK - B / DOT_CLK ";"
VerTotalTime = ( HorTotalTime * d ) / 1000
print " VerTotalTime\t\t= " VerTotalTime ";"
print " VerAddrTime\t\t= " ( HorTotalTime * a ) / 1000 ";"
VerBlankStart = ( HorTotalTime * a ) / 1000
print " VerBlankStart\t\t= " VerBlankStart ";"
print " VerBlankTime\t\t= " VerTotalTime - VerBlankStart ";"
print " VerSyncStart\t\t= " ( HorTotalTime * b ) / 1000 ";"
print " VerSyncTime\t\t= " ( HorTotalTime * ( c - b ) ) / 1000
print ""
}'