試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

PSX-CV02上のPlayStation 2コントローラの振動機能をGNU/Linux上で用いるための試行錯誤(Linux 2.6.31.5時点・第1回)

PlayStation(1/2/PSX)のコントローラをUSB接続するPLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02GNU/Linux上で用いた際には(Linux 2.6.31.5の時点では)そのままでは振動機能は利用できないが、これを使えるようにするべく試行錯誤してみた。

フォースフィードバック機能を用いる仕組みは存在し、対応するデバイスもある

GNU/Linux上で PlayStation 2のコントローラを使用する」で書いたように、既にGNU/Linuxにはコントローラが持つ振動などの機能(フォースフィードバック)を利用するための仕組みが存在し、こうした機能を持ったコントローラの類に対応するデバイスドライバの幾つかはフォースフィードバック対応となっており、この機能が(フォースフィードバック対応アプリケーションから)利用できる。
Linux 2.6.31.5の時点では既にPlayStation(1や2)のコントローラを用いる幾つかのアダプタ(コンバータ)向けのデバイスカーネルのソースツリーに含まれているように見えるが、手元のPLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02に接続したPlayStation 2コントローラでは「GNU/Linux上で PlayStation 2のコントローラを使用する」のテストのように動作しなかった(デバイスが非対応となっている)。しかし、既にLinuxが対応しているアダプタが似たような作りになっているとしたらもしかすると動いてくれるのではないか、と考え、類似のデバイス向けの既存のドライバを無理やり用いてみて、どの程度動く/動かないのかを確かめることにした。

類似のデバイス向けのドライバを無理やり使ってみる

drivers/hid/以下の幾つかのドライバのソースを見たところ、例えばdrivers/hid/hid-pl.cでは
[引用] /usr/src/linux-2.6.31.5-1mnb/drivers/hid/hid-pl.c より

static const struct hid_device_id pl_devices[] = {
	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR),
		.driver_data = 1 }, /* Twin USB Joystick */
	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR),
		.driver_data = 1 }, /* Twin USB Joystick */
	{ HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003), },
	{ }
};

のように

  • ベンダごとのID
  • 製品ごとのID

の組み合わせの記述によりそのドライバが対象とするデバイスを指定しているようだったので、手元のPLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02の各IDを追加してみた。
IDをlsusbで調べると

  • ベンダIDが0x0e8f(GreenAsia Inc.)
  • 製品IDが0x1006

であることが分かったので
[一部] /usr/src/linux-2.6.31.5-1mnb/drivers/hid/hid-pl.c

static const struct hid_device_id pl_devices[] = {
	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR),
		.driver_data = 1 }, /* Twin USB Joystick */
	{ HID_USB_DEVICE(USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR),
		.driver_data = 1 }, /* Twin USB Joystick */
	{ HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x0003), },
	{ HID_USB_DEVICE(USB_VENDOR_ID_GREENASIA, 0x1006),
		.driver_data = 1 }, /* Twin USB Joystick */
	{ }
};

のようにした。ベンダIDについては
[引用]ファイル名: /usr/src/linux-2.6.31.5-1mnb/drivers/hid/hid-ids.h より

#define USB_VENDOR_ID_GREENASIA		0x0e8f

と定義されていたので、これを用いた。
「.driver_data = 1」については最初は意味がよく分からなかったが、「Twin USB Joystick」というコメントがあることから、PLANEX USBゲームパッドコンバータ(PS/PS2対応・2ポート) PSX-CV02が2ポートであることを踏まえ、他の項目にならって付けることにした。
このpantherloadというドライバ(モジュール名hid_pl)をモジュールにしてビルドするためには

Device Drivers  --->
 [*] HID Devices  --->
  <M> Generic HID support                            [CONFIG_HID]
  <M> USB Human Interface Device (full HID) support  [CONFIG_USB_HID]
  Special HID drivers  --->
   <M> Pantherlord devices support                   [CONFIG_HID_PANTHERLORD]
   <M> Pantherlord support                           [CONFIG_HID_PANTHERLORD]
   [*] Pantherlord force feedback support            [CONFIG_PANTHERLORD_FF]

のようにカーネルのビルド設定をすることになる(何故かこのバージョンのカーネルでは同じ設定項目が2つある?)。

(「PSX-CV02上のPlayStation 2コントローラの振動機能をGNU/Linux上で用いるための試行錯誤(Linux 2.6.31.5時点・第2回)」に続く)

関連記事:

使用したバージョン: