Sign in Join
Wiki copytemporary

Revision 3 of 5, by WikiArchive on 11-4-2026. The page as it is now.

Hardware Access/sk

Contents

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:

`

pascal
uses
     Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
    {$IFDEF WIN32}
      Windows;
    {$ENDIF}
    {$IFDEF Linux}
      ports;
    {$ENDIF}
pascal

``

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;

pascal

``

Teraz môžeme na�ítať knižnicu. Môžete to implementovať napríklad v metóde OnCreate vášho hlavného formulára.

`

pascal
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;
pascal

``

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;

pascal

``

Toto je jednoduchý príklad, ako používať funkciu Inp32:

`

pascal
{$IFDEF WIN32}
      myLabel.Caption := IntToStr(Inp32($0220));
    {$ENDIF}
pascal

``

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}

pascal

``

Po sprístupnení OIPerm môžete na porty pristupovať cez port[<adresa>].

`

pascal
{$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}
pascal

``

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).*