Comment utiliser au mieux un scanner Umax ou Mustek

Michel Billaud, Arnaud Gomes-do-Vale et Olivier Tharan

Avril 1999


Ce document aux possesseurs des scanners nommés ci-dessus, il explique surtout comment les utiliser avec les cartes SCSI fournies. Il a été réalisé par Olivier Tharan et Michel Billaud après une discussion technique sur le groupe Usenet fr.comp.os.linux.configuration, pour la partie Umax. Arnaud Gomes-do-Vale nous a mis sur la piste du pilote et a donné les informations sur le scanner Mustek. N'hésitez pas à nous envoyer tous vos commentaires pour améliorer ce document. Ce document pourra intéresser d'autres possesseurs de scanners, voir l'explication sur la carte d'interface ci-dessous.

1. La carte d'interface

Les scanners Umax Astra 610S et 1200S sont livrés avec une carte d'interface ISA SCSI fournissant une sortie externe 25 broches. Cette carte est a priori destinée exclusivement à recevoir le scanner avec lequel elle a été livrée, et de toute façon elle ne risque pas de servir à grand chose d'autre !

Cette carte est munie d'une puce Domex 436P (c'est écrit en gros sur la plus grosse puce de la carte), et ne dépasse pas 2 cm de haut. Elle n'utilise pas d'IRQ, ce qui la rend difficile d'utilisation avec un autre matériel : en effet, pendant son utilisation, le processeur passera une bonne partie de son temps à obtenir des informations de la carte et n'aura pas de temps à consacrer à d'autres tâches tout aussi importantes (la machine sera monopolisée pendant l'utilisation du scanner).

Cette carte semble très répandue dans le milieu des fabricants de scanner, notamment le Mustek SE12000SP ; les fabricants Relisys, Avision, Epson, HP, IBM et Mustek utilisent cette carte en version OEM pour leurs produits. Voir http://support.umax.co.uk/technotes/f096B.htm pour plus d'informations sur cette carte par Umax, qu'ils appellent "UDS-IS-11 SCSI Controller Card". Ceci est la raison pour laquelle ce document pourra intéresser d'autres possesseurs de scanners :-)

En effet, les conseils prodigués ici sont les mêmes pour le scanner Mustek 600 II CD (alias II sp), sauf que par défaut il scanne en noir et blanc à 20 dpi.

L'avantage de pouvoir utiliser cette carte sous Linux est que vous n'aurez pas besoin d'acheter une autre carte SCSI si vous n'en avez pas encore, ou bien de laisser le scanner sur une chaine SCSI séparée afin de limiter le phénomène de "monopolisation".

Sur cette carte il y a deux jumpers : JP1, position PnP (ouvert), PnR (fermé), chez moi le jumper est fermé par soudure ; et JP2, position 0WS (zero-wait state, ouvert d'origine), 1WS (1-wait state, fermé). A priori, laisser les jumpers sur leurs positions d'origine ne fait pas de mal.

Pour ceux qui veulent utiliser ce scanner avec une autre carte, vérifier la compatibilité sur http://support.umax.co.uk/, et plus précisément à http://support.umax.co.uk/technotes/f109B.htm ; par exemple, l'Adaptec 2920 ne convient pas.

2. Ajout d'un pilote au noyau

La carte d'interface est reconnue comme une DTC 3181e par le noyau ; elle utilise le pilote générique NCR5380, qui est inclus en module sur les disquettes de démarrage de la RedHat et de la Debian. Il vous faudra peut-être toutefois recompiler votre noyau pour inclure ce pilote. Voir à ce sujet le Kernel-HOWTO, ou faites-vous aider par un ami qui s'y connait.

2.1 Noyau 2.0.x

Noyau 2.0.x (2.0.34 sur l'exemple donné) : il faut patcher le noyau avec le patch mustek-scsi-patch-0.5, que l'on trouve sur ftp://ftp.mostang.com/pub/sane/ et suivre les explications données. En effet, le support de cette carte ne date que du noyau 2.2. Un conseil : passez en 2.2 !

2.2 Noyau 2.2.x

Le pilote NCR5380 est inclus dans le noyau 2.2 ; pour les noyaux 2.2.5 et précédents, il faut patcher légèrement le fichier drivers/scsi/NCR5380.c avec ce qui suit (ou le récupérer à http://www.linuxhq.com/lnxlists/linux-kernel/lk_9903_05/msg00442.html et modifier la ligne 703 en conséquence) :

--- ../linux.vanilla/drivers/scsi/NCR5380.c     Tue Dec 22 23:19:48 1998
+++ drivers/scsi/NCR5380.c      Wed Mar 31 14:51:07 1999
@@ -569,10 +569,6 @@
        if (!main_running) {
                main_running = 1;
                NCR5380_main();
-               /* 
-                * main_running is cleared in NCR5380_main once it can't do 
-                * more work, and NCR5380_main exits with interrupts disabled.
-                */
        }
        restore_flags(flags);
 }
@@ -702,7 +698,9 @@
        }
        restore_flags(flags);
 
+       spin_lock_irqsave(&io_request_lock, flags);
        run_main();
+       spin_unlock_irqrestore(&io_request_lock, flags);
 }
 #endif                         /* def USLEEP */
 
@@ -1266,6 +1264,7 @@
        struct Scsi_Host *instance;
        struct NCR5380_hostdata *hostdata;
        int done;
+       unsigned long flags;
 
        /*
         * We run (with interrupts disabled) until we're sure that none of 
@@ -1279,14 +1278,16 @@
         * this should prevent any race conditions.
         */
 
+       spin_unlock_irq(&io_request_lock);
+       
+       save_flags(flags);
+       
        do {
                cli();          /* Freeze request queues */
                done = 1;
                for (instance = first_instance; instance &&
                     instance->hostt == the_template; instance = instance->next) {
-                       unsigned long flags;
                         hostdata = (struct NCR5380_hostdata *) instance->hostdata;
-                        save_flags(flags);
                         cli();
 #ifdef USLEEP
                        if (!hostdata->connected && !hostdata->selecting) {
@@ -1365,8 +1366,6 @@
                                                             TAG_NEXT)) {
                                                        break;
                                                } else {
-                                                       unsigned long flags;
-                                                       save_flags(flags);
                                                        cli();
                                                        LIST(tmp, hostdata->issue_queue);
                                                        tmp->host_scribble = (unsigned char *)
@@ -1393,14 +1392,12 @@
                                }
                                else
                                {
-                                       unsigned long flags;
                                        /* RvC: device failed, so we wait a long time
                                        this is needed for Mustek scanners, that
                                        do not respond to commands immediately
                                        after a scan */
                                        printk(KERN_DEBUG "scsi%d: device %d did not respond in time\n",
                                                instance->host_no, tmp->target);
-                                       save_flags(flags);
                                        cli();
                                        LIST(tmp, hostdata->issue_queue);
                                        tmp->host_scribble = (unsigned char *) hostdata->issue_queue;
@@ -1434,6 +1431,7 @@
                                break;
                }               /* for instance */
        } while (!done);
+       spin_lock_irq(&io_request_lock);
        cli();
        main_running = 0;
 }

Gageons que ce patch finira dans les sources des noyaux ultérieurs.

2.3 configuration du noyau

Il faut choisir le support pour les cartes NCR5380 (Generic NCR5380/53c400 SCSI support) ; j'ai coché la case suivante "Enable NCR53c400 extensions", bien qu'elle ne me semble pas nécessaire dans ce cas ; J'ai ensuite choisi "Port" dans la case suivante "NCR5380/53c400 mapping method" (et non "Memory").

SCSI support <M>
SCSI generic support <M>
SCSI low-level drivers -->
    Generic NCR5380/53c400 SCSI support <M>
        Enable NCR53c400 extensions <Y>
        NCR5380/53c400 mapping method (Port)

Configurez le reste du noyau à votre idée, compilez, salez, poivrez, c'est près. N'oubliez pas le support SCSI générique (sg) pour pouvoir utiliser votre scanner avec Sane. Pour charger le pilote, deux solutions s'offrent à vous selon que vous avez compilé le pilote en module ou en dur dans le noyau.

Compilation en module

C'est la solution la plus intéressante, surtout si vous ne vous servez pas souvent de votre scanner, ou si vous avez une carte SCSI qui doit être absolument détectée en premier. La ligne de commande est alors :

modprobe g_NCR5380 ncr_addr=0x240 dtc_3181e=1

Vous pouvez aussi modifier /etc/conf.modules pour y ajouter la ligne :

options g_NCR5380 ncr_addr=0x240 dtc_3181e=1

L'adresse 0x240 peut être différente chez vous. Chez nous trois, c'était la bonne, mais Arnaud a entendu parler de cartes similaires utilisant le port 0x2c0. Pour le savoir, il faut lancer le programme SETUP de la disquette de pilotes sous DOS. Chez moi, ça a fonctionné comme cela sans que je doive regarder l'adresse.

En ce qui concerne l'IRQ, comme il n'y en a pas, on peut ne rien mettre ou ajouter ce paramètre : ncr_irq=255.

Si vous ne voulez ou ne pouvez pas regarder sous DOS, il vous faudra tester les adresses les unes après les autres, mais cela risque de vous faire planter la machine (un beau Oops) et vous devrez rebooter.

Normalement, une série de messages indiquant le chargement du pilote devrait apparaître à l'écran :

scsi1 : interrupts not enabled. for better interactive performance,
scsi1 : please jumper the board for a free IRQ.
scsi1 : at port 0x240 interrupts disabled options CAN_QUEUE=16  CMD_PER_LUN=2 re
lease=1 generic options AUTOPROBE_IRQ AUTOSENSE PSEUDO DMA USLEEP, USLEEP_POLL=1
 USLEEP_SLEEP=20 generic release=7
scsi1 : Generic NCR5380/53C400 Driver
scsi : 2 hosts.
  Vendor: SCANNER   Model:                   Rev: 2.02
  Type:   Scanner                            ANSI SCSI revision: 01 CCS
Detected scsi generic sgb at scsi1, channel 0, id 6, lun 0

Si ce n'est pas le cas, le port E/S de votre carte doit être déjà utilisé par un autre périphérique. Vous devrez alors configurer le périphérique fautif différemment ; reconfigurer la carte SCSI elle-même semble impossible.

Compilation en dur

Il faudra peut-être passer des options à LILO, telles que dtc_3181e=0x240,0 (à vérifier).

Si vous avez compilé le support de la carte en module, mais le support SCSI générique en dur comme moi, l'ajout de la carte SCSI ne fera pas détecter le scanner. Il faut alors connaître le numéro ID de votre scanner (chez moi c'est 3), et lancer la commande suivante :

echo "scsi add-single-device 0 0 3 0" > /proc/scsi/scsi

Je suppose alors que la carte SCSI est seule, sinon remplacer le premier 0 par un 1, si c'est la deuxième carte. Remplacer le chiffre 3 (en troisième position) par le numéro ID de votre scanner.

Nous verrons ci-dessous une méthode pour automatiser cette étape.

3. Compilation de SANE

L'installation du paquet RPM ou .deb de Sane ne devrait pas poser de problèmes particuliers, mais dans certains cas vous voudrez recompiler Sane vous-même. Par exemple, Debian 2.1 livre Sane 0.74, alors que la version 1 est sortie récemment.

La compilation de Sane 1.00 ne se passe pas très bien, selon Michel :

  1. Il y a des erreurs dans le source du "backend" abaton. La cause vient peut-être du compilateur utilisé [ gcc version egcs-2.90.29 980515 (egcs-1.0.3 release) ]. Le remède : virer abaton de la liste des modules à compiler (voir dans backend/Makefile[.in]).
  2. Une erreur connue : la compilation se met à bouffer toute la mémoire. Le remède : lancer la compilation sans optimisation avec
    make CFLAGS="-O1 -g"
    

4. Utilisation du scanner

L'utilisateur du scanner doit affronter un terrible dilemme[1] :

[1] Ok, j'exagère un peu ;-)

Solution proposée :

4.1 Le programme razscan.c

Les sources sont données ci-dessous. À faire :

Comment déterminer les bons paramètres

Allumer le scanner, attendre qu'il soit prêt et lancer les deux commandes :

/sbin/modprobe g_NCR5380 ncr_addr=0x240 dtc_3181e=1 
/sbin/modprobe sg

Regarder dans /proc/scsi/scsi, tout y est :

bash# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 05 Lun: 00
          *          **     **      **
  Vendor: UMAX     Model: Astra 1220S      Rev: V1.3
  Type:   Scanner                          ANSI SCSI revision: 02
bash#

Pour confirmer ceci, l'utilitaire find-scanner de Sane devrait vous donner les mêmes informations :

arnaud@carrosse:~ > find-scanner 
# You may want to run this program as super-user to find all devices.
# Once you found the scanner devices, be sure to adjust access
# permissions as necessary.

find-scanner: found scanner "SCANNER  2.02" at device /dev/scanner
find-scanner: found scanner "SCANNER  2.02" at device /dev/sgb

Source de razscan.c

main()
{
  FILE * f;
  f = fopen("/proc/scsi/scsi","w");
  if(f == NULL) {
    perror("ouverture");
    exit(1);
  };                                                                            
  fprintf(f,"scsi add-single-device %d %d %d %d\n",
          HOST,CHANNEL,ID,LUN);
  fclose(f);
  exit(0);
}

Makefile associé :

DEST=/usr/local/bin

razscan: razscan.c

install: razscan
        cp razscan ${DEST}
        chown root ${DEST}/razscan
        chmod +s   ${DEST}/razscan

Mise en place

Après avoir modifié les paramètres du programme, le compiler :

gcc -o razscan razscan.c

lui donner les droits qui vont bien :

chown root razscan
chmod +s razscan

et le placer dans un endroit stratégique :

cp razscan /usr/local/bin

Utilisation

On peut imaginer des séquences du type :

        while " [ -z  "`grep UMAX /proc/scsi/scsi`" ]
        do
                echo "allumez le scanner et tapez retour"
                echo "quand la lampe cesse de clignoter"
                read
                /usr/local/bin/razscan
        done

5. Utilisation de SANE

La partie la plus intéressante commence : pour lancer un scan une fois le scanner allumé et reconnu, faire :

scanimage umax:/dev/scanner > /tmp/mapage

Conseil : rediriger plutôt sur un convertisseur ppm -> gif ou autre (par exemple, netpbm, ImageMagick ou cjpeg), les fichiers ppm sont énormes. Par exemple :

Vous pouvez aussi utiliser xscanimage sous X, directement ou depuis The Gimp.

scanimage umax:/dev/scanner | cjpeg > mapage.jpg

6. Problèmes

Le SE 12000SP fonctionne à peu près correctement avec Sane, mais deux gros problèmes subsistent :

7. Références

Les pilotes DOS et Windows de la carte SCSI sont disponibles en téléchargement sur le site de Domex.

Si vous ne savez pas recompiler votre noyau, consultez les HOWTOs, notamment le Kernel-HOWTO, le Modules-HOWTO et le SCSI-HOWTO.

Le site de Sane se trouve à l'adresse http://www.mostang.com/sane/.

Vous pouvez aussi consulter les sites de The Gimp et GTK+.