Questa parte si trova in 3 HOWTO: Modem, Serial e Text-Terminal. Ci sono lievi differenze, in relatizione a quale HOWTO appaiono.
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.
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.
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
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/.
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.
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.
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".
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".
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.
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.
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