Sign in Join
Wiki copytemporary

Hardware Access/sk: what changed

Revision 3 to 4. 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-
71## O čom je článok
82
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.
10-
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:
12-
13-` `
14-
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-```
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.
264
27-```
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:
286
29-``
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}`
3015
31-Pomoc je vítaná, hlavne pre MacOS.
16+Pomoc je vítaná, hlavne pre MacOS.
3217
3318## Používanie inpout32.dll na Windows
3419
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.
36-
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.
38-
39-A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitívne.
40-
41-Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe funkcie:
42-
43-` `
44-
45-`
46-```
47-type
48- TInp32 = function(Address: ShortInt): ShortInt; stdcall;
49- TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
50-```
51-
52-```
53-
54-``
55-
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.
59-
60-Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.
61-
62-` `
63-
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-```
92-
93-```
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.
9421
95-``
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.
9623
97-Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniť z pamäte:
24+A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitívne.
9825
99-` `
26+Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe funkcie:
10027
101-`
102-```
103-procedure TMyForm.FormDestroy(Sender: TObject);
104- begin
105- {$IFDEF WIN32}
106- FreeLibrary(Inpout32);
107- {$ENDIF}
108- end;
109-```
28+`type`\
29+`  TInp32 = function(Address: ShortInt): ShortInt; stdcall;`\
30+`  TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;`
11031
111-```
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.
11235
113-``
36+Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.
11437
115-Toto je jednoduchý príklad, ako používať funkciu Inp32:
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;`
11663
117-` `
64+Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniť z pamäte:
11865
119-`
120-```
121-{$IFDEF WIN32}
122- myLabel.Caption := IntToStr(Inp32($0220));
123- {$ENDIF}
124-```
66+`procedure TMyForm.FormDestroy(Sender: TObject);`\
67+`begin`\
68+`{$IFDEF WIN32}`\
69+`  FreeLibrary(Inpout32);`\
70+`{$ENDIF}`\
71+`end;`
12572
126-```
73+Toto je jednoduchý príklad, ako používať funkciu Inp32:
12774
128-``
75+`{$IFDEF WIN32}`\
76+`  myLabel.Caption := IntToStr(Inp32($0220));`\
77+`{$ENDIF}`
12978
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.
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.
13180
132-Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](<http://www.logix4u.net/inpout32.htm>)
81+Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](http://www.logix4u.net/inpout32.htm)
13382
13483## Použitie ioperm na prístup k portom na Linuxe
13584
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é.
137-
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>).
139-
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.
141-
142-
143-` `
144-
145-`
146-```
147-{$IFDEF Linux}
148- function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
149- {$ENDIF}
150-```
151-
152-```
153-
154-``
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é.
15586
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).
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).
15988
160-Po sprístupnení OIPerm môžete na porty pristupovať cez port[<adresa>].
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.
16190
162-` `
91+`{$IFDEF Linux}`\
92+`function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';`\
93+`{$ENDIF}`
16394
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-```
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).
17498
175-```
99+Po sprístupnení OIPerm môžete na porty pristupovať cez port\[\<adresa\>\].
176100
177-``
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}`
178108
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
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
180110
181111---
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).*
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).*

Back to history