4. I dispositivi di stampa del kernel

Ci sono due driver di dispositivo completamente diversi per la porta parallela; quello usato dipende dalla versione del kernel (che si può scoprire con il comando uname -a). Il driver è cambiato da Linux 2.1.33; essenzialmente tutti i sistemi recenti usano il kernel 2.2 o successivi, quindi probabilmente si vorrà passare alla sezione sul driver parport.

Alcuni dettagli sono uguali per i due tipi di driver. In particolare, molti utenti hanno notato che Linux non riconosce la porta parallela a meno che non venga disabilitata l'opzione "Plug and Play" dal BIOS. (Non è una sorpresa; la storia del PNP dei dispositivi non-PCI con Windows e dintorni è praticamente un disastro).

4.1. Il dispositivo lp (kernel <=2.1.32)

Il kernel di Linux (<=2.1.32), dando per scontato che sia stato compilato o caricato il dispositivo lp (il risultato di cat /proc/devices dovrebbe includere il dispositivo lp), fornisce uno o più dispositivi /dev/lp0, /dev/lp1 e /dev/lp2. Questi NON sono assegnati dinamicamente, ma corrispondono ad uno specifico indirizzo di I/O hardware. Ciò significa che la stampante potrebbe essere lp0 o lp1, a seconda della configurazione hardware del sistema: vanno provati entrambi.

Alcuni utenti riferiscono che la porta lp bidirezionale non viene riconosciuta se si usa un vecchio cavo per stampanti unidirezionale. Si controlli di usare un cavo decente.

Non è possibile eseguire contemporaneamente i driver plip e lp su una data porta (sotto 2.0, in ogni caso). È possibile comunque caricare l'uno o l'altro driver, sia manualmente che automaticamente dal kerneld dei kernel versione 2.x (e le ultime 1.3.x). Configurando adeguatamente gli interrupt e simili, dovrebbe essere possibile eseguire plip su una porta ed lp su un'altra. Qualcuno è riuscito a farlo modificando il codice dei driver; si spera che qualcun altro riesca a farlo direttamente dalla linea di comando.

C'è una piccola utilità chiamata tunelp con la quale è possibile, da root, mettere a punto l'uso degli interrupt del dispositivo lp di Linux 2.0, la frequenza dei sondaggi e altri parametri.

Quando il driver lp è compilato nel kernel, si può usare l'opzione lp= per impostare gli interrupt e gli indirizzi di IO:


Quando il driver lp è compilato nel kernel, si può usare la linea di
comando di LILO/LOADLIN per passare al driver gli indirizzi delle porte e gli
interrupt che userà.

Sintassi:	lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]

Ad esempio:	lp=0x378,0   oppure   lp=0x278,5,0x378,7 **

Si noti che se si usa questa tecnica, si devono specificare *tutte* le porte che
devono essere considerate, non esistono parametri predefiniti. Si può
disabilitare un driver con lp=0.

Quando il driver viene caricato come modulo, è possibile specificare gli indirizzi di I/O e gli interrupt nella linea di comando di insmod (oppure in /etc/conf.modules per influenzare kerneld) usando la solita sintassi. I parametri sono io=port0,port1,port2 e irq= irq0,irq1,irq2. Si consulti la pagina di manuale di insmod per ulteriori informazioni.

**Per chi non riesca a ricordare gli indirizzi standard quando servono, sono quelli del secondo esempio. L'altra porta (lp0) si trova a 0x3bc. Non ho idea di quali interrupt usi.

Il codice sorgente del driver della porta parallela in Linux 2.0 è in /usr/src/linux/drivers/char/lp.c.

4.2. Il dispositivo parport (kernel >= 2.1.33)

A partire dal kernel 2.1.33 (e a disposizione come patch per il kernel 2.0.30), il dispositivo lp è soltanto un client del nuovo dispositivo parport. L'aggiunta del dispositivo parport corregge alcuni dei problemi che assillavano il driver del vecchio dispositivo lp - può condividere la porta con altri driver, assegna dinamicamente le porte parallele disponibili a numeri di dispositivo piuttosto che far rispettare un accordo fisso tra gli indirizzi I/O e i numeri delle porte, e così via.

L'avvento del dispositivo parport ha permesso la prolificazione di nuovi driver per le porte parallele per cose come dischi Zip, dischi e CD-Rom Backpack e così via. Alcuni di questi sono disponibili anche per i kernel 2.0; si cerchi sul web.

La differenza principale che si noterà, per quanto riguarda la stampa, è che i kernel basati su parport assegnano dinamicamente i dispositivi lp alle porte parallele. Così, quello che era lp1 sotto Linux 2.0 potrebbe essere lp0 sotto Linux 2.2: se si effettua un aggiornamento da un kernel con driver lp ad uno con driver parport bisognerà assicurarsi di verificarlo.

I problemi più comuni di questo dispositivo sembrano derivare da una configurazione errata:

La distribuzione

Alcune distribuzioni GNU/Linux non sono equipaggiate con un file /etc/modules.conf (o /etc/conf.modules) ben configurato, così il driver non viene caricato correttamente quando ce n'è bisogno. Con un modutils recente, le righe corrette per modules.conf sembrano essere:


alias /dev/printers lp             # solo per devfs?
alias /dev/lp*      lp             # solo per devfs?
alias parport_lowlevel parport_pc  # mancante in Red Hat 6.0-6.1

Il Bios

Molti Bios trasformano la porta parallela in un dispositivo Plug-and-Play, il che aggiunge inutilmente complessità ad un dispositivo estremamente semplice che è quasi sempre presente; se la porta parallela non è riconosciuta dal driver Linux, si disattivi l'impostazione PnP per la porta parallela ("LPT1" in molti Bios). L'impostazione corretta spesso si chiama "legacy", "ISA", o "0x378", ma probabilmente non "disabilitata".

Si può anche leggere la documentazione parport dai sorgenti del kernel, o cercare il sito web di parport.

4.3. Dispositivi seriali

I dispositivi seriali vengono solitamente identificati come /dev/ttyS1 e simili sotto Linux. L'utilità stty permette di vedere e modificare in modo interattivo le impostazioni per una porta seriale; setserial permette di controllare alcuni parametri estesi e di configurare gli interrupt e gli indirizzi di I/O per porte non standard. Ulteriori informazioni sulle porte seriali sotto Linux possono essere trovate nel Serial-HOWTO .

Usando una stampante seriale lenta con il controllo di flusso, ci si accorgerà che alcuni dei lavori di stampa vengono tagliati. Questo potrebbe essere dovuto alla porta seriale, il cui comportamento predefinito è di eliminare ogni carattere non trasmesso dal buffer entro 30 secondi dalla chiusura della porta del dispositivo. Il buffer può trattenere fino a 4096 caratteri, e se la stampante usa il controllo di flusso ed è troppo lenta per poter accettare tutti i dati dal buffer entro 30 secondi dalla chiusura della porta seriale, la fine del contenuto del buffer verrà persa. Se il comando cat file > /dev/ttyS2 produce un tabulato completo per file brevi ma uno tagliato per quelli più lunghi, potreste essere in queste condizioni.

Il problema dell'intervallo di 30 secondi può essere sistemato attraverso l'opzione a linea di comando di setserial "closing_wait" (versioni 2.12 e successive). Le porte seriali di una macchina solitamente sono inizializzate da una chiamata a setserial tramite il file di avvio rc.serial. La chiamata per la porta seriale della stampante può essere modificata perché imposti il closing_wait nello stesso momento in cui imposta gli altri parametri della porta.

4.4. Dispositivi USB

4.4.1. USB 1.1

Linux supporta la tecnologia USB piuttosto bene. USB dovrebbe funzionare con gli ultimi kernel 2.2, e con ogni kernel 2.4 o successivo. Naturalmente sarà necessario il supporto nel kernel per USB, o compilato o attraverso un modulo (raccomandato).

Con un kernel modulare sarà necessario caricare i seguenti moduli:

  • usb-core.o

  • usb-uhci.o oppure uhci.o oppure usb-ohci.o

  • printer.o

A seconda del tipo di scheda madre o adattatore che si possiede, sarà necessario uno tra usb-uhci.o oppure uhci.o oppure usb-ohci.o. Le schede madri Intel e Via, e gli adattatori basati su Via sono UHCI (si può usare sia ush-uhci.o che uhci.o). Si può scoprire quale tipo di HCI (Host Controller Interface - Interfaccia di Controllo dell'Host) si possiede usando lspci -v|grep HCI.

4.4.2. USB 2.0

Per ottenere trasferimenti ad alta velocità da un dispositivo USB 2.0 bisogna unirlo ad un controller USB 2.0 usando il driver EHCI (ehci-hcd.o). Si raccomanda di usare un kernel recente 2.4 o successivo.

4.4.3. Suggerimenti

Una cosa da ricordare è che i dispositivi USB sono allocati dinamicamente. Quando si accende o si connette una stampante USB, le viene assegnato un file di dispositivo (/dev/usb/lp*). Questo significa che i lavori di stampa potrebbero essere inviati alla stampante sbagliata perché le stampanti sono state accese in un certo ordine. CUPS usa indirizzi speciali che contengono fabbricante, modello e numero seriale della stampante per continuare ad inviare i lavori di stampa alla stampante corretta.

Anche se la maggior parte delle stampanti lavora bene con Linux, ci sono delle eccezioni. Per esempio il nuovo dispositivo MF della Epson (Stylus CX3200/CX5200) risponde malamente se si sonda la stringa ID IEEE-1284 via IOCTL, per esempio tramite il codice del backend "usb" di CUPS. Mentre si può sondare la stringa ID tramite un sistema proprietario della Epson.

Till Kamppeter ha scritto alcuni strumenti per recuperare la stringa ID di dispositivo dalle stampanti USB. getusbprinterid.pl e usb_id_test.c sono la stessa cosa, ma sono scritti rispettivamente in Perl e in C. Come detto prima, i nuovi dispositivi MF della Epson sono un'eccezione, ma il "sistema proprietario della Epson" è stato implementato nello strumento ttink del pacchetto MTink.

Maggiore documentazione su USB è disponibile presso il sito web Linux USB.