Avanti Indietro Indice

9. Degli interessanti programmi di cui dovreste essere a conoscenza

9.1 Cos'è setserial ?

Questa parte si trova in 3 HOWTO: Modem, Serial e Text-Terminal. Ci sono lievi differenze, in relatizione a quale HOWTO appaiono.

Introduzione

Non usate mai setserial con i Laptop (PCMCIA). setserial è un programma che vi permette di comunicare al software del device driver l'indirizzio IO della porta seriale, quale interrupt (IRQ) è impostato nell'hardware della porta quale tipo di UART avete, ecc. Può anche mostrare come il driver sia attualmente impostato. In più può rilevare l'hardware per cercare di determinare il tipo di UART e l'IRQ. Ma ci sono seri limiti. Vedere Probing. Notate che non si possono impostare l'IRQ, ecc. nell'hardware delle porte seriali PnP.

Se avete solo una o due porte seriali, generalmente esse si imposteranno correttamente senza usare setserial. Altrimenti (o se ci sono problemi con la porta seriale) dovrete probabilmente avere a che fare con setserial. A parte la pagina di manuale di setserial, leggete anche le informazioni in /usr/doc/setserial.../ o /usr/share/doc/setserial. Dovrebbero dirvi come setserial sia gestito nella vostra distribuzione di Linux.

Setserial è spesso lanciato automaticamente in fase di avvio da uno script di shell allo scopo di assegnare IRQ, ecc. al driver. Setserial funziona solo se il modulo seriale è caricato (o se l'equivalente era compilato nel vostro kernel). Se doveste (per qualche ragione) scaricare il modulo seriale più tardi, i cambiamenti precedentemente effettuati da setserial saranno persi dal kernel (ma non da /etc/serial.conf). Quindi setserial deve essere lanciato di nuovo per reimpostarli. Oltre ad essere lanciato da uno script di avvio, qualcosa di simile a setserial viene lanciato quando il modulo seriale viene caricato. Quindi quando osservate i messaggi di avvio sullo schermo potrebbe sembrare che sia stato lanciato due volte ed in effetti si è verificato questo.

Setserial può impostare il tempo nel quale la porta continua ad operare dopo essere stata chiusa (per fare uscire qualsiasi carattere rimasto ancora nel suo buffer nella RAM principale). Questo è necessario a basse velocità di baud (1200 o inferiori). È anche necessario a velocità più alte se ci sono molte attese causate dal controllo di flusso. Vedere "closing wait" nella pagina di manuale.

Setserial non imposta né l'IRQ né gli indirizzi IO nella porta seriale da solo. Questo compito viene svolto da "jumper" o dal plug-and-play. Dovete passare a setserial gli identici valori che sono stati impostati nell'hardware. Non inventatevi dei valori che pensate possano andare bene da passare a setserial. Comunque, se sapete l'indirizzo I/O ma non conoscete l'IRQ potere ordinare a setserial di tentare di determinarlo.

Potete vedere una lista di possibili comandi da usare digitando setserial senza parametri. Non verranno mostrati le opzioni a una lettera tipo -v per verboso (?), che dovreste in genere usare quando dovete risolvere dei problemi. Notate che setserial chiama un indirizzo IO "porta". Se digitate

setserial -g /dev/ttyS*
vedrete alcune informazioni circa il modo in cui il device driver è configurato per le vostre porte. Aggiungete una "-v" all'opzione "-g" per saperne di più sebbene poche persone avranno a che fare (o comprendere) queste informazioni aggiuntive visto che i valori predefiniti in genere funzionano bene. In casi normali l'hardware è impostato nello stesso modo in cui "setserial" lo riporta, ma se avete problemi allore esiste una buona probabilità che "setserial" si stia sbagliando. Infatti, potete lanciare setserial assegnando un indirizzo IO puramente fittizio, un qualsiasi IRQ e qualsiasi tipo di UART vi pare. Poi la prossima volta che digitate "setserial ... " verranno visualizzati questi falsi valori senza nessuna protesta. Naturalmente il driver della porta seriale non funzionerà correttamente (o non funzionerà del tutto) con questi valori inventati.

Mentre gli assegnamenti fatti da setserial sono persi quando il PC viene spento, un file di configurazione potrebbe reimpostarli (oppure una configurazione precedente) quando il PC viene acceso di nuovo. Nelle versioni più recenti, quello che voi cambiate tramite setserial viene salvato automaticamente in un file di configurazione. Nelle versioni più vecchie, il file di configurazione viene modificato solo se lo editate manualmente, quindi la configurazione rimane la stessa ad ogni avvio. Vedere Script/file di configurazione.

Rilevazione (probing)

Con le opzioni appropriate, setserial può rilevare (ad un dato indirizzo I/O) una porta seriale, ma dovete indovinare l'indirizzo di I/O. Se gli chiedete di rilevare /dev/ttyS2 per esempio, tenterà di rilevarlo solo all'indirizzo nel quale pensa sia ttyS2 (2F8). Se dite a setserial che ttyS2 si trova ad un indirizzo diverso, allora dovrete rilevare a quell'indirizzo, etc. Vedere Rilevazione.

Lo scopo di questo è vedere se lì c'è una uart, e se sì, quale IRQ abbia. Usate "setserial" come ultima risorsa visto che ci sono metodi più veloci per farlo tipo wvdialconf per rilevare i modem, guardare i messaggi che compaiono per primi all'avvio, o usando pnpdump --dumpregs. Per cercare di identificare l'hardware fisico usate i parametri -v (verbose) e il comando autoconfig per setserial. Se il messaggio che ne risulta mostra un tipo di uart come 16550A, allora tutto è a posto. Se invece mostra "unknown" (sconosciuto) per il tipo di uart, allora potrebbe non esserci una porta seriale a quell'indirizzo I/O. Alcune porte seriali a buon mercato non si identificano correttamente cosi se vedete "unknown" potreste comunque avere una porta seriale a quell'indirizzo.

A parte l'auto-rilevazione per il tipo di uart, setserial può anche auto-rilevare gli IRQ ma questo non sempre funziona correttamente. In versioni di setserial 2.15 e superiori, i risultati della vostra ultima prova di rilevazione possono essere salvati nel file di configurazione /etc/serial.conf che verrà usato al prossimo avvio di Linux. In fase di avvio, quando il modulo di serial si carica, una rilevazione per le UART viene fatta automaticamente ed i risultati visualizzati sullo schermo. Ma l'IRQ che mostra potrebbe essere errato. La seconda visualizzazione dello stesso è il risultato di uno script che in genere non esegue alcuna rilevazione e quindi non dà informazioni attendibili riguardo a come l'harware sia effettivamente impostato. Mostra sono dati di configurazione che qualcuno ha scritto all'interno dello script o dati che sono stati salvati in /etc/serial.conf.

Potrebbe essere che due porte seriali abbiano entrambe lo stesso indirizzo di IO impostato nell'hardware. Naturalmente ciò non è consentito, ma talvolta accade comunque. La rilevazione identifica una porta seriale quando in realtà ce ne sono due. Comunque, se hanno diversi IRQ, alla la rilevazione dell'IRQ potrebbe mostrare IRQ = 0. Per me accade questo solo se prima uso setserial per attribuire all'IRQ un valore fittizio.

Può Linux configurare i dispositivi seriali "automagicamente"?

Sì, ma ... La vostra distribuzione potrebbe già avere fatto questo in fase di avvio. Ma potreste volerli personalizzare. È facile da fare per setserial precedenti al 2.15. Semplicemente aggiungete alcune righe al file che lancia setserial all'avvio. Vedere Vecchi metodi di configurazione: modificare uno script Ad esempio, per ttyS3 dovreste aggiungere:

 /sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig
al file che lancia setserial all'avvio. Fate questo per ogni porta seriale che volete autoconfigurare. Assicuratevi di passare un nome di dispositivo che effettivamente esiste sulla vostra macchina. In alcuni casi, questo non funzionerà bene a causa dell'hardware, così potreste volere assegnarli un irq e/o un tipo di uart ad esempio

Configurazione in fase di avvio

Quando il kernel carica il modulo seriale (o se l'"equivalente modulo" è incorporato al kernel) allora solo ttyS{0-3} sono auto-rilevate ed il driver viene impostato ad IRQ 4 e 3 (a prescindere dalle reali impostazioni dell'hardware). Potete vedere questo nei messaggi di avvio proprio come se setserial fosse stato lanciato. Se usate 3 o più porte, questo potrebbe generare un conflitto di IRQ.

Per risolvere detti conflitti passando a setserial i veri IRQ (o per altre ragioni) potrebbe esserci un file da qualche parte che lancia setserial di nuovo. Questo accade all'inizio della fase di avvio prima che qualsiasi processo usi la porta seriale. In effetti, la vostra distribuzione potrebbe avere impostato le cose in modo che il programma setserial venga lanciato automaticamente da uno script di avvio in fase di boot. Ulteriori informazioni su come gestire questa situazione dovrebbero trovarsi in file chiamati "setserial.." o simile nella directory /usr/doc/ o /usr/share/doc/.

Script/file di configurazione

Il vostro obbiettivo è modificare (o creare) uno script nel ramo /etc che lanci setserial in fase di avvio. La maggior parte delle distribuzioni forniscono un file di questo tipo (ma inizialmente potrebbe non risiedere nel ramo /etc). In più, setserial 2.15 e superiore spesso hanno un file /etc/serial.conf che viene usato dallo script di cui sopra così che non dovrete modificare direttamente lo script che lancia setserial. Inoltre semplicemente usando setserial da riga comandi (2.15 e superiore) potrebbe alterare questo file di configurazione.

Quindi prima della versione 2.15 di setserial tutto quello che dovevate fare era modificare uno script. Dopo la 2.15 potreste avere bisogno di fare una delle seguenti cose: 1. modificare uno script. 2. modificare /etc/serial.conf. o 3. lanciare "setserial" da riga comandi il cui risultato sarà l'immediata modifica di /etc/setserial.conf. Quali di queste cose dobbiate fare dipende sia dalla vostra specifica distribuzione, e da come l'avete impostata.

Per di più neppure serial.conf viene mai modificato. Invece si usa semplicemente setserial da riga comandi.

Modificare uno script (dopo la versione 2.15: forse no)

Prima di setserial 2.15 (1999) non c'era un file /etc/serial.conf per configurare setserial. Quindi dovrete scoprire il file che lancia "setserial" in fase di avvio e modificarlo. Se non esiste dovrete crearne uno (o mettere i comandi in un file che viene lanciato nelle prime fasi di avvio). Se detto file viene correntemente usato, probabilmente si trova da qualche parte nel ramo /etc. Ma Redhat <6.0 lo ha fornito in /usr/doc/setserial ma dovrete spostarlo nel ramo /etc prima di usarlo. Potreste usare "locate" per cercare di trovare un file di questo tipo. Ad esempio potreste digitare: locate "serial*".

Lo script /etc/rc.d/rc.serial era comunemente usato in passato.

Se un file di questo tipo viene fornito, dovrebbe contenere una serie di esempi "commentati". Rendendo attivi e/o modificando alcuni di questi esempi, dovreste essere in grado di impostare tutto quanto correttamente. Assicuratevi di usare un percorso valido per setserial ed un valido nome di dispositivo. Potreste eseguire un test mandando in esecuzione questo file manualmente (basta digitare il suo nome da superuser) per vedere se funziona bene. Testare in questo modo è molto più veloce che eseguire ripetuti riavvii. Naturalmente potete anche testare un singolo comando di setserial semplicemente digitandolo sulla riga comandi.

Se volete che setserial determini automaticamente la uart e l'IRQ per ttyS3 dovreste aggiungere qualcosa tipo:

/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig

Fate ciò per ogni porta seriale che volete auto configurare. Assicuratevi di fornire un nome di device che esiste veramente sulla vostra macchina. In alcuni casi questo non funzionerà correttamente a causa dell'hardware così se sapete quali siano la uart e l'irq, potreste volerli assegnare esplicitamente con "setserial". Ad esempio:

/sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test 

Per versioni 2.15 e superiori (a patto che la vostra distribuzione implementi la modifica, Redhat non l'ha fatto) potrebbe essere più complicato da fare visto che il file che lancia setserial all'avvio, /etc/init.d/setserial o simile non era previsto che fosse modificato dall'utente. Vedere Nuovi metodi di configurazione usando /etc/serial.conf.

Nuovi metodi di configurazione usando /etc/serial.conf

Prima della versione 2.15 di setserial, il modo di configurare setserial era di modificare manualmente lo script di shell che lanciava setserial in fase di avvio, Vedere Modificare uno script (dopo la versione 2.15: forse no). A partire dalla versione 2.15 (1999) di setserial quest script di shell non viene modificato ma piuttosto prende i suoi dati da un file di configurazione: /etc/serial.conf. In più non dovrete più avere bisogno di modificare serial.conf poiché usando il comando "setserial" da riga comandi potrebbe automaticamente fare sì che serial.conf sia modificato in modo appropriato.

Si intendeva agire in questo modo così che voi non avete bisogno di modificare alcun file per impostare (o cambiare) setserial, così che possa fare la cosa giusta ogni volta che Linux viene avviato. Ma ci sono delle trappole pericolose perché non è veramente "setserial" che modifica serial.conf. La confusione è moltiplicata poiché diverse distribuzioni gestiscono la cosa in modo differente. In più, voi potreste modficarlo così da farlo lavorare in modo diverso.

Quello che spesso accade è questo: Quando spegnete il vostro PC lo script che lancia "setserial" in fase di avvio viene di nuovo lanciato, ma questa volta esegue solo la parte che la situazione di "stop" dice di fare: Esso usa "setserial" per trovare qual è lo stato attuale di "setserial" e mette questo informazioni nel file serial.conf. Così quando lanciate setserial per cambiare il file serial.conf, il cambiamento non avviene immediatamente, ma solo quando eseguite un normale spegnimento del PC.

Ora potreste forse indovinare quale problema potrebbe sopraggiungere. Supponiamo che voi non spegniate normalmente (usando l'interruttore, ecc.) e che i cambiamenti non vengano salvati. Supponiamo che state sperimentando con "setserial" e dimentichiate di lanciarlo un'ultima volta per ripristinare lo stato originale (o fare in modo che gli errori vengano riportati al loro stato originale). In questo caso saranno salvate le vostre impostazioni "sperimentali".

Se modificate manualmente serial.conf, allora la vostra modifica viene cancellata quando spegnete visto che viene ripristinato lo stato di setserial allo spegnimento. C'è un modo di disabilitare il cambiamento di setserial in fase di spegnimento ed è quello di rimuovere "###AUTOSAVE###" o simile dalla prima riga di serial.conf. In almeno una distribuzione, la rimozione di "###AUTOSAVE###" dalla prima riga viene fatto automaticamente dopo la prima volta che si spegne il PC appena dopo l'installazione. Il file serial.conf dovrebbe contenere degli esempi "commentati" per aiutarvi.

Il file più comunemente usato per lanciare setserial all'avvio (in conformità con il file di configurazione) è ora /etc/init.d/setserial (Debian) o /etc/init.d/serial (Redhta), o ecc., ma normalmente non dovrebbe essere modificato. Per la 2.15 Redhat 6.0 ha semplicemente un file /usr/doc/setserial-2.15/rc.serial che dovete spostare in /etc/init.d/ se volete che setserial venga lanciato in fase di avvio.

Per disabilitare una porta, usate setserial per impostarla "uart none". Il formato di /etc/serial.conf sembra che sia quello dei parametri digitati dopo "setserial" da riga comandi con una riga per ogni porta. Se non usate autosave, potreste modificare /set/serial.conf manualmente.

BUG: Fino a luglio 1999 c'era un bug/problema visto che con ###AUTOSAVE### solo i parametri di setserial visualizzati da "setserial -Gg /dev/ttyS*" venivano salvati, ma gli altri parametri no. Usate il flag -a con "setserial" per vedere tutti i parametri. Questo bug affliggerà solo una piccola minoranza di utenti visto che i parametri non salvati sono in genere OK per la maggior parte delle situazioni. È stato riportato come bug e potrebbe essere già stato corretto. Per fare sì che le impostazioni correnti vengano salvate da setserial nel file di configurazione (serial.conf) senza spegnere il PC, fate quello che fareste normalmente quando spegnete: Lanciate lo script di shell /etc/init.d/{set}serial stop. Il comando "stop" salverà la configurazione corrente ma la porta seriale continuerà a funzionare bene.

In alcuni casi potreste avere sia il nuovo che il vecchio metodo di configurazione installati ma si spera che solo uno di essi venga lanciato in fase di avvio. Debian classificava come obsoleti i file con "...pre-2.15".

IRQ

Per default, sia ttyS0 che ttyS2 condividono l'IRQ 4, mentre ttys1 e ttyS3 condividono l'IRQ 3. Ma non è permessa la condivisione degli interrupt seriali, a meno di: 1. avere un kernel 2.2 o superiore, 2. si è compilato il supporto per questa cosa, e 3. il vostro hardware seriale lo supporta. Vedere Condivisione di interrupt e i Kernel 2.2+ Se avete solo due porte seriali ttyS0 e ttyS1, siete comunque a posto, visto che non esistono conflitti di condivisione di IRQ per dispositivi che non esistono. Se aggiungete un modem interno e conservate ttyS0 e ttyS1, allora dovreste cercare di trovare un IRQ inutilizzato per assegnarlo al vostro device driver. Se IRQ 5 non è usato da una scheda audio, potrebbe essere adatto da usare per un modem. Per impostare l'IRQ nell'hardware potreste avere bisogno di usare isapnp, un BIOS PnP o modificare Linux per renderlo PnP. Per aiutarvi a determinare quale IRQ di "ricambio" potreste avere, digitate "man setserial" e cercate diciamo "IRQ 11".

9.2 Cos'è isapnp ?

isapnp è un programma per configurare i dispositivi Plug-and-Play (PnP) sul bus ISA inclusi i modem interni. È incluso in un pacchetto chiamato "isapnptools" ed include un altro programma, "pnpdump" che trova tutti i vostri dispositivi ISA PnP e vi mostra le opzioni per configurarli in un formato che potrebbe essere aggiunto al file di configurazione di PnP: /etc/isapnp.conf. Potrebbe anche essere usato con l'opzione --dumpregs per mostrare l'indirizzo IO e l'IRQ della porta seriale del modem correnti. Il comando isapnp potrebbe essere incluso in un file di avvio così che esso sia lanciato ogni volta che si accende il computer e quindi configuri i dispositivi ISA PnP. Si può fare questa anche se il vostro BIOS non supporta il PnP. Vedere il Plug-and-Play-HOWTO.

9.3 Cos'è wvdialconf?

wvdialconf cercherà di trovare quale porta seriale (ttyS?) ha un modem su di essa. Crea anche un programma di configurazione per il programma wvdial. wvdial È usato per semplificare le chiamate in uscita verso un ISP (Internet provider) usando il protocollo PPP. Ma non avete bisogno di installare PPP per potere usare wvdialconf. Esso rileverà solo modem che non sono in uso. Concepirà anche automaticamente una stringa di inizializzazione "adatta" ma talvolta la creerà sbagliata. Visto che il comando non ha opzioni, è semplice da usare ma dovete passargli il nome di un file nel quale mettere la stringa di inizializzazione (ed altri dati). Ad esempio digitate: wvdialconf nome_del_mio_file_di_configurazione.

9.4 Cos'è stty?

stty è come setserial ma imposta il baud rate ed altri parametri della porta seriale. Digitando "stty -a < /dev/ttyS2" dovreste visualizzare come è configurata ttyS2. La maggior parte delle impostazioni sono per cose che non dovreste mai avere bisogno di usare coi modem (tipo cose usate solo per terminali degli anni '70). Il vostro pacchetto di comunicazione dovrebbe automaticamente impostare tutta la corretta configurazione per i modem. Ma stty è talvolta utile per risolvere dei problemi.

Due valori impostati da stty sono: 1. Flusso di controllo hardware tramite "crscts" e 2. Ignorare il segnale DCD da modem: "clocal". Se il modem non sta inviando segnali DCD e clocal è disabilitato (stty mostra -clocal), allora un programma potrebbe non essere in grado di aprire la porta seriale. Se la porta non si può aprire il programma potrebbe bloccarsi, attendendo (spesso vanamente) per un segnale DCD dal modem.

Minicom imposta clocal automaticamente quando viene lanciato quindi non ci sono problemi. Ma la versione 6.0.192 di Kermit si pianta quando imposto -clocal e provo "set line...". Se -clocal è impostato e non c'è segnale DCD allora anche il comando "stty" si pianterà e non c'è modo di impostare clocal (a meno di lanciare minicom). Ma minicom reimposterà -clocal laddove esista. Un modo di uscire da questo è usare minicom per inviare "AT&C" al modem (per ottenere il segnale DCD), quindi uscire da minicom senza resettare così che il segnale DCD rimanga attivo. Poi si può riusare stty.X


Avanti Indietro Indice