分享
 
 
 

如何在LINUX下实现硬件的自动检测(下)

王朝system·作者佚名  2006-11-23
窄屏简体版  字體: |||超大  

本文是《如何在LINUX下实现硬件的自动检测》一文的下部分,作者将继续向我们讲述如何自动检测另外几种总线类型硬件设备。

5 .USB设备的自动检测

5.1 USB设备检测的一般过程

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

表5-1 usb设备类码

5.2 usb文件系统简介

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

| | | | | | | | |__最大子设备

| | | | | | | |__设备速度(Mbps)

| | | | | | |__设备编号

| | | | | |__这层的设备数

| | | | |__此设备的父连接器/端口

| | | |__父设备号

| | |__此总线在拓扑结构中的层次

| |__总线编号

|__拓扑信息标志

带宽信息

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

P: Vendor=xxxx ProdID=xxxx Rev=xx.xx

D: Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd

| | | | | | |__配置编号

| | | | | |______缺省终端点的最大包尺寸

| | | | |

| | | | |__设备协议

| | | |__设备子类型

| | |__设备类型

| |__设备USB版本

|__设备信息标志编号#1

P: Vendor=xxxx ProdID=xxxx Rev=xx.xx

| | | |__产品修订号

| | |__产品标识编码

| |__制造商标识编码

|__设备信息标志编号#2

串描述信息

S: Manufacturer=ssss

| |__设备上读出的制造商信息

|__串描述信息

S: Product=ssss

| |__设备上读出的产品描述信息,对于USB主控制器此字段为"USB *HCI Root Hub"

|__串描述信息

S: SerialNumber=ssss

| |__设备上读出的序列号,对于USB主控制器它是一个生成的字符串,表示设备标识

|__串描述信息

配置描述信息

C: #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA

| | | | |__最大电流(mA)

| | | |__属性

| | |__配置编号

| |__接口数

|__配置信息标志

接口描述信息(可为多个)

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

E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms

| | | | |__间隔

| | | |__终端点最大包尺寸

| | |__属性(终端点类型)

| |__终端点地址(I=In,O=Out)

|__终端点信息标志

举个例子,这是在连接了一个USB键盘时的配置情况。

T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2

B: Alloc= 41/900 us ( 5%), #Int= 3, #Iso= 0

D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1

P: Vendor=0000 ProdID=0000 Rev= 0.00

S: Product=USB UHCI Root Hub

S: SerialNumber=e000

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=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 3

D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1

P: Vendor=07e4 ProdID=a961 Rev= 0.01

S: Manufacturer=ALCOR

S: Product=Movado USB Keyboard

C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA

I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub

E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms

T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0

D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1

P: Vendor=07e4 ProdID=a961 Rev= 0.01

S: Manufacturer=ALCOR

S: Product=Movado USB Keyboard

C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr= 0mA

I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=01 Driver=hid

E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl= 10ms

I: If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=hid

E: Ad=82(I) Atr=03(Int.) MxPS= 4 Ivl=255ms

它的物理拓扑可用下图来表示:

对于Linux下的usb设备而言,T:(总线拓扑)行用于生成连接在hub上的设备的描述信息,I:(接口信息)行可用于决定每个设备所用的驱动程序,C:(配置信息)可用于列出设备使用最大电流。

对于Linux下的usb设备,您可以访问 http://www.linux-usb.org 获取更详细的信息。

6 并行设备的自动检测

6.1 并行设备检测的一般过程

在Linux下要实现连接在并口上的设备检测,要求设备必须是支持IEEE 1284协议的。对于不支持IEEE 1284通讯协议的并行设备,是无法完成自动检测的。同样在定制系统内核时,也必须在并行端口支持(Parallel port support)选项中选中IEEE 1284 transfer mode这一项。在并口检测开始时,检测程序应检查是否存在/proc/sys/dev/parport目录(针对2.4.x内核),若不存在则尝试插入模块parport。加载parport模块一般有三种方式:

静态插入模块

insmod parport.o

或 insmod parport_pc.o io=0x3bc,0x378,0x278 irq=none,7,auto

废除系统缺省的检测值

kmod(/etc/modules.conf)加载

alias parport_lowlevel parport_pc

options parport_pc io=0x378,0x278 irq=7,auto

内核的并口探测程序用于获得IEEE 1284设备标识信息。在并口被检测时,连接到其上的设备被分析。探测的信息在/proc/sys/dev/parport/。

在编译并口代码进入内核之后,使用内核加在参数

如:加入LILO命令行

parport=0x3bc parport=0x378,7 parport=0x278,auto,nofifo

parport=0

禁止内核parport支持

parport=auto

内核自动检测

在成功的插入了此模块之后,这时/proc文件系统下就会存在目录/proc/sys/dev/parport,但是此时此目录下的文件大部分为空,没有任何内容。这时您就可以根据并口连接的设备,尝试插入相应的内核驱动模块。例如,当连接并口打印机时,您可以插入模块lp。使用如下命令:

insmod lp parport=0 (对于打印机连接在并口0(LPT1))

在成功插入此模块之后,而且在连接的并口设备支持IEEE 1284协议时,这时此目录下的autoprobe,modes等文件会出现设备上读出的设备描述以及设备配置信息。由此信息,您可以在CUPS中选择对应的打印机驱动程序,完成打印机的配置。

6.2 /proc/sys/dev/parport/文件结构

目录树:

parport

|-- default

| |-- spintime

| `-- timeslice

|-- parport0

| |-- autoprobe

| |-- autoprobe0

| |-- autoprobe1

| |-- autoprobe2

| |-- autoprobe3

| |-- devices

| | |-- active

| | `-- lp

| | `-- timeslice

| |-- base-addr

| |-- irq

| |-- dma

| |-- modes

| `-- spintime

`-- parport1

|-- autoprobe

|-- autoprobe0

|-- autoprobe1

|-- autoprobe2

|-- autoprobe3

|-- devices

| |-- active

| `-- ppa

| `-- timeslice

|-- base-addr

|-- irq

|-- dma

|-- modes

`-- spintime

文件 文件内容

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:

CLASS:PRINTER; (连接的设备为打印机)

MODEL:HP LaserJet 6L; (打印机类型描述)

MANUFACTURER:Hewlett-Packard; (制造商类型)

DESCRIPTION:Hewlett-Packard LaserJet 6L Printer;

/proc/sys/dev/parport/parport0/modes:

PCSPP,TRISTATE

/proc/sys/dev/parport/parport0/base-addr:

888 1912

/proc/sys/dev/parport/parport0/irq:

-1

/proc/sys/dev/parport/parport0/dma:

-1

7 PCMCIA设备自动检测

因为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文件中。

7.1 /proc/bus/pccard目录结构

/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配置寄存器的转储

7.2 pcmcia配置文件

/etc/pcmcia/config实际上是一个针对pcmcia设备的配置数据库,它的内容主要是指定卡驱动程序加载时所需的模块。例如

device "serial_cs"

class "serial" module "misc/serial", "serial_cs"

表示在插入serial_cs时,需要先插入模块misc/serial和serial_cs。

pcmcia主机控制器的主要类型为

Databook TCIC-2

Intel i82365SL-compatible

当前pcmcia设备包括5种IO设备类型包括network,SCSI,cdrom,fixed disk, 和serial以及2种内存设备类型memory和FTL。对于每一种类型,在/etc/pcmcia/目录下存在两个配置脚本,例如,对于scsi设备都存在一个主配置脚本(/etc/pcmcia/scsi)和选项配置脚本(/etc/pcmcia/scsi.opts)。

7.3 pcmcia启动脚本(/etc/sysconfig/pcmcia)

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端口范围。但在极少的情况下,从设备读可以阻碍系统功能

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有