<- Copyright - Copertina - Indice ->

Articolo


Scanner USB: Un Sacco Bello!

ovvero, come configurare ed usare uno scanner USB in Linux ed essere felici

Una parola d'introduzione

Nella diffusione di Linux negli ambienti desktop assume un'importanza estremamente rilevante il supporto di periferiche e componenti "non professionali"; quelle stampanti, modem, periferiche di digitalizzazione di immagini appartenenti alla fascia bassa di prezzo. Proprio per questo motivo spesso essi sono la prima scelta nei sistemi assemblati "preconfezionati" come nell'acquisto di pezzi singoli (anche perché molti casi l'economicità non pregiudica la qualità); e sono quindi presenti nella stragrande maggioranza delle case e dei piccoli uffici. Se Linux vuole avere possibilità di diffondersi anche in questi ambienti (e oramai le potenzialità ci sono tutte), deve supportare pienamente ed in maniera semplice anche queste fasce di prodotti. Purtroppo, molto spesso questi dispositivi fanno uso di interfacce e protocolli proprietari,e altrettanto spesso le loro specifiche non vengono rese pubbliche, rendendo di fatto molto difficile o impossibile la scrittura di driver per essi da altri che non siano la casa produttrice. Ne sono purtroppo un esempio i famigerati WinModem, un vero e proprio scoglio per chi tenta di installare Linux sul PC appena comprato e scopre che (almeno per il modem!) non c'è proprio nulla da fare; un paio di produttori hanno (lodevolmente) rilasciato dei driver, ma è pur sempre una goccia nel mare... un altro campo in cui si è sempre fatta sentire la mancanza di supporto sono gli scanner con interfaccia parallela. Certo, gli scanner SCSI sono perfettamente supportati, ma i primi erano molto più diffusi tra gli utenti domestici e nei piccoli uffici per via del basso costo, a fronte di una qualità non necessariamente inferiore; purtroppo la mancanza, anche qui, di uniformità nei protocolli faceva sì che solo pochi scanner con interfaccia EPP potessero funzionare sotto Linux.

Ora le cose sono un po' cambiate: nella fascia di prezzo economica si sono sempre più diffusi gli scanner USB, che ormai costituiscono la quasi totalità dei modelli venduti. Rispetto agli scanner paralleli, garantiscono una velocità molto maggiore (il vero tallone d'achille dei modelli paralleli), una grande facilità di installazione, data anche la possibilità d'esser collegati "a caldo", senza cioè spegnere il computer; inoltre tengono libera la porta parallela, cosa non secondaria se si deve collegare una stampante e nessuno dei due dispositivi prevede una porta passante. E, meraviglia delle meraviglie, gli scanner USB sono nella stragrande maggioranza dei casi supportati da Linux! Certo, l'installazione è un po' più complessa che sotto Windows, ma non è assolutamente nulla di impossibile, a patto di avere i requisiti giusti! Questo articolo si occupa di descrivere l'installazione di uno scanner USB; viene preso come esempio un Epson Perfection 640U, ma la procedura può valere per molti altri scanner.

La procedura d'installazione si può dividere in due parti: la configurazione dei moduli USB del kernel che servono ad accedere allo scanner, e la compilazione, installazione e configurazione dei programmi che vengono usati per acquisire le immagini. Perciò, bisogna che lo scanner sia supportato in primo luogo dal kernel; in appendice c'è una lista dei modelli supportati direttamente dal 2.4.0, ma è un gioco da ragazzi "aggiungerne" altri. In secondo luogo bisogna che il software sia compatibile con lo scanner; per moltissimi modelli è già così, e per molti altri basta applicare qualche semplice accorgimento. Vedremo quindi passo per passo, partendo (quasi ;) da zero, come arrivare ad avere non solo uno scanner funzionante, ma anche una suite di programmi per l'acquisizione e la modifica delle immagini di tutto rispetto.

Configurare l'USB

Il primo passo da fare è configurare correttamente il sottosistema USB del vostro computer; ovviamente il kernel deve prevedere tale supporto. Dovete perciò avere un kernel abbastanza recente, degli ultimi della serie 2.2, 2.3 (almeno dal 2.3.25 in poi, più recente è, più stabile è, e più probabilità avete che funzioni...), o la nuova serie 2.4.x (che ho usato in questo esempio). Inoltre, i kernel "modificati" installati dalle varie distribuzioni spesso prevedono il supporto USB. Infine, se avete un kernel 2.2.14 "ufficiale", potete applicare il backporting del driver USB del kernel 2.3.39.

Una volta che l'avrete a disposizione, portatevi nella directory dei sorgenti del kernel, e avviate la vostra utilità di configurazione preferita. Aprite quindi il menu "USB Support" e selezionate le voci appropriate, ovviamente solo se non lo sono già, nel qual caso potete saltare a piè pari quanto segue.

Una noticina: verranno specificati i passaggi da seguire nel kernel 2.4.0; per altre versioni del kernel le voci potrebbero differire lievemente. Si è scelto di compilare tutti i driver come moduli; questo per efficienza ed eleganza, per non ingrandire troppo il kernel inutilmente, e perché in alcuni casi compilare tutto nel kernel (in particolare il supporto dello scanner) semplicemente non funziona, ad esempio se si devono passare dei parametri. Comunque vedremo come realizzare entrambe le soluzioni. Assumerò che sappiate qualcosa di quello che state facendo; almeno come usare un tool di configurazione del kernel e compilare i moduli; è oltre i fini di questo articolo un corso sulla compilazione del kernel. Inoltre, le successive configurazioni si riferiscono ad un sistema RedHat 7 (vedi la configurazione in appendice); altre distribuzioni potrebbero differire lievemente.

Specificate quindi "m" (Modulo) alle voci "Support for USB" (ma va? ;), "USB Scanner support" e al driver appropriato per il vostro chipset USB (UHCI, nel qual caso avete la possibilità di specificare addirittura due driver assieme, per coprire ogni configurazione, od OHCI... leggete l'help contestuale; per la maggior parte dei casi va bene specificare i due UHCI); selezionate invece "y" (anche perché "m" non si può!;) su "Preliminary USB device filesystem". Questo è molto importante, perché permette di avere le informazioni del proprio sistema USB in /proc in una forma umanamente leggibile; e ci serviranno più tardi.

Compilate ed installate i moduli (non occorre ricompilare tutto il kernel!), e riavviate o caricate a mano i moduli creati. Se avete fatto tutto per benino, dovreste poter accedere ad una cartella /proc/bus/usb contenente le informazioni sul vostro sistema USB, le periferiche connesse, eccetera. Se non è così, probabilmente il modulo non è installato: verificate con lsmod, ed eventualmente aggiungete il comando che lo carica ai vostri script di configurazione. Verificate inoltre che in /etc/modules.conf sia presente una riga simile a:

alias usb-controller usb-uhci

Ora controllate che esista un device file (in /dev) che gestisca lo scanner USB: basta dare il comando

find /dev -exec ls -l {} \;|grep "180, 48"

(facendo attenzione a lasciar due spazi dopo la virgola). Nel mio sistema è /dev/usb/scanner0, in altri può differire lievemente, ad esempio /dev/usbscanner o /dev/usbscanner0. Se non lo trovate, niente paura; basta crearlo con il comando:

mknod /dev/usbscanner0 c 180 48

fatto questo, in entrambi i casi va garantito l'accesso al device a qualsiasi utente:

chmod 666 /dev/usb/scanner0 (o il device appropriato).

Far riconoscere lo scanner

Il problema ora è che il modulo dello scanner non viene in generale caricato automaticamente; dovete farlo voi "a mano", passandogli eventualmente i parametri appropriati. Questo può essere fatto in vari modi; il passo successivo dipende quindi innanzitutto dal modello di scanner che avete. Se è compreso nella tabella in appendice, siete a cavallo: non avete bisogno di passare alcun parametro al modulo, e potete caricarlo direttamente con modprobe, come vedremo poi. Altrimenti, avete un paio di passaggi da fare. Innanzitutto dovete procurarvi i codici d'identificazione del vostro scanner; per far questo, se avete a disposizione il programma usbview, lanciatelo e cercate le righe VendorID e ProductID, che contengono le informazioni che vi servono. Se non avete questo programma, guardate nel file /proc/bus/usb/devices; ad un certo punto dovreste trovare qualcosa del tipo:

P: Vendor=04b8 ProdID=010c Rev= 0.01
S: Manufacturer=EPSON
S: Product=Perfection640

Molto bene; prendete nota dei due numeri VendorID (o Vendor) e ProductID (o ProdID), tenendo conto che sono esadecimali, quindi vanno preceduti da "0x". Ora avete due possibilità: modificare direttamente il kernel per aggiungere il supporto per il vostro scanner, e quindi caricare il modulo senza parametri; oppure passare le informazioni come parametri a modprobe. Certo, il primo modo è più elegante (e fa provare il brivido d'intervenire direttamente nel "cuore" di Linux... ;) ; più seriamente, così facendo si può compilare tutto quanto direttamente nel kernel e non preoccuparsi per i moduli; del resto potrebbe dare qualche problema nel patching, perché tutte le patch (per le nuove versioni, o per aggiungere driver) si basano sul kernel originale, e se viene cambiato... inoltre il secondo metodo è più "standard". A voi la scelta, sono entrambi molto facili.

(1) Kerneleggiare

Qui basta aprire con un qualsiasi editor di testi il file /usr/src/linux/drivers/usb/scanner.c,oppure scanner.h nelle ultime versioni, e cercare il punto dove si definiscono i vari scanner riconosciuti (ho ricavato da qui la tabella in appendice). Nelle versioni più nuove troverete i nomi ben commentati, ad esempio:

/* Table of scanners that may work with this driver */
static struct usb_device_id scanner_device_ids [] = {
        /* Acer */
        { USB_DEVICE(0x04a5, 0x2060) }, /* Prisa Acerscan 620U & 640U (!)*/
        { USB_DEVICE(0x04a5, 0x2040) }, /* Prisa AcerScan 620U (!) */
        ...

, altrimenti dovrete cercare... lanciate un "trova", ad esempio, per il simbolo 0x1606 (che è il codice della UMax),e modificate lì. In entrambi i casi, basta aggiungere alla fine della lista, o sostituire ad una voce, una riga con il Vendor ed il ProdID del vostro scanner, che avevate annotato prima. Nel caso dell'esempio, quindi, è sufficiente aggiungere:

        { USB_DEVICE(0x04b8, 0x010c) }, /* Perfection 640U */

Ora salvate, e ricompilate i moduli od il kernel come fareste normalmente.

(2) Moduleggiare

Il modulo scanner.o accetta due parametri, vendor e product. Vanno qui specificati (sorpresa!;) i parametri che avevate annotato prima. Quindi, per caricare il modulo andrà dato, nel nostro esempio:

modprobe scanner vendor=0x04b8 product=0x010c

...e tutto (incrociamo varie dita) funzionerà. Ma siccome rispecificare il tutto ogni volta è quantomeno noioso, si può aggiungere una riga con questi parametri alla fine di /etc/modules.conf; ad esempio:

options scanner vendor=0x04b8 product=0x010c

Vabbè, comunque

Scelta la vostra strada, ora carichiamo il modulo. Nel primo caso, e nel secondo se avete modificato modules.conf, daremo semplicemente:

modprobe -k scanner

ed un semplice lsmod confermerà l'avvenuto caricamento (reincrociamo quelle stesse dita). Ora, è scomodo dare questo comando ogni volta che vogliamo usare lo scanner; molto meglio inserirlo nel file di avvio appropriato, in modo che Linux lo carichi automaticamente. In RH7 è sufficiente, ad esempio, aggiungere una linea contenente il comando alla fine di /etc/rc.d/rc.local.

A questo punto la configurazione vera e propria dell'hardware è terminata; per verificare che tutto funzioni, riavviate e date il comando:

dd if=/dev/null of=/dev/usb/scanner0 count=1 (ovviamente specificando il device appropriato!)

Se non dà errori, complimenti, ce l'avete fatta!! :)

Ed ora, il software!

Chi ha ben cominciato, ora è alla metà dell'opera...

Ora il nostro sistema Linux può accedere correttamente allo scanner. Questo è bellissimo, ma ancora non vuol dire che lo possiamo usare... infatti non abbiamo ancora installato nulla con cui effettuare la scansione, né alcun programma che ci permetta di salvare o utilizzare in altro modo i dati acquisiti. Vediamo quindi come installare e configurare Sane (il "motore" di acquisizione di immagini per eccellenza in Linux), XSane (un ottimo frontend grafico per GTK+) e GIMP (come esempio di applicativo per "utilizzare" le immagini). Ovviamente, ci sono molti altri programmi disponibili che si appoggiano su Sane, tra cui QuiteInsane, un frontend per librerie QT. Per una lista completa, vedere le pagine relative (dei frontend e dei progetti correlati) nel sito di Sane.

Sane

Sane (Scanner Access Now Easy) è un programma che si occupa di fornire un'interfaccia tra il software e le periferiche di acquisizione immagini, come scanner o webcam; un po' come un driver TWAIN in Windows, insomma. Dalla versione 1.0.4 (l'attuale) consiste di due pacchetti separati, uno contenente il backend (le librerie, più un'utility di scansione a linea di comando ed un demone per l'utilizzo in rete) ed uno il frontend (xscanimage, un'utility grafica per la scansione basata sulle GTK+). Ci occuperemo qui solo del backend, perché il frontend, oltre ad essere di banale compilazione, è abbastanza inutile, supporta un solo formato grafico (PNM) e può essere tranquillamente sostituito (e superato) da XSane, che vedremo poi.

Il pacchetto backend di Sane contiene diversi driver per le diverse case produttrici di scanner (e non solo, anche webcam, ad esempio); il problema è che non sempre questi driver sono aggiornati all'ultima versione sviluppata, e se avete uno scanner recente, o semplicemente non supportato, potreste dovervi scaricare le versioni più aggiornate. Ci sono una serie di progetti che si occupano di portare avanti lo sviluppo dei vari backend; nella lista dei backend sul sito di Sane potete trovare un elenco di tutti i dispositivi supportati, e, nella prima colonna, il sito da cui scaricare la versione dei driver più aggiornata.

Continueremo a trattare l'esempio dell'Epson Perfection 640U: per gli altri scanner la procedura è molto simile. In questo caso possiamo scaricare il driver direttamente dal sito del progetto Epson-sane; il download è davvero veloce, essendo un file molto piccolo.

Scompattiamo da qualche parte il pacchetto di Sane, ed all'interno della directory creata il pacchetto dei driver Epson: quest'ultimo contiene tre file, epson.c, epson.h e epson.conf, che andranno a sostituire quelli già presenti nella sottodirectory backend.

tar xzf <path>/sane-backends-1.0.4.tar.gz
cd sane-backends-1.0.4

tar xzf <path>/sane-epson-xxxxxxxx.tar.gz

A questo punto compiliamo normalmente il tutto; non occorrono opzioni particolari a ./configure, ma sarebbe meglio specificare un prefisso standard, quello che si utilizza di solito; ad esempio /usr:

./configure --prefix=/usr
make
make install

ora, dobbiamo dire a Sane che abbiamo uno scanner USB corrispondente ad un certo device; ricordatevi qual'era (nell'esempio più sopra /dev/usb/scanner0) e modificate il file /usr/etc/sane/epson.conf (ovviamente la collocazione dipende dal prefisso sotto cui avete installato Sane, ed il file dal produttore del vostro scanner), lasciando solo l'ultima riga, quella che comincia con usb, commentando tutte le altre con "#", e specificando quel device; per esempio:

# here are examples for how to configure...
# option color_correction 1 2 3 4 5 6 7 8 9
#
#pio 0x278
#pio 0x378
#pio 0x3BC
#scsi EPSON
# /dev/scanner
usb /dev/usb/scanner0

Fatto questo, dovrebbe essere tutto a posto. Provate a lanciare

scanimage -L

e dovreste esser gratificati con un messaggio di Sane che vi dice che scanner avete. Tanto lo sapete già, ma è carino da parte sua, no? :) Ed in più, così siete sicuri che tutto funzioni...

XSane

Lo scanimage che viene fornito col backend di Sane è un programma molto completo, ma come tutti i programmi da riga di comando non è eccessivamente amichevole... esiste un frontend grafico per GTK+, XSane, che semplifica di molto la vita, fornendo un'interfaccia grafica potente ed intuitiva; per di più, esso può essere usato come plug-in per GIMP, a formare una suite di acquisizione e trattamento delle immagini che non ha nulla da invidiare a concorrenti più famosi... l'installazione è banalissima; semplicemente scompattate il pacchetto, portatevi nella directory creata e date i soliti

./configure --prefix=/usr
make
make install

badando bene che se il prefisso è diverso da quello usato nella compilazione di Sane, configure potrebbe non trovarlo; il suo prefisso va perciò specificato con l'opzione

./configure --with-sane-prefix=quelcheè

La finestra principale di XSane e quella di anteprima:

  

Nota bene: XSane non va usato come utente root!! Se ci provate, verrete abbondantemente avvertiti dei rischi che correte... ;)

XSane, XScanImage e GIMP

Se si ha una versione ragionevolmente recente di GIMP installata (almeno la 1.0.4), XSane verrà compilato per poter essere utilizzato anche come plug-in; in questo caso basta fare un link simbolico dell'eseguibile di XSane nella cartella dei plugin di GIMP.

Ad esempio, se quest'ultima directory è /usr/lib/gimp/1.2/plug-ins e XSane è installato in /usr/bin, basta dare:

ln -s /usr/bin/xsane /usr/lib/gimp/1.2/plug-ins/

e il gioco è fatto!

Ora, aprite GIMP, ed andate nel menu File->Acquisizione; oltre al consueto comando per "scattare istantanee" dello schermo, ora compare un'altra voce, relativa appunto a XSane. Selezionandola, si avvia XSane in modalità plug-in; al posto di salvare in un file, il programma ora manderà l'output direttamente a GIMP. Funzionale, no? :)

Lo stesso procedimento, se avete preferito installare il pacchetto frontends di Sane, o se avete una versione più vecchia, si può applicare a XScanImage, sempre che sia compilato in modalità plugin: create un link, e il plugin sarà nel menu Xtns->Acquire Image.

Convivere con un package manager

I procedimenti finora usati si basano sulla compilazione di pacchetti Tar, per ovvi motivi; infatti, i package manager come RPM e Deb permettono di lavorare con i sorgenti in maniera molto limitata. Del resto hanno l'indubbio vantaggio di mantenere il sistema più ordinato e permettere una disinstallazione veloce, ed i "puristi" del package manager potrebbero storcere il naso a pensare di installare software in maniera così disordinata... ;)

Del resto, prendendo il caso di RPM, attuare il procedimento descritto per aggiungere il supporto agli scanner non direttamente supportati da Sane vorrebbe dire per prima cosa trovare l'RPM sorgente, decomporlo, decompattare l'archivio dei sorgenti, "patchare" i sorgenti, ricomporre tutto e compilare l'archivio binario, tutte cose non tanto semplice... in realtà, cambiando l'approccio, c'è un modo molto più lineare per cambiare le cose... è infatti sufficiente cambiare i driver già compilati, e tutto funziona!

Se quindi abbiamo un sistema in cui è già installata una versione discretamente recente di Sane (al limite ci si scarica l'RPM binario e lo si installa), basta procurarsi il corrispondente pacchetto sorgente, sostituire i file sorgenti delle librerie "vecchie" come visto prima, e compilare il tutto in modo che si installi in una directory temporanea di nostra scelta; da lì poi si prenderanno solo le librerie "modificate" e le si sostituiranno alle loro controparti obsolete... basterà quindi seguire lo stesso procedimento visto nel resto dell'articolo, e avremo un sistema funzionante ed ancora completamente sotto il controllo del package manager, poiché non avremo aggiunto né tolto alcun file.

Un esempio val più di mille parole... prendiamo quindi un sistema RedHat 7 (casualità, ne ho uno sottomano... ;), che usa package manager RPM. Tale sistema installa di default Sane 1.0.3; procuriamoci pertanto il relativo pacchetto sorgente, sane-1.0.3.tar.gz, e applichiamoci le patch, sempre nel caso del "solito" Epson. La versione 1.0.3, dal punto di vista del procedimento trattato in quest'articolo, è analoga all'1.0.4, anche se consiste di un'archivio unico.

tar xzf sane-1.0.3.tar.gz
cd sane-1.0.3.tar.gz
tar xzf Epson-backend-xxxxxxxx.tar.gz

a questo punto creiamo una cartella temporanea in cui compileremo ed installeremo il programma:

mkdir tempinst
./configure --prefix=/root/sane-1.0.3/tempinst
make
make install

noterete che l'argomento di --prefix è un path assoluto, e nel nostro esempio l'utente (e la relativa directory home) è root. Ora, nella directory tempinst, avremo tutti i file che sarebbero stati installati nel sistema. Quelli che ci interessano sono i 4 file relativi a epson contenuti in lib/sane/; essi vanno sostituiti ai corrispondenti già presenti nel sistema. Una semplice ricerca (qualcosa tipo find /|grep libsane-epson) ci dirà dove sono; nel nostro caso, in /usr/lib/sane. Basterà quindi sostituirli:

cp tempinst/lib/sane/libsane-epson.* /usr/lib/sane/

Infine, modificare il file di configurazione (che nell'esempio si trova in /etc/sane nel modo visto prima. Ed il gioco è fatto. Semplice, no? :) Un procedimento analogo si può applicare per ovviare al fatto che XSane nei pacchetti RPM generalmente non è compilato in modalità GIMP-compatibile.

Concludendo...

Ecco qui! In un'oretta scarsa (...e con tanti tempi morti di compilazione in cui prendersi un caffè! ;) abbiamo installato uno scanner USB in Linux, con tutto il software di cui potremmo mai aver bisogno... non è stato poi tanto difficile! A dimostrare che, a patto di avere un po' di spirito di esplorazione, la configurazione di Linux è tutt'altro che un lavoro da guru... :)

di Mano


Appendice 1

Scanner USB supportati nativamente dal kernel

La seguente tabella si riferisce alla versione dell'USB contenuta nel kernel 2.4.0; versioni precedenti o successive possono differire. Se lo scanner posseduto è presente, vuol dire che come minimo il 2.4.0 lo supporta direttamente. Se non lo è, poco male: nell'articolo è descritto come estendere il supporto! Comunque, l'elenco si trova nel file /usr/src/linux/drivers/usb/scanner.c. Nota che questo elenco riguarda il kernel, non necessariamente Sane! Per quest'ultimo, vedere l'apposita tabella sul sito.

Acer Prisa Acerscan 620U Microtek ScanMaker V6USL/V6UL
  Prisa AcerScan 640U Mustek 600 CU
  Vuego Scan Prisa 340U   BearPaw 1200
Agfa SnapScan 1212U   1200 CU
  SnapScan 1236U   1200 UB
  SnapScan Touch   1200 USB
Epson/Seiko Perfection 610 Primax G2-300
  Perfection 636U - 636Photo   G2-600
  Perfection 1200U - 1200Photo   G2E-300
  Stylus Scan 2500   G2E-600
  Expression 1600   ReadyScan 636i
Genius ColorPage-Vivid Pro   Colorado USB 9600
HP 3300C   Colorado USB 19200
  4100C   Colorado 600u
  4200C   Colorado 1200u
  5200C UMax Astra 1220U
  5300C   Astra 2000U
  6200C   Astra 2200U
  6300C Visioneer OneTouch 5300
  PhotoSmart S20   OneTouch 6100 USB
iVina 1200U   OneTouch 6200 USB
Microtek ScanMaker X6 - X6U   OneTouch 7600 USB
  Phantom 336CX - C3   OneTouch 8100 EPP/USB
  Phantom C6   OneTouch 8600 EPP/USB

Nota bene: alla versione 2.4.5 del kernel sono presenti molti scanner in più; consultare il file scanner.h come descritto nell'articolo per una lista completa. Inoltre, gli scanner Microtek non sono più supportati in questo modo, essendo prevista una apposita voce nella configurazione del kernel. Maggiori dettagli nella documentazione del kernel stesso.


Appendice 2

Configurazione del sistema usato

Questa può servire per avere indicazioni sulle differenze tra l'ambiente in cui il procedimento è stato realizzato ed il proprio, per farsi un'idea dei motivi che possono portare ad incontrare problemi, e delle strade per risolverli.

Versioni del software utilizzato testate in questo ambiente:


<- Copyright - Copertina - Indice ->