Linux下设备的配置过程是指在检测到设备类型、设备当前工作参数等信息之后,使用这些信息来配置设备的驱动程序,工作方式等,(设备的检测过程参见 《如何在Linux下实现硬件的自动检测》)。要完成这样的任务,需要做两方面的工作:
其一是需要一个详尽的设备信息文件,这个文件描述了设备标识、与设备标识对应的设备驱动程序、设备配置参数(设备选项)、设备设置的详细描述、设备配置方法描述、设备对应的别名、设备的主设备号等信息。
现在的Linux内核中使用kmod来完成设备模块的自动加载,它的一般工作机制是:在第一次引用设备模块时,内核使用系统命令/sbin/modprobe加载这个设备模块。为了使这种机制正常工作,您首先需要使用depmod -a建立表述模块之间依赖关系的文件modules.dep,然后在/etc/modules.conf中设置正确的设备别名(关于/etc/modules.conf的详细介绍参见本文附录A),如果还需要设置设备对应的参数。举例来说,在设置网卡时网卡的驱动程序是ne2k-pci,网卡的设备别名是eth0,则在文件/etc/modules.conf中加入别名alias eth0 ne2k-pci,就设置了ne2000兼容的PCI网卡,这样当有程序要尝试访问网络时,内核会自动加载网卡驱动程序ne2k-pci。
其二是需要根据设备的类型,以及安装的Linux系统版本(不同的Linux发行版对于同一设备的配置脚本文件存在差异),设置设备对应的配置脚本文件。
1 配置键盘
1.1 配置键盘的设备模块
对于我们常见的键盘一般有三种类型,其一为老式的五针键盘,其二为ps/2键盘,其三是usb鼠标。对于前两种键盘,一般现在的Linux发行版都把它们需要的设备模块打包入内核,所以无需进行附加的模块插入操作,键盘就能够正常工作。而对于usb类型的键盘,一般而言,要使它正常工作必须先插入对应的设备模块。
对于usb类型的键盘,您若是要通过手动加载模块的方式使其工作,必须首先插入usb桥接器模块,然后您还必须插入键盘模块usbkbd.o,以及keybdev.o,这样usb键盘才能够正常工作。此时,运行的系统命令:
/sbin/modprobe usbkbd
/sbin/modprobe keybdev
对于2.2.x系列的内核若要内核的kmod在需要时自动加载则必须在/etc/modules.conf文件中设置别名usb-interface,它对应您所使用的桥接器模块。例如,当桥接器的类型为UHCI时,在/etc/modules.conf中加入设备别名:
alias usb-interface usb-uhci
对于2.4.x系列的内核,此设备别名则变为:
alias usb-controller usb-uhci
在设置了此别名之后,系统启动时会自动进行usb设备检测。当检测过程发现连结的设备是系统支持的,那么系统会自动插入所需的模块。
1.2 键盘配置文件
键盘的配置文件/etc/sysconfig/keyboard,它的内容很简单,可选配置项为KEYTABLE(随着发行版本的不同这个文件的内容会有所差异,但是这个字段是最重要的)。例如,当设置KEYTABLE = "us"时,表示系统使用美式键盘。
然后,为了正确的使用键盘上的功能键,您还需要调用命令dumpkeys生成文件/etc/sysconfig/console/default.kmap。
/usr/bin/dumpkeys > /etc/sysconfig/console/default.kmap
这个文件描述了键盘的键盘扫描码和加入键盘修饰之后的键盘的相应的键盘扫描码。
同样,为了键盘能在X系统环境下正常工作,您可能也需要在X系统下对键盘进行设置,这时您就必须使用xmodmap来设置正确的键盘映射。例如,
/usr/X11R6/bin/xmodmap /usr/share/xmodmap/xmodmap.fr
设置您的X系统下的键盘为法语键盘。
在正确的配置了/etc/sysconfig/keyboard文件之后,X系统的配置程序会根据此文件的信息配置X中关于键盘配置的小节。当此文件内容不正确或者是此文件不存在时,X系统是无法启动和配置的。
2 配置鼠标
2.1 鼠标的基本信息
Linux支持四种不同的总线鼠标硬件接口:Inport(Microsoft),Logitech,PS/2和ATI-XL。2.4内核也支持IBM PC110数字化板和Apple Desktop鼠标。
对于鼠标协议,大多数总线鼠标使用BusMouse协议,一些古老的Logitech鼠标使用MouseSystems协议,而一些更老的微软鼠标使用Logitech协议。PS/2鼠标总是使用PS/2协议。
不同类型的鼠标对应的设备文件:
接口类型 设备 主设备号 次设备号 Logitech /dev/logibm 10 0 PS/2 /dev/psaux 10 1 Inport /dev/inportbm 10 2 ATI-XL /dev/atibm 10 3 USB mouse /dev/input/mice 13 63表2-1创建对应设备的命令:
mknod /dev/logimm c 10 0
mknod /dev/psaux c 10 1
mknod /dev/inportbm c 10 2
mknod /dev/atibm c 10 3
mknod /dev/input/mice c 13 63
在创建了鼠标对应的设备文件之后,因为现在很多程序都使用/dev/mouse作为缺省的鼠标设备文件,所以为了使鼠标正常工作你还要创建一个符号连接/dev/mouse指向真实的鼠标设备文件。例如,对于ps/2鼠标,/dev/mouse指向/dev/psaux,对于usb鼠标,/dev/mouse/指向/dev/input/mice,对于串口鼠标/dev/mouse指向/dev/ttyS0。对于不同的linux发行版本,这些文件可能有所不同,上述介绍主要是基于Redhat发布的配置。
对于现在最常见的三种鼠标:串口鼠标、PS/2鼠标和USB鼠标而言,由于对PS/2鼠标支持一般都打在内核中,所以您也不需要在鼠标工作之前插入设备模块。但对于其他的两种鼠标,插入模块的操作一般是必须的。对于串口鼠标而言,您必须先插入模块serial.o,
/sbin/modprobe serial
成功的插入模块之后,如果串口鼠标支持即插即用的串口协议,您可以从串口(/dev/ttyS*)读到鼠标的类型信息,然后由此信息,完成鼠标的配置文件。对于USB鼠标,为了使其正常工作,您必须先插入模块usbmouse.o和mousedev.o
/sbin/modprobe usbmouse
/sbin/modprobe mousedev
同样,为了使鼠标驱动程序能够自动加载,您也需要在/etc/modules.conf文件中创建usb-interface(usb-controller)别名。
2.2 鼠标配置文件
正确配置鼠标必须生成配置文件/etc/sysconfig/mouse,它包括下列选项:MOUSETYPE、XMOUSETYPE、FULLNAME、XEMU3、DEVICE。该鼠标配置文件也是X配置文件中鼠标配置节的基础。如果没有这个文件,很多X配置程序将无法工作。
MOUSETYPE=
配置鼠标的类型,包括ps/2、Busmouse、imps2、netmouse、Microsoft、Logitech、MouseMan、MMHitTab、MouseSystems、pnp、logim、ms3、MMSeries等。
XMOUSETYPE=
X系统下配置的鼠标的类型,包括MouseMan、IntelliMouse、MMSeries、MMHittab、Logitech、MouseMan、Microsoft、MouseSystems、PS/2、BusMouse等。
FULLNAME=
描述鼠标设备的全名。例如,对于普通PS/2鼠标,其全名为PS/2|Standard。
XEMU3=
是否仿真三键鼠标,可选参数为yes或no。
DEVICE=
描述鼠标对应的设备文件。例如。对于普通PS/2鼠标,设备文件为psaux。
2.3 鼠标的配置技巧
通过gpm能在命令行方式下使用鼠标。这样在控制台方式下,就可以使用鼠标进行剪贴等操作了。例如,对于ps/2鼠标,它的配置方式是:
gpm -t ps/2 -m /dev/psaux
如果不指定-m选项,那么系统会去查找文件/dev/mouse。
鼠标移动不规则可能是因为对鼠标设置了错误的协议。如新的Logitech鼠标不使用Logitech协议,而用微软协议(MouseMan)。如果您的鼠标移动不规则,那您可能首先需要尝试更换一下MouseType(XMouseType)指定的值。
在X系统下,您如果需要更换鼠标的左、右键,那么可以执行xmodmap -e "pointer = 3 2 1"。
3 网卡配置过程
3.1 配置网卡的设备模块
按照总线类型来分,现在的以太网卡主要有PCI网卡、ISA网卡和PCMCIA网卡。为使这些网卡正常工作,要在/etc/modules.conf中设置设备别名eth0,以及要传递给驱动程序的设备参数。这样内核在需要使用驱动程序时,会由内核服务kmod使用系统命令modprobe(insmod)自动装载需要的设备模块。
在配置网卡时,如果此网卡能够自动检测,那么您只需要通过设备标识,在设备描述信息文件中查得它对应的设备驱动程序,然后再由此信息配置网卡。但是这种方法对于普通isa总线的ne2000兼容网卡就不适合了,因为它们在设计时一般不满足isapnp规范,因此无法读出它们的设备信息。但是这种类型的网卡一般使用ne作为设备驱动程序,但是为使其正常工作还须指定io地址和占用的irq。
例如,对于ne2000兼容的isa网卡,比如DE220X,它们的驱动程序为ne。此时要使这种网卡正常工作,需要在/etc/modules.conf文件中加入:
alias eth0 ne
options ne io=0x300 irq=5
一般而言,对于这种网卡,只有指定了正确的I/O地址空间,网卡才能正常工作。这个地址是和此网卡在DOS下使用的端口地址完全相同的。如果端口地址0x300上不能找到网卡,那么您可以试试0x240等其他地址。
3.2 网卡配置文件
要正确的配置网卡必须生成如下脚本文件,/etc/sysconfig/network,/etc/sysconfig/network-scripts/ifcfg-eth0(对于只有一个网卡时,多个网卡为ifcfg-eth1、ifcfg-eth2以此类推)和/etc/hosts。若您还需要配置域名解析服务,那么还要生成文件/etc/resolv.conf。
对于/etc/sysconfig/network脚本文件,最常用的可设置项包括NETWORKING,FORWARD_IPV4,HOSTNAME,DOMAINNAME,GATEWAY,GATEWAYDEV。注意:在没有配置网卡时,也要设置此文件,以使得本机的回环设备(lo)能够正常工作,此设备是很多linux内部通讯的基础。
NETWORKING=
表示系统是否使用网络,一般设置为yes。如果设为no,则不能使用网络,而且很多系统服务程序将无法启动。
FORWARD_IPV4=
表示是否支持ipv4的自动转发。一般在只有一块网卡时,设置此项为false。
HOSTNAME=
设置本机的主机名,这里设置的主机名要和/etc/hosts中设置的主机名对应。
DOMAINNAME=
设置本机的域名。
GATEWAY=
设置本机连接的网关的IP地址。例如,网关为10.0.0.2
GATEWAYDEV=
与此网关进行通讯时,所使用的网卡设备别名。例如,当使用了一块网卡,并连接了网关时,此时的值为eth0。
缺省没有网卡时的设置为:
NETWORKING="yes"
FORWARD_IPV4="false"
HOSTNAME="localhost.localdomain"
DOMAINNAME="localdomain"
/etc/sysconfig/network-scripts/ifcfg-*,描述网络接口的信息。每个不同的网络接口对应不同的文件。例如,ifcfg-eth0对应第一块网卡eth0可能出现的配置信息。常见的配置选项包括DEVICE、BOOTPROTO、IPADDR、NETMASK、NETWORK、BROADCAST、ONBOOT。
DEVICE=
描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为eth0。
BOOTPROTO=
设置网卡获得ip地址的方式,可能的选项为static,dhcp或bootp,分别对应静态指定的ip地址,通过dhcp协议获得的ip地址,通过bootp协议获得的ip地址。
IPADDR=
如果设置网卡获得ip地址的方式为静态指定,此字段就指定了网卡对应的ip地址。
NETMASK=
网卡对应的网络掩码。
NETWORK=
网卡对应的网络地址。
BROADCAST=
对应的子网广播地址。
ONBOOT=
系统启动时是否设置此网络接口,设置为yes时,系统启动时激活此设备。
/etc/resolv.conf,系统生成这个文件进行域名解析。否则,安装过程的反向名查询无法工作。可能出现的选项:
search domainName指定的域名
nameserver dnsServer 域名服务器,可以指定多个。
/etc/hosts,将主机名列表加入此文件。
4 Modem配置过程
对于Modem的配置过程而言,我们现在一般使用kppp进行拨号,使用这个程序整个拨号过程将变得非常简单。因此本文就不再介绍使用pppd和chat进行的手工拨号过程了。本文仅介绍一下如何设置基本的设备驱动模块和底层设备文件的配置。在配置这些文件之后,您就可以使用kppp拨号了。
4.1 外置Modem
在配置外置Modem时,因为大部分的Modem都是通过串口连接到计算机上的,所以在配置Modem之前,您必须插入串口驱动模块serial.o。在成功插入串口通讯模块之后,这时只要将设备/dev/modem连接到相应的串口设备上就可以了。例如,在/dev/ttyS0(对应Windows下的COM1)上连接了Modem,则建立连接:
ln -sf /dev/ttyS0 /dev/modem
在这之后,外置的串口modem就可以正常工作了。您可以通过使用minicom向串口发送AT命令,来检测和配置modem的工作方式。经常使用的命令:
AT命令 命令描述 ATDT(ATDP) 使用语音(脉冲)进行拨号 ATZ 复位调制解调器 ATH 挂起电话 ATI0 返回调制解调器的状态 ATI1 执行ROM校验和检查并返回值 ATI2 验证ROM校验,返回OK或ERROR ATI3 返回ROM部件的软件版本号。 ATI4 查询调制解调器的状态信息,包括波特率、奇偶校验位长度,字长度、拨号方式、寄存器状态等信息。 ATI5 查询调制解调器的ram中的状态信息。 ATI6 查询调制解调器的链路状态信息,包括已传送(接收、丢失)的字符数、传送的数据块数目、链路连接状态、最后一次拨号时间等。 ATI7 获得配置的序言文件,此文件描述的信息包括:modem支持的通讯协议,Fax版本号,EPROM的版本号。 ATI8 获得连接时间 ATI9 获得调制解调器的描述名称表 4-1例如,对于一款联想射雕外置式Modem,在启动minicom之后,输入ATI9的返回值为:
(1.0AKY1010\\Modem\AKY1010\56K DATA FAX VOICE MODEM)FF
4.2 内置的Linmodem
Linmodem是winmodem的Linux实现。关于Linmodem的进一步信息您可以访问www.linmodems.org。现在的Linmodem一般都是PCI类型的,您也可以通过PCI检测过程,获得设备设备描述信息。在获得描述信息之后,您可以比较一下您的Modem是否属于下面列出的Modem类型。现在支持的Linmodem包括:
Linmodem为了在某种程度上和外置调制解调器的编程接口一致,所以一般都要生成一个仿真的串口设备。为了生成这些设备文件,一般可以使用命令mknod。
Lucent LT:chgrp uucp /dev/ttyS14
chmod 666 /dev/ttyS14
可允许非根用户使用此服务拨号。
ln -s /dev/devicefile /dev/modem
您也可以使用setserial,修改串口配置,比如设置串口的波特率,同样也可以设置/etc/serial.conf设置串口的工作参数。
setserial -agv /dev/ttyS*
5 声卡配置过程
5.1 内核声卡驱动程序的配置
现在正在使用的声卡主要有PCI和ISA两种。在Linux系统下,对这两种类型声卡的配置过程实际上是生成配置文件/etc/modules.conf,建立正确的设备别名和声卡设备驱动程序的对应关系。在正确的设置驱动模块之后,使用混音器程序设置声卡的输出音量。
若您的声卡是ISA PnP类型的,那么如果这块声卡在dos(windows)系统下也工作良好,那么您可以先记住声卡的工作参数,包括IRQ、DMA和I/O。一般而言,在Linux系统下应该使用和DOS下一样的参数。
如果您不知道它的工作参数,您可以通过/proc/isapnp获得声卡的配置空间,它包括dma、ioport和irq等信息。然后您可以通过检查/proc/interrupts,/proc/ioports和/proc/dma文件获知系统中空闲的irq、ioports和dma等信息,由此您可以选择合适的声卡配置参数。
在2.4.x内核中,实现了ISA PnP支持,同时一部分声卡驱动程序现在也支持无需使用isapnp工具完成自动检测和配置了。关于声卡设备的详细信息您也可以查看内核文档/usr/src/linux/Documentation/sound/中的文件。
对于PCI声卡而言,它们的驱动程序包含了自动检测过程,所以您只需要插入正确的驱动模块,声卡一般就能正常工作了。
在声卡模块被第一次引用时,内核会要求加载相应的驱动模块。与声卡模块对应的设备别名是sound-slot-0(0表示系统中的一个声卡,以此类推)。例如,在/etc/modules.conf中加入:
alias sound-slot-0 esssolo1
就配置了ESS Solo-1声卡。这条语句表示在需要声卡时,自动加载模块esssolo1。
有时加载了sound-slot-0对应的设备模块之后,并不能使声卡的所有功能生效。这时设备就会请求访问sound-service-0-n别名。n代表了不同的设备:
编号 对应的设备 0 混音器(Mixer) 2 MIDI 3,4 DSP表 5-1这时就要求您设置正确的声卡服务模块别名,这样声卡才能够正常工作。声卡对应的设备文件:
设备文件名 设备描述 /dev/audio 正常连接到/dev/audio0 /dev/audio0 sun工作站兼容的声音设备(仅部分实现,不支持sun ioctl接口,仅支持u-law编码) /dev/audio1 第二个声音设备(安装多个声卡时使用) /dev/dsp 正常连接到/dev/dsp0 /dev/dsp0 第一个数字采样设备 /dev/dsp1 第二个数字采样设备 /dev/mixer 正常连接到/dev/mixer0 /dev/mixer0 第一个声音混音器 /dev/mixer1 第二个声音混音器 /dev/music 高级序列化接口 /dev/sequencer 底层MIDI,FM和GUS存取 /dev/sequencer2 正常连接到/dev/music /dev/midi00 第一个原MIDI端口 /dev/midi01 第二个原MIDI端口 /dev/midi02 第三个原MIDI端口 /dev/midi03 第四个原MIDI端口 /dev/sndstat 显示声音驱动程序的状态表 5-2pc扬声器提供下列设备:
/dev/pcaudio 等价于/dev/audio
/dev/pcsp 等价于/dev/dsp
/dev/pcmixer 等价于/dev/mixer
您可以直接将声音文件送入对应的设备,比如,将.au声音文件通过将其送入/dev/audio中播放,原始采样也可被送入/dev/dsp。
cat sample.su > /dev/audio
但是这样做一般效果较差,播放时应采用play命令。对于wavplay和vplay(snd-util包)会以最好的效果播放wav文件,但是它们不能识别微软adpcm压缩的wav文件。若手动设置争取正确的参数之后,splay用于播放大多数声音文件。
读/dev/audio和/dev/dsp返回的采样数据可以重定向到一个文件。vrec可以使这个过程更容易。可能需要一个混音器程序选择适当的输入设备。
5.2 ALSA声卡驱动程序的配置
对于声卡驱动程序,除了内核自带的驱动程序之外,您还可以使用Advanced Linux Sound Architecture(ALSA,http://www.alsa-project.org/)提供的驱动程序。它支持一系列主流声卡,同时它和内核的声音结构互相兼容,在某种程度上,可以说是内核的声卡驱动模块的补充。
ALSA的声卡驱动程序的一般命名规则是snd-card-<soundcard>。soundcard代表不同类型的声卡。例如,对于所有的16位Soundblaster声卡,它们对应的驱动程序模块为snd-card-sb16。
若与需要linux内核声音驱动的向后兼容性,您还需要两个模块snd-pcm-oss和snd-mixer-oss。对于amixer设置的多个混音器,它们都是针对不同的设备的。比如CD通道的设置是针对CD播放器的。而很多应用程序,如象mpg123,xmms,realplayer,都要依赖PCM通道的设置。MIC代表麦克风。不同的Gain部分对于不同的使用能提供特别的增益。
缺省情况下ALSA静音所有的输出。为了获得声音,必须解除主音量和PCM音量的静音。
amixer -c 0 sset 'Master',0 100%,100% unmute
amixer -c 0 sset 'PCM ',0 100% unmute
选项包括mute,unmute,capture,nocapture,rec,norec,数字或left:right。amixer不带参数运行时,返回声卡上所有通道的设置情况。
为了在每次插入声卡驱动模块时,都打开静音,您可以在/etc/modules.conf加入下列语句:
post-install snd-card-sb16 amixer -c 0 sset 'Master',0 100%,100% unmute && amixer -c 0 sset 'PCM ',0 100% unmute
在成功插入了alsa声卡模块之后,系统会出现/proc/asound目录,这个目录描述了声卡的工作情况,以及创建的设备文件。
在您加载snd-pcm-oss设备模块之后,你也能使用与oss兼容的方式存取声卡,这时如下的映射会被完成:
ALSA设备 OSS设备 次设备号 /dev/snd/pcmC0D0 /dev/audio0(/dev/audio) 4 /dev/snd/pcmC0D0 /dev/dsp0(/dev/dsp) 3 /dev/snd/pcmC0D1 /dev/adsp(/dev/adsp) 12 /dev/snd/pcmC1D0 /dev/audio1 20 /dev/snd/pcmC1D0 /dev/dsp1 19 /dev/snd/pcmC1D1 /dev/adsp1 28 /dev/snd/pcmC2D0 /dev/audio2 36 /dev/snd/pcmC2D0 /dev/dsp2 35 /dev/snd/pcmC2D1 /dev/adsp2 44表 5-3对于/dev/mixer设备,要加载snd-mixer-oss,可以保证和老的oss混音器的兼容性。如果您插入了上述设备之后,声音系统仍无法正常工作,您可以运行snddevices命令,建立正确的设备文件。
由于为使ALSA正常工作,需要设置大量的设备别名,下面就给出一个/etc/modules.conf的例子,它能够完成ESS Solo1声卡的自动配置工作。其他的ALSA设备的设置也基本与此声卡相同。
# 设置ALSA设备的主设备号,它固定为116
alias char-major-116 snd
# 设置OSS设备的主设备号,它固定为14,这使得ALSA复用OSS设备
alias char-major-14 soundcore
# ALSA设备别名
alias sound-card-0 snd-card-es1938
# OSS设备别名
alias sound-slot-0 sound-card-0
# 安装不同的声卡服务
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias snd-minor-oss-12 snd-pcm-oss
# 运行amixer命令,打开声音输出
post-install snd-card-es1938 amixer -c 0 sset 'Master',0 100%,100% unmute && amixer -c 0 sset 'PCM ',0 100% unmute
6 窗口系统(XFree86)的配置过程
6.1 显示卡的描述文件介绍(CardDB)
CardDB是X配置程序使用的显示卡数据文件。在对XFree86进行配置时,配置程序一般都需要读取其上的内容完成显示卡的配置。它的内容与使用的XFree86的版本密切相关。一般而言,它保存的位置是在/usr/X11R6/lib/X11/目录下。现在我们就对XFree86 4.1.0的CardDB文件进行简单的介绍:
NAME
显示卡的描述名称
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时,键盘和鼠标的描述都对应InputDevice节,只是对应不同的驱动模块,键盘的驱动模块是keyboard,鼠标的驱动模块是mouse。配置这两节所需要的信息可以从/etc/sysconfig/keyboard和/etc/sysconfig/mouse中获得,它们的详细内容,本文的前面章节已作了介绍。
配置显示器实际上是生成XF86Config文件的Monitor节,需要配置的信息一般包括:水平扫描频率范围、垂直扫描频率范围、监视器支持的显示模式、制造商信息。对于支持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表 6-1
从上表可以看出,您要设置显示器达到某一分辨率,那么与此相对应,它的扫描频率范围也要包含上表中此分辨率的最低扫描频率。如果您的显示器达不到这个范围,那么XWindow将无法正常工作。如果您设置的扫描频率高于显示器实际的扫描频率范围,由于XFree86会寻找对应分辨率下最高扫描频率进行显示,所以此时XWindow将极有可能黑屏。
在生成配置脚本时,扫描频率的范围也不是越低越好。设置较低的扫描频率范围对于部分LCD显示器就不合适。比如,一部分LCD显示器在800x600分辨率时,最低支持的垂直扫描频率为70Hz,那么您这时指定的水平回扫范围一定要包含48kHz。
在配置完显示器之后,您就需要生成与显示卡对应的描述了。这样的描述信息对应XF86Config文件的Device节。这一节主要描述的显示卡信息包括:显示卡对应的X服务器(X版本在3.x),对应的X设备模块(X版本为4.x),显示卡的设备信息(供应商、型号、支持显存存取方式和显存大小等),以及此显示卡支持的设备选项,比如显示卡是否支持硬件加速、是否支持软光标等。生成窗口系统的配置过程一般是先由pci的设备标识(检测过程见)获得显示卡的类型,由此在XFree86的配置文件CardDB(这个文件可在/usr/X11R6/lib/X11/目录下找到)中查得它对应的显示卡描述,由此信息可以设置此节的描述。
字体和调色板信息描述的是字体和调色板所存放的路径,您如果新加入字体时,需要在此加入正确的字体路径。设置字体路径时,如果指定它为unix:-1,那么就是说您在启动X服务器之前,必须首先启动字体服务器xfs,然后由字体服务器完成字体的访问请求。
在您正确的设置了上述信息之后,您必须将这些信息存放在Screen节中。这一节描述的是完成显示对应的显示卡,显示器,分辨率和缺省深度等信息。
最后,您还必须生成ServerLayout节,由它描述整个系统所使用的显示卡配置节、监视器配置节、鼠标配置节、键盘配置节等信息。
在生成了/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的显卡主要有:
ATI PCI VideoExpression 2MB (max. 1280x1024 @ 8bit)
ATI PCI All-in-Wonder
Matrox Millennium PCI - BIOS v3.0
Matrox Millennium II PCI - BIOS v1.5
Matrox Millennium II AGP - BIOS v1.4
Matrox Millennium G200 AGP - BIOS v1.3
Matrox Mystique & Mystique 220 PCI - BIOS v1.8
Matrox Mystique G200 AGP - BIOS v1.3
Matrox Productiva G100 AGP - BIOS v1.4
All Riva 128 based cards
Diamond Viper V330 PCI 4MB
Genoa Phantom 3D/S3 ViRGE/DX
Hercules Stingray 128/3D with TV output
Hercules Stingray 128/3D without TV output - needs BIOS upgrade (free from
[email protected])
SiS 6326 PCI/AGP 4MB
STB Lightspeed 128 (Nvida Riva 128 based) PCI
STB Velocity 128 (Nvida Riva 128 based) PCI
Jaton Video-58P ET6000 PCI 2MB-4MB (max. 1600x1200 @ 8bit)
Voodoo2 2000
主板集成显示卡:
Trident Cyber9397
SiS 5598
启动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
表 6-2
向内核传递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服务器的字体路径、调色板路径和模块路径。
<trans>/<hostname>:<port-number>
<trans>指定与字体服务器连接的传输类型(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/
RGBPath "path"
rgb颜色数据库的路径,缺省值为:/usr/X11R6/lib/X11/rgb。
ModulePath "path"
设置可加载的X服务器模块的查找路径。
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
最常见的InputDriver是"keyboard"和"mouse"。
Option "CorePointer"
设备被作为核心指针安装。系统必须要有一个核心指针。
Option "CoreKeyboard"
在这一选项被设置时,设备被作为核心键盘安装。系统中有且只有一个核心键盘。
Option "AlwaysCore" "boolean"
Option "SendCoreEvents" "boolean"
上面的两个选项是等价的,它引起输入设备总是报告核心事件。它可以用于附加的指针设备生成核心事件。
Option "HistorySize" "number"
设置移动历史的大小,缺省是0。
6.5.6 Device节
这一节描述显示卡对应的信息,它的内容一般从CardDB文件中显示卡对应的描述中获得。若此设备节被Screen节引用,则认为此节是可用的。
Section "Device"
Identifier "name"
Driver "driver"
entries
… …
EndSection
BusID "bus-id"
指定图形卡的总线位置。对于PCI/AGP卡,bus-id串具有PCI:bus:device:function的格式。XFree86支持多个显示卡的同时显示
Screen number
VideoRam mem
此选项指定图形卡的RAM数量,以KB为单位。X服务程序会自动探测显示卡,所以此字段一般并不需要指定。
Chipset "chipset"
图形卡上的芯片组类型。
Ramdac "ramdac-type"
DacSpeed speed
DacSpeed speed-8 speed-16 speed-24 speed-32
ClockChip "clockchip-type"
BiosBase baseaddress
MemBase baseaddress
IOBase baseaddress
ChipID id
ChipRev rev
TextClockFreq freq
以上10个字段,它们表示一些具体的X配置参数。一般在配置X服务器时无需指定,而由自动检测决定它们的值。
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
本文地址:http://com.8s8s.com/it/it1921.htm