印デスドライバ ログラミング 前川将 # USB Hubs geh a@ . 「 ee 自 S ロ .0 に 前回は↓ USB のハードウェアおよびソフトウェアの概 要について紹介した。今回はそれらの情報を元に実際に →デヾイスドライバを作成するのに必要な情報を集めてい デバイスドライバを書くためにはデバイスがどういった 動作をするのかを知らなければならない。ここでは USB ジ ョイスティックを取り上げることにする。まず、 USB では ジョイスティックをどういうデバイスと認識するのだろう か。そこで、前回紹介したソフトウェア udesc_dump(8) を 使って、 USB ジョイスティックの各ディスクリプタを見て みることにする。 ・ udesc—dump 1.0.2 http : //www.math. sci. kobe—u. ac ・ jp/-maekawa/USB/ デバイズを知る 、第 2 回 ハードウェアとソフトウェア要 る。そこで、 HID クラスに関する仕様書を見てみる。 イスティックは、 HID クラスのデバイスであることがわか スト 1 にその一部を抜粋 ) を調べることで、この USB ジョ プクラス、プロトコルの情報を元に /sys/dev/usb/usb. h ( リ 用に、割り込み端点があることがわかる。またクラス、サ のような結果が得られる。このデバイスには、データ転送 在を確認し、 udesc-dump(8) を実行する。すると、 ( 図 2 ) 築し、マシンを起動する。プートメッセージに ugen ( 4 ) の存 ションファイルに ( 図 1 ) のように書いてカーネルを再構 じめ削除しておく必要がある。カーネルコンフィギュレー は、そちらが優先されてしまうので、 ugen ( 4 ) 以外はあらか にそのデバイスに対応したドライバが存在している場合に ネルに ugen ( 4 ) が組み込まれている必要がある。また、すで このソフトウェアは、 ugen ( 4 ) にアクセスするので、カー # PCI USB controllers uhci* at pci? dev ? function ? Ohci* at pci? dev ? function ? # USB bus support # UniversaI Host CO Ⅱ t て 011er (lntel) # Open HOSt ControIIer usb* usb* uhub* uhub* # USB ugen* at uhci? at ohci? at usb? at uhub? port ? Generic driver at uhub? port ? configuration ? interface ? わイ BSD magazine 208 NO 、 3
」 ;. , 型 00 デスドライ フログラミング るのかという絶対値を返すことになっているので、本当に絶 上で USB デバイスドライバを書く場合、 detach 関数、 対値を返すジョイスティックなのかどうかを調べているので activate 関数は必ず用意しなくてはならない。どの USB デ ある。今回のドライバでは変化量を返すジョイスティックを バイスも動作中に抜かれる可能性があるからである。今回 はまだ具体的なデバイスの制御を行うわけではないので、 扱えないが、デバイスがどちらであるかを示すフラグを用意 し、適時そのフラグを参照することで両者の共存も可能で これらの関数でしなければならないことは特にない。不要 あろう。今回はこの点については考えないことにする。次に になった領域を解放し、デバイスがもう無いというマーク z 軸の回転をサポートしているかどうかを調べている。先に をするだけである。途中のデバッグ用の出力については説 明を省いたが、各段階での値を表示するためのものである 述べた通り、この機能は必すしもサポートされているわけで ので、読むのはたやすいと思われる。 はないので、 x 、 Y のときとは異なり、サポートされていた あとは、このドライバの存在をどうやって OS に教えればよ 場合には、そのことを示すフラグを立てている。 次にボタンの数を数える。今回のコードではあくまで参 いのか、であるが、 /sys/dev/usb/files. usb に以下の記述を加え、 照用であるので ( もちろん実際にカーネルに組み込むこと は可能であり、そのように記述している ) 、探索するボタ ンの数は Button ページの最大値である 65535 にしているが、 実際のデバイスにこれだけたくさんのボタンがついている わけはない ( 仮についていたとして、誰がどのように操作 ) 。今回のデバイスでも 4 個である。ジ するのだろうカ ョイスティックではだいたい 10 個から 20 個の範囲を探索す at uhub? port ? configuration ? interface ? れば十分だと思われる。特に問題はないので、今回はあえ と書き、カーネルの再構築をすればよい。このカーネルで て探索範囲を最大値である 65535 にしておく。 attach 処理 起動しプートメッセージに、 にかかる時間にたいした違いはない。見つかったボタン数 に応じてボタンの状態参照用変数を確保 / 初期化し、検出 uj 0Y0 at uhub0 port 1 configuration 1 interface 0 されたボタンの数を画面に表示する。 uj 0Y0 : Rockfire product 0X2030 , rev 1 . 00 / 1.00 , addr 次は、割り込み転送用パッフアを確保し、バッフアのサ 2 , iclass 3 / 0 uj 0Y0 : 4 buttons and the rotation Of Z¯axis . イズを保持している。割り込み転送により図 6 のバケット という風に表示されれば、めでたく uj 。 y は完成したことに がこのバッフアに格納される。その後、カーネルが割り込 み転送が行われたことを知り、このバッフアに格納されて なる。デバイスを抜いたり差したりしても問題がないこと いるデータに対して処理を行う。つまりこのバッフアがデ を確かめておく必要もあるだろう。 以上で、簡単なデバイスドライバの作成およびその手順 バイスとカーネルの橋渡し役になるのである。最後にデバ イスが抜かれたというイベントを拾うための準備をして、 を解説してきたが、 c 衄によるプログラミング経験のあ に 1 ロロ る方は、かなり拍子抜けしてしまったかもしれない。私は attach 処理は完了する。 ことあるごとに「デバイスドライバを書くことなんてたい また、 USB ではホットプラグをサポートしているので、 したことあらへんのやでえ。」と言っているのだが、少し デバイスがマシン動作中に抜かれることも考慮しなくては は納得してもらえたのではないだろうか。たしかに複雑か ならない。抜かれてしまったデバイスに誤ってアクセスし てしまうこともあるだろう。抜かれたことを適切に処理し っ巧妙に作られたドライバもあるのだが、所詮は人間の作 ったもの。時間はかかるかもしれないが、理解できないと ていない場合、どういった挙動を示すのかは、デバイスド いうことは絶対にないと断言しよう。今回解説した内容は、 ライバの構造やデバイスによって大きく違うのだが、基本 的には何が起きるのかはまったくわからない。最悪の場合、 どのデバイスドライバにも通用するものばかりであるので、 カーネルがパニックしてしまうという事態も考えられる。 しつかりと復習しておいていただきたい。 次回は、デバイスから渡されるデータをカーネルに伝え これを避けるためには、 detach 関数を用意し、抜かれたと きの処理を行う必要がある。またデバイスを一時的に有効 てみることにする。今回はこの辺で。でえもん君のご加護 がありますように。 / 無効にするための activate 関数も用意しておく。 NetBSD # Joysticks device uJOY attach uj oy at uhub dev/usb/uj oy ・ c file カーネルコンフィギュレーションファイルに uJOY uj oy* 2000 NO. 3 BSD magazine
る。この USB ジョイスティックでは、最初に Generic トスイッチ」が付いており、デバイスは 0 から 315 までの数 Deskt 叩ページと宣言しているので、以降の各アイテムは 値として扱うが、ソフトウェアでは 1 から 8 までの値として このページに書かれている内容についての詳細を記述して 扱う。また、デバイスからは 8 ビットを単位として 1 単位が 渡されてくる。さらに、このデバイスには「ボタン」が 4 いる。これは、次に同じレベルで Usage page が宣言される つ付いている。ボタンのオン / オフは必ず 0 / 1 で表現するこ まで引き継がれる。次に Usage が宣言されている。これは、 今参照している Usage page 内での ID を示し、今の場合、 とになっている。ただし、 0 がオンなのかオフなのかはデバ イスによって異なるようだ。ボタンについての情報は、 1 このデバイスがジョイスティックであることを示している。 ビットを単位として 4 単位が渡されてくる。データは必ず 8 これでようやくこの HID デバイスがジョイスティックであ ビットの整数倍でなければならないので、ダミーとして 4 ることがわかる。次に、 co Ⅱ ecti 。 n が宣言されている。コ ビット付加される。以上のことから、このデバイスは、操 レクションとは、デバイスに付いている一連の機能をグル ープ化するためのもので、以下の 3 種類が定義されている。 作に応じて図 6 の形をしたバケットを渡してくることがわ かる。 今回の主目的であるデバイスドライバは、図 6 のバケッ ・ Physic al トをデバイスから受け取り、適切な形に、つまり開発対象 物理的なデバイスの位置づけ の OS に応じた形式に変換してカーネルに伝えるというこ ・ Application ソフトウェア的なデバイスの位置づけ とをするのである。 ・ Logical 論理的なデバイスの位置づけ これだけわかれば、もう十分デバイスドライバを書く準 次に、 Usage が宣言されており、このデバイスがポイン 備はできたので、実際に書いてみることにしよう。今回は、 ティングデバイスであることを示している。これ以降に デバイスの検出を行い、初期化するまでの手順を解説する。 のデバイスの物理的な動作が記述される。 7 行目から 26 行 ( 以降、デバイス名を uj 。 y とする。 ) リスト 2 を見ていただ 目までの記述は、 x 方向の傾き、 Y 方向の傾き、 z 軸の回 いきたい。まず、デバイスドライパ内で利用する関数群の 転を操作する機能の存在を示している。このデバイスでは ためのヘッダファイルをインクルードする。ヘッダファイ スロットルの操作に対応している。 Phy s ic a 1 ルの場所は、 /usr/src/sys からの相対パスで指定する。イン Minimum/Maximum でデバイス上での値を小し、 Logical Minimum/Maximum でソフトウェアで扱うべき値を示して クルードしなければならないへッダファイルは作成するデ バイスドライバによって大きく異なるが、一般的には、 いるので、このデバイスでは、両者ともに 0 から 255 までの 値で表現する。また、デバイスからは 8 ビットを単位とし sys/param. h 、 sys/systm. h 、 sys/kernel. h 、 sys/device. h をイン クルードすることになる。ヘッダファイルをインクルード て 3 単位が渡されてくることもわかる。同様にして、 27 行 し忘れても、ただコンパイルできないだけなので、必要な 目から 44 行目までの記述により、このデバイスには「ハッ ヘッダファイルを探しだし、どんどんインクルードすれば よい。今回は、 maIIoc(9) も使用するので、 sys/malloc. h も インクルードしておく。次に USB 用のヘッダファイルをイ ンクルードする。 dev/usb/usb. h では USB システム共通のマ クロや構造体が定義されており、 dev/usb/usbdi. h 、 dev/usb/usbdi util.h ではデバイスから USB システムへのア クセスを提供する関数群が定義されている。これらは、当 初 OpenUSBDI という標準 USBD インターフェイス規格を 意識して作られていたが、 OpenUSBDI は非常に複雑でパ フォーマンスも悪く、 BSD ともなじみにくいとの判断から、 現在は大幅に変更されている。次にインクルードしている 2000 NO. 3 BSD magazine 75 タ リ 0 はデスドラ、 ー。 = ~ プログラミング 引バイスドッイバを書くす ハットスイッチのオン 7 オフ N 軸の回転角 「ー軸上での位置 >< 軸上での位置 ボタンのオン 7 オフ 図 6 バケッ
dev/usb/usbhid. h では、 USB HID クラス用のマクロや構造 クロである。関数のプロトタイプ宣言や構造体の定義など 体が定義されており、 dev/usb/hid. h では、 HID デバイス共 をこれで行う。どのデバイスドライバにも少なくとも 通の関数が定義されている。その次にあるマクロは、この match 関数、 attach 関数が必要となる。 match 関数はデバイ デバイスドライバのデバッグ用に用意した。これは他の スの検出を行う関数で、デバイスが存在すれば、 attach 関 USB デバイスドライバと同じスタイルにしている。カーネ 数が呼ばれ、この中でデバイスの初期化を行う。 ルコンフィギュレーションファイルに match 関数は USB MATCH(ujoy) であり、 attach 関数は USB-ATTACH(ujoy) である。先ほどからなんどもマクロ、 マクロと叫んでいるが、これもマクロである。 FreeBSD と NetBSD 、 OpenBSD とは match 関数、 attach 関数の引数の と書き、 ujoydebug の値を増加させると、より詳細な情報 型や数が違う。渡されてくるデータ自体に大きな差がある が出力するようになっている。次に、 ujoy_softc 構造体の わけではないが、これらの OS に実装されている自動コン 定義がある。これは、可。 y で必要となる値を構造体として フィギュレーション機構には違いがあり、それらの差を吸 定義しておくことで、任意の時点で各値を参照できるよう 収するために用意されている。 にするためのものである。 NetBSD では、 softc 構造体の最 USB MATCH(ujoy) では、ますデノヾイスのインターフェ 初の要素は必す device 構造体でなければならなかった ( 本 イスが有効であるかを調べる。次にインターフェイスディ 誌前号の古田氏による「 NetBSD におけるデバイスの自動 スクリプタを取得し、 HID クラスに属するかどうかを調べ コンフィギュレーション」を参照 ) 。だが、このソースで る。 HID デバイスであれば、レポートディスクリプタを取 は U S B B A S ED EVI C E から始まっている。これは、 得し、ジョイスティックであるかどうかを調べる。多くの FreeBSD や OpenBSD との移植を容易にするために定義さ HID クラスに属するデバイスは、この手順で一意に決定で れたマクロであり、これらはすべて dev/usb/usb_port. h にま きるので、この一連の流れは覚えておくとよい。 とめられている。この中に USB_ATTACH(ujoy) では、デバイスの初期化を行う。ま すインターフェイスディスクリプタを取得する。次に dev/usb/usbdi. h にある usbd_devinfo() という関数を用いてこ #def ine USBBASEDEVICE struct device のデバイスの情報を取得し、画面にクラス、サプクラスと という記述があるので、結果的に device 構造体からはじま あわせて出力する。みなさんがよく見るプートメッセージ っていることになる。次に、割り込み端点アドレス、割り の多くは、それぞれのデバイスの attach 関数が表示してい 込みパイプ、割り込み転送用パッフアを用意している。 るのである。次に端点ディスクリプタを取得し、割り込み hid—location 構造体は、このデバイスに付いている機能を保 端点を探す。割り込み端点が見つからない場合は、その旨 持するためのもので、今回は、 x 、 Y 方向の傾き、 z 軸の回 を画面に出力し attach 処理を止めなければならない。なせ 転、ボタン用に用意した。また今回はハットスイッチは無 なら、割り込み端点は HID クラスのデバイスに必須だから 視することにし、 z 軸の回転はサポートされているとは限ら である。次にレポートディスクリプタを取得し、デバイス ないので、存在するかどうかの判定のためにフラグを用意 ドライバが x 、 Y 方向の傾きについて知ることができるか しておく。またボタンの数も保持しておく。理論的には どうかを調べている。 x 、 Y の検出の後にそれぞれに以下 HID デバイスのボタン数は最大 65535 個であるから、毎回す の記述があるが、 べてを調べてもよいのだが、デバイスのボタンの数が動的 if ( (flags & JOY—FLAGS—MASK) ! = JOY_FLAGS) { に変わることはまずないので、初期化の際に数を調べてお printf ( "%s : X report Ox % 04X not くことにする。最後に、デバイスの有効 / 無効は sc ー dying と supported*n" いう変数の値で判断することにする。これらは他の USB デ バイスドライバにできる限りあわせてあるので、これを機に 他のデバイスドライバにも目を通されることをお勧めする。 次に、 USB_DECLARE_DRIVER(ujoy) で必要な関数群 の初期化を行う。これも dev/usb/usb_port. h で定義されたマ 16 イ BSD magazine 2000 NO. 3 options USB—DEBUG USBDEVNAME(sc—>sc—dev) , flags) ; USB_ATTACH_ERROR_RETURN ; 一般的にジョイスティックでは、スロットルがどちらにどれ だけ傾いたのかという変化量ではなく、今どれだけ傾いてい
FreeBSD USB プロジェクト USB Ethernet アダブタのサホート より具体的な製品との対応は、以下の URL をご覧くだ Kawasaki LSI のチップが使われているデバイス kue ドライバ CATCUSB-EL1210A チップが使われているデバイス cue ドライ / ヾ ADMtek AN986 pegasus チップが使われているデバイス aue ドライ / ヾ プタのデバイスドライバが追加されました。 FreeBSD-current に Bill paul 氏によって USB Ethernet アダ フロジェクト . 短信 前川将秀 / MAE M の勧 gehenna@jp.FreeBSD.org さい。また、 こに掲載されていないデバイスをお持ちの 方はぜひご連絡ください。 http : //www.hiru. aoba. yokohama ・ jp/-ura/USB/usbether. html ただし、これらのドライバは 3. x ー STABLE への移植のめ どが立っていません。 4. X-CURRENT でネットワーク関連 のコードが大きく変更されたためで、これらがまだ 3. X- STABLE には移植されていないからです。 NetBSD への移植も進んでおり、 NetBSD ユーザーにも利 用可能になるでしよう。 さい。まだ一部のデバイスには問題があるという報告もあ ただし、デバイスの抜き差しには十分な注意をしてくだ BSD - USB メーリングリスト ( 日本語 ) になってみるというのも、大歓迎です。 リストに報告してくださると幸いです。これを機に開発者 ります。もし問題を見つけた場合には、以下のメーリング 公開されました。 NetBSD からの移植によるものです。 NickHibma 氏によって USB モデムのデバイスドライバが USB モデムドライバの公開 http : //www. egroups ・ com/group/usb-bsd/info.html USBfor*BSD メーリングリスト ( 英語 ) http : //www.jp.FreeBSD.org/ml.html#bsd—usb usbd(8) の改良 これによりデバイスの抜き差し後、コマンドを実行させ ることができるようになりました。たとえば、 USB マウス の抜き差しが検出されると m 。 used ( 8 ) を起動 / 停止させる、 などといったことが可能になります。 UHCI/OHCI ドライバの大幅改良 従来のドライバで起きていた以下の問題が修正されまし http : //www.etla.net/-n—hibma/usb/umodem. c 新しい USB マスストレージドライバの公開 NickHibma 氏によって従来のドライバを大幅に改良し たものが公開されました。これによって、現在 FreeBSD- cu 皿 nt で利用できるドライバに比べて、何倍ものパフォー マンス向上が期待されます。 http : //www. etla. net/-n—hibma/usb/umass . c 等時転送がうまく動かない がわかっています。 現在もまだ一部の OHCI コントローラに問題があること サスペンド / レシューム時にマシンがバニックする た。 いので、パッチをあてておくとよいでしよう。このパッチ Ethernet アダブタをお使いの方は、この問題に遭遇しやす パッチが以下の URL で公開されています。特に USB 行うとパニックしてしまうバグがありましたが、その修正 以前から OHCI コントローラでは、大量のデータ転送を 0H6 のバグ修正バッチ より高度なスケジューリング機能の実装カ坏可欠です。 現在もまだいくっかの問題はあり、本質的な解決には、 http : //www. etla. net/-n-hibma/usb/usb. pl は -current 用です。 2000 No. 3 BSD magazine 277
リデバイスドライ →。ーフログラミング トディスクリプタに関する情報を取得し、これに応じて、 レポートディスクリプタを読み込みデバイスの情報を得 る、という手順を踏む。物理ディスクリプタはデバイスド ライバを書く際には必要ではない。次は、 HID クラスにと って最も重要なレポートディスクリプタについて少し見て みることにしよう。 イテム ure e lOn Cäl lcation ~. ー・一 , →ーーレポートアイスクレ ollection イテム レポートディスクリプタには、 HID クラスに属するデバ イスに関するすべて情報が詰まっている。マウスやジョイ スティックであれば、ボタンやホイールの存在などである。 レポートディスクリプタはアイテムというものの集合体で あり、各アイテムは ( 図 3 ) のように階層的に定義されて いる。紙面の都合上、今回は必要なものだけしか説明し ないが、先に紹介した HID 仕様書に目を通していただきた アイテムには、ショートアイテム、ロングアイテムとい う 2 種類の形式が定義されている ( 図 4 ) 注リロングアイテ ムでは、最初の 1 バイト目の値が決まっており、 ( 当たり前 であるが ) ショートアイテムではないことがわかる値にな っている こでひとつ注意しておかなければならないことがある。 HID 仕様書の中では、なぜかショートアイテム、ロングア イテムのバイトの並びが逆になっている。筆者はレポート ディスクリプタ内での順序にしたがって書いているのだが、 このほうが実際のデータを見たときに理解が早いと思うか らである。仕様書を読む際には少し気に留めておいていた だきたい。 話を元に戻そう。先に挙げた USB ジョイスティックのレ ポートディスクリプタは ( 図 5 ) のようになっている。レ ポートディスクリプタの取得には、 uhid ( 4 ) を有効にしたカ ーネルにおいて、 uhid_debug というソフトウェアを用いた uhid-debug は以下の URL で入手できる。 lnmum axmum lMinimum •Maximum onent Size ount デム Wlinimum e aximum ätor lndex Minimum a 土 0 「 Maximum ndex lnmum axmum ー図 3 ィームの定義 ショートアイテム 7 4 3 0 bSize データ bTa g bType ・ uhid debug http : //www.math. sci. kobe—u ・ ac ・ jp/-maekawa/USB/ では少し中身を眺めてみよう。最初に登場する Usage page であるが、現在以下の 21 種類が定義されている。 図 4 注 1 筆者の知る範囲内では、ロングアイテムを持つレポートディスクリプタを見たことがない。見たことのある方はせひ教えていただきたい。 2000 NO. 3 ロングアイテム bDataSize bLongltemTag データ 1 1 10 BSD magazine
・ HID ティスクリプタ レポートディスクリプタおよび物理 (physical) ディス クリプタがいくつ存在するかなどが記述されている。 ・レポートティスクリプタ デバイスに関する詳細な情報、デバイスから送られてく るバケットに関する情報が記述されている。 ・物理 (physical) ティスクリプタ ( オプション ) 実際にデバイスを操作するときの情報が記述されている ( あまり実装されていないようだ ) 。 の 3 つのディスクリプタを持っている。 HID クラスに属する デバイスは、ます HID ディスクリプタを読み込んでレポー マリスト fosys/dev ん sb/usb:h の一部 #define UCLASS_UNSPEC 0 #define UCLASS_AUD 工 0 1 #define USUBCLASS_AUDIOCONTROL 1 #define USUBCLAS S _AUD 工 OSTREAM 2 #define USUBCLASS_MIDISTREAM 3 #define UCLASS_CDC #define USUBCLASS_D 工 RECT_LINE_CONTROL_MODEL 1 #define USUBCLASS_ABSTRACT_CONTROL_MODEL 2 USUBCLASS_TELEPHONE_CONTROL_MODEL #define 3 #define USUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 #define USUBCLASS_CAPI_CONTROLMODEL 5 #define USUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 #define USUBCLASS_ATM_NETWORK 工 NG_CONTROL_MODEL 7 #define UPROTO_CDC_AT 1 #define UCLASS_HID 3 #define USUBCLASS_BOOT 1 #define UCLASS_PRINTER 7 #define USUBCLASS_PRINTER 1 #define UPROTO_PRINTER_UNI 1 #define UPROTO_PRINTER_BI 2 #define UCLASS_MAS S 8 USUBCLASS _RBC #define 1 #define USUBCLASS_SFF80201 2 #define USUBCLASS_QIC157 3 #define USUBCLAS S _UF I 4 #define USUBCLASS_SFF80701 5 #define USUBCLASS_SCSI 6 #define UPROTO_MASS_CBI_I 0 #define UPROTO_MASS_CB 工 1 #define UPROTO_MASS_BULK 2 #define UPROTO_MAS S _BULK_P 80 #define UCLASS_HUB 9 #define USUBCLASS _HUB 0 #define UCLASS_DATA 10 #define USUBCLASS_DATA 0 #define UPROTO_DATA_ISDNBRI #define UPROTO_DATA_HDLC #define UPROTO _DATA_TRANSPARENT #define UPROTO_DATA_Q921M #define UPROTO_DATA—Q921 #define UPROTO_DATA_Q921TM #define UPROTO_DATA_V42BIS #define UPROTO_DATA_Q931 #define UPROTO_DATA_V120 #define UPROTO_DATA_CAPI #define UPROTO_DATA_HOST_BASED #define UPROTO _DATA_PUF #define UPROTO_DATA_VENDOR the lomega Zip drive * / for / * PhysicaI iface * / HDLC * / / * Transparent * / / * Management for Q921 * / / * Data for Q921 * / / * TEI multiplexer for Q921 * / compresslon * / / * Euro-ISDN * / / * V. 24 rate adaption * / / * CAPI 2 . 0 commands * / HOSt based driver * / see Prot . Unit Func . Desc . * / / * Vendor specific * / 0X30 0X31 0X32 0X50 0x51 0X52 0X90 0X91 0X92 0X93 0xfd 0xfe 0xff 15 BSD magazine 2000 No. 3
、 : ー . 型 00 スドライ ー ' = ーフ 0 グラミング ない。では HID クラスとはどのような規格なのかを見てみ ・ Device Class Definition for Human lnterface Devices(HID) Version 1.1 http : //www. USB. org/developers/data/hidl-l . pdf 0 翩 0 クラス ・ HID Usage Tables Version 1.1 あらためて HID クラスの概要を説明しよう。 HID クラス http : / / w. USB. org/developers/data/hut 1 ー 1 . pdf とは、人が操作するデバイスを統一的に扱うためのクラス この仕様書を見れば、 HID クラスとはジョイスティック である。たとえば、 だけでなく、キーポードやマウスといった、人が操作する デバイスをまとめた規格であることがわかる。また、 HID ーボードやマウス、ジョイスティックなど ・ドアのノブや、各種スイッチ、ボタンなど Usage Tables version 1.1 には、「なんやねん、このデバイ ス。」といったものまで定義されている。たとえば、魔法 ・車のハンドルや、飛行機のスロットルなどのシミュレ のじゅうたんシミュレーションデバイスといったものや、 自動操縦の有効 / 無効といった、いつどこで使うのかよく ・温度計やバーコードリーダ、電圧計など わからないものまである。これを隅から隅まで読むだけで もかなり楽しめる ( と、筆者は思うのだが ) 。 といったものがその主な対象である。 HID クラスに属する いずれにせよ、 USB ジョイスティックを動作させるには、 デバイスは、前回紹介した標準ディスクリプタに加えて、 この HID クラスについての知識が必要であることは間違い # dmesg ー grep ugen ugen0 at uhubO port 1 rev 1 . 00 / 1 . 00 , ugenO : Rockfire product 0X2030 , addr 2 # gzip —cd udesc-dump-l . 0.2. tar. gz ー tar —xvf # cd udesc-dump-l . 0.2 # make # . /udes c—dump /dev/ugen0 Standard Device Descriptor : bLength 18 bDe s cr ipt orType 01 bcdUSB 0100 00 ー bDeviceC1ass ー bDeviceSubC1ass 00 bDeviceProtoc01 00 bMaxPacketS i ze 8 idVendor 0583 idProduct 2030 bcdDevi ce 0100 iManuf acturer 0 iProduct 0 iSeria1Number 0 bNumConf i gurat ions 1 Conf igurat i 0 Ⅱ 0 : Standard Configuration Descriptor : bLength 9 bDe s cr ipt orType 02 wT0ta1Length 34 bNumInt erf ace 1 bConf igurat ionVaIue 1 i Conf i gurat ion 0 80 50 bmAttributes bMaxPower Standard lnterface Descriptor : bLength 9 bDescriptorType 04 0 bInterfaceNumber bAIt ernat eSett ing 0 bNumEndpoints 1 bInterfaceC1ass 03 bInterfaceSubC1ass 00 bInterfaceProtoc01 00 0 ilnterface HID Descriptor : bLength 9 bDes cr ipt orType 21 bcdHID 0100 bCountryCode 00 bNumDescriptors 1 bDe s criptorType 22 wDescriptorLength 79 Standard Endpoint Descriptor : 7 bLength bDescriptorType 05 bEndpointAddress 81 (in) 03 (lnterruput) bmAttributes wMaxPacketSize 5 blnterval 10 図 2 udesc dump(8) の結果 2000 NO. 3 BSD magazine
フロジェクト短信 NetBSD-current Updates ・ X-surfboard を利用した zbus の ne カードが利用できるように Amiga po ・ accelerated TGA Xserver の BugFix がありました。 Alpha po 杙 マシン依存系 主な変更内容 で劇的な変化があったということがわかります。 の記事の時点で 1.4L 、その前が 1.4J ですから、この 3 か月 ョンが 1.4T というとんでもないことになっています。前回 前回からの Update です。いつのまにやら kernel のバージ ・ PCMCIA がサポートされました。 ・ bus-space(9) が書き直されました。 なりました。 ・ A4000 / A12 開 IDE コントローラがサポートされました。 arc po ・ pica port に代わり、 arc が取り込まれました。 OpenBSD- 2.1 / arc からのものです。 ・ OpenBSD ー 2.1 から OpenBSD ー 2.6 までの変化を取り込みまし JNUG/ インターネット総合研究所 言午先明 / ' 〃ど 0 S に 0 〃 M00 〃 g seirios@jp.netbsd.org ・ DS5000 がサポートされました。標準では disab 厄されていま ・ dc driver が 5100 consoles をサポートしました。 ・劑 pha と同様のプートプロックが採用されました。 pmax po ・ SONY NEWS5000 がサポートされました。 newsmips po は vax po 杙 ・ sh4 のサポートが追加されました。 みが許可されるようになりました。 ・ initial watchdog timer が追加されました。また、複数割り込 sh3 po す。 カーネル ・ NCR5380SCSIDMA がサポートされました。 ・ sw 叩関係のエラーハンドリングが整備され、 "swapctl -d Sw 叩パーティションの削除が可能になりました。 ・ extfs の version 1 がサポートされました。 ・ IPsec 関係のコードが更新されました。 ・ IPv6 関係のコードが更新されました。 ”で Atari po 杙 ・ ESS Technology 社の Solo-1PCI Soundcard カサポ i386 po IPv6 Boot fl 叩 py が追加されました。 Iuna68k po ・ luna68k が NetBSD ツリーに入りました。 mac68k ・ wscons がサポートされました。 macppc ートされまし ・ iMacDV 、 Power Macintosh G4 カ SNetBSD macppc で boot でき ・ news68k が NetBSD ツリーに入りました。 news68k po ・ mvme68k 固有のデバイス関連のマニュアルが追加されまし mvme68 po 杙 るようになりました。 ・ SONYNEWS1200 がサポートされました。 また、拡張スコーブドアドレスに関する表記が修正されまし た。現在は : : 1 % I 。 0 のようになります。 ・ kernel に ratecheck(9) と 1 。 g ( 9 ) が加わりました。詳しくは man を 参照してください。 ・ cardbus や raidframe のような、 kernel thread を必要とするデバ イスを root デバイスにできるようになりました。 ・ softdep に関するさまざまな BugF ⅸがなされました。 ・ RAID-AUTOCONFIG オプションが追加されました。これに よって、 RAID の自動認識や、 RAID セットの自動設定ができ るようになります。 デバイスドライバ ・ CS4280 Audio chip がサポートされました。 ・インターフェイスカードを抜くためのコードがマージされま ・ ray ドライバで、 IEEE 802.1 IFH を利用した、 raytheon raylink と webgear aviator 2.4/PRO wireless LAN カードカサポートさ れました。 ・ wi ドライバで、 WaveLAN IEEE カードで利用されている WEP 278 BSD magazine 2000 No. 3
1 BS ロではじめように 開発の最前線を追いかけよう ! ー JNUG/ インターネット総合研究所許先明 / Ⅱ SeonMeyong seirios@jp.netbsd.org ・ Release ではまだサポートされておら す、 current では取り込まれているプ ラットフォームを利用したい ・ Release ではまだサポートされていな いプラットフォームに移植したい ・ Release ではまだサポートされておら す、 current で追加された機構を利用 elease は、あ タイミ グで公さ ・ ReIease ではまだサポートされていな る、カなり安 い機構を付け加えたい して運 できるいわ る配版とし の性格 持つも ・ ReIease ではまだサポートされておら の機構 ず、 current で追加されたデバイスを 開発 urrent は、現 利用したい たなラットフォー のサポート、 トなど取 ・ ReIease ではまだサポートされていな たなンヾイのサポ いデバイスを新たに付け加えたい り込んご、開中のも ・ kernel を Hack したい !!! ・とにかく新しいものが好き ! ! ! このロ答をてもらば想像、、きる という向きで、さらに ・ UNIX に関する最低限の知識を持ち ・何らかの問題があってもある程度自 力で解決できる 人には cu ent を勧めている。 もちろん、開発者たちは「安定して 動く」ように日夜開発を続けている。 しかし、彼らは基本的にボランティア である。また、 current は開発中のもの したがって、バグ出し目的の である。 rrent での、いかけを一にしている。 可度も何書かれいること、、は SD 系 UNIX もしく ( あるが、 Cu rent と一何か ? UNI ーイク O でソスコー、、も含 リー ' 己布ていものによ、 「 curre とは何カ ? 」とか「 current 、 O nBS ある SD 、 etB と R lease でどう違、のか ? 」という ら O こはれれで lea 」 質問受ける一とがあ 「 c rent の類あ この問に 、して筆者 ( こう答ること 0 して いる。 ele se ( はいくつ、の 、で ele se 版 e ea e ( ったなっ 力しこ、バ。が も 出 開れ る オ c rre t と 能拡しオり、 りてるので 、′然宀定性ゞ下カ る て る nt を、いかる と思が、 、、は Cu こめ 口を くこ にす。しこがっ 安定し運用しいサーバーなどに の UN の知そ こはる程 こ前する。、なくも、 対し利用す ・初ム者がとに、く使っみる 、、 kerne らいはンパイ ) できる ことリ提とす 合には筆者はよどのことがない は NetB -current 追い なお、 限り R ease を勧めいる。 ているの、、、基本的に etBSD- 稿 っ っ でカ 記 表 1 2000 年 2 月時 . 、。の Release 2.2.8- RELEASE ( i386 のみ ) 3.2-RELEASE(i386 のみ ) 3.3-RELEASE 3.4-RELEASE OpenBSD NetBSD FreeBSD っ ) ( 4 一 ) CD つ」っ」っ J つ」 1 .3.2 1 .3.3 ot が非常に安定して動くことはよくあることである。 ろん、あるタイ、 ミングの sn eb を閲覧したりなど本業に使うマシンのことを筆者は " 生活マシン " と呼んでいる。 注 2 原稿やメールを書いたり、 35 BSD magazine 2000 No. 3