L'ISA et le PNP sous Linux

Vous avez récupéré un ordinosaure à la décharge, le vieux Pentium 133 de mémé ou tout autres PC dattant d'avant l'an 2000 ?
Après avoir installé [Ku | Xu | Wu | Edu | U]buntu ou Debian sur cette machine vous remarquez que certains matériels pourtant fonctionnels sous Windows ne sont pas détectés ?

Avant de cracher sur le manchot, vérifiez que les matériels non utilisables ne soient pas connectés à la carte mère par un connecteur ISA, lisez ce tutoriel si c'est le cas.

Quelques mots sur l'ISA

L'Architecture Industrielle Standard, ou en anglais Industrial Standard Architecture plus connu sous le nom de ISA désigne un connecteur présent sur toutes les cartes mère de PC construits entre les années 1980 et l'an 2000. Depuis le début du XXIe siècle, le connecteur ISA a pris sa retraite.

A noter qu'il existe deux types de ports ISA, l'ISA 8 bits, qui n'est plus disponible sur les cartes mère depuis l'époque des processeurs Intel 286 et l'ISA 16 bits (voir image ci-dessous).
La seul différence physique entre ces deux ports et une plus grande longueur pour les ports ISA 16 bits et leur compatibilité avec le matériel ISA 8 bits.

Si vous ouvrez votre ordinateur, vous trouverez ces connecteurs en bas de la carte mère, ceux-ci sont noirs, longs et utilisent de gros contacteurs, voir l'image suivante :

Image d'un connecteur ISA 16 bits

Le PNP sous Linux

Alors que les premières cartes ISA devaient être réglées par l'utilisateur en donnant manuellement au programme les plages d'entrée/sortie, les numéros de DMA et d'IRQ utilisés par la carte, sont apparues plus tard des cartes ISA dites Plug'n Play (Branche et Utilise en français, ou PNP en abrégé) fonctionnant sans devoir réfléchir à ces réglages de DMA, d'IRQ ou autre, ceux-ci étant directement trouvés par le système d'exploitation.

À partir de Windows 95, l'ISA PNP fonctionne sans souci (à condition d'avoir les pilotes de la carte). Il faut savoir que sous GNU/Linux, la donne n'est pas la même.

Si les cartes ISA (qu'elles soient PNP ou non) peuvent fonctionner sous GNU/Linux, il faudra mettre les mains dans le cambouis. Car il faut bien avouer que GNU/Linux est encore Plug'N Pray (Branche et prie) avec les carte ISA.

Enfin, sachez que sous GNU/Linux, le terme PNP ne concerne que les cartes ISA.

Ce tutorial est compatible avec toutes les carte ISA PNP, quelles se trouvent dans un ordinateur de bureau ou dans un portable.

Les possesseurs de cartes ISA non PNP peuvent suivre ce tutorial à partir de la section "Charger le module de la carte et lui donner les bons paramètres", mais il ne pourrons utiliser ISAPNPTools pour trouver les configurations disponibles.

Connaissances requises

Matériel et Logiciels requis

  • Une carte mère avec au moins un connecteur ISA
  • Au moins une carte ISA
  • Un système GNU/Linux
  • De la patience
  • Le programme ISAPNPTools

Le programme ISAPNPTools va permettre de trouver les configurations possibles pour chaque cartes ISA PNP, malheureusement, il n'est plus disponible depuis Ubuntu 6.06 LTS ou Debian 4.0.

Fort heureusement, la version Debian 3.1 ou Ubuntu 5.10 (ou inférieure) est pleinement utilisable sous les versions suivantes de Debian ou Ubuntu.

  • Si vous utilisez Ubuntu 5.10, Debian 3.1 ou antérieur, Installez le paquet isapnptools via la ligne de commande ou Synaptic.
  • Si vous utilisez Ubuntu 6.06 LTS, Debian 4.0 ou supérieur, téléchargez la version Ubuntu 5.10 ou Debian 3.1 de ce package (ce sont les mêmes) et installez-le via la ligne de commande ou avec Gdebi.
  • (Mise à jour 10/09/2008) Ce package n'existe plus dans les depots d'Ubuntu et de Debian, mais vous pourrez le trouver facilement avec un moteur de recherche, son nom exact (pour intel) est isapnptools_1.26-5_i386.deb.

Trouvé ici: http://old-releases.ubuntu.com/ubuntu/pool/universe/i/isapnptools/

Trouver les configurations disponibles

Pour configurer la carte ISA, nous allons tout d'abord demander à isapnptools de nous donner toutes les configurations possibles pour chaque carte ISA du système (on appelle ça un PNP-Dump) et d'enregistrer le résultat dans un fichier nommé /etc/isapnp.conf.

Pour faire ce PNP-Dump, on utilise la commande pnpdump en redirigeant sa sortie vers /etc/isapnp.conf.

sudo pnpdump > /etc/isapnp.conf

Ensuite, il faut éditer ce fichier /etc/isapnp.conf.

… et là, c'est le drame, on se retrouve avec un fichier rempli de lignes plus ou moins incompréhensibles sortant du PNP-Dump. :-(

Structure du PNP-Dump

Le PNP-Dump est, contrairement à ce que l'on pourrait croire, structuré.

Préambule

Les lignes suivantes sont le préambule du fichier, elles donnent des directives à ISAPNPTools :

# $Id: pnpdump_main.c,v 1.27 2001/04/30 21:54:53 fox Exp $
# Release isapnptools-1.26
#
# This is free software, see the sources for details.
# This software has NO WARRANTY, use at your OWN RISK
#
# For details of the output file format, see isapnp.conf(5)
#
# For latest information and FAQ on isapnp and pnpdump see:
# http://www.roestock.demon.co.uk/isapnptools/
#
# Compiler flags:  -DREALTIME -DHAVE_PROC -DENABLE_PCI -DHAVE_SCHED_SETSCHEDULER -DHAVE_NANOSLEEP -DWANT_TO_VALIDATE
#
# Trying port address 0273
# Board 1 has serial identifier XX XX XX XX XX XX XX XX XX
# Board 2 has serial identifier XX XX XX XX XX XX XX XX XX

# (DEBUG)
(READPORT 0x0273)
(ISOLATE PRESERVE)
(IDENTIFY *)
(VERBOSITY 2)
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING

Laissez-les telles quelles.

Début de la description d'une carte

Vous trouverez ensuite une ligne indiquant qu'une carte à été trouvée et que sa configuration va être décrite :

# Card 1: (serial identifier XX XX XX XX XX XX XX XX XX)

Par exemple, avec ma carte son Yamaha OP3-SA2 :

# Card 1: (serial identifier 81 ff ff ff ff 20 00 a8 65)
# Vendor Id YMH0020, No Serial Number (-1), checksum 0x81.
# Version 1.0, Vendor version 0.0
# ANSI string -->OPL3-SAX Sound Board<--
#
# Logical device id YMH0021
#
# Edit the entries below to uncomment out the configuration required.
# Note that only the first value of any range is given, this may be changed if required
# Don't forget to uncomment the activate (ACT Y) when happy

Et avec ma carte SCSI Adaptec AHA1505 :

# Card 2: (serial identifier 0d da a5 f8 6a 05 15 90 04)
# Vendor Id ADP1505, Serial Number 3668310122, checksum 0x0D.
#     Version 1.0, Vendor version 1.1
#     ANSI string -->Adaptec AVA-1505AE      <--
#
# Logical device id ADP1505
#     Device supports I/O range check register
#
# Edit the entries below to uncomment out the configuration required.
# Note that only the first value of any range is given, this may be changed if required
# Don't forget to uncomment the activate (ACT Y) when happy

Fin de la description d'une carte

La fin de la description d'une carte est marquée d'un simple checksum, du type :

# End tag... Checksum 0x00 (OK)

Corps de la description d'une carte

La description des ports d'entrée-sortie, de numéros de DMA et d'IRQ d'une carte se trouvent entre le début… et la fin vu aux paragraphes précédents (logique non ?).

Voici par exemple la description d'une des configurations disponibles pour ma carte Yahama OPL3-SAX :

(CONFIGURE YMH0020/-1 (LD 0

# Multiple choice time, choose one only !

#     Start dependent functions: priority preferred
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0220
#             Maximum IO base address 0x0220
#             IO base alignment 16 bytes
#             Number of IO addresses required: 16
# (IO 0 (SIZE 16) (BASE 0x0220) (CHECK))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0530
#             Maximum IO base address 0x0530
#             IO base alignment 8 bytes
#             Number of IO addresses required: 8
# (IO 1 (SIZE 8) (BASE 0x0530) (CHECK))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0388
#             Maximum IO base address 0x0388
#             IO base alignment 4 bytes
#             Number of IO addresses required: 4
# (IO 2 (SIZE 4) (BASE 0x0388) (CHECK))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0330
#             Maximum IO base address 0x0330
#             IO base alignment 2 bytes
#             Number of IO addresses required: 2
# (IO 3 (SIZE 2) (BASE 0x0330) (CHECK))
#       Logical device decodes 16 bit IO address lines
#             Minimum IO base address 0x0370
#             Maximum IO base address 0x0370
#             IO base alignment 2 bytes
#             Number of IO addresses required: 2
# (IO 4 (SIZE 2) (BASE 0x0370) (CHECK))
#       IRQ 5.
#             High true, edge sensitive interrupt
# (INT 0 (IRQ 5 (MODE +E)))
#       First DMA channel 0.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed type F
# (DMA 0 (CHANNEL 0))
#       Next DMA channel 1.
#             8 bit DMA only
#             Logical device is not a bus master
#             DMA may execute in count by byte mode
#             DMA may not execute in count by word mode
#             DMA channel speed type F
# (DMA 1 (CHANNEL 1))
#     End dependent functions
 (NAME "YMH0020/-1[0]{OPL3-SAX Sound Board}")
# (ACT Y)
))

Pour faire fonctionner une carte, il faudra choisir un bloc de configuration et décommenter certaines lignes.

Pour vous y retrouver, sachez que de nombreuses lignes sont des commentaires déstinés à vous décrire les entrées/sorties, DMA et IRQ détectées.

Types de lignes à décommenter

Lignes indiquant une plage d'entrées/sorties
# (IO X (SIZE Y) (BASE ZxZZZZ) (CHECK))

Si vous désirez connaitre la liste des ports d'entrées/sortie utilisés sur votre système, utilisez la commande suivante :

cat /proc/ioports
Ligne indiquant un numéro de DMA.
# (DMA X (CHANNEL Y))

Il est possible que votre carte ISA n'en utilise pas, auquel cas, vous n'aurez pas de lignes de ce type.

Ligne indiquant un IRQ
# (INT X (IRQ Y (MODE +E)))

Lisez les lignes de commentaires se trouvant juste au dessus des lignes d'IRQ, elles vous donneront les numéros d'IRQ utilisables par votre carte ISA. Si un ne fonctionne pas, il faudra en choisir un autre parmi ceux proposés. Si vous désirez connaitre la liste des IRQs utilisés sur votre système, utilisez la commande suivante :

cat /proc/interrupts
Ligne permettant d'activer une carte :
 (ACT Y)

Vous devez décommenter cette ligne pour activer votre carte et lui permettre ainsi de fonctionner.

Test de la configuration

Une fois que vous avez décommenté les lignes d'une configuration qui vous semble correcte, nous allons tester cette configuration. Pour celà, nous allons demander à ISAPNPTools de lire le fichier /etc/isapnp.conf

sudo isapnp /etc/isapnp.conf

Vous obtiendrez comme réponse une description rapide des cartes trouvées avec une indication sur les éventuelles erreurs.

Exemple de configuration sans erreurs :

Board 1 has Identity 81 ff ff ff ff 20 00 a8 65:  YMH0020 Serial No -1 [checksum 81]
Board 2 has Identity 0d da a5 f8 6a 05 15 90 04:  ADP1505 Serial No 3668310122 [checksum 0d]
YMH0020/-1[0]{OPL3-SAX Sound Board}: Ports 0x220 0x530 0x388 0x330 0x370; IRQ5 DMA0 DMA1 --- Enabled OK
YMH0020/-1[1]{OPL3-SAX Sound Board}: Port 0x201; --- Enabled OK
ADP1505/3668310122[0]{SCSI Controller     }: Port 0x340; IRQ10 --- Enabled OK

Le — Enable OK indique que la configuration que vous avez choisie peut être utilisée.

En cas d'erreur, vous obtiendrez quelque chose du genre :

/etc/isapnp.conf:52 -- Fatal - Error occurred executing request '<IORESCHECK> '

Bien entendu, chaque erreur est précédée de son numéro de ligne (52 ici), ce qui vous permettera de trouver facilement la source du problème.

Si vous trouvez une erreur du type <IORESCHECK> allez à la ligne concernée et supprimez la chaîne de caractère (CHECK), par exemple

(IO 0 (SIZE 32) (BASE 0x0140) (CHECK))

Devient

(IO 0 (SIZE 32) (BASE 0x0140))

Puis recommencez le test de configuration

Une fois que le test ne retourne plus d'erreur, c'est bon. :-)

Charger le module de la carte et lui donner les bons paramètres

Trouver le module

Pour trouver le module utilisé par votre carte ISA, il y a plusieurs solutions :

  • soit vous utilisez un moteur de recherche en lui demandant une recherche du type module nom_de_votre_carte ;
  • soit vous téléchargez les sources de votre noyau, vous allez dans l'outils de configuration et vous consultez l'aide du module réseau/sonore/SCSI correspondant au type de votre carte ISA. Généralement, le nom du fichier pilote y est indiqué.
  • soit comme ceci (mais nécessite de repérer le bon module …) :

find /lib/modules | grep snd-*

(pour une carte son ici)

Dans le cas de mes cartes, les modules étaient les suivants :

  • snd-opl3sa2 pour la carte sonore Yamaha OPL3-SAX ;
  • aha152x pour la carte SCSI Adaptec AHA1505.

Donner les paramètres au module

Pour charger le module, vous devrez utiliser la commande modprobe. Les paramètres sont généralement les ports d'entrées/sorties (io), de DMA (dma1 et dma2), et d'IRQ (irq) trouvés dans /etc/isapnp.conf.

Par exemple :

sudo modprobe aha152x io=0x340 irq=10

Chargement automatique des modules

Pour charger automatiquement les modules au démarrage de la machine, il faut indiquer les lignes de chargement de modules (les mêmes que modprobe) dans le fichier /etc/modules

En cas de (kernel) panic

Ne rigolez pas, il arrive que l'activation d'une carte ISA provoque un BSOD kernel panic.

Redémarrez en mode Maintenance (Recovery mode) pour charger le minimum ou avec un Live CD et commentez les lignes de modules de vos cartes ISA dans /etc/modules pour empêcher leur chargement.

En fait, le problème est le suivant :

Malgré le fait qu' ISAPNPtools vous dise que votre configuration est correcte, la carte ISA se retrouve à partager son IRQ avec un autre matériel, or les cartes ISA n'ont jamais été conçues pour partager leur IRQ !

Pour vous en assurer, listez les IRQ du système :

cat /proc/interrupts

Et vérifiez que l'IRQ utilisé par vos cartes ISA soit libre (pas de nom de matériel).

Pour empêcher celà, vous avez les choix suivants :

  • Changer la configuration de vos cartes ISA avec ISAPNPtools et le fichier /etc/isapnp.conf parmi ceux qu'elles proposent et ceux disponibles.
  • Retirer du matériel pour libérer des IRQ.
  • Retirer le support de l'ACPI pour libérer un IRQ et permettre aux cartes PCI de prendre d'autres IRQ et sans doute libérer celui utilisé par votre carte ISA. Ceci peut être fais en recompilant le noyau ou en démarrant avec l'option noacpi.

Bien sûr, si vous modifiez le numéro d'IRQ de votre carte ISA, modifiez en conséquence le fichier /etc/modules.

Activer toutes les possibilitées de sa cartes son

Si vous configurez une carte son, consultez le fichier /usr/share/doc/alsa-base/driver/ALSA-Configuration.txt.gz pour connaître les différents arguments possibles pour votre carte.

vim /usr/share/doc/alsa-base/driver/ALSA-Configuration.txt.gz

Par exemple, pour le modules opl3sa2 de ma carte Yamaha, le fichier /usr/share/doc/alsa-base/driver/ALSA-Configuration.txt.gz indique :

  Module snd-opl3sa2
  ------------------

    Module for Yamaha OPL3-SA2/SA3 soundcards.

    port        - control port # for OPL3-SA chip (0x370)
    sb_port     - SB port # for OPL3-SA chip (0x220,0x240)
    wss_port    - WSS port # for OPL3-SA chip (0x530,0xe80,0xf40,0x604)
    midi_port   - port # for MPU-401 UART (0x300,0x330), -1 = disable
    fm_port     - FM port # for OPL3-SA chip (0x388), -1 = disable
    irq         - IRQ # for OPL3-SA chip (5,7,9,10)
    dma1        - first DMA # for Yamaha OPL3-SA chip (0,1,3)
    dma2        - second DMA # for Yamaha OPL3-SA chip (0,1,3), -1 = disable
    isapnp      - ISA PnP detection - 0 = disable, 1 = enable (default)

    Module supports up to 8 cards and ISA PnP. This module does not support
    autoprobe (if ISA PnP is not used) thus all ports must be specified!!!

    The power-management is supported.

Je dois donc indiquer ceci pour charger cette carte son :

sudo modprobe snd-opl3sa2 port=0x370 sb_port=0x220 wss_port=0x530 midi_port=0x330 fm_port=0x388 irq=5 dma1=0 dma2=1 isapnp=0

Les scanners SCSI sur carte ISA

Si vous utilisez un scanner SCSI branché à une carte SCSI ISA, vous vous souvenez sans doute que sous Windows, il fallait démarrer le scanner avant l'ordinateur pour qu'il soit fonctionnel.

Rien de tous ça sous GNU/Linux, si jamais vous n'allumez pas votre scanner avant l'ordinateur, il suffit de décharger les modules SCSI généraux (sg) et celui de votre carte SCSI, puis de les recharger en donnant les paramètres de votre carte SCSI.

Par exemple avec une carte SCSI AHA1505AE :

sudo rmmod sg && sudo rmmod aha152x
sudo modprobe sg && sudo modprobe aha152x io=0x340 irq=10

Vous pouvez utiliser un script nommé scanner dans votre /etc/init.d/ pour automatiser ces actions.

Exemple de script :

#!/bin/sh
 
################################################################################
#                                                                              #
# Description :                                                                #
# Ce script permet la mise en-ligne et hors-ligne à chaud d'un scanner SCSI    #
# connecté à une carte SCSI ISA.                                               #
# Celui-ci se contente de décharger, récharger ou de décharger puis recharger  #
# les modules nécessaires au fonctionnement du scanner SCSI pour               #
# respectivement mettre hors-ligne, en ligne ou réinintialiser le scanner.     #
#                                                                              #
# Il est possible que ce script puisse s'adapter pour des périphériques SCSI   #
# autres que des scanners.                                                     #
#                                                                              #
# Il s'utilise comme n'importe quel script init.d avec les arguments 'start',  #
# 'stop' ou 'restart', tout autres arguments donnant une courte aide.          #
# Le script renvoie la valeur "0" (zéro) si aucune erreur n'est rencontrée,    #
# "1" (un) sinon.                                                              #
#                                                                              #
################################################################################
 
## Variables
# $ISACARDMOD est le module noyau utilisé par votre carte SCSI ISA.
# $ISACARDARGS désigne les arguments d'I/O, d'IRQ et de DMA nécessaire au
# fonctionnement de votre carte SCSI ISA.
# $SCSIMOD designe le module SCSI nécessaire au fonctionnement de votre
# périphérique (autre que la carte SCSI ISA).
ISACARDMOD="aha152x";		# Exemple avec une carte SCSI AHA1505AE
ISACARDARGS="io=0x340 irq=10";	# Port d'I/O à 0x340 (héxa) et IRQ à 10 
SCSIMOD="sg";			# Exemple avec un scanner SCSI
 
## Fonction check
# Cette fonction vérifie la bonne exécution de la commande précédente et renvoi
# "OK" ou "Erreur" selon le cas. En cas d'erreur, on sort du script avec le
# code d'erreur "1" (un).
function check() {
	if [ $? -eq 0 ]
	then
		echo -e "\t[   OK   ]";
	else
		echo -e "\t[ Erreur ]";
		exit 1;
	fi
}
 
## Function start
# La fonction start charge le module nécessaire au périphérique SCSI puis
# celui de la carte SCSI ISA.
function start() {
	echo -ne "Chargement du/des module(s) SCSI... ";
	modprobe $SCSIMOD;
	check;
	echo -ne "Chargement du module de la carte SCSI ISA... ";
	modprobe $ISACARDMOD $ISACARDARGS;
	check;
}
 
## Function stop
# La fonction stop décharge le module nécessaire au périphérique SCSI puis
# celui de la carte SCSI ISA.
function stop() {
	echo -ne "Dechargement du/des module(s) SCSI... ";
	rmmod $ISACARDMOD;
	check;
	echo -ne "Dechargement du module de la carte SCSI ISA... ";
	rmmod $SCSIMOD;
	check;
}
 
## Function restart
# On exécute à la suite les fonctions stop puis start.
function restart() {
	stop && start;
}
 
## Section principale du programme
# Entrer start, stop ou restart comme argument pour l'utiliser, le fait
# de ne pas rentrer d'argument donne un messages d'erreur et la liste des
# arguments disponible pour son utilisation.
case "$1" in
	start)
		start && exit 0;
	;;
 
	restart)
		restart && exit 0;
 
	;;
 
	stop)
		stop && exit 0;
	;;
	*)
		echo -e "Argument invalide\n\tUtilisation : /etc/init.d/scanner start|stop|restart";
	;;	
esac;

Ainsi, l'arrêt du scanner (on décharge les modules) se fait en entrant :

sudo /etc/init.d/scanner stop

Son démarrage (on charge les modules) avec :

sudo /etc/init.d/scanner start

Et son redémarrage (on décharge puis charge les modules) avec :

sudo /etc/init.d/scanner restart
  • carte_isa.txt
  • Dernière modification: Le 10/05/2013, 12:46
  • (modification externe)