作者:于辰涛 (scu_yct@263.net)
联想(北京)电脑公司软件工程师
用过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系统安装程序的开发工作,主要研究兴趣是操作系统的工作机制和开发底层系统程序。您可以通 过电子邮件 scu_yct@263.net 跟他联系。