分类:
2008-05-27 10:31:34
|
级别: 初级
于辰涛 (scu_yct@263.net), 软件工程师, 联想(北京)电脑公司
2001 年 7 月 01 日
本文是《如何在LINUX下实现硬件的自动检测》一文的下部分,作者将继续向我们讲述如何自动检测另外几种总线类型硬件设备。
USB设备检测也是通过/proc目录下的USB文件系统进行的。为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块。在检测开始时,一般要先检测是否存在/proc/bus/usb目录,若不存在则尝试插入USB桥接模块。
现在一般的USB桥接器模块有两种类型,UHCI和OHCI。在决定插入那一个桥接器模块时,可以察看/proc/pci文件来决定。打开此文件,您若发现USB节为 I/O at 0xHHHH格式(例如出现 I/O at 0xe000 [0xe01f]),HHHH为16进制数,则桥接器类型为UHCI。若是它为 32 bit memory at 0xHH000000形 式(例如出现32 bit memory at 0xee000000),HH为16进制数,则桥接器类型为OHCI。但是若您的桥接器类型不满足上述任何一种情况,唯一的解决办法就是您尝试插入这两种 模块,直到成功为止。一般而言,UHCI类型的桥接器它的插入模块是uhci或usb-uhci(由内核版本决定);而对于OHCI类型的桥接器它的插入 模块是ohci或usb-ohci。
您在正确的插入了桥接器模块之后,这时/proc文件系统下就会出现USB设备目录,不过这时这个目录是空的,没有任何文件。这时您就必须挂接
usbdevfs文件系统,然后通过此文件系统检测连接的设备。在成功挂接usb文件系统之后,就会生成文件
/proc/bus/usb/devices,/proc/bus/usb/drivers和目录/proc/bus/usb/busNo。挂接
usbdevfs文件您可以通过如下操作实现:
mount -t usbdevfs none /proc/bus/usb
或在/etc/fstab上加入
none /proc/bus/usb usbdevfs defaults 0 0
然后通过/proc/bus/usb/devices文件的内容,您就可以获得连接的设备信息,包括设备标识和制造商标是等信息。
usb设备类型描述:
设备规范 | 设备类码 | 接口类码 |
应用程序特定 | - | 0xFE |
声音接口 | 0x00 | 0x01 |
通信设备 | 0x02 | - |
CDC控制接口e | - | 0x02 |
CDC数据接口 | - | 0x0A |
HID | 0x00 | 0x03 |
HUB | 0x09 | 0x09 |
批量存储设备 | 0x00 | 0x08 |
监视器 | same as HID | same as HID |
电源设备 | same as HID | same as HID |
物理设备 | - | 0x05 |
打印机 | - | 0x07 |
供应商特定 | - | 0xFF |
T = 总线拓扑结构(Lev, Prnt, Port, Cnt,
等),是指USB设备和主机之间的连接方式
B = 带宽 (仅用于USB主控制器)
D = 设备描述信息
P = 产品标识信息
S = 串描述符
C = 配置描述信息 (* 表示活动配置)
I = 接口描述信息
E = 终端点描述信息
一般格式:
d = 十进制数
x = 十六进制数
s = 字符串
拓扑信息
T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd |
带宽信息
B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd |
设备描述信息和产品标识信息
D: Ver=x.xx Cls=xx(s) Sub=xx Prot=xx MxPS=dd #Cfgs=dd |
串描述信息
S: Manufacturer=ssss |
配置描述信息
C: #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA |
接口描述信息(可为多个)
I: If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss |
终端点描述信息
E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms |
举个例子,这是在连接了一个USB键盘时的配置情况。
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= |
它的物理拓扑可用下图来表示:
对于Linux下的usb设备而言,T:(总线拓扑)行用于生成连接在hub上的设备的描述信息,I:(接口信息)行可用于决定每个设备所用的驱动程序,C:(配置信息)可用于列出设备使用最大电流。
对于Linux下的usb设备,您可以访问 获取更详细的信息。
|
在Linux下要实现连接在并口上的设备检测,要求设备必须是支持IEEE 1284协议的。对于不支持IEEE 1284通讯协议的并行设备,是无法完成自动检测的。同样在定制系统内核时,也必须在并行端口支持(Parallel port support)选项中选中IEEE 1284 transfer mode这一项。在并口检测开始时,检测程序应检查是否存在/proc/sys/dev/parport目录(针对2.4.x内核),若不存在则尝试插入模块parport。加载parport模块一般有三种方式:
在成功的插入了此模块之后,这时/proc文件系统下就会存在目录/proc/sys/dev/parport,但是此时此目录下的文件大部分为空,没有
任何内容。这时您就可以根据并口连接的设备,尝试插入相应的内核驱动模块。例如,当连接并口打印机时,您可以插入模块lp。使用如下命令:
insmod lp parport=0 (对于打印机连接在并口0(LPT1))
在成功插入此模块之后,而且在连接的并口设备支持IEEE 1284协议时,这时此目录下的autoprobe,modes等文件会出现设备上读出的设备描述以及设备配置信息。由此信息,您可以在CUPS中选择对应的打印机驱动程序,完成打印机的配置。
6.2 /proc/sys/dev/parport/文件结构
目录树:
parport |
文件 | 文件内容 |
devices/active | 使用那个端口的设备驱动程序列表。在当前使用端口的设备前会出现一个"+"号。串"none"意味着没有设备驱动程序使用这个端口。 |
base-addr | 并行端口的基地址或再不只一个端口时由tab分隔的多个基地址。 |
irq | 并行端口的IRQ,若不使用时则用-1 |
dma | 并行端口的dma通道,若没有使则用-1 |
modes | 并行端口的硬件模式PCSPP PC风格的SPP寄存器可用(标准并行端口)TRISTATE 端口是双向的COMPAT 打印机的硬件加速可用EPP EPP协议的硬件加速可用(增强并行端口)ECP ECP协议的硬件加速可用DMA DMA可用 |
autoprobe | 已经获得的IEEE-1284设备标识信息 |
autoprobe[0-3] | 从遵循IEEE-1284.3的雏菊链路设备取出的设备信息 |
spintime | 忙循环等待外设响应的微秒数。调节此值可以改善外设的性能。这是端口级的设置。它应用于此端口上的所有设备 |
timeslice | 设备驱动程序允许保持端口声明的微秒数。这只是一个建议,驱动程序在必要时可以忽略。 |
default/* | 在注册新端口时,它取出缺省的spintime。在注册新设备时,它取出缺省时间片。 |
例如,在系统连接了HP LaserJet 6L打印机之后,此目录下关键文件的内容为:
/proc/sys/dev/parport/parport0/autoprobe: |
|
因为PCMCIA设备主要用于笔记本电脑,所以在您使用普通的台式电脑时,您无需安装包pcmcia-cs。在笔记本电脑上安装了pcmcia-cs包之 后,为了实现PCMCIA设备的自动检测,您可以先查找系统中是否存在/proc/bus/pccard目录,如果不存在此目录则尝试插入 pcmcia_core。
在成功插入了此模块之后,/proc/bus/pccard目录就生成了。此后,您就可以检查pci的系统设备,找到系统桥接器,根据桥接器类型获得您需要插入的桥接器模块。例如,在我的系统上,桥接器为Texas Instruments PCI1251,则它的桥接器为i82365。在Linux系统下,适用的桥接器模块一般只有i82365或tcic两种。若无法获得准确的桥接器驱动程序,您可以尝试着插入两种模块,直到成功时为止。
然后为了能够实时的配置您的pccard,您需要启动服务pcmcia,
/etc/rc.d/init.d/pcmcia start
并由此服务启动程序cardmgr。cardmgr监视pcmcia槽上,卡的插入和弹出操作。在卡插入之后,cardmgr查询卡的配置数据库。若发现 卡能够被标识,相应的设备驱动程序则会自动加载。在弹出卡之后,卡的驱动程序会自动的关闭并卸载。当卡插入之后,每个槽上的卡信息和设备信息都被记录在 /var/lib/pcmcia/stab文件中。
/proc/bus/pccard/{irq,ioport,memory}
包含资源分配表
/proc/bus/pccard/drivers
这会列出所有当前加载的pcmcia客户驱动程序,包括静态连接到内核的模块
/proc/bus/pccard/*/info
对于每个socket,描述socket主控制器和它的性能,*为对应的socket编号
/proc/bus/pccard/*/exca
Intel i82365sl兼容的寄存器集的ExCA控制器的转储
/proc/bus/pccard/*/{pci,cardbus}
对于cardbus桥,桥的pci配置空间的转储和桥的cardbus配置寄存器的转储
/etc/pcmcia/config实际上是一个针对pcmcia设备的配置数据库,它的内容主要是指定卡驱动程序加载时所需的模块。例如
device "serial_cs"
class "serial" module "misc/serial", "serial_cs"
表示在插入serial_cs时,需要先插入模块misc/serial和serial_cs。
pcmcia主机控制器的主要类型为
当 前pcmcia设备包括5种IO设备类型包括network,SCSI,cdrom,fixed disk,和serial以及2种内存设备类型memory和FTL。对于每一种类型,在/etc/pcmcia/目录下存在两个配置脚本,例如,对于 scsi设备都存在一个主配置脚本(/etc/pcmcia/scsi)和选项配置脚本(/etc/pcmcia/scsi.opts)。
PCMCIA
为yes表示启动PCMCIA支持
PCIC
标识PCCard接口控制驱动模块。一般有两种类型:tcic或i82365,缺省是i82365。
PCIC_OPTS
PCIC模块的选项
例如:PCIC_OPTS="irq_list=5,9,10"、"do_scan=0" 完全禁止中断检测
CORE_OPTS
pcmcia_core模块的选项。见man pcmcia_core。
CARDMGR_OPTS
cardmgr守护程序的选项。见man cardmgr。
SCHEME
设置pccard的配置方案。
cardmgr处理/etc/pcmcia/config.opts中的io端口范围。但在极少的情况下,从设备读可以阻碍系统功能而导致死锁。在 CORE_OPTS中加入probe_io=0,可以禁止此操作。使用i82365或tcic驱动程序时,irq_list选项可用于限制测试的中断。 cs_irq用于明确设置中断以检测卡状态改变。若不能使用中断,可以使用poll_interval=100(100表示轮询间隔为1秒)设置轮询。这 些选项应置入/etc/rc.d/rc.pcmcia或/etc/sysconfig/pcmcia的"PCIC_OPTS="行。
cardmgr基于/etc/pcmcia/config中的信息来配置卡。cardmgr为每个socket记录设备信息,此信息存于/var/lib/pcmcia/stab中。例如:
Socket 0: Adaptec APA-1460 SlimSCSI |
第一个域表示socket,第二个是设备类型,第三个是设备名,第四个用于关联多个设备和一个驱动程序时的设备编号。第五个是设备名。最后两个域标是设备的主、次设备号。
cardctl可用于监视和控制当前pcmcia socket的状态。
cardctl config,显示socket配置,包括电源,中断,I/O配置。例如:
Socket 0: |
cardctl indent,得到卡的标识信息,包括产品标识信息,制造商标识代码,功能标识代码:
Socket 0: |
cardctl suspend和cardctl resume用于无需卸载相关驱动程序的情况下关闭卡。cardctl reset用于尝试重设和重新配置卡。cardctl insert和cardctl eject用于仿真卡的物理的插入和删除动作。推荐在退出卡之前,执行cardctl eject命令。/etc/rc.d/rc.pcmcia stop会卸载所有的pcmcia包。
于辰涛,联想(北京)电脑公司软件工程师。目前主要从事Linux系统安装程序的开发工作,主要研究兴趣是操作系统的工作机制和开发底层系统程序。您可以通过电子邮件 scu_yct@263.net 跟他联系。 |