Linux PCMCIA HOWTO 中文版 作者: David Hinds, dhinds@hyper.stanford.edu 译者: 谢昆中 HSIEH Kun-Chung, 台湾 中华民国 Taiwan, Republic of China (NOT People's Republic of China) ( [1]linuxer.bbs@cis.nctu.edu.tw ) 1998年2月19日 v2.5版 _________________________________________________________________ 本文件主要描述如何在 Linux 下安装及使用 PCMCIA 卡服务程式并回答大家常问 到的问题。这份文件最新的版本会放在 [2]ftp://hyper.stanford.edu/pub/pcmcia/doc 。另外 HTML 版本会被放在 [3]http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html。 _________________________________________________________________ 1. 一般资讯及硬体要求 * 1.1 简介 * 1.2 著作权宣告与解除修款 * 1.3 最新版本是哪个?我可从哪儿拿到? * 1.4 哪些系统被支援呢? * 1.5 哪些PCMCIA卡被支援呢? * 1.6 什麽时候我的新卡片才会被支援呢? * 1.7 邮寄名册及其他资讯来源 * 1.8 怎麽不提供 PCMCIA 的二进位码呢? * 1.9 为什麽 PCMCIA 套件这麽大呢? 2. 编译与安装 * 2.1 准备工作与核心设定 * 2.2 安装 * 2.3 安装完後(使用BSD 启动手稿的系统) * 2.4 安装完後(使用System V 启动手稿的系统) * 2.5 安装完後(使用 System V 起始手稿的系统) * 2.6 插槽驱动程式选项 * 2.7 系统资源设定 3. 解决安装与建构的问题 * 3.1 基本 PCMCIA 核心模组并没载入 * 3.2 插断扫描失败 * 3.3 记忆体侦测失败 * 3.4 错误地侦测卡片的插入与抽出 * 3.5 两张卡之间的资源相冲突 * 3.6 设备建构并没有完成 4. 使用方法以及特色 * 4.1 用来建构以及监控 PCMCIA 设备的工具 * 4.2 PCMCIA建构手稿的概要 * 4.3 PCMCIA 网路卡 * 4.4 PCMCIA 串列与数据机设备 * 4.5 PCMCIA SCSI卡 * 4.6 PCMCIA 记忆卡 * 4.7 PCMCIA ATA/IDE 卡式硬碟机 * 4.8 多功能卡 5. 进阶的主题 * 5.1 PCMCIA 设备的资源分配 * 5.2 我怎样才能为家庭及工作的使用做各别的设备设定呢? * 5.3 从 PCMCIA 设备开机 6. 使用未被支援的卡片 * 6.1 建构无法被辨视的卡片 * 6.2 增列对 NE2000相容乙太网路卡的支援 * 6.3 PCMCIA 软碟机介面卡 * 6.4 支援 Xircom 卡到底怎麽了? 7. 除错小技巧及程式设计资讯 * 7.1 提出有用的小虫报告 * 7.2 低阶 PCMCIA 除错辅助 * 7.3 为新卡片写卡片服务驱动程式 * 7.4 给 PCMCIA 客户自定驱动程式的作者的指引 * 7.5 给 Linux 供应版本维护人员的导引 _________________________________________________________________ 1. 一般资讯及硬体要求 1.1 简介 给 Linux 使用的卡片服务程式是个完整支援 PCMCIA 的套件。 它包含了组成 PCMCIA 卡服务程式应用程式介面的一套可载入模组、一套给 特别卡片使用的客 户驱动程式式、一个可反应出卡片插入、抽出并依需要来 载入或卸下驱动程式的 卡片管理精灵。 它支援 `` 热机交换 '' PCMCIA 卡 片,因此呢,卡片就可以在 任何时间插入或抽出了。 本软体仍在发展中,所以可能在程式□有小虫,请您小心使用。我将尽力把 我所 知道的问题修正,可是如果您不告诉我您在使用上所发生的程式问题, 也许我就 无法知道问题所在。因此,如果您使用这个程式,请来信告诉我您 使用经验,不 论是好是坏。 如果您有任何怎样改进这份文件的宝贵意见,也请让我知道 (dhinds@hyper.stanford.edu)。 1.2 著作权宣告与解除修款 著作权属於 Copyright (c) 1998 David A. Hinds 本文件不需在我的事先允许下即可任何形式地被复制或散布。本文件的任何 修改 过的版本 (这包含翻译成其他语言的版本 ) 也可以免费地被散布, 只 要他们知 道这点并且在不损害本文章的版权的前提下。 本文件不需在我的事先允诺下用在商业性的散布上,虽然这不是必要的,但 我很 希望您能告诉我有关您的使用。如果您想将本文件出版到书籍上,请您 与我连络 一下,以确定您有最新的版本。 本文件只是 `` 呈现 '' 的表现而已,并没有任何明显或暗示任何的保证。 您自 已必须承担使用本文件□面的资讯之风险。 1.3 最新版本是哪个?我可从哪儿拿到? 目前最新的卡片服务程式为 3.0 版, 小幅修改或除虫过的版本为 3.0.1、 3.0.2 等等如此类推。 最新的原始程式码可从 hyper.stanford.edu 内的 /pub/pcmcia 目录找到, 叫 做 pcmcia-cs-3.0.?.tar.gz。 在那儿通常会有数个版本在。通常我只会把最新 的几个修改版放在此处。新 版本通常都包含了未测式完成的程式码,因此我也会 把上一个稳定的修正版 放在那儿以备不时之需。现在的稳定版为 2.9.12 版,要 使用哪个版本较好 呢?随您的意思啦。在 CHANGES 档案内会做简单的版本差异 比较。 hyper.stanford.edu 会被对映到 sunsite.unc.edu (以及所有 的 sunsite 对映 网站上 ) 的 /pub/Linux/kernel/pcmcia 内。 假使您不想自己编译 PCMCIA 程式的话, 市面上主要的 Linux 供应商如 Slackware、 Red Hat、Caldera、Yggdrasil 等等都有已编译好的程式可使 用。 1.4 哪些系统被支援呢? 这些程式应该可以在 Linux 相容的笔记型电脑上正常工作。常见的 PCMCIA 控制 器都有支援, 这些包括以下厂商: Intel、 Cirrus、 Vadem、VLSI、 Ricoh 及 Databook chips。 亦支援 IBM 及 Toshiba 的笔记型电脑。只要 是直接插上 ISA 介面槽 (SCSI-to-PCMCIA 或 IDE-to-PCMCIA ) 不管是的 桌上型电脑之 PCMCIA 插槽装置亦受支援。 CardBus 桥接控制器遵循著 ``Yenta'' 暂存器规格 (包括 TI 、Cirrus、SMC 、O2Micro、Omega Micro 和 Ricoh 的晶片 ) 都被支援,但 对於 32 位元的 CardBus 卡片仍只属於实验性质。驱动程式版本比 3.0 版 还早的在 CardBus 插 槽中也只能支援到 16 位元的卡。 由於笔记型电脑硬 体科技的快速进步,新型 控制器时常出现,因此,新的产品出现在市场上与 对映的驱动程式支援的上市可 能会有些时间上的出入。 在 Hyundai 笔记型电脑上使用的 Motorola 6AHC05GA 控制器并不被支援。 在 HP Omnibook 600 上的 PCMCIA 控制器亦不被支援。 1.5 哪些PCMCIA卡被支援呢? 目前的版本有网路卡、 数据卡、串列埠卡、SCSI 介面卡、ATA/IDE 硬碟卡 以及 支援 SRAM 和快闪记忆体卡的记忆卡驱动程式,SUPPORTED.CARDS 档案内包含了 各版本中有支援的 PC 卡名称(至少在一个系统上可使用皆列 入)。 但不在列表内的 PC 卡也有可能可以使用。基本上,所有的数据卡都可以使 用。 有些未列入的网路卡若他们是被支援的卡之 OEM 版本亦可使用。其他 IO 卡(如 缓冲记忆体卡、音效卡等等)大部份目前都不支援, 除非有人为 它们写驱动程 式。 1.6 什麽时候我的新卡片才会被支援呢? 遗撼的是,这些厂商并没有付给我任何酬劳来写设备驱动程式。因此,如果 您想 让您的卡被支援,您至少要做点事。 理想上,我较喜欢像做 Linux 核 心那样的 模式亦即我主要负责 PCMCIA 的核心程式码,其他的朋友则贡献在 特殊的 PC 卡 的驱动程式上。在 SUPPORTED.CARDS 档案中提到有些卡 所用驱动程式正在进步 中。 在我能力所及的地方我会尽量帮忙, 不过透过 Email 来做除错核心设备驱 动程式并不是很有效率的。 制造商若有兴趣让自己公司的产品被 Linux 所支援可与我连络做进一步的 洽询 与安排。 1.7 邮寄名册及其他资讯来源 我曾经维护一个 Linux PCMCIA 的使用者邮寄名册。而现在我已将我的网页 调整 成″超媒体新闻″网站,里头有一系列有关 Linux PCMCIA 的资讯项目 : 有针 对不同型式的卡片之安装与设定、PCMCIA 卡之相关程式设计与除错 。这个 Linux PCMCIA 资讯网页在 http: //hyper.stanford.edu/HyperNews/get/pcmcia/home.html 上。使用者可以申请 经由电子邮件的方式来通知您较感兴趣的新讯息。我期 望这样子可以将这些超过 HOWTO (″怎麽做″ ) □围的问题讨论变为一个 实用的资讯宝库。 有个针对笔记型电脑使用 Linux 的邮寄名册叫做 ``linux-laptop'' 邮寄 名册 。 若要更进一步的资讯, 请寄一封含有 ``help'' 一字的电子邮件到 majordomo@vger.rutgers.edu。 若您要订阅这份资讯,请寄一封含有 ``subscribe linux-laptop'' 的电子邮件到上面相同的 Email 地址。这份 邮寄 名册是一份有关於 Linux PCMCIA 的不错论坛哦。 Linux Laptop 网页在 http://www.cs.utexas.edu/users/kharker/linux-laptop 上, □面有连结至特 定的笔记型电脑在安装 Linux (及 PCMCIA )时的资 讯。还有一份可寻找系统 建构资讯的资料库。 1.8 怎麽不提供 PCMCIA 的二进位码呢? 对我而言,提供二进位码会困挠我。这有点复杂,因为有些功能只能在编译 时被 选择,而且 PCMCIA 模组又那麽依赖合适的核心建构。所以,我只能提 供伴随著 合适的核心之未编译的模组。况且,当要安装到一个乾净的系统上 时是最需要未 编译的模组的。 一般来说,每个 Linux 供应商会需要在安装 过程中设定 PCMCIA 来使用它的功能。每个供应商都有自己的程序,所以由 我来供应开机及 根磁碟给他们好像有点不太适合。 PCMCIA 现在已是许多主要 Linux 供应商的一部份了, 这包含 Red Hat、 Caldera、 Slackware、Yggdrasil、Craftworks 及 Nascent Technology。 1.9 为什麽 PCMCIA 套件这麽大呢? 噢! 首先我要说的是,它真的不大。所有的驱动程式模组加起来只需约 200 K 的 磁碟空间而已。 公用程式部份加起来约 70K,放在 /etc/pcmcia □的 资料约 30K。当执行时,PCMCIA 的核心模组占用约 48K 的系统记忆体。通 常 cardmgr 精灵除了在卡片被插入或移出时外都会被移出记忆体的。 所有 套件的大小并不 会跟 DOS 的卡片服务程式执行时有多大的差别。 这与 DOS 的单点启用器相比似乎还比它们的好。 特别是有人并不会使用到 PCMCIA 的所有功能:比如说能源管理或热机交换功能。 因为单点启用器大 部份 只需支援一种或少许的卡片以及支援少许的 PCMCIA 控制器,所以可以 做得小一 些。如果有人要写个天才型的数据机开启器,到後头可能会把许多 卡片服务的功 能都加进去才能应付不同的卡片厂商以及控制器了。 2. 编译与安装 2.1 准备工作与核心设定 在开始前, 您应该想想是否需要自己来编译 PCMCIA 套件。 因为大部份的 Linux 供应商版本已含有已编译过的 PCMCIA 驱动程式套件。一般上来说, 如果 您需要最新的驱动程式或您更动的 Linux 供应商版本内的核心和您原 本的 PCMCIA 驱动程式无法相容时才会需要自己动手做。 虽然编译 PCMCIA 套件在技 术上并不难,但还是需要您对 Linux 已有一定的熟悉的。 下列的东西必须在您开始安装PCMCIA程式之前先行安装妥当: * 一个版本 2.0.* 或 2.1.* 系列的核心原始程式树。 * 一套合适的模组公用程式。 * (选择性 ) ``XForms'' X11 使用者界面工具组 目前的驱动程式套件事实上可在核心版本 1.2.8 开始的核心版本上正常工 作。 而用旧一点的核心版本就背道而驰了些,最好不要这样。 您还需要完整的 Linux 原始程式树, 不是只有最新版的核心映像档就可用 来编 译 PCMCIA 套件的。 PCMCIA 模组含有一些对核心原始程式档案的参考 指令, 也许您会想做个不含那些不必要的驱动程式的核心, 但是安装 PCMCIA 并不需要 您这麽做。 目前稳定的的核心程式的原始档及修补档可以在 [4]ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0 或 [5]ftp://tsx-11.mit.edu/pub/linux/sources/system/v2.0 内找到。 发展中的 核心程式可在 v2.1 目录内找到,目前的模组公用 程式也可在同样的地方找到。 在核心 2.0 及 2.1 版所用的 Linux 原始程式树内的 Documentation/Changes 档案中描述了核心程式所需要的各种类别的系统元件。您可检视它并核对您 的系 统是否为最新版本,尤其当您已更新了核心程式。 如果您使用 2.1 版 核心,请 确认您用了正确的程式库和模组工具的组合。 当您建构核心时,如果您计画要用 PCMCIA 网路卡,您应该打开网路支援并 关上 正常的 Linux 网路卡驱动程式, 这包括口袋型可携式型介面卡。 PCMCIA 网路 卡驱动程式都设计成可载入式模组, 所以将驱动程式编译到核 心程式内只会浪 费空间而已。 如果您要使用 SLIP、PPP 或 PLIP,可在建立核心时将这些功能打开,或者 使用 这些功能的可载入模组版本。 但是在核心 1.2.X 版本下建构作业时有 小缺撼, 就是不能为载入式模组设定建构选项 (例如 SLIP 压缩 ),所以如 果您需要这个 功能,只好将 SLIP 连结到核心程心□了。 为了要使用 PCMCIA 拓□链网路卡, 您的核心程式应该将 ``Token Ring driver support'' (CONFIG_TR) 这项目开启,并将 CONFIG_IBMTR 这项关闭。 如果您要使用 PCMCIA IDE 卡,针对核心 1.3.72 至 2.1.7 版, 核心建构 时应 该要将 CONFIG_BLK_DEV_IDE_PCMCIA 功能打开,旧版的核心并不 支援可移式 IDE 设备,而较新的核心就不需这麽特别设定了。 如果您要使用 PCMCIA SCSI 卡, 在建构核心时应将 CONFIG_SCSI 功 能打开。 并且,将您要使用的 SCSI 设备项目之驱动程式打开 (SCSI 磁碟 机、磁带机、 唯读光碟机等等 )。所有给特定介面卡的低层次驱动程式应该 要关掉,因为它们 只会占用空间而已。 如果您想把给 PCMCIA 设备使用的驱动程式模组化,请修改 /etc/pcmcia/config 来指定哪些模组在哪种卡片使用下需被载入。例如,如果串 列埠驱动程式被 模组化了,那麽串列埠设备的定义应该如下: device "serial_cs" class "serial" module "misc/serial", "serial_cs" 在套件□还有个 X 环境使用的卡片状态公用程式 cardinfo。 此程式 是奠定在 一个免费供应的使用者介面工具套件 XForms 程式库。通常被附在 大部份的 Linux 供应商的产品内。 如果您想建造 cardinfo,您得在 建构 PCMCIA 套件前 安装好 XForms 和所有的一般 X 程式头档及程式库。 2.2 安装 以下是安装过程的简要步骤: * 解开 pcmcia-cs-3.0.?.tar.gz 到 /usr/src目录内 * 在新的 pcmcia-cs-3.0.? 目录内执行 ``make config'' * 执行 ``make all'',再执行 ``make install''。 * 为您的系统在 /etc/pcmcia 内自订 PCMCIA 启动手稿和选择档案 。 如果您想安装其他非主要 PCMCIA 分享套件程式所包含的客户端驱动程式, 将它 们解开到 PCMCIA 原始程式树的顶层,再依正常的建造指令,即可将这 增加的驱 动程式编译及安装起来。 执行 ``make config'' 会列出一些建构选项,请检查您的系统并比对 这些选项 是否符合安装 PCMCIA 支援的条件。请小心检查此命令的输出讯息 ,尤其哪边有 问题时。 如果您想编译个 PCMCIA 套件给其他机器使用,在建构手稿执行到出现指定 目标 目录时请指定个替代的目录,它应该是个绝对路径,所有的 PCMCIA 工 具将被安 装在这目录的相对位置□。然後,您就可以 tar 这个目录起 来,再把它拷贝到 其他机器上,解压缩到相对目录上後再安装它们到适当的 地方。 如果您想编译个 PCMCIA 套件给其他机器使用,在建构手稿执行到要求您指 定目 标目录时请指定个替代的目录, 它应该是个绝对路径,所有的 PCMCIA 工具将被 安装在这目录的相对位置□。然後,您就可以 tar 这个目录 起来,再把它拷贝 到其他机器上,解压缩到相对目录上後再安装它们到适当 的地方。 如果您在其他电脑上做交叉编译,您可以指定替代档名给编译器及连结器。 这对 混合著 a.out 及 ELF 系统时很有助益。此手稿会要求输入做为除错时 使用的编 译旗标。 某些支援公用程式 (cardctl 和 cardinfo) 可以在安全或可信 的形式下编译。 在安全形式下可以防止非 root 的使用者更改卡片的建构。 可信的形式下允许一 般使用者执行暂停、继续、重置卡片的命令及改变目前 的建构。建构手稿会问你 要将公用程式编译成安全或可信的形式,内定为安 全形式。 有些核心程式建构选项会影响到 PCMCIA 的工具。建构手稿(一般状况下) 会在 执行核心程式时推断出这些影响。另外,如果您是编译来安装到其他机 器上的, 它能从核心原始程式树□读到这些建构,或是互动地设定每个选项 。 执行 ``make all'' 後,接著 ``make install'' 将建立并安装 核心程式模组及 公用程式。 核心模组会被安装在 /lib/modules/< 版本 >/pcmcia 内。 cardmgr 和 cardctl 两程式被安 装在 /sbin 目录内。 如果 cardinfo 有被建 立的话,它会 被安装在 /usr/bin/X11 □。 建构档会被安装在 /etc/pcmcia 目录内。如果您安装在一个旧版 本之上,您的 旧版建构手稿会被备份起来不会被盖掉,被保存下来的档案名 称会被加个 *.~1~、*.~2~ 之类的档名。 如果您不知道您的 PCMCIA 控制晶片是什麽厂牌的, 您可以使用 cardmgr/ 目录 下的 probe 公用程式来探测它。目前最主要 的晶片有:Databook TCIC-2 晶片 及 Intel i82365SL 相容晶片。 在少数情况下,probe 命令将无法自动地判断您的控制器之类别。 如 果您有个 Halikan NBD 486 系统, 它有个放在不同地方的 TCIC-2 控制器 : 此时您就需 要修改 rc.pcmcia 来载入 tcic 模组, 并且将 PCIC_OPTS 参数设定成 ``tcic_base=0x02c0''。 有些使用 Cirrus 控制器的系统, 包括 NEC Versa M 系统的 BIOS 会在系 统启 动时将控制器置於一个特别的悬置状态下。在这类系统上,probe 命令并无法找 到任何已知的 PCMCIA 控制器。 如果发生这种事, 请修改 rc.pcmcia 将 PCIC 设为 i82365, PCIC_OPTS 为 ``wakeup=1''。 2.3 安装完後(使用BSD 启动手稿的系统) 有些 Linux 供应商,包括 Slackware,使用 BSD 的安排方式做为系统启动 手稿 的方排。 如果有 /etc/rc.d/rc.M 这个档的系统就属这类型 的。安装在 /etc/rc.d 内的 rc.pcmcia 手稿会控制启动和 关闭 PCMCIA 系统。 在 ``make install'' 时会用 probe 命令 来决定您的控制器种类并适当修改 rc.pcmcia 的 内容。您可在系统启 动档 /etc/rc.d/rc.M 内加上一行如下面的指令来执行 PCMCIA 启动手稿。 /etc/rc.d/rc.pcmcia start 将这行插排在哪行前面都可以,只要 PCMCIA 驱动程式在 syslogd 後 启动即可 。 2.4 安装完後(使用System V 启动手稿的系统) 2.5 安装完後(使用 System V 起始手稿的系统) Red Hat、 Caldera 及 Debian 等供应商的 Linux 使用 System V 型的安排系统 启动 档案。 如果有个 /etc/init.d 或 /etc/rc.d/init.d 目录的系统就是这类 型。 rc.pcmcia 手稿会被安装到 /etc/rc.d/init.d/pcmcia 或是 /etc/init.d/pcmcia 下。它会自动启动 PCMCIA 功能,不必去修改任何的启动手 稿了。 如果 /etc/sysconfig 目录在系统内, 那麽有另一个建构档 /etc/sysconfig/pcmcia 会被建立起来做为启动选项。 如果您需 要更改任何的 模组选项 (如 PCIC= 或 PCIC_OPTS= 设定 ), 只 需编辑这个建构档而不必修改 真正的 PCMCIA 启动手稿。此档案也不会被往 後的安装而覆盖掉。 有些以前的版本使用 /etc/sysconfig/pcmcia-scripts 目录而不 是现在的 /etc/pcmcia 目录。现在所有的系统的版本都已或将改 用 /etc/pcmcia 目录了 ,。 2.6 插槽驱动程式选项 有些 PCMCIA 控制器拥有其他的功能可能会也可能不会被特别的系统所采用 。而 插槽驱动程式也没有办法侦测到是否这些功能被采用与否。请检查您的 插槽驱动 程式的 man 说明页看看您的控制器有哪些其他的功能。 低阶的插槽驱动程式 tcic 及 i82365 有许多汇流排分时参数特 别是在采用高速 处理器的系统上时需做些修改。分时发生问题的症状像卡片 辨认问题、在重负载 下的闭锁、错误比率高,或是造成设备性能变差。详情 请参阅相关的 man 页会 有更多的细节,在此简述如下: * Cirrus 控制器有许多可建构的分时参数。 最重要的应该是 cmd_time 旗标 , 它用来决定 PCMCIA 汇流排周期的长度。 速度快的 486 系统(如 DX4-100 )下将它从 6 (内定值 ) 加大成为 12 或 16 时可看到它效果。 * Cirrus PD6729 PCI 控制器有 fast_pci 旗标,如果 PCI 汇流排的速 度比 25 MHz 快时应该设定它。 * Vadem VG-468 控制器及 Databook TCIC-2 控制器内的 async_clock 旗标必 须更改为与 PCMCIA 汇流排和主汇流排相对的周期速度。更改这个旗 标会使 某些操作上增加等待的时间。然而,我好像还没听说有哪个笔记型电 脑需要 这麽做的。 * pcmcia_core 模组有个 cis_speed 参数, 它是用来更改取存卡 片的卡片资 讯结构 Card Information Structure (CIS) 之记忆体速度。有 些速度快的 汇流排时序的系统上,增加这个参数(例如,减慢卡片的存取) 可以解决卡 片辨识的问题。 * 这□我们并非讨论分时的议题,但如果您的系统上有一个以上的 ISA-to-PCMCIA 控制器或在扩充坞上有其他的插槽时,i82365 模组应 该和 参数设为 1 的 extra_sockets 一起被载入, 但对於 PCI-to-PCMCIA 或 PCI-to-CardBus 桥接器者就不必这麽做。 所有的这些选项应修改 /etc/rc.d/rc.pcmcia来建构,例如: # Should be either i82365 or tcic PCIC=i82365 # Put socket driver timing parameters here PCIC_OPTS="cmd_time=12" # Put pcmcia_core options here CORE_OPTS="cis_speed=500" 这□有一些特殊系统的分时设定: * 在 ARM Pentium-90 或 Midwest Micro Soundbook Plus 上, 使用 ``freq_bypass=1 cmd_time=8''。 * 在 Midwest Micro Soundbook Elite,使用 ``cmd_time=12'' 。 * 在 Gateway Liberty 上,试试 ``cmd_time=16''。 2.7 系统资源设定 卡片服务系统应该自动地去避免分配到已被其他标准设备使用了的 IO 埠和插断 。它也会试著侦测本身与不知名设备间的冲突,只不过还不是很完 全可靠。 如 果遇到这种情形, 您需要将 /etc/pcmcia/config.opts 内的资源给排除掉。 以下是某些特定的笔记型电脑之资源设定: * 在 AMS SoundPro, 排除 irq 10. * 在有些 AMS TravelPro 5300 models, use memory 0xc8000-0xcffff. * 在 BMX 486DX2-66, 排除 irq 5, irq 9. * 在 Chicony NB5, use memory 0xda000-0xdffff. * 在 Compaq Presario 1020, 排除 port 0x2f8-0x2ff, irq 3, irq 5. * 在 HP Omnibook 4000C, 排除 port 0x300-0x30f. * 在 Micron Millenia Transport, 排除 irq 5, irq 9. * 在 NEC Versa M, 排除 irq 9, port 0x2e0-2ff. * 在 NEC Versa P/75, 排除 irq 5, irq 9. * 在 NEC Versa S, 排除 irq 9, irq 12. * 在 NEC Versa 6000 系列, 排除 port 0x300-0x33f, irq 9, irq 10. * 在 ProStar 9200, Altima Virage, 及 Acquiline Hurricane DX4-100, 排 除 irq 5, port 0x330-0x35f. 可以使用 memory 0xd8000-0xdffff. * 在 Siemens Nixdorf SIMATIC PG 720C, 使用memory 0xc0000-0xcffff, port 0x300-0x3bf. * 在 TI TravelMate 5000,使用 memory 0xd4000-0xdffff. * 在 Toshiba T4900 CT, 排除 irq 5, port 0x2e0-0x2e8, port 0x330-0x338. * 在 Twinhead 5100, HP 4000, Sharp PC-8700 和 PC-8900, 排除 irq 9 ( 音效 ), irq 12. * 在 MPC 800 系列,排除 irq 5, port 0x300-0x30f 是给 CD-ROM 用的。 3. 解决安装与建构的问题 在本章节□会指出一些常见的 PCMCIA 子系统的失败模式。请您试著在 这些例子 中找出您所遇到的问题之症状。本章只描述”一般的错误”问题, 因此并不针对 特定的卡片或驱动程式。 想要除错在我们试著经由 PCMCIA 装置来安装 Linux 时遇到的 PCMCIA 驱 动程 式问题几近乎不可能。甚至您能从症状中知道是哪方面的问题,想要修 改安装磁 片又很难,尤其是无法在 Linux 系统下存取时。 要自订安装磁片 完全要仰赖 Linux 供应者的的选择了,这也不在本文件的□围内。 但一般 来说, 最佳的步 骤是先使用其他的方法来安装好 Linux, 然後拿到最新的 PCMCIA 驱动程式後, 再来除错那些仍存在的问题。 3.1 基本 PCMCIA 核心模组并没载入 症状: * ”核心版本不符合”之错误讯息在 PCMCIA 启动手稿执行时出现。 * 在启动後, lsmod 并没秀出任何的 PCMCIA 模组。 * cardmgr 执行报告 ``no pcmcia driver in /proc/devices'' 在系统日志中 。 核心模组中包括它的版本资讯会在模组被载入时与现在的核心相核对。检查 的方 式视 CONFIG_MODVERSIONS 这项核心选项来看。 如果这项目是否 定的, 核心版 本号码就会被编译到每一个模组内,而 insmod 会检查 这项是否与执行中的核心 是相符合的。 如果 CONFIG_MODVERSIONS 是 yes,核心所提报的每个符号会被做 成一份检查总览 (Checksum)。这些程式 码都会被与相对应的程式码相比对後编 译成模组。这麽做旨在让模组们减少 版本依赖度, 因为检查总览只会在核心介 面更动时才会跟著变动, 且对於 小小的核心更新升级几乎维持与原来相同。在 实务上,检查总览已变成更加 的严格,因为有许多的核心介面都依赖是在编译时 期时核心选项的设定。而 且,检查总览己变成一个判断相容度的极端悲观的工具 了。 有些 PCMCIA 模组需要核心服务程式,但这些服务程式可能存在或不存在, 这完 全要看核心的建构。 例如,SCSI 控制卡驱动程式就需要核心已被建构 支援了 SCSI 了。网路驱动程式就需要支援网路的核心。如果核心缺少了一 需要的功能 ,insmod 可能会报告出有未定义的符号而不去载入该模组 。 这样继续的结果是,核心模组紧密地与核心版本以及许多的核心建构选项的 设定 相结合。一般来说,结核心 2.0.31 版的一组被编译好的模组并无法被 其他的核 心 2.0.31 版本上使用。除非有特别地注意到将两个建构成相同的 设定。这个问 题,就让那些供应已编译好的核心模组的工作变得有点奇怪了 。 您有几种选项: * 如果您拥有的是 Linux 供应版内之未经编译的驱动程式, 请检查您所使用 的核心是和该供应版一起的未经编译的核心。如果您想使用未经编译的模组 ,一般来说你得使用与它想伴的核心。 * 如果你重新建构或升级你的核心了,你可能需要编译和安装新的 PCMCIA 套 件。 如果你已经有安装了核心原始树的话,做这件事就得容易了。 请参考 PCMCIA-HOWTO 有更详细的指示。 * 在某些情形下,与其他系统元件的不相容可能会导致无法正确载入核心模组 元件。 如果您自己升级核心, 请注意详列模组原始档案树内之 Documentation/Changes 档案内针对模组公用程式及二进位公具 程式中列明 的最小需求 (``minimal requirements'')。 3.2 插断扫描失败 症状: * 当 PCMCIA 驱动程式被载入时系统却动也不动,就算并没有卡片插著时也一 样。 * 系统日志在系统当机锁死前显示成功地侦测到 PCMCIA 控制器,但还没显示 插断侦测的结果时。 在辨视 PCMCIA 控制器之後,插槽驱动程式会侦测空著的插断号码。这个动 作会 为每个显然是空著的插断做程式化, 然後产生一个 `` 软的 '' 插断, 来看看是 否这个插断可以被正确地被侦测到。有些时候,侦测到一些特殊的 插断时会影响 到其他的系统设备。 这麽侦测的理由是,我们要辨视出真正空著可用的插断。 (例如,那些不是 被任 何其他 Linux 设备驱动程式所预留著的, 也并非实体上已连接著 PCMCIA 控制 器的,或是已连接著其他的设备但并没有驱动程式的。) 有二种继续的方法: * 插断探测工作可以使用插槽驱动程式内的 irq_list 参数设定来限制 只对某 些插槽实施而已。例如 ``irq_list=5, 9, 10'' 会限制只对这 三个插断做 扫描探测而已。所有的 PCMCIA 设备会被限制只能使用这几个插 断而已 (假 如它们略过了侦测动作 )。你可能需要□试几次失败并再接再厉 地才能找到 哪些插断可以被安全地侦测使用的。 * 插断探测工作可以被完全地关闭掉,在载入插槽驱动程式时使用了 ``do_scan=0'' 选项。这麽做,会让原定的插断清单被使用著,它们已经避 免使用那些已经 被其他设备所占用了的插断。 另一个方法,我们可以使用在 PCMCIA 启动手稿中指定 PCIC_OPTS 的 设定,例 如: PCIC_OPTS="irq_list=5,9,10" 3.3 记忆体侦测失败 症状: * 主驱动程式在卡片并不存著时被正确地载入,而且在系统日志内也没有任何 错误。 * 系统当机动不了和/或任何卡片插入但在任何哔声响起前就重新开机。 或是: * 任何卡片插入时会产生一个高音的哔声,接著低沈的哔声。 * 任何卡片都被误认 ``anonymous memory cards''。 * 系统日志报告说有很多的记忆体□围已被排除在外了。 主模组程式在第一次插入卡片使做一定记忆体扫描。这个动作有潜在可能地 干涉 到其他记忆体映射的设备。另外,pre-3.0.0 版本前的驱动程式套件还 会做比现 今的驱动程式版本更进一步的扫描。记忆体窗是被定义在 /etc/pcmcia/config.opts 内。 预设的窗口很大,所以它可能会 帮助来限制扫 描到较窄的□围。比较合理的□围可试看看包含进以下的位址 :0xd0000-0xdffff, 0xc0000-0xcffff, 0xc8000-0xcffff, 或 0xd8000-0xdffff。 如果你有 DOS 或 Windows 版的 PCMCIA 驱动程式, 你就可以 you may be able to deduce what memory region those drivers use. 请记得 DOS 的 记忆 体位址通常都使用 `` 段 '' 位址形式,也就是它会将尾巴的十六位元 数字省略 掉(所以 0xd0000 的绝对位址就是 0xd000 )。 记得在改 /etc/pcmcia/config.opts 时要确认这项。 3.4 错误地侦测卡片的插入与抽出 症状: * 在开机使卡片有插著并被侦测到且正确地被建构了。 * 驱动程式不会反应出卡版被插入或移出,或是记录在系统日志、或时哔声响 。 一般来说,卡槽驱动程式 (i82365 或 tcic) 会自动地侦测并选 择一个适合的插 断来传送卡片状态的更动。 某些 Intel 相容控制器的自动 插断侦测不能工作。 包含 Cirrus 晶片和装在 IBM ThinkPads 上的晶片。 如果在侦测时设备无法起 动,它的插断也会是□置的。这种状态下,卡槽驱 动程式也许会挑到一个已被其 他装置使用中的插断来使用。 在 i82365 和 tcic 的驱动程式□的 irq_list 选项可以 用来限制哪些插断可以 被测试的。这个插断列表可被限制成只被 PCMCIA 卡 所使用或用来监控卡片状态 的改变。 另外 cs_irq 选项可明白地设定 哪个插断要被用来监控卡片状态的改 变的。 如果您无法找到可正常工作的插断号码,还有一个票选状态模式可用:不论 是 i82365 或 tcic 都接受 poll_interval=100 这选项, 用来票选卡片的每秒的改 变状态。如果您的系统已短缺可被 PCMCIA 卡使用 的插断时这个选项也可以被使 用。特别是在系统内有一种以上的 PCMCIA 控 制器时就必须注意这点了。 所有的这些选项必须在 PCIC_OPTS= 这行来设定, 看您的系统是设在 /etc/rc.d/rc.pcmcia □或是 /etc/sysconfig/pcmcia 。 3.5 两张卡之间的资源相冲突 Symptoms: * 两张卡片在各自独自使用时可以工作, * 但当两张卡一起被插著时,却只有一个可以正常工作。 通常这就表示已经和某个 Linux 不知道的系统设备相冲突了。PCMCIA 设备 是被 动态建构的,所以,例如,插断是在被需要时被分配的,而不是特别被 指定到特 别的卡片或是插槽的。现在有一个可用资源的清单,卡片会在他们 被建构时依序 地被指派给资源的。在这种状况下,最後被建构的卡片会被指 派到一个并非是空 □著的资源上了。 您可检查系统日志有哪些资源被非正在工作的卡片所占用著。在 /etc/pcmcia/config.opts □把这些排除在外, 再重新启动 cardmgr 精灵来再 载入资源资料库。 3.6 设备建构并没有完成 症状: * 当一个卡片被插入时,确实可听到一个高音的哔声响。 * 接下来的卡片不管是插入或移出都不被理睬。 这表示卡片已被成功地辨视了。但是 cardmgr 因某些原因已无法完成 建构程序 。最有可能的原因是在卡片设定手稿的某一步骤被困住了。当一个 网路卡被插入 时并没有接上一个正活动中的网路上时,网路手稿被困住了, 这就是最好的例子 。 要找出问题出在哪□,你可以手动执行一个设定手稿来看看它是被困在哪儿 的。 这个手稿就放在 /etc/pcmcia 目录内。他们会使用二个参数 :设备名称及动件 。 cardmgr 精会把记录建构的命令记录在系统日志 内。 例如, 在系统日志中 显示出 `./network 命令开始了 eth0'' 是被 cardmgr 最後一个执行的命令,以 下的命令会追踪这个手稿: cd /etc/pcmcia sh -x ./network start eth0 4. 使用方法以及特色 4.1 用来建构以及监控 PCMCIA 设备的工具 如果所有的模组都被正确地载入了,在没有卡片被插入的状态下, lsmod 命令的 输出会看起来像以列的样子。 Module Size Used by ds 5640 2 i82365 15452 2 pcmcia_core 30012 3 [ds i82365] 系统日志也应该包含插槽驱动程式对於哪些主控制器被发现了、有几个插槽 被侦 测到了的输出。 cardmgr建构精灵 cardmgr 精灵负责监控 PCMCIA 插槽,有需要时载入 其他的驱动程式,并且执行 使用者阶层的手稿来反应卡片的插入与移出。它 会把它的动作记录在系统日志内 并用哔声来回应卡片状态的改变。哔声的音 调表示建构步骤是成功还是失败。两 个高音声响表示步片已被成功地辨视与 建构了。一高音一低音声响表示卡片被辨 视,但因某些原因无法被建构。一 低音哔声表示卡片无法被辨视。 Cardmgr 会把每一个插槽的设备资讯记录在 /var/run/stab □。以下是 /var/run/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 在这几行所描述的设备中,第一个栏位表示插槽、第二为设备类别、第三为 驱动 程式名称、第四被用来指定在同一驱动程式下使用的每个设备取号码、 第五个是 设备名称、最後两个栏位是这个设备的主要及次要号码。(如果可 找到的话) cardmgr 精灵依据被存在 /etc/pcmcia/config 内的已知之 卡片资料库来建构这 些卡片。这个档案描述了许多个别的驱动程式,以及如 何辨视许多的卡片,还有 哪个驱动程式属於哪个卡片的。这个档案的格式在 pcmcia(5) 的 man 页□有详 细的资料。 cardctl 及 cardinfo 公用程式 cardctl 命令可以用来检查插槽的状态, 或看它们是如何被建构的。 它也可以 被用来警示一个卡片的建构状态。 这儿有个 ``cardctl config'' 命令的输出例 子: Socket 0: 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 suspend'' 和 ``cardctl resume'' 两个命令可以用 来在不需卸下它 的相关驱动程式的状况下关闭卡片。``cardctl reset'' 命令会重新设定及建构 卡片。 ``cardctl insert'' 和 ``cardctl eject'' 摸拟当一个实体的卡片插入 或抽出时所做的动作 ,这包含载入或卸下驱动程式以及建构或关闭设备。 如果您正执行 X, cardinfo 公用程式会产生一个图 示来显示所有的 PCMCIA 插 槽的现况, 内容和执行 ``cardctl config'' 类似。它还提供其他 cardctl 功 能的图形化功能。 插入与抽出卡片 在理论上,你可以在任何时间插入或移出 PCMCIA 卡片。然而,把正在被其 他程 式使用中的卡片移出来并不是个好主意。在核心 1.1.77 版以前的系统 常会在串 列/数据机卡片被移出时造成当机,但现在已有修正方法了。 卡片服务程式与进阶能源管理 卡片服务程式可以编译成支援 APM ( 进阶能源管理) , 如果你已安装了这个套 件到你的系统内的话。 APM 在核心 1.3.46 (含)以後就被整合了。 现在这套 件被 Rick Faith (faith@cs.unc.edu) 所维护, APM 工具可以由 [6]ftp://ftp.cs.unc.edu/pub/users/faith/linux 拿到。如果你的系 统被侦测 出有个相容的版本在的话, PCMCIA 模组会被自动地建构成支援 APMM 功能。 如果没有藉著 APM, 你可以在悬置你的笔记电脑前执行 ``cardctl suspend'', 以及在回覆後执行 ``cardctl resume'',才能适当地关 上或重启你的 PCMCIA 卡。 这对正在使用中的数据机并不适用, 田因序 列驱动程式并无法储存与回应 数据机的运作参数。 APM 在有些系统上似乎有点不太稳定。 如果你遇到 APM 和 PCMCIA 共用时 有任 何问题,请您在提出程式小虫报告前先试著把问题简化。 有些驱动程式, 比如说 PCMCIA SCSI 驱动程式,无法从悬置/重新动作周 期下 回覆过来。 在使用 PCMCIA SCSI 卡时, 在悬置系统前先执行 ``cardctl eject''。 关闭 PCMCIA 系统 要卸下整个的 PCMCIA 套件, invoke rc.pcmcia with: /etc/rc.d/rc.pcmcia stop 这个手稿会花几秒钟来执行,给全部的客户自订驱动程式来完美地关闭 。如果有 个 PCMCIA 设备正被使用中,这样关可能不会很完整地关闭,有些 核心模组可能 不会被卸下。 要防止发生这种状况, 请在执行 rc.pcmcia 之前使用 ``cardctl eject'' 来关闭所有的插槽。 cardctl 命令的离开状态会显示如果有 任何的插槽不能被关闭的。 4.2 PCMCIA建构手稿的概要 每一个 PCMCIA 设备都会有个相对应的 `` 类别 '' 来描述它应该如何被建 构与 管理的。这些类别与设备驱动程式都被组织在 /etc/pcmcia/config 内。目前共 有五种输出输入设备的类别 (网 路、 SCSI、 cdrom、硬碟以及串列 ) 以及二种 记忆体设备类别 (记忆体与 FTL)。在每一个类别中,都有二个手稿放在 /etc/pcmcia/config 内:一个主要建构手稿 (例如, /etc/pcmcia/scsi 是 SCSI 设 备的 ),以及一个选项手稿 (例如, /etc/pcmcia/scsi.opts)。 主手 稿在卡片被插入时会被启用来建构该设备,当卡片被抽出时关掉该设备 。对於支 援多种设备的卡片,针对各别不同的设备的手稿都会被启用。 这 config 手稿会从 /var/run/stab □解出一些有关於设备上的 资料开始。 每 一个手稿会构□一个 `` 设备位址 '',它是独一无二的位址 用来描述该设备在 ADDRESS shell 变数内被要求被建构的方式。它会 被传递到 *.opts 手稿上, 该手稿再回应有关於在这位址上的设备应 该要怎样地建构才可以的资讯。 有些 设备, 它的设备位址就是插槽号码。 还有其他的设备,它会包含另外的有用资 讯可以用来决定如何来建构该设备 。例如,网路设备会传递他们的硬碟乙太网路 位址做为设备位址的一部份, 来让 network.opts 手稿能够使用这项资讯来从许 多不同的建构中做 正确的选择。 所有的设备位址的首要部份是目前的 PCMCIA ``scheme''。这个参数是被用 在只 有一个外部使用者指定变数时用来对设备建构之多种设定的。对於它的 应用, 例如我们可以有个 ``home'' scheme 以及一个 ``work'' scheme, 它们包括了 不同的网路建构参数的组合。 目前的 scheme 可以使用 ``cardctl scheme'' 命 令来做选择。如果没有 scheme 被指定的话就 以内定值来设定。 一般原则上,当要建构 Linux 在笔记型电脑上时,PCMCIA 的设备只能被经 由 PCMCIA 设备手稿来建构。 请不以试著以建构固定设备的方式来建构 PCMCIA 设 备。然而,有些 Linux 供应版商提供已接在他们自已的设备建构 工具上的 PCMCIA 套件。在这种情况下,以下的几个主题可能无法使用,而 供应版商应该 会有他们自己的这类文件。 4.3 PCMCIA 网路卡 Linux 的乙太型网路卡介面通常被称做 eth0、eth1 等等。环形 卡亦同样地被看 待。 然而它们被称做 tr0、 tr1 等等。 ifconfig 命令是被用来观看及修改网 路介面状态的。Linux 的另一特 点是网路介面并不会像其他设备一样地被看成是 一个在 /dev □ 头的档案。所以如果您在 /dev 内找不到它们时请不要觉得惊讶 。 当一个 PCMCIA 乙太网路卡被侦测到时,它会被指定为第一个可用的介面卡 名字 , 通常为 eth0。 Cardmgr 命令会执行 /etc/pcmcia/network 手稿来建构它的 介面。 请勿将您的 PCMCIA 乙太网路卡建构在 /etc/rc.d/rc.inet1 内 ,因为当这个手 稿被执行时也许卡片并不在插槽□。 在 rc.inet1 内 除了回归的项目之外, 其 它的命令列请将他们注解掉。 而另外修改 /etc/pcmcia/network.opts 来配合您 的本地网路设定。 network 和 network.opts 手稿只有在您的乙太网路卡存在时 才 会被执行。 如果您的系统有自动网路建构程式, 它也许是也许不是 PCMCIA-aware。 请从您的 Linux 供应版本的文件中查看看是否 PCMCIA 网 路设 备是否需要使用自动化工具来建构或只需编辑 network.opts 即 可。 传到 network.opts 的设备位址中包含了四个以逗号来分开的栏位: scheme、插 槽号码、设备提议及卡片硬体的乙太网路位址。设备提议是用来 给有许多网路介 面的卡片取号码之用,通常为 0。如果您有许多不同使用目 地的卡片时,另一按 照插槽位置而建构的选项应该被设定,如同在: case "$ADDRESS" in *,0,*,*) # definitions for network card in socket 0 ;; *,1,*,*) # definitions for network card in socket 1 ;; esac 或是,它们可能被以自己的硬体位址被建构,如下: case "$ADDRESS" in *,*,*,00:80:C8:76:00:B1) # definitions for a D-Link card ;; *,*,*,08:00:5A:44:80:01) # definitions for an IBM card esac 网路设备参数 以下的参数可在 network.opts内被使用: IF_PORT 指定乙太网路收发器类型, 这是针对那些无法自动侦测的卡使用。 请看 ``man ifport'' 内有收发器名称。 BOOTP 布林 (y/n) 设定: 表示是否主机的 IP 位址和分路资讯是否可以经由 BOOTP 协定来获取。 IPADDR 指定IP位址。 NETMASK, BROADCAST, NETWORK 基本网路参数: 请参阅 networking HOWTO GATEWAY 给主机的子网路使用的通讯闸 IP 位址。只要是在这个子网路以外的封包 都 会被转到这个闸道。 DOMAIN 给主机的网路 domain name,被用来建立 /etc/resolv.conf。 DNS_1, DNS_2, DNS_3 主机名称或是 IP 位址给这个介面的 nameservers, 被加到 /etc/resolv.conf内。 MOUNTS A 给这个介面使用来做 NFS 挂入点的列表。 IPX_FRAME, IPX_NETNUM 对 IPX 网路: frame type 及网路号码将被传输到 ipx_interface 命令 上。 例如: case "$ADDRESS" in *,*,*,*) IF_PORT="10base2" BOOTP="n" IPADDR="10.0.0.1" NETMASK="255.255.255.0" NETWORK="10.0.0.0" BROADCAST="10.0.0.255" GATEWAY="10.0.0.1" DOMAIN="domain.org" DNS_1="dns1.domain.org" ;; esac 若想自动挂上或卸下网路档案系统,首先将档案系统加到 /etc/fstab 内,在挂 上选项上加上 noauto。 在 network.opts 内 使用 MOUNTS 变数列明档案系统的 挂入点。 这特别是在使用 cardctl 或 cardinfo 命令来关闭当网路档案系统是 用这个方法 建构而挂上的网路卡时。如果在没预警下网路卡被移出时,是无法完 全地卸 下网路档案系统的。 除了一般的网路建构参数之外,network.opts 手稿可用来在介面已经 被建构起 後或被关闭後做另外的动作时使用。 如果 network.opts 定 义了一个叫 start_fn 的命令层功能呼叫, 当介面被建构後它会被网 路手稿所启用,而介面 名称将会被传送到这个功能函数做为第一个参数(也 只有这个)。相同地,如果 stop_fn 被定义了,那麽它会在关闭一个 介面前被启用。 收发器类型可以用 IF_PORT 来设定。它可以是 PCMCIA 之前版本的数 值表示或 是识别收发器的关键字。所有的网路驱动程式尽可能将它设定为自 动侦测(如果 可能的话)介面或是 10baseT 的。 ifport 命令可用来 检查或设定目前的收发 器类型,例如: # ifport eth0 10base2 # # ifport eth0 eth0 2 (10base2) 目前的 3c589 驱动程式版本会自动侦测网路的连结, 但还无法完全发挥它 的功 能。若想以自动侦测来工作,在网路卡被建构前网路线应该是已连接著 网路卡上 的。要不然,等网路接好後,您可以下列命令迫使驱动程式检查连 结: ifconfig eth0 down up 特定卡片的评语 * 使用 IBM CCAE 和 Socket EA 卡在网路设备被建构时, 您需挑个接收器类 型 (10base2、10baseT、AUI),并确认在您的系统日志上所记录的接收器与 您所连结的相同。 * 给 SMC、Megahertz、 Ositech 及 3Com 卡片的驱动程式应该会自动侦测连 接著的网路类型 (10base2 或 10baseT) 。 当驱动程式被载入时会设 定收 发器类型来订定义卡片的 ``第一次猜想''。 * Farallon EtherWave 事实上是和 3Com 3c589 相同的, 但有个特殊的收发 器。 虽然 EtherWave 使用 10baseT 类的连接方式, 但它的收发器需要把 3c589 建构成 10base2 模式。 * 如果您使用 IBM CCAE、NE4100、 Thomas Conrad 或 Kingston 介面卡时遇 到问题, 请试著在 pcnet_cs 模组内的 mem_speed=# 选项 增加记忆体存取 时间。在标准的 config.opts 档案内有个教你如何做 的□例。请试看看速 度在 1000 ns(奈秒)以上。 * New Media 乙太网路卡在接到某些系统上时,可能需要在 pcmcia_core 模组 被载入时, 以 io_speed=# 选项来增加 IO 埠的存取时间。 在启动手稿的 CORE_OPTS 选项可以设定它。 * New Media 乙太网路卡驱动程式的多工传播支援并不完整。最新的驱动程式 版本可与多工传播核心一起使用,但会略过多工传播封包。不规则模式应该 可以工作正常了。 * 给 IBM 及 3Com token ring 卡的驱动程式在卡片尚未接上一个 ring 上时 就做初始化是会有点问题。所以请一定记得在开机前一定要把这些卡片和 网 路连接在一起。 这个驱动程式也需要空置的 IO 埠在 0xa20-0xa27 □围 内 。在有些系统上,自动 IO 埠冲突检查器会错误地判定说这个埠□围并不 是 空置的。 遇到这种情况, 我们可以把埠检查器给关闭掉。 只要在 载入 pcmcia_core 模组时设定 probe_io=0即可。 * Newer Linksys 及 D-Link 的卡片有个特殊的选择收发器方式,目前还不被 Linux 的驱动程式所能控制。 只有一个变通的方法是以 DOS 开机并使用厂 商所付的公用程式来选择收发器後,再暖开机进到 Linux □。 我现在也正 在寻找首次的测试者使用 Linux 的公用程式来做到这些功能。 * 对 WaveLAN 无线网路卡来说,Jean Tourrilhes (jt@hplb.hpl.hp.com) 写 了一篇无线的 (设备 ) wireless HOWTO 放在 [7]http: //www-uk.hpl.hp.com/people/jt/Linux/Wavelan.html 内。 诊断网路卡的问题 * 您的卡片有被辨视成乙太网路卡吗? 请查看系统日志并确认 cardmgr 已正确 地辨视了这张卡,而且已启动了一种网路驱动程式了。如果没有,您 的卡片 也可能还是可以使用,只要它与任一种被支援的卡片相容的话。只要 是这卡 片是与 NE2000 相容的卡片都可以做到。 * 卡片有妥当地被建构了吗? 如果你使用的是被支援的卡片, 而且它已被 cardmgr所辨视了,但它还是无法工作,这可能是因为它与其他的设备 发生 插断或埠的冲突了。请查明这张卡片使用了吗些资源 (从系统日志□找 ), 然後试著在 /etc/pcmcia/config.opts 内把这些给排除掉来 迫使卡片使用 其他的资源。 * 如果你的卡片似乎已妥当地建构了,但有时候还是会锁死不能动,尤其是在 高负载时,你可能需要试著改变你的插槽驱动程式的分时参数。详细资料请 看 [8]2.3 这章。 * 当你在存取网路使遇到像 ``network unreachable'' 这类的讯息, 可能是 你在 /etc/pcmcia/network.opts 有设定错误的地方。 另外,错 误地建构 的卡片通常会安静地发生问题。 * 要诊查在 /etc/pcmcia/network.opts 内的错误, 开始请先试著 以它们的 IP 位址来 ping 同一次网路的其他系统。然後试著 ping 你的闸 道,然後 其他次网路内机器。在试完这些较简单的测试後,再以机器的名字 来 Ping 。 * 请要确认你的问题真的个 PCMCIA 的问题。 你可以在 DOS 下以厂商供应 的 驱动程式来驱动看看是否可以工作,这样将有助於判断。并再次复检你对 /etc/pcmcia/network.opts 手稿内的任何修改。并确认你的缆线 、``T'' 接头、终端电阻器等等的元件都可正常工作。 4.4 PCMCIA 串列与数据机设备 Linux 的串列设备都是被经由 /dev/cua* 和 /dev/ttyS* 特殊设备档案来做取用 。 ttyS* 的设备被使用在进来的连接,例如直 接地连接终端机。cua* 的设备被 使用在往外的连接,比如说数据机。 而每一个实体串列埠都各有 ttyS 和 cua 两个设备档: 要使用 哪个适当的设备到你的应用上都由您来决定。 对於串列设备的建构,您可使用 setserial 命令来检查与修改。 当一个 PCMCIA 串列卡或数据卡被侦测到时,它会被指定成为第一个可用的 串列 设备。通常是 /dev/ttyS1 (cua1) 或 /dev/ttyS2 (cua2) ,这完成看原已内建 的串列埠数目。 ttyS* 设备会被 报告在 /var/run/stab 内。 原内定的串列设 备选项手稿 /etc/pcmcia/serial.opts 会将之连结到相对应的 cua* 设 备档案 成为 /dev/modem。这样就很便利了。 请勿使用 /etc/rc.d/rc.serial 来建构 PCMCIA 数据机。这个手 稿应该只能被 用来建构那些非可移动的设备。如果你想要设定你的数据机来 做任何特别的动作 时,请修改 /etc/pcmcia/serial.opts 这个手 稿。 另外, 也请勿使用 setserial 来改变 PCMCIA 串列设备的设备 IO 埠和插断设定。 这样做只会告诉 串列驱动程式到不对的地方寻找串列设 备,但不会改变卡片硬体方面真正被建构 的事实。串列建构手稿允许您指定 其他的 setserial 选项, 以及是否您该在 /etc/inittab 内为这个埠加一行设定。 快传送到 serial.opts 的设备位址共有三个由逗点所分开的栏位:第 一是 scheme、 第二是插槽号码以及第是 device instance。 The device instance 会为支援多串列埠的卡选用多个数据,但对於单一埠卡来说, 它 永远都是零。 如果你常使用不只一个的 PCMCIAl 数据机,你可能需要针对 各别插槽内的数据 机做不同的设定。如下: case "$ADDRESS" in *,0,*) # Options for modem in socket 0 LINK=/dev/modem0 ;; *,1,*) # Options for modem in socket 1 LINK=/dev/modem1 ;; esac 如果 PCMCIA 数据卡在 Linux 启动时即被建构好了, 那它可能已被错误地 被辨 识成为一般的内建串列埠了。这虽然无害处,但是,当 PCMCIA 驱动程 式接手来 控制数据机时, 它会被指派成不一样的设备插孔。 最好是 parse /var/run/stab 或使用 /dev/modem, 而不是期望 PCMCIA 数据机总是被指派成 相同的设备。 如果你建构你的核心来载入基本的 Linux 串列埠驱动程式成为一个模组, 你必 须编修 /etc/pcmcia/config 来指出该模组必须被载入。 编 修串列设备那列如 下: device "serial_cs" class "serial" module "misc/serial", "serial_cs" 串列装置参数 以下的参数可以茬 serial.opts内被定义: LINK 为符号连结 (symbolic link)指定个要被建立的路径 ``dialout'' 或是 /dev/cua* 设备。 SERIAL_OPTS 指定有哪些选项将被传送到 setserial 命令。 INITTAB 如果有指定的话,它将被用来在 inittab 中为该设备建立一个条目。 例如: case "$ADDRESS" in *,*,*,*) LINK="/dev/modem" SERIAL_OPTS="" INITTAB="/sbin/getty" 诊断串列设备的问题 * 您的卡被认为是个数据机吗? 请检查系统日志并确认 cardmgr 有正确 地辨 识了这张卡,并且启动了 serial_cs 驱动程式。如果没有,你可 能需要在 你的 /etc/pcmcia/config 档案中加入一条应该被适当 地辨识的条目。细节 请看章节 [9]3.6。 * 数据卡成功地被 serial_cs 所建构了吗? 再来一次, 请检查系统日志,再 看看从 serial_cs 驱动程式所出来的讯息。 如果你看到 ``register_serial() failed'', 你可能遇到了 I/O 埠与其他设备相冲突 了。 另外一个情报是, 如果这个设备被报告说是个 8250; 大部份现在的 PCMCIA 数据卡应该是被辨视成 16550A UART 类型的。如果您觉得遇上了一 个埠冲突了,请编修 /etc/pcmcia/config.opts 把被配置给数据 卡的埠□ 围给排除。 * 遇上了插断冲突吗? 如果系统日志看似很好,但数据卡就是好像不能工作, 请试试用 setserial 来把 irq 改成 0, 再看看数据机是否可以工作 了。 这样会让串列驱动程式使用一个慢一些的票选模式而不使用插断来工作 。如 果这样可以修正这个问题,那就是在你的系统中有某个其他的设备使用 了被 serial_cs 所选用的插断在工作著。你应该在 /etc/pcmcia/config.opts 中 加一行命令将这个插断给排除掉。 * 如果数据机好像只能慢慢地工作,这就很明显地是个插断冲突的问题了。 * 请确认你所遇到的问题真的是个 PCMCIA 的问题。使用原厂商的驱动程式在 DOS 下看看是否可以正常工作即可知道。另外,在你已确定你可以做简单的 连接前,请不要使用更复杂的方式来测试,比如说 SLIP 或 PPP。如果简单 的连接正常但使用 SLIP 时却不是,你的问题应该就是出在 SLIP 上,而不 是 PCMCIA。 * 如果你得到发自核心的讯息指出 serial_cs 模组无法被载入。 那就表示你 的核心并不支援串列设备。如果你已将串列驱动程式编译成一个模组了,你 必须修改 /etc/pcmcia/config 来让 serial 模组应该 在载入 serial_cs 前就被载入了。 4.5 PCMCIA SCSI卡 目前所有被支援的 PCMCIA SCSI 卡都工作的像下列的 ISA 汇流排卡的样子 : Qlogic、Adaptec AHA-152X 或是 Future Domain TMC-16x0。PCMCIA 驱 动程式 被建立成与 PCMCIA 特别程式码相连结 (如 qlogic_cs.c、 toaster_cs.c 或 fdomain_cs.c) 以及正常的 Linux SCSI 驱动 程式。 当一个新的 SCSI 主卡被侦测到时, SCSI 驱动程式会寻找连接著的设备。 请检 查系统日志你的设备被正确地侦测到了。新的 SCSI 设备会被指定为第 一个可用 的 SCSI 设备档。第一个 SCSI 硬碟是 /dev/sda,第一 个 SCSI 磁带机是 /dev/st0, 还有, 第一个 CD-ROM 会是 /dev/scd0。 在 1.3.X (含 ) 以後的核心□,PCMCIA 核心驱动程式可以从系统核心中找 出有 哪些 SCSI 设备有连接在介面卡上。它们会被列表在 /var/run/stab , 而 SCSI 构建手稿 /etc/pcmcia/scsi 也会被每一个连接著的 设备所呼叫来建构或 关闭该设备。内定的手稿并不会做任何建构 SCSI 设备 的动作,但它会妥当地在 介面卡被移走时卸下在 SCSI 设备上档案系统。 在 1.2.X 核心□,PCMCIA 驱动程式无法自动地推测哪个设备被安装在哪个 特定 的 SCSI 介面卡上。然而,如果你有一个正常的 SCSI 设备之建构,你 可以将这 些设备列明在 /etc/pcmcia/scsi.opts 中。例如,如果 你正常都有个 SCSI 磁 碟以及一个 CD-ROM,你可以使用以下: # For 1.2 kernels: list of attached devices SCSI_DEVICES="sda scd0" 被传到 /mnt/initrd 建立一个包含下面内容的 /mnt/etc/lilo.conf 档案: boot=/dev/fd0 compact image=/vmlinuz label=linux initrd=/initrd read-only root=/dev/sda1 最後,执行 lilo 如下: lilo -r /mnt 当 lilo 被执行时配合使用 -r 选项,它会做所有与被指定的根 目录的相关动作 。 在 /mnt/dev □建立设备档案的理由是, 当它是在替代的根目录模式下 lilo 并无法使用在 /dev 内 的档案。 安装 initrd 映象档到非Linux 磁碟内 initrd 功能一般都使用在当内部的硬碟机被分派给其他的作业系统使用时 。 Linux 核心以及 initrd 映像档可以被放在非 Linux 的磁区分割内, 而且 lilo 或是 LOADLIN 可以被设定由这些映像档来开启 Linux 系统。 假设你有个已被建构好合适的根设备,且 initrd 映像档被建立在另外的系 统上 了,启动 Linux 系统的最容易方法是使用 LOADLIN,如下: LOADLIN initrd= 一旦你可以在你的目标机器上启动 Linux, 你就可以安装 lilo 来允 许直接地 启动 Linux 了。 例如,假设 /dev/hda1 是个非 Linux 的目标磁区分割,且 /mnt 可以被用做为挂入点。 首先,在目标 磁区分割上建立一个放 Linux 档案 的子目录: mount /dev/hda1 /mnt mkdir /mnt/linux cp [kernel-image] /mnt/linux/vmlinuz cp [initrd-image] /mnt/linux/initrd 在这个例子中, 假设 /dev/sda1 是我们要做为 Linux 根分割的 磁碟, 它是个 经由 PCMCIA SCSI 卡所挂上的 SCSI 硬碟机。 要安装 lilo,请建立一个有以下 内容的 lilo.conf 档: boot=/dev/hda map=/mnt/linux/map compact image=/mnt/linux/vmlinuz label=linux root=/dev/sda1 initrd=/mnt/linux/initrd read-only other=/dev/hda1 table=/dev/hda label=windows 在 boot= 这行□说要在指定的设备之主开机记录 MBR( master boot record) □ 安装开机载入程式。 root= 这行指出在载入 initrd 映像 档後需要使用的根档 案系统,如果核心映像档□已这麽建构了那就不需这麽 做了。 在 other= 那行 是用来描述说有其他的作业系统被安装在 /dev/hda1 □。 要安装这个例子□的 lilo ,使用: lilo -C lilo.conf 记得在这个案子□,lilo.conf 档案使用了包括 /mnt 在内 的绝对位址。我用这 个例子的原因是目标档案系统并不一定支援使用 boot= 和 root= 选项来建立 Linux 设备档案的建立。 6. 使用未被支援的卡片 6.1 建构无法被辨视的卡片 现在我们假设你的卡片已被现有的驱动程式所支援,我们所需要做的是在 /etc/pcmcia/config 中加入一个条目来告诉 cardmgr 如何 来辨视这张卡,哪些 驱动程式需要连结到这张卡片上。建构档案的格式细节 请查看 pcmcia 的 man 页。 如果你插入一张不被认得的卡片, cardmgr 正常来说会记录一些辨视资讯 到系统日志上, 我们可以利用 这些资讯来建造它的建构条目。 以下是个 cardmgr 如何将未支援卡的报告到 /usr/adm/messages 内的例子。 cardmgr[460]: unsupported card in socket 1 cardmgr[460]: version info: "MEGAHERTZ", "XJ2288", "V.34 PCMCIA MODEM" 相对应到/etc/pcmcia/config 的条目可以是: card "Megahertz XJ2288 V.34 Fax Modem" version "MEGAHERTZ", "XJ2288", "V.34 PCMCIA MODEM" bind "serial_cs" 你可以使用 ``*'' 来代替不晓得的字串,像版本号码啦。 当你写新的建构 条目 时,请小心地把完整的字串拷贝过去,保持原有的大小写体以及空白字 元。还有 ,请确认建构条目与被报告到日志档案□的资料有同样数目的字串 。 请牢记您几乎可以指定任何的驱动程式给一张卡使用,但如果你只是胡乱地 乱弄 ,并不是个很有生产效率的作法。你也可能很幸运地发现现有的驱动程 式已支援 了你的卡片。然而,大部份的结果是那些驱动程式并无法工作,也 有可能会产生 边际效应像锁死你的系统了。不像一般的设备驱动程式只探测 适当的卡片,探测 PCMCIA 设备的工作是由 cardmgr 所执行,驱动程 式本身在试著与设备沟通前并 不会做啥麽确认动作的。 在编修 /etc/pcmcia/config 之後, 你可以暗示 cardmgr 重新载入该档案,使 用: kill -HUP `cat /var/run/cardmgr.pid` 如果你设定好了一张新的卡片,请寄一份设定给我,这样子我就可以把它包 含进 标准建构档案□。 6.2 增列对 NE2000相容乙太网路卡的支援 首先, 先查看看这张卡是否已被 cardmgr 所辨识。 有些没有被列在 SUPPORTED.CARDS 内的卡片事实上是有些被支援的卡的 OEM 版本。如 果你发现 了像这样的卡片,请让我知道,这样才能把它加到列表内。 如果你的卡片没被辨别到, 请依照 [10]3.6 内 的步骤为你的卡片建立一个建构 条目,并把这张卡片连系上 pcnet_cs 驱动程式。 重新执行 cardmgr 即可使用 被更新的建构档案了。 如果 pcnet_cs 驱动程式说它无法决定你的卡片之硬体乙太网路位址 ,那麽请编 修你的新建构条目将这张卡片连系上记忆体卡片驱动程式 memory_cs 上。 重新 执行 cardmgr 即可使用被更新的建构档案 了。你需要知道你的卡片的硬体乙太 网路位址的值。这个位址是个以二个十 六位元字元号码所排成的六个数字,通常 它会被印在卡片上。如果它没有印 在卡片上,你可以使用 DOS 的驱动程式来显 示这个位址。 只要你一知道这 个值,请执行: dd if=/dev/mem0a count=20 | od -Ax -t x1 然後寻找你的位址之输出。只有偶数位元组被定义了,因此可以忽略倾印资 料内 的奇数位元组。记下位址的第一个位元组的十六位元位移。现在,编修 modules/pcnet_cs.c 并寻找 hw_info 构造。你需要为你的 卡片建立一个新的条 目。第一个栏位就是记忆体位移。接著的三个栏位就第 硬体位址的前三个位元组 。最後一栏位含有卡片的特别功能的旗标; 开始时 请试著将它设为 0。 编修完 pcnet_cs.c 後, 编译与安装新的模组。 再次修改 /etc/pcmcia/config, 然後改变卡片的连系从 memory_cs 换成 pcnet_cs。顺著 指示重新载入建构档案後就完成了。请您寄给我 一份你的新hw_info 档案以及建 构的条目内容。 如果你没有在十六进位倾印内找到你的卡片的硬体位址。最後的一个方法, 当 pcnet_cs 模组初始化时想要 ``hard-wire( 硬体接合 )'' 是有可 能的。请编修 /etc/pcmcia/config.opts 并加入 hw_addr= 选项,像这样: module "pcnet_cs" opts "hw_addr=0x00,0x80,0xc8,0x01,0x02,0x03" 在适宜的地方代换掉你自己的卡片之硬体位址。当然,请小心如果你已经做 了那 麽多了,那你的卡片就不太像是个 NE2000 相容卡了。事实上,我并不 确定是否 有 任何 卡片在经过了前面两种方法之一後还不能用的了 。 6.3 PCMCIA 软碟机介面卡 在 Compaq Aero 及少数一些笔记型电脑所使用的 PCMCIA 软碟机介面卡目 前尚 未被支援。 主要障碍在於 Aero 似乎使用自订的 PCMCIA 控制器来使 DMA 支援 软碟机。在不晓得这是如何办到的情况下,我们就无法找出解决的 方法。 如果在 Aero 被开启时软碟机介面卡是插著的, Aero 的 BIOS 就会建构该 卡, 此时 Linux 会把它视为一般的软碟机。当 Linux 的 PCMCIA 驱动程式 被载入时 , 它们会查察到这卡已被建构并已附著在 Linux 的驱动程式上, 而这插槽也会 被忽略不管了。所以,如果在开机时卡片即插著了那就可以使 用,但它不具备热 机交换的功能。 6.4 支援 Xircom 卡到底怎麽了? 在目前的 PCMCIA 套件中有含了一个古援 Xircom 乙太网路及乙太网路 / 数据机 的驱动程式。 这要感谢 Werner Koch 先生。我有设立一个专门讨论 Xircom 驱 动程式论□的超媒体新闻,在 [11]http://hyper.stanford.edu/hypernews/get/pcmcia/xircom.html。 以前 Xircom 卡并没被支援是因为 Xircom 公司有不能□露他们的卡片之技 术资 讯。後来,他们放松这些规定,现在主动提供驱动程式的资讯。 7. 除错小技巧及程式设计资讯 7.1 提出有用的小虫报告 提出小虫报告的最好的方法是使用在 Linux PCMCIA 资讯站的超媒体新闻讯 息列 表。这样可让其他人知道最新的问题有哪些 (并修改或改变方法 )。这 儿是小虫 报告内应让有的资料: * 您的系统类型,以及 probe 命令的输出讯息。 * 您使用哪些 PCMCIA 卡。 * 您的 Linux 核心程式版本及 PCMCIA 驱动程式版本。 * 您对 /etc/pcmcia 档或 PCMCIA 启动手稿所做的改变。 * 在系统日志档内所有与 PCMCIA 有关的讯息。 所有的 PCMCIA 程式模组和 cardmgr 精灵所传到系统日志档的讯息。 通常为 /var/log/messages 或 /usr/adm/messages。 当追踪一个问题时这应该时第一个 要察看的地方。当您提出小虫报告时请连 同包括这个档案。 如果您在找系统讯 息有任何问题时, 请检查 /etc/syslogd.conf 来看有哪些不同的讯息类别被处 理了。 在提出小虫报告前,请您检查一下确认您使用的是最新版的驱动程式套件。 如果 能先看已被我改正除错後的报告的话会让人稍稍高兴一下,不然就有点 没建设性 地辜负我的心血了。 如果你的问题是核心的部份,从错误的地方之错误倾印只有你能够追纵错误 位址 - EIP 才有用。 如果错误是在主要核心内,看看在 System.map 内的位址,找 出错误的功能函数。如果出错的地方是在可载入式模组内,那 麽就很难追纵了。 使用目前的模组工具 ``ksyms -m'' 会提出一份每 一个可载入模组的基位址。选 取包含了 EIP 位址的模组,然後把 EIP 减掉 基位址即可获得模组内的位移。 然後, 执行 gdb 在该模组上,使用 list 命令找到位移。 这项功能只有在你有 使用 -g 选项在编译 该模组时加入了除错资讯的功能。 如果你没有使用网路,小虫报告也可以寄到 dhinds@hyper.stanford.edu 来给我 ,我较希望你能把小虫报告贴到我的网站上,这样子其他人也都可以 看到。 7.2 低阶 PCMCIA 除错辅助 PCMCIA 模组含有许多条件编译的除错码。 大部份的这些码都在前置处理器 PCMCIA_DEBUG 定义的控制下。如果它没被定义,除错码就不会被编译 。如果设 定位 0,控制码会被编译进入但不会被启用。愈大的数字指定会变 得更冗长了。 以 PCMCIA_DEBUG 定义来建立的模组都会有个整数参数 pc_debug,它会控制它的 输出之多寡。 这可以在模组被载入时加以调 整,在不需重新编译下使得输出可 以被控制成以每个模组为单位了。 在 PCMCIA 供应版内的 debug_tools/ 子目录内有一些除错的工 具。 dump_tcic 和 dump_i365 两个公用程式会产生 PCMCIA 控 制器的完整暂存器的 倾印,并且将许多暂存器资讯的解码。如果你有对相关 的控制晶片做存取的话, 这些资讯最最有用的了。 dump_tuples 公用程式列出了卡片的 CIS (卡片资讯结 构 ),并将一些较重要的资料解码 出来。 dump_cisreg 公用程式显示卡片的本 地端建构暂存器(local configuration registers)资料。 有时候 memory_cs 记忆体卡驱动程式用来除错很好用。它可以与任何 的 PCMCIA 卡相连接,而且不会干扰到其他的驱动程式。它可以被用来对任 何卡片 的属性记忆体或通用记忆体的直接存取。 7.3 为新卡片写卡片服务驱动程式 Linux PCMCIA 程式设计师指引是 Linux PCMCIA 介面的最好文件。 最新的 版本 你都可以从 hyper.stanford.edu 的 /pub/pcmcia/doc 目录内或是在网站 [12]http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html 内找到。 对於那些接近於一般的 ISA 介面设备来说, 你也许可以使用已存在的 Linux 驱 动程式来驱动。有时候,最大的障碍是修改一个已存在的驱动程式 使它可以在开 机後处理加入或移出设备。在现行的驱动程式中,只有记忆体 卡是唯一 `` 自我 包含的 '' 驱动程式-并不依赖 Linux 的核心的其他部 份来做苦工。 在很多例子中,要支援一张新卡的最大障碍在於从它的制造版那儿得到技术 资讯 。 要知道问谁才对或是解释哪些资讯是必需的也很难。 然而, 只有少数例子外 ,在没有从制造厂得到技术资讯的情况下要写个该卡的驱动 程式几乎很难。 我写了一个含了备注来解说许多有关一个驱动程式如何与 Card 服务程式相 灌通 的架构驱动程式。 你可以在 PCMCIA 原始档案的 modules/skeleton.c 内找到。 7.4 给 PCMCIA 客户自定驱动程式的作者的指引 我决定若要供应所有的 PCMCIA 客户端驱动程式来成为 PCMCIA 套件的一部 份的 话,这样并不适合我。每一个新的驱动程式都会让主要套件渐渐地难以 来维护。 而且包含的这些驱动程式也会不请自来地将维护的工作从作者那儿 转移到我的身 上。因此,我会基於使用者的需求以及可维护性来以个案的方 式决定是否要包含 哪些供应的驱动程式。对於那些不被包含在核心套装的驱 动程式,我建议这些驱 动程式的作者可以使用下面的方案来打包您的驱动程 式作为供应用。 驱动程式的档案应该被安排放在与 PCMCIA 来源供应版商的相同目录结构下 ,如 此,驱动程式就可被解开到完整的 PCMCIA 原始程式树的上面了。一个 驱动程式 应该包含原始程式档案 (在 ./modules/), man 页 (在 ./man/),建构档案 (在 ./etc/)。 在最上层的目录内 也应该有个 README 读我档案。 最上层目录也应该包含一个 makefile,它是一个组合用来执行 ``make -f ... all'' 以及 ``make -f... install'' 编译驱动程式并安装 适当的档案。如果这 个 makefile 有个 .mk 附加档名,那麽它会自动 地被上层的 Makefile 命令加 上 all 以及 install 目标 地时来执行。 以下是一个 makefile 如何被建立的例子: # Sample Makefile for contributed client driver FILES = sample_cs.mk README.sample_cs \ modules/sample_cs.c modules/sample_cs.h \ etc/sample etc/sample.opts man/sample_cs.4 all: $(MAKE) -C modules MODULES=sample_cs.o install: $(MAKE) -C modules install-modules MODULES=sample_cs.o $(MAKE) -C etc install-clients CLIENTS=sample $(MAKE) -C man install-man4 MAN4=sample_cs.4 dist: tar czvf sample_cs.tar.gz $(FILES) 这个 makefile 使用 2.9.10 版本(含)以後的 PCMCIA 套装程式所定义的 安装 目标地。它还包含了一个 ``dist'' 目标地来给驱动程式的作者方便性 。 你也 许想要加上版本编号到最後的套装档名上。 (例如, sample_cs-1.5.tar.gz)。 一个完整供应版可以如下: sample_cs.mk README.sample_cs modules/sample_cs.c modules/sample_cs.h etc/sample etc/sample.opts man/sample_cs.4 以这样的安排,当供应版本驱动程式被解开时,它会变为 PCMCIA 原始程式 树的 必要成员。这样它就可以使用 PCMCIA 档头档案以及检查使用者系统建 构的机能 、自动相关性检查,就像是个 `` 一般的 '' 客户端驱动程式一样 。 我接受那些依照这个规格所准备的客户端驱动程式将它们放在我的 FTP 档 案传 输站 hyper.stanford.edu 的 /pub/pcmcia/contrib 目录内。在这个目录内的 README 档案会述明如何解开供应的驱动程式。 PCMCIA 客户端驱动程式介面一直以来都没有变动很多, 并且还都有保留向 後相 容的功能。一客户端驱动程式并不需在主要的 PCMCIA 套件小部份的改 版时就得 升级一次。我也会试著通知那些供应驱动程式的作者对於他们的驱 动程式需要更 动的地方。 7.5 给 Linux 供应版本维护人员的导引 如果您使用的供应商版本提供系统建构工具程式使您须注意 PCMCIA 部份, 请使 用在 /etc/pcmcia 内的 *.opts 档案来”挂上” 那些功能。如果使用者编译及 安装新版的 PCMCIA 套件时它们将不会被更动 。如果您修改了主建构手稿後再安 装个新的 PCMCIA 套件时,这将会悄悄地 把您已自订的手稿给覆盖而中断您之前 与建构工具间的连接。如果您不晓得 怎麽来写个合适的选项手稿,您可以与我连 络。 如果您能将您使用的供应商版本中有关 PCMCIA 套件的使用与本文件之不同 的地 方写成文件将对其他的使用者以及我本人有助益的。特别是,请在文件 上付上启 动手稿及建构手构的不同处。 如果您想做 Linux 供应版的 PCMCIA,最好也把非 PCMCIA 主要程式的其他 分享 驱动程式一起包括进去。为了方便维护,我会尽力地将核心套件的大小 限制在一 定□围内,除非有我觉得会被大家感兴趣的部份才会再加进去。如 前面所说,其 他的驱动程式会被分开地供应。对於被整合和分开於核心部份 的驱动程式之界定 是随意且有些是有其历史性的,因此我们不能以为它们在 品质上有任何的不同。 後记: 译者按: 在翻译本篇文章的过程中,共遇到二次翻译到一半而原作者修正文 件及 重新编排的状况。因此,本译文可能有翻译不周延或错字之处,烦请发 现错误地 方的朋友来信到 [13]linuxer.bbs@cis.nctu.edu.tw 给我,以便修正,谢谢您! References 1. mailto:linuxer.bbs@cis.nctu.edu.tw 2. ftp://hyper.stanford.edu/pub/pcmcia/doc 3. http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html 4. ftp://sunsite.unc.edu/pub/Linux/kernel/v2.0 5. ftp://tsx-11.mit.edu/pub/linux/sources/system/v2.0 6. ftp://ftp.cs.unc.edu/pub/users/faith/linux 7. http://www-uk.hpl.hp.com/people/jt/Linux/Wavelan.html 8. file://localhost/tmp/zh-sgmltools.32013/PCMCIA-HOWTO.txt.html#timing 9. file://localhost/tmp/zh-sgmltools.32013/PCMCIA-HOWTO.txt.html#new-card 10. file://localhost/tmp/zh-sgmltools.32013/PCMCIA-HOWTO.txt.html#new-card 11. http://hyper.stanford.edu/hypernews/get/pcmcia/xircom.html 12. http://hyper.stanford.edu/HyperNews/get/pcmcia/home.html 13. mailto:linuxer.bbs@cis.nctu.edu.tw