如何在Linux下实现硬件的自动检测

作者:于辰涛 ([email protected])
联想(北京)电脑公司软件工程师


用过Linux的人都知道在Linux上硬件的配置 过程是非常繁杂的。比如说,对于一块普通的pci网卡,您可能先要知道它的芯片类型,网卡生产厂商,然后猜出它对应的硬件驱动模块,然后再使用 modprobe(insmod)插入这个模块,再然后还要生成一系列的配置脚本,最后才能使其正常工作。这还只是一块网卡的配置过程,但是对于不胜枚举 的其他硬件,如显卡、声卡、modem、isdn设备、usb设备、pcmcia设备,而它们的配置方法和生成的配置脚本都不尽相同,因此对于一个普通用 户要想全部掌握这些配置过程是相当困难的。硬件的自动检测是进行Linux下设备自动配置过程的前提。本文的内容是先从硬件在Linux下的内核描述信息 开始,着重介绍如何实现硬件的自动检测。


【资 料】如何在LINUX下实现硬件的自动检测——7:PCMCIA设备自动检测 Xinsoft,2003-12-20 15:24:05

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

7.4 cardmgr和cardctl的使用
cardmgr基于/etc/pcmcia/config中的信息来配置卡。cardmgr为每个 socket记录设备信息,此信息存于/var/lib/pcmcia/stab中。例如:

Socket 0: Adaptec APA-1460 SlimSCSI
    0       scsi    aha152x_cs      0       sda     8       0
    0       scsi    aha152x_cs      1       scd0    11      0
Socket 1: Serial or Modem Card
    1       serial  serial_cs       0       ttyS1   5       65


 



第一个域表示 socket,第二个是设备类型,第三个是设备名,第四个用于关联多个设备和一个驱动程序时的设备编号。第五个是设备名。最后两个域标是设备的主、次设备 号。
cardctl可用于监视和控制当前pcmcia socket的状态。
cardctl config,显示socket配置,包括电源,中断,I/O配置。例如:

Socket 0:
      not configured
    Socket 1:
      Vcc = 5.0, Vpp1 = 0.0, Vpp2 = 0.0
      Card type is memory and I/O
      IRQ 3 is dynamic shared, level mode, enabled
      Speaker output is enabled
      Function 0:
        Config register base = 0x0800
          Option = 0x63, status = 0x08
        I/O window 1: 0x0280 to 0x02bf, auto sized
        I/O window 2: 0x02f8 to 0x02ff, 8 bit


 



cardctl indent,得到卡的标识信息,包括产品标识信息,制造商标识代码,功能标识代码:

Socket 0:
      no product info available
    Socket 1:
      product info: "LINKSYS", "PCMLM336", "A", "0040052D6400"
      manfid: 0x0143, 0xc0ab
      function: 0 (multifunction)


 



cardctl suspend和cardctl resume用于无需卸载相关驱动程序的情况下关闭卡。cardctl reset用于尝试重设和重新配置卡。cardctl insert和cardctl eject用于仿真卡的物理的插入和删除动作。推荐在退出卡之前,执行cardctl eject命令。/etc/rc.d/rc.pcmcia stop会卸载所有的pcmcia包。


作者简介

于 辰涛,联想(北京)电脑公司软件工程师。目前主要从事Linux系统安装程序的开发工作,主要研究兴趣是操作系统的工作机制和开发底层系统程序。您可以通 过电子邮件 [email protected] 跟他联系。

你可能感兴趣的:(如何在Linux下实现硬件的自动检测)