Chinaunix首页 | 论坛 | 博客
  • 博客访问: 909070
  • 博文数量: 436
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -103
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-01 09:48
个人简介

爱生活,爱IT

文章分类

全部博文(436)

文章存档

2015年(1)

2014年(2)

2013年(6)

2011年(39)

2010年(176)

2009年(30)

2008年(28)

2007年(54)

2006年(91)

2005年(9)

分类: LINUX

2006-02-13 19:19:31

于辰涛
软件工程师, 联想(北京)电脑公司
2001 年 8 月

本文是 《如何在Linux下实现硬件的自动检测》的姊妹篇。将为您介绍在进行了设备检测,通过设备信息文件获得了设备对应的驱动程序,工作参数等信息后,如何对于几种最常见的设备进行配置、生成正确的配置脚本,以使设备正常工作。

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发行版对于同一设备的配置脚本文件存在差异),设置设备对应的配置脚本文件。



对于我们常见的键盘一般有三种类型,其一为老式的五针键盘,其二为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设备检测。当检测过程发现连结的设备是系统支持的,那么系统会自动插入所需的模块。


键盘的配置文件/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系统是无法启动和配置的。



Linux支持四种不同的总线鼠标硬件接口:Inport(Microsoft),Logitech,PS/2和ATI-XL。2.4内核也支持IBM PC110数字化板和Apple Desktop鼠标。

  • Inport mice
    Inport mice包含大多数旧类型的微软鼠标。Inport mice通常连接到主板的接口卡上。假如鼠标线连接头是圆的,有9针,则可能是Inport mice。
  • Logitech mice
  • PS/2 mice
  • ATI combo video/mice
  • IBM PC110 palmtop digitizer
  • Apple Desktop Mouse
  • Hybrid Mice

对于鼠标协议,大多数总线鼠标使用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

创建对应设备的命令:

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)别名。


正确配置鼠标必须生成配置文件/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。


通过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"。



按照总线类型来分,现在的以太网卡主要有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等其他地址。


要正确的配置网卡必须生成如下脚本文件,/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,系统生成这个文件进行域名解析。否则,安装过程的反向名查询无法工作。可能出现的选项:
searchdomainName指定的域名
nameserverdnsServer 域名服务器,可以指定多个。
/etc/hosts,将主机名列表加入此文件。


对于Modem的配置过程而言,我们现在一般使用kppp进行拨号,使用这个程序整个拨号过程将变得非常简单。因此本文就不再介绍使用pppd和chat进行的手工拨号过程了。本文仅介绍一下如何设置基本的设备驱动模块和底层设备文件的配置。在配置这些文件之后,您就可以使用kppp拨号了。


在配置外置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 获得调制解调器的描述名称

例如,对于一款联想射雕外置式Modem,在启动minicom之后,输入ATI9的返回值为:
(1.0AKY1010\\Modem\AKY1010\56K DATA FAX VOICE MODEM)FF


Linmodem是winmodem的Linux实现。关于Linmodem的进一步信息您可以访问。现在的Linmodem一般都是PCI类型的,您也可以通过PCI检测过程,获得设备设备描述信息。在获得描述信息之后,您可以比较一下您的Modem是否属于下面列出的Modem类型。现在支持的Linmodem包括:

  • Conexant/Rockwell HSF
    它的驱动程序在 。
  • Ambient Technology (formerly Cirrus Logic)
    驱动程序在 。
  • Lucent LT
  • PCTel
    PCI、AMR和Zoltrix Phantom类型的二进制驱动程序: 。
  • ESS
    ES56T-PI (PCI) and ES56V-I (ISA)的二进制驱动程序:
    ISA: 。
    PCI: 。
  • 3Com Mini-PCI
    无可用驱动程序。

Linmodem为了在某种程度上和外置调制解调器的编程接口一致,所以一般都要生成一个仿真的串口设备。为了生成这些设备文件,一般可以使用命令mknod。

  • Lucent LT:
    mknod /dev/ttyS14 c 62 78
  • PCTel:
    mknod /dev/ttyS15 c 62 79
  • Esscom:
    mknod /dev/esscom c 127 1。esscom用户希望连接/dev/ttyS14到/dev/esscom,以使得仅识别ttyS*的ppp拨号程序能正常使用。

    chgrp uucp /dev/ttyS14
    chmod 666 /dev/ttyS14
    可允许非根用户使用此服务拨号。
    ln -s /dev/devicefile /dev/modem

    您也可以使用setserial,修改串口配置,比如设置串口的波特率,同样也可以设置/etc/serial.conf设置串口的工作参数。
    setserial -agv /dev/ttyS*



现在正在使用的声卡主要有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

这时就要求您设置正确的声卡服务模块别名,这样声卡才能够正常工作。声卡对应的设备文件:


设备文件名 设备描述
/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 显示声音驱动程序的状态

pc扬声器提供下列设备:

/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可以使这个过程更容易。可能需要一个混音器程序选择适当的输入设备。


对于声卡驱动程序,除了内核自带的驱动程序之外,您还可以使用Advanced Linux Sound Architecture(ALSA,)提供的驱动程序。它支持一系列主流声卡,同时它和内核的声音结构互相兼容,在某种程度上,可以说是内核的声卡驱动模块的补充。

ALSA的声卡驱动程序的一般命名规则是snd-card-。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

对于/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

待续

关于作者
于辰涛,联想(北京)电脑公司软件工程师。目前主要从事Linux系统安装程序的开发工作,主要研究兴趣是操作系统的工作机制和开发底层系统程序。您可以通过电子邮件 scu_yct@263.net 跟他联系。
阅读(1628) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~