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