Revision 3 of 5, by WikiArchive on 11-4-2026. The page as it is now.
Hardware Access/sk
Contents
- 1 O �om je �lánok
- 2 PoužÃvanie inpout32.dll na Windows
- 3 Použitie ioperm na prÃstup k portom na Linuxe
O �om je �lánok
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.
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:
`
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
{$IFDEF WIN32}
Windows;
{$ENDIF}
{$IFDEF Linux}
ports;
{$ENDIF}
``
Pomoc je vÃtaná, hlavne pre MacOS.
## PoužÃvanie inpout32.dll na Windows
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.
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.
A ako použÃvaÅ¥ knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich použitie je celkom intuitÃvne.
Knižnicu budeme naÄ�ÃtavaÅ¥ dynamicky, takže najskôr potrebujeme definovaÅ¥ obe funkcie:
` `
`type TInp32 = function(Address: ShortInt): ShortInt; stdcall; TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
``
- Address reprezentuje adresu portu, ku ktorému chcete pristupovať.
- Out32 odosiela dáta špecifikované v Data na port ur�ený v Address.
- Inp32 vracia jeden bajt z portu, ktorý ste zadali.
Teraz môžeme naÄ�ÃtaÅ¥ knižnicu. Môžete to implementovaÅ¥ naprÃklad v metóde OnCreate vášho hlavného formulára.
`
type
TMyForm = class(TForm)
.........
private
{ private declarations }
Inpout32: THandle;
Inp32: TInp32;
Out32: TOut32;
.........
implementation
.........
procedure TMyForm.FormCreate(Sender: TObject);
begin
{$IFDEF WIN32}
Inpout32Â := LoadLibrary('inpout32.dll');
if (Inpout32 <> 0) then
begin
@Inp32Â := GetProcAddress(Inpout32, 'Inp32');
if (@Inp32 = nil) then Caption := 'Error';
@Out32Â := GetProcAddress(Inpout32, 'Out32');
if (@Out32 = nil) then Caption := 'Error';
end
else Caption := 'Error';
{$ENDIF}
end;
``
Ak ste knižnicu naÄ�Ãtavali pri OnCreate, nezabudnite ju pri OnDestroy aj uvoľniÅ¥ z pamäte:
` `
`procedure TMyForm.FormDestroy(Sender: TObject); begin {$IFDEF WIN32} FreeLibrary(Inpout32); {$ENDIF} end;
``
Toto je jednoduchý prÃklad, ako použÃvaÅ¥ funkciu Inp32:
`
{$IFDEF WIN32}
myLabel.Caption := IntToStr(Inp32($0220));
{$ENDIF}
``
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.
Domovskú stránku knižnice nájdete tu: [www.logix4u.net/inpout32.htm](<http://www.logix4u.net/inpout32.htm>)
## Použitie ioperm na prÃstup k portom na Linuxe
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é.
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>).
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.
` `
`{$IFDEF Linux} function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc'; {$ENDIF}
``
- "from" repezentuje prvý port, ktorý sa má sprÃstupniÅ¥, "num" je poÄ�et
- portov, na ktoré sa ma pristupovať po prvom, takže ioperm($220, 8,
-
- sprÃstupnà pre náš program vÅ¡etky porty od $220 do $227 (vrátane oboch).
Po sprÃstupnenà OIPerm môžete na porty pristupovaÅ¥ cez port[<adresa>].
`
{$IFDEF Linux}
i := ioperm($220, 8, 1);
port[$220]Â := $00;
myLabel.Caption := 'ioperm: ' + IntToStr(i);
i := Integer(port[$220]);
myOtherLabel.Caption := 'response: ' + IntToStr(i);
{$ENDIF}
``
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
---
*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).*