Implementace RS-232 pod Linux
OBSAH
- Základní termíny
- Použití konfiguracních nástroju - setserial
- Použití konfiguracních nástroju - stty
- (m)getty
Zařízení, pomocí nichž umožňuje jádro Unixu přístup k sériovým zařízením, se typicky nazývají tty
port COM1: je reprezentován zařízením /dev/ttyS0
port COM2: zařízením /dev/ttyS1…
terminálové programy ,umožňují uživateli propojení s jiným počítacem - Tradičním unixovým terminálovým programem je kermit . Dnes už však je značně zastaralý a pravděpodobně byste jej považovali za príliš složitý na používání. Dnes jsou dostupné mnohem komfortnejší programy, které podporují ruzné další funkce jako adresář s telefonními čísly, skriptové jazyky pro automatické volání a připojování ke vzdáleným počítačovým systémům a řada různých souborových komunikačních protokolů. Jeden z nich se nazývá minicom ( popř pro uživatele X11 se nabízí plně vybavený komunikační program na bázi X11 - seyon . )
Soubory sériových zařízení
Vlastní soubor zařízení, pravděpodobně nebude pracovat se standardním souborem. Příslušné podrobnosti byste mřli najít v dokumentu Serial-HOWTO.
Budeme předpokládat, že váš modem je připojen na port COM2:. Jeho vedlejší číslo tak bude mít
hodnotu 65 a hlavní číslo bude při normálním použití rovno 4. Mělo by existovat zařízení ttyS1,
které bude mít tato čísla. Vypište si sériová tty zařízení z adresáře /dev. Pátý a šestý sloupec by
měly obsahovat hlavní a vedlejší číslo:
$ ls -l /dev/ttyS*
0 crw-rw---- 1 uucp dialout 4, 64 Oct 13 1997 /dev/ttyS0
0 crw-rw---- 1 uucp dialout 4, 65 Jan 26 21:55 /dev/ttyS1
0 crw-rw---- 1 uucp dialout 4, 66 Oct 13 1997 /dev/ttyS2
0 crw-rw---- 1 uucp dialout 4, 67 Oct 13 1997 /dev/ttyS3
Jestliže neexistuje zařízení s hlavním č íslem 4 a vedlejším č íslem 65, musíte je vytvořit: přihlaste se jako superuživatel a napište:
# mknod -m 666 /dev/ttyS1 c 4 65
# chown uucp.dialout /dev/ttyS1
Různé distribuce Linuxu používají různé strategie pro toho, kdo by měl sériové zařízení vlastnit.
Někdy je vlastní uživatel root, jindy nějaký jiný uživatel, například uucp. Moderní distribuce používají
skupinu uživatel s přístupem k sériovým zařízením a kdokoliv je má používat, přidá se do
této skupiny.
Někteří lidé doporučují vytvořit soubor /dev/modem, který by sloužil jako symbolický odkaz na
váš modem, takže si příležitostní uživatelé nemusí pamatovat poněkud neintuitivní název například
ttyS1. Nemůžete pak ale v jednom programu používat soubor modem a ve druhém skutečný
název souboru zařízení. Jejich zámkové soubory by pak měly různá jména a mechanismus zamykání
by nefungoval.
Použití konfiguračních nástrojů
Nyní se podívejme na dva nástroje, které se pro konfiguraci sériových linek nejčastěji používají. Jsou to programy setserial a stty .
Příkaz setserial
Program setserial slouží k nastavení sériových portů za běhu. Tento příkaz se typicky spouští
v době spouštění systému skriptem, který se na některých distribucích jmenuje 0setserial, na jiných rc.serial. Tento skript zodpovídá za nastavení sériových zařízení tak, aby byl správně
podchycen všechen nestandardní nebo neobvyklý hardware v počítači.Obecná syntaxe příkazu setserial je:
setserial device [parametry], kde parametr device představuje některé sériové zařízení, například ttyS0 .
Program setserial používá celou řadu parametrů. Nejbežnejší z nich jsou shrnuty v tabulce Informace o dalších parametrech najdete na manuálových stránkách programu setserial .
Řádkové parametry programu setserial
- port port_number - Udává adresu vstupne-výstupního portu sériového zarízení. Hodnota se zadává hexadecimálne, napríklad 0x2f8.
- irq num - Udává císlo použitého prerušení.
- uart uart_type - Specifikuje UART cip zarízení. Možné hodnoty jsou 16450, 16550 a podobne. Nastavení této hodnoty na none vypne dané sériové zarízení.
- fourport - Tento parametr jádru ríká, že daný port je jedním z portu karty AST Fourport.
- spd_hi - Naprogramuje UART tak, aby pracoval rychlostí 57,6 kb/s, pokud proces požaduje rychlost 38,4 kb/s.
- spd_vhi - Naprogramuje UART tak, aby pracoval rychlostí 115,2 kb/s, pokud proces požaduje rychlost 38,4 kb/s.
- spd_normal - Naprogramuje UART na použití standardní rychlosti 38,4 kb/s. Tento parametr se používá k odstranení úcinku parametru spd_hi nebo spd_vhi na daném zarízení.
- auto_irq - Tento parametr zpusobí, že se jádro pokusí automaticky detekovat IRQ daného zarízení. Výsledek nemusí být úplne spolehlivý, takže se na tuto operaci dívejme spíše jako na „hádání“ prerušení. Pokud znáte císlo prerušení, které zarízení používá, meli byste je zadat pomocí parametru irq.
- autoconfig - Tento parametr muže být zadán jen spolecne s parametrem port. Zpusobí, že jádro bude automaticky detekovat typ UART na daném portu. Pokud je zadán i parametr auto_irq, bude se automaticky detekovati prerušení.
- skip_test - Tento parametr jádru ríká, aby se nepokoušelo o automatickou detekci UART cipu. Používá se tehdy,pokud jádro stejne cip správne nedetekuje.
Typický a jednoduchý rc soubor pro nastavení sériových portů při spouštení systému vypadá tak, jako na příkladu konfiguračního skriptu rc.serial
# /etc/rc.serial – konfiguracní skript sériové linky.
#
# Konfigurace sériových zarízení
/sbin/setserial /dev/ttyS0 auto_irq skip_test autoconfig
/sbin/setserial /dev/ttyS1 auto_irq skip_test autoconfig
/sbin/setserial /dev/ttyS2 auto_irq skip_test autoconfig
/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig
#
# Zobrazení konfigurace sériových zarízení
/sbin/setserial -bg /dev/ttyS*
Parametr –bg /dev/ttyS* v posledním příkazu způsobí vytištení pěkně formátovaného přehledu hardwarové konfigurace všech aktivních sériových zařízení. Výstup bude vypadat podobně jako v následujícím příkladu:
Výstup príkazu setserial –bg /dev/ttyS*
/dev/ttyS0 at 0x03f8 (irq = 4) is a 16550A
/dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A
Název příkazu stty zřejmě znamená „set tty“, nicméne příkazem stty je možné také zobrazit konfiguraci terminálu. Program stty umožňuje nastavení ještě rozsáhlejšího souboru vlastností než program setserial . Bližší informace najdete na manuálových stránkách programu stty zařízení. Pokud chcete zobrazit všechna nastavení daného tty zařízení, použijte príkaz:
$ stty -a -F /dev/ttyS1
Přehled nejduležitejších příznaků obsahuje následující tabulka Jednotlivé příznaky se zapnou tak, že se příkazu stty předají a vypnou tak, že se mu předají s uvádejícím symbolem minus. Pokud tedy budeme chtít na zařízení ttyS0 vypnout hardwarový handshaking, zadáme:
$ stty -crtscts -F /dev/ttyS0
Důležité příznaky příkazu stty pro konfiguraci sériových zařízení
- N - Nastavuje rychlost linky na N bitu za sekundu.
- crtscts - Zapíná/vypíná hardwarový handshaking.
- ixon - Zapíná/vypíná XON/XOFF handshaking.
- clocal - Zapíná/vypíná signály pro rízení modemu jako DTR/DTS a DCD. Je to nutné pri použití trívodicového sériového kabelu, protože ten tyto signály neprenáší.
- cs5 cs6 cs7 cs8 - Nastavuje pocet datových bitu na 5, 6, 7 respektive 8.
- parodd - Zapíná lichou paritu. Je-li príznak vypnut, používá se sudá parita.
- parenb - Zapíná paritu. Není-li príznak zapnut, kontrola parity se neprovádí.
- cstopb - Zapíná použití dvou stop-bitu. Pokud je príznak vypnut, používá se jen jeden stop-bit. echo Zapíná/vypíná lokální echo odesílaných znaku.
Následující příklad kombinuje některé z těchto příznaků a nastavuje zařízení ttyS0 pro práci rychlostí 19 200 b/s, s osmi datovými bity, bez parity, s hardwarovým handshakingem a bez lokálního echa:
$ stty 19200 cs8 -parenb crtscts -echo -F /dev/ttyS0
Program getty otevře sériové zařízení, správně je nakonfiguruje, případně nakonfiguruje modem, a potom čeká na spojení. Aktivní spojení na sériové lince je typicky indikováno signálem DCD (Data Carrier Detect). Jakmile je detekováno spojení, program getty vypíše výzvu login: a pak spustí program login, který zajistí samotné přihlášení. Na každém z virtuálních terminálů (například /dev/tty1) v Linuxu tento program běží.
Existuje řada různých implementací programu getty, každá z nich obsluhuje některé konfigurace lépe než jiná. Program getty, o kterém budeme hovořit my, se jmenuje mgetty. Je velice oblíbený, protože obsahuje všechny funkce, pro něž je velmi přívětivý k modemům včetně podpory automatických faxových programů a hlasových modemů. Zaměříme se na konfiguraci programu mgetty tak, aby reagoval na klasické datové volání a zbytek už nechám na vás.
Démon mgetty se od ostatních démonů
getty liší zejména v tom, že je navržen specificky pro podporu modemů kompatibilních se
standardem Hayes. Podporuje i přímá terminálová připojení, lépe se však hodí pro telefonické
aplikace. K detekci příchozího volání nepoužívá signál DCD, ale čeká na zprávu RING, kterou moderní
modemy generují, když přijde hovor a nejsou nakonfigurovány na automatickou odpově .
Hlavní spustitelný program se jmenuje /usr/sbin/mgetty a odpovídající hlavní konfigurační soubor
je /etc/mgetty/mgetty.config. Kromě toho existuje ještě řada dalších binárních a konfiguračních
souborů, které pokrývají všechny funkce programu mgetty.
U většiny instalací se celá konfigurace programu redukuje na úpravu souboru /etc/mgetty/
mgetty.config a přidání příslušné položky do souboru /etc/inittab tak, aby se program
mgetty spouštěl automaticky.
Příklad znázorňuje velmi jednoduchý konfigurační soubor programu mgetty. V tomto příkladu
konfigurujeme dvě sériová zařízení. První z nich, /dev/ttyS0, podporuje modem kompatibilní
s Hayes a rychlostí 38 400 b/s. Druhé, /dev/ttyS1, podporuje přímo připojený terminál VT100
s rychlostí 19 200 b/s.
Příklad konfiguračního souboru /etc/mgetty/mgetty.config
# konfiguracní soubor programu mgetty
# toto je príklad konfigurace, podrobnosti viz mgetty.info
# komentáre zacínají t#t, prázdné rádky se ignorují
# ----- globální sekce -----
303 Kapitola 4 Konfigurace sériových zarízení
Prírucka správce síte
# V této sekci nastavujeme globální vlastnosti, nastavení jednotlivých
# portu budou následovat
# prístup k modemum rychlostí 38 400 b/s
speed 38400
# nastavení ladicí úrovne na t4t (implicitní dle policy.h)
debug 4
# ----- cásti pro jednotlivé porty -----
# Tady se uvádejí veci platné jen pro jednu linku, ne pro všechny
# Modem Hayes pripojený na ttyS0: bez faxu, menší logování
port ttyS0
debug 3
data-only y
# prímé spojení s terminálem VT100, který nepoužívá DTR
port ttyS1
direct y
speed 19200
toggle-dtr n
Konfigurační soubor obsahuje globální část a část specifickou pro jednotlivé porty. V našem příkladu
nastavujeme v globální části rychlost na 38 400 b/s. Toto nastavení zdědí port ttyS0. Všechny
porty obsluhované programem mgetty budou tuto rychlost používat, ledaže by v části konkrétního
portu byla nastavena jiná rychlost tak, jak jsme to udělali pro zařízení ttyS1.