分类: LINUX
2006-06-02 10:15:58
本文是《如何在Linux下实现设备的配置》的第二部分,将接着向您介绍窗口系统(XFree86)的配置过程。
本文是《如何在Linux下实现设备的配置》的第二部分,将接着向您介绍窗口系统(XFree86)的配置过程。
6 窗口系统(XFree86)的配置过程
6.1 显示卡的描述文件介绍(CardDB)
CardDB是X配置程序使用的显示卡数据文件。在对XFree86进行配置时,配置程序一般都需要读取其上的内容完成显示卡的配置。它的内容与使用的XFree86的版本密切相关。一般而言,它保存的位置是在/usr/X11R6/lib/X11/目录下。现在我们就对XFree86 4.1.0的CardDB文件进行简单的介绍:
NAME
CHIPSET
显示卡的描述名称
描述显示卡使用的芯片集
SERVER
为了和3.x版本的XFree86向下兼容,由此字段指定此显示卡在XFree86 3.x下的X服务器,例如VGA16,SVGA等。DRIVER
描述在4.x版本的XFree86下显示卡的驱动程序模块。LINE
设置显示卡特定的选项信息,这样的选项信息出现在XF86Config的Device节,对应设备的Option参数。SEE
是指此显示卡的配置信息与SEE字段所制定的显示卡完全相同,例如NAME Number Nine GXE64 with S3 Trio64 SEE S3 Trio64 (generic) 表示Number Nine GXE64的显示卡配置与S3 Trio64 (generic)的配置完全相同。RAMDAC
RAM直接存取控制的控制芯片型号
DACSPEED
直接存取控制的速度CLOCKCHIP
此显示卡的时钟芯片的NOCLOCKCHIP
此显示卡无时钟芯片UNSUPPORTED
此类型的显卡,此版本的XFree86不能提供支持COMMENT
注释
例如,对于RIVA TNT显卡,XFree86 4.1.0中的信息如下:
NAME RIVA TNT CHIPSET RIVATNT SERVER SVGA DRIVER nv NOCLOCKPROBE
6.2 显示器信息检测
显示器的信息在XFree86系统中时非常重要的,它对应XFree86配置文件的Monitor节。在这一节中包含监视器的水平扫描频率范围,垂直扫描频率范围,显示器支持的显示模式等信息。同样的,显示器的自动检测也就是通过程序自动读出显示器的上述信息。它的正确设置对于XFree86能否正常显示起到很重要的作用。
对于显示器的信息检测,要求它必须支持vbe(VESA的BIOS级扩展)。在显示器支持此扩展时,通过系统实模式下的BIOS调用INT 10H,可以取得显示器的详细信息。
可能需要的BIOS子功能调用为:
AH = 0x4F00
获得关于监视器的VESA的BIOS级扩展信息
AH = 0x4F01
获得监视器支持的特定显示模式
AH = 0x4F02
设置当前的视频模式
AH = 0x4F03
获得当前的视频模式
AH = 0x4F04
保存/还原svga显示方式
AH = 0x4F15
获得监视器的EDID扩展信息
一般的显示器使用上述中断的方式是:先检查显示器是否支持VESA的BIOS级扩展,如果显示器支持BIOS级扩展,就查看显示器支持的显示模式,然后获得显示器的EDID扩展信息。在读出的EDID扩展信息中,可以查出显示器的垂直回扫频率范围和水平回扫频率范围,也可以计算出显示器的大小,对于一部分显示器还可以从此信息中读出监视器的制造商信息。
由显示器读出的信息可以设置XF86Config的Monitor节,对于设置了正确的垂直回扫频率范围和水平回扫频率范围的显示器,X自动设置为当前显示分辨率下支持的最高扫描频率的显示模式(此显示模式要求有对应的Modeline)。
但是如果您的显示器不支持EDID扩展信息,那么您就只有根据经验来设置显示器的垂直回扫频率范围和水平回扫频率范围。如果设置的范围高于监视器的实际支持范围,那么显示器会出现黑屏的现象。
对于编程实现,如果您要调用上述bios中断,那么必须使用lrmi这个实模式接口,并设置正确的寄存器信息,完成系统调用。具体的检测显示器信息的例子,您可以参考Xconfigurator下ddcprobe的源程序,也可以参考Mandrake系统下的ddcxinfos命令的源程序。
6.3 窗口系统的配置过程
要正确的在Linux下配置窗口系统,实际上就是生成正确的XFree86配置文件,这个文件一般保存在/etc/X11/下,在X版本是3.x时,它的文件名为XF86Config,在X版本是4.x时,它的文件名一般为XF86Config-4。在现在的发行版本中,处于硬件兼容性的考虑,他们一般都让这两个版本的XFree86包共存。因此,您也可以在/etc/X11目录下,发现这两个文件同时存在,这时使用那个文件就要看系统的X服务器的版本了。
无论是那个版本的XF86Config文件都是由许多节(Section)构成的,但是这些节描述的内容主要包括:键盘、鼠标、显示器、显示卡、字体(颜色)等。
在X版本是3.x时,键盘和鼠标的描述分别对应Keyboard和Pointer节。而在X版本是4.x时,键盘和鼠标的描述都对应,只是对应不同的驱动模块,键盘的驱动模块是keyboard,鼠标的驱动模块是mouse。配置这两节所需要的信息可以从/etc/sysconfig/keyboard和/etc/sysconfig/mouse中获得,它们的详细内容,本文的前面章节已作了介绍。
配置显示器实际上是生成XF86Config文件的,需要配置的信息一般包括:水平扫描频率范围、垂直扫描频率范围、监视器支持的显示模式、制造商信息。对于支持vbe和edid扩展的显示器,可以根据从显示器上读出的信息设置对应字段的值。但是如果显示器不支持上述扩展,则显示卡的设置必须由用户手动完成。如果您在配置XFree86时不指定这一节,那么XFree86会设置显示模式为640x480,垂直扫描频率为60hz的方式。不同显示模式的扫描频率:
显示分辨率 | 垂直扫描频率(Hz) | 水平扫描频率(kHz) |
640x480 | 60 | 31.50 |
640x480 | 72 | 36.50 |
640x480 | 75 | 37.50 |
640x480 | 85 | 43.27 |
800x600 | 60 | 37.80 |
800x600 | 72 | 48.00 |
800x600 | 85 | 55.84 |
800x600 | 100 | 64.02 |
1024x768 | 60 | 48.40 |
1024x768 | 70 | 56.50 |
1024x768 | 76 | 62.50 |
1024x768 | 85 | 70.24 |
1024x768 | 100 | 80.21 |
1280x1024 | 61 | 64.20 |
1280x1024 | 70 | 74.59 |
1280x1024 | 74 | 78.85 |
1280x1024 | 76 | 81.13 |
1280x1024 | 85 | 91.15 |
1280x1024 | 100 | 107.16 |
1600x1200 | 60 | 75.00 |
1600x1200 | 70 | 87.50 |
1600x1200 | 75 | 93.75 |
1600x1200 | 85 | 105.77 |
从上表可以看出,您要设置显示器达到某一分辨率,那么与此相对应,它的扫描频率范围也要包含上表中此分辨率的最低扫描频率。如果您的显示器达不到这个范围,那么XWindow将无法正常工作。如果您设置的扫描频率高于显示器实际的扫描频率范围,由于XFree86会寻找对应分辨率下最高扫描频率进行显示,所以此时XWindow将极有可能黑屏。
在生成配置脚本时,扫描频率的范围也不是越低越好。设置较低的扫描频率范围对于部分LCD显示器就不合适。比如,一部分LCD显示器在800x600分辨率时,最低支持的垂直扫描频率为70Hz,那么您这时指定的水平回扫范围一定要包含48kHz。
在配置完显示器之后,您就需要生成与显示卡对应的描述了。这样的描述信息对应XF86Config文件的。这一节主要描述的显示卡信息包括:显示卡对应的X服务器(X版本在3.x),对应的X设备模块(X版本为4.x),显示卡的设备信息(供应商、型号、支持显存存取方式和显存大小等),以及此显示卡支持的设备选项,比如显示卡是否支持硬件加速、是否支持软光标等。生成窗口系统的配置过程一般是先由pci的设备标识(检测过程见)获得显示卡的类型,由此在XFree86的配置文件CardDB(这个文件可在/usr/X11R6/lib/X11/目录下找到)中查得它对应的显示卡描述,由此信息可以设置此节的描述。
字体和调色板信息描述的是字体和调色板所存放的路径,您如果新加入字体时,需要在此加入正确的字体路径。设置字体路径时,如果指定它为unix:-1,那么就是说您在启动X服务器之前,必须首先启动字体服务器xfs,然后由字体服务器完成字体的访问请求。
在您正确的设置了上述信息之后,您必须将这些信息存放在中。这一节描述的是完成显示对应的显示卡,显示器,分辨率和缺省深度等信息。
最后,您还必须生成,由它描述整个系统所使用的显示卡配置节、监视器配置节、鼠标配置节、键盘配置节等信息。
在生成了/etc/X11/XF86Config(XF86Config-4)文件后,您就可以测试一下此配置文件是否正确了。例如,对于XFree86 4.x,生成的配置文件为/etc/X11/XF86Config.test,测试使用如下命令:
XFree86 -xf86config /etc/X11/XF86Config.test :9 -xf86config /etc/X11/XF86Config.test表示使用指定的配置文件启动X服务器 :9 表示在终端9上运行X服务器
一般而言,如果是编程实现X的配置过程的话,则要以子进程的方式(系统调用fork)运行上述命令,在成功启动X服务器之后,运行一个小的图形化程序,让用户选择配置是否成功。
当然,如果您不能得到显卡的详细的设备参数的话,您也可以使用probeonly选项获得显示卡的详细信息。例如,对于XFree86 4.x测试使用如下命令:XFree86 -probeonly :9
对于正常的启动XFree86之后,系统输出的信息,您可以通过读取/var/log/XFree86.x.log获得。x是指XFree86启动的终端,一般设置此x为0。
在XF86Config文件配置之后,您可以使用startx启动XFree86。这个文件会运行您的登录目录下的.xinitrc文件来修改X Window系统的初始显示状态。这个文件是一个脚本文件。如果这个文件不存在,系统就会默认使用/usr/X11R6/lib/X11/xinit/xinitrc。同时,startx还要查找/etc/X11/X,这个文件是一个链接文件,它指向真正的X服务程序,现在这个程序一般都指向Xwrappers,它是对X服务程序的封装。当然,这个文件也可以直接指向X服务程序XFree86。
6.4 支持FrameBuffer方式的显卡的配置过程
帧缓冲(FrameBuffer)设备是指一种不带视频加速的X11支持设备。启动此方式的优点主要有三点:其一是在控制台方式工作时,您能设置更大的控制台显示区,比如设置1024x768分辨率大小的控制台;其二是可以在其上启动XF86_FBDev(对于XFree86 4.x下,使用启动模块fbdev);其三是可以在启动时显示启动徽标(一只胖胖的企鹅)。
在有时显示卡对应的XFree86驱动程序不能正常工作时,而您又需要比较丰富的色彩时,启动FrameBuffer往往是必须的选择。启动FrameBuffer时,XFree86启动的分辨率由FrameBuffer的启动模式决定。
能够启动FrameBuffer的设备是intel结构下与vesa 2.0标准兼容显卡的帧缓冲设备,但是现在不能在支持vesa 1.2的显卡上支持FrameBuffer。这是因为vesa 1.2不支持线性帧缓冲(线性帧缓冲意味着CPU能访问显卡的每一位)。您可以下载补丁,以使vesafb支持vesa 1.2的显卡,比如一些较老的s3系列显卡。
现在支持vesa 2.0的显卡主要有:
|
主板集成显示卡:
|
启动FrameBuffer必须设置内核的启动显示模式,设置这个参数是通过内核参数vga=实现的。比如,设置启动之后的分辨率为640x480下的16位色时,传递的参数为vga=785(十进制数)。您也可以在/etc/lilo.conf文件中设置此参数,由lilo传递内核参数。
内核支持的FrameBuffer显示模式如下表:
显示深度 | 640x400 | 640x480 | 800x600 | 1024x768 | 1152x864 | 1280x1024 | 1600x1200 |
4 bits | 0x302 | ||||||
8 bits | 0x300 | 0x301 | 0x303 | 0x305 | 0x161 | 0x307 | 0x31C |
15 bits | 0x310 | 0x313 | 0x316 | 0x162 | 0x319 | 0x31D | |
16 bits | 0x311 | 0x314 | 0x317 | 0x163 | 0x31A | 0x31E | |
24 bits | 0x312 | 0x315 | 0x318 | 0x31B | 0x31F | ||
32 bits | 0x164 |
向内核传递vesa选项还包括:
video=vesa:option,多个选项之间可用逗号隔开;
可接受的选项:
ypan
使用vesa保护模式接口显示,可视屏幕是视频内存的一个窗口。
pro
快速的整屏卷滚,允许回滚。
kontra
部分卷滚,可产生一些闪动效果。
ywrap
比ypan速度快,但是兼容性差。
redraw
缺省使用,通过重绘受影响的屏幕区进行重画。
vgapal
缺省使用,标准的vga调色版寄存器。
pmipal
使用保护模式的调色版接口。
例如,下面的操作设置FrameBuffer设备的显示:export FRAMEBUFFER=/dev/fb1
fbset -fb /dev/fb1 -vyres 600
fbset -fb $FRAMEBUFFER 1024x768@60
startx -- :0 -bpp 16 vt06
在虚拟控制终端6以16为颜色深度启动X服务器。
如果您要对帧缓冲设备编程,则可以象使用/dev/mem一样,读、写、定位以及mmap()此设备。不同的是,您此时操作的设备内存位于视频设备内存中。/dev/fb*设备也支持几种ioctl操作,由此可以获得或设置设备信息。颜色表的处理使用ioctl()。
6.5 XF86Config文件格式(版本为4.x系列)
6.5.1 文件的基本组成
文件的每节都是由下述的部分组成:
Section "SectionName" SectionEntry … EndSection
SectionName包括:
Files 文件路径名 ServerFlags 服务器标志 Module 动态模块加载 InputDevice 输入设备描述 Device 图形设备描述 VideoAdaptor Xv视频卡描述 Monitor 监视器描述 Modes 视频模式描述 Screen 屏幕配置 ServerLayout 全面的层叠 DRI DRI特定的配置 Vendor 供应商特定的配置
出于向下兼容的目的,下列项虽已废除但是配置文件仍能识别。在新的配置文件中,应使用新的InputDevice项。
Keyboard 键盘配置
Pointer 指针/鼠标配置
老的XInput节已经被废除。
ServerLayout在最高层。它们绑定的输入输出设备会在这一节里使用。输入设备由InputDevice描述,输出设备通常有多个独立的组件组成。多个组件组成Screen节。每个Screen节将图形板和监视器绑定在一起。显示卡由Device节描述,监视器由Monitor节描述。
6.5.2 Files节
Files节指定X服务器的字体路径、调色板路径和模块路径。
/ : 指定与字体服务器连接的传输类型(unix,tcp)。 若此节不指定,则缺省的字体路径是: /usr/X11R6/lib/X11/fonts/misc/ /usr/X11R6/lib/X11/fonts/Speedo/ /usr/X11R6/lib/X11/fonts/Type1/ /usr/X11R6/lib/X11/fonts/CID/ /usr/X11R6/lib/X11/fonts/75dpi/ /usr/X11R6/lib/X11/fonts/100dpi/ 一般而言,推荐的字体路径是: /usr/X11R6/lib/X11/fonts/local/ /usr/X11R6/lib/X11/fonts/misc/ /usr/X11R6/lib/X11/fonts/75dpi/:unscaled /usr/X11R6/lib/X11/fonts/100dpi/:unscaled /usr/X11R6/lib/X11/fonts/Type1/ /usr/X11R6/lib/X11/fonts/CID/ /usr/X11R6/lib/X11/fonts/Speedo/ /usr/X11R6/lib/X11/fonts/75dpi/ /usr/X11R6/lib/X11/fonts/100dpi/
6.5.3 ServerFlags节
ServerFlags节用于指定全局的X服务器选项,在一般情况下这个部分是空的。
6.5.4 Module节
此节用于指定加载的X服务器模块。此节在X服务器以静态方式建立时是被忽略的。在此节中加载的模块一般为X服务器扩展模块和光栅字体模块。大多数其他模块在需要时自动加载。
Load "modulename"
例如:Type 1光栅字体模块由下列入口加载:
Load "type1" SubSection "modulename" Option "moduleoption" EndSubSection
6.5.5 Inputdevice节
这一节写入的信息是从/etc/sysconfig/mouse和/etc/sysconfig/keyboard中读出的,并且要求两者的设置基本保持一致。一般而言,都存在两种输入设备:其一是核心键盘,另一是核心指针,指针设备主要是指鼠标,但也可以是触摸屏等其他设备。
Section "InputDevice" Identifier "name" Driver "InputDriver" options ... EndSection
6.5.6 Device节
这一节描述显示卡对应的信息,它的内容一般从CardDB文件中显示卡对应的描述中获得。若此设备节被Screen节引用,则认为此节是可用的。
Section "Device" Identifier "name" Driver "driver" entries … … EndSection
6.5.7 Monitor节
Monitor节描述显示器的信息,至少有一个显示器节。在显示器支持vbe和edid扩展时,它的所有信息都可以从显示器上读出。
Section "Monitor" Identifier "name" entries … EndSection
VendorName "vendor"
显示器的制造商
ModelName "model"
监视器的型号
HorizSync horizsync-range
监视器支持的水平刷新频率范围。单位是kHz,缺省范围是28-33kHz。
VertRefresh vertrefresh-range
监视器支持的垂直刷新频率范围。单位是Hz,缺省范围是43-72Hz。
Gamma gamma-value
Gamma red-gamma green-gamma blue-gamma
用于gamma校正,范围从0.1到10.0,缺省值是1.0。并非所有的驱动程序具有使用此信息的能力。
UseModes "modesection-id"
包括Modes节称为modesection-id列出的模式集合。这使得这些模式可用于此显示器。
Mode "name"
设置视频模式的详细定义。以EndMode关键字结束。
DotClock clock
此模式下的点时钟速率。
HTimings hdisp hsyncstart hsyncend htotal
指定模式的水平定时。
VTimings vdisp vsyncstart vsyncend vtotal
指定模式的垂直定时。
Flags "flag" ...
flag指定模式的选项设置。"Interlace"设置模式是交错的。"DoubleScan"指定每个扫描行是双次的。"+HSync"和"-HSync"指定HSync信号的极性。"+VSync"和"-VSync"指定VSync信号的极性。"Composite"指定复合同步信号。"+CSync"和"-CSync"指定复合同步信号的极性。
HSkew hskew
指定像素数
VScan vscan
每根扫描线绘制的次数。"DoubleScan"加倍这个值。
ModeLine "name" mode-description
Mode项的紧凑版本。大多数情况下,X服务程序内含的VESA显示模式已经足够,您无需另外指定。
6.5.8 Screen节
一个配置文件中可以有多个Screen节,但至少要有一个。这一节表示了显示卡和监视器联结在一起的信息。当它出现在ServerLayout中时,这一节所表示的信息就是激活的,否则系统选择第一个出现的Screen节作为活动的。这一节描述了显示分辨率,缺省深度等信息。它必须包含至少一个Display子节,这些子节提供了与显示深度相关的信息。
Section "Screen" Identifier "name" Device "devid" Monitor "monid" entries … SubSection "Display" entries … EndSubSection … EndSection
Device "device-id"
指定这一节所使用的Device节,device-id和Device节的Identifier相同。
Monitor "monitor-id"
指定这一节所使用的Monitor描述
VideoAdaptor "xv-id"
指定可选的Xv适配器描述
DefaultDepth depth
指定缺省显示深度。
DefaultFbBpp bpp
指定缺省时使用的帧缓冲深度。
Display子节:
SubSection "Display" Depth depth entries … EndSubSection
Depth depth
指定此节表示的深度。
FbBpp bpp
指定此节表示的帧缓冲格式。
Weight red-weight green-weight blue-weight
指定16位显示时,RGB三种颜色所占的权重
Virtual xdim ydim
设置逻辑虚屏的大小,xdim一般要求为8或16的整数倍。注意:有的驱动程序不允许设置虚屏。
ViewPort x0 y0
设置初始显示的左上角。
Modes "mode-name" ...
设置此深度下的视频模式列表。所指定没个模式必须被双引号括起来。这必须和Monitor节指定的信息相对应,也就是说,Monitor节指定的扫描频率范围一定要包含对应的模式。
Visual "visual-name"
visual-name可用的类型是StaticGray GrayScale StaticColor PseudoColor TrueColor DirectColor
Black red green blue
White red green blue
分别可以指定黑色和白色的颜色
6.5.9 ServerLayout节
每个配置文件可以有多个ServerLayout节,一个ServerLayout表示多个Screen和一个或多个输入设备(InputDevice节)的组合。
Section "ServerLayout" Identifier "name" Screen "screen-id" … InputDevice "idev-id" … options … EndSection
Screen screen-num "screen-id" position-information
screen-id是强制的,指定引用的Screen节InputDevice "idev-id" "option" ...
idev-id也是强制的,指定被引用的InputDevice节,可以指定多个选项,它们之间由引号隔开,这些选项也是InputDevice节支持的,包括:"CorePointer","CoreKeyboard","SendCoreEvents"。
例如,指定两个鼠标:
Section "ServerLayout" Identifier "Layout 1" Screen "MGA 1" Screen "MGA 2" RightOf "MGA 1" InputDevice "Keyboard 1" "CoreKeyboard" InputDevice "Mouse 1" "CorePointer" InputDevice "Mouse 2" "SendCoreEvents" Option "BlankTime" "5" EndSection