/ «2004-05-04 (Tue) ^ 2004-05-06 (Thu)» ?
   西田 亙の本:GNU 開発ツール -- hello.c から a.out が誕生するまで --

Categories Books | Hard | Hardware | Linux | MCU | Misc | Publish | Radio | Repository | Thoughts | Time | UNIX | Writing | プロフィール


2004-05-05 (Wed)

[Writing] パラレルポートが好きっ!

いざ、パラレルポート制御

Linux 2.6 モジュールの下調べを続けながら、JTAG 道を歩む。まず必要になるものは、なんと言っても「パラレルポート制御」だ。

「I/O ポート制御なんて、ioperm 関数でアクセス許可を取ったら、後はチョチョイのチョイよね〜〜」、などと軽く考えていたら、早速罰が当たってしまった。

新し物好きの私は、カーネル 2.6 上に "User-space parallel port device driver (CONFIG_PPDEV)" なるものを組み込んでいる。名前から類推出来る通り、この PPDEV はユーザースペースから通常のファイル入出力を通して、パラレルポート制御を可能にするデバイスドライバー。兼ねてから目を付けていたものだ。具体的に、プログラミングスタイルがどのように変わるのか、見てみよう。まず、従来のスタイル。

int par_getperm(void) {
  int ret;

  // Allow I/O access against parallel port data, status,
  // control, and dummy wait registers

  ret  = ioperm(base_address + PAR_DATA, 3, 1);
  ret |= ioperm(IO_WAIT, 1, 1);
  return (ret ? 1 : 0);
 }

従来は、このように ioperm 関数を実行し、前もって I/O アクセスに対する許可をカーネルに申請する必要があった。当然のことながら、該当プロセスにはルート権限が必要になる。これでは、セキュリティ上問題だ・・。ということで登場したのが、PPDEV。その疑似コードは次のようになる。

#include <linux/ppdev.h>

int fd;
unsigned char byte;
fd = open("/dev/parport0", O_RDWR);
ioctl(fd, PPCLAIM);
ioctl(fd, PPWCONTROL, &byte);
ioctl(fd, PPRELEASE);

という感じ。open した後は、昔懐かしの ioctl (I/O ConTroL)により、CLAIM, 各種レジスター制御、RELEASE 処理などを行う。まさに、ファイル操作感覚であり、複雑なパラレルポートを抽象化することが可能になる(これまでのように base address 何番だっけ?、と悩む必要もない)。

で、何が問題だったかと言うと、どうも PPDEV が組み込まれた状態で、従来方法によるパラレルポート制御(いわゆる直叩き)を行うと、status register や control register がこちらの意図通りに作動してくれないのである。Fast mode に切り替わっているのかどうか、詳細は突き止められなかったが、大人しく PPDEV のスタイルでコーディングすると、ようやくパラレル嬢は言うことを聞いてくれるようになった。この問題だけで、久しぶりに朝を迎えてしまう。

Parallel mania

さて、マイコン野郎にとって、PCアーキテクチャ上に用意されているパラレルポートは、命綱のような存在だが、関連する資料は意外と見当たらないもの。そこで、リファレンスをまとめておこう。

まず、日本語ではトランジスタ技術スペシャル No.72 の「パソコン周辺インターフェースのすべてIII」の第2-2章 "パラレルポート (IEEE1284)" は外せない。この "パソコン周辺インターフェースのすべて" シリーズは、ひとつひとつの規格の歴史や簡単な仕様が述べられており、資料性が極めて高い。規格の歴史まで踏み込んだ解説には、滅多にお目にかかれるものではないので、絶版になる前に3冊すべてを手元に揃えておいた方が良いかもしれない。「悪書は良書を駆逐する」のである。

この他の日本語・・となると、残念ながら私は寡聞にして知らない。後は、海外に資料を探し求めるしかない。

かって、お勧めの書で紹介した The Undocumented PC には "Parallel Ports and Print Screen" という章が用意されているが、なぜかこのパートは頼りにならない。拡張モードなどに対する記述もなく、不合格。

というところで、Paralell port mania の巣窟をご紹介しておこう。その名も、The PC's Parallel Port。これは、Parallel Port Complete という書籍の著者、Jan Axelson 氏が運営しているサイトであり、宝のようなパラレルポート情報の数々が散りばめられている。素晴らしい!

ここで紹介されているリンクを丁寧に辿っていけば、目的の情報は必ずゲットできるはず。中でも、Beyond Logic はお勧め。Jan Axelson 氏に多謝。

資料がない・・

ピン配置や、各種レジスターの情報を再確認したら、いざコーディングである。「お〜〜っしゃ、いっちょ新しいスタイルでパラレルちゃんを使いこなしてみるかのぅ、フォッフォッホ」と、バルタン星人のごとく Terminal 画面に向かったは良いものの、たちまち金縛りに会ってしまった。そう、カーネルソースツリー内部の Documentation ディレクトリに、PPDEV について言及した資料は、ただのひとつも存在しないのであります。

しかし順応というのは怖いもので、このような状況に置かれてもなんの感情も抱かない体になってしまった。「ほな、google しますかのぅ」

The Linux 2.4 Parallel Port Subsystem

程なく、ブツが見つかる。なんと、ppdev.c の作者である Tim Waugh 氏 自らが、「The Linux 2.4 Parallel Port Subsystem」という充実した資料を用意してくれていた。

ソースツリーのどこかに、一言この URL を書いておいてくれれば良いものを・・という気はするが、資料自体は秀逸。この手の Linux 関連資料の中では、トップクラスに位置する位、良くまとまっている。おかでげで、PPDEV 対応のコードはチョチョイのチョイで仕上がった。いつもこれ位、楽だといいのだけれど。

久しぶりにハンダごてを握り、D0, D1 に LED を接続。簡単なイルミネーションテストプログラムを作る。お〜〜、ピカピカしてるよぅ。光り物っていいねぇ、パラレルポートって男のロマンだよねぇ、ウンウン。と、しばしご満悦。さて、いよいよ JTAG に挑戦だ。