ゲームパッド

提供: ArchWiki
2015年10月19日 (月) 18:35時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

ゲームパッドを Linux で使うのには少し手間がかかるかもしれません。サポートが薄いためではなく、あなたのゲームパッドを動かすのにロードすべきモジュールを見つける必要があり、そしてそれがわかりづらいことがあるからです。

ゲームパッド入力システム

実は Linux には異なる2つのゲームパッドの入力システムが存在します。オリジナルの 'Joystick' インターフェイスと新しい 'evdev' ベースのインターフェイスです。

/dev/input/jsX は 'Joystick' API インターフェイスに /dev/input/event* は 'evdev' インターフェイス (こちらにはマウスやキーボードなど他の入力デバイスも含まれます) にそれぞれマップされています。また、これらのデバイスのシンボリックリンクが /dev/input/by-id//dev/input/by-path/ に存在し、古い 'Joystick' API には -joystick という名前が付き、'evdev' には -event-joystick という名前が付きます。

ほとんどの新しいゲームは 'evdev' インターフェイスをデフォルトで使います。'evdev' インターフェイスの方がボタンや軸の詳しい情報を得ることができ、フォースフィードバックもサポートしているためです。

SDL1.x はデフォルトで 'evdev' インターフェイスを使用しますが SDL_JOYSTICK_DEVICE=/dev/input/js0 環境変数を設定することで 'Joystick' API を使うように SDL を強制させることができます。これは X3 などのゲームで役に立ちます。SDL2.x は新しい 'evdev' インターフェイスだけをサポートしています。

また、xorg ドライバー xf86-input-joystick というのも存在します。これはゲームパッドを使って xorg のマウス・キーボードを操作できるようにするだけのもので、ほとんどの人にとっては望んでいたものではないとなるでしょう。マウス操作を無効化する方法は下のゲームパッドのマウス操作を無効にするで説明しています。ただし大抵の場合、パッケージを削除するだけでもかまいません。

必要なモジュールの確認

ゲームポートやプロプライエタリな USB プロトコルを使用する、旧時代のゲームパッドを使うというのでなければ、一般的な USB ヒューマンインターフェイスデバイス (HID) モジュールだけで足ります。

Linux における全てのゲームパッド関連のモジュールの広範な外観を見るには、Linux カーネルのソースを紐解く必要があります -- 特に Documentation セクションがそれです。残念ながら、pacman のカーネルパッケージには必要なドキュメントが含まれていません。カーネルソースをダウンロードした場合、Documentation/input/joystick.txt を見て下さい。また、kernel.org から使用しているカーネルの "cgit" (git フロントエンド) リンクをクリックして、上部の "tree" リンクをクリックすることでカーネルのソースツリーをブラウズすることができます。こちらはカーネル 3.12.6 のドキュメントのリンクです。

Microsoft Sidewinder コントローラー (sidewinder) や Logitech デジタルコントローラー (adi) など、特定のモジュールを必要とするゲームパッドも存在します。多くの古いゲームパッドはシンプルな analog モジュールで動作します。サウンドカードによるゲームポートにゲームパッドを接続している場合、サウンドカードドライバーをロードする必要があります - しかしながら、カードによっては、Soundblaster Live など、特定のゲームポートドライバーを持っているものもあります (emu10k1-gp)。古い ISA サウンドカードは ns558 モジュールを必要とします。これは標準のゲームポートモジュールです。

Linux でゲームパッドを動作させるのに関連するモジュールは多々あるため、ここでは全てを説明することはできません。詳細については上記のドキュメントを見るようにしてください。

アナログデバイスのモジュールのロード

ゲームポートのモジュール (ns558, emu10k1-gp, cs461x, など)、ゲームパッドのモジュール (analog, sidewinder, adi, など)、そしてカーネルジョイスティックデバイスドライバー (joydev) をロードする必要があります。これらを /etc/modules-load.d/ のファイルに追加するか、modprobe してください。gameport モジュールは他のモジュールの依存モジュールとして、自動でロードされるはずです。

USB ゲームパッド

USB を動作させて、ジョイスティックドライバーを modprobe する必要があります。usbhidjoydev です。USB マウスやキーボードを使っている場合、usbhid は既にロードされるので joydev モジュールだけをロードしてください。

設定のテスト

モジュールがロードされたら、新しいデバイスが認識されるはずです: /dev/input/js0。また、/dev/input/by-id ディレクトリに -event-joystick で終わるファイルが作られます。デバイスを cat することで動作するか確認できます。スティックを動かして、全てのボタンを押して下さい。画面に文字化けが表示されるはずです。

Wine での確認とテストは基本的に wine control joy.cpl で両方できます。

Joystick API

Joystick API をテストするアプリケーションはたくさんあります。joyutilsAUR パッケージの jstest が一番シンプルなアプリケーションです。一行では設定できないほどの多数のボタンや軸がある場合や、パッドに加速度センサが付いている場合は (何も起こってない時も新しいイベントを送り続けます) グラフィカルツールを使って下さい。KDE4 にはシステム設定の入力デバイスパネルにテスト用のツールが含まれています。また、jstest-gtk-gitAUR を使うこともできます。

jstest の使い方はとても簡単です。jstest /dev/input/js0 と実行すると軸 (倒していない状態で {-32767,32767}) とボタンの状態が全て出力されます。

jstest-gtk を実行すると、接続されているゲームパッドのリストが表示されるので、どれか一つを選択して Properties を押して下さい。

evdev API

新しい 'evdev' API は SDL2 のゲームパッドテストアプリケーションや community リポジトリに入っている evtest を使うことでテストできます。sdl2-jstest-gitAUR をインストールしてから sdl2-jstest --test 0 を実行してください。複数のコントローラーを接続している場合に他のコントローラーの ID を取得したいときは sdl2-jstest --list を使います。

デバイスのフォースフィードバックをテストするには、linuxconsole パッケージに含まれている fftest を使って下さい:

$ fftest /dev/input/by-id/usb-*event-joystick

デッドゾーンとキャリブレーションの設定

アナログ入力のデッドゾーンを設定したい (または完全にデッドゾーンを削除したい) ときは、xorg (マウス・キーボードエミュレート用) と Joystick API と evdev API で別に設定する必要があります。

Xorg のデッドゾーン

/etc/X11/xorg.conf.d/50-joystick.confEndSection の前に以下のような行を追加してください:

Option "MapAxis1" "deadzone=1000"

1000 はデフォルトの値で、0 から 30000 の間で設定できます。軸番号を取得する方法はこの記事の #設定のテスト セクションを参照。問題の軸で既にオプションを設定している場合は、スペースで区切ったパラメータの最後に deadzone=value を入力してください。

Joystick API のデッドゾーン

一番簡単な方法は jstest-gtk-gitAURjstest-gtk を使うことです。編集したいコントローラーを選択して、ダイアログの下にある Calibration ボタンをクリックしてください (Start Calibration をクリックしてはいけません)。デッドゾーンの中心を指定する CenterMin と CenterMax の値や、デッドゾーンの終末を指定する RangeMin と RangeMax を設定します。キャリブレーション設定はアプリケーションがデバイスを開いたときに適用されるので、ゲームを再起動する必要があります。

デッドゾーンを設定したら jscal を使って新しい値をシェルスクリプトに出力してください:

$ jscal -p /dev/input/jsX > jscal.sh # replace X with your joystick's number 
$ chmod +x jscal.sh

そして udev ルールを作成して (例えば /etc/udev/rules.d/85-jscal.rules) コントローラーを接続した時に自動的にスクリプトが実行されるようにします:

SUBSYSTEM=="input", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="c268", ACTION=="add", RUN+="/usr/bin/jscal.sh"

idVendor と idProduct を取得するには udevadm info --attribute-walk --name /dev/input/jsX を使って下さい。

複数のコントローラーを使用する場合は `/dev/input/by-id/*-joystick` デバイス名を使います。

evdev API のデッドゾーン

evdev API のキャリブレーションを変更できるスタンドアロンのアプリケーションは存在しません。ただし VDrift ゲームと一緒に配布されている G25manage を使うことでセンターデッドゾーンを変更できます。

G25manage を入手する一番簡単な方法は VDrift の github を開いて、全てのファイルをダウンロードして make を使ってビルドすることです。

ビルドしたら、次のコマンドでデバイスの設定を確認できます:

$ ./G25manage --showcalibration /dev/input/by-id/usb-*-event-joystick

軸のデッドゾーンを変更するには、次のコマンドを使います:

$ ./G25manage --evdev /dev/input/by-id/usb-*-event-joystick --axis 0 --deadzone 0

コントローラーが接続されたときに自動的に設定を行いたいときは udev ルールを使って下さい。

カーネルの中では、値の名前は flatness となっており、EVIOCSABS ioctl を使って設定します。

デフォルト設定は以下のようになります:

$ ./G25manage --showcalibration /dev/input/by-id/usb-Madcatz_Saitek_Pro_Flight_X-55_Rhino_Stick_G0000090-event-joystick
Supported Absolute axes:
   Absolute axis 0x00 (0) (X Axis) (min: 0, max: 65535, flatness: 4095 (=6.25%), fuzz: 255)
   Absolute axis 0x01 (1) (Y Axis) (min: 0, max: 65535, flatness: 4095 (=6.25%), fuzz: 255)
   Absolute axis 0x05 (5) (Z Rate Axis) (min: 0, max: 4095, flatness: 255 (=6.23%), fuzz: 15)
   Absolute axis 0x10 (16) (Hat zero, x axis) (min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)
   Absolute axis 0x11 (17) (Hat zero, y axis) (min: -1, max: 1, flatness: 0 (=0.00%), fuzz: 0)

以下のようにすることで適切な設定ができます (他の軸でも同じコマンドを実行してください):

$ ./G25manage --evdev /dev/input/by-id/usb-Madcatz_Saitek_Pro_Flight_X-55_Rhino_Stick_G0000090-event-joystick --axis 0 --deadzone 512
Event device file: /dev/input/by-id/usb-Madcatz_Saitek_Pro_Flight_X-55_Rhino_Stick_G0000090-event-joystick
 Axis index to deal with: 0
 New dead zone value: 512
 Trying to set axis 0 deadzone to: 512
   Absolute axis 0x00 (0) (X Axis) Setting deadzone value to : 512
 (min: 0, max: 65535, flatness: 512 (=0.78%), fuzz: 255)

ゲームパッドのマウス操作を無効にする

コントローラーを使ってゲームを遊びたいとき、ゲームパッドによるマウスカーソルの操作を無効にすると良いかもしれません。無効にするには、以下のように /etc/X11/xorg.conf.d/50-joystick.conf を編集してください:

/etc/X11/xorg.conf.d/50-joystick.conf 
Section "InputClass"
        Identifier "joystick catchall"
        MatchIsJoystick "on"
        MatchDevicePath "/dev/input/event*"
        Driver "joystick"
        Option "StartKeysEnabled" "False"       #Disable mouse
        Option "StartMouseEnabled" "False"      #support
EndSection

ゲームパッドでキーストロークを送る

rejoystickAUR, qjoypadAUR, antimicro-qt4AUR というゲームパッドでキー操作するプログラムがあり、どれも X.org の設定をせずとも問題なく動作します。

X.org で

This is a good solution for systems where restarting Xorg is a rare event because it's a static configuration loaded only on X startup. I use it on my media PC running XBMC controlled with Logitech Cordless RumblePad 2. Due to a problem with the d-pad (a.k.a. "hat") being recognized as another axis, I used to run Joy2key as a workaround. Since I upgraded to XBMC 11.0 and joy2key 1.6.3-1, this setup no longer worked for me. I ended up taking a more direct approach and let Xorg handle joystick events.

まず、xf86-input-joystick をインストールします。そして、以下のように /etc/X11/xorg.conf.d/51-joystick.conf を作成:

 Section "InputClass"
  Identifier "Joystick hat mapping"
  Option "StartKeysEnabled" "True"
  #MatchIsJoystick "on"
  Option "MapAxis5" "keylow=113 keyhigh=114"
  Option "MapAxis6" "keylow=111 keyhigh=116"
 EndSection
ノート: The MatchIsJoystick "on" line doesn't seem to be required for this to work but you may want to uncomment it.

特定のデバイス

ほとんどのゲームパッド (特に USB を使っているコントローラー) は何も設定しなくても動作しますが、ゲームパッドによっては設定が必要な場合があります。最初に試してみて動かなかったときでも、諦めずにドキュメントを読んでみて下さい。

Logitech Thunderpad Digital

analog モジュールを使っている場合 Logitech Thunderpad Digital は全てのボタンを表示しません。このコントローラーを使う場合は adi モジュールを使って下さい。

Nintendo Gamecube コントローラー

Dolphin Emulator には公式の Nintendo USB アダプタと GameCube コントローラーを使う方法を説明した ページ を wiki に用意しています。この設定はスイッチを "Wii U" に設定した場合の Mayflash Controller Adapter でも使えます。

デフォルトでは、コントローラーは udev で登録されますが、root ユーザーしか読み取ることができません。以下の udev ルールを追加することで修正できます:

/etc/udev/rules.d/51-gcadapter.rules
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="0337", MODE="0666"

This only matches the USB device with the specified vendor and product IDs, which match those of the official USB adapter. It sets the permissions of the device file to 0666 so that programs that aren't running as root can read the device's input.

udev can be reloaded with the new configuration by executing

 # udevadm control --reload-rules

PlayStation 3/4 コントローラー

DualShock 3, DualShock 4, Sixaxis ゲームパッドは USB で接続された時に設定なしで動作します (操作を開始するには PS ボタンを押さなくてはなりません)。振動機能はカーネル 3.14 からサポートされています。また、Bluetooth でワイヤレスに使うことも可能です。

Steam は PS3 パッドとして正しく認識し、PS ボタンで Big Picture を起動することが可能です。Big Picture やゲームによっては 360 コントローラーのように振る舞うことができます。ゲームパッドによるマウス操作はデフォルトでオンになっています。ゲームをプレイする前にオフにしたいときは、#ゲームパッドのマウス操作を無効にする を見て下さい。

Bluetooth で接続

bluez-pluginsbluez-utils パッケージをインストールしてください。sixaxis プラグインが含まれています。そして bluetooth.service起動して、USB でコントローラーを接続してください。プラグインが PC の bluetooth アドレスを自動的にコントローラーに書き込みます。

それが終わったらコントローラーを切断してもかまいません。次からは PlayStation ボタンを押せば何もしなくても接続されます。

Steam コントローラー

Steam コントローラーを使うには以下の udev ルールが必要です。Steam クライアントによって認識されたら他のコントローラーをエミュレートすることができます [1]。また、uinput モジュールをロードしている必要があります。

/etc/udev/rules.d/99-steam-controller.rules
# for basic functionality of the controller in Steam and keyboard/mouse emulation
SUBSYSTEM=="usb", ATTRS{idVendor}=="28de", MODE="0666"

# for gamepad emulation
KERNEL=="uinput", MODE="0660", GROUP="users", OPTIONS+="static_node=uinput"

また、上記のファイルが含まれている steamcontroller-udevAUR をインストールする方法もあります。

Xbox 360 コントローラー

このコントローラーはパッケージを別にインストールしなくても動作しますが、無線コントローラーには無線レシーバーが必要です (charge-and-play ケーブルはコントローラとの通信に使えません)。有線コントローラーと無線レシーバーはどちらも xpad カーネルモジュールによってサポートされています。

デフォルトで、コントローラーと関連付けられたデバイス (例: /dev/input/event14) は root に所有されます。これは root グループに入っており、所有者にしかデバイスを読み書きすることが許可されません (600)。結果として、アプリケーションはスーパーユーザー権限で実行しないかぎりコントローラーを使用できなくなります。これを修正するため、以下の udev ルールを作成してください。

/etc/udev/rules.d/50-event.rules
KERNEL=="event*", GROUP="games", MODE="660"

この udev ルールは games グループのメンバーであるユーザーがコントローラーを使えるようにします。

残念ながら xpad には新しい無線コントローラーで問題が起こります:

解決方法は xboxdrvAUR を使うことです。これはユーザースペースで動作するもうひとつのドライバーです。システムサービスとして起動することができます。もしくは SteamOS のパッチがあたった xpad (steamos-xpad-dkmsAUR) も以上の問題を修正しています。

コントローラーを使ってマウスの制御や、ボタンのキーへのマッピングなどをしたい場合、xf86-input-joystick パッケージを使う必要があります (設定のヘルプは man joystick で見れます)。マウスが隅で固まってしまうときは、/etc/X11/xorg.conf.d/50-joystick.confMatchDevicePath/dev/input/event* から /dev/input/js* に変更すれば直るでしょう。

ヒント: TLP 電源管理デーモンを使っている場合、Microsoft の無線アダプタの接続に問題が発生することがあります (例: インジケータ LED がアダプタを接続した数秒後に消えてしまい、コントローラーの接続が失敗する)。これは TLP の USB 自動サスペンド機能が原因です。この機能を完全に無効化するか、Microsoft の無線アダプタのデバイス ID を機能のブラックリストに追加することで問題は解決します (詳しくは TLP configuration をチェック)。

SteamOS の xpad

デフォルトの xpad カーネルモジュールで問題がおこる場合、AURsteamos-xpad-dkmsAUR でインストールできる SteamOS バージョンを使うことができます。

インストールする前に、DKMS をインストールして実行してください。

それから修正版のカーネルモジュール steamos-xpad-dkmsAURAUR からインストールして下さい。インストール中に新しい xpad カーネルモジュールがカーネルに結び付けられるのが確認できると思います:

Creating symlink /var/lib/dkms/steamos-xpad-dkms/0.1/source ->
                 /usr/src/steamos-xpad-dkms-0.1
 
DKMS: add completed.
 
Kernel preparation unnecessary for this kernel.  Skipping...
 
Building module:
cleaning build area....
make KERNELRELEASE=3.12.8-1-ARCH KVERSION=3.12.8-1-ARCH....
cleaning build area....

再起動すれば動作するようになります。

xboxdrv で2つのコントローラーを使う

xboxdrv は多数のコントローラーをサポートしていますが、デーモンモード でしか動作しません。 一番シンプルな方法はサービスとして xboxdrv をデーモンモードで起動して:

ExecStart = /usr/bin/xboxdrv -D -c /etc/conf.d/xboxdrv

設定ファイルに2番目のコントローラーのサポートを追加することです:

 [xboxdrv]
 silent = true
 next-controller = true
 [xboxdrv-daemon]
 dbus = disabled

Xbox 360 コントローラーに偽装する

xboxdrv を使うことで --mimic-xpad スイッチによってあらゆるコントローラーを Xbox 360 コントローラーとして登録することができます。Xbox 360 コントローラーをサポートしていて、他のゲームパッドでは問題がおこるゲームでありがたい機能です。

まず、コントローラーのボタンやスティックの名前を確認する必要があります。evtest を使えば確認できます。evtest を実行してコントローラーに対応するデバイスのイベント ID 番号 (/dev/input/event*) を選択してください。コントローラーのボタンを押したりスティックを動かしてボタンやスティックの名前を調べます。

以下は出力の例です:


Event: time 1380985017.964843, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90003
Event: time 1380985017.964843, type 1 (EV_KEY), code 290 (BTN_THUMB2), value 1
Event: time 1380985017.964843, -------------- SYN_REPORT ------------
Event: time 1380985018.076843, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90003
Event: time 1380985018.076843, type 1 (EV_KEY), code 290 (BTN_THUMB2), value 0
Event: time 1380985018.076843, -------------- SYN_REPORT ------------
Event: time 1380985018.460841, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1380985018.460841, type 1 (EV_KEY), code 289 (BTN_THUMB), value 1
Event: time 1380985018.460841, -------------- SYN_REPORT ------------
Event: time 1380985018.572835, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
Event: time 1380985018.572835, type 1 (EV_KEY), code 289 (BTN_THUMB), value 0
Event: time 1380985018.572835, -------------- SYN_REPORT ------------
Event: time 1380985019.980824, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90006
Event: time 1380985019.980824, type 1 (EV_KEY), code 293 (BTN_PINKIE), value 1
Event: time 1380985019.980824, -------------- SYN_REPORT ------------
Event: time 1380985020.092835, type 4 (EV_MSC), code 4 (MSC_SCAN), value 90006
Event: time 1380985020.092835, type 1 (EV_KEY), code 293 (BTN_PINKIE), value 0
Event: time 1380985020.092835, -------------- SYN_REPORT ------------
Event: time 1380985023.596806, type 3 (EV_ABS), code 3 (ABS_RX), value 18
Event: time 1380985023.596806, -------------- SYN_REPORT ------------
Event: time 1380985023.612811, type 3 (EV_ABS), code 3 (ABS_RX), value 0
Event: time 1380985023.612811, -------------- SYN_REPORT ------------
Event: time 1380985023.708768, type 3 (EV_ABS), code 3 (ABS_RX), value 14
Event: time 1380985023.708768, -------------- SYN_REPORT ------------
Event: time 1380985023.724772, type 3 (EV_ABS), code 3 (ABS_RX), value 128
Event: time 1380985023.724772, -------------- SYN_REPORT ------------

上記の場合 BTN_THUMB, BTN_THUMB2, BTN_PINKIE がボタンで、ABS_RX が右アナログスティックの X 軸になります。 そしてこの名前を使って次のようなコマンドで Xbox 360 コントローラーにみせかけることができます:

$ xboxdrv --evdev /dev/input/event* --evdev-absmap ABS_RX=X2 --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_PINKIE=rt --mimic-xpad

上の例は不完全です。デモンストレーション用に1つの軸と3つのボタンしかマップしません。xboxdrv --help-button を使って Xbox コントローラーのボタンと軸を見て、上のコマンドに拡充してそれぞれ割り当てて下さい。軸のマッピングは --evdev--absmap の後に、ボタンのマッピングは --evdev-keymap の後に記述します (カンマで区切り、スペースは使いません)。

デフォルトで、xboxdrv は全てのイベントをターミナルに出力します。これによってマッピングが正しいかどうかテストすることが可能です。--silent オプションを追加すると出力がされなくなります。

USB で接続した Playstation 3 コントローラー

PS3 コントローラーを使っていて USB で接続している場合、xboxdrv には初めから組み込まれたマッピングが存在します。次のプログラムを実行 (して動作中のドライバを取外) すれば動作するようになります。

# xboxdrv --silent --detach-kernel-driver
Bluetooth で接続した Playstation 3 コントローラー

bluetooth を通してプレイステーション3のコントローラーを使うには sixpairAUR ユーティリティをインストールする必要があります。

sixpair をインストールした後はコントローラーを USB ケーブルで接続して sixpair を実行してください:

# sixpair

USB からコントローラーを切断して5分間待機してください (本当に待機する必要があるのかは定かでない)。

そして bluez でペアリングを行います。bluez-utilsbluez-plugins パッケージが必要です。

全ての bluetooth ユーティリティ (bluedevil や bluemon) を無効にしてください。

bluetoothctl ユーティリティを実行します:

# bluetoothctl

bluetooth のプロンプトが表示されます。

プレイステーションボタンを押して、接続・切断のメッセージを見てデバイスのアドレスをコピーしてください (例: 38:C0:96:56:4D:AA)。

ランプの点滅が止まるまで待って下さい。

そして、以下を入力してください:

agent on
default-agent
discoverable on
pairable on

もう一度プレイステーションボタンを押して、点滅している間に次を入力します:

connect <device_addr>

デバイスが利用可能にならない場合 (接続と切断を繰り返します) 以下のような表示がされるまで上のコマンドを試し続けてください:

[CHG] Device <device_addr> Modalias: usb:v054Cp0268d0100
[CHG] Device <device_addr> UUIDs:
       00001124-0000-1000-8000-00805f9b34fb
       00001200-0000-1000-8000-00805f9b34fb

そしてデバイスを認証してください:

trust <device_addr>

これで完了です。

次からはプレイステーションボタンを押せば自動的に接続されます。

また、無効にした bluetooth アプレット・モニターをもう一度有効にすることができます。.

コントローラーを使わないときは切断するのを忘れないで下さい。接続したままにしておくと、バッテリーを消費します。

xboxdrv を使って xbox360 コントローラーをエミュレートする場合は udev ルールを作成するのが良いでしょう。

udev ルールを作成する

以下の内容で新しい udev ルールを作成してください (例えば 99 または 98-dualshock.rules を /etc/udev/rules.d/ に配置):

KERNEL=="event*", SUBSYSTEM=="input", ATTRS{uniq}=="<device_addr_you_got_on_pairing>", SYMLINK+="input/dualshock3"

xboxdrv を新しいデバイスで実行します:

xboxdrv --evdev /dev/input/dualshock3 --mimic-xpad

mimic-xpad が動作しない場合は、xboxdrv [2] による設定ファイルを使用して xboxdrv セクションに以下を追加してください:

 mimic-xpad = true

そして evdev 行を以下のように置き換えてください:

evdev = /dev/input/dualshock3 (or whatever other name you gave in the udev_rule)

設定したら、xboxdrv を実行します:

# xboxdrv -c config_file

楽しい時間をお過ごしください。

Playstation 2 アダプタ

PS2 デュアルアダプターのボタンマッピングを修正して Xbox コントローラーに見せかけるために、以下のコマンドを使うことができます:

 sudo xboxdrv --evdev /dev/input/event* \
     --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \
     --axismap -Y1=Y1,-Y2=Y2 \
     --evdev-keymap   BTN_TOP=x,BTN_TRIGGER=y,BTN_THUMB2=a,BTN_THUMB=b,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE=lb,BTN_BASE2=rb,BTN_TOP2=lt,BTN_PINKIE=rt,BTN_BASE5=tl,BTN_BASE6=tr \
     --mimic-xpad --silent
Logitech Dual Action

Logitech Dual Action ゲームパッドは PS2 のパッドと似ているマッピングを持っていますが、Xbox コントローラーのように使うにはいくつかのボタンとトリガーを交換する必要があります:

 sudo xboxdrv --evdev /dev/input/event* \
     --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \
     --axismap -Y1=Y1,-Y2=Y2 \
     --evdev-keymap BTN_TRIGGER=x,BTN_TOP=y,BTN_THUMB=a,BTN_THUMB2=b,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE=lt,BTN_BASE2=rt,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE5=tl,BTN_BASE6=tr \
     --mimic-xpad --silent
Playstation 4 コントローラー

PS4 コントローラーのボタンマッピングを修正するために、xboxdrv で以下のスクリプトを使用するか、または ds4drv プログラムを試すことができます:

 #!/bin/bash                                                                          
 sudo xboxdrv  \                                                                      
   --evdev /dev/input/by-id/usb-Sony_Computer_Entertainment_Wireless_Controller-event-joys>
   --evdev-absmap ABS_X=x1,ABS_Y=y1                 \                               
   --evdev-absmap ABS_Z=x2,ABS_RZ=y2                \                               
   --evdev-absmap ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \                               
   --evdev-keymap BTN_A=x,BTN_B=a                   \                               
   --evdev-keymap BTN_C=b,BTN_X=y                   \                               
   --evdev-keymap BTN_Y=lb,BTN_Z=rb                 \                               
   --evdev-keymap BTN_TL=lt,BTN_TR=rt               \
   --evdev-keymap BTN_SELECT=tl,BTN_START=tr        \                               
   --evdev-keymap BTN_TL2=back,BTN_TR2=start        \                               
   --evdev-keymap BTN_MODE=guide                    \                               
   --axismap -y1=y1,-y2=y2                          \                               
   --mimic-xpad                                     \                               
   --silent                                         \                               
   "$@"

トラブルシューティング

ゲームパッドでマウスが動く

ときどき USB ゲームパッドが HID マウスとして認識されることがあります (X 内のみで、/dev/input/js0 としてもインストールされる)。カーソルがゲームパッドによって動いたり、接続した後に画面の右端に逃げていくのは既知の問題です。アプリケーションが自力でゲームパッドを検出できる場合は、xf86-input-joystick パッケージを削除することができます。

もっと平和的な解決方法はゲームパッドのマウス操作を無効にすることです。

ゲームパッドがどのプログラムからも認識されない

Steam など、ソフトウェアによっては最初に接続されたゲームパッドしか認識しないことがあります。Microsoft の無線周辺機器デバイスのドライバーにバグが存在するため、bluetooth ドングルでもこの問題が起こることがあります。/dev/input/js*/dev/input/event* がキーボードの bluetooth トランシーバーに属していることが確認できたら /etc/udev/rules.d/99-btcleanup.rules を作成することで自動的に排除することができます:

/etc/udev/rules.d/99-btcleanup.rules
ACTION=="add", KERNEL=="js[0-9]*", SUBSYSTEM=="input", KERNELS=="...", ATTRS{bInterfaceSubClass}=="00", ATTRS{bInterfaceProtocol}=="00", ATTRS{bInterfaceNumber}=="02", RUN+="/usr/bin/rm /dev/input/js%n"
ACTION=="add", KERNEL=="event*", SUBSYSTEM=="input", KERNELS=="...", ATTRS{bInterfaceSubClass}=="00", ATTRS{bInterfaceProtocol}=="00", ATTRS{bInterfaceNumber}=="02", RUN+="/usr/bin/rm /dev/input/event%n"

KERNELS=="..." はあなたのデバイスに合わせて置き換えてください。次を実行することで正しい値が確認できます:

# udevadm info -an /dev/input/js0

問題のデバイスは /dev/input/js0 と仮定しています。ルールを記述したらルールをリロードしてください:

# udevadm control --reload

そして問題のデバイスを再接続します。joystick や event デバイスが外されても、番号は予約されています。ただしファイルは扱われます。