上へ
===============================================================================
I/O Port Access Driver for Linux 2.2
programmed by kuma@webj.net 2001
===============================================================================
□概要
I/O ポートアクセス機能を提供します。
・デバイスID、ベンダーID から PCIベースアドレス取得
・バイト単位、ワード(16bit)単位 I/O ポートアクセス
□注意事項
ハードに直接アクセスするプログラムのため、使用には危険が伴いま
す、使用したいボードの、ベンダーID、デバイスID、I/Oポートアサ
インが調べられて、意味が分かる方以外は使用しないでください。
使用にあたっては各自の責任で使用してください。
□動作環境
Linux 2.2系列
以下の環境で動作を確認しています。
Laser5 Linux 6.4
Red Hat Linux 7.0
□インストール
1.アーカイブの展開
tar xzvf iolib000.tar.gz
2.インストール
%make
#make install
以下のファイルを作成します
./iolib.o
./iotest
/usr/local/lib/iolib.o
/etc/rc.d/init.d/iolib
/etc/rc.d/rc3.d/S99iolib
/etc/rc.d/rc5.d/S99iolib
/dev/iolib
□アンインストール
root で
#make clean
□動作確認
1.モジュール組込み
再起動、または
#/etc/rc.d/init.d/iolib
でモジュールを組込み、
#/sbin/lsmod
でモジュール組込みを確認します。
Module Size Used by
iolib 1384 0 (unused)
のように表示されれば組込み成功です。
2.テスト(PCIベースアドレス取得テスト)
制御したいボードの PCI ベースアドレスは機器構成によって
変わるため、ベンダーID、デバイスIDから取得する必要があります。
(現在の構成での PCIベースアドレスは、/proc/pci から取得
することもできます)
2.1.ベンダーID、デバイスIDの取得
ボードのベンダーに問い合わせるか、
%cat /proc/pci
でベンダーID、デバイスIDを取得します。
I/O ベースアドレスを持っている機器は、
以下のように表示されます。
|Bus 0, device 11, function 1:
| Serial controller: Unknown vendor Unknown device (rev 0).
| Vendor id=VVVV. Device id=DD.
| Medium devsel.
| I/O at 0x1010 [0x1011].
2.2.PCIベースアドレス取得
ここでは 2.2. で取得した、VVVV, DD を持つボードの I/O ポート
アドレス 0x1010 を取得します。
%./iotest 0xVVVV 0xDD
VENDOR ID: VVVVh
DEVICE ID: 00DDh
ADDRESS0 : 1010h
となれば、成功です。
□使用方法
・C言語
#include "iolib.h"
address_info ai;
io_info ii;
int fd = open("/dev/iolib", O_RDWR);
// PCI ベースアドレス取得
ai.vendor_id = VVVV; // VENDOR ID
ai.device_id = DDDD; // DEVICE ID
ai.board_no = 0; // ボード番号同じボードを
// 複数使う時(最初のボードが0)
ai.base_address_no = 0; // 取得 PCI ベースアドレス番号0 〜 5(通常0)
ioctl(fd, IOLIB_GET_BASE_ADDRESS, &ai);
printf("%04xh", ai.base_address);
// I/Oポート入力(BYTE単位)
ii.port_address = ADDRESS;
ioctl(fd, IOLIB_IN_BYTE, &ii);
printf("%04xh: %0x02xh\n", ii.port_address, ii.data);
// I/Oポート出力(BYTE単位)
ii.port_address = ADDRESS;
ii.data = DATA;
ioctl(fd, IOLIB_OUT_BYTE, &ii);
printf("%04xh: %0x02xh\n", ii.port_address, ii.data);
close(fd);
・Kylix
uses
IoPort;
GetPciAddress PCI ベースアドレス取得
InpB, OutpB BYTE 単位入出力
InpW, OutpW WORD(16bit)単位入出力
詳細は付属テストプログラム、付属 Kylix プログラムを参照のこと。
□仕様・既知のバグ
・構造体のアライメント指定を手抜き。
・ファイル配置、用語、解説などで変なところがあるかも。
□トラブルシューティング
1.モジュール組込み時に、「シンボルが見つかりません」のような
エラーが表示される場合(例えば printk)
%nm iolib.o | grep printk
U printk_R1b7d4074
%grep printk /proc/ksyms
c01140bc printk_R1b7d4074
でプログラム中のシンボルと、カーネル中のシンボルが一致している
か確認してください、一致していない場合カーネルの再構築が必要で
す。(他に良い方法があれば教えてください)
2.デバイスファイルがオープンできない場合、
%lsmod
でモジュールが組み込まれているか、
%ls /dev/iolib
でデバイスファイルが作成されているか
確認してください。作成されていない場合は、インストールを
やり直してください。
3.printk メッセージが表示されない
X 上の terminal では printk メッセージは表示されません。
X を終了させるか、[CTRL]+[ALT]+[F2]などで、コンソールに戻っ
て実行してください。
4.デバイスメジャー番号を 60 から変更したい場合
iolib.h の
|#define IOLIB_MAJOR 60
を変更して、再コンパイル、再インストールしてください。
デバイスメジャー番号は
/usr/src/linux/Documentation/devices.txt
を参照して、重ならないように割り当てる建前になっていますが、
世の中の 1/255 を割り当てて良いようなプログラムではないので、
%cat /proc/devices
で他の機器が使用しているメジャー番号を確認して、重ならないよ
うに変更してください。
□著作権・免責
本ソフトウェアは LGPL2(not 2.1) で配布されています。
・無保証
変更者は本ソフトウェアの使用に起因するあらゆる損害・障害につ
いてその責任を一切負わないものとします。またバグ修正の義務を
負わないものとします。
・使用条件
商用、非商用を問わず自由に使用してかまいません。使用表示も必
要ありません。
・アーカイブの変更
独自アーカイブに含めて再配布してもかまいません。許可を得る必
要もありません。
・引用条件
本ソフトウェアの一部、または全文を独自のプログラムに取り込ん
でかまいません、また、作成したプログラムは本ソフトウェアとは
無関係として商用、非商用を問わず、自由に配布してかまいません。
・改編版を配布する条件
本ソフトウェアの引用ではなく、改編する場合は、以下の[変更履
歴]に変更点、変更者を記入の上 LGPL2 で配布してください。
□謝辞
作成にあたって、以下の URL を参考にさせて頂きました。
感謝いたします。
http://www.mechatronics.mech.tohoku.ac.jp/~kumagai/
東北大学 熊谷正朗
[変更履歴]
r1.4 2001/07/22 kuma@webj.net(http://kuma.webj.net)
・新規作成
2001/07/22 kuma@webj.net
===============================================================================
|