Sign in Join
Wiki copytemporary

Hardware Access/sk: what changed

Revision 4 to 5. 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-`uses`\
8-` Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,`\
9-`{$IFDEF WIN32}`\
10-`  Windows;`\
11-`{$ENDIF}`\
12-`{$IFDEF Linux}`\
13-`  ports;`\
14-`{$ENDIF}`
7+``` pascal
8+uses
9+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
10+{$IFDEF WIN32}
11+ Windows;
12+{$ENDIF}
13+{$IFDEF Linux}
14+ ports;
15+{$ENDIF}
16+```
1517
1618Pomoc je vítaná, hlavne pre MacOS.
1719
1820## Používanie inpout32.dll na Windows
1921
2022Windows 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.
2123
2224Našť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.
2325
2426A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitívne.
2527
2628Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe funkcie:
2729
28-`type`\
29-`  TInp32 = function(Address: ShortInt): ShortInt; stdcall;`\
30-`  TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;`
30+``` pascal
31+type
32+ TInp32 = function(Address: ShortInt): ShortInt; stdcall;
33+ TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
34+```
3135
3236- Address reprezentuje adresu portu, ku ktorému chcete pristupovať.
3337- Out32 odosiela dáta špecifikované v Data na port určený v Address.
3438- Inp32 vracia jeden bajt z portu, ktorý ste zadali.
3539
3640Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.
3741
38-`type`\
39-`  TMyForm = class(TForm)`\
40-`  .........`\
41-`  private`\
42-`    { private declarations }`\
43-`    Inpout32: THandle;`\
44-`    Inp32: TInp32;`\
45-`    Out32: TOut32;`\
46-`  .........`\
47-`implementation`\
48-`  .........`\
49-`procedure TMyForm.FormCreate(Sender: TObject);`\
50-`begin`\
51-`{$IFDEF WIN32}`\
52-`  Inpout32 := LoadLibrary('inpout32.dll');`\
53-`  if (Inpout32 <> 0) then`\
54-`  begin`\
55-`    @Inp32 := GetProcAddress(Inpout32, 'Inp32');`\
56-`    if (@Inp32 = nil) then Caption := 'Error';`\
57-`    @Out32 := GetProcAddress(Inpout32, 'Out32');`\
58-`    if (@Out32 = nil) then Caption := 'Error';`\
59-`  end`\
60-`  else Caption := 'Error';`\
61-`{$ENDIF}`\
62-`end;`
42+``` pascal
43+type
44+ TMyForm = class(TForm)
45+ .........
46+ private
47+ { private declarations }
48+ Inpout32: THandle;
49+ Inp32: TInp32;
50+ Out32: TOut32;
51+ .........
52+implementation
53+ .........
54+procedure TMyForm.FormCreate(Sender: TObject);
55+begin
56+{$IFDEF WIN32}
57+ Inpout32 := LoadLibrary('inpout32.dll');
58+ if (Inpout32 <> 0) then
59+ begin
60+ @Inp32 := GetProcAddress(Inpout32, 'Inp32');
61+ if (@Inp32 = nil) then Caption := 'Error';
62+ @Out32 := GetProcAddress(Inpout32, 'Out32');
63+ if (@Out32 = nil) then Caption := 'Error';
64+ end
65+ else Caption := 'Error';
66+{$ENDIF}
67+end;
68+```
6369
6470Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniť z pamäte:
6571
66-`procedure TMyForm.FormDestroy(Sender: TObject);`\
67-`begin`\
68-`{$IFDEF WIN32}`\
69-`  FreeLibrary(Inpout32);`\
70-`{$ENDIF}`\
71-`end;`
72+``` pascal
73+procedure TMyForm.FormDestroy(Sender: TObject);
74+begin
75+{$IFDEF WIN32}
76+ FreeLibrary(Inpout32);
77+{$ENDIF}
78+end;
79+```
7280
7381Toto je jednoduchý príklad, ako používať funkciu Inp32:
7482
75-`{$IFDEF WIN32}`\
76-`  myLabel.Caption := IntToStr(Inp32($0220));`\
77-`{$ENDIF}`
83+``` pascal
84+{$IFDEF WIN32}
85+ myLabel.Caption := IntToStr(Inp32($0220));
86+{$ENDIF}
87+```
7888
7989Tento 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.
8090
8191Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](http://www.logix4u.net/inpout32.htm)
8292
8393## Použitie ioperm na prístup k portom na Linuxe
8494
8595Najlepší 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é.
8696
8797Aby 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).
8898
8999Prvá 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.
90100
91-`{$IFDEF Linux}`\
92-`function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';`\
93-`{$ENDIF}`
101+``` pascal
102+{$IFDEF Linux}
103+function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
104+{$ENDIF}
105+```
94106
95107- "from" repezentuje prvý port, ktorý sa má sprístupniť, "num" je počet
96108- portov, na ktoré sa ma pristupovať po prvom, takže ioperm(\$220, 8,
97109- 1\) sprístupní pre náš program všetky porty od \$220 do \$227 (vrátane oboch).
98110
99111Po sprístupnení OIPerm môžete na porty pristupovať cez port\[\<adresa\>\].
100112
101-`{$IFDEF Linux}`\
102-`  i := ioperm($220, 8, 1);`\
103-`  port[$220] := $00;`\
104-`  myLabel.Caption := 'ioperm: ' + IntToStr(i);`\
105-`  i := Integer(port[$220]);`\
106-`  myOtherLabel.Caption := 'response: ' + IntToStr(i);`\
107-`{$ENDIF}`
113+``` pascal
114+{$IFDEF Linux}
115+ i := ioperm($220, 8, 1);
116+ port[$220] := $00;
117+ myLabel.Caption := 'ioperm: ' + IntToStr(i);
118+ i := Integer(port[$220]);
119+ myOtherLabel.Caption := 'response: ' + IntToStr(i);
120+{$ENDIF}
121+```
108122
109123Tento 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
110124
111125---
112126*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