Sign in Join
Wiki copytemporary

Hardware Access/sk: what changed

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

Title: Hardware Access/sk

OldNewLine
1+## O čom je článok
2+
3+Tá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.
4+
5+Platformovo 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:
6+
7+<code>
8+
9+`uses`\
10+` Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,`\
11+`{$IFDEF WIN32}`\
12+`  Windows;`\
13+`{$ENDIF}`\
14+`{$IFDEF Linux}`\
15+`  ports;`\
16+`{$ENDIF}`
17+
18+</code>
19+
20+Pomoc je vítaná, hlavne pre MacOS.
21+
22+## Používanie inpout32.dll na Windows
23+
24+Windows 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.
25+
26+Našť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.
27+
28+A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitívne.
29+
30+Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe funkcie:
31+
32+<code>
33+
34+`type`\
35+`  TInp32 = function(Address: ShortInt): ShortInt; stdcall;`\
36+`  TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;`
37+
38+</code>
39+
40+- Address reprezentuje adresu portu, ku ktorému chcete pristupovať.
41+- Out32 odosiela dáta špecifikované v Data na port určený v Address.
42+- Inp32 vracia jeden bajt z portu, ktorý ste zadali.
43+
44+Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.
45+
46+<code>
47+
48+`type`\
49+`  TMyForm = class(TForm)`\
50+`  .........`\
51+`  private`\
52+`    { private declarations }`\
53+`    Inpout32: THandle;`\
54+`    Inp32: TInp32;`\
55+`    Out32: TOut32;`\
56+`  .........`\
57+`implementation`\
58+`  .........`\
59+`procedure TMyForm.FormCreate(Sender: TObject);`\
60+`begin`\
61+`{$IFDEF WIN32}`\
62+`  Inpout32 := LoadLibrary('inpout32.dll');`\
63+`  if (Inpout32 <> 0) then`\
64+`  begin`\
65+`    @Inp32 := GetProcAddress(Inpout32, 'Inp32');`\
66+`    if (@Inp32 = nil) then Caption := 'Error';`\
67+`    @Out32 := GetProcAddress(Inpout32, 'Out32');`\
68+`    if (@Out32 = nil) then Caption := 'Error';`\
69+`  end`\
70+`  else Caption := 'Error';`\
71+`{$ENDIF}`\
72+`end;`
73+
74+</code>
75+
76+Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniť z pamäte:
77+
78+<code>
79+
80+`procedure TMyForm.FormDestroy(Sender: TObject);`\
81+`begin`\
82+`{$IFDEF WIN32}`\
83+`  FreeLibrary(Inpout32);`\
84+`{$ENDIF}`\
85+`end;`
86+
87+</code>
88+
89+Toto je jednoduchý príklad, ako používať funkciu Inp32:
90+
91+<code>
92+
93+`{$IFDEF WIN32}`\
94+`  myLabel.Caption := IntToStr(Inp32($0220));`\
95+`{$ENDIF}`
96+
97+</code>
98+
99+Tento 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.
100+
101+Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](http://www.logix4u.net/inpout32.htm)
102+
103+## Použitie ioperm na prístup k portom na Linuxe
104+
105+Najlepší 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é.
106+
107+Aby 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).
108+
109+Prvá 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.
110+
111+<code>
112+
113+`{$IFDEF Linux}`\
114+`function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';`\
115+`{$ENDIF}`
116+
117+</code>
118+
119+- "from" repezentuje prvý port, ktorý sa má sprístupniť, "num" je počet
120+- portov, na ktoré sa ma pristupovať po prvom, takže ioperm(\$220, 8,
121+- 1\) sprístupní pre náš program všetky porty od \$220 do \$227 (vrátane oboch).
122+
123+Po sprístupnení OIPerm môžete na porty pristupovať cez port\[\<adresa\>\].
124+
125+<code>
126+
127+`{$IFDEF Linux}`\
128+`  i := ioperm($220, 8, 1);`\
129+`  port[$220] := $00;`\
130+`  myLabel.Caption := 'ioperm: ' + IntToStr(i);`\
131+`  i := Integer(port[$220]);`\
132+`  myOtherLabel.Caption := 'response: ' + IntToStr(i);`\
133+`{$ENDIF}`
134+
135+</code>
136+
137+Tento 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
138+
139+---
140+*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