红联Linux门户
Linux帮助

Linux培训园地:Linux下设备完全驱动之四

发布时间:2005-10-18 00:42:06来源:红联作者:thej
作者:郄晓烨

尽管各种数码设备越来越多,但是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
文章评论

共有 11 条评论

  1. thej 于 2005-10-18 00:50:11发表:

    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设备驱动的安装与配置,希望能对读者安装与使用这些设备提供帮助。

  2. thej 于 2005-10-18 00:49:39发表:

    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


    图6 选择需要的IEE1394模块

  3. thej 于 2005-10-18 00:48:40发表:

    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

  4. thej 于 2005-10-18 00:47:47发表:

    外置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 查看帮助

  5. thej 于 2005-10-18 00:46:54发表:

    选择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作为摄像头设备文件,这样摄像头就可以使用了。

  6. thej 于 2005-10-18 00:45:44发表:

    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的模块

  7. thej 于 2005-10-18 00:45:11发表:

    数码相机也是一种存储设备,然而对于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

  8. thej 于 2005-10-18 00:44:37发表:

    图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

  9. thej 于 2005-10-18 00:44:17发表:

    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相机

  10. thej 于 2005-10-18 00:43:07发表:

    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

  11. thej 于 2005-10-18 00:42:38发表:

    比如,scanner.o模块对应的就是USB扫描仪的驱动;audio.o对应USB接口的扬声器驱动。从上面看来,Linux对USB设备的支持一般分为两个部分,首先通过通用的usbcore等模块驱动USB芯片,这样识别出USB设备;然后再通过具体的驱动程序驱动该设备。所以,常驻内存的USB驱动模块为usbcore、ehci-hcd和usb-uhci等。

    # lsmod
    Module Size Used by Not tainted
    ... ...
    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]
    ... ...


    在这些USB基础驱动模块已经加载的情况下,再插入优盘等USB设备才能被识别出来,系统将会自动加载相对应的驱动。如果插入优盘没有反应,那么可能是这些USB基础驱动没有加载,可以手动通过以下方式加载:


    # modprobe usbcore
    # modprobe ehci-hcd
    # modprobe usb-uhci
    # modprobe hid //如果是USB鼠标或键盘

    USB存储设备的驱动

    USB存储设备使用的非常广泛,例如优盘、移动硬盘、读卡器、数码相机等,它们都是在加载了USB的通用驱动后,再使用/lib/modules/2.XXX/kernel/drivers/usb/storage/usb-storage.o作为存储的驱动模块,该驱动会将存储设备模拟成SCSI设备。

    需要注意的是,只有在系统加载了上面叙述的几种USB基础驱动后,该USB设备才可以被认出,然后系统会将它们模拟成SCSI设备(主要原因是系统允许SCSI设备热插拔),如SCSI硬盘、SCSI光驱等。

    下面先来看一下这类存储设备还需要哪些配套驱动模块。这些模块分散在/lib/modules/2.XXX/kernel/drivers目录中: