Linux下设备驱动

来源:互联网 发布:大数据时代 电子书 编辑:程序博客网 时间:2024/06/05 00:55

本讲主要概述Linux设备驱动框架、驱动程序的配置文件及常用的加载驱动程序的方法;并且介绍Red Hat Linux安装程序是如何加载驱动的,通过了解这个过程, 我们可以自己将驱动程序放到引导盘中;安装完系统后,使用kudzu自动配置硬件程序。

Linux设备驱动概述

1. 内核和驱动模块
操作系统是通过各种驱动程序来驾驭硬件设备,它为用户屏蔽了各种各样的设备,驱动硬件是操作系统最基本的功能,并且提供统一的操作方式。正如我们查看屏幕上的文档时,不用去管到底使用nVIDIA芯片,还是ATI芯片的显示卡,只需知道输入命令后,需要的文字就显示在屏幕上。硬件驱动程序是操作系统最基本的组成部分,在Linux内核源程序中也占有较高的比例。

Linux内核中采用可加载的模块化设计(LKMs ,Loadable Kernel Modules),一般情况下编译的Linux内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,其它的代码可以选择是在内核中,或者编译为内核的模块文件。

如果需要某种功能,比如需要访问一个NTFS分区,就加载相应的NTFS模块。这种设计可以使内核文件不至于太大,但是又可以支持很多的功能,必要时动态地加载。这是一种跟微内核设计不太一样,但却是切实可行的内核设计方案。

我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM(高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。

理解这一点很重要。因此,加载驱动时就是加载内核模块。下面来看一下有关模块的命令,在加载驱动程序要用到它们:lsmod、modprob、insmod、rmmod、modinfo。

lsmod 列出当前系统中加载的模块,例如:

#lsmod  (与cat /proc/modules 得出的内容是一致的)            Module  Size     Used by  Not tainted            radeon  115364   1            agpgart  56664   3            nls_iso8859-1 3516   1     (autoclean)            loop  12120   3     (autoclean)            smbfs  44528   2     (autoclean)            parport_pc 19076   1     (autoclean)            lp   9028   0     (autoclean)            parport  37088   1      (autoclean) [parport_pc lp]            autofs  13364   0     (autoclean) (unused)            ds   8704   2            yenta_socket 13760   2            pcmcia_core 57184   0     [ds yenta_socket]            tg3  55112   1            sg   36940   0     (autoclean)            sr_mod  18104   0     (autoclean)            microcode     4724   0     (autoclean)            ide-scsi         12208    0            scsi_mod        108968   3     [sg sr_mod ide-scsi]            ide-cd        35680   0            cdrom  33696    0     [sr_mod ide-cd]            nls_cp936  124988   1     (autoclean)            nls_cp437        5148   1     (autoclean)            vfat  13004   1     (autoclean)            fat         38872   0     (autoclean) [vfat]            keybdev  2976   0     (unused)            mousedev  5524     1            hid  22212    0     (unused)            input  5888   0     [keybdev mousedev hid]            ehci-hcd  20104   0 (unused)            usb-uhci  26412   0 (unused)            usbcore  79392   1 [hid ehci-hcd usb-uhci]            ext3  91592   2            jbd  52336   2 [ext3]



上面显示了当前系统中加载的模块,左边数第一列是模块名,第二列是该模块大小,第三列则是该模块使用的数量。

如果后面为unused,则表示该模块当前没在使用。如果后面有autoclean,则该模块可以被rmmod -a命令自动清洗。rmmod -a命令会将目前有autoclean的模块卸载,如果这时候某个模块未被使用,则将该模块标记为autoclean。如果在行尾的[ ]括号内有模块名称,则括号内的模块就依赖于该模块。例如:

cdrom  34144 0 [sr_mod ide-cd]



其中ide-cd及sr_mod模块就依赖于cdrom模块。

系统的模块文件保存在/lib/modules/2.4.XXX/kerne目录中,根据分类分别在fs、net等子目录中,他们的互相依存关系则保存在/lib/modules/2.4.XXX/modules.dep 文件中。

需要注意,该文件不仅写入了模块的依存关系,同时内核查找模块也是在这个文件中,使用modprobe命令,可以智能插入模块,它可以根据模块间依存关系,以及/etc/modules.conf文件中的内容智能插入模块。比如希望加载ide的光驱驱动,则可运行下面命令:

# modprobe ide-cd



此时会发现,cdrom模块也会自动插入。

insmod也是插入模块的命令,但是它不会自动解决依存关系,所以一般加载内核模块时使用的命令为modprobe。

rmmod可以删除模块,但是它只可以删除没有使用的模块。

Modinfo用来查看模块信息,如modinfo -d cdrom,在Red Hat Linux系统中,模块的相关命令在modutils的RPM包中。

2.设备文件

当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。

系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block(块)型设备文件、Character(字符)型设备文件和Socket(网络插件)型设备文件。Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。

而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的BSD socket 接口。

#ls -l /dev/hda /dev/video0 /dev/log            brw-rw----    1 root     disk       3,   0 Sep 15  2003 /dev/hda            srw-rw-rw-    1 root     root            0 Jun  3 16:55 /dev/log            crw-------    1 root     root      81,   0 Sep 15  2003 /dev/video0



上面显示的是三种设备文件,注意它们最前面的字符,Block型设备为b,Character型设备为c,Socket设备为s。

由此可以看出,设备文件都放在/dev目录下,比如硬盘就是用/dev/hd*来表示,/dev/hda表示第一个IDE接口的主设备,/dev/hda1表示第一个硬盘上的第一个分区;而/dev/hdc 表示第二个IDE接口的主设备。可以使用下面命令:

#dd if=/dev/hda of=/root/a.img bs=446 count=1



把第一个硬盘上前446个字节的MBR信息导入到a.img文件中。
对于Block和Character型设备,使用主(Major)和辅(minor)设备编号来描述设备。主设备编号来表示某种驱动程序,同一个设备驱动程序模块所控制的所有设备都有一个共同的主设备编号,而辅设备编号用于区分该控制器下不同的设备,比如,/dev/hda1(block 3/1)、/dev/hda2(block 3/2 )和/dev/hda3( block3/3 )都代表着同一块硬盘的三个分区,他们的主设备号都是3,辅设备号分别为1、2、3。 这些设备特殊文件用mknod命令来创建:

# mknod harddisk b 3 0



我们就在当前位置创建出一个与 /dev/hda一样的、可以访问第一个IDE设备主硬盘的文件,文件名叫做harddisk。

使用下面命令可以查看设备编号:

#file /dev/hda            /dev/hda: block special (3/0)



其中Block代表/dev/hda是系统的Block型(块型)设备文件,它的主设备编号为3,辅设备编号为0。

#ls -l /dev/hda /dev/hdb            brw-rw----    1 root     disk       3,   0 Sep 15  2003 /dev/hda            brw-rw----    1 root     disk       3,  64 Sep 15  2003 /dev/hdb



使用ls -l也可以看到设备编号,/dev/hdb代表第一个IDE接口的从设备(Slave)也是Block设备,编号为(3/64),还有另外一种设备文件是/dev/tty*。使用如下命令:

#echo "hello tty1" > /dev/tty1



将字符串“hello tty1”输出到/dev/tty1代表的第一个虚拟控制台上,此时按“Alt + F1”可以看到该字符出现在屏幕上,这个特殊的文件就代表着我们的第一虚拟控制台。

#file /dev/tty1            /dev/tty1: character special (4/1)



由上可以看到,它的类型为Character 型(字符型)设备文件,主设备号为4,辅设备号为1。同样,/dev/tty2代表着第二个虚拟控制台,是Character设备,编号为 (4/2)。

当将/dev/cdrom加载到/mnt/cdrom中时,只要访问/mnt/cdrom系统就会自动引入到/dev/cdrom对应的驱动程序中,访问实际的数据。

有关设备文件的编号可以看内核文档/usr/src/linux-2.*/Documentation/devices.txt 文件(在Kernel的源文件解包后的Documentation目录中),其中详细叙述了各种设备文件编号的意义。
3.使用/proc目录中的文件监视驱动程序的状态

通过设备文件怎样访问到相应的驱动程序呢?它们中间有一个桥梁,那就是proc文件系统,它一般会被加载到/proc目录。访问设备文件时,操作系统通常会通过查找/proc目录下的值,确定由哪些驱动模块来完成任务。如果proc文件系统没有加载,访问设备文件时就会出现错误。

Linux系统中proc文件系统是内核虚拟的文件系统,其中所有的文件都是内核中虚拟出来的,各种文件实际上是当前内核在内存中的参数。它就像是专门为访问内核而打开的一扇门,比如访问/proc/cpuinfo文件,实际上就是访问目前的CPU的参数,每一次系统启动时系统都会通过/etc/fstab中设置的信息自动将proc文件系统加载到/proc目录下:

# grep proc /etc/fstab            none /proc  proc    defaults        0 0            此外,也可以通过mount命令手动加载:            # mount -t proc none /proc



通过/proc目录下的文件可以访问或更改内核参数,可以通过/proc目录查询驱动程序的信息。下面先让我们看一下/proc目录中的信息:

# ls /proc            1  4725  5032  5100  5248  5292  crypto  kcore  partitions            14 4794  5044  5110  5250  5293  devices  kmsg  pci            2  4810  5075  5122  5252  5295  dma    ksyms self            3  4820  5079  5132  5254  5345 driver loadavg slabinfo            4     4831  5080  5151  5256  6        execdomains  locks    stat            4316  4910  5081  5160  5258  7        fb           lvm      swaps            4317  4912  5082  5170  5262  70       filesystems  mdstat   sys            4318  4924  5083  5180  5271  8        fs           meminfo  sysrq-trigger            4319  4950  5084  5189  5287  9        ide          misc     sysvipc            4620  4963  5085  5232  5288  apm      interrupts   modules  tty            4676  5     5086  5242  5289  bus      iomem        mounts   uptime            4680  5005  5087  5244  5290  cmdline  ioports      mtrr     version            4706  5018  5088  5246  5291  cpuinfo  irq          net



需要知道的是,这些文件都是实时产生的虚拟文件,访问它们就是访问内存中真实的数据。这些数据是实时变化产生的,可以通过以下命令来查看文件的具体值:

# cat /proc/interrupts            CPU0            0:      50662     XT-PIC  timer            1:          3     XT-PIC  keyboard            2:          0     XT-PIC  cascade            5:        618     XT-PIC  ehci-hcd, eth1            8:          1     XT-PIC  rtc            9:          0     XT-PIC  usb-uhci, usb-uhci            11:         50     XT-PIC  usb-uhci, eth0            12:         16     XT-PIC  PS/2 Mouse            14:       8009     XT-PIC  ide0            15:          0     XT-PIC  ide1            NMI:          0            ERR:          0



其它文件的含意见表1所示。

/proc/sys目录下的文件一般可以直接更改,相当于直接更改内核的运行参数,例如:

# echo 1 > /proc/sys/net/ipv4/ip_forward



上面代码可以将内核中的数据包转发功能打开。

另外,Linux系统中提供一些命令来查询系统的状态,如free可以查看目前的内存使用情况,ide_info可以查看ide设备的信息,例如:

#ide_info /dev/had



类似的命令还有scsi_info,可以查看SCSI设备的信息。这些命令一般也是查询/proc目录下的文件,并返回结果。
系统初始化过程驱动程序的安装

在Linux安装过程中,系统上的硬件会被检测,基于检测到的结果安装程序会决定哪些模块需要在引导时被载入。Red Hat的安装程序为anaconda,它提供了自动检测硬件,并且安装的机制。

但是,如果计算机内的某些硬件没有默认的驱动程序,比如一块SCSI卡,我们可以在启动后的boot提示符下,输入“linux dd”,在加载完内核后,系统会自动提示插入驱动盘,这时就有机会把该硬件的Linux驱动程序装入。

如果在安装系统时,某种硬件总是因为中断冲突(ISA总线的设备较常见,比如一块ISA网卡)没法正常驱动,或者是缺少驱动程序,那么可以在boot提示符下输入“linux noprobe”。在这种模式下,安装程序不会自动配置找到的硬件,可以自己来选择现有驱动,配置驱动程序的参数,或者选择用光盘或软盘加载驱动程序。

定制引导盘

系统启动时是如何加载驱动的?下面让我们来看一下Red Hat的安装光盘是怎样引导的。当Linux安装光盘启动时,加载位于光盘上isolinux中的内核文件vmlinuz,内核运行完毕后,又将initrd.img的虚拟文件系统加载到内存中。这个文件为ext2文件系统的镜像,经过gzip压缩,可以通过以下步骤查看该镜像中的内容:

# mount /mnt/cdrom            # mkdir /mnt/imgdir            # gunzip < /mnt/cdrom/isolinux/initrd.img > /ext2img            # mount -t ext2 -o loop /ext2img /mnt/imgdir            # cd /mnt/imgdir            # ls -F            bin@            dev/            etc/            linuxrc@            lost+found/            modules/            proc/            sbin/            tmp/            var/            # cd modules            # ls            module-info            modules.cgz            modules.dep            modules.pcimap            pcitable



其中modules.dep为模块的注册文件,同时有各种模块的依存关系。modules.cgz为cpio的打包文件,实际的各种驱动模块就在该文件中。我们可以通过以下命令解包:

# cpio -idmv < modules.cgz



由此可以看到,解包出来的目录2.4.21-4XXX。进入该目录下的i386目录,就可以看到当前启动盘中支持的所以驱动程序:

# ls            3c59x.o            3w-xxxx.o            8139cp.o            8139too.o            8390.o            aacraid.o            acenic.o            aic79xx.o            ……



若希望在系统中加入需要的驱动程序,可以相应地修改这些文件,比如在modules.dep中加入该模块的名字和依存关系,将编译好的驱动模块文件加入modules.cgz中,这样就可以制定自己的安装光盘。

硬盘上的系统启动过程与上面类似,但是initrd的镜像文件要更简单些,一般在initrd-2.4.XXX.img的虚拟文件系统中,只会在/lib目录下包含ext3.o jbd.o lvm-mod.o等少数文件,用来驱动硬盘上的ext3的文件系统。加载文件系统后,就可以使用/lib/modules/2.4.XXX/下的modules.dep文件及Kernel目录中的各种驱动文件。

自动配置安装

如果安装完Linux系统后,又添加了新的硬件,那么系统必须载入正确的驱动程序才可以使用它。在Red Hat Linux中,可以使用kudzu来配置硬件。这是PnP设备的检测程序,当系统使用新硬件引导后,运行kudzu(默认会自动运行),如果新硬件被支持,那么它就会被自动检测到。该程序还会为它配置驱动模块,把结果写入到文件/etc/sysconfig/hwconf中,kudzu可以通过对比这个文件发现新安装的硬件,并进行配置;也可以通过编辑模块配置文件/etc/modules.conf来手工指定加载模块。

Kudzu服务默认每次启动时都要运行,如果需要缩短启动时间,使用下面命令可以停止系统启动时的kudzu服务:

# chkconfig kudzu off



如果要安装新的硬件,可以手动运行kudzu程序。

# kudzu



那么kudzu程序如何认识硬件的呢?可以查看/usr/share/hwdata/目录下的文件,根据这些文件中的PnP信息,kudzu可以识别各种硬件设备。

以上介绍了Linux下驱动程序的大体结构、主要的加载方式和相关配置文件,在安装Linux时加载驱动程序,并且根据需要定制自己的引导盘,在安装完成后安装新的、即插即用硬件。下一讲开始,我们将学习具体硬件驱动的安装方法。

前一节Linux培训园地:Linux下设备完全驱动之一,大家看过之后相信一定印象深刻。这一节首先讲述IDE硬盘及光驱的设置、IDE刻录机的使用,以及如何安装SCSI硬盘驱动。然后介绍以太网卡驱动模块的加载及网络接口的启功过程,如何调整网卡的参数,Modem、ADSL和宽带的驱动安装,以及PPP连接的设置等。

IDE硬盘及光驱

1.IDE设备的驱动过程

操作系统首先是安装在块设备上,没有对块设备的支持系统就无法启动,所以首先介绍常见块设备的安装。硬盘就是最常见的块设备,普通PC上的硬盘通常是IDE接口的,而服务器上的硬盘通常是SCSI接口的。

一般内核中内置对通用IDE控制芯片的支持。下面看一下IDE硬盘在内核中的驱动过程,dmesg命令可以看到内核在启功和加载内核模块时的信息:

# dmesg | less



在Linux内核启动过程中,可以发现内核首先驱动初始化CPU、内存、系统时钟部分,接着加载PCI总线的驱动,然后就加载了通用的IDE驱动程序:

Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4



接着初始化IDE的控制器,IDE控制器集成在Intel的ICH4南桥芯片组中,IDE控制芯片驱动加载后,进行初始化传输模式:

ICH4: chipset revision 1            ICH4: not 100% native mode: will probe irqs later            ide0: BM-DMA at 0xbfa0-0xbfa7, BIOS settings: hda:DMA, hdb:pio            ide1: BM-DMA at 0xbfa8-0xbfaf, BIOS settings: hdc:DMA, hdd:pio



该驱动程序会向核心中注册主设备号为3的block型设备。可以看到,在IDE控制器初始化时,占用的I/O资源及分配给它的中断号:

ide0 at 0x1f0-0x1f7,0x3f6 on irq 14            ide1 at 0x170-0x177,0x376 on irq 15



接着使用IDE控制器查找连接在IDE接口上的设备,如果检查到硬盘则加载IDE硬盘的驱动程序,设置了该硬盘的基本参数,设置传输方式为UDMA(100),也就是ATA100(100Mb/s的传输速度),并且根据这个驱动程序检测硬盘上的分区:

hda: attached ide-disk driver.            hda: host protected area => 1            hda: 78140160 sectors (40008 MB) w/7898KiB Cache, CHS=4864/255/63, UDMA(100)            ide-floppy driver 0.99.newide            Partition check:            hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 >

/dev/hda代表第一个IDE接口的主设备,它的设备号为block(3/0),而/dev/hda1是这块硬盘的第一个分区,设备编号是 block (3/1);/dev/hdb代表第一个IDE接口的从设备,设备编号为 block(3/64)。

由此我们可以看到,内核默认可以支持1~63个分区,其中第一个逻辑分区的编号肯定为/dev/hda5。但是,在/dev目录下查找有hda1~hda32,共32个分区文件,如果需要更多的分区,就需要使用mknod命令来创建更多的设备文件。

/dev/hdc是第二个IDE接口的主设备;/dev/hdd是第二个IDE接口的从设备。

2.安装、升级常见的IDE驱动程序

通用的IDE控制器可以通过内核这样加载起来,如果遇到一些较新的芯片组,当前的内核无法完全发挥出新硬件的性能,这时就要向内核中打补丁,例如,2.4.20-8的内核就无法支持VIA VT8237芯片组中的IDE ATA133方式,需要向内核中打补丁。

先到VIA的网站上下载相关补丁,网址为http://www.viaarena.com/?PageID=297#ATA,注意要选择适合当前自己内核的驱动,接下来是升级内核,给内核打补丁。

# rpm -ivh kernel-source-<Kernel Version>.i386.rpm



安装需要版本的源代码包。把刚才链接中的补丁下载,将这个patch文件解开:

# tar xzvf  VIA IDE ATA133 Patch 8237 ver0.8.gz



进入解包出来的目录,将需要的patch文件cp到 /usr/src目录:

# cp  <Linux OS>-patch-<Kernel Version>  /usr/src



Kernel Version代表内核的版本号,Linux OS代表不同的Linux系统。

# cd /usr/src            # patch -p0 < <Linux OS>-patch-<Kernel Version>



将patch打入内核中,重新编译内核:

# cd /usr/src/linux-<Kernel Version>



编辑 Makefile文件,把 "EXTRAVERSION=" 改成 "EXTRAVERSION=-test",这是给新的内核命名。

# cp /boot/config-XXX  .config            # make menuconfig  ( config 或 xconfig也可以 )



确定 "ATA/IDE/MFM/RLL support/IDE,ATA and ATAPI Block devices"中的"VIA82CXXX chipset support"被选中。

开始编译内核:

# make dep            # make clean            # make bzImage            # make modules            # make modules_install            # cp arch/i386/boot/bzImage (或 vmlinuz-test)  /boot/vmlinuz-test            # cp /boot/initrd-< Kernel Version >.img  /boot/initrd-test.img



编辑 /boot/grub/grub.conf文件,在最后添加下面三行:

title linux-test            kernel /boot/vmlinuz-test ro root=/dev/hda1            initrd /boot/initrd-test.img



重新启动系统,使用刚刚编译的内核就会发现启动信息中多出一行“linux-test”。留意启动时的信息,就会发现有下面一行信息:

"VP_IDE: VIA vt8237 (rev 00) IDE UDMA133 Controller on pci00:0f.1"



如果正常启动,各种服务也都没有问题,那么以后就可以用这个新的内核了。可以用# hdparm -i命令来调整硬盘的传输方式,检查硬盘目前的传输模式。

/dev/hda:            Model=IC25N040ATCS05-0, FwRev=CS4OA63A, SerialNo=CLP429F4HALVPA            Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }            RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4            BuffType=DualPortCache, BuffSize=7898kB, MaxMultSect=16, MultSect=16            CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160            IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}            PIO modes:  pio0 pio1 pio2 pio3 pio4            DMA modes:  mdma0 mdma1 mdma2            UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5  //这里显示所支持的硬盘传输模式            AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled            Drive conforms to: ATA/ATAPI-5 T13 1321D revision 3:            * signifies the current active mo



查看一下当前硬盘的工作模式,如果不是ATA133,则可以灵活使用控制硬盘传输模式的命令:

# hdparm -d1 /dev/hda  //enable DMA 模式            # hdparm -d0 /dev/hda  //disable DMA 模式            # hdparm -X70 /dev/hda  //将传输模式切换到UDMA 6 -ATA133模式



-X后数字16~18代表SDMA 0~2,32~34代表MDMA 0~2,64~70代表UDMA 0~6。

将最后一行加入到/etc/rc.d/rc.sysinit或/etc/rc.d/rc.local文件中,可以让硬盘每次启动都工作在ATA133下。
3.安装nforce芯片组的驱动程序

AMD64平台的nforce系列芯片组性能强劲,虽然可以用常规的方法加以驱动,但有可能无法发挥新设备的特性,或者该芯片组的网卡、声卡无法使用。nVIDIA提供了更方便的RPM文件供使用,其中一些是源代码tar文件,需要进行编译;有些是RPM包,直接进行安装就可以了。

nforce芯片组在Linux下驱动的下载地址为http://www.nvidia.com/object/linux_nforce_1.0-0275.html,其中包含了内核的补丁、芯片组中对网卡及声卡的驱动程序。下载经过编译的RPM包可以直接安装:

# rpm -ivh NVIDIA_nforce.athlon.rpm



如果使用的不是SuSE或Red Hat Linux系统,也可以下载带有源代码的.src.rpm包经过编译后再安装:

# rpm -ivh NVIDIA_nforce.src.rpm            //将驱动程序的源程序文件安装到系统中            # cd /usr/src/redhat/SPECS            # rpmbuild -bb NVIDIA_nforce.specs            //编译源驱动程序,编译成可直接使用的rpm文件            # cd /usr/src/redhat/RPM/i386/            //根据具体包的不同,也可能是i686、noarch等            # rpm -ivh NVIDIA_nforce.i386.rpm            //程序自动安装包内的驱动程序,并利用RPM包中的脚本自动配置



光驱的驱动及刻录机的使用

1.光驱的驱动过程

编译内核时,在ATA/IDE/MFM/RLL选单中都会有IDE/ATAPI CDROM support的选项,通常所见到的内核都将这个部分编译在了内核中,所以不需设置光驱就可以使用。下面看一下系统启动时光驱是如何驱动的:

# dmesg |grep  CD            hdc: HL-DT-STCD-RW/DVD-ROM GCC-4240N, ATAPI CD/DVD-ROM drive            Uniform CD-ROM driver Revision: 3.12



一般的通用CD/DVD-ROM驱动程序就可以将光驱驱动起来,不需要特别的配置。如果遇到的是SCSI光驱,则一般的内核也可以驱动,因为在编译内核时,一般会将SCSI的内容编译出来。



如果没有SCSI的光驱驱动,则可以自己手动编译。make menuconfig(或xconfig)时,在SCSI support 选单中只要将SCSI support设置为“Y”或“M”(Y代表该部分编译在内核中,M表示该部分编译为内核模块);SCSI CD-ROM support设置为“Y”或“M”;SCSI generic support设置为“Y”或“M”,这样就可以驱动SCSI接口的光驱了。
2.CD/DVD刻录机的驱动及使用

现在CD或DVD刻录机越来越普及,那么在Linux下如何使用内置的CD或DVD刻录机呢?默认的情况下,系统会将刻录机视作只读的驱动器,只加载普通的CD/DVD-ROM驱动,光驱无法写入。

因此,需要用ide-scsi 伪设备驱动程序来驱动刻录机,将普通的IDE接口的设备模拟成一个SCSI接口的设备,这时才能向其中刻录。我们可以使用三种方式来实现将IDE光驱模拟为SCSI光驱。假设使用GRUB作为bootloader,刻录机安装在第二个IDE接口,是主设备,则它默认应该为/dev/hdc 。

(1)更改/boot/grub/grub.conf文件在kernel /boot/vmlinuz-2.XXX ro root=/dev/hda1之后,添hdc=ide-scsi。

(2)更改 /etc/modules.conf文件添加下面两行:

ide-cd ignore=\"hdc\"            ide-scsi



(3)直接编译内核

不编译ATA/IDE/MFM/RLL选单中的IDE/ATAPI CDROM support部分,但是要编译对SCSI光驱的支持。

上面三种方法都是不希望系统用自带的普通CD/DVD-ROM驱动程序去驱动刻录机,希望将刻录机模拟成一个SCSI设备,其中第一种方法最简单,成功后就可以通过以下命令来刻录CD或DVD光盘。

# mkisofs -Jv -V examplecd -o example.iso /root/



将/root/目录下的文件做成一个名叫example.iso的光盘镜像文件,该文件的卷标为xamplecd。

还可通过命令将该文件加载到/mnt/iso文件夹中,可以自由添加删除镜像中的文件,但要注意不要超过光盘的容量。

# mkdir /mnt/iso            # mount -t iso9660 -o loop example.iso /mnt/iso



调整/mnt/iso文件的内容:

# umount /mnt/iso



最后使用cdrecord命令来刻录:

# cdrecord -scanbus



查看SCSI总线中刻录机的配置信息:

Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J?rg Schilling            Linux sg driver version: 3.1.25            Using libscg version 'schily-0.7'            cdrecord: Warning: using inofficial libscg transport code version            (schily - Red Hat-scsi-linux-sg.c-1.75-RH '@(#)scsi-linux-sg.c            1.75 02/10/21 Copyright 1997 J. Schilling').            scsibus0:            0,0,0     0) 'HL-DT-ST' 'RW/DVD GCC-4240N' 'E112' Removable CD-ROM            0,1,0     1) *            0,2,0     2) *            0,3,0     3) *            0,4,0     4) *            0,5,0     5) *            0,6,0     6) *            0,7,0     7) *



可以看到目前的光驱在SCSI总线的参数,然后根据参数来输入下面的命令刻录光盘:

# cdrecord -v -eject speed=24 dev=0,0,0 example.iso



speed=24是以24倍速来刻录光盘,dev=后加上刚才显示的刻录机的SCSI参数。

SCSI设备驱动过程

下面以Adaptec SCSI RAID 3200S卡为例,介绍SCSI RAID卡的驱动过程。这是常见的带RAID功能的SCSI卡。在大部分编译好的内核中,都会编译对SCSI设备的支持。但是需要知道,内核中只是支持通用的SCSI总线,而具体的SCSI卡还需要加载相应的驱动程序。SCSI芯片驱动的安装比较特殊,下面分成两种情况叙述。

1. Linux系统的启动文件就是在SCSI硬盘上

这种情况下,SCSI设备的驱动程序不能像普通的驱动程序来安装。因为如果系统启动时没有加载SCSI卡的驱动程序,那么根本无法访问其它的Linux系统文件,所以必须在内核启动后立刻就加载该设备的驱动程序。以下是在Red Hat系统中具体的安装过程。

(1)从Adaptec网站http://www.adaptec.com/worldwide/support/driverdetail.jsp?sess=no&language=English+US&cat=/Product/ASR-3200S&filekey=dpt_i20-drv_2.5.0-rh9-i686.img 下载Adaptec SCSI RAID 3200S卡针对Red Hat 9.0的驱动程序,大家可以看到这是一个.img的镜像文件。

(2)将该镜像文件写入软盘中。Linux下可以用下面命令:

# dd if=dpt_i20-drv_2.5.0-rh9-i686.img of=/dev/fd0



或者

# cat dpt_i20-drv_2.5.0-rh9-i686.img  > /dev/fd0



在Windows下利用Red Hat第一张安装光盘中的/CDROM/dosutils/rawrite.exe程序。

(3)在启动Red Hat安装过程时,boot提示符出现时进入安装模式:

boot:  linux dd



(4)按照向导提示,将刚才制作的驱动软盘插入。

以后的安装过程就没有什么不同了。安装向导实际上将软盘上的驱动程序放到了initrd的RAMDISK(内存磁盘镜像)文件中,每次内核启动后,都最先加载这个内存虚拟硬盘的镜像,利用里面的SCSI驱动程序来驱动SCSI RAID卡和卡上连接的硬盘。
2. Linux系统已经安装到一个IDE的硬盘上

这种情况跟其它的驱动程序没有太大的区别,用modprobe或insmod将SCSI卡的驱动模块加载到内存中。(1)查看系统是否能访问PCI设备:

# lspci -v | grep -i  i2o



(2)从Adaptec网站http://www.adaptec.com/worldwide/support/driverdetail.jsp?sess=no&language=English+US&cat=/Product/ASR-3200S&filekey=dpt_i20-drv_2.5.0-rh9.rpm下载驱动程序,检验是否可以加载模块。

# rpm -ivh dpt_i20-drv_2.5.0-rh9.rpm            # modprobe dpt_i2o



(3)察看是否可以访问/dev/sda设备,或者已经创建好/dev/md0设备。

加载以太网卡驱动模块及参数调整

1.以太网卡的驱动过程

处理网络方面任务是Linux的长项,仅仅一两兆的Linux内核就可以对TCP/IP有很好的支持。下面首先了解一下最常见的网络设备—以太网卡的驱动过程。

在内核加载后,虽然已经有了对TCP/IP协议的支持,但是具体的网络接口设备的驱动并没有加载。在内核启动后,将硬盘上的根分区mount到系统中,系统就会查找模块配置文件/etc/modules.conf,并按照该文件记录的内容来加载模块:

# cat /etc/modules.conf            alias eth0 8139too            alias sound-slot-0 i810_audio            post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :            pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :            alias usb-controller usb-uhci            alias usb-controller1 ehci-hcd



上面代码表示加载8139too模块,我的网卡是8139的100Mb以太网芯片,并将该模块取别名叫做eth0。这表示第一个以太网的网络接口,以后只要访问eth0,就是访问这块网卡。然后系统会在/lib/modules/2.4XXX/的modules.deps中查找该模块的具体位置:

# grep 8139too /lib/modules/2.4.21-4.EL/modules.dep            /lib/modules/2.XXX/kernel/drivers/net/8139too.o:            /lib/modules/2.4.21-4.EL/kernel/drivers/net/mii.o            /lib/modules/2.4.21-4.EL/kernel/lib/crc32.o



以上内容在同一行中,表示8139too模块依存于mii模块和crc32模块,8139too模块的具体位置在/lib/modules/2.XXX/kernel/drivers/net/8139too.o,所有系统内置的网络驱动程序都在/lib/modules/2.XXX/kernel/drivers/net目录下。

驱动模块加载完成之后,可以直接通过命令ifconfig来设置网卡的IP地址,:

# ifconfig  eth0 192.168.1.1



这样设置的IP地址重启后就会失效,使用netconfig命令可以永久更改IP地址:

# netconfig            # service network restart 或者            # /etc/rc.d/init.d/network restart`



那么系统每次启动时是怎样配置网络的呢?在Linux系统中,网络作为一项服务被加载,配置文件是/etc/rc.d/init.d/network,在该文件中可以看到系统启动网络接口、绑定IP地址、设定静态路由的过程,这个文件通过调用/etc/sysconfig/network-scripts/ifcfg-*的几个文件来配置各个网卡的IP地址。比如有eth0,则会生成一个文件ifcfg-eth0,系统每次启动时自动绑定eth0的IP地址:

# cat /etc/sysconfig/network-scripts/ifcfg-eth0            DEVICE=eth0            ONBOOT=yes            BOOTPROTO=none            IPADDR=192.168.0.1            NETMASK=255.255.255.0            TYPE=Ethernet



以上就为eth0设备绑定了192.168.0.1的IP地址。

# cat /etc/sysconfig/network-scripts/ifcfg-eth0:1            DEVICE=eth0:1            ONBOOT=yes            BOOTPROTO=none            IPADDR=192.168.1.1            NETMASK=255.255.255.0            TYPE=Ethernet



以上的ifcfg-eth0:1文件为eth0设定了第二个IP地址192.168.1.1,这个文件是我添加的,注意DEVICE=eth0:1 跟上一个文件是不一样的。
2.安装3COM 3CR990网卡驱动程序

我们可以看到,系统内置的网卡驱动程序在/lib/modules/2.4.XXX/kernel/drivers/net目录下,如果网卡不在默认支持的硬件中,可以用以下方法来安装网卡驱动。

比如,我们有一块3COM 3CR990网卡,可以到3COM网站上下载针对2.4内核的驱动http://support.3com.com/infodeli/tools/nic/linux/3c990-1.0.0a.tar.gz。然后解压缩下载的文档到解开的目录中:

#t tar xvfz 3c990-1.0.0a.tar.gz            # make



此时当前文件下将会生成3c990.o的驱动模块。

# modprobe ./3c990.o



看一下该模块是否可以被正常加载,如果没有问题,就更改/etc/modules.conf文件和/lib/modules/2.XXX/modules.dep文件,让模块每次启动时加载:

# echo “alias eth0 3c990” >> /etc/modules.conf            # cp  ./3c990.o  /lib/modules/2.XXX/kernel/drivers/net            # echo  "/lib/modules/2.XXX/kernel/drivers/net/3c990.o:" >> /lib/modules/2.XXX/modules.deps



3.调整以太网卡的参数

有时在加载完网卡的驱动后,如果网卡的状态不正确,比如驱动起一块网卡,但是它在100Mb的速度上工作很不稳定,就可以使用mii-tool命令调整以太网卡的属性。目前多数以太网卡为10BaseT与100BaseTx的10Mb/100Mb自适应网卡,也有较新的支持1000BaseT的千兆以太网卡。

下面介绍mii-tool命令的一些用法:

(1)显示当前网卡所使用的以太网类型,目前这块网卡使用的是100baseTx的全双工工作方式。

# mii-tool            eth0: negotiated 100baseTx-FD flow-control, link ok



(2)显示当前的网卡支持的所有以太网类型。

# mii-tool -v            eth0: negotiated 100baseTx-FD flow-control, link ok            product info: vendor 00:08:18, model 22 rev 2            basic mode:   autonegotiation enabled            basic status: autonegotiation complete, link ok            capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD            advertising:  100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control            link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control



(3)强制eth0使用10baseT-FD的方式(10Mb全双工的方式)工作。

# mii-tool -F 10baseT-FD eth0



(4)解除eth0的强制状态,让eth0自动侦测使用什么方式通信。

# mii-tool -R            resetting the transceiver...


Modem和ADSL驱动安装及PPP连接设置

1.外置Modem的驱动程序安装

Modem分为外置和内置两种。比较而言,外置的Modem配置较容易,使用方便。Modem一般接在串口上,在Linux中串口对应的设备文件为/dev/ttyS*,如果是COM1口,则对应/dev/ttyS0。如果不知道连接的是哪一个COM口,可以先给Modem加电,用以下命令测试:

# echo AT > /dev/ttyS0



如果Modem的TR灯亮,则表明该Modem接到COM1口上;如果不亮,再试一下/dev/ttyS1文件。知道了Modem连接的是哪一个串口后,就可以拨号了。拨号的过程实际上是通过Modem建立PPP(点对点通信协议)的连接。

在命令行下,可以使用pppd进行拨号,常见的Linux系统中会安装这个拨号程序,大家可以看一下/etc/ppp目录下是否有相关的脚本文件,如果没有可以下载并安装ppp包ftp://cs.anu.edu.au/pub/software/ppp。将包安装后,可以查找ppp-on和ppp-on-dialer文件,把文件复制到/etc/ppp文件夹下,修改ppp-on文件如下几个地方:

TELEPHONE=270  //ISP提供的上网电话号码            ACCOUNT=user  //ISP提供的账号名称            PASSWORD=123  //登录密码            LOCAL_IP=0.0.0.0  //PPP连接的IP地址,0.0.0.0表示由ISP动态分配            REMOTE_IP=0.0.0.0   //远端IP地址,一般为0.0.0.0            NETMASK=255.255.255.0            export TELEPHONE ACCOUNT PASSWORD \            DIALER_SCRIPT=/etc/ppp/ppp-on-dialer \   //查找另一个必须的配置脚本            exec /usr/sbin/pppd lock modem crtscts /dev/ttyS0 115200 \   //设置COM口及速度            asyncmap 0 kdebug 4 \            $LOCAL_IP:$REMOTE_IP noipdefault netmask $NETMASK defaultroute \            connect $DIALER_SCRIPT&



给这个文件加上执行权限:

# chmod 700 ppp-on            # ./ppp-on



这样就可以拨号上网了。这种方法可以适用于多数的Linux系统,如果是Red Hat Linux,可以使用redhat-config-network命令轻松地在文本界面上配置拨号连接,如图1。

 

图1 文本界面下的redhat-config-network





如果启动了X-Window,GNOME与KDE都自带图形界面的拨号程序。

2.内置Modem驱动程序的安装

内置Modem比起外置的Modem配置要麻烦一些,下面在Dell D600笔记本安装内置Modem的驱动程序。到下面网址下载驱动http://www.linuxant.com /drivers/hsf/full/downloads.php,选定适合本系统内核版本的驱动程序,下载后是一个RPM包。

#rpm-ivhhsfmodem-6.03.00lnxt04061800full _k2.4.21_4.EL-1rh.i686.rpm            ... ...            Config for modem unit 0: /dev/ttySHSF0            Device instance: 0-PCI-8086:24c6-14f1:5422            HW revision    : CXT22            HW profile name: hsfmc97ich            Registration ID: 115C-247C-BFC0            License owner  : unknown            License key    : FREE            License status : FREE (max 14.4kbps data only)            Current region : CHINA (T.35 code: 0026)            The /dev/modem alias (symlink) points to /dev/ttySHSF0            ……



由上可以看到,安装程序自动建立了一个设备文件/dev/ttySHSF0,并且为它创建了名叫/dev/modem的软链接文件,这个文件与其它的ttyS文件的类型是不同的:

# ls /dev/ttyS0 -l            crw-rw----  1 root  uucp   4,  64 Sep 15  2003 /dev/ttyS            # ls /dev/ttySHSF0 -l            crw-rw-rw-  1 root   root   240,  64 Jun 29 02:36 /dev/ttySHSF0



由上可以看到,/dev/ttySHSF0文件不是标准的COM口,而是该驱动程序自己注册的240类型的驱动程序。

实际上,驱动内置Modem的过程是先加载驱动程序,模拟一个ttyS的串口设备文件,然后像给普通外置Modem建立PPP链接那样,为内置的Modem建立拨号连接,不过这时要选定/dev/modem作为设备文件。

3.ADSL及宽带连接驱动

ADSL设备通常是通过以太网卡来拨号,建立PPP链接,这时的PPP协议叫做PPPoE,就是PPP over Ethernet(在以太网上的点对点通信协议),一般不需要任何ADSL Modem的驱动,只需直接建立PPPoE连接。

在命令行下,下载ADSL拨号程序rp-pppoe,可以通过http://www.linuxsir.org/postnuke/modules.php?op=modload&name=Downloads&file=index&req=getit&lid=242下载, 或者直接下载RPM包http://www.neweasier.com/software.html?class=4 。

配置非常简单,下载包解压缩后直接运行下面代码:

# ./go



则出现PPPoE配置向导,会提示输入用户名和密码,然后使用以下命令建立连接:

# adsl-start



或者

# ifup ppp0



系统中会在配置完后出现一个SysV的服务:

# chkconfig --list adsl            adsl         0:off   1:off   2:off    3:off    4:off    5:off    6:off            # chkconfig adsl on



这样以后每次启动就会启用ADSL拨号。

如果不用rp-pppoe的向导,也可以在X-Window中直接使用下面命令(如图2):

#neat

图2 X-Window中运行网络配置工具



或者

#redhat-config-network



上面两个命令是Red Hat Linux中的命令,可以在图形界面下建立PPPoE的连接,其它版本的Linux也应该有自己的ADSL拨号程序。

如图3所示中,单击上面的“New”建立新连接,如VPN、eth、ISDN、Modem等,则出现图4所示页面。

图3 单击建立新连接



图4里的xDSL并不是只有ADSL等DSL的连接,一般的PPPoE连接都可以使用,比如即使是建立类似网通的宽带LAN接入形式也应该选择这一项。单击“Forward”进行下一步。

图4 选择xDSL连接,建立PPPoE连接



输入ADSL或LAN宽带接入的连接信息,如图5所示。然后单击“Forward”。

建立好了链接后,在/etc/sysconfig/network-scripts/ 目录中会出现ifcfg-ppp0的文件,可以通过以下命令让系统通过ADSL拨号上网,建立宽带连接;也可以用刚才的向导拨号上网,如图6。

# ifup ppp0



有些地方提供LAN宽带接入方式也需要进行拨号,如北京网通LAN接入宽带,它实际上使用跟ADSL一样的PPPoE协议,建立连接时与ADSL的拨号方式一样,也可以用rp-pppoe或redhat-config-network来建立拨号连接,运行向导时没有区别。

图5 输入ADSL或LAN宽带接入的连接信息

图6 建立PPPoE连接先选中PPP0再单击上面的Activate按钮



4.常见故障处理

如果在配置网络时出现问题,可遵循以下步骤检查:

(1)用ifconfig看一下网络接口是否启动,IP地址是否绑定,如果网络接口没有启动。例如,PPP0没有启动,可使用ifup ppp0命令。如果IP地址没有绑定,使用命令ifconfig eth0 192.168.1.1设置地址;也可以使用命令netconfig设置IP地址、网关及DNS服务器的地址。然后用service network restart重启网络。

(2)如果网络接口及IP没有问题,但是不能上网,可使用ping 211.XXX的一个外网地址,如果能通,则应该是DNS服务器的问题,更改/etc/resolv.conf文件中的nameserver的地址,换一个能用的DNS服务器的地址。

(3)如果都没有问题就是ping不通外网的IP,可使用命令route -n看一下默认网关是否正确,如果不正确使用route del/add来设置默认网关,使用netconfig可以永久更改默认网关。

从上面的讲解中可以看到,我们遇到的情况可能是千差万别的,安装的方式也是多种多样的。但是,不论哪一种设备应该首先理解这种设备的驱动方式,然后再来了解具体的驱动程序。

图形化的界面能让我们方便地享用Linux的强大功能,而且现在Linux的图形化界面已经越来越完善。Linux中经常使用的图形显示系统是X-Window,但是由于其与常见的MS Windows系统有很大的差异,所以在使用时常会遇到一些问题,比如无法驱动显卡、显示器参数错误、花屏和图形界面无法启动等。

因此,本文将在简介X-Window的基础上,介绍如何安装常见显卡和声卡的驱动程序、相关的配置文件,以及参数调整等内容。

X-Window概述

X-Window是一套显示系统,包括Server端和Client端,他们之间使用X协议互相通信。X诞生于1984年,在较短的时间内它就发布到了11个版本—X11。X11经过多年的发展,现在已经发布到X11R6。

X Client将希望显示的图形发送到X Server,X Server将图形显示在显示器上,同时为X Client提供鼠标、键盘的输入服务。因为C/S结构,可以将X的Server和Client分别运行在两台计算机上,甚至可以安装一些软件,让Windows作为X Server,让Linux作为Client,将KDE或GNOME等桌面环境显示到Windows主机上来。

图1所示让Windows作为X Server



使用Xmanager 1.3.9,在Windows XP上运行X Server,然后运行一台Linux主机下的startkde,将KDE桌面环境显示在Windows XP下。

使用startx命令可以启动X-Window系统。实际上,是在一台计算机上同时运行Server和Client,在运行startx之后,首先启动的是XFree86,它是Linux平台上最常用的X Server端;然后,又运行X的Client程序,如startkde(KDE的启动脚本)或gnome-session(GNOME的启动脚本)。

它们利用X协议连接本机的X Server,将图形显示出来。

Linux上经常使用的X

Server程序就是XFree86,它的任务是驱动显示卡、显示器、鼠标、键盘等设备,为X Client提供显示、输入服务等。

XFree86的主要文件目录如下:

XFree86文件所在的主要目录为/usr/X11R6;

XFree86的可执行程序文件目录为/usr/X11R6/bin;

XFree86自带的驱动程序所在目录为/usr/X11R6/lib/modules/drivers;

X的配置文件及启动脚本所在目录为/etc/X11;

XFree86的启动配置文件目录为/etc/X11/XF86Config或XF86Config-4,如果这两个文件都存在,XF86Config-4文件优先。

XFree86自带了一些设备的驱动,具体位置在/usr/X11R6/lib/modules/drivers,如果机器显示卡太新,无法使用X-Window,比如使用了Intel的855GM芯片组中集成的显卡无法启动X,则可以考虑升级XFree86。

当前XFree86成熟的版本是4.3,最新的版本4.4正在完善之中。从以下的链接中可获得4.3版的XFree86所支持的所有显卡列表http://xfree86.linuxforum.net/4.3.0/RELNOTES2.html#3。

XFree86官方版本下载网站是http://www.xfree86.org/downloads.html ,中国的镜像网站是http://xfree86.linuxforum.net/downloads.html。

也可以从中科红旗网站http://www.redflag-linux.com/source/download/XFree86_driver4.3.tgz下载。

下载后安装tgz包:

# tar zxvf XFree86_driver4.3.tgz            # sh install.sh


安装Intel i865G芯片组显卡驱动

Intel i865G是一种比较新的显卡芯片组,它内置了显示模块,但是安装较早的Linux版本X-Window有可能无法启动。处理这个问题的方法是,一种是直接升级到XFree86 4.3;另一种是通过Intel官方的网站http://downloadfinder. intel.com/scripts-df/support_ intel.asp?iid=HPAGE+header_support_download&下载驱动程序。

在该链接的下载页面可以选择下载RPM包,也可以选择下载tar.gz的压缩文档。尽管这两种的安装方式略有不同,但是经过以下三步基本上可以让显卡在X-Window中正常使用。

1.安装驱动程序

(1)选择下载RPM包:

# rpm -Uvh --force intelgraphics_ 20040607_i386.rpm



(2)选择下载的是tar.gz压缩包要执行下面代码:

# tar xzvf IntelGraphics_060704.tar.gz            # cd dripkg            # ./install.sh



这时程序将自动安装,安装程序将更新/usr/X11R6/modules/drivers/i810_drv.o的驱动程序,使其支持新的i865G芯片组中的显卡。



图2 使用redhat-config-xfree86



2.选择驱动程序



有三种方法可以选择驱动程序:

(1)如果是Red Hat系统则可以运行下面代码:

# redhat-config-xfree86


图2显示为使用redhat-config-xfree86。这个命令可以自动侦测显卡、配置分辨率和色深,以及选择Advanced页面,然后单击Video Card的Configure按钮,选择正确的显卡。但是,如果是Red Hat Linux 8.0之前版本,则没有这个命令,应该运行下面代码:

# Xconfigurator



这样程序会一步步提示选择正确的驱动程序。

这两种方法都会将结果写入/etc/X11/XF86Config配置文件。

(2)直接更改XFree86的配置文件

直接更改XFree86的配置文件这种方法在Linux系统中比较通用,运行下面命令:

# vi /etc/X11/XF86Config            或者            XF86Config-4



在其中找到下面代码,将Driver后面改为i810,表示使用i810_drv.o驱动程序:

Section "Device"            Identifier  "Videocard0"            Driver      "i810"            VendorName  "Videocard vendor"            BoardName   "Intel 865"            EndSection



该配置文件中其它需要注意的地方如下:

Section "Monitor"            Identifier   "Monitor0"            VendorName   "Monitor Vendor"            ModelName    "Unknown monitor"            HorizSync    31.5 - 37.9            VertRefresh  50.0 - 70.0            Option     "dpms"            EndSection



上面这个部分是设置显示器的类型,不知道自己的显示器叫什么名字没关系,但需要将显示器的垂直刷新率和水平刷新率正确设置,这两个参数可以查看显示器的说明书。以上是15英寸显示器最常用的频率,如果这个参数设置错误,显示器就会花屏或黑屏。

Section "Screen"            Identifier "Screen0"            Device     "Videocard0"            Monitor    "Monitor0"            DefaultDepth     16            SubSection "Display"            Depth     16            Modes    "1024x768" "800x600" "640x480"   //默认会使用最高的分辨率            EndSubSection            EndSection
这里是设置显示模式的地方,包括屏幕的分辨率和色深,默认使用最高的分辨率。如果想使用较低的分辨率,那么将高分辨率删除就可以了,在这个配置文件中显示器会使用“1024×768”分辨率,色深是16位色。有关XF86Config文件的详解可以参看它的man page:

# man XF86Config


(3)让XFree86自己生成XF86Config文件

运行下面命令:

# XFree86 -configure


XFree86将自动侦测显卡及显示器,在用户的主目录下生成一个名叫XF86Config.new的文件。可以用以下命令测试这个文件运行是否正常:

# XFree86 -xf86config  ~/XF86Config.new


这个代码是指定X Server使用 ~/XF86Config.new作为配置文件。

如果有白色X型的光标显示,就可以按“Ctrl+Alt+Backspace”结束X。然后运行下面的命令,用新的配置文件来替换系统配置文件。

# cp ~/XF86Config.new /etc/X11/XF86Config


3.启动X-Window

运行startx,启动X-Window。这种方式依赖于控制台(tty),将X-Window作为当前控制台的Shell子进程来运行。

另一种方法是运行桌面管理程序gdm(GNOME桌面管理程序)、kdm(KDE的桌面管理程序)或xdm(XFree86的桌面管理程序)。这种方式不依赖于当前的Shell,即使当前Shell关闭,X-Window一样会继续运行。

以上三步是Linux下安装X-Window显卡驱动程序的通常步骤,绝大多数显卡都可以经过以上的步骤正常使用,所不同的是下载地址和具体的驱动程序的生成方式可能不一样。
比如,笔记本电脑上常用的Intel 815集成显卡的安装,我们同样可从Intel网站上下载815显卡部分的RPM包,网址为http://downloadfinder.intel.com/scripts-df/filter_results.asp?strOSs=39&strTypes= DRV%2CARC&ProductID=797&OSFullName= Linux*&submit=Go%21。

# rpm -ivh xfcom_i810-1.2-3.i386.rpm


然后重复以上的第二至第三步:

# redhat-config-xfree86  //选择正确的驱动程序            # startx                 //启动X-Window


安装其它显卡的驱动

1. 安装GeForce FX 6800显卡驱动

如果购买了GeForce FX 6800显卡(包含其它nVIDIA显卡),希望玩玩刚刚发布的DOOM3,结果却发现X-Window无法启动,这时可以去nVIDIA网站http://www.nvidia.com/object/linux.html下载最新的显卡驱动。

nVIDIA的Linux驱动程序做得相当精细,下载后得到文件NVIDIA-Linux-x86-1.0-6106-pkg1.run,运行它就可以看到一个tui(文本用户界面):

# chmod 700 NVIDIA-Linux-x86-1.0-6106-pkg1.run   //设置执行权限            # ./ NVIDIA-Linux-x86-1.0-6106-pkg1.run.         //运行安装程序


程序将会一步步提示安装nVIDIA的驱动。该驱动包含两部分:一部分是内核驱动,用于命令行界面的驱动,在安装这部分时,如果不是它支持的几种内核版本需要编译内核;另一部分是针对XFree86的驱动。

运行中常常出现的错误是在编译内核时找不到内核的源文件,用以下方法可以解决这个问题。先下载安装Kernel的源文件:

#  rpm -ivh kernel-sourceXXX.rpm   //在Red Hat安装光盘上            或者            #  tar zxvf linux-2.XXX.tar.gz   //可以从网上下载,比如kernel.org


指定源文件位置:

# ./ NVIDIA-Linux-x86-1.0-6106-pkg1.run. --kernel-source-path=<kernel 源文件目录的位置>

安装驱动程序后,如果有问题可以参考刚才安装Inter i865显示驱动的方法,来调整显卡的驱动和参数,运行 redhat-config-xfree86、XFree86 -configure或直接更改/etc/X11下的XF86Config文件。另外,如果希望直接得到nVIDIA的驱动程序,不想自动安装,可以运行以下命令将包中的文件解开。

# ./ NVIDIA-Linux-x86-1.0-6106-pkg1.run -x


在./NVIDIA-Linux-x86-1.0-6106-pkg1/usr/share/doc目录下,有一个XF86Config.example的文件,如果遇到XF86Config文件配置有问题,可以直接查看该文件中的显卡驱动部分内容。

2.安装ATI 9800显卡驱动

从下面地址http://www2.ati.com/drivers/linux/fglrx-4.3.0-3.11.1.i386.rpm可以下载ATI 9800显卡驱动fglrx-4.3.0-3.11.1.i386.rpm文件,然后执行:

# rpm -Uvh --force fglrx-4.3.0-3.11.1.i386.rpm  //强制升级/安装驱动程序包


注意,要看看是否有错误发生,如果有请仔细查看出错信息。

# fglrxconfig  //使用ATI的配置工具配置驱动程序


该程序会提问一些问题,当问到是否创建一个XF86Config-4文件时,要回答“y”,这样就可以生成新的配置文件。

# startx     //重新启动X            # fglrxinfo  //可以查看驱动程序是否安装成功


3.常见显卡驱动的下载地址

◆nVIDIA显卡驱动程序地址http://www.nvidia.com/object/linux.html。

◆ATI显卡驱动程序地址http://www.ati.com/support/driver.html(ATI网站访问速度较慢,可以多试几次)。

◆VIA芯片集成显卡驱动程序http://www.viaarena.com/?PageID=296。

◆SIS显卡驱动程序地址http://www.mypcera.com/qu/2/soft1/xsis.rpm。

◆Intel芯片组显卡驱动程序地址http://downloadfinder.intel.com/scripts-df/support_intel.asp?iid=HPAGE+ header_support_download&。

◆Intel笔记本迅驰显示驱动程序地址http://downloadfinder.intel.com/scripts-df/filter_results.asp?strOSs=39&strTypes=DRV%2CARC&ProductID= 922&OSFullName= Linux*&submit=Go%21。
ATI系列笔记本驱动程序要升级XFree86。

如果实在找不到显卡驱动程序,可以试着按照上面的介绍升级XFree86到4.3或4.4。它自带有一些显卡驱动程序,如ATI M9000笔记本显卡、SIS显卡等驱动程序。

4.内核支持显示模式调整

在命令行界面下,可以调整内核的显示模式,让它使用较高分辨率,设置方法如下。

(1)使用GRUB作为boot loader,则运行命令:

# vi /boot/grub/grub.conf


在kernel /vmlinuz-2.4.21-4.EL ro root=LABEL=/行后添加vga=0x314。这是设置显示模式,vga是Kernel的参数,0x314表示的是16进制的314换算成10进制为788,所以vga=788跟与vga=0x314是一样的。我们把该行改为下面一行:

kernel /vmlinuz-2.4.21-4.EL ro root=LABEL=/ vga=0x314


这时会发现Linux启动时显示一个企鹅图标,使用的是800×600分辨率,vga参数含意如表1。

(2)使用LILO作为boot loader,则在/etc/lilo.conf文件中将append处改为如下一行:

append=" root=LABEL=/ vga=0x314"


之后运行下面命令:

#  lilo -v


使用新的配置文件更新MBR。
常见显卡故障的处理

当无法启动X-Window时,应该仔细查看出错信息。以下为X-Window启动不成功的常见原因。

1.当屏幕为全黑或花屏时,一般是显示器参数设置有误。首先应该按“Ctrl+Alt+Backspace”,结束X-Window。然后查看显示器说明书,在/etc/X11/XF86Config-4或XF86Config文件中,将水平和垂直刷新率改成正确的值,或者运行redhat-config-xfree86和XFree86-configure。

2.XF86Config文件损坏或丢失,运行redhat-config-xfree86或XFree86 -configure。

3.没有控制台所有权。比如,以shrek用户登陆,然后用命令“su - joan”切换为用户joan,这时使用startx就会出错,提示没有该控制台的所有权。这时,可以用exit退出joan的Shell,然后再运行startx。

4.硬盘没有空间。在使用KDE或GNOME时,每次启动X-Window都要占用一定空间放临时文件,如果/tmp或主目录下无法写入文件,这时X-Window就会出现一些奇怪的错误。

5.显卡驱动有问题。下载安装正确的驱动,运行redhat-config-xfree86或XFree86 -configure。

6.xfs服务没有启动。xfs是字体服务,它不启动则X-Window无法启动。使用下面命令可以启动该服务:

# service xfs start


或者

# /etc/rc.d/init.d/xfs start


如果希望该服务每次自动启动,则使用下面命令:

#chkconfig xfs on

声卡驱动程序概述

Linux下声卡的驱动是作为普通内核模块来加载的,系统内置的声卡驱动在/lib/modules/2.XXX/kernel/drivers/sound/目录下。以下是系统内置的声卡驱动模块:

# ls /lib/modules/2.XXX/kernel/drivers/sound/            ac97_codec.o  cs4232.o forte.o       uart401.o            ac97.o        cs4281    i810_audio.o  via82cxxx_audio.o            ad1848.o      cs46xx.o  maestro3.o    ymfpci.o            ad1889.o      emu10k1   rme96xx.o            audigy        es1370.o  soundcore.o            cmpci.o       es1371.o  sound.o


结合前一篇所介绍的内容可以知道,系统在启动时会通过以下两个文件来加载模块:/etc/modules.conf和/etc/rc.d/rc.sysinit,声卡也是在这里加载的。如果新安装了一块声卡,在Red Hat Linux中则可以使用kudzu命令来搜索声卡,并且自动配置。如果系统中没有内置的驱动程序,则可以按以下步骤来安装(以VIA的8237南桥集成声卡为例)。

从VIA的网站http://www.viaarena.com/?PageID=294上下载最新的驱动程序LinuxAudiov230.gz。

解压缩:

# tar xzvf LinuxAudiov230.gz


编译src.rpm包:

# rpmbuild --rebuild viaudiocombo-2.2-3.src.rpm


如果没有rpmbuild命令则运行:

# rpm --rebuild viaudiocombo-2.2-3.src.rpm            # cd /usr/src/RPM/RPMS/iX86   //这里的X-Window根据机器情况而不同            # rpm -ivh --force viaudiocombo-2.2-3.iX86.rpm   //安装编译好的驱动程序


Intel主板的集成声卡一般使用的是i810_audio.o作为驱动,目前新版本Linux内置的驱动可以直接支持。
Linux“万能声卡驱动”安装

计算机中的声卡千差万别,除了Intel、VIA等大厂的声卡外,大多数声卡都没有专门写Linux下的声卡驱动程序。那么怎样在Linux中使用找不到驱动程序的声卡呢?可以试一试Linux下的“万能声卡驱动”,它可以驱动大量的声卡。

目前主要有两种万能声卡驱动:一种是ALSA(Advanced Linux Sound Architecture),它采用GPL,针对Linux系统源代码公开,主页是http://www.alsa-project.org/;另一种是OSS(Open Sound System),它是商用软件,针对主流Unix系统,Linux也在它的支持之列,主页是http://www.opensound.com/。

1.安装ALSA驱动程序

(1)查找声卡型号

从http://www.alsa-project.org/alsa-doc/处查找是否有使用的声卡型号,如果有则一定要从此处点击后面“details”链接来查找安装方法。这里以安装创新Soundblaster Audigy声卡的驱动为例,其它的声卡请查看details中的具体方法。

在安装之前需要安装内核的源代码包,可以从Red Hat光盘上安装kernel-sourceXXX.rpm包,或者从kernel.org网站上下载当前系统版本的源代码包。

安装源码包:

# rpm -ivh kernel-soureXXX.rpm


或者

# tar zxvf kernel-2.XXX.tar.gz            # cd /usr/src/linux2.XXX/       //到源代码的目录中            # cp /boot/config-2.XXX ./.config   //将当前版本的内核配置文件拷贝至源码目录

(2)下载驱动程序

从http://www.alsa-project.org/alsa/ftp/driver/下载驱动程序alsa-dirver-1.0.6rc1.tar.bz2;从http://www.alsa-project.org/alsa/ftp/lib/下载库文件alsa-lib-1.0.6rc1.tar.bz2;从http://www.alsa-project.org/alsa/ftp/utils/下载工具alsa-utils-1.0.6rc1.tar.bz2。

(3)安装驱动

# cd /usr/src            # mkdir alsa            # cd alsa            # cp alsa* ./            # tar -xjvf alsa-driver-1.0.6rc1.tar.bz2            # cd alsa-driver-1.0.6rc1            # ./configure --with-cards=emu10k1 --with-sequencer=yes;            # make            # make install            # chmod a+rw /dev/dsp /dev/mixer /dev/sequencer /dev/midi


安装lib包和utils包:

# cd ..            # tar -jxvf alsa-lib-1.0.6rc1.tar.bz2            # cd alsa-lib-1.0.6rc1            # ./configure            # make            # make install            # cd ..            # tar -jxvf alsa-utils-1.0.6rc1.tar.bz2            # cd alsa-utils-1.0.6rc1            # ./configure            # make            # make install


(4)更改配置文件

# vi /etc/modules.conf            alias char-major-116 snd            alias snd-card-0 snd-emu10k1            # module options should go here            alias char-major-14 soundcore            alias sound-slot-0 snd-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 sound-service-0-12 snd-pcm-oss


但是,ALSA驱动后的声卡默认是不发声的,可以用ALSA mixer来开启。直接运行以下命令可以全部开启所有的音量:

#./audunmute


也可以使用以下命令来设置音量的大小:

# amixer -c 0 sset 'Master',0 100%,100% unmute            # amixer -c 0 sset 'PCM ',0 100% unmute


可以编辑/etc/modules.conf文件,添加如下一行让声卡每次启动时调整音量为100%:

post-install snd-card-0 amixer -c 0 sset 'Master',            0 100%,100% unmute && amixer -c 0 sset 'PCM ',            0 100% unmute

2.设置OSS声卡驱动

(1)从http://www.opensound.com/download.cgi选择下载OSS的版本,如针对2.4内核的驱动,或者针对2.6内核的驱动。

以下是2.4内核驱动的下载地址ftp://www.se.opensound.com/pub/oss/linux/oss3991e-linux-x86-v24.tar.gz。

(2)安装驱动程序:

# tar zxvf oss3991e-linux-x86-v24.tar.gz            #./oss-install


将会自动安装其中包含的驱动程序。安装驱动模块前,请使用命令modprobe -r或rmmod把原有的驱动程序卸载。

以上为Linux声卡驱动的大致安装过程。因为Linux下的声卡众多,不可能有一个固定的安装步骤,但大致的步骤是,先编译出针对目前内核版本的驱动模块,然后再使用insmod或modprobe加载上去,更多的是通过/etc/modules.conf文件自动加载。

理解/etc/modules.conf文件很重要,这是大多数Linux系统加载模块的文件,有些Linux是/etc/conf.modules文件。如果声卡是非即插即用的,可以在/etc/modules.conf文件中使用options snd-card-0 io=0x300 irq=5来设置I/O资源及中断号。
尽管各种数码设备越来越多,但是Linux在对它们的配置上还没有做到像Windows一样方便,很多人正是因为心爱的数码相机无法在Linux下使用,而不得不保留一个Windows系统。所以,掌握如优盘、移动硬盘、数码相机等设备在Linux下的驱动方法,对于熟练使用Linux而言是必备的技能。

这一讲将会介绍常见USB、IEEE1394、PCMCIA等移动设备的驱动概念和安装技巧,为读者更好地配置和使用这些设备提供帮助。

USB设备驱动概述

USB是通用串行总线(Universal Serial Bus),是在1994年由Intel、NEC、微软和IBM等公司共同提出的。USB的目的在于将众多的接口(串口、并口、PS2口等),改为通用的标准。它仅仅使用一个4针插头作为标准插头,并通过这个标准接头连接各种外设,如鼠标、键盘、游戏手柄、打印机、数码相机等。USB接口的特点是支持热插拔,支持单接口上接多个设备等。

USB的优点此处不再赘述,我们主要来看一看Linux对USB的支持。USB采用串行方式传输数据,USB 1.1最大数据传输率为12Mbps,Linux内核为2.4以上版本都可以支持。

USB 2.0规范是由USB 1.1规范演变而来的,它理论上速度较1.1提高了40倍,达到了480Mb/s,但目前常见的USB 2.0设备只能达到理论值的一半。 Linux内核2.4.19版本开始对USB 2.0进行支持。

除了内核的版本要对USB接口进行支持之外,还要确定目前的系统是否编译了USB的驱动模块。如果让Linux系统支持USB设备,还需要一些驱动模块。我们都知道内置的驱动程序一般都在 /lib/modules/2.4XXX/kernel/drivers目录中。这个目录中会有usb及几个子目录,可以从中找到以下的几个USB关键基础模块:

usbcore.o 所有USB设备都需要的基本驱动模块;

host/ehci-hcd.o USB 2.0设备支持;

host/usb-uhci.o Intel VIA等芯片组USB部分的驱动;

host/usb-ohci.o iMac、SiS、Ali等非Intel芯片组USB部分的驱动;

storage/usb-storage.o USB接口的存储设备,如移动硬盘、U盘等都会用到;

hid.o USB接口的键盘、鼠标等人机交互设备的基础支持。

在该目录下还有一些具体设备的驱动程序,分别驱动不同设备:

# ls -p /lib/modules/2.4.21-4.EL/kernel/drivers/usb/            acm.o      CDCEther.o  hpusbscsi.o  microtek.o   rtl8150.o  usbcore.o   wacom.o            audio.o    dabusb.o    kaweth.o     pegasus.o    scanner.o  usb-midi.o            brlvger.o  hid.o       kbtab.o      powermate.o  serial/    usbnet.o            catc.o     host/       mdc800.o     printer.o    storage/   uss720.o

usb-storage.o USB对与存储部分的驱动模块;

scsi_mod.o 对SCSI设备的支持;

sd_mod.o 对SCSI硬盘支持模块,针对USB硬盘;

sr_mod.o 对SCSI光盘支持模块,针对USB光驱;

sg.o SCSI序列的通用支持模块;

ide-scsi.o 该模块可以把IDE设备模拟成SCSI接口。

通过查看/lib/modules/2.XXX/modules.dep文件,可以查看上述这些模块是否存在。一般情况下这些模块已经被编译,否则需要重新编译内核模块。

在正确地装载了驱动以后,可以通过访问/dev/sd?设备来访问优盘或移动硬盘。通常情况下,通过访问sda1来访问移动硬盘或优盘的第一个分区。在USB基本驱动存在的情况下插入优盘,就可以看到如下信息:

usb.c: USB device 7 (vend/prod 0xea0/0x6803) is not claimed by any active driver.            Starting timer : 0 0            Vendor: Netac     Model: OnlyDisk     Rev: 1.11            Type:   Direct-Access     ANSI SCSI revision: 02            Starting timer : 0 0            Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0            SCSI device sda: 32256 512-byte hdwr sectors (17 MB)            sda: Write Protect is off


上面这一段是usb-storage.o和SCSI驱动在起作用,我们可以看到优盘被认成是sda,要使用它可以先查看分区表:

# fdisk -l /dev/sda            Disk /dev/sda: 16 MB, 16515072 bytes            2 heads, 32 sectors/track, 504 cylinders            Units = cylinders of 64 * 512 = 32768 bytes            Device Boot    Start       End    Blocks   Id  System            /dev/sda1   *         1       503     16080    1  FAT12            # mkdir /mnt/usb            # mount -t msdos /dev/sda1 /mnt/usb    该优盘得类型为FAT12


之后就可以通过访问/mnt/usb来访问优盘了。注意,如果要拔掉优盘或移动存储设备,请先umount然后再拔出,这样可以保证数据全部被写入,否则系统会出错,数据可能不完整。

# umount /mnt/usb

USB数码相机的驱动

数码相机类型繁多,但是在Linux下使用数码相机有比较简便的方法。我们知道USB接口是数码相机的主要接口,在Linux中访问数码相机,通常可以通过下面两种方法。

1.使用专门软件

Red Hat Linux中自带的gtkam软件是一个提供了数码照相机图形化界面的程序,它支持100多种数码相机。gtkam可以直接与数码照相机相连,允许直接打开、查看、并删除图像。在Red Hat 9.0的光盘中,有gtkam的RPM包:

# ls gtkam*            gtkam-XXXX.i386.rpm  gtkam-gimp-XXXX.i386.rpm            # rpm -ivh --aid gtkam*            # rpm -ivh --aid --force gphoto2-XXXX.i386.rpm


gtkam基于gphoto,有时无法使用gtkam的原因是因为gphoto没有安装或模块被覆盖,所以需要重新安装gphoto。安装完毕后,在X-Window中运行gtkam就可以看到如图1所示界面。

# gtkam

图1 gtkam界面



在图1中,单击gtkam的“camera”→“Add Camera”可以添加数码相机,然后在弹出的窗体中单击“Detect”,测试数码相机的连接类型。最后单击“OK”,就可以看到数码相机中的照片了。

图2所示使用gtkam连接Kodak DX6340相机,看到存储卡中的照片。选择照片,单击保存就可以把照片保存到硬盘上。

我们也可以从http://sourceforge.net/project/showfiles.php?group_id=8874&release_id=209817获得gtkam的最新版本及源代码,下载后可以使用其中的install.sh来进行安装。

2.把数码相机当做是USB存储设备还有一种方式就是把数码相机当做是USB存储设备,如优盘、读卡器等,这样就可以像访问优盘那样来访问数码相机:

# mount -t vfat /dev/sda1 /mnt/usb



但是,采用这种方式极有可能遇到不能支持的数码相机,比如笔者使用的Kodak DX6340数码相机,插入USB口之后出现以下信息:

usb.c: USB device 2 (vend/prod 0x40a/0x570)            is not claimed by any active driver.



对这种问题的解决办法不只是可以驱动不支持的数码相机,像不支持的存储设备也都可以使用,比如优盘、读卡器等。

(1)使用lsmod确定USB基本驱动模块已经装载,如果没有使用以上的命令装载:

# modprobe ehci-hcd; modprobe usb-uhci;            modprobe usb-storage            # modprobe  ide-scsi; modprobe scsi_mod;            modprobe sd_mod



(2)使用cat /proc/bus/usb/devices得到当前系统USB总线上的设备信息,尤其注意Vendor、ProdID、Product等信息:

C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr=  0mA            I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub            E:  Ad=81(I) Atr=03(Int.) MxPS=   8 Ivl=255ms            T:  Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#=  3 Spd=12  MxCh= 0            D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1            P:  Vendor=040a ProdID=0570 Rev= 1.00            S:  Manufacturer=Eastman Kodak Company            S:  Product=KODAK EasyShare DX6340 Zoom Digital Camera            S:  SerialNumber=KCKCJ33400274

数码相机也是一种存储设备,然而对于Linux下的移动存储设备都是通过usb-storage.o驱动的,然后模拟为 SCSI设备。如果数码相机无法使用,通常是usb-storage驱动未包括此厂商识别和产品识别信息(在类似skel_probe的USB最初探测时被屏蔽了)。对于USB存储设备的硬件访问部分,通常是一致的。所以,要支持数码相机,仅需要修改usb-storage中关于厂商识别和产品识别列表部分。

USB设备识别信息中重要的部分如下:

P:  Vendor=040a ProdID=0570 Rev= 1.00            S:  Manufacturer=Eastman Kodak Company            S:  Product=KODAK EasyShare DX6340 Zoom Digital Camera



若/proc/bus/usb下没有相应USB设备信息,应输入以下命令将USB设备文件系统手动挂装到/proc/bus/usb:

# mount -t usbdevfs none /proc/bus/usb



(3)编辑drivers/usb/storage/unusual_devs.h文件。下面是所有已知的USB产品登记列表,格式如下:

UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax,            vendor_name,            product_name,            use_protocol, use_transport, init_function,            Flags).



usb-storage.o就是根据这个列表来识别各种设备。这样,可以将刚才/proc/bus/usb/devices文件中得出的信息添加在上面,重新编译模块,让usb-storage驱动去认识和发现它。

UNUSUAL_DEV(  0x040a, 0x0570, 0x0001, 0x0001,            "Eastman Kodak Company",            "KODAK EasyShare DX6340 Zoom Digital Camera",            US_SC_SCSI, US_PR_CB, NULL,            US_FL_FIX_INQUIRY | US_FL_START_STOP | US_FL_MODE_XLATE ),



注意,添加以上几句代码的位置一定要正确。经过比较发现,usb-storage驱动对所有注册都是按idVendor、 idProduct数值从小到大排列的,因此添加代码也要放在相应位置。

(4)重新编译模块,之后插入的数码相机就可以像其它优盘一样作为USB存储设备去访问。

# make dep            # make modules            # make modules_install

USB摄像头的驱动

在内核源文件中,自带了一部分摄像头的驱动,目前大量的杂牌摄像头都可以使用OV511的驱动模块。如果USB摄像头无法使用,则可以试试重新编译模块。下面就以一个没有驱动程序的摄像头为例,尝试使用OV511驱动模块驱动。

1. 获取内核源码

先从Red Hat光盘或kernel.org获取当前版本的内核源码,并安装:

# rpm -ivh kernel-source-2.XXX.rpm



或者

# tar zxvf linux-2.XXX.tar.gz



2. 运行

到源码目录中运行:

# make menuconfig



或者

# make xconfig  //需要在X-Window下



3. 选择USB的模块
选择USB的模块如图3所示。

选择要编译的驱动可以查看说明书,确定摄像头芯片是什么型号,如图4所示,选定OV511摄像头的支持。在USB support下可以选择多种驱动的模块,比如常用的OV511芯片的摄像头驱动、USB打印机的驱动等。

图3 编译内核选择USB support

图4 在USB support下可选择多种驱动模块



4. 保存、编译和安装

# make dep            # make modules            # make modules_install



5. 加载驱动

# modprobe ehci-hcd            # modprobe usb-uhci            # modprobe ov511            cat /proc/devices



接着运行gnomemeeting等工具,选择/dev/video0或/dev/video1作为摄像头设备文件,这样摄像头就可以使用了。

外置USB光驱及刻录机的驱动

USB光驱与其它的USB存储设备使用类似,只不过USB光驱会被识别为SCSI光驱,如/dev/sr0或/dev/scd0等设备,它需要sr_mod.o(SCSI CD-ROM设备)驱动模块。









# modprobe sr_mod  //如果sr_mod模块没有编译,请重新编译内核,在SCSI部分            # mount -t iso9660 /dev/scd0 /mnt/cdrom



关于外置刻录机驱动详见本刊今年第8期“Linux完全驱动(二)”:

# mkisofs -Jv -V examplecd -o example.iso /root/



将/root/目录下的文件做成一个名叫example.iso的光盘镜像文件,该文件的卷标为examplecd;还可通过下面命令将该文件加载到/mnt/iso文件夹中。

# mkdir /mnt/iso            # mount -t iso9660 -o loop example.iso /mnt/iso



在调整完/mnt/iso文件的内容后使用下面命令:

# umount /mnt/iso



最后使用cdrecord命令刻录:

# cdrecord -scanbus



查看SCSI总线中刻录机的配置信息:

Cdrecord 2.0 (i686-pc-linux-gnu) Copyright            (C) 1995-2002 J?rg Schilling            Linux sg driver version: 3.1.25            Using libscg version 'schily-0.7'            cdrecord: Warning: using inofficial            libscg transport code version            (schily - Red Hat-scsi-linux-sg.c-1.75-RH '@(#)scsi-linux-sg.c            1.75 02/10/21 Copyright 1997 J. Schilling').            scsibus0:            0,0,0     0) 'HL-DT-ST' 'RW/DVD GCC-4240N' 'E112' Removable CD-ROM            0,1,0     1) *            0,2,0     2) *            0,3,0     3) *            0,4,0     4) *            0,5,0     5) *            0,6,0     6) *            0,7,0     7) *



从上面可以看到目前光驱在SCSI总线的参数,然后根据参数输入下面的命令刻录光盘:

# cdrecord -v -eject speed=24 dev=0,0,0 example.iso



“speed=24”是以24速来刻录光盘,“dev=”后加上刚才显示的刻录机的SCSI参数。如果是外置DVD,则应使用dvdrecord命令,其用法与cdrecord相同。

# rpm -ivh dvdrecord-0.1.2-12.i386.rpm            # man dvdrecord  查看帮助
USB鼠标和键盘的驱动

1.鼠标的驱动

在Red Hat Linux中,可以使用mouseconfig命令来配置鼠标,选择USB接口鼠标即可,如图5所示。


图5 使用mouseconfig配置USB接口鼠标
# mouseconfig


如果使用手动的方式来配置,可以人工加入以下模块:

# modprobe hid            # modprobe input            # modprobe usbmouse            # modprobe mousedev


2.USB键盘的驱动

# modprobe hid            # modprobe input            # modprobe usbkbd            # modprobe keybdev

IEEE1394设备的驱动

IEEE1394又称Firewire(火线)、i-Link(Sony的叫法),它跟USB接口类似,目前可以提供400Mb/s的带宽,虽然在理论上它较USB 2.0的480Mb/s的速度慢一些,但是在实际使用中,Firewire要比USB 2.0的设备快不少,所以仍然有很多设备配备这种接口,如DV(数字摄像机)和移动硬盘等。

与USB相比,Firewire的通用性不够强,得到的支持也较少。一般主板上不带该Firewire的芯片,通常是购买带1394接口的PCI卡来支持1394的设备。对于1394设备,Linux内核2.4.10之后的版本都可以支持。IEEE1394的驱动放在以下位置:

# ls /lib/modules/2.XXX/kernel/drivers/ieee1394            amdtp.o  dv1394.o   ieee1394.o  raw1394.o  video1394.o            cmp.o    eth1394.o  ohci1394.o  sbp2.o


IEEE1394的驱动方式较USB大同小异,只是首先加载的是对1394总线的驱动(ieee1394.o)和1394芯片的驱动(ohci1394.o)。如果使用1394卡连接DV,那么需要1394视频驱动(video1394.o)和DV视频I/O驱动(dv1394.o);如果需要访问的是1394外接硬盘或CD-ROM、刻录机等,则需要对SBP-2协议的支持(sbp2.o);如果使用1394接口的以太网卡,则需要加载驱动eth1394.o。

如果没有某种设备的驱动,则可以重新编译内核模块,选择以下模块:

# cd /usr/src/linux-2.XXX            # make xconfig


选择其中的IEEE1394选项,如图6所示,然后重新编译模块:

# make dep            # make modules            # make modules_install


驱动IEEE1394接口的硬盘或光驱时,需要预先加载的驱动有ieee1394.o和ohci1394.o:

# modprobe ohci1394


上面代码会将两样驱动全部装载上,因为ohci1394依赖于ieee1394。

硬盘需要的驱动是sbp2.o,插入硬盘后它应该会自动加载。与USB设备相同,硬盘会被模拟成SCSI设备,请留意屏幕上显示的信息,看看是被模拟为sda还是其它的设备。使用以下命令使用硬盘:
# mkdir /mnt/1394            # mount -t vfat /dev/sda1 /mnt/1394
 
IEEE1394光驱应该使用设备为/dev/scd0,如果在插入设备时没有自动加载,则可以试着手动加载sbp2模块及SCSI模块:

scsi_mod.o 对SCSI设备的支持; sd_mod.o 对SCSI硬盘支持模块,对应硬盘;

sr_mod.o 对SCSI光盘支持模块,对应光驱;

sg.o SCSI序列的通用支持模块。

IEEE1394光驱驱动与USB下相应的设备驱动非常相似,这里就不再赘述了。

现在各种移动设备层出不穷,花样繁多,目前国内网站上的资料不是很全,使用google搜索英文网站往往能得到许多自己需要的东西。

优盘或USB硬盘常见问题解决方法

1. 加载/dev/sda1时出错

这是因为较早的优盘不分区,它们使用/dev/sda,也有可能使用/dev/sda2或sda3等设备文件,请仔细观察fdisk -l /dev/sda的输出结果,看一看优盘的分区到底是哪一个。

2. 主机中已有SCSI或USB设备

主机中已经有SCSI或USB设备,比如/dev/sda硬盘或另一个优盘,这时可以尝试sdb或sdc等设备。实际上每一次在插入优盘时可以留意一下屏幕上显示的信息,那个优盘被转换成哪一个sd设备。

3. 优盘插入后没有反应,访问/dev/sd设备也没有反应

这时可以查看相关模块是否已经加载,如果没有加载可以手动加载,然后重新插入该设备,看看是否有反应:

# modprobe ehci-hcd; modprobe usb-uhci; modprobe usb-storage.o            # modprobe ide-scsi; modprobe scsi_mod.o; modprobe sd_mod.o


4. 设备驱动已经加载,如何知道访问哪个设备文件

对比加载驱动前和加载驱动后的/proc/devices文件,多出的那一行就是这种驱动程序注册的主设备号。例如,对比OV511加载前后/proc/devices文件的变化,就会发现多出如下一行:

# cat /proc/devices            Character devices:            ...            81 video_capture            ...


上面代码表示C型设备、主设备号为81的设备文件是访问OV511驱动的入口,再对照/usr/src/Documentation/devices.txt中查找C类型的主设备号81,就可以知道对应如下设备文件:

81 char        video4linux            0 = /dev/video0       Video capture/overlay device


上面简要介绍了Linux下常用的USB、IEEE1394、PCMCIA设备驱动的安装与配置,希望能对读者安装与使用这些设备提供帮助。


阅读(1386) | 评论(0) | 转发(2) |
0

上一篇:利用U盘加载控制器驱动来安装Linux系统

下一篇:如何编写Linux下的设备驱动程序

相关热门文章
  • 3d打印机软件仅售1606元...
  • objet3d打印机便捷地将信息拖...
  • 科技感导航按钮 三星Objet光敏...
  • uPrint SE打印机使打印机足够...
  • KTV包房装修设计如何对音响调...
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • 什么是shell
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • 请教想查12个月的数据条数,看...
  • new/delete 和malloc/free 有...
  • ubuntu下hadoop环境的搭建...
  • 求助:如何用Linux架设ISATAP...
  • redhat图形界面不出先登录界面...
给主人留下些什么吧!~~