Vor dem Beginn sollte man darüber nachdenken, ob es wirklich erforderlich ist, das PCMCIA-Paket selber zu kompilieren. Die meisten Linux Distributionen werden mit einem vorkompilierten PCMCIA-Treiberpaket ausgeliefert. Im allgemeinen muß das Paket nur dann selbst kompiliert werden, wenn man eine neuere Version des PCMCIA-Paketes benötigt, weil erst diese einen bestimmten Treiber oder eine bestimmte Funktionalität besitzt, oder man eine andere Kernelversion installiert hat, als die, die mit der Distribution ausgeliefert worden ist. Das Kompilieren des PCMCIA-Pakets ist technisch nicht schwierig, setzt allerdings eine gewisse Vertrautheit mit Linux voraus.
Die folgenden Dinge müssen installiert sein, bevor man mit der Installation des Paketes beginnen kann:
Die neueste Version verlangt einen Kernel der Version 1.2.18 oder höher, oder ein Entwickler-Kernel 1.3.30 oder neuer. Version 1.3.38 funktioniert nicht und die Versionen 1.3.31 bis 1.3.36 sind nicht getestet worden. Es werden auch relativ neue Modulprogramme benötigt. Es gibt keine Kernel-Patches speziell für PCMCIA.
Man benötigt einen kompletten Quellbaum des Linux-Kernels. Ein bereits übersetzter Kernel allein genügt nicht. Das PCMCIA Modul enthält einige Referenzen auf Kernel-Quelltexte. Während man einen neuen Kernel übersetzen will, um unnötige Treiber zu entfernen, ist dies für die Installation von PCMCIA nicht notwendig.
Aktuelle stabile Kernelquellen und Patches sind unter folgenden Adressen erhältlich:
Aktuelle Modulwerkzeuge sind dort unter modules-2.0.0.tgz
zu finden. Entwicklungskernel sind in den entsprechenden v2.1
Verzeichnissen zu finden. Einige aktuelle Entwicklungskernel und
Compiler arbeiten schlecht mit älteren Modulwerkzeugen
zusammen. Bei der Verwendung von 2.1-Kerneln muß man sicherstellen,
daß man die richtige Kombination an Libraries und
Modulwerkzeugen einsetzt. Die neuesten Modulwerkzeuge sowie Versionen
für ältere Kernel sind unter
http://www.pi.se/blox/modules
zu finden.
Wird der Einsatz einer PCMCIA Ethernetkarte geplant, so ist bei der Konfiguration des Kernels die Unterstützung für Netzwerke zu aktivieren und die normalen Linux Ethernettreiber einschließlich der Treiber für »Pocket« und portable Adapter zu deaktivieren. Die PCMCIA-Netzwerkkartentreiber sind alle als ladbare Module implementiert. Jeder unnötig in den Kernel einkompilierte Treiber verschwendet nur Platz.
Wenn SLIP, PPP oder PLIP verwendet werden sollen, müssen die entsprechenden Treiber entweder in den Kernel einkompiliert werden oder die Treiber als Module geladen werden. In der Kernelkonfiguration der 1.2.x-Kernel ist es nicht möglich, Optionen wie SLIP-Kompression für ladbare Module zu aktivieren. Daher wird es hier wohl besser sein, SLIP direkt in den Kernel zu binden, wenn diese Funktionalität benötigt wird.
Soll ein PCMCIA-Token Ring Karte verwendet werden, so muß der
Kernel mit der Option »Token Ring driver support« übersetzt worden
sein, wobei die Option CONFIG_IBMTR
ausgeschaltet sein
sollte.
Sollen PCMCIA IDE-Karten verwendet werden, so sollte im Kernel
CONFIG_BLK_DEV_IDE_PCMCIA
aktiviert sein. Diese Funktion gibt
es nur bei den Kerneln 1.3.72 bis 2.1.7. Ältere Kernel haben
keine Unterstützung für wechselbare IDE-Geräte; neuere
Kernel benötigen keine spezielle Konfiguration.
Bei der Verwendung von PCMCIA SCSI-Karten sollte in der
Kernelkonfiguration CONFIG_SCSI
aktiviert sein. Ebenso
sollten die Haupttreiber für die geplanten SCSI-Geräte wie
Festplatten, Bandlaufwerke, CD-ROMs oder generische Devices
aktiviert sein, wohingegen die Treiber für spezielle
SCSI-Controller-Karten nicht benötigt werden.
Wenn Treiber des Kernels, die für die PCMCIA-Geräte benötigt werden,
als Module übersetzt wurden, so ist die Datei
/etc/pcmcia/config
entsprechend zu modifizieren, so daß
jeweils die benötigten Module für eine Karte geladen werden. Wenn zum
Beispiel ein serieller Treiber modularisiert wurde, muß die
serielle Gerätedefinition wie folgt geändert werden:
device "serial_cs"
class "serial" module "misc/serial", "serial_cs"
Wenn der Kernel mit der Option CONFIG_MODVERSIONS
(Kontrolle
der Versionsnummer von Modulen) kompiliert wurde, so wird das
Konfigurationsskript nach der Existenz der Datei
/usr/include/linux/modversions.h
, der Moduldatenbank,
suchen. Diese wird erstellt, wenn im Kernelquellverzeichnis der Befehl
make dep
ausgeführt wird.
Dieses Paket enthält eine auf X11 basierte Kartenstatusanzeige mit
dem Namen cardinfo
. Dieses Programm basiert auf der kostenlos
vertriebenen Widgetbibliothek XForms,
welche installiert sein muß, wenn man cardinfo
verwenden will. Eine binäre Version ist unter
hyper.stanford.edu:/pub/pcmcia/extras
sowohl im a.out als auch im ELF Format erhältlich. Es müssen zusätzlich alle gewöhnlichen X11 Headerdateien und Bibliotheken installiert sein.
Hier ist ein Übersicht des Installationsprozesses:
pcmcia-cs-2.9.?.tar.gz
in /usr/src
.
make config
in dem neu entstandenen Verzeichnis
pcmcia-cs-2.9.?
.
make all
, danach make install
.
/etc/pcmcia
an die eigenen Bedürfnisse.Während des Laufs von make config
werden einige
Konfigurationseinstellungen abgefragt und es wird überprüft,
ob das System für die Installation der PCMCIA-Unterstützung
entsprechend vorbereitet ist. In den meisten Fällen können
die Standardeinstellungen verwendet werden. Für den Fall, daß
Probleme auftreten, ist es ratsam, auf die Ausgaben dieses Programmes zu
achten.
Wird das PCMCIA-Paket für den Gebrauch auf einem anderen Computer kompiliert, so sollte ein anderes Installationsverzeichnis angegeben werden, wenn danach gefragt wird. Dies sollte ein absoluter Pfad sein. Alle PCMCIA-Dateien werden relativ zu diesem Pfad installiert. Danach ist man in der Lage, das ganze Unterverzeichnis in eine tar Datei zu schreiben und zum Zielcomputer zu kopieren, wo das Archiv dann im Root-Verzeichnis entpackt werden muß, um das PCMCIA-Paket an der richtigen Stelle zu installieren.
Wenn das Paket für einen andere Architektur, z.B. für einen Linux Rechner mit einer Alpha CPU, crosskompiliert werden soll, so kann ein anderer Compiler und Linker angegeben werden. Dies kann auch auf Systemen mit gemischtem a.out- und ELF-Formaten hilfreich sein. Auch wird das Skript nach zusätzlichen Optionen des Compilers für's Debugging fragen.
Einige der Programme (cardctl
und cardinfo
)
können entweder in der safe- oder trusting-Form
kompiliert werden. Die safe-Form verhindert, daß
Nicht-Root-Anwender die Kartenkonfiguration ändern
können. Die trusting-Form erlaubt normalen Anwendern,
Befehle abzusetzen, um Karten anzuhalten, wiederanzufahren,
zurückzusetzen und die aktuelle Konfiguration zu ändern. Das
Konfigurationsskript wird nach einer der beiden Formen fragen. Die
Voreinstellung ist safe.
Es gibt ein paar Einstellungen der Kernelkonfiguration, die Auswirkungen auf die PCMCIA-Werkzeuge haben. Das Konfigurationsskript kann diese meistens aus dem laufenden Kernel herauslesen. Alternativ, wenn für einen anderen Computer kompiliert wird, kann diese Konfiguration aus einem Kernelquellcode-Verzeichnisbaum herausgelesen werden oder sie können interaktiv abgefragt werden.
Das Durchlaufen von make all
gefolgt von make
install
wird die Kernelmodule und Anwendungsprogramme erzeugen und
installieren. Die Kernelmodule werden in
/lib/modules/
{version}/pcmcia
installiert.
Die Programme cardmgr
und cardctl
werden in /sbin
installiert. Wenn cardinfo
erstellt wird, so wird es in
/usr/bin/X11
installiert.
Die Konfigurationsdateien werden in das Verzeichnis
/etc/pcmcia
kopiert. Wird über eine alte Version
installiert, so werden die alten Kofigurationsdateien umbenannt, bevor
die neuen installiert werden. Die alten Skriptdateien bekommen
Endungen wie *.~1~, *.~2~ und so weiter.
Wenn nicht bekannt ist, welcher PCMCIA Controller Chip in den Rechner
eingebaut ist, so kann die probe
Funktion im Unterverzeichnis von
cardmgr/
verwendet werden, um den Chiptyp zu ermitteln. Es
gibt zwei Hauptarten an Chips: der Databook TCIC-2 Typ und der Intel
i82365SL kompatible Typ.
Ein Daemon auf Anwenderebene überwacht, ob eine Karte
eingeschoben oder entfernt wird. Dieser Daemon heißt
cardmgr
. Dieser ist ähnlich in der Funktion wie Barry
Jaspans pcmdiad
in früheren Versionen. cardmgr
liest die Konfigurationsdatei /etc/pcmcia/config
,
welche die bekannten PCMCIA Karten beschreibt. Es werden darin ebenso die
zusätzlichen Module erwähnt, die für den Gebrauch der
PCMCIA-Karte notwendig sind und eventuell auf das eigene
System angepaßt werden müssen. Sollten weitere Informationen benötigt
werden, sollte die Manual Page weiterhelfen.
Einige Linux Distributionen, wie z.B. Slackware, verwenden eine
BSD-Anordnung der Systemstartskripte. Wenn die Datei
/etc/rc.d/rc.M
existiert, gehört das System zu dieser
Gruppe. Das Skript rc.pcmcia
, das in /etc/rc.d
installiert ist, kontrolliert den Start und Stopp des
PCMCIA-Systems. make install
verwendet das Kommando probe
,
um den Chiptyp zu ermitteln und das Skript rc.pcmcia
entsprechend anzupassen. Es sollte dann eine Zeile in der Startdatei
/etc/rc.d/rc.M
eingefügt werden, die das
PCMCIA-Startskript aufruft:
/etc/rc.d/rc.pcmcia start
Es ist nicht wichtig, wo diese Zeile erscheint, solange sie nach dem Start
von syslogd
steht.
RedHat, Caldera und Debian Linux haben Startskripts, die dem System V
folgen. Wenn ein Verzeichnis mit dem Namen /etc/init.d
oder
/etc/rc.d/init.d
existiert, gehört die Distribution zu
dieser Gruppe. Das rc.pcmcia
Skript wird dann entsprechend in
/etc/init.d
oder /etc/rc.d/init.d
installiert. Es
besteht hier keine Notwendigkeit, irgendeine Startdatei zu editieren, um
PCMCIA zu aktivieren: Dies geschieht automatisch.
Wenn das Verzeichnis /etc/sysconfig
existiert, wird eine
separate Konfigurationsdatei zum Starten als /etc/sysconfig
installiert. Wenn in diesem Fall irgendwelche Moduloptionen, wie
z.B. PCIC=
oder PCIC_OPTS=
Einstellungen, geändert werden sollen,
so ist dies in dieser Datei einzutragen und nicht im Startskript. Bei
nachfolgenden Installationen wird diese Datei nicht
überschrieben. Einige Systeme werden mit
Systemkonfigurationsdateien ausgeliefert, die PCMCIA per Voreinstellung
deaktivieren (wie z.B. S.u.S.E.). Daher sollte der Inhalt solcher
Dateien vorher überprüft werden (bei S.u.S.E.:
/etc/rc.config
).
Einige frühere Versionen verwendeten die PCMCIA-Skripte in
/etc/sysconfig
anstelle von /etc/pcmcia
. Die
aktuelle Version und zukünftige werden das Verzeichnis
/etc/pcmcia
auf allen Systemen verwenden. Existierende
PCMCIA-Skripte in /etc/sysconfig
werden nach
/etc/pcmcia
verschoben.
Card Services sollte es automatisch vermeiden, auf Ports und
Interrupts zuzugreifen, die von anderen Geräten verwendet
werden. Es wird ebenfalls versucht, Konflikte mit anderen unbekannten
Geräten zu entdecken. Allerdings ist dies nicht absolut
zuverlässig. In einigen Fällen müssen bestimmte
Bereiche für einen Treiber explizit ausgeschlossen werden. Dies
erreicht man über die Datei /etc/pcmcia/config.opts
.
Hier sind einige Einstellungen für spezielle Notebooks:
Einige PCMCIA-Controller haben optionale Eigenschaften, die bei einigen Systemen eventuell implementiert sind. Es ist generell unmöglich, für einen PCMCIA-Treiber festzustellen, ob diese speziellen Eigenschaften eingebaut sind. Man lese daher die Manual Page des eingebauten Treibers für die möglicherweise implementierten und aktivierbaren Eigenschaften.
In wenigen Fällen ist das probe
Kommando nicht in der
Lage, den Controllertyp automatisch zu ermitteln. Bei Halikan NBD
486-Systemen, die einen TCIC-2-Controller an einer ungewöhnlichen
Stelle haben, muß die Datei rc.pcmcia
editiert
werden, damit das tcic
Modul geladen wird. Dabei muß der
Parameter PCIC_OPTS
auf tcic_base=0x02c0
gesetzt werden.
Die Treibermodule tcic und i82365 haben zahlreiche Parameter zur Behandlung der Busgeschwindigkeit, welche für besonders schnelle Prozessoren angepaßt werden müssen. Symptome für Geschwindigkeitsprobleme sind unter anderem Probleme der Kartenerkennung, Blockierung bei hoher Prozessorbelastung, große Fehlerraten oder schlechte Übertragungsraten der Geräte. Man kontrolliere die entsprechenden Manual Pages für nähere Informationen. Hier ist eine kurze Zusammenfassung:
cmd_time
Option, die die Dauer von PCMCIA-Buszyklen festlegt,
zu sein. Schnelle 486-Systeme (insbesondere DX4-100) scheinen oft von
einer Erhöhung von 6 (Voreinstellung) auf 12 oder 16 zu
profitieren.
fast_pci
Einstellung, welche gesetzt werden sollte, falls die
PCI-Busgeschwindigkeit größer als 25 MHz ist.
async_clock
Option die relative
Geschwindigkeit des PCMCIA-Busses zum Hauptbus. Wird diese Option
gesetzt, so werden extra Wartezyklen bei einigen Operationen
eingefügt werden. David hat von einem Notebook
gehört, das diese Option benötigte.
pcmcia_core
Modul besitzt einen cis_speed
Parameter zum Ändern der Geschwindigkeit, mit der auf den Speicher
der Card Information Structure (CIS) zugegriffen wird. Bei einigen
Systemen mit schnellen Busgeschwindigkeiten kann die Erhöhung
dieses Parameters, d.h. Verlangsamung des Kartenzugriffs, die
Erkennung einzelner Karten begünstigen.
extra_sockets=1
gesetzt ist. Alle diese Optionen sollten durch Modifizierung der Datei
rc.pcmcia
konfiguriert werden. Zum Beispiel:
# sollte entweder i82365 oder tcic sein
PCIC=i82365
# Geschwindigkeitsparameter des Treibers sollten hier
# stehen
PCIC_OPTS="cmd_time=12"
# pcmcia_core Optionen werden hier angegeben
CORE_OPTS="cis_speed=500"
Hier sind ein paar Geschwindigkeitseinstellungen für spezielle Systeme:
"freq_bypass=1 cmd_time=8"
verwendet werden.
"cmd_time=12"
.
"cmd_time=16"
.Bei einigen Systemen, die den Cirrus-Controller verwenden, wie z.B. der
NEC Versa M, versetzt das BIOS den Controller in einen speziellen
Ruhemodus während des Einschaltens. Auf solchen Systemen wird das
probe
-Kommando keinen PCMCIA-Controller entdecken. Wenn dies
geschieht, muß die Datei rc.pcmcia
von Hand wie folgt
abgeändert werden:
# sollte entweder i82365 oder tcic sein
PCIC=i82365
# Geschwindigkeitsparameter des Treibers sollten hier
# stehen
PCIC_OPTS="wakeup=1"
Das Konfigurationsskript stellt normalerweise sicher, daß die
PCMCIA-Module mit dem installierten Kernel funktionieren. Daher
lassen sich Probleme mit dem Laden der Module meist darauf
zurückführen, daß der Installationsvorgang nicht
korrekt durchgeführt worden ist. Einige solcher Fehlermeldungen
werden direkt auf der Linuxkonsole ausgegeben, andere werden in der
Systemlogdatei aufgezeichnet. Diese heißt normalerweise
/usr/adm/messages
oder /var/log/messages
. Dies
hängt von der Konfiguration des syslogd
Daemons ab
und wird in der Datei /etc/syslog.conf
festgelegt. Um den
Fehler einzugrenzen, sollten dieses Log-Dateien genau untersucht
werden. Auf diese Weise kann auch herausgefunden werden, welches Modul
das Problem verusacht.
Einige der PCMCIA-Module benötigen Kerneldienste, die nur dann vorhanden
sind, wenn der Kernel entsprechend konfiguriert wurde.
Zum Beispiel verlangt der SCSI-Kartentreiber, daß der Kernel mit
SCSI-Unterstützung übersetzt wurde. Analog benötigt der
Netzwerktreiber die Netzwerkunterstützung des Kernels. Wenn dem Kernel
die notwendigen Treiber fehlen, kann es sein, daß sich insmod
mit der Begründung von undefinierten Symbolen weigert, ein
Modul zu laden.
Wenn insmod
von »wrong version«-Fehlern berichtet, so
bedeutet dies, daß die Module für eine andere Kernelversion als die
aktuell auf dem System laufende übersetzt worden sind. Dieses kann
passieren, wenn die Module auf einem anderen Computer mit anderer
Konfiguration übersetzt worden sind und auf den eigenen kopiert
wurden oder wenn der Kernel nach der Installation der PCMCIA-Module
neu konfiguriert wurde.
Eine andere Fehlerquelle besteht darin, daß die Module und der
Kernel mit unterschiedlichen Einstellungen von
CONFIG_MODVERSIONS
übersetzt worden sind. Wenn ein Modul
mit Versionskontrolle in ein Kernel ohne diese Kontrolle geladen wird, so wird
insmod
sich über undefinierte Symbole beschweren.
Zum Schluß sind noch relativ neue Versionen der binutils
inkompatibel mit den älteren Versionen der Modulwerkzeuge. Dies
kann Inkompatibilitäten der Module verursachen. Eine übliche
Fehlermeldung in einem solchen Fall ist die Meldung, daß
gcc_compiled
nicht definiert sei. Wenn diese Fehlermeldungen
erscheinen, sollte man auf die neuesten Modulwerkzeuge
aufrüsten. Diese sind unter
http://www.pi.se/blox/modules
zu bekommen.
In den meisten Fällen wird der Treiber (i82365 oder
tcic
) automatisch einen Interrupt suchen und auswählen,
um den Kartenstatus anzuzeigen. Diese automatische Interruptsuche
funktioniert bei einigen Intel-kompatiblen Controllern nicht, wie
z.B. Cirrus Chips und einige in IBM ThinkPads verwendeten Chips. Wenn
ein Gerät während des Testvorgangs inaktiv ist, kann es
passieren, daß der Interrupt dieses Gerätes als frei
erscheint. In solchen Fällen kann es passieren, daß dieser
Interrupt vom Treiber verwendet wird.
Bei den i82365 und dem tcic
Treibern kann die Option
irq_mask
verwendet werden, um die möglichen Interrupts
einzuschränken. Diese Maske schränkt den Satz der
möglichen Interrupts, die für den Gebrauch mit PCMCIA-Karten
oder für die Anzeige von Kartenstatusänderungen verwendet
können, ein. Die Option cs_irq
kann ebenfalls verwendet
werden, um explizit den Interrupt festzulegen, mit welchem der Wechsel
des Kartenstatus überwacht wird.
Wenn ein funktionierender Interrupt nicht gefunden werden kann, so
besteht die Möglichkeit, einen Pollingmodus zu verwenden. Sowohl der
i82365 als auch der tcic
Treiber akzeptieren die
Option poll_intervall=100
, durch welche festgelegt wird,
daß sie jede Sekunde Kartenstatus pollen. Diese Option
sollte auch verwendet werden, wenn der Spielraum für freie
Interrupts für den Gebrauch durch PCMCIA stark eingeschränkt
ist. Insbesondere für Systeme mit mehreren PCMCIA Controllern
ist die Zahl der Interrupts zur Anzeige der Statusinformationen der
Karten stark eingeschränkt.
Alle diese Optionen sollten in der PCIC_OPTS=
Zeile in der
Datei rc.pcmcia
gesetzt werden.
Per Voreinstellung reservieren sich die PCMCIA-Treiber
Speicherfenster im Bereich 0xc0000-0xfffff nach der
Überprüfung dieses Bereiches auf den Gebrauch durch ROM oder
andere Geräte. Dieses Fenster wird in der Datei
/etc/pcmcia/config.opts
definiert. Die Überprüfung
dieses Bereichs wird durchgeführt, wenn ein Treiber versucht, eine
neue Karte zu konfigurieren. Dieser Prüfvorgang ist nicht
Narrensicher, so daß Probleme auftreten
können. Wenn ein Speicherbereich erkannt wurde, der von einem
anderen Gerät verwendet wird, so kann es passieren, daß die
Karte nicht korrekt erkannt wird. Durch das von einigen Chipsätzen
unterstützte BIOS »Shadowing« können ebenfalls Fehler
entstehen. Wenn man feststellt, daß alle Karten
fälschlicherweise immer als Speicherkarten erkannt werden, sollte
man sichergehen, daß das BIOS »Shadowing« beim Computer
ausgeschaltet ist. Ein gutes Fenster zu finden, erfordert manchmal
einiges Herumexperimentieren. Einige gute Fensteralternativen, die man
versuchen kann, sind die Bereiche 0xd8000-0xdffff, 0xc0000-0xcffff und
0xc8000-0xcffff.
Wenn man DOS PCMCIA Treiber besitzt, kann man versuchen, anhand dieser einen guten Speicherbereich herauszufinden. Es ist jedoch zu beachten, daß diese Adressen oft in Segmentform angegeben sind. Es fehlt in diesem Fall die letzte hexadezimale Ziffer. Die absolute Adresse 0xd0000 würde also z.B. als 0xd000 angegeben werden. Man sollte also darauf achten, diese letzte Ziffer hinzuzufügen, falls man solche Werte übernimmmt.
Wenn das Anpassen des Fensters im Speicherbereich das Problem der Kartenerkennung nicht löst, so liegt wahrscheinlich ein Geschwindigkeitsproblem (»timing«) vor.
Das Vertreiben von binären Treibern ist schwierig, da einige Eigenschaften erst beim Übersetzen der Dateien angegeben werden können. Die PCMCIA-Module hängen auch von der richtigen Kernelkonfigutation und -version ab. Daher müssten binäre Versionen zusammen mit passenden Kerneln vertrieben werden. Der größte Bedarf an vorübersetzten Modulen besteht bei der Installation einer Linux-Distribution. In diesem Fall werden die PCMCIA-Module zum Teil direkt für die Installation benötigt, um z.B. über eine PCMCIA-Netzwerkkarte die Pakete der Distribution von einem Server zu beziehen.
PCMCIA ist heute Bestandteil der meisten Linux-Distributionen.
Eigentlich ist das Paket nicht so groß. Alle Treibermodule
zusammen benötigen weniger als 200 KB an Speicherplatz auf der
Festplatte. Mit den zusätzlichen Werkzeugen werden es
zusätzlich weitere 70 KB und das Verzeichnis /etc/pcmcia
belegt ungefähr 30 KB. Im Betrieb benötigen die Hauptmodule
ungefähr 48 KB Hauptstpeicher. Der cardmgr
-Daemon wird
generell direkt ausgelagert und nur beim Kartenwechsel aktiv. Das
gesamte Paket belegt nicht mehr Platz als die DOS-Varianten.