<- Copyright - Copertina - Indice -> |
Articolo
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.
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).
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.
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.
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
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!! :)
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 (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...
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... ;)
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
.
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.
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
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.
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.
usb-uhci.o
)Versioni del software utilizzato testate in questo ambiente:
<- Copyright - Copertina - Indice -> |