mini COMO FAZER sobre do XFree Para o Xinside do Linux por Marco Melgazzi, marco@techie.com v1.3, Setembro de 1997 Como converter um modelo XFree86 em um modelo XInside/XiGraphics. ______________________________________________________________________ Índice geral 1. Introdução 2. Por que eu deveria precisar dele? 3. Vamos lá! 4. Consertando coisas 5. O final... 6. Automatizando o processo 7. Agradecimentos a: 8. Copyright ______________________________________________________________________ 11.. IInnttrroodduuççããoo Durante a primavera de 1996 eu vi muitos pessoas na comp.os.linux.x perguntando como converter os modos de vídeo entre o XFree86 em uma dessas alternativas comerciais: o XInside (agora chamado de XiGraphics, note que de qualquer modo neste documento usarei o os nomes velhos dos produtos, visto que eu referenciarei principalmente àquela versão). Eu tinha a versão evoluída ainda em meu disco rígido: visto que eu gostei da resolução do problema, decidi fazer um teste, e depois de umas horas de desperdício e de cálculo, eu consegui um suposto artigo informativo que foi prontamente enviado. As discussões sobre como converter desapareceram inesperadamente e eu recebi 1 (um) mail agradecendo-me pelo artigo. Assim, visto que talvez alguma outra pessoa poderia precisar desta informação no futuro, eu decidi transformar aquela mensagem em um mini COMO FAZER que você está lendo. Deixe-me explicar algo primeiro: eu não trabalhei no XInside e eu tinha acesso somente a evolução da versão 1.2 para o Linux. Eu sei que atualmente (Maio de 97) o AccelX alcançou a revisão 3.1, mas eu acho que a informação incluída neste documento, se não literalmente, é ainda aplicável. Devido ao fato de que este COMO FAZER foi escrito com a ajuda de uma versão Xinside anterior, pode muito bem acontece de que algumas das informações contidas aqui não estão completamente exatas: como você lerá mais tarde, agradeço ao nascimento do XFree 3.2; eu não construí este servidor comercial, mas se tivesse, e se você observou qualquer informação incorreta, por favor gaste um tempo mandando-me um email. Observe que de qualquer modo aquele desperdício com a regulagem do monitor pode ser arriscada e, por esta razão, eu absolutamente não estabeleço garantias. Se ele funciona para você, ótimo, mas se você ficar irritado com o seu computador eu não serei responsável. Como você deve ter observado, eu não sou um nativo do inglês então provavelmente encontrará alguns erros aqui e ali. Peço desculpas pelos erros e peço a você para evitar a superlotação do meu mailbox com relatos incendiados!!! Obrigado. 22.. PPoorr qquuee eeuu ddeevveerriiaa pprreecciissaarr ddeellee?? Eu acho que a política do Xinside de não oferecer a você um utilitário para puxar os seus modos de vídeo (como o xvidtune ) e/ou importar seus modos existentes do XFree na versão de avaliação (e o comercial AFAIK) é incompreensível. Eu gastei por volta de três horas colocando tudo isto junto (dica: eu comparei a entrada VESA 1024x768@70Hz em dois formatos, (e eu sou quase um engenheiro eletrônico...)) enquanto um programador Xinside poderia ter escrito um artigo comparável em uma fração deste tempo... Eu não carreguei versão de avaliação do 1.3 e eu realmente espero que eles tenham consertado isto. Bem, se eles consertaram, este mini COMO FAZER poderia ser considerado desnecessário mas, se você o ler aprenderá algo mais sobre como tudo funciona... 33.. VVaammooss lláá!! Vamos supor que você tem seu modo XFre86 ajustado e você quer evoluir o Xinsisde nas mesmas condições: siga os passos descritos acima e você deve ser capaz de fazer isto; usaremos o meu modo de vídeo padrão como um exemplo real e explicarei o que terá que fazer para convertê-lo. Uma entrado do Xfree86 se parece com isto: Modeline "blahblah" DOTCLK A B C D a b c d Todo número de the A-D tem um significado: se você quiser pode procurá-lo no 'Manual de Hitchhiker para X386/XFree86' ( /usr/lib/X11/doc/VideoModes.doc ) mas não precisa saber a teoria por trás de tudo isso para executar uma conversão com sucesso. Mnha linha modelo no /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 No Xinside, você tem que adicionar uma entrada no arquivo Xtimings, que deve estar localizado no /etc (de agora em diante supomos que você está no topo de diretório Xaccel que dever ser algo como /usr/X11/lib/X11/AcceleratedX). ! Em algum lugar no arquivo, coloque o nome que você quiser. [PREADJUSTED_TIMING] PreadjustedTimingName = "1168x876 @ 72Hz"; ! ! Estes quatro são óbvios: ! HorPixel = 1168; // pixels VerPixel = 876; // lines PixelWidthRatio = 4; PixelHeightRatio = 3; ! ! hsync: DOT_CLK / D * 1000 [KHz] ! ! hsync = 105 / 1640 * 1000 = 64.024 KHz ! ! vsync: ( 1 / (( D / DOT_CLK ) * d) ) * 1,000,000 [Hz] ! ! vsync: ( 1 / (( 1640 / 105 ) * 900) ) * 1,000,000 ! ( 1 / 14057.1428571 ) * 1,000,000 = 71.138 Hz ! HorFrequency = 64.180; // kHz VerFrequency = 71.138; // Hz ! Óbvio: ScanType = NONINTERLACED; ! ! Coloque aqui as opções do XFree +/-hsync +/-vsync: ! HorSyncPolarity = POSITIVE; VerSyncPolarity = POSITIVE; ! Não se deve mudar: CharacterWidth = 8; // pixels ! DOT_CLK here PixelClock = 105.000; // MHz ! ! ! horizontal timings section: [usec] ! 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; ! ! vertical timings section: [msec] ! 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 ! Terminado ! Agora você tem que colocar este modo criado recentemente nos arquivos mostrados acima no lugar apropriado. 44.. CCoonnsseerrttaannddoo ccooiissaass No exemplo mostrado acima o sinal -> diz a você o que foi modificado: NÃO inclua ele em seus arquivos! Entrada do Monitor (o meu é 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"; O arquivo de informação da placa (o meu é boards/s3/764-2.xqa, eu me surpreendi porque eles têm quase todas as placas Hercules menos a minha: 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 Se o dot clock está muito baixo (não é o caso da minha placa) você pode colocar a entrada até mesmo nas seções 16bbp e 32bpp. O /etc/Xaccel.ini se parecerá com isto: -------------------------------------------------------------- Board = "s3/764-2.xqa"; Monitor = "mfreq/mfreq64.vda"; Depth = 8; -> Desktop = 1168x876; [RESOLUTIONS] -> 1168x876, 1024x768; O modo de entrada atual do Xinside em 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 Você pode testar a sua conversão executando o programa vgaset sem parâmetros enquanto executa o servidor Xinside; ele imprimirá uma linha de saída e, se tudo ocorreu bem, esta linha será igual a linha de onde você iniciou (exceto se b e c são iguais, eu não sou capaz de reproduzir esta situação no Xinside: o melhor caso foi c=b+1). 55.. OO ffiinnaall...... Espero que isto será útil para você; eu não acho que comprarei o servidor XiGraphics em um futuro próximo por uma razão simples: a distribuição do XFree86 3.2 com todos os problemas de velocidade de texto solucionados eu tinha em minha placa de vídeo Trio 64 ;) De algum modo parece que o servidor XiGraphics suporta um número muito mais amplo de placas de vídeo e chipsets do que o XFree, então pode muito bem acontecer de que a 'alternativa' comercial é a única viável para você. Se este é o caso, e você comprou o servidor XiGraphics, eu realmente gostaria de ouvi-lo, ou se você você encontrá-lo muito mais complexo ou seja qual for. 66.. AAuuttoommaattiizzaannddoo oo pprroocceessssoo Este pequeno script automatiza a maioria do trabalho. Seja muito cauteloso com o ScanType e com as linhas de duas Polaridades: o script não as ajusta e, se você está com muita preguiça de corrigí-las, os riscos do seu monitor explodir aumentam muito. Aviso que eu não sei se o sinal 'Doublescan' tem significado no XInside: se você tentar converter um modo doublescan baixo seja CUIDADOSO, você pode facilmente matar o seu monitor visto que a taxa de atualização que você obtém é dupla (de fato meu 400x300@72Hz veio de um 400x300@144Hz!). #!/bin/sh ########################################################################## # XF2XInside # # Este script converte o formato do XF86Config para o formato XInside para o aruivo etc/Xtiming. # # Este é uma tarefa rápida, assim não se espera muitos erros (não fale de nada como usuário amigável). # # Se você chamá-lo sem os argumentos ele deve mostrar a você o que fazer. # # (July 1996, hcz@tazlwurm.bb.bawue.de) # # Novos modos criados como descrito no COMO FAZER funcionam, mas não aparecem no menu do Xsetup. Alguém sabe por que? # ########################################################################## #----------------------------------------------- Here we go: # Mude isto se o seu arquivo modeline está em algum outro lugar: XF=/usr/X11/lib/X11/XF86Config if [ $# -ne 1 ] ; then echo "usage: ${0##*/} " echo " example: ${0##*/} 1024x764" echo -e " function: converts $XF modeline entry into\n Xinside Format (stdout)" exit 1 fi egrep -i "^[\t ]*modeline.+\"$1\"" /usr/X11/lib/X11/XF86Config | gawk ' NF < 11 { print "! invalid 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 "" }' 77.. AAggrraaddeecciimmeennttooss aa:: · Heike Claudia Zimmerer hcz@tazlwurm.bb.bawue.de por apontar uma pequena inconsistência e por enviar-me um script que automatiza a maioria do trabalho. · Bartosz Maruszewski B.Maruszewski@zsmeie.torun.pl por traduzir este mini COMO FAZER em Polonês e por me apontar um pequeno erro tipográfico. 88.. CCooppyyrriigghhtt (c)opyright 1996-7 por Marco Melgazzi (marco@techie.com) - aplica-se a GPL (Licença Pública Gnu). Para obter a cópia da GLP escreva para: Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. As marcas registradas são dos seus proprietários. Não existe garantia na exatidão e/ou na utilidade da informação dada neste documento.