Difference between revisions of "Hardware Access/ja"

From Lazarus wiki
Jump to navigationJump to search
 
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
{{Hardware Access}}
 
{{Hardware Access}}
 +
 +
{{Japanese Menu}}
 
__TOC__
 
__TOC__
 
==概要==
 
==概要==
 
このページはLazarusでハードウェアデバイスにアクセスを行うためのチュートリアルです。ここにはISA、PCI、USB、パラレルポート、シリアルポートの各デバイスについて書かれていますが、完全ではありません。
 
このページはLazarusでハードウェアデバイスにアクセスを行うためのチュートリアルです。ここにはISA、PCI、USB、パラレルポート、シリアルポートの各デバイスについて書かれていますが、完全ではありません。
 
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.
 
  
 
ハードウェアデバイスへのアクセスはFree PascalランタイムライブラリやLCLをもってしても完全な移植性をもつことはできません。このチュートリアルは多くのプラットホームに適用できるハードウェアへアクセスの手法の基本的な部分をカバーします。コードを違った環境でコンパイルするためには以下のような条件付きコンパイルが必要となるでしょう。
 
ハードウェアデバイスへのアクセスはFree PascalランタイムライブラリやLCLをもってしても完全な移植性をもつことはできません。このチュートリアルは多くのプラットホームに適用できるハードウェアへアクセスの手法の基本的な部分をカバーします。コードを違った環境でコンパイルするためには以下のような条件付きコンパイルが必要となるでしょう。
 
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:
 
  
 
<code>
 
<code>
Line 21: Line 19:
 
</code>
 
</code>
  
x86プロセッサ上で動作するMac OS Xでのハードウェアアクセスが可能かどうかは現時点では不明です。It can disallow it, though I assume in that case, in time, drivers like io.dll will appear.
+
x86プロセッサ上で動作するMac OS Xでのハードウェアアクセスが可能かどうかは現時点では不明です。
 
 
It is not known yet, at this time, if Mac OS X/x86 will allow HW access. It can disallow it, though I assume in that case, in time, drivers like io.dll will appear.
 
  
 
==パラレルおよびシリアル接続==
 
==パラレルおよびシリアル接続==
 
ISAカード、PCIカードおよびパラレルポートでの通信ではコンピュータは'''パラレル'''プロトコルを使用します。シリアルポートやUSBデバイスでは'''シリアル'''プロトコルを使用します。このようにプロトコルを使い分けるのは、プロセッサやプログラミング言語はすべてデータにパラレルでアプローチするため、より簡単にするためにプロトコルはソフトウェア側で実装してやる必要があるのです。
 
ISAカード、PCIカードおよびパラレルポートでの通信ではコンピュータは'''パラレル'''プロトコルを使用します。シリアルポートやUSBデバイスでは'''シリアル'''プロトコルを使用します。このようにプロトコルを使い分けるのは、プロセッサやプログラミング言語はすべてデータにパラレルでアプローチするため、より簡単にするためにプロトコルはソフトウェア側で実装してやる必要があるのです。
 
例えばあなたがInteger変数にアクセスする時、それは一つのコマンドで行う事ができます。しかしそれは連続した手順によって一度に一ビットずつデータを取得しているだけなのです。ですから、その断片化したデータをくっつけてやる必要があります。
 
例えばあなたがInteger変数にアクセスする時、それは一つのコマンドで行う事ができます。しかしそれは連続した手順によって一度に一ビットずつデータを取得しているだけなのです。ですから、その断片化したデータをくっつけてやる必要があります。
 
 
ISA Cards, PCI Cards and the Parallel Port communicate with the computer using a '''parallel''' protocol. The Serial Port and USB devices work with a '''serial''' protocol. Because the processor and thus programming languages all work on a parallel approach to data, access to this kinds of protocols is easier to be implemented on the software side. When you access an Integer variable, for example, you can access it's value with a single command. With a serial protocol, however, you can only know one bit at a time, and you need to glue the pieces together to understand the data.
 
  
 
シリアル通信を直接行う事は難しいですが、仮実装されたコンポーネントを使用する事により簡単に行う事もできます。また、ハードウェア側ではそれすらできないので、多くの場合それを実行するのに特化した装置が必要であり、ICやマイクロコントローラを使用する必要があります。
 
シリアル通信を直接行う事は難しいですが、仮実装されたコンポーネントを使用する事により簡単に行う事もできます。また、ハードウェア側ではそれすらできないので、多くの場合それを実行するのに特化した装置が必要であり、ICやマイクロコントローラを使用する必要があります。
 
Serial communication is difficult to be implemented directly, but it can be pretty easy if you use a pre-made component. It is also harder on the hardware side, so many devices use specialised Integrated Circuits or even Microcontrolers to implement it.
 
  
 
ハードウェアアクセスプロトコルの簡潔な比較を以下に提示します。
 
ハードウェアアクセスプロトコルの簡潔な比較を以下に提示します。
 
Now a brief comparison of hardware access protocols will be given:
 
  
 
{| border=2 width="100%"
 
{| border=2 width="100%"
Line 72: Line 61:
 
| align="center" | 非常に速い (> E9 bit/s)
 
| align="center" | 非常に速い (> E9 bit/s)
 
| align="center" | 非常に難しい
 
| align="center" | 非常に難しい
 
|}
 
 
{| border=2 width="100%"
 
 
|-
 
!
 
! Speed
 
! Hardware implementation difficulty
 
 
|-
 
! Serial Port
 
| align="center" | Very slow (< E5 bit/s)
 
| align="center" | Medium
 
 
|-
 
! Parallel Port
 
| align="center" | Slow (~ E6 bit/s)
 
| align="center" | Easy
 
 
|-
 
 
! ISA Card
 
| align="center" | Medium (~ E7 bit/s)
 
| align="center" | Medium
 
 
|-
 
! USB
 
| align="center" | Medium (~ E7 bit/s)
 
| align="center" | Hard
 
 
|-
 
! PCI Card
 
| align="center" | Very Fast (> E9 bit/s)
 
| align="center" | Very Hard
 
  
 
|}
 
|}
Line 114: Line 68:
 
===Windows上でinpout32.dllを使用する===
 
===Windows上でinpout32.dllを使用する===
 
Windowsではハードウェアデバイスへのアクセスを行う手順に9x系とNT系では違いがあります。9x系(95,98,Me)ではプログラムはDOSのように直接ハードウェアに対してアクセスすることができます。NT系(Windows NT,2000,XP)ではそのような方法は使えません。すべてのハードウェアポートはデバイスドライバによって通信する事ができます。これはセキュリティ上の問題からそうなっていますが、ドライバを作るためには時間とお金が必要で小さいプロジェクトは難しいでしょう。
 
Windowsではハードウェアデバイスへのアクセスを行う手順に9x系とNT系では違いがあります。9x系(95,98,Me)ではプログラムはDOSのように直接ハードウェアに対してアクセスすることができます。NT系(Windows NT,2000,XP)ではそのような方法は使えません。すべてのハードウェアポートはデバイスドライバによって通信する事ができます。これはセキュリティ上の問題からそうなっていますが、ドライバを作るためには時間とお金が必要で小さいプロジェクトは難しいでしょう。
 
Windows has different ways to access hardware devices on the 9x series and on the NT series. On the 9x series (95, 98, Me) programs can access the hardware directly, just like they did on DOS. The NT series (Windows NT and XP), however, don't allow this approach. On this architecture, all communication with hardware ports must be throught a device driver. This is a security mechanism, but developing a driver can cost too much in terms of time and money for small projects.
 
  
 
しかし、幸せな事にこの問題を解決するライブラリがあります。WIndowsNTが検出されるとそれはHWInterface.sysカーネルデバイスドライバを解凍して、インストールします。Window9xが検出されると、それはハードウェアデバイスにアクセスするのに単にアセンブラオペコードを使用します。
 
しかし、幸せな事にこの問題を解決するライブラリがあります。WIndowsNTが検出されるとそれはHWInterface.sysカーネルデバイスドライバを解凍して、インストールします。Window9xが検出されると、それはハードウェアデバイスにアクセスするのに単にアセンブラオペコードを使用します。
 
Happily there is a library that solves this problem. If Windows NT is detected, it decompresses HWInterface.sys kernel device driver and installs it. If Windows 9x is detected, it simply uses assembler opcodes to access the hardware.
 
  
 
でもそのライブラリをどうやって使ったらいいのでしょうか?簡単です!このライブラリはInp32とOut32という2つの関数しか持っていませんし、その使用は非常に直感的です。
 
でもそのライブラリをどうやって使ったらいいのでしょうか?簡単です!このライブラリはInp32とOut32という2つの関数しか持っていませんし、その使用は非常に直感的です。
 
But how do I use the library? Simple! It has only two functions, Inp32 and Out32, and their use is quite intuitive.
 
  
 
ライブラリを動的にロードすると、関数は次のように定義されます
 
ライブラリを動的にロードすると、関数は次のように定義されます
 
We will load the library dynamically, so let's define both functions first:
 
  
 
<code>
 
<code>
Line 140: Line 86:
  
 
わたしたちはこれでライブラリをロードする事ができます。あなたのプログラムのメインフォームのOnCreateメソッドのような場所でこれを実行する事が可能です:
 
わたしたちはこれでライブラリをロードする事ができます。あなたのプログラムのメインフォームのOnCreateメソッドのような場所でこれを実行する事が可能です:
 
Now we can load the library. This can be implemented in a place like the OnCreate method of your program's main form:
 
  
 
<code>
 
<code>
Line 173: Line 117:
  
 
もしOnCreateでライブラリをロードしたなら、OnDestroyでアンロードする事を忘れないで下さい:
 
もしOnCreateでライブラリをロードしたなら、OnDestroyでアンロードする事を忘れないで下さい:
 
If you load the library on OnCreate just don't forget to unload it in OnDestroy:
 
  
 
<code>
 
<code>
Line 186: Line 128:
  
 
これはInp32関数を使う単純な例です:
 
これはInp32関数を使う単純な例です:
 
Here is a simple example of how to use Inp32 function:
 
  
 
<code>
 
<code>
Line 196: Line 136:
  
 
このコードはカスタムISAカードのポート$0200と、WindowsXP上のLazarus 0.9.10でテストされました。もちろんこのコードを実行するためにはuses節にWindowsが必要です。また、自分のアプリケーションと同じディレクトリに"input32.dll"も必要です。
 
このコードはカスタムISAカードのポート$0200と、WindowsXP上のLazarus 0.9.10でテストされました。もちろんこのコードを実行するためにはuses節にWindowsが必要です。また、自分のアプリケーションと同じディレクトリに"input32.dll"も必要です。
 
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.
 
  
 
このホームページのライブラリはこちら: [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]
 
このホームページのライブラリはこちら: [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]
  
This is the homepage for the library: [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]
+
===Linuxでiopermを使用する===
 
+
Linuxでハードウェアにアクセスする最適な方法はThroughtデバイスドライバを使用することですが、ドライバを作成するタスクは複雑なので整理されたメソッドを使えば楽にそれを行うことができます。
===Using ioperm to access ports on Linux===
 
 
 
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.
 
  
In order to use the "[[doc:rtl/ports|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 "[[doc:rtl/ports|ports]]" unit [http://www.freepascal.org/docs-html/rtl/ports/index.html here].
+
あなたのLinuxプログラム上で "[[doc:rtl/ports|ports]]" ユニットを呼び出すためにはrootで実行する必要があり、またIOPermを呼び出すためにはポートにアクセスするための権限が必要です。 あなたは"[[doc:rtl/ports|ports]]"ユニットについての情報を[http://www.freepascal.org/docs-html/rtl/ports/index.html ここ]で手に入れることができます。
  
The first thing to do is link to (g)libc and call IOPerm. A unit that links to the entire (g)libc exists on free pascal, but this unit gives problems when used directly by application and linking statically to the entire (g)libc library is not a very good idea because it changes often between version in an incompatible manner. Functions like ioperm, however, are unlikely to change.
+
最初にやることは、(g)libcをリンクして、IOPermをコールすることです。すべての(g)libc(の関数)にリンクするユニットは、free pascal上にありますが、このユニットをアプリケーションから直接リンクすることは問題をひきおこします。(g)libcライブラリ全体を静的リンクをおこなう、ということはあまり良い方法とはいえません、なぜなら、それはバージョンの間で、しばしば変更されるからです。iopermといった関数はしかしながら、変更することはあまりないと思います。
  
 
<code>
 
<code>
Line 217: Line 152:
 
</code>
 
</code>
  
* "from" represents the first port to be accessed.
 
* "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.
 
  
After linking to IOPerm you can port[<Address>] to access the ports.
+
* "from" はアクセスする最初のポートを指定します。
 +
* "num" は最初のポートから何ポートアクセスするかを指定します。
 +
たとえば、ioperm($220, 8, 1)はプログラムに$220から$227までのアクセス権限を与えます。
 +
 
 +
IOPermをリンクしたあとで、ポートにアクセスするために、port[<Address>]配列を使うことができます。
  
 
<code>
 
<code>
Line 232: Line 169:
 
</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
+
このコードは、Mandriva Linux 2005とDamn Small Linux 1.5上で、Lazarus 0.9.10を使って、自作のISAカードで$0220にアクセスしてテストしました。
  
===General UNIX Hardware Access===
+
===一般的なUNIXでのハードウエアアクセス===
  
 
<pre>
 
<pre>
Line 246: Line 183:
 
</pre>
 
</pre>
  
 +
'''注意''' FPCはin [[doc:rtl/x86/index.html|unit x86]]で"fpioperm"よ呼ばれる抽象的な機構を提供しています。そして、入出力機能を定義しています。
 +
これらの関数はx86で動作するLinuxとFreeBSDで実装されています。
  
'''Note''' that FPC provides an abstraction for ioperm called "fpioperm" in [[doc:rtl/x86/index.html|unit x86]], and also defines out and inport functions. These functions are currently implemented for Linux/x86 and FreeBSD/x86.
+
配布と関数のポータビリティのため、必要な抽象化なしにlibcをリンクすることは推奨されていません。libcの手動リンク(つまり、どこからでも使えるように、libcをad hoc宣言をする方法)をおこなうことは推奨されません。
  
It is not recommended to link to libc unless absolutely necessary due to possible deployment and portability functions.
+
(e.g. the above libc import line will unnecessarily fail if the standard C lib is not called libc, like e.g. libroot on BeOS, or on platforms with a non standard C symbol mangling).
Also manual linking to libc (by declaring ad hoc libc imports for functions that are available elsewhere) like done above is not recommended  (e.g. the above libc import line will unnecessarily fail if the standard C lib is not called libc, like e.g. libroot on BeOS, or on platforms with a non standard C symbol mangling).
+
訳注:うまいこと訳せないので、和訳せず、そのままのこしておきます。)
  
'''Note 2''' Using _unit_ libc is not recommended under any circumstances other than Kylix compability. This because the unit is relatively unportable (due to excessive exposure of structures and other private symbols) and must only be modified as little as possible out of Kylix compability issues.
 
  
==Serial Communication==
 
  
The [[Hardware Access#External Links | External Links]] section has UNIX and Windows serial port tutorials.
+
'''注意2''' _unit_ libcを使うことはどんな状況下でもKylixの互換性の点では推奨されません。このユニットは相対的にポータブルではないからです。(due to excessive exposure of structures and other private symbols)
  
==External Links==
+
そして、Kylixの互換性の問題からは、なるべく少なく変更すべきです。
  
Communication Protocols speed comparison:
+
==シリアル通信==
 +
 
 +
[[Hardware Access/ja#外部リンク | 外部リンク]]セクションにUNIXとWindowsのシリアルポートチュートリアルがあります。
 +
 
 +
==外部リンク==
 +
 
 +
通信プロトコルスピードの比較:
  
 
# http://en.wikipedia.org/wiki/Serial_port#Speed
 
# http://en.wikipedia.org/wiki/Serial_port#Speed
Line 267: Line 210:
 
# http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications
 
# http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications
  
Serial Communication Links:
+
 
 +
シリアル通信のリンク:
  
 
# On UNIX: [http://www.easysw.com/~mike/serial/serial.html]
 
# On UNIX: [http://www.easysw.com/~mike/serial/serial.html]
Line 273: Line 217:
 
# Synaser component: http://synapse.ararat.cz/
 
# Synaser component: http://synapse.ararat.cz/
  
ISA Digital Oscilloscope - A example of hardware access with full source included:
+
ISA デジタルオシロスコープ - 全ソースが含まれるハードウエアのアクセス例:
  
 
[http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/]
 
[http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/]

Latest revision as of 08:58, 20 August 2006

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)

日本語版メニュー
メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報

概要

このページはLazarusでハードウェアデバイスにアクセスを行うためのチュートリアルです。ここにはISA、PCI、USB、パラレルポート、シリアルポートの各デバイスについて書かれていますが、完全ではありません。

ハードウェアデバイスへのアクセスはFree PascalランタイムライブラリやLCLをもってしても完全な移植性をもつことはできません。このチュートリアルは多くのプラットホームに適用できるハードウェアへアクセスの手法の基本的な部分をカバーします。コードを違った環境でコンパイルするためには以下のような条件付きコンパイルが必要となるでしょう。

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

x86プロセッサ上で動作するMac OS Xでのハードウェアアクセスが可能かどうかは現時点では不明です。

パラレルおよびシリアル接続

ISAカード、PCIカードおよびパラレルポートでの通信ではコンピュータはパラレルプロトコルを使用します。シリアルポートやUSBデバイスではシリアルプロトコルを使用します。このようにプロトコルを使い分けるのは、プロセッサやプログラミング言語はすべてデータにパラレルでアプローチするため、より簡単にするためにプロトコルはソフトウェア側で実装してやる必要があるのです。 例えばあなたがInteger変数にアクセスする時、それは一つのコマンドで行う事ができます。しかしそれは連続した手順によって一度に一ビットずつデータを取得しているだけなのです。ですから、その断片化したデータをくっつけてやる必要があります。

シリアル通信を直接行う事は難しいですが、仮実装されたコンポーネントを使用する事により簡単に行う事もできます。また、ハードウェア側ではそれすらできないので、多くの場合それを実行するのに特化した装置が必要であり、ICやマイクロコントローラを使用する必要があります。

ハードウェアアクセスプロトコルの簡潔な比較を以下に提示します。

速度 実装の難易度
シリアルポート 非常に遅い (< E5 bit/s) 普通
パラレルポート 遅い (~ E6 bit/s) 簡単
ISAカード 普通 (~ E7 bit/s) 普通
USB 普通 (~ E7 bit/s) 難しい
PCIカード 非常に速い (> E9 bit/s) 非常に難しい

パラレル通信

Windows上でinpout32.dllを使用する

Windowsではハードウェアデバイスへのアクセスを行う手順に9x系とNT系では違いがあります。9x系(95,98,Me)ではプログラムはDOSのように直接ハードウェアに対してアクセスすることができます。NT系(Windows NT,2000,XP)ではそのような方法は使えません。すべてのハードウェアポートはデバイスドライバによって通信する事ができます。これはセキュリティ上の問題からそうなっていますが、ドライバを作るためには時間とお金が必要で小さいプロジェクトは難しいでしょう。

しかし、幸せな事にこの問題を解決するライブラリがあります。WIndowsNTが検出されるとそれはHWInterface.sysカーネルデバイスドライバを解凍して、インストールします。Window9xが検出されると、それはハードウェアデバイスにアクセスするのに単にアセンブラオペコードを使用します。

でもそのライブラリをどうやって使ったらいいのでしょうか?簡単です!このライブラリはInp32とOut32という2つの関数しか持っていませんし、その使用は非常に直感的です。

ライブラリを動的にロードすると、関数は次のように定義されます

type
  TInp32 = function(Address: ShortInt): ShortInt; stdcall;
  TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;

  • 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

わたしたちはこれでライブラリをロードする事ができます。あなたのプログラムのメインフォームのOnCreateメソッドのような場所でこれを実行する事が可能です:

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
    // needs overtyping, plain Delphi's @Inp32 = GetProc... leads to compile errors
    Inp32 := TInp32(GetProcAddress(Inpout32, 'Inp32'));
    if (@Inp32 = nil) then Caption := 'Error';
    Out32 := TOut32(GetProcAddress(Inpout32, 'Out32'));
    if (@Out32 = nil) then Caption := 'Error';
  end
  else Caption := 'Error';
{$ENDIF}
end;

もしOnCreateでライブラリをロードしたなら、OnDestroyでアンロードする事を忘れないで下さい:

procedure TMyForm.FormDestroy(Sender: TObject);
begin
{$IFDEF WIN32}
  FreeLibrary(Inpout32);
{$ENDIF}
end;

これはInp32関数を使う単純な例です:

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

このコードはカスタムISAカードのポート$0200と、WindowsXP上のLazarus 0.9.10でテストされました。もちろんこのコードを実行するためにはuses節にWindowsが必要です。また、自分のアプリケーションと同じディレクトリに"input32.dll"も必要です。

このホームページのライブラリはこちら: www.logix4u.net/inpout32.htm

Linuxでiopermを使用する

Linuxでハードウェアにアクセスする最適な方法はThroughtデバイスドライバを使用することですが、ドライバを作成するタスクは複雑なので整理されたメソッドを使えば楽にそれを行うことができます。

あなたのLinuxプログラム上で "ports" ユニットを呼び出すためにはrootで実行する必要があり、またIOPermを呼び出すためにはポートにアクセスするための権限が必要です。 あなたは"ports"ユニットについての情報をここで手に入れることができます。

最初にやることは、(g)libcをリンクして、IOPermをコールすることです。すべての(g)libc(の関数)にリンクするユニットは、free pascal上にありますが、このユニットをアプリケーションから直接リンクすることは問題をひきおこします。(g)libcライブラリ全体を静的リンクをおこなう、ということはあまり良い方法とはいえません、なぜなら、それはバージョンの間で、しばしば変更されるからです。iopermといった関数はしかしながら、変更することはあまりないと思います。

{$IFDEF Linux}
function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
{$ENDIF}


  • "from" はアクセスする最初のポートを指定します。
  • "num" は最初のポートから何ポートアクセスするかを指定します。

たとえば、ioperm($220, 8, 1)はプログラムに$220から$227までのアクセス権限を与えます。

IOPermをリンクしたあとで、ポートにアクセスするために、port[<Address>]配列を使うことができます。

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

このコードは、Mandriva Linux 2005とDamn Small Linux 1.5上で、Lazarus 0.9.10を使って、自作のISAカードで$0220にアクセスしてテストしました。

一般的なUNIXでのハードウエアアクセス

{$IFDEF Unix}
Uses Clib;   // retrieve libc library name.
{$ENDIF}

{$IFDEF Unix}
function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external clib;
{$ENDIF}

注意 FPCはin unit x86で"fpioperm"よ呼ばれる抽象的な機構を提供しています。そして、入出力機能を定義しています。 これらの関数はx86で動作するLinuxとFreeBSDで実装されています。

配布と関数のポータビリティのため、必要な抽象化なしにlibcをリンクすることは推奨されていません。libcの手動リンク(つまり、どこからでも使えるように、libcをad hoc宣言をする方法)をおこなうことは推奨されません。

(e.g. the above libc import line will unnecessarily fail if the standard C lib is not called libc, like e.g. libroot on BeOS, or on platforms with a non standard C symbol mangling). 訳注:うまいこと訳せないので、和訳せず、そのままのこしておきます。)


注意2 _unit_ libcを使うことはどんな状況下でもKylixの互換性の点では推奨されません。このユニットは相対的にポータブルではないからです。(due to excessive exposure of structures and other private symbols)

そして、Kylixの互換性の問題からは、なるべく少なく変更すべきです。

シリアル通信

外部リンクセクションにUNIXとWindowsのシリアルポートチュートリアルがあります。

外部リンク

通信プロトコルスピードの比較:

  1. http://en.wikipedia.org/wiki/Serial_port#Speed
  2. http://www.lvr.com/jansfaq.htm - Jan Axelson's Parallel Port FAQ
  3. http://en.wikipedia.org/wiki/USB#Transfer_Speed
  4. http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications


シリアル通信のリンク:

  1. On UNIX: [1]
  2. On Windows: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp
  3. Synaser component: http://synapse.ararat.cz/

ISA デジタルオシロスコープ - 全ソースが含まれるハードウエアのアクセス例:

[2]