Difference between revisions of "Hardware Access/sk"

From Lazarus wiki
Jump to navigationJump to search
 
 
Line 1: Line 1:
 
{{Hardware Access}}
 
{{Hardware Access}}
 
__TOC__
 
__TOC__
==Overview==
+
==O čom je článok==
This page is the start of a tutorial about accessing hardware devices on Lazarus. These devices include, but are not limited to: ISA, PCI, USB, parallel port, serial port.
+
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.
  
Access to hardware devices on a completely multi-platform way is not implemented by Free Pascal Runtime Library or by the LCL, so this tutorial will basically cover hardware access methods on different platforms. The code can be compiled on different environments using conditional compiles, like this:
+
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:
  
 
<code>
 
<code>
Line 17: Line 23:
 
</code>
 
</code>
  
Help is appreciated, specially about MacOS.
+
Pomoc je vítaná, hlavne pre MacOS.
  
==Using inpout32.dll for Windows==
+
==Používanie inpout32.dll na Windows==
Windows has different ways to access hardware devices on the 9x series and on the NT series, and this can be really problematic. The 9x series (95, 98, Me) allow the programs to access ports directly, just like they did on DOS. Windows NT, however, completely prevents this, and only allows access to the ports throught device drivers. This is a secutiry mechanism, but can be anoying as a device driver may be too complex for a small project that need to access a parallel port.
+
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.
  
Happily there is a library that carryes a device driver inside it. If Windows NT is detected, it decompresses the device and install the Hwinterface.sys kernel device driver. If Windows 9x is detected it simply uses assembler opcodes to access the hardware.
+
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.
  
But how to use the library? Simple! It only has two functions, Inp32 and Out32, and their use is quite intuitive.
+
A ako používať knižnicu? jednoducho! Pozná iba dve funkcie: Inp32 a Out32. Ich
 +
použitie je celkom intuitívne.
  
We will be loading the library dynamically, so let's define both functions first:
+
Knižnicu budeme načítavať dynamicky, takže najskôr potrebujeme definovať obe
 +
funkcie:
  
 
<code>
 
<code>
Line 34: Line 51:
 
</code>
 
</code>
  
* Address represents the address of the port you desire to access. Out32 sends Data to the port you specify by Address. Inp32 returns a byte from the port you specify by Address.
+
* 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.
  
Now we can load the library. This can be implemented in a place like the OnCreate method of your program's main form:
+
Teraz môžeme načítať knižnicu. Môžete to implementovať napríklad v metóde
 +
OnCreate vášho hlavného formulára.
  
 
<code>
 
<code>
Line 66: Line 86:
 
</code>
 
</code>
  
If you load the library on OnCreate just don't forget to unload it in OnDestroy:
+
Ak ste knižnicu načítavali pri OnCreate, nezabudnite ju pri OnDestroy
 +
aj uvoľniť z pamäte:
  
 
<code>
 
<code>
Line 77: Line 98:
 
</code>
 
</code>
  
Here is a simple example of how to use Inp32 function:
+
Toto je jednoduchý príklad, ako používať funkciu Inp32:
  
 
<code>
 
<code>
Line 85: Line 106:
 
</code>
 
</code>
  
This code was tested with a custom ISA card on port $0220, using Lazarus 0.9.10 on Windows XP. Of course you will need to have Windows on your uses clause in order for this code to run. For deployment you only need to include "inpout32.dll" in the same directory of our application.
+
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.
  
This is the homepage for the library: [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]
+
Domovskú stránku knižnice nájdete tu:
 +
[http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]
  
==Using ioperm to access ports on Linux==
+
==Použitie ioperm na prístup k portom na Linuxe==
  
The best way to access the hardware on Linux is throught device drivers, but, due to the complexity of the task of creating a driver, sometimes a quick method is very useful.
+
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é.
  
In order to use the "ports" unit under linux your program must be run as root, and IOPerm must be called to set appropriate permissions on the port access. You can find documentation about the "ports" unit [http://www.freepascal.org/docs-html/rtl/ports/index.html here].
+
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ť [http://www.freepascal.org/docs-html/rtl/ports/index.html tu].
 +
 
 +
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.
  
The first thing to do is link to glibc and call IOPerm. A unit that links to the entire glibc exists on free pascal, but this unit gives problems when used directly by application and linking statically to the entire glibc library is not a very good idea for a multi-platform application. The use of platform-specific functions should be kept to a minimum.
 
  
 
<code>
 
<code>
Line 103: Line 138:
 
</code>
 
</code>
  
* "from" represents the first port to be accessed.
+
* "from" repezentuje prvý port, ktorý sa má sprístupniť, "num" je počet
* "num" is the number of ports after the first to be accessed, so ioperm($220, 8, 1) will give access for the program for all ports between and including $220 and $227.
+
* portov, na ktoré sa ma pristupovať po prvom, takže ioperm($220, 8,
 +
* 1) sprístupní pre náš program všetky porty od $220 do $227 (vrátane oboch).
  
After linking to OIPerm you can port[<Address>] to access the ports.
+
Po sprístupnení OIPerm môžete na porty pristupovať cez port[<adresa>].
  
 
<code>
 
<code>
Line 118: Line 154:
 
</code>
 
</code>
  
This code was tested with a custom ISA card on port $0220, using Lazarus 0.9.10 on Mandriva Linux 2005 and Damn Small Linux 1.5
+
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

Latest revision as of 19:11, 28 November 2005

Deutsch (de) English (en) español (es) français (fr) magyar (hu) 日本語 (ja) 한국어 (ko) polski (pl) português (pt) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN)

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

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.

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,
  • 1) 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