|
|
|
Мини-HOWTO: "XFree-Xinside в Linux"
Содержание Введение Зачем мне это нужно? Приступаем Подправляем И все... Автоматизация Благодарности Copyright/legalese Авторские права Введение Весной 1996 года конференция comp.os.linux.x наводнилась вопросами типа: "Как преобразовать формат задания видеорежимов XFree86 для одной из его коммерческих альтернатив: XInside (сейчас эта система называется XiGraphics, однако в этом тексте я буду использовать название старой версии этого продукта, на которую буду опираться в процессе описания). Я оценивал эту программу и раньше, и эта оценочная версия осталась на моем диске. Я люблю, чтобы у каждой проблемы было решение - по этой причине я провел пару часов в раздумьях над калькулятором, и в результате родилась эта статья, которая и попала в конференцию. Дискуссия о преобразовании форматов сразу прекратилась, и я получил одно (1) письмо с благодарностью, поэтому решил преобразовать эту статью в мини-HOWTO, которое вы читаете. Давайте сразу кое-что уточним: я НЕ работаю на XInside, и у меня была только оценочная версия 1.2 для Linux. Я знаю, что в настоящее время (Май 1997) AccelX достиг версии 3.1, но я полагаю, что советы, приведенные в этом документе, может быть и не совсем точны, но все еще актуальны. Этот документ опирается на достаточно старую версию Xinside, и может случиться так, что часть приведенной здесь информации не совсем точна: позднее вы узнаете, что благодаря выходу в свет XFree версии 3.2, я не купил этот коммерческий сервер. Если вы это сделали и заметите некоторые неточности в моем документе - дайте мне знать. В любом случае, я обязан напомнить, что изменение времен задержки видеосигнала для монитора может привести к печальным последствиям, и я за это не несу никакой ответственности. Если у вас все сработает - прекрасно; если ваш компьютер взорвется - я за это не отвечаю. Как вы наверно уже поняли, английский - не мой родной язык, поэтому если вы обнаружите ошибки там и тут, простите меня и я прошу вас не наводнять мой почтовый ящик письмами с претензиями по этому поводу. Заранее спасибо! -------------------------------------------------------------------------------- Зачем мне это нужно? Я абсолютно не понимаю политики Xinside, заключающейся в полном отсутствии возможности настройки видеорежимов (типа xvidtune) и/или импортирования существующих настроек XFree (и подобных ей коммерческих систем). Я потратил около трех часов, чтобы их соединить (подсказка: Я сравнивал в обоих форматах строки, относящиеся к видеорежиму VESA 1024x768@70Hz (а я ведь почти инженер-электронщик;-)) в то время как программисту Xinside понадобилось бы, наверно, несколько минут, чтобы написать нечто подобное...
Я не загружал XInside версии 1.3 и позже - я искренне надеюсь, что в новых версиях они устранили это недоразумение. Конечно, если они это сделали, то данный текст можно считать бесполезным, но вы все-таки можете прочитать его, чтобы понять, как все работает... -------------------------------------------------------------------------------- Приступаем Предположим, что у вас имеется любимый видеорежим 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 ! И все! Этот вновь созданный видеорежим необходимо поместить в соответствующее место в файлах, которые я перечислю ниже. -------------------------------------------------------------------------------- Подправляем В приведенных ниже выдержках файлов знак -> указывает на то, что надо добавить. НЕ добавляйте этот знак в свои файлы! Строка для монитора (у меня это файл monitors/mfreq/mfreq64.vda)
[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 "" }' -------------------------------------------------------------------------------- Благодарности Heike Claudia Zimmerer hcz@tazlwurm.bb.bawue.de за то, что указала мне на пару неточностей и послала мне скрипт, автоматизирующий почти все.
Bartosz Maruszewski B.Maruszewski@zsmeie.torun.pl за то, что перевел этот мини-HOWTO на польский, и указал мне на небольшую опечатку. -------------------------------------------------------------------------------- Copyright/legalese (c)opyright 1996-7 by Marco Melgazzi (marco@techie.com) - the GPL (Gnu Public License) applies. To obtain a copy of the GPL write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Торговые марки являются собственностью их владельцев. Нет никакой гарантии на точность и/или полноценность информации, данной в этом документе. -------------------------------------------------------------------------------- Авторские права Авторские права на русский перевод этого текста принадлежат ╘ 2000 ASPLinux Все права зарезервированы. Этот документ является частью проекта Linux HOWTO. Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.
Все переводы и производные работы, выполненные по документам Linux HOWTO, должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO, с которым можно связаться по адресу приведенному ниже. Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: <linux-howto@metalab.unc.edu> или к координатору русского перевода Linux HOWTO компании ASPLinux по адресу <linux-howto@asplinux.ru>
|