P/ECE研究室〜USB分室


* Tue Sep  3 04:30:00 JST 2002 Naoyuki Sawa

8ヶ月のブランクを経て、USB分室を再開します。

前4回の話題は、USBホスト側のプログラム(デバイスドライバ)が対象でした。
今回からの話題は、USBデバイス側のプログラム(ファームウェア)が対象です。
現在のP/ECEカーネルは、P/ECE本来のモードの他に、USBジョイスティックモードを持っています。
USBデバイス側のプログラムを理解すれば、P/ECEをいろいろなUSBデバイスに見せかけられるようになります。
一例として、ryukの薫製工房さんのP/ECEの改造カーネルを使うと、P/ECEがUSBキーボードやUSBマウスになります。
また、拙作USBスピーカーを使うと、P/ECEがUSBスピーカーになります。
P/ECEをUSBフロッピーやリムーバブルディスクにすることができたら、面白いと思いませんか?(難易度は高そうですが…)
また、夢のオリジナルカーネル制作のためには、当然、USBコントローラを自分で制御する必要があります。
いつもどおり、P/ECEカーネルソースをお手本にして、USBの使い方を勉強して行くことにします。

P/ECEの基板には、Philips社製のUSBコントローラ「PDIUSBD12」が搭載されています。
Handspring社製のPDA・Visor(Deluxe)にも、PDIUSBD12が搭載されているそうです。
Visorのようなメジャーな機種への採用実績があるということで、ちょっと安心です。
余談ながら、Philips社のUSBコントローラシリーズには、「PDIUSBD11」という姉妹製品もあります。
型番の末尾が一つ違うだけですが、機能的にはPDIUSBD12とは全く別物ですので、お間違えなきよう。
PDIUSBD11はキーボードやマウスなどの低速デバイスに特化したUSBコントローラで、PDIUSBD12の代替にはなり得ません。

さて、P/ECEカーネルソースを理解するためには、PDIUSBD12の理解が不可欠です。
P/ECEカーネルソースを読まれた方は、次のような疑問をお持ちになりませんでしたか?

	なぜ、USB関連APIのモジュールファイル名が「mainloop.c」なの?
	(ぜんぜんメインループじゃないよ。「runapp.c」の方がメインループと呼ぶにふさわしい。)

	他の構成要素(LCDやサウンドなど)は基本的に1要素1ファイルなのに、USBだけはファイルがいっぱいあるなあ。
	(chap_9.h, chap_9.c, d12ci.h, d12ci.h, mainloop.h, mainloop.c, usb100.h, usb100.c)

	EPPFLAGS構造体(bEPPflags変数)の中に、用途不明のフラグビットがいっぱいあるけど…?
	(カーネルのあちこちでセット・リセットしてるみたいだけど、意味ないんじゃない?)

	USB通信の処理が、割り込みの中と外に分かれてるのはなぜ?
	(デバイスリクエストの応答だけ割り込みの外でやってるのは何か意味があるの?)

Philips社のWebサイトにあるPDIUSBD12の資料を読めば、これらの疑問は解決します。
実はP/ECEカーネルは、PDIUSBD12評価用ボードのサンプルファームウェアをベースに作られています。
P/ECEカーネルの基本的な流れは、サンプルファームウェアの流れを完全に踏襲しています。
P/ECE単体で見るとちょっと理解しづらい部分の数々は、サンプルファームウェアの名残だったのです。

まずはPhilips社のWebサイトから、PDIUSBD12の資料をダウンロードしましょう。
こちらのページからリンクされている資料を全てダウンロードしても良いのですが、とりあえず重要なのはこれだけ。

	・PDIUSBD12データシートファームウェアプログラミングガイドPC評価キットのファームウェアソースコード

その他の参考資料も挙げておきます。

	・技術評論社刊 最新技術解説シリーズ 『入門 USB』
	 僕は最初にこの本を読みました。
	 書名や装丁だけを見ると、USB機器の紹介や「USBはこんなに便利だ!」みたいな話に終始しそうで、
	 内容が薄そうな印象(失礼!)を受けてしまいますが、実は非常に技術寄りで内容の濃い本でした。
	 USBの資料を読むために必要な前提知識(各種転送方式の違いなど)についてもわかりやすく解説されています。
	 一押しです。

	・CQ出版社 TECH I Vol.8 『USBハード&ソフト開発のすべて』
	 様々なUSBコントローラを使って、USB機器・ファームウェア・およびデバイスドライバを制作する実例がたくさん載っています。
	 第1章はUSB規格自体の解説ですが、この部分については前出の『入門 USB』の方がわかりやすいように思います。
	 第2章以降のUSB機器制作例は、たいへん参考になります。
	 残念ながらPDIUSBD12の使用例はありませんが、実際のプログラミングでPDIUSBD12特有の挙動に悩まされることは少ないです。
	 むしろUSB規格そのものの解釈で悩むことが多いので、別のUSBコントローラを使った例でも充分役に立ちます。
	 おすすめです。

いきなりUSB2.0仕様書を読もうとするとやる気が削がれるので、読まないほうが良いと思います(^^;
僕も、構造体の形式を調べるときに検索する程度にしか読んでいません。

それでは次回より、PDIUSBD12の使い方を具体的に見ていこうと思います。
前述の通り、P/ECEカーネルはPDIUSBD12のサンプルファームウェアをベースに作られています。
しかし、意外と簡単にカーネルからUSBコントローラの制御を奪い取ることができます。
まず、カーネルからUSBコントローラの制御を奪うための基本プログラムを用意します。
その後、基本プログラムを応用して、P/ECEをいろいろなUSBデバイスに変えてみようと思います。
最終目標は、P/ECEをUSBリムーバブルディスクに見せかけられる、P/ECE側のアプリケーションを作成することです。
P/ECE専用のデバイスドライバなしでもP/ECEにファイルを転送できれば、出先のPCでもP/ECEが使えますから。
そのためには、P/ECE側からもFAT等のファイルシステムを理解できるようにしないとダメなのかな?
先は長そうですが、よろしくお付き合いください。

(続きます…)

nsawa@piece-me.org