Rozdział 12.
Łącze równoległe
Złącze równoległe jest jednym z najstarszych elementów architektury PC, który (nie licząc pewnych kosmetycznych zabiegów) utrzymuje się w niezmienionej formie przez cały szereg lat. Wiele innych elementów architektury przeszło w tym samym okresie czasu wiele burzliwych etapów rozwoju zakończonych powstaniem kolejnych generacji elementów lub wręcz zatwierdzeniem całkowicie nowych standardów.
Modele prostych złącz równoległych były w użyciu na wiele wcześniej zanim pojawiły się mikrokomputery. Złącza takie służyły głównie do przekazywania danych pomiarowych. W momencie opracowywania przez firmę IBM pierwotnych zarysów PC zaistniała potrzeba implementacji prostego złącza równoległego obsługującego drukarkę. W tym celu sięgnięto po uproszczony wariant standardu Centronics posługującego się w pełnej wersji 29 liniami połączeniowymi i poziomami logicznymi TTL. W oryginale obydwa końce przewodu połączeniowego wyposażone były w specjalny 36-końcówkowy wtyk, którego duże rozmiary nie znalazły uznania wśród twórców architektury PC. Zmieniono więc format gniazda po stronie komputera na bardziej kompaktowy typ SUB-D (DB-25) dysponujący 25 końcówkami. Aby zachować wszystkie oryginalne linie sygnałowe protokołu Centronics zredukowana została do ośmiu liczba przewodów masy (w oryginale 12). Posłużenie się gniazdem DB-25 pozwoliło na umieszczenie na tej samej blaszce maskującej znormalizowaną szczelinę obudowy (Slot) dodatkowego gniazda DB-9 stanowiącego wyprowadzenie złącza szeregowego PC. Magistral danych jest 8-bitowa i składa się z linii DO - D7.
Ponieważ jedynym zadaniem łącza równoległego, wynikającym z przyjętej architektury systemu, była obsługa drukarki nie ma się co dziwić, iż specyfikacja obejmowała wyłącznie transfer jednokierunkowy (od komputera do drukarki). Oprócz 8-bitowej magistrali danych złącze równoległe wyposażone jest w cztery linie sterujące (~STR, -ALF, -INI, ~DSL). Drukarka mogła co prawda zgłaszać pewne sytuacje nienormalne (jak np. brak papieru) ale o transmisji danych w odwrotnym kierunku nie było mowy. Sprytni programiści szybko jednak odkryli możliwość takiej transmisji (tryb półbaj-towy). Oryginalna specyfikacja portu równoległego definiuje 5 linii statusowych (~ERR, SEL, PAP, ~ACK, BSY), z których część służy realizacji protokołu Centronics a część pozwala na sygnalizację pewnych stanów wyjątkowych. W omawianym trybie cztery spośród tych linii wykorzystuje się do transmisji w kierunku odwrotnym. Dwa następu-
jące po sobie półbajtowe cykle pozwalają na organizację wymiany danych w tempie około 100 kB/s. Zachęciło to szereg firm do wypuszczenia na rynek kart sieciowych i kontrolerów SCSI opierających swe działanie na tak przerobionym złączu równoległym.
W złącze równoległe wyposażano przez długi czas wszystkie, przeznaczone do współpracy z PC drukarki. Nie jest to oczywiście jedyna możliwość bowiem drukarka może również współpracować ze złączem szeregowym. Na rynku obecne są modele wyposażone bądź to w oba rodzaje wspomnianych złącz, bądź posiadające możliwość wymiany modułu obsługującego łącze (interfejsu). Port szeregowy, jakkolwiek wolniejszy od równoległego, pozwala na pokonanie dużo większych dystansów dzielących komputer od drukarki, co w niektórych zastosowaniach ma kluczowe znaczenie. Specyfikacja łącza szeregowego dopuszcza transmisję danych na odległość do 200 m natomiast łącze równoległe jedynie do około 5 m.
Współczesne drukarki wykraczają poza rolę biernego odbiorcy poleceń i danych, dysponują bowiem zdolnością dwustronnej komunikacji z obsługującym je komputerem. Możliwości takie wymagają jednak korzystania z portów równoległych, które zostały rozbudowane o dodatkowe funkcje, nie ujęte w standardzie oryginalnego IBM-PC. W dalszej części tego rozdziału zaznajomimy Czytelnika również z tymi rozszerzeniami.
Współczesny komputer PC może wyprowadzać na zewnątrz kilka złącz równoległych. Maksymalna liczba takich łącz, a tym samym akceptowanych przez BIOS i DOS drukarek, wynosi cztery. System operacyjny identyfikuje je poprzez oznaczenia LPT1, LPT2, LPT3 i LPT4. Każde z tych łącz musi być zatwierdzone przez BIOS w trakcie ładowania systemu. Informacja o liczbie łącz równoległych w systemie przechowywana jest w obszarze danych BIOS-u, w bitach 7. i 6. bajtu o adresie 0040:0011h. Niektóre starsze odmiany BIOS-u ignorują łącza LPT3 i LPT4.
Poruszając się na poziomie systemu operacyjnego DOS możemy odwoływać się do drukarek przez symbole LPT1 - LPT4. Synonimem LPT1 jest PRN - domyślna drukarka systemu. Symbole te stanowią oznaczenia urządzeń i nie jest powiedziane, że z danym łączem LPTn musi współpracować drukarka. Jedynie programy obsługujące przerwania sprzętowe pochodzące od tych łącz (zwykle 1RQ5 i 1RQ7) ukierunkowane są na specyfikę obsługi drukarki z łączem równoległym.
Specyfikacja portu równoległego PC ujęta została w standardzie IEEE-1284 wydanym po raz pierwszy w roku 1994. Standard ten definiuje 5 trybów pracy:
Tryb kompatybilny (Compatibility Modę). Podstawowy tryb nazywany też trybem Centronics od swego pierwowzoru. Transmisja jednokierunkowa, prędkość maksymalna może sięgać 200 kB/s, chociaż praktycznie rzadko kiedy przewyższa wartość 150 kB/s.
Tryb półbajtowy (Nibble Modę}. Pozwala nie tylko na wysyłanie ale i na odbiór danych poprzez 4 linie wejściowe. Oferuje kanał zwrotny o szerokości maksymalnej około 100 kB/s.
Tryb bajtowy PS/2 (By t e Mode). Tryb te korzysta ze zmodyfikowanego (nie należącego do standardu) dwukierunkowego portu danych. Modyfikacja taka musi być zaimplementowana przez producenta sprzętu i nie pomogą tu żadne sztuczki programowe. Utworzony w ten sposób kanał zwrotny oferuje pasmo maksymalne do 200 kB/s. Szerokość kanału podstawowego nie ulega zmianie (ok. 200 kB/s). Aktywacja kanału zwrotnego odbywa się za pośrednictwem bitu 5 rejestru sterującego, szczegóły w dalszej części rozdziału.
Tryb EPP (Enhanced Parallel Port). Kanał dwukierunkowy o szerokości maksymalnej 2,3 MB/s. Mimo tego w praktyce transfer rzadko przewyższa wartość l MB/s. Tryb nie jest na ogół stosowany do obsługi drukarek a raczej dla potrzeb skanerów, interfejsów pamięci masowej i kart sieciowych.
Tryb ECP (Extended Capabilities Port). Tryb udostępnia kanał dwukierunkowy o parametrach podobnych do EPP. W systemie tym korzysta się z dodatkowych buforów oraz kanału DMA. Wykorzystywany jest głównie do obsługi profesjonalnych drukarek i urządzeń kompleksowych takich jak Fax-Skaner-Drukarka.
Pierwsze trzy tryby opierają się w swej przeważającej części na pierwotnej maszynie określanej jako SPP (Standard Parallel Port). Dwa pozostałe wymagają kompletnej modyfikacji sprzętu. Całkowicie odmienne są protokoły uzgadniające (Handshake) a i uzyskiwane prędkości transmisji leżą w całkiem innym zakresie. Wszystkie kolejne standardy są zgodne w dół. Należy jednak pamiętać, iż tryby bajtowy i półbajtowy nie były implementowane na wszystkich kartach i kontrolerach.
Terminologia BIOS-SETUP
Wybór trybu pracy złącza równoległego odbywa się za pośrednictwem programu konfiguracyjnego BIOS-SETUP w punktach noszących nazwę Onboard Parallel Mode lub Parallel Port Mode. W praktyce, w zależności od typu komputera, rodzaju zestawu układów płyty głównej (Chip-Set) i wersji BIOS, spotkać można różne kombinacje trybów podstawowych. Poniższe zestawienie zawiera większość możliwych opcji stanowiących kombinacje omówionych w dalszej części trybów podstawowych.
Printer Mode (Defaitlt Mode Standard Mode Normal Mode, SPP). Podstawowy tryb bazowy określony często również mianem Centronics. Transmisja ma charakter jednokierunkowy a próby manipulacji bitem 5 rejestru sterującego nie powodują żadnej dodatkowej reakcji. Kanał zwrotny egzystuje jedynie w formie półbajtowej.
Standard & Bi-Directional. Pozwala nie tylko na wysyłanie ale i na odbiór danych poprzez 8 linii magistrali danych. Ustawienie bitu 5 rejestru sterującego powoduje odwrócenie kierunku transmisji.
EPP 1.7 & SPP. Tryb EPP (Enhanced Parallel Port) w wersji 1.7 (różnice pomiędzy wersjami 1.7 i 1.9 protokołu EPP omówione są w punkcie poświęconym trybowi EPP). Dostępne są zarówno rejestry standardowe SPP jak i dodatkowe,
określone dla trybu EPP. Bit 5 rejestru sterującego SPP odwraca kierunek transmisji. Wersja 1.7 specyfikacji EPP może być pozbawiona implementacji bitu O rejestru stanu (Time-Out).
EPP 1.9 & SPP. Tryb EPP w wersji l .9 (implementacja bitu Time-Out).
ECP. Tryb ECP (Extended Capabilities Port). W tym przypadku system gwarantuje dostęp do portu ECR, nie ma natomiast możliwości wykorzystania trybu EPP.
ECP & EPP 1.7 lub ECP & EPP 1.9. Kombinacja trybów ECP i EPP w stosownej odmianie. Dostępne zarówno funkcje ECP (rejestr ECR) jak i protokół EPP.
Wybór trybu należy dokonywać za pośrednictwem opcji konfiguracyjnych w stosownym punkcie CMOS-SETUP. Istnieją naturalnie rejestry kontrolne, które sterują tymi funkcjami (Ox2A, OxFO, Ox3Fl) i właśnie za ich pośrednictwem BIOS konfiguruje kontrolery portów równoległych. Nie zaleca się bezpośredniego dostępu do tych rejestrów, a wszelkie manipulacja należy pozostawić w gestii BIOS.
Tryby podstawowe
W dalszej części rozdziału przedstawimy bardziej szczegółowo wspomniane wcześniej tryby podstawowe. W kolejności omówione zostaną następujące tryby: standardowy, półbajtowy, bajtowy (PS/2), EPP i ECP.
Tryb standardowy
Tryb standardowy korzysta z szeregu sygnałów ujętych w pierwotnej specyfikacji Centronics. Linie te (wraz z towarzyszącymi im numerami końcówek wtyczek) zebrane zostały w tabeli 12.1.
Oto krótki opis wymienionych w tabeli sygnałów:
DO - D7= Magistrala danych, w systemie standardowym wyłącznie j ednokierunko wa.
~STR=Strobe. Niski poziom logiczny tej linii nakazuje drukarce
odebranie bajtu z linii danych DO - D7. Minimalna szerokość impulsu wynosi 0,5 us.
~ACK=Acknowledge. Niskim poziomem logicznym na tej linii drukarka potwierdza odebranie bajtu i gotowość do przyjęcia następnego. Szerokość impulsu potwierdzającego wynosi około 5 u.s.
BSY=Busy. Wysoki poziom logiczny tego sygnału może oznaczać jeden z następujących stanów:
drukarka jest w stanie off-line (jest logicznie odłączona od komputera),
Tabela 12.1.
Oznaczenia linii przewodu połączeniowego według standardu Centronics
Końcówka wtyku DB-25; Końcówka wtyku Centronics-36; Sygnał; Kierunek transmsji (względem komputera}
1; 1; ~STR; wyjście
2; 2; DO; wyjście
3; 3; Dl; wyjście
4; 4; D2; wyjście
5; 5; D3; wyjście
6; 6; D4; wyjście
7; 7; D5; wyjście
8; 8; D6; wyjście
9; 9; D7; wyjście
10; 10; ~ACK; wejście
11; 11; BSY wejście
12; 12; PAP wejście
13; 13; SEL wejście
14; 14; -ALF wyjście
15; 32; ~ERR wejście
16; 31; -INI wyjście
17; 36; ~DS wyjście
18-25 19-30,33; GND;
16; OV;
17; obudowa;
18; +5 V;
34 35; wolne;
wewnętrzny bufor drukarki jest pełny,
drukarka odbiera właśnie znak,
trwa inicjalizacja drukarki,
wystąpił błąd w pracy drukarki.
PAP=Paper Out. Wysoki poziom logiczny na tej linii sygnalizuje wyczerpanie się zapasu papieru. Sygnał ten bywa też oznaczany jako PERR (Paper Error).
Paper Out. Wysoki poziom logiczny na tej linii sygnalizuje wyczerpanie się zapasu papieru. Sygnał ten bywa też oznaczany jako PERR (Paper Error).
SEL=Select. Wysoki poziom logiczny oznacza, że drukarka jest w stanie on-line, tj. jest logicznie połączona z komputerem. Sygnał ten bywa też oznaczany jako ONOFF (On-line/Off-line).
-ALF=Auto Linę Feed. Niski poziom logiczny na tej linii poleca drukarce automatyczne dołączanie znaków wysuwu wiersza (LF) po odebraniu znaku powrotu karetki (CR).
~ERR=Error lub Fault. Przyczyną niskiego poziomu logicznego na tej linii może być:
brak papieru,
przejście drukarki w stan off-tine,
inny błąd (np. wyłączenie drukarki).
-INI=nitialization. Niski poziom logiczny na tej linii uruchamia
w pewnych typach drukarek procedurę inicjalizujacą. Zgodnie ze specyfikacją wymagany jest impuls o długości co najmniej 50us.
~DSL=Device Select. Niski poziom logiczny powoduje wybranie drukarki. Zwykle linia ta jest na stałe połączona z masą, tzn. drukarka jest stale wybrana. Inne oznaczenie tego sygnału to
SELECT IN.
W trybie standardowym realizowany jest klasyczny protokół Centronics (rysunek 12.1). Zgodnie z jego założeniami dla wysłania pojedynczego bajtu do drukarki muszą być podjęte następujące kroki:
Komputer wystawia bajt danych na magistralę DO - D7 (zapis do portu danych).
Komputer sprawdza sygnał BSY (Busy) w celu ustalenia, czy drukarka jest zdolna do przyjęcia danych. Wysyłanie danych do urządzenia, które nie jest gotowe (inaczej zajęte przetwarzaniem) powoduje ich utratę. Drukarka zajęta przetwarzaniem utrzymuje linię BSY na poziomie logicznej jedynki.
Komputer aktywuje linię ~STR obniżając jej poziom do wysokości logicznego zera. Stanowi to sygnał dla drukarki, że na liniach DO - D7 odłożony jest bajt danych, który należy wczytać do własnych buforów wejściowych. Minimalna długość impulsu na linii ~STR wynosi w myśl specyfikacji co najmniej l us. Realizowana wartość typowa to około 5 us.
Drukarka potwierdza fakt przyjęcia danych impulsem o szerokości 5 us na linii ~ACK. W wielu konkretnych rozwiązaniach kontrolery portu równoległego ignorują impuls potwierdzający.
Opisane wyżej kroki realizowane są przez procesor, który zmuszony jest do wykonywania szeregu operacji na rejestrach w przestrzeni wejśćia-wyjścia. Fakt ten stanowi naturalne ograniczenie prędkości, którą może osiągnąć złącze pracujące w trybie Centronics. Bardziej rozbudowane protokoły (EPP i ECP) realizują wspomniane operacje automatycznie powierzając je wyspecjalizowanym układom sprzętowym -jedynym zadaniem CPU jest wykonanie pojedynczej instrukcji zapisu bajtu do portu danych.
Zanim przejdziemy do zaprezentowania tych bardziej zaawansowanych rozwiązań przedstawimy elementarne mechanizmy, które umożliwiają procesorowi przejęcie kontroli nad poszczególnymi liniami złącza równoległego.
Z każdym portem równoległym stowarzyszone są trzy specjalne rejestry: rejestr danych, rejestr stanu i rejestr sterujący. Trójki rejestrów ulokowane są w spójnych obszarach przestrzeni adresowej wejśćia-wyjśćia, których początki wyznaczają tzw. adresy bazowe. Dla każdego z obecnych w systemie portów LPTx stowarzyszony z nim rejestr danych leży pod adresem bazowym, o krok dalej mamy rejestr stanu (adres bazowy + 1), a na końcu rejestr sterujący (adres bazowy + 2).
Adresy bazowe wyznaczane są przez BIOS dla wszystkich łącz równoległych zaakceptowanych w fazie przebiegu procedur POST. Przydzielone adresy przechowywane są w obszarze danych BIOS (0040:0008h - 0040:OOOEh) - tabela 12.2
Tabela 12.2.
Adresy bazowe portów równoległych
Adres; Szerokość; Znaczenie; Wartość standardowa
0040:0008h; słowo; adresu bazowy łącza LPT1; 378h
0040:000Ah; słowo; adresu bazowy łącza LPT2; 278h
0040:000Ch; słowo; adresu bazowy łącza LPT3; 3BCh
0040:000Eh; słowo; adresu bazowy łącza LPT4; 2BCh
Aby poznać faktyczną lokalizację adresów bazowych w przypadku konkretnego komputera, można posłużyć się jednym z wielu programów diagnostycznych, które podają cały szereg informacji dotyczących konfiguracji danego systemu (np. msd.exe). W charakterze środka doraźnego odwołać się można do programu debug.exe wchodzącego w skład zestawu dostarczanego wraz z MS-DOS:
C: V>debug
-d 0040:0008
80040:0000 .. .. .. .. .. .. .. .. 78 03 78 02 00 00 00 00 ....xx...
W tym konkretnym przypadku adres bazowy LPT1 leży pod adresem 0x378h, a dla LPT2 pod adresem 0x278h. Porty LPT3 i LPT4 nie zostały uznane przez BIOS.
Znając adres bazowy łatwo wyznaczamy poszczególne adresy wspomnianej już trójki portów określanych mianem rejestrów SPP (Standard Paral/e/ Port Registers).
Tabela 12.3.
Zestaw rejestrów SPP
Lokalizacja rejestru; Nazwa; Typ
Adres bazowy + 0; Rejestr danych (Data Register); zapis / odczyt
Adres bazowy + 1; Rejestr stanu (Status Register); odczyt
Adres bazowy + 2; Rejestr sterujący (Control Register); zapis
Rejestr danych (Data Register) - adres bazowy + 0
Rejestr danych umożliwia dostęp do magistrali danych DO - D7. Zlokalizowany jest pod adresem bazowym przyjętym dla danego złącza. Umieszczenie bajtu danych w tym rejestrze powoduje odwzorowanie sygnatury bitowej na stosowych liniach magistrali danych, zatem ustawienie dowolnego bitu tego rejestru powoduje pojawienie się napięcia +5 V na stowarzyszonej z nim końcówce. Oznacza to, że żadna z pozycji nie ulega zanegowaniu, co ma miejsce w przypadku niektórych bitów kolejnych rejestrów SPP.
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0
bit 7=Poziom sygnału na końcówce D7:
0 - niski,
1 - wysoki.
bit 6=Poziom sygnału na końcówce D6:
0 - niski,
1 - wysoki.
bit 5=Poziom sygnału na końcówce D5:
0 - niski,
1 - wysoki.
bit 4=Poziom sygnału na końcówce D4:
0 - niski,
1 - wysoki.
i
bit 3=Poziom sygnału na końcówce D3:
0 - niski,
1 - wysoki.
bit 2=Poziom sygnału na końcówce D2:
0 - niski,
1 - wysoki.
bit 1=Poziom sygnału na końcówce Dl:
0 - niski,
1 - wysoki.
bit 0=Poziom sygnału na końcówce DO:
0 - niski,
1 - wysoki.
Rejestr stanu (Status Register) - adres bazowy + 1
Rejestr ten dostarcza informacji o poziomie sygnałów BSY, ~ACK, PAP, SEL i ~ERR. Rejestr stanu przeznaczony jest wyłącznie do odczytu, a wszelkie zapisywane do niego dane będą ignorowane. Bit 2 informuje o wystąpieniu przerwania sprzętowego.
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; x; bit 0
bit 7=Poziom napięcia na linii BSY:
0 - wysoki,
1 - niski.
bit 6=Poziom napięcia na linii ~ACK:
0 - niski,
1 - wysoki.
bit 5=Poziom napięcia na linii PAP:
0 - niski,
1 - wysoki.
bit 4=Poziom napięcia na linii SEL:
0- niski,
1 - wysoki.
bit 3= Poziom napięcia na linii ~ERR:
0 - niski,
1 - wysoki.
bit 2=~IRQ:
0 - przerwanie wystąpiło,
1 - nie było przerwania.
bity 1 - 0=Zarezerwowane. Bit 0 implementuje tzw. Time-Out przy pracy w trybie EPP.
Proszę zwrócić uwagę na wbudowaną sprzętową negację sygnału na linii BSY. Zero na pozycji bitowej 7 informuje o wysokim poziomie logicznym na stowarzyszonej z nią końcówce, tzn.:
bit 7 = 0- BSY =+5 V
bit 7= l ->BSY = 0V
Rejestr sterujący (Control Register), adres bazowy + 2
Rejestr sterujący w specyfikacji SPP przeznaczony jest wyłącznie do zapisu. Pozwala on na wymuszanie określonych poziomów napięcia na liniach ~DSL, INI, -ALF i ~STR. Łącze równoległe może być źródłem przerwania sprzętowego (zwykle IRQ5 lub IRQ7), jeżeli sygnał na linii ~ACK zmieni stan z wysokiego na niski. Bit 4 stanowi przełącznik umożliwiający blokadę mechanizmu wyzwalania przerwania. Bit 5 aktywuje mechanizm pracy dwukierunkowej dla rejestru danych. W normalnych warunkach port ten jest jedynie kanałem wyjściowym. Ustawienie bitu 5 przynosi pożądany skutek jedynie w układach, których sprzętowa realizacja istotnie dopuszcza możliwość pracy dwukierunkowej (wymagana jest obecność dodatkowego szeregu rejestrów zatrzaskowych). Standardowa definicja złącza równoległego nie zawierała tego jako element konieczny.
x; x; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;
bity 7-6 Zarezerwowane.
bit 5 Aktywacja dwukierunkowej pracy portu danych (Enable Bi-Directional Data Port}.
bit 4 Generacja sygnałów IRQ, (Enable IRQ via ~~ACK):
0 - zabroniona,
1 - dozwolona.
bit 3 Ustanawia poziom napięcia na końcówce ~DSL (zanegowany):
0 - wysoki,
1 - niski.
bit 2 Ustanawia poziom napięcia na końcówce INI:
0 - niski,
1 - wysoki.
bit 1 Ustanawia poziom napięcia na końcówce -ALF (zanegowany):
0 - wysoki,
1 - niski.
bit 0 Ustanawia poziom napięcia na końcówce -STR (zanegowany):
0 - wysoki,
1 - niski.
Uwaga na bity 3, 1 i 0, które wyposażone są w sprzętowe układy negacji poziomów logicznych, na przykład:
bit 1 = 0 -> -ALF = +5 V
bit 1 = 1 -> -ALF = 0 V
Tryb półbajtowy
Tryb półbajtowy (Nibble Modę) stanowi alternatywę przy odczycie 8 bitów bez konieczności korzystania z funkcji dwukierunkowego portu danych. W trybie tym trzeba stosować zewnętrzny multiplekser 1x8/2x4 (np. 74LS157) łamiący zewnętrzną 8 bitową szynę danych na dwie porcje podawane kolejno na wejścia szyny 4-bitowej utworzonej z końcówek BSY(ll), ~ACK(10), PAP(12)i SEL(13).
Montowanie kompletnego bajtu z dwóch składników leży w gestii oprogramowania. Tryb ten jest stosunkowo powolny bowiem wymaga szeregu dodatkowych instrukcji dostępu do portów. Przy założeniu, że linia ~STR połączona jest z końcówką przełącznika multipleksera (~A/B) wymagana jest następująca sekwencja programowa:
#fdefine CONTROL 0x37a /* Rejestr sterujący LPT1: */
#define STATUS 0x379 /* Rejestr stanu LPTl: */
...
unsigned char a, b ;
...
outportb(CONTROL , inportb(CONTROL) | 0x01) ; /* multiplekser na */
/* db0-db3 */
a = (inportb(STATUS) & 0xf0) ; /* zapamiętanie stanu db0-db3 */
a = a>>4 ; /* przesunięcie */
outportb(CONTROL , inportb(CONTROL) | Oxfe) ; /* multiplekser na */
/* db4-db7 */
a = a | (inport (STATUS) & 0xf0) ; /* zapamiętanie stanu db4-db7 */
b = b ^ 0x88 ; /* linia BSY dostarcza zanegowanej informacji */
Utworzona 4-bitowa magistrala doprowadzona jest do górnej połówki rejestru stanu i dlatego niezbędna jest instrukcja przesunięcia. W praktyce może się okazać konieczne wprowadzenia pewnych opóźnień pomiędzy kolejnymi instrukcjami dostępu do portów.
l
Tryb bajtowy (PS/2)
W trybie bajtowym PS/2 (Byte Modę) korzystamy z dwukierunkowego portu danych o ile funkcja taka została wbudowana w sprzęt. Aktywacja systemu odbywa się przy pomocy bitu 5 rejestru sterującego.
Tryb EPP
Standard EPP (Enhanced Parallel Port) przedstawiony został jako efekt wspólnych uzgodnień firm Intel, Xircom i Zenith Data Systems. Prędkość magistrali równoległej pracującej w trybie EPP przewyższa zdecydowanie wartości oferowane przez Centronics i sięga zakresu 2 MB/s. Protokół EPP stosuje dokładnie to samo okablowanie ale prze-definiowuje dla swoich potrzeb znaczenie niektórych linii połączeniowych. Jak długo system znajduje się w trybie EPP, połączenia biegnące od końcówek 12, 13 i 15 mogą być wykorzystywane w sposób dowolny.
abela 12.4.
Zmiana znaczenia sygnałów zfącza równoległego pracującego w trybie EPP
Końcówka wtyku DB-25; Sygnał SPP; Sygnał EPP; Znaczenie
1; -STR; -WRITE; Kierunek transmisji, wysoki poziom logiczny oznacza zapis
2-9; D0-D7; D0-D7; Dwukierunkowa magistrala danych
10; -ACK; 1NTERRUPT; Narastające zbocze wyzwala przerwanie IRQ
11; BSY; WAIT; Sygnał zamknięcia cyklu EPP. Cykl EPP zaczyna się gdy WAIT jest na poziomie niskim a kończy się gdy WAIT jest na poziomie wysokim.
12; PAP; -; Nie wykorzystywany w trybie EPP
13; SEL; -; Nie wykorzystywany w trybie EPP
14; -ALF; -DATA STROBE; W stanie niskim wskazuje na transfer danych
15; -ERR; -; Nie wykorzystywany w trybie EPP
16; -INI; -RESET; Sygnał Reset w stanie niskim
17; -DSL; -ADDR STROBE; W stanie niskim wskazuje na transfer adresu
18 - 25; GND; GND; Masa
Wysyłanie danych złączem równoległym w trybie EPP jest z punktu widzenia procesora stosunkowo proste, wymaga bowiem wyłącznie pojedynczej instrukcji zapisu przesyłanego bajtu do odpowiedniego portu. Jeżeli wysyłane są dane zapis następuje do rejestru danych EPP (adres bazowy + 4). Dla adresów przewidziany jest oddzielny port adresowy EPP (adres bazowy + 3). W ten sam sposób przebiega odczyt danych i adresów wysyłanych przez urządzenie ponieważ obydwa wspomniane porty są dwukierunkowe.
Cykl zapisu przebiega według następującego algorytmu (rysunek 12.3):
Zapis bajtu do odpowiedniego portu.
Aktywowana jest linia -WRITE.
Bajt wystawiany jest na szynę danych.
Jeżeli urządzenie utrzymuje -WAIT na poziomie niskim, wyzwalany jest sygnał zegarowy (DATA STROBE lub ADDR STROBE).
Urządzenie potwierdza odbiór bajtu podnosząc poziom na linii -WAIT.
Formowane jest tylne zbocze sygnału zegarowego (-DATA STROBE lub -ADDR STROBE).
. Cykl zakańcza formowanie tylnego zbocza sygnału -WAIT.
W podobny sposób przebiega proces odwrotny, w którym urządzenie wysyła do komputera dane lub adres (rysunek 12.4).
Procesor wykonuje rozkaz odczytu portu (danych lub adresowego).
Jeżeli -WAIT jest na poziomie niskim aktywowany zostaje sygnał zegarowy -STROBE.
Kontroler portu EPP oczekuje potwierdzenia w postaci podniesienia poziomu na linii -WAIT.
. Wystawiane przez urządzenie dane lub adres pobierane są z magistrali DO - Dl.
Wszystkie punkty przedstawionych algorytmów (za wyjątkiem pierwszego kroku) realizowane są przez układy sprzętowe kontrolera i nie wymagają żadnej ingerencji programowej. Omawiany we wcześniejszym punkcie protokół Centronics jest pozornie prostszy i składa się z mniejszej liczby etapów. Trzeba w tym miejscu jednak wyraźnie podkreślić, iż uformowanie każdego z impulsów wymagało bezpośredniej ingerencji procesora poprzez właściwą modyfikację określonych pozycji bitowych stosownych rejestrów. W praktyce oznacza to całą sekwencję instrukcji, bowiem modyfikacja pojedynczej pozycji bitowej pociąga za sobą konieczność odczytu zawartości pierwotnej, zamaskowania bitów nienaruszalnych wraz ze zmianą wybranego bitu i ostatecznie ponowny zapis. Wszystko to odbija się na obniżeniu maksymalnej szybkości pracy całego złącza.
Tryb EPP może być zaimplementowany w jednej z dwóch wersji oznaczanych symbolicznie jako EPP 1.7 i EPP 1.9. Opisany tu protokół odwzorowuje zasady określone w drugiej z tych wersji. Odmiana l .7 charakteryzuje się zmianą w ocenie gotowości do wyzwolenia przedniego zbocza sygnału zegarowego -DATA STROBE lub -ADDR STROBE. W tym przypadku nie ma obowiązku oczekiwania na niski poziom sygnału
-WAIT. Obydwie odmiany protokołu muszą natomiast odczekać do obniżenia poziomu
-WAIT jako znak zakończenia danego cyklu.
Dostęp do złącza równoległego pracującego w systemie EPP odbywa się (podobnie jak w przypadku trybu Centronics) za pośrednictwem grupy rejestrów (tabela 12.5).
Pierwsze trzy rejestry grupy EPP pokrywają się z zestawem SPP (Standard Parallel Port}. W ten sposób zagwarantowana jest zgodność w dół - posługując się złączem równoległym pracującym w trybie EPP można przesyłać dane w klasyczny sposób wykorzystując port adresu bazowego wraz z opisanym w poprzednim punkcie protokołem Centronics.
Tabela 12.5.
Zestaw rejestrów EPP
Lokalizacja rejestru; Nazwa; Typ
Adres bazowy + 0; Rejestr danych - SPP (Data Register); zapis
Adres bazowy + 1; Rejestr stanu - SPP (Status Register); odczyt
Adres bazowy + 2; Rejestr sterujący - SPP (Control Register); zapis
Adres bazowy + 3; Rejestr adresowy - EPP (Address Register); zapis / odczyt
Adres bazowy + 4; Rejestr danych - EPP (Data Register); zapis / odczyt
Adres bazowy + 5; Transfer 16/32 bity;
Adres bazowy + 6; Transfer 32 bity;
Adres bazowy + 7; Transfer 32 bity;
Przejście do trybu EPP możliwe jest pod warunkiem, że przyłączone do złącza urządzenie obsługuje ten tryb. Jak już wcześniej wspomniano, transmisja bajtu sprowadza się do umieszczenia lub pobrania go z odpowiedniego rejestru. Towarzysząca transmisji sekwencja sygnałów sterujących wytwarzana jest automatycznie przez kontroler złącza równoległego i nie wymaga dodatkowych kroków programowych. Transfer danych przebiega poprzez rejestr danych (adres bazowy + 4) a proces przesyłania adresu za pośrednictwem rejestru adresowego (adres bazowy + 3). Zarówno rejestr adresowy EPP jak i rejestr danych EPP są dwukierunkowe, co ułatwia komunikację wzajemną (te same adresy portów).
Jeśli złącze pracuje w trybie EPP modyfikacji ulega znaczenie bitu O rejestru stanu SPP (w trybie Centronics jest on zarezerwowany). Bit ten będzie ustawiany w wypadku wystąpienia przekroczenia limitu czasowego (Time-Out). Stan taki ma miejsce, jeżeli linia -WAIT nie ulegnie zwolnieniu po upływie pewnego określonego czasu (zwykle około 10 u.s) liczonego od momentu aktywowania sygnału TOR lub IOW (na magistrali ISA).
Tryb EPP jest mocno powiązany z uzależnieniami czasowymi panującymi na magistrali ISA. Cykl zapisu pojedynczego bajtu do urządzenia umieszczonego na drugim końcu przewodu łączącego z portem równoległym traktowany jest tak jak każdy inny cykl zapisu (do urządzenia wejść i a-wyjść i a) realizowany za pośrednictwem magistrali ISA. Ponieważ cykl taki trwa zwykle wielokrotnie dłużej niż pojedynczy takt zegara magistrali, kontroler portu równoległego zmuszony jest do wprowadzania dodatkowych cykli oczekiwania poprzez aktywację linii IOCHRDY (I/O Channel Ready). Sygnał ten blokuje de facto cały ruch na szynie ISA. Bit O rejestru stanu SPP pełni w tym przypadku rolę zaworu bezpieczeństwa przywracającego ruch na magistrali w przypadku gdy urządzenie zewnętrzne z jakichś względów nie przysyła sygnału potwierdzenia -WAIT (bo jest na przykład wyłączone). Należy się liczyć z faktem, iż bit Time-Out może nie być zaimplementowany w wersji 1.7 specyfikacji EPP.
Dodatkowe porty położone pod kolejnymi adresami (adres bazowy +5, +6 i +7) mogą ułatwić transport słów 16 i 32-bitowych. Ich znaczenie i funkcje nie są na tyle znormalizowane by można było się nimi powszechnie posługiwać. Jeżeli dany kontroler implementuje taką możliwość, do omawianych portów można zapisać na raz 2 lub 4 bajty, które zostaną kolejno automatycznie przesłane 8-bitową szyną złącza równoległego.
Tryb ECP
Tryb ECP (Extended Capabilities Modę) opracowany został przez firmy Microsoft i Hewlett Packard. System ten (podobnie jak EPP) korzysta z silnego wsparcia ze strony sprzętu, który generuje określone przez protokół sekwencje sygnałów sterujących. Jakkolwiek sama szybkość transmisji porównywalna jest z oferowaną przez EPP, omawiany w tym punkcie tryb przekazu ma inne cenne zalety:
Możliwość korzystania z DMA. Skojarzenie portu równoległego z kanałem DMA zdecydowanie poprawia parametry systemu pracującego pod kontrolą Windows.
Dodatkowy bufor. Kontroler portu równoległego ma możliwość korzystania z dodatkowego rejestru buforowego typu FIFO (First In First Out}. Fakt ten pozwala na zmniejszenie uzależnienia systemu od chwilowej dyspozycji obsługiwanego urządzenia zewnętrznego. Na ogół implementowany jest 16 stopniowy bufor FIFO.
Kompresja danych. Tryb ECP korzysta z prostego systemu kompresji oznaczanego w skrócie jako RLE (Run Length Encoding). Zarówno drukarki jak i skanery przetwarzają obrazy, w których przynajmniej pewne fragmenty stanowią jednolite płaszczyzny. Strumień danych płynących złączem równoległym zawiera więc na ogół dłuższe sekwencje powtarzających się znaków. W systemie RLE łańcuch taki redukowany jest do wymiaru dwóch bajtów: pierwszy z nich jest licznikiem RLC (Run Length Count) określającym liczbę znaków łańcucha a drugi stanowi wzorzec znaku. Kodowanie RLE pozwala teoretycznie na osiągnięcie współczynnika kompresji 1:64.
Adresowanie kanałów. ECP umożliwia definicję kanałów logicznych poprzez przydzielenie określonym urządzeniom adresów wewnętrznych (Channel Addressing). System ten utworzony został nie tyle w celu odróżniania szeregu urządzeń podłączonych do jednego portu równoległego co raczej dla wyszczególnienia pewnych bloków funkcjonalnych zawartych w ramach jednego zespołu. Przykładem takiego urządzenia może być kombajn typu skaner-faks-drukarka. Transfer danych kanałami logicznymi pozwala w tym wypadku na lepsze wykorzystanie złącza równoległego bowiem komunikacja może być podejmowana nawet wtedy, gdy bufory lokalne pewnych urządzeń składowych uległy już przepełnieniu. W systemie ECP można przydzielić do 128 adresów logicznych.
Protokół ECP (podobnie jak EPP) przedefiniowuje dla swoich potrzeb znaczenie linii połączeniowych złącza równoległego. Przedeflniowanie to ma miejsce jednak jedynie w przypadku przejścia do trybu ECP. Obowiązuje pełna zgodność ,.w dół" - port równoległy może być przełączony w tryb SPP lub EPP. W takich warunkach następuje przywrócenie znaczenia linii połączeniowych stosowne dla aktualnego trybu.
Tabela 12.6.
Zmiana znaczenia sygnałów złącza równoległego pracującego w trybie ECP
Końcówka wtyku DB-25; Sygnał SPP; Sygnał ECP; Znaczenie
1; ~STR; ~HostCLK; Zegar kluczujący transmisji w kierunku od komputera do urządzenia
2-9; DO-D7; DO-D7; Dwukierunkowa magistrala danych
10; ~ACK; ~PeriphCLK; Zegar kluczujący transmisji w kierunku od urządzenia do komputera
11; BSY; PeriphACK; W stanie wysokim wysyłane są dane a w stanie niskim rozkazy (dotyczy transmisji od urządzenia do komputera)
12; PAP; ~AckREV; Urządzenie potwierdza gotowość do wysyłania danych poprzez obniżenie poziomu tego sygnału
13; SEL; X-Flag; Extensibility Flag
14; ~ALF; HostACK; W stanie wysokim wysyłane są dane a w stanie niskim rozkazy (dotyczy transmisji od komputera do urządzenia)
15; ~ERR; ~PeriphREQ; Sygnał ten obniżany jest do zera przez urządzenie pragnące wysłać dane
16; ~INI; ~RevREQ; Stan niski oznacza, iż dane napływają do komputera
17; ~DSL; 1284ACTWE; Jak długo sygnał utrzymuje się na poziomie wysokim komputer wysyła dane.Obniżenie poziomu do zera kończy transfer
18-25; GND; GND; Masa
Tryb ECP pracuje w oparciu o własny protokół. Określa on sposób transmisji danych poddawanych kompresji RLE z uwzględnieniem adresowania kanałów logicznych. Transfer może być dwukierunkowy przy czym system odróżnia dwa rodzaje cykli: rozkazowy lub danych.
Cykl danych (Data Write/Data Read) ma miejsce w przypadku gdy obydwa sygnały HostACK i PeriphACK znajdują się w stanie pasywnym (wysoki poziom logiczny). Uczestnicy transmisji wiedzą, iż w tym wypadku na magistrali DO - D7 odłożony jest bajt danych.
W cyklu rozkazowym przysyłany może być adres kanału lub licznik RLC (Run Length Counf). Odpowiedni kierunek transmisji definiowany jest poprzez aktywowanie jednego
z sygnałów HostACK lub PeriphACK. Jeżeli stroną nadającą jest komputer (Command Write} musi on sprowadzić linię HostACK do niskiego poziomu logicznego. Jeśli transfer adresu lub licznika RLC odbywa się od urządzenia (Command Read), musi ono aktywować linię PeriphACK.
Mechanizm odróżniania adresu kanału logicznego od licznika RLC pracuje w oparciu o stan bitu 7 magistrali danych (linia D7, końcówka 9). Jeśli jest on równy zero, na liniach DO - D6 odkładany jest licznik RLC. W wypadku gdy D7 równe jest jeden, pozostałe linie magistrali danych transmitują adres logiczny.
Na rysunku 12.5 przedstawione zostały schematycznie cykle transmisyjne portu równoległego ECP biegnące w kierunku od komputera do urządzenia. Jak już wcześniej wspomniano, przesyłane mogą być dane (Data Write} lub rozkazy (Command Write}. Proces przebiega według następującego algorytmu:
Przesyłany bajt umieszczany jest na magistrali danych DO - D7.
W cyklu rozkazowym linia HostACK sprowadzana jest do niskiego poziomu logicznego. W cyklu danych linia ta pozostaje na poziomie wysokim.
Kontroler portu równoległego aktywuje linię -HostCLK poprzez obniżenie jej poziomu do zera.
Urządzenie potwierdza gotowość do przyjęcia bajtu poprzez aktywowanie linii PeriphACK.
Formowane jest tylne zbocze impulsu -HostCLK. W tym momencie urządzenie przejmuje bajt z magistrali danych.
. Urządzenie potwierdza przejęcie bajtu poprzez zwolnienie linii PeriphACK.
Transfer w kierunku od urządzenia do komputera przebiega w sposób podobny. Jedyną różnicę stanowi dodatkowa faza negocjacji kierunku odwrotnego. Uzgodnienie to odbywa się przy współudziale linii ~RevREQ i ~AckREV.
Złącze równoległe pracujące w trybie ECP sterowane jest, podobnie jak ma to miejsce w przypadku poprzednich trybów, poprzez zestaw rejestrów.
Tabela 12.7.
Zestaw rejestrów ECP
Lokalizacja rejestru; Nazwa; Typ
Adres bazowy + 0; Rejestr Danych - SPP (Data Register), zapis
Adres bazowy + 0; Rejestr Adr. FIFO (ECP Address FIFO); zapis / odczyt
Adres bazowy + 1; Rejestr Stanu - SPP (Status Register), odczyt
Adres bazowy + 2; Rejestr Sterujący - SPP (Control Register); zapis
Adres bazowy + ox400h; Data FIFO, zapis / odczyt
Adres bazowy + ox400h; Test FIFO, zapis / odczy
Adres bazowy + ox400h; Configuration Register A;
Adres bazowy + 0x401 h; Configuration Register B; zapis / odczyt
Adres bazowy + ox402h; Rejestr ECR (Extended Control Register); zapisu / odczyt
Przejście w tryb ECP odsłania zestaw dodatkowych rejestrów rezydujących w obszarze leżącym w odległości Ox400h od adresu bazowego. Należą do nich rejestr ECR oraz rejestry konfiguracyjne i testowe.
Rejestr ECR (Extended Control Register), adres bazowy + 0x402h
Rejestr ten stanowi główny element sterujący portu równoległego pracującego w trybie ECP. Umożliwia on konfigurację złącza, podaje informacje statusowe oraz zarządza buforem FIFO.
bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;
bity 7-5=Bity selektora trybu (Select Current Modę of Operation):
000 - tryb standardowy (Standard Modę),
001 - tryb bajtowy (Byte Modę),
010 - tryb standardowy z FIFO (Parali'el Port FIFO Modę),
011 - tryb ECP z FIFO (ECP FIFO Modę),
100 - tryb EPP (EPP Modę),
101 - zarezerwowane,
110 - tryb testowy dla FIFO (FIFO Test Modę),
111 - tryb konfiguracyjny (Configuration Modę).
bit 4=ECP Interrupt Bit.
bit 3=DMA Enable Bit.
bit 2=ECP Service Bit.
bit 1=FIFO Fuli.
bit 0=FIFO Empty.
Trzy najstarsze bity rejestru ECR definiują tryb pracy. Złącze ECP może być dzięki temu przełączone do jednego z siedmiu trybów:
Tryb standardowy (SPP). Klasyczny jednokierunkowy port równoległy
Tryb bajtowy. Klasyczny port równoległy wzbogacony o funkcję dwukierunkową
Tryb standardowy z FIFO. W trybie tym każdy zapisany do rejestru FIFO bajt będzie wysłany do urządzenia z uwzględnieniem zasad klasycznego protokołu SPP. W przeciwieństwie jednak do oryginalnego trybu SPP, niezbędne do tego sygnały sterujące wygenerowane zostaną przez układy sprzętowe i nie wymagają szeregu rozkazów absorbujących CPU.
Tryb ECP z FIFO. Właściwy tryb ECP z wykorzystaniem buforów FIFO i wraz z omówionym wcześniej protokołem.
Tryb EPP. Możliwość przejścia do trybu EPP z wykorzystaniem możliwości sprzętowych oferowanych przez ECP. Funkcja ta często nie jest udostępniana.
Tryb testowy dla FIFO. Specjalny tryb kontrolny udostępniający do celów diagnostycznych dodatkowy zestaw rejestrów FIFO (Test FIFO, adres bazowy + Ox400h). W ramach tego trybu, korzystając z sygnałów FIFO Fuli i FIFO Empty
można na przykład określić faktyczny rozmiar buforów. Zwykle implementowany jest bufor 16 stopniowy.
Tryb konfiguracyjny. W trybie tym uzyskuje się dostęp do rejestrów konfigura-cyjnych A i B. Szczegółowy opis funkcji rejestrów konfiguracyjnych wybiega znacznie poza zakres tej publikacji i z tego względu zostanie pominięty.
Realizacja portu równoległego w ramach architektury PC
Ewolucja złącza równoległego dotyczyła w sporym stopniu jego fizycznej lokalizacji w ramach architektury PC. Przez długi czas wchodziło ono w skład karty grafiki monochromatycznej jako element układu scalonego LSI zawierającego cały sterownik. Adres bazowy złącza wynosił w takim wypadku Ox3BCh.
W momencie upowszechnienia grafiki kolorowej port równoległy dokonał pierwszej przeprowadzki na samodzielną kartę rozszerzającą. Karty takie były zawsze 8-bitowe, nawet w standardzie EISA. Dekodowały one linie adresowe AO-A9 oraz sygnały ~IOR i -IOW magistrali zewnętrznej, rozpoznając w ten sposób odwołania procesora do swych rejestrów. Drugim z możliwych wariantów było wykonanie portu równoległego jako elementu składowego uniwersalnych kart I/O (Multi I/O) zawierających również inne komponenty, takie jak kontrolery dysków oraz porty szeregowe.
Konfiguracja numeru portu LPT1 - 4 (odpowiada określeniu adresu bazowego) odbywała się do niedawna za pomocą mikroprzełączników i zwór konfiguracyjnych. W ten sam sposób przebiegał przydział linii przerwań (standardowo IRQ7, alternatywnie IRQ5).
W miarę wzrostu stopnia integracji układów scalonych płyty głównej (Chip-Set) nastąpiło wchłonięcie portu równoległego przy zachowaniu całkowitej zgodności programowej z oryginałem. Nie jest już również konieczne poszukiwanie zwór konfiguracyjnych, bowiem stosowne opcje zawarte są w programie CMOS-SETUP.
Jeden z elementów pierwotnie zdefiniowanego złącza równoległego przetrwał wszystkie te zmiany w nienaruszonej formie. Kompletny zestaw sygnałów wyjściowych i wejściowych portu skupiony jest nadal w 25-końcówkowym gnieździe typu DB-25 ujętym w normie IEEE-1284-A. Sposób rozmieszczenia linii złącza przedstawia rysunek 12.7.
Połączenie pomiędzy komputerem a drukarką realizowane jest przewodem, który od strony komputera wyposażony jest we wtyk DB-25 a od strony drukarki w 36-końców-kowe złącze typu Centronics (w/g specyfikacji IEEE-1284-B). Od pewnego czasu na rynku egzystuje również nowa, kompaktowa forma wtyku ujęta w normie IEEE-1284-C. Wszystkie trzy typy wtyków przedstawione zostały na rysunku 12.8, a sposób przyporządkowania linii portu poszczególnym końcówkom (wraz z przypisanymi do nich liniami masy) zebrany został w tabeli 12.8.
Dostęp do łącza równoległego poprzez funkcje BIOS
BIOS udostępnia trzy funkcje przerwania 17h obsługujące łącze równoległe. Funkcja OOh wysyła jeden znak do złącza, funkcja Olh inicjalizuje złącze i drukarkę, natomiast funkcja 02h określa aktualny stan złącza.
Tabela 12.8.
Przyporządkowanie końcówek wtyków standardów IEEE 1284
Linia; IEEE 1284-A (Sub-D):sygnal, masa; IEEE 12 84- B (Centronics):sygnal, masa; IEEE I284-C:sygnal, masa;
D0; 1, 19; 2, 20; 6, 24
D1; 3, 19; 3, 21; 1, 25
D2; 4, 20; 4, 22; 8, 26
D3; 5, 20; 5, 23; 9, 27
D4; 6, 21; 6, 24; 10, 28
D5; 7, 21; 7, 25; 11, 29
D6; 8, 22; 8, 26; 12, 30
D7; 9, 22; 9, 27; 13, 31
~ERR; 15, 23; 32, 29; 4, 22
SEL; 13, 24; 13, 28; 2, 20
PAP; 12, 24; 12, 28; 5, 23
-ACK; 10, 24; 10, 28; 3, 21
BSY; 11, 23; 11, 29; 1, 19
-STR; 1, 18; 1, 19; 15, 33
-ALF; 14, 25; 14, 30; 17, 35
-INI; 16, 25; 31, 30; 14, 32
-DSL; 17, 25; 36, 30; 16, 34
Funkcja OOh
Działanie:
Funkcja ta wysyła jeden znak do dowolnego z zainstalowanych w systemie łącz równoległych.
Parametry wejściowe:
AH 00h;
AL kod ASCII znaku;
DX
numer łącza:
0 = LPT1,
1 = LPT2,
2 = LPT3,
4 = LPT4.
Wartości zwracane:
AH bajt statusowy.
Przykład:
mov ah,00h ; numer funkcji
mov al,'D ; znak "D"
mov dx,03h ; port LPT4
int 17h ; wyprowadź znak "D" na drukarkę LPT4
Funkcja 01h
Działanie:
Funkcja 0lh przeprowadza tzw. sprzętową inicjalizację drukarki i łącza (ang. hardware resei). Linia -INI jest aktywowana poprzez wystawienie na niej zera logicznego. Podobny efekt uzyskać można wysyłając tzw. sekwencję inicjalizującą (ang. software resef), na ogół
'@', przy czym korzystamy wówczas ze wszystkich 8 linii danych i linii sterujących. Należy jednak pamiętać, że nie każda drukarka reaguje na sygnał -INI.
Parametry wejściowe:
AH 01h;
DX numer łącza:
0 = LPT1,
1 = LPT2,
2 = LPT3,
4 = LPT4.
Wartości zwracane:
AH bajt statusowy.
Przykład:
mov ah,01h ; numer funkcji
mov dx,00h ; LPT1
int 17h ; inicjalizuj drukarkę dołączona do portu LPT1
Funkcja 02h
Działanie:
Funkcja ta zwraca w rejestrze AH bajt statusowy, odwzorowujący stan łącza i drukarki. Nie są wykonywane żadne inne operacje.
Parametry wejściowe:
AH 02h;
DX numer łącza:
0 = LPT1,
1 = LPT2,
2 = LPT3,
4 - LPT4.
Wartości zwracane:
AH
bajt statusowy.
Przykład:
mov ah,02h ; numer funkcji
mov dx,Olh ; LPT2
int 17h ; bajt statusowy znajdzie się w AH
Wymieniany w opisie funkcji OOh, Olh i 02h bajt statusowy zawiera następujące dane:
bit 7; bit6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;
bit 7=Stan linii BSY:
0 - drukarka wolna,
1 - drukarka zajęta.
bit 6=Stan linii ~ACK:
0 - łącze oczekuje na sygnał potwierdzenia,
1 - nadszedł sygnał potwierdzenia.
bit 5=Stan linii PAP:
1 - w drukarce brak papieru.
bit 4=Stan linii SEL:
0 - drukarka w stanie off-line,
1 - drukarka w stanie on-line.
bit 3=Stan linii ERR:
1 - drukarka zajęta, off-line lub inny błąd, na przykład drukarka wyłączona
bity 2 - 1 Zarezerwowane (zwykle równe 1).
bit 0=Przekroczenie limitu czasu (ang. time-ouf) w oczekiwaniu na reakcję drukarki.
Maksymalne czasy oczekiwania systemu na reakcję drukarki definiowane są przez BIOS i przechowywane w jego obszarze danych.
Adres; Znaczenie;
0040:0078h; limit czasu dla łącza LPT1 (w sekundach)
0040:0079h; limit czasu dla łącza LPT2 (w sekundach)
0040:007Ah; limit czasu dla łącza LPT3 (w sekundach)
0040:007Bh; limit czasu dla łącza LPT4 (w sekundach)
Wartością domyślną przyjmowaną przez BIOS jest 20 sekund. Czas ten można zmienić na nieskończenie długi (ma to znaczenie przy obsłudze drukarek laserowych) poleceniem DOS-u mode Iptn, , p. Po upływie zdefiniowanego wcześniej czasu oczekiwania dane będą wysyłane ponownie.
Dostęp do łącza równoległego z poziomu systemu MS-DOS
Jak wiadomo, MS-DOS traktuje wszystkie urządzenia na równi z plikami dyskowymi. Polecenie copy plik. a plik.b nie różni się od polecenia copy plik. a lpt2. System operacyjny przegląda listę nazw urządzeń (LPT1, LPT2, LPT3, LPT4, COM1, COM2, COM3, COM4, AUX, CON, PRN, NUL) i odróżnia plik dyskowy od urządzenia, tak więc zawartość pliku plik.a zostaje wysłana do programu sterownika (Device Driver) obsługującego łącze LPT2. Wspomnieć należy również o poleceniu type plik. a > Ipt2 oraz programie rezydentnym print (print plik. a /d: LPT2), które prowadzą do tego samego celu.
Dla potrzeb obsługi drukarki programiści mogą odwoływać się do dwóch funkcji przerwania 21h: 05h i 40h.
Funkcja 05h
Działanie:
Funkcja ta jest reliktem z czasów systemu operacyjnego CP/M i obsługuje transmisję pojedynczego znaku wyłącznie do łącza LPT1 (PRN).
Parametry wejściowe:
AH 05h;
DL kod ASCII znaku.
Wartości zwracane:
- brak -
Przykład:
mov ah,05h ; numer funkcji
mov dl,0ch; znak wysuwu strony (FF - Form Feed)
int 21h ; wysuw strony w drukarce
Funkcja 40h
Działanie:
Funkcja ta w ogólnej postaci obsługuje zapis większej liczby znaków do pliku lub urządzenia. Korzysta ona z koncepcji tzw. uchwytów (Handles) definiujących jednorazowo i jednoznacznie plik lub urządzenie.
Drukarce PRN (LPT1) przyporządkowany jest standardowo numer uchwytu 4. Urządzenia LPTn wymagają wcześniejszego otwarcia do zapisu funkcją 3Dh przerwania 21 h. Funkcja otwarcia do odczytu (3Fh) nie ma w przypadku drukarki sensu fizycznego.
Parametry wejściowe:
AH 40h;
BX numer uchwytu urządzenia LPTn;
CX liczba przesyłanych znaków;
DS:DX adres bufora zawierającego znaki.
Wartości zwracane:
AX liczba faktycznie przesłanych znaków lub kod błędu w przypadku CF= 1;
CF 1 w przypadku wystąpienia błędu.
Przykład:
bufor DB 8 DUP('*') ; osiem znaków "*"
mov ah,40h ; numer funkcji
mov bx,04h ; uchwyt urządzenia PRN
mov cx,08h ; przesyłamy 8 znaków
mov dx,0FFSET bufor ; adres (przemieszczenie) bufora
;zakładamy, że DS zawiera
;adres segmentowy bufora
int 21h ; przerwanie DOS
Funkcja 40h zwraca wprawdzie w rejestrze AX kod błędu, nie mówi natomiast nic o stanie poszczególnych linii łącza. Informacji tych dostarczaj ą funkcje BIOS-u.
Ogólne zastosowanie łącza równoległego
Zastosowanie łącza równoległego jako portu drukarki wykorzystuje w niewielkim stopniu jego możliwości. Każda z linii ma swój odpowiednik na stosownej pozycji bitowej pewnego rejestru. Ta przejrzysta i łatwa do oprogramowanie struktura stwarza, iż jest on najchętniej wykorzystywany jako interfejs do prostych układów automatycznych.
Traktując port równoległy jako programowalny sterownik należy zapomnieć o drukarce a skupić się na wejściach i wyjściach kontrolera. Klasyczny port równoległy w pierwotnej postaci (SPP) wyposażony był w 12 wyjść i 5 wejść dostępnych przez odpowiednie bity rejestrów:
8 wyjść poprzez rejestr danych,
4 wyjścia (z czego 3 zanegowane) dostępne poprzez rejestr sterujący,
5 wejść (z czego jedno zanegowane) dostępne poprzez rejestr stanu.
W oryginale IBM-PC port danych jest jednokierunkowy. Zawartość rejestru wystawiana jest na odpowiednie końcówki złącza DB-25 w niezmienionej formie (brak charakterystycznych negacji występujących w przypadku innych rejestrów). W późniejszych wykonaniach kontrolerów pojawiła się możliwość pracy dwukierunkowej (Bi-Directional) uruchamiana poprzez bit 5 rejestru sterującego. Aktywacja tej funkcji komplikuje obsługę portu bowiem zapisane do niego dane (np. rozkazem out DATA, al) są w nim "zatrzaskiwane". Odczyt rejestru (np. rozkazem in al, DATA) powoduje w efekcie przeczytanie tych samych danych, które zostały uprzednio zapisane. Mechanizm sprzężenia zwrotnego nie został wprowadzony w celu utrudnienia życia programistom ale raczej dla umożliwienia wykrywania przekłamań spowodowanych np. zwarciami na magistrali danych portu równoległego. Aby pobrać dane z portu należy najpierw zapisać do niego same jedynki (0xFFh) po czym pozwolić zewnętrznym układom logicznym na ewentualne obniżenie poziomu na wybranych liniach. Dopiero wtedy odczyt bajtu przynosi pożądany skutek.
Rejestr sterujący przeznaczony jest w zasadzie również wyłącznie do zapisu ale dzięki istnieniu wbudowanych funkcji sprzężenia zwrotnego (o ile zostały zaimplementowane) może być użyty jako dwukierunkowy w swej mniej znaczącej połowie (bity 3 - 0). Fakt ten umożliwia dostęp do końcówek l, 14, 16, 17 jako wejść lub wyjść. Aby odczytać coś z tego rejestru trzeba wstępnie zapisać wartość xxxx0100b co powoduje ustawienie poziomów +5 V na wszystkich końcówkach. W tym momencie urządzenie zewnętrzne może sprowadzić daną końcówkę do masy. W przypadku bitu 4 (Enable IRQ via ~~ACK) obowiązuje tylko jeden kierunek tzn. zapis. Odczyt tej pozycji bitowej dostarcza zawsze ostatnio ustawionej wartości i nie ma sensu fizycznego jako wartość zwracana.
W tabeli 12.9 prezentowane jest zestawienie numerów końcówek poszczególnych wtyków i z uwzględnieniem przypisanych im bity rejestrów.
Tabela 12.9.
Sterowanie liniami złącz standardu IEEE1284
Kierunek; Końcówka svgnalonwa:IEEE 1284-A (D-Siib), IEEE 1284-B (Centronics), IEEE 1284-C; Bil rejestru; Unia
zapis / odczyt; 2, 2, 6; Rejestr danych bit 0; D0
zapis / odczyt; 3, 3, 7; Rejestr danych bit 1; D1
zapis / odczyt; 4, 4, 8; Rejestr danych bit 2; D2
zapis / odczyt; 5, 5, 9; Rejestr danych bit 3; D3
zapis / odczyt; 6, 6, 10; Rejestr danych bit 4; D4
zapis / odczyt; 7, 7, 11; Rejestr danych bit 5; D5
zapis odczyt; 8, 8, 12; Rejestr danych bit 6; D6
zapis / odczyt; 9, 9, 13; Rejestr danych bit 7; D7
odczyt; 15, 32, 4; Rejestr stanu bit 3; -BRR
odczyt; 13, 13, 2; Rejestr stanu bit 4; S EL
odczyt; 12, 12, 5; Rejestr stanu bit 5; PAP
odczyt; 10, 10, 3; Rejestr stanu bit 6; -ACK
odczyt; 11, 11, 1; Rejestr stanu bit 7; BSY
zapis / odczyt; 1, 1, 15; Rejestr sterujący bit 0; -STR
zapis / odczyt; 14, 14, 17; Rejestr sterujący bit l"**; -ALF
zapis / odczyt; 16, 31, 14; Rejestr sterujący bit 2; INI
zapis / odczyt; 17, 36, 16; Rejestr sterujący bit 3; -DSL
*Aktywowany system dwukierunkowego portu danych.
**Wykorzystanie mechanizmu sprzężenia zwrotnego.
***Sprzętowy system negacji poziomów logiczych.
Z tabeli 12.9 wynika, iż port równoległy aktualnie produkowanych komputerów może być uważany jako programowalny sterownik o 17 wejściach i 12 wyjściach. Stwarza to spore możliwości sterowania różnorodnych prostych układów automatyki. Mowa tu naturalnie o sterowaniu typu "włącz-wyłącz" bowiem informacja dostarczana od zewnętrznych czujników nie może mieć charakteru analogowego. Taki sam charakter ma sygnał wytwarzany przez kontroler. Aby móc interpretować i generować przebiegi analogowe trzeba posługiwać się przetwornikami A/D i D/A dołączonymi do kilku linii wejściowych lub wyjściowych jednocześnie. W ten sposób zyskujemy możliwość regulacji wielostopniowej.
Języki Turbo C lub Borland C/C++ umożliwiają dostęp do portów wejścia-wyjścia komputera z procesorem 80x86 za pośrednictwem predefiniowanych funkcji outport,
outportb, inport, inportb.
void outport (int ADR, int VAR) ; /* umieszcza słowo VAR */
/ * w porcie ulokowanym pod adresem ADR */
void outportb (int ADR, unsigned char VAR) ; /* umieszcza bajt */
/* w porcie ulokowanym pod adresem ADR*/
int inport (int ADR) ; /* zwraca słowo odczytane z portu */
/* ulokowanego pod adresem ADR */
unsigned char inportb (int ADR) ; /* zwraca bajt odczytany */
/* z portu ulokowanego pod adresem ADR */
Przy założeniu iż opieramy się na złączu LPT1 ulokowany pod adresem standardowym schemat wywołań omawianych funkcji przebiegać powinien według następującego planu:
#include
#incllude
#define DATA 0x378
#define STATUS 0x379 ttdefine CONTROL Ox37A
...
unsigned char BITY ;
BITY = inportb (CONTROL) ; /* odczyt portu sterującego */
...
BITY= 0xF0 ;
outportb (DATA , BITY); /* ustawienie bitów portu danych: D7-D4=1,
D3-DO=0 */
...
Ostatnia z instrukcji dokonuje ustawień na wszystkich pozycjach bitowych bez względu na to jaka była ich dotychczasowa wartość. Dużo częściej wynika potrzeba manipulacji wyłącznie określonych pozycji bitowych bez naruszania pozostałych. W takim przypadku należy posługiwać się instrukcjami maskującymi:
#define CONTROL Ox37A
...
unsigned char MASKA ; MASKA = 0x08 ; /* 00001000 */
outportb (CONTROL , inportb (CONTROL) | MASKA); /* ustawienie bitu */
/* -C3 w rejestrze sterującym */
MASKA = 0xF7 ; /* 11110111 */
...
outportb (CONTROL , inport (CONTROL) & MASKA); /* wyzerowanie bitu */
/* ~C3 w rejestrze sterującym */
...
Warto jeszcze raz wspomnieć, iż w powyższym przykładzie manipulacji podlega akurat jedna z pozycji bitowych, która jest zanegowana. W konsekwencji, pierwsza instrukcja outportb powoduje wymuszenie poziomu O na końcówce 17 a druga podniesienie poziomu napięcia do wysokości logicznej l.
Na zakończenie przedstawimy przykład najprostszego interfejsu wykorzystującego standardowy port równoległy. Schemat takiego układu składającego się z przycisku P l i System reaguje mruganiem diody LED na naciśnięcie przycisku Pl. Jako linia wejściowa wykorzystywany jest sygnał ~ERR (końcówka 15) stowarzyszony z bitem 3 rejestru stanu. Wyjście stanowi bit 2 rejestru danych (końcówka 4). Proszę zwrócić uwagę, iż interfejs tego typu wymaga zewnętrznego napięcia zasilania +5 V. W powyższym przykładzie wyprowadzenie masy pobierane jest z końcówki 25. Oto prosty program w języku C obsługujący nasz układ.
#include
#incllude
#define DATA 0x378
#define STATUS 0x379
void main (void)
{
int var;
while (1)
{
var = inportb (STATUS) ;
if ((var & 0x08) == 0) /* jeżeli S3 jest wyzerowany */
{ /* to Pl załączony) */
outportb (DATA , 0x00) ; /* bit D2=0, LED świeci */
delay (200) ;
outportb (DATA , 0x04) ; /* bit D2=l, LED gaśnie */
delay (200) ;
}
else
{
outportb (DATA , 0x04) ; /* jeżeli Pl zwolniony, */
} /* bit D2=li LED wyłączony) */
}
}
W powyższym przykładzie widać wyraźnie, iż cała moc obliczeniowa komputera zaangażowana jest w realizację prymitywnej pętli. Nieustające pobieranie i analiza zawartości portu (Pooling) nie stanowi jedynej możliwości oprogramowania przykładowego interfejsu. Kontroler portu równoległego wyposażony został bowiem w prosty system generacji przerwań. Cecha ta umożliwia implementację układów automatyki reagujących na wystąpienie pewnych zjawisk (np. przekroczenie temperatury).
Warto nadmienić, iż przerwania nie są niezbędne do samego procesu drukowania. Nie były one wykorzystywane ani przez MS-DOS ani przez MS Windows. Korzystały z nich jedynie wczesne wersje OS/2. Obsługa drukarki przebiega bez zakłóceń nawet w przypadku wyłączenia generacji przerwań. Deaktywację taką można podjąć zerując bit 4 w rejestrze sterującym. Ustawienie tego bitu powoduje, iż kontroler pobudza linię IRQ5 lub IRQ7 (zależnie od konfiguracji) w momencie wykrycia narastającego zbocza na linii ~ACK. Zewnętrzne układy logiczne muszą zadbać o skierowanie ocenianego sygnału na tą właśnie linię. Program sterowania interfejsu należy w tym wypadku umieścić w procedurze obsługi przerwania podmieniając stosowne adresy punktów wejściowych w tabelach wektorów BIOS.
Należy pamiętać, że układy wejścia-wyjścia złącza równoległego wykonane są w technice TTL i źle znoszą przeciążenia. Prąd pobierany z wyjścia nie powinien przekraczać wartości kilku mA. Dla wszystkich linii, z których korzystają zewnętrzne układy interfejsu zaleca się stosowanie separujących bramek buforowych.
Wyszukiwarka
Podobne podstrony:
Pan Wolodyjowski Rozdzial 12
rozdzial (12)
rozdzial (12)
rozdzial (12)
rozdzial 12
Dlaczego zwierzęta 13 Rozdział 12 – Dokumentacja
rozdzial (12)
rozdzial (12)
Rozdział 12 Konfiguracja sieci WAN opartej na Linuksie
14 Rozdzial 12
ROZDZIAŁ 12 Dziedziczny rak żołądka
ROZDZIAŁ 12 Dziedziczny rak żołądka
więcej podobnych podstron