flat7th

Linuxゲームパッドの

created 2025-08-29 modified 2025-08-29 

Linuxゲームパッドのボタンマップ変更とキャリブレーションをOS再起動またぎで復元する


環境: Fedora 42
ゲームパッド: ELECOM JC-U4113S BK
(ELECOM 製品はなるべく使いたくないのだが)
接続モード: X Input Mode

手順


ボタン配置のリマップ


キャリブレの前に、ボタン配置のリマップも適切に行う。
私が今(2025年)持っているゲームパッド (ELECOM JC-U4113S BK) は、
左肩のアナログトリガーの位置がなんかおかしな順番で認識される。(ので直す)

jstest-gtk (GUI) で行う。(略)




(ABS_Z の位置が、起動直後だと3番目(2:) になっていたので、行をマウスでドラッグして後ろにずらした)

キャリブレーション自体は


jstest-gtk (GUI) で行う。(略)



マッピングとキャリブレーション結果をファイルに保存する


jscal -q /dev/input/js0 > a.txt
jscal -p /dev/input/js0 >> a.txt
mv a.txt ~/.bashrc.d/21-joystick-calib.rc

フォルダ ~/.bashrc.d/ 以下に置いておくと、GNOME ログイン時に読んでくれる、ことを期待。
ファイル名 21-joystick-calib.rc は、勝手に決めた。
拡張子が rc であるファイルを ファイル名アルファベット順に読まれること、を期待。


なお: こんな中身になった


jscal -u 8,0,1,3,4,2,5,16,17,11,304,305,307,308,310,311,314,315,316,317,318 /dev/input/js0
jscal -s 8,1,0,0,0,16384,16384,1,0,-1,-1,16384,16383,1,0,0,0,16384,16384,1,0,-1,-1,16384,16383,1,0,127,127,4227201,4194176,1,0,127,127,4227201,4194176,1,0,0,0,536854528,536854528,1,0,0,0,536854528,536854528 /dev/input/js0

どんな意味なのか、少し調べてみた。

jscal -u は配置の復元


man page によると
<nb_axes,axmap1,axmap2,...,nb_buttons,btnmap1,btnmap2,...>

最初の 8 が軸の数。以後、軸の意味を示すらしい値が並んでいる。
"0,1,3,4,2,5,16,17"
この値は /usr/include/linux/input-event-codes.h の定数っぽい。
#define ABS_X			0x00
#define ABS_Y			0x01
#define ABS_Z			0x02
#define ABS_RX			0x03
#define ABS_RY			0x04
#define ABS_RZ			0x05
...
#define ABS_HAT0X		0x10
#define ABS_HAT0Y		0x11

次の 11 がボタンの数。以後、ボタンの意味を示すらしい値が並んでいる。
"304,305,307,308,310,311,314,315,316,317,318"
BTN_A			0x130 = 304
BTN_B			0x131 = 305
...
BTN_X			0x133 = 307
BTN_Y			0x134 = 308
...
BTN_TL			0x136 = 310
BTN_TR			0x137 = 311
...
BTN_SELECT		0x13a = 314
BTN_START		0x13b = 315
BTN_MODE		0x13c = 316
BTN_THUMBL		0x13d = 317
BTN_THUMBR		0x13e = 318

jscal -s はキャリブレの復元


man page によると
<nb_axes,type,precision,coefficients,...>
Sets correction to specified values.
For each axis, specify
the correction type (0 for none, 1 for "broken line"),
the precision,
and if necessary the correction coefficients ("broken line" corrections take four coefficients)
とある。具体値が以下。
8,
1,0,0,0,16384,16384,
1,0,-1,-1,16384,16383,
1,0,0,0,16384,16384,
1,0,-1,-1,16384,16383,
1,0,127,127,4227201,4194176,
1,0,127,127,4227201,4194176,
1,0,0,0,536854528,536854528,
1,0,0,0,536854528,536854528

"1, 0, 0,0,16384,16384,"
最初の 1 が "broken line" タイプを意味していて
次の 0 が 精度...?
次の4値 が correction coefficients (補正係数) なのだろうがこれは、分からんな。


動作確認


OSを再起動してみて、改めて jstest-gtk をせずとも、以下となるか。

jstest /dev/input/js0
#または
jstest --event /dev/input/js0

確認項目

  • 配置カスタマイズの確認
    • ボタン認識が以下となっているか
      • この順に 0〜10: A B X Y L1 R1 Back Start Guide 左スティック押し込み 右スティック押し込み
    • 軸認識が以下となっているか
      • 左のアナログスティックが 0, 1
      • 右のアナログスティックが 2, 3
      • 両肩のアナログトリガーが 4, 5
  • 値範囲の確認
    • ボタンは押した時 1、離した時0
    • 十字ボタン X,Yとも 中央が 0、最小,最大が -32767,32767
    • 左右のアナログスティック
      • X,Yについて 最小,最大が -32767,32767 中央が 0
    • 左右の肩トリガー
      • 最小,最大が -32767,32767 離したときが -32767

再起動以前に、値を確認すると:
左右スティックとも Ymax が 32766 になる。
それ以外は全て、期待と結果が一致した。

で、再起動をまたいで確認したところ、再起動前と全く同じになった。
めでたし。


参考リンク


https://qiita.com/DaiGuard/items/308ab0865fed3c11fbbd
https://manpages.ubuntu.com/manpages/focal/man1/jscal.1.html