Sign in Join
Wiki copytemporary

Hardware Access/sk: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## O čom je článok
22
33Táto stránka je začiatkom tutoriálu venovanom prístupe k hardwarovým zariadeniam v Lazare. Medzi tieto zariadenia patria (ale nie sú jediné): ISA, PCI, paralelný sériový port.
44
55Platformovo nezávislý prístup k zariadeniam nie je implementovaný ani freepascalovskou RTL (Runtime Library) ani LCL, takže tento článok sa venuje metódam prístupu k hardvérovým zariadeniam na rozličných platformách. Zdrojový kód však môže byť pri používaní podmienenej kompilácie preložený na rozličných systémoch. Príklad podmienenej kompilácie:
66
7-<code>
8-
97`uses`\
108` Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,`\
119`{$IFDEF WIN32}`\
1210`  Windows;`\
1311`{$ENDIF}`\
1412`{$IFDEF Linux}`\
1513`  ports;`\
1614`{$ENDIF}`
1715
18-</code>
19-
2016Pomoc je vítaná, hlavne pre MacOS.
2117
2218## Používanie inpout32.dll na Windows
2319
2420Windows používa rozličné spôsoby prístupu k hardvérovým zariadeniam na systémoch skupiny 9x a iný v skupine NT. Toto môže pôsobiť skutočne problematicky. Windows 9x (95, 98, Me) umožňujú programovať pristupovať na porty priamo, podobne ako to bolo v DOSe. Avšak Windows NT už toto vôbec nedovolí a k portom treba pristupovať cez ovládače zariadení. Je to bezpečnostný mechanizmus, ale môže byť dosť otravné, keď je ovládač zariadenia príliš komplexný pre malý projket, ktorý potrebuje pristupovať k paralelnému portu.
2521
2622Našťastie existuje knižnica, ktorá v sebe nesie ovládače zariadení. Ak detekuje Windows z rodiny NT, dekomprimuje ovládač a nainštaluje pre jadro ovládač Hwinterface.sys. Keď zdetekuje Windows rodiny 9x, jednoducho použije na prístup k zariadeniam assembler.
2723
2824A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitívne.
2925
3026Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe funkcie:
3127
32-<code>
33-
3428`type`\
3529`  TInp32 = function(Address: ShortInt): ShortInt; stdcall;`\
3630`  TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;`
3731
38-</code>
39-
4032- Address reprezentuje adresu portu, ku ktorému chcete pristupovať.
4133- Out32 odosiela dáta špecifikované v Data na port určený v Address.
4234- Inp32 vracia jeden bajt z portu, ktorý ste zadali.
4335
4436Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.
4537
46-<code>
47-
4838`type`\
4939`  TMyForm = class(TForm)`\
5040`  .........`\
5141`  private`\
5242`    { private declarations }`\
5343`    Inpout32: THandle;`\
5444`    Inp32: TInp32;`\
5545`    Out32: TOut32;`\
5646`  .........`\
5747`implementation`\
5848`  .........`\
5949`procedure TMyForm.FormCreate(Sender: TObject);`\
6050`begin`\
6151`{$IFDEF WIN32}`\
6252`  Inpout32 := LoadLibrary('inpout32.dll');`\
6353`  if (Inpout32 <> 0) then`\
6454`  begin`\
6555`    @Inp32 := GetProcAddress(Inpout32, 'Inp32');`\
6656`    if (@Inp32 = nil) then Caption := 'Error';`\
6757`    @Out32 := GetProcAddress(Inpout32, 'Out32');`\
6858`    if (@Out32 = nil) then Caption := 'Error';`\
6959`  end`\
7060`  else Caption := 'Error';`\
7161`{$ENDIF}`\
7262`end;`
7363
74-</code>
75-
7664Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniť z pamäte:
7765
78-<code>
79-
8066`procedure TMyForm.FormDestroy(Sender: TObject);`\
8167`begin`\
8268`{$IFDEF WIN32}`\
8369`  FreeLibrary(Inpout32);`\
8470`{$ENDIF}`\
8571`end;`
8672
87-</code>
88-
8973Toto je jednoduchý príklad, ako používať funkciu Inp32:
9074
91-<code>
92-
9375`{$IFDEF WIN32}`\
9476`  myLabel.Caption := IntToStr(Inp32($0220));`\
9577`{$ENDIF}`
9678
97-</code>
98-
9979Tento kód bol testovaný s vlastnou ISA kartou na porte \$0220, Lazarom verzie 0.9.10 na Windows XP. Pre správny beh programu budete, samozrejme, potrebovať mať vo svojej uses klauzule uvedené "windows". Súbor "inpout.dll" by mal byť umiestnený v rovnakom adresári, ako vaša aplikácia.
10080
10181Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](http://www.logix4u.net/inpout32.htm)
10282
10383## Použitie ioperm na prístup k portom na Linuxe
10484
10585Najlepší spôsob pristupovania k hardvéru na Linuxe vedie cez ovládače zariadení. Avšak, vďaka komplexnosti úloh spojených s vytváraním ovládača, bývajú rýchlejšie metódy občas veľmi užitočné.
10686
10787Aby ste na LInuxe mohli používať unit "ports", váš program musí byť spustený s právami užívateľa root a pre nastavenie príslušných orpávnení prístupu k portom musí byť volaný IOPerm. Dokumentáciu vzťahujúcu sa k unitu "ports" môžete nájsť [tu](http://www.freepascal.org/docs-html/rtl/ports/index.html).
10888
10989Prvá vec, ktorú musíte urobiť, je zlikovať váš program s glibc a zavolať IOPerm. Vo FreePascale existuje unit, ktorý dynamicky linkuje celé glibc; avšak sú s ním problémy, keď je používaný priamo aplikáciou. A linkovať staticky celú glibc knižnicu nie je veľmi dobrá myšlienka pre multiplatfomovú aplikáciu, pretože používanie platformovo špecifických riešení by malo byť minimálne.
11090
111-<code>
112-
11391`{$IFDEF Linux}`\
11492`function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';`\
11593`{$ENDIF}`
11694
117-</code>
118-
11995- "from" repezentuje prvý port, ktorý sa má sprístupniť, "num" je počet
12096- portov, na ktoré sa ma pristupovať po prvom, takže ioperm(\$220, 8,
12197- 1\) sprístupní pre náš program všetky porty od \$220 do \$227 (vrátane oboch).
12298
12399Po sprístupnení OIPerm môžete na porty pristupovať cez port\[\<adresa\>\].
124100
125-<code>
126-
127101`{$IFDEF Linux}`\
128102`  i := ioperm($220, 8, 1);`\
129103`  port[$220] := $00;`\
130104`  myLabel.Caption := 'ioperm: ' + IntToStr(i);`\
131105`  i := Integer(port[$220]);`\
132106`  myOtherLabel.Caption := 'response: ' + IntToStr(i);`\
133107`{$ENDIF}`
134-
135-</code>
136108
137109Tento kód bol testovaný s vlastnou ISA kartou na porte \$0220, použijúc Lazarus 0.9.10 na systémoch Mandriva Linux 2005 a Damn Small Linux 1.5
138110
139111---
140112*From the Free Pascal wiki, page "Hardware Access/sk", as it stood on 2005-11-28 after a change by Moriquend, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history