BeOSのジョイスティックドライバ

最終更新: 2000.9.20


はじめに

本稿では、BeOSのジョイスティックドライバの書き方について、筆者が調査した結果を解説します。 BeOSのデバイスドライバ(カーネルドライバおよびモジュール)の知識を前提とします。

Beは、マイナーなジャンルのデバイスドライバ開発に関しては、 ほとんど情報を公開していません。 ジョイスティック/ゲームポートもその例にもれず、 sonic_vibesドライバのソースコードと Be BookのBJoystickの解説Be Developer Newsletterの記事 が間接的に参考になる程度です。 そこで、ジョイスティックドライバの書き方について調査した結果、 どうにか動くものが書ける程度の情報が得られたので、以下に解説します。

本稿の内容は筆者が調査したもので、 一部を除いてBeが公表・保証したものではなく、 必ずしも正しいという保証はありません。 また、未だ不明な部分も多く残っています。


ジョイスティックのAPI

まず、BeOSにおけるジョイスティックのAPI(BJoystickクラス)について簡単に見ていきます。詳細は Be Bookの解説Be Developer Newsletterの記事を参照してください。

BJoystickはstandard modeとenhanced modeの2つの動作モードがあります。 standard modeはBeBoxのゲームポートに由来する古いもので、 ジョイスティックのモデルに関係なく2軸2ボタンに限定されており、あまり使いません。 enhanced modeはR4で追加されたもので、ジョイスティックの機能をフルに利用できます。 また、Joysticks preferenceの設定はenhanced modeでのみ有効です。 通常はenhanced modeを使うことになると思います。 standard modeからenhanced modeに移行することができますが、 デフォルトではゲームポートのオープンと同時にenhanced modeに移行します。 standard modeを使うには、enhanced modeに移行しないよう特に指定する必要があります。

アプリケーションからのジョイスティックのアクセス手順は以下のようになります (関数名はBJoystickクラスのメンバ関数です)。 なお、enhanced modeを使うためには、あらかじめJoysticks preferenceでジョイスティックの設定をしておく必要があります。

standard mode

  1. Open()でゲームポートをオープンする。 このとき、enhanced modeに移行しないよう指定する (後でEnterEnhancedMode()により移行することも可能)。
  2. Update()でジョイスティックのデータを入力する。 データはメンバ変数(horizontal,vertical,button1,button2)に設定される。
  3. アプリケーションはメンバ変数を直接読み取る。
  4. Close()でゲームポートをクローズする。

enhanced mode

  1. CountDevices()GetDeviceName()を用いてゲームポートを列挙する。
  2. Open()でゲームポートをオープンする。このときenhanced modeに移行する。
  3. CountAxes()CountButtons()などを用いてジョイスティックの諸元を知る。
  4. Update()でジョイスティックのデータを入力する。
  5. 入力したデータをGetAxesValues()ButtonValues()などを用いて読み取る。
  6. Close()でゲームポートをクローズする。

BeOSのジョイスティックサポートの枠組

BeOSのジョイスティックサポートの枠組は以下のようになっています。

	applications
	Joysticks preference------------+
		|			|
		|			|
		|BJoystick	joystick definition files
		|			|
		|			|
	operating system----------------+
		|
		|
		|kernel driver API
		|
		|
	gameport drivers--------+
		|		|
		|		|module API
		|		|
		|	joystick modules
		|
		|
	gameport hardware
		|
		|
	joystick hardware

主な構成要素の機能は以下の通りです。

各ファイルの所在は以下の通りです。

ゲームポートドライバ /system/add-ons/kernel/drivers/dev/joystick/*
ジョイスティックモジュール /system/add-ons/kernel/media/joy/*
ジョイスティック定義ファイル /etc/joysticks/*
ゲームポートデバイスファイル /dev/joysticks/*/*

これ以外に、generic gameport moduleというものが存在しており (/system/add-ons/kernel/generic/gameportjoystick_driver.hgeneric_gameport_module構造体)、 sonic_vibesドライバでも使用していますが、これの役割と使用法は明らかではありません。 使わなくてもドライバは書けるようなので、ここでは無視します。

ジョイスティックのドライバを開発するということは、 ゲームポートドライバを開発すること、 ジョイスティックモジュールを開発すること、 そしてジョイスティック定義ファイルを書くことを意味します。


ゲームポートドライバ

ゲームポートドライバのAPIで実装すべき内容を解説します。 構造体などについては、sonic_vibesドライバのjoystick_driver.hを参照してください。


ジョイスティックモジュール

ジョイスティックモジュールのAPIで実装すべき内容を解説します。 ジョイスティックモジュールについては、ゲームポートドライバと比べて不明な部分が多いです。


サンプル

拙作のサンプルソースを参考にしてください。


不明な点

不明な点はまだたくさんあります。


おわりに


参考文献


伊藤隆幸のホームページ