Sign in Join
Wiki copytemporary

Hardware Access/sk: what changed

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

OldNewLine
1+## Contents
2+
3+ * 1 O čom je článok
4+ * 2 Používanie inpout32.dll na Windows
5+ * 3 Použitie ioperm na prístup k portom na Linuxe
6+
17## O čom je článok
28
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.
9+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.
410
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:
11+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:
612
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}`
13+` `
1514
16-Pomoc je vítaná, hlavne pre MacOS.
15+`
16+```
17+uses
18+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
19+ {$IFDEF WIN32}
20+ Windows;
21+ {$ENDIF}
22+ {$IFDEF Linux}
23+ ports;
24+ {$ENDIF}
25+```
1726
27+```
28+
29+``
30+
31+Pomoc je vítaná, hlavne pre MacOS.
32+
1833## Používanie inpout32.dll na Windows
1934
20-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.
35+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.
2136
22-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.
37+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.
2338
24-A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitívne.
39+A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitívne.
2540
26-Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe funkcie:
41+Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe funkcie:
2742
28-`type`\
29-`  TInp32 = function(Address: ShortInt): ShortInt; stdcall;`\
30-`  TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;`
43+` `
3144
32-- Address reprezentuje adresu portu, ku ktorému chcete pristupovať.
33-- Out32 odosiela dáta špecifikované v Data na port určený v Address.
34-- Inp32 vracia jeden bajt z portu, ktorý ste zadali.
45+`
46+```
47+type
48+ TInp32 = function(Address: ShortInt): ShortInt; stdcall;
49+ TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
50+```
3551
36-Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.
52+```
3753
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;`
54+``
6355
64-Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniť z pamäte:
56+ * Address reprezentuje adresu portu, ku ktorému chcete pristupovať.
57+ * Out32 odosiela dáta špecifikované v Data na port určený v Address.
58+ * Inp32 vracia jeden bajt z portu, ktorý ste zadali.
6559
66-`procedure TMyForm.FormDestroy(Sender: TObject);`\
67-`begin`\
68-`{$IFDEF WIN32}`\
69-`  FreeLibrary(Inpout32);`\
70-`{$ENDIF}`\
71-`end;`
60+Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.
7261
73-Toto je jednoduchý príklad, ako používať funkciu Inp32:
62+` `
7463
75-`{$IFDEF WIN32}`\
76-`  myLabel.Caption := IntToStr(Inp32($0220));`\
77-`{$ENDIF}`
64+`
65+```
66+type
67+ TMyForm = class(TForm)
68+ .........
69+ private
70+ { private declarations }
71+ Inpout32: THandle;
72+ Inp32: TInp32;
73+ Out32: TOut32;
74+ .........
75+ implementation
76+ .........
77+ procedure TMyForm.FormCreate(Sender: TObject);
78+ begin
79+ {$IFDEF WIN32}
80+ Inpout32 := LoadLibrary('inpout32.dll');
81+ if (Inpout32 <> 0) then
82+ begin
83+ @Inp32 := GetProcAddress(Inpout32, 'Inp32');
84+ if (@Inp32 = nil) then Caption := 'Error';
85+ @Out32 := GetProcAddress(Inpout32, 'Out32');
86+ if (@Out32 = nil) then Caption := 'Error';
87+ end
88+ else Caption := 'Error';
89+ {$ENDIF}
90+ end;
91+```
7892
79-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.
93+```
8094
81-Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](http://www.logix4u.net/inpout32.htm)
95+``
8296
97+Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniť z pamäte:
98+
99+` `
100+
101+`
102+```
103+procedure TMyForm.FormDestroy(Sender: TObject);
104+ begin
105+ {$IFDEF WIN32}
106+ FreeLibrary(Inpout32);
107+ {$ENDIF}
108+ end;
109+```
110+
111+```
112+
113+``
114+
115+Toto je jednoduchý príklad, ako používať funkciu Inp32:
116+
117+` `
118+
119+`
120+```
121+{$IFDEF WIN32}
122+ myLabel.Caption := IntToStr(Inp32($0220));
123+ {$ENDIF}
124+```
125+
126+```
127+
128+``
129+
130+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.
131+
132+Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](<http://www.logix4u.net/inpout32.htm>)
133+
83134## Použitie ioperm na prístup k portom na Linuxe
84135
85-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é.
136+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é.
86137
87-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).
138+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>).
88139
89-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.
140+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.
90141
91-`{$IFDEF Linux}`\
92-`function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';`\
93-`{$ENDIF}`
142+
143+` `
94144
95-- "from" repezentuje prvý port, ktorý sa má sprístupniť, "num" je počet
96-- portov, na ktoré sa ma pristupovať po prvom, takže ioperm(\$220, 8,
97-- 1\) sprístupní pre náš program všetky porty od \$220 do \$227 (vrátane oboch).
145+`
146+```
147+{$IFDEF Linux}
148+ function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
149+ {$ENDIF}
150+```
98151
99-Po sprístupnení OIPerm môžete na porty pristupovať cez port\[\<adresa\>\].
152+```
100153
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}`
154+``
108155
109-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
156+ * "from" repezentuje prvý port, ktorý sa má sprístupniť, "num" je počet
157+ * portov, na ktoré sa ma pristupovať po prvom, takže ioperm($220, 8,
158+ * 1) sprístupní pre náš program všetky porty od $220 do $227 (vrátane oboch).
110159
160+Po sprístupnení OIPerm môžete na porty pristupovať cez port[<adresa>].
161+
162+` `
163+
164+`
165+```
166+{$IFDEF Linux}
167+ i := ioperm($220, 8, 1);
168+ port[$220] := $00;
169+ myLabel.Caption := 'ioperm: ' + IntToStr(i);
170+ i := Integer(port[$220]);
171+ myOtherLabel.Caption := 'response: ' + IntToStr(i);
172+ {$ENDIF}
173+```
174+
175+```
176+
177+``
178+
179+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
180+
111181---
112-*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).*
182+*From the Free Pascal wiki, page "Hardware Access/sk", as the Internet Archive kept it on 2022-11-29. 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