「スキャンコードをキーコードにマップ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
 
(3人の利用者による、間の7版が非表示)
1行目: 1行目:
[[Category:キーボード]]
+
[[Category:キーボード設定]]
 
[[en:Map scancodes to keycodes]]
 
[[en:Map scancodes to keycodes]]
  +
[[zh-hans:Map scancodes to keycodes]]
{{Note|このページは既に[[特別なキーボードキー]]を読んでいることを前提としています。特別なキーボードキーでは広い範囲で問題を扱っています。}}
 
  +
このページは既に[[特別なキーボードキー]]を読んでいることを前提としています。特別なキーボードキーでは広い範囲で問題を扱っています。
   
  +
スキャンコードからキーコードへのマッピングは、Xorg および Linux コンソールよりも下位のレイヤーで行われます。つまり、このマッピングへの変更は両方で有効になります。[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/input-event-codes.h#n64][https://elixir.bootlin.com/linux/latest/A/ident/hid_keyboard][https://elixir.bootlin.com/linux/latest/A/ident/atkbd_set2_keycode] この方法は単純な 1:1 キーの再マップにのみ使用できることに注意してください。同じ低レベルでより複雑なリマップを可能にするプログラムの[[入力リマップユーティリティ]]を参照してください。
''スキャンコード''から''キーコード''へのマッピングは Linux コンソールもしくは Xorg に限定されない普遍的なことであり、コンソールと Xorg 両方に影響を与えます。
 
   
 
''スキャンコード''を''キーコード''にマップする方法は2つあります:
 
''スキャンコード''を''キーコード''にマップする方法は2つあります:
 
* [[udev]] を使う
 
* [[udev]] を使う
* ''setkeycodes'' を使う
+
* {{man|8|setkeycodes}} を使う
   
 
''udev'' を使用する方法が推奨されます。udev は (情報源として信頼できる) ハードウェア情報を使ってデータベースからキーボードモデルを選択しているからです。あなたの使用しているキーボードモデルがデータベースから見つからなかった場合、あなたのキーは ''out of the box'' として認識されます。
 
''udev'' を使用する方法が推奨されます。udev は (情報源として信頼できる) ハードウェア情報を使ってデータベースからキーボードモデルを選択しているからです。あなたの使用しているキーボードモデルがデータベースから見つからなかった場合、あなたのキーは ''out of the box'' として認識されます。
17行目: 18行目:
 
== udev を使う ==
 
== udev を使う ==
   
[[udev]] には {{ic|/etc/udev/hwdb.bin}} のハードウェアデータベースインデックスを管理するための ''hwdb'' という組み込み関数が存在します。データベースは {{ic|/usr/lib/udev/hwdb.d/}}, {{ic|/run/udev/hwdb.d/}}, {{ic|/etc/udev/hwdb.d/}} ディレクトリに存在する拡張子が ''.hwdb'' のファイルから作成されます。デフォルトの ''scancodes-to-keycodes'' マッピングファイルは {{ic|/usr/lib/udev/hwdb.d/60-keyboard.hwdb}} です。詳しくは {{ic|man udev}} を見て下さい。
+
[[udev]] には {{ic|/etc/udev/hwdb.bin}} のハードウェアデータベースインデックスを管理するための ''hwdb'' という組み込み関数が存在します。{{ic|/usr/lib/udev/hwdb.d/}}, {{ic|/run/udev/hwdb.d/}}, {{ic|/etc/udev/hwdb.d/}} ディレクトリに存在する拡張子が ''.hwdb'' のファイルからデータベースが作成されます。スキャンコードをキーコードにマッピングするデフォルトのマッピングファイルは {{ic|/usr/lib/udev/hwdb.d/60-keyboard.hwdb}} です。詳しくは {{man|7|hwdb}} を見て下さい。
   
  +
''.hwdb'' ファイルには様々なキーボードに対応する複数のマッピングブロックを記述でき、ひとつのブロックを複数のキーボードに適用することもできます。ハードウェアに対するブロックのマッチには {{ic|evdev:}} プレフィックスが使われます。以下のハードウェアマッチがサポートされています:
The ''.hwdb'' file can contain multiple blocks of mappings for different keyboards, or one block can be applied to multiple keyboards. The {{ic|keyboard:}} prefix is used to match a block against a hardware, the following hardware matches are supported:
 
   
  +
* 一般的な入力デバイス (USB キーボードなど) は usb カーネル modalias によって識別されます: {{bc|evdev:input:b''<bus_id>''v''<vendor_id>''p''<product_id>''e''<version_id>''-''<modalias>''}} {{ic|''<vendor_id>''}}, {{ic|''<product_id>''}}, {{ic|''<version_id>''}} は4桁の大文字の16進数で、それぞれベンダー ID、プロダクト ID、バージョン ID を表します (ID は {{ic|lsusb}} コマンドを実行することで確認できます)。{{ic|''<modalias>''}} は任意の長さの modalias でデバイスの機能を表します。{{ic|''<bus_id>''}} は4桁の16進数のバス ID で、USB デバイスの場合は 0003 になります。{{ic|''<bus_id>''}} に指定できる値は {{ic| /usr/include/linux/input.h}} に定義されています (次のコマンドを使うことでリストとして表示できます: {{ic| awk '/BUS_/ {print $2, $3}' /usr/include/linux/input.h}})。
* USB keyboards identified by the usb kernel modalias: {{bc|keyboard:usb:v''<vendor_id>''p''<product_id>''*}} where {{ic|''<vendor_id>''}} and {{ic|''<product_id>''}} are the 4-digit hex uppercase vendor and product IDs (you can find those by running the {{ic|lsusb}} command).
 
* AT keyboard DMI data matches: {{bc|keyboard:dmi:bvn*:bvr*:bd*:svn''<vendor>'':pn''<product>'':pvr*}} where {{ic|''<vendor>''}} and {{ic|''<product>''}} are the firmware-provided strings exported by the kernel DMI modalias.
+
* AT キーボードの DMI データは以下の形式でマッチします: {{bc|evdev:atkbd:dmi:bvn*:bvr*:bd*:svn''<vendor>'':pn''<product>'':pvr*}} {{ic|''<vendor>''}} {{ic|''<product>''}} はファームウェアによって供給される文字列でカーネルの DMI modalias を経由して確認できます。
* Platform driver device name and DMI data match: {{bc|keyboard:name:''<input_device_name>'':dmi:bvn*:bvr*:bd*:svn''<vendor>'':pn*}} where {{ic|''<input_device_name>''}} is the name device specified by the driver and {{ic|''<vendor>''}} is the firmware-provided string exported by the kernel DMI modalias.
+
* 入力ドライバーのデバイス名と DMI データは以下の形式でマッチします: {{bc|evdev:name:''<input device name>'':dmi:bvn*:bvr*:bd*:svn''<vendor>'':pn*}} {{ic|''<input_device_name>''}} はドライバーによって指定されたドライバーの名前、{{ic|''<vendor>''}} はカーネルの DMI modalias 経由で確認できるファームウェアの文字列です。
   
The format of each line in the block body is {{ic|1=KEYBOARD_KEY_''<scancode>''=''<keycode>''}}. The value of {{ic|''<scancode>''}} is hexadecimal, but without the leading {{ic|0x}} (i.e. specify {{ic|a0}} instead of {{ic|0xa0}}), whereas the value of {{ic|''<keycode>''}} is the lower-case keycode name string as listed in {{ic|/usr/include/linux/input-event-codes.h}} (see the {{ic|KEY_''<KEYCODE>''}} variables), a sorted list is available at [http://hal.freedesktop.org/quirk/quirk-keymap-list.txt]. It is not possible to specify decimal value in {{ic|''<keycode>''}}.
+
ブロックの本体部は各行とも {{ic|1=KEYBOARD_KEY_''<scancode>''=''<keycode>''}} という形式になっています。{{ic|''<scancode>''}} の値は16進数ですが先頭に {{ic|0x}} は付けません ({{ic|0xa0}} ではなく {{ic|a0}} と指定します){{ic|''<keycode>''}} {{ic|/usr/include/linux/input-event-codes.h}} に記載されている小文字のキーコード名になります ({{ic|KEY_''<KEYCODE>''}} 変数を見てください)。ソートされたリストが [http://hal.freedesktop.org/quirk/quirk-keymap-list.txt] から確認できます。{{ic|''<keycode>''}} で10進数の値を指定することはできません。
   
=== hwdb のカスタム例 ===
+
=== サンプル ===
   
  +
==== すべてのデバイスを再マップする ====
以下の hwdb ファイルは全ての USB・AT キーボードにマッチします:
 
  +
  +
すべての AT キーボードのいくつかの共通キーを再マップする場合:
   
 
{{hc|/etc/udev/hwdb.d/90-custom-keyboard.hwdb|<nowiki>
 
{{hc|/etc/udev/hwdb.d/90-custom-keyboard.hwdb|<nowiki>
  +
evdev:atkbd:*
keyboard:usb:v*p*
 
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 
 
KEYBOARD_KEY_10=suspend
 
KEYBOARD_KEY_10=suspend
 
KEYBOARD_KEY_a0=search
 
KEYBOARD_KEY_a0=search
 
</nowiki>}}
 
</nowiki>}}
  +
  +
==== 特定のデバイスを再マップする ====
  +
  +
現在たまたま接続しているデバイスを再マップしたいとします。evdev パス (例: {{ic|/dev/input/event17}}) と''スキャンコード''(例: {{ic|70039}} (Caps Lock の場合) ここで、イベント番号を使用して、Modalias について [[Wikipedia:sysfs|sysfs]] をクエリできます。
  +
  +
{{hc|cat /sys/class/input/event17/device/modalias|
  +
input:b0003v32ACp0012e0111-e0,1,4,1...}}
  +
  +
このデバイスは、次の hwdb ルールと一致する可能性があります:
  +
  +
{{hc|/etc/udev/hwdb.d/90-remap.hwdb|2=
  +
evdev:input:b0003v32ACp0012e0111*
  +
KEYBOARD_KEY_70039=rightctrl # This example maps the 70039 scancode to the "rightctrl" keycode.
  +
}}
  +
  +
==== キーを無効にする ====
  +
  +
{{ic|Sleep}} キーをブロックするには、それを"reserved"キーワードにバインドします。あるいは、''unknown'' を使用して {{ic|NoSymbol}} キーにマップすることもできます。例えば:
  +
  +
{{hc|/etc/udev/hwdb.d/90-block-sleep.hwdb|2=
  +
evdev:input:b0003v03F0p020C* # hp 5308 keyboard controller
  +
KEYBOARD_KEY_10082=reserved
  +
}}
   
 
=== Hardware Database Index のアップデート ===
 
=== Hardware Database Index のアップデート ===
45行目: 70行目:
 
# udevadm hwdb --update
 
# udevadm hwdb --update
   
* {{ic|systemd-udev-hwdb-update.service}} の {{ic|ConditionNeedsUpdate}} をコメントアウトすると再起動するたびに自動的に更新されます:
+
* {{ic|systemd-hwdb-update.service}} の {{ic|ConditionNeedsUpdate}} をコメントアウトすると再起動するたびに自動的に更新されます:
   
{{hc|/usr/lib/systemd/system/systemd-udev-hwdb-update.service|<nowiki>
+
{{hc|/usr/lib/systemd/system/systemd-hwdb-update.service|<nowiki>
 
# This file is part of systemd.
 
# This file is part of systemd.
 
.
 
.
56行目: 81行目:
 
</nowiki>}}
 
</nowiki>}}
   
{{ic|systemd-udev-hwdb-update.service}} のロードが完了すると {{ic|systemd-udev-trigger.service}} は
+
{{ic|systemd-hwdb-update.service}} のロードが完了すると {{ic|systemd-trigger.service}} は {{ic|hwdb.bin}} の変更をリロードします。
{{ic|hwdb.bin}} の変更をリロードします。
 
   
 
* [[Systemd]] のアップグレード時には自動的に更新が行われます。
 
* [[Systemd]] のアップグレード時には自動的に更新が行われます。
69行目: 93行目:
 
{{ic|udevadm}} を以下のようなコマンドで使うことで最新の {{ic|hwdb.bin}} から新しいキーマッピングをロードできます:
 
{{ic|udevadm}} を以下のようなコマンドで使うことで最新の {{ic|hwdb.bin}} から新しいキーマッピングをロードできます:
 
# udevadm trigger
 
# udevadm trigger
  +
{{ic|udevadm}} は追加・変更したキーマッピングしかロードしないため注意してください。コンフィグファイルからマッピングを削除した場合、{{ic|hwdb.bin}} を再ビルドして {{ic|# udevadm trigger}} を実行して、さらに再起動を行わないと削除されたマッピングがカーネルに残り続けます。
Be aware that with {{ic|udevadm}} only added or changed key mapping are loaded so if we delete a mapping from the config file, rebuild {{ic|hwdb.bin}} and run {{ic|# udevadm trigger}} then the deleted mapping still kept by the kernel, at least until a reboot.
 
  +
  +
=== データベースに問い合わせる ===
  +
  +
キーを押したり {{ic|udevadm info}} を実行することで設定がロードされているかどうか確認できます。上記の例の USB キーボードの場合、以下のように設定したマッピングが出力されます:
  +
  +
# udevadm info /dev/input/by-path/*-usb-*-kbd | grep KEYBOARD_KEY
  +
E: KEYBOARD_KEY_70039=leftalt
  +
E: KEYBOARD_KEY_700e2=leftctrl
   
 
== setkeycodes を使う ==
 
== setkeycodes を使う ==
78行目: 110行目:
   
 
一度に複数のペアを指定することが可能です。''スキャンコード''は16進数で、''キーコード''は10進数で記述します。
 
一度に複数のペアを指定することが可能です。''スキャンコード''は16進数で、''キーコード''は10進数で記述します。
  +
  +
{{Note|''setkeycodes'' は USB キーボードでは機能しません (Linux 3.14.44-1-lts):
  +
  +
# setkeycodes 45 30 # bind NumLock (0x45) to KEY_A (30) on AT keyboard
  +
(successful)
  +
# setkeycodes 70053 30 # bind NumLock (0x70053) to KEY_A (30) on USB keyboard
  +
KDSETKEYCODE: Invalid argument
  +
failed to set scancode 620d3 to keycode 31
  +
}}

2024年3月14日 (木) 14:46時点における最新版

このページは既に特別なキーボードキーを読んでいることを前提としています。特別なキーボードキーでは広い範囲で問題を扱っています。

スキャンコードからキーコードへのマッピングは、Xorg および Linux コンソールよりも下位のレイヤーで行われます。つまり、このマッピングへの変更は両方で有効になります。[1][2][3] この方法は単純な 1:1 キーの再マップにのみ使用できることに注意してください。同じ低レベルでより複雑なリマップを可能にするプログラムの入力リマップユーティリティを参照してください。

スキャンコードキーコードにマップする方法は2つあります:

udev を使用する方法が推奨されます。udev は (情報源として信頼できる) ハードウェア情報を使ってデータベースからキーボードモデルを選択しているからです。あなたの使用しているキーボードモデルがデータベースから見つからなかった場合、あなたのキーは out of the box として認識されます。

スキャンコードの確認

リマップするキーのスキャンコードを知っておく必要があります。詳しくは特別なキーボードキー#スキャンコードを見て下さい。

udev を使う

udev には /etc/udev/hwdb.bin のハードウェアデータベースインデックスを管理するための hwdb という組み込み関数が存在します。/usr/lib/udev/hwdb.d/, /run/udev/hwdb.d/, /etc/udev/hwdb.d/ ディレクトリに存在する拡張子が .hwdb のファイルからデータベースが作成されます。スキャンコードをキーコードにマッピングするデフォルトのマッピングファイルは /usr/lib/udev/hwdb.d/60-keyboard.hwdb です。詳しくは hwdb(7) を見て下さい。

.hwdb ファイルには様々なキーボードに対応する複数のマッピングブロックを記述でき、ひとつのブロックを複数のキーボードに適用することもできます。ハードウェアに対するブロックのマッチには evdev: プレフィックスが使われます。以下のハードウェアマッチがサポートされています:

  • 一般的な入力デバイス (USB キーボードなど) は usb カーネル modalias によって識別されます:
    evdev:input:b<bus_id>v<vendor_id>p<product_id>e<version_id>-<modalias>
    <vendor_id>, <product_id>, <version_id> は4桁の大文字の16進数で、それぞれベンダー ID、プロダクト ID、バージョン ID を表します (ID は lsusb コマンドを実行することで確認できます)。<modalias> は任意の長さの modalias でデバイスの機能を表します。<bus_id> は4桁の16進数のバス ID で、USB デバイスの場合は 0003 になります。<bus_id> に指定できる値は /usr/include/linux/input.h に定義されています (次のコマンドを使うことでリストとして表示できます: awk '/BUS_/ {print $2, $3}' /usr/include/linux/input.h)。
  • AT キーボードの DMI データは以下の形式でマッチします:
    evdev:atkbd:dmi:bvn*:bvr*:bd*:svn<vendor>:pn<product>:pvr*
    <vendor><product> はファームウェアによって供給される文字列でカーネルの DMI modalias を経由して確認できます。
  • 入力ドライバーのデバイス名と DMI データは以下の形式でマッチします:
    evdev:name:<input device name>:dmi:bvn*:bvr*:bd*:svn<vendor>:pn*
    <input_device_name> はドライバーによって指定されたドライバーの名前、<vendor> はカーネルの DMI modalias 経由で確認できるファームウェアの文字列です。

ブロックの本体部は各行とも KEYBOARD_KEY_<scancode>=<keycode> という形式になっています。<scancode> の値は16進数ですが先頭に 0x は付けません (0xa0 ではなく a0 と指定します)。<keycode>/usr/include/linux/input-event-codes.h に記載されている小文字のキーコード名になります (KEY_<KEYCODE> 変数を見てください)。ソートされたリストが [4] から確認できます。<keycode> で10進数の値を指定することはできません。

サンプル

すべてのデバイスを再マップする

すべての AT キーボードのいくつかの共通キーを再マップする場合:

/etc/udev/hwdb.d/90-custom-keyboard.hwdb
evdev:atkbd:*
 KEYBOARD_KEY_10=suspend
 KEYBOARD_KEY_a0=search

特定のデバイスを再マップする

現在たまたま接続しているデバイスを再マップしたいとします。evdev パス (例: /dev/input/event17) とスキャンコード(例: 70039 (Caps Lock の場合) ここで、イベント番号を使用して、Modalias について sysfs をクエリできます。

cat /sys/class/input/event17/device/modalias
input:b0003v32ACp0012e0111-e0,1,4,1...

このデバイスは、次の hwdb ルールと一致する可能性があります:

/etc/udev/hwdb.d/90-remap.hwdb
evdev:input:b0003v32ACp0012e0111*
 KEYBOARD_KEY_70039=rightctrl # This example maps the 70039 scancode to the "rightctrl" keycode.

キーを無効にする

Sleep キーをブロックするには、それを"reserved"キーワードにバインドします。あるいは、unknown を使用して NoSymbol キーにマップすることもできます。例えば:

/etc/udev/hwdb.d/90-block-sleep.hwdb
evdev:input:b0003v03F0p020C* # hp 5308 keyboard controller
 KEYBOARD_KEY_10082=reserved

Hardware Database Index のアップデート

設定ファイルを変更した後は、ハードウェアデータベースインデックス hwdb.bin を再構築する必要があります。

  • 次を実行して hwdb.bin を手動でアップデート:
# udevadm hwdb --update
  • systemd-hwdb-update.serviceConditionNeedsUpdate をコメントアウトすると再起動するたびに自動的に更新されます:
/usr/lib/systemd/system/systemd-hwdb-update.service
#  This file is part of systemd.
.
.
#ConditionNeedsUpdate=/etc
.
.

systemd-hwdb-update.service のロードが完了すると systemd-trigger.servicehwdb.bin の変更をリロードします。

  • Systemd のアップグレード時には自動的に更新が行われます。

Systemd のアップグレード時、インストールスクリプトが # udevadm hwdb --update を実行して hwdb.bin を再構築するため手動の操作は必要ありません。

Hardware Database Index のリロード

カーネルは起動時に hwdb.bin を読み込むため、システムを再起動することで最新の hwdb.bin をロードできます。

udevadm を以下のようなコマンドで使うことで最新の hwdb.bin から新しいキーマッピングをロードできます:

# udevadm trigger

udevadm は追加・変更したキーマッピングしかロードしないため注意してください。コンフィグファイルからマッピングを削除した場合、hwdb.bin を再ビルドして # udevadm trigger を実行して、さらに再起動を行わないと削除されたマッピングがカーネルに残り続けます。

データベースに問い合わせる

キーを押したり udevadm info を実行することで設定がロードされているかどうか確認できます。上記の例の USB キーボードの場合、以下のように設定したマッピングが出力されます:

# udevadm info /dev/input/by-path/*-usb-*-kbd | grep KEYBOARD_KEY
E: KEYBOARD_KEY_70039=leftalt
E: KEYBOARD_KEY_700e2=leftctrl

setkeycodes を使う

setkeycodesscancodes-to-keycodes マッピングテーブルを Linux カーネルにロードさせるツールです。使用方法は:

# setkeycodes scancode keycode ...

一度に複数のペアを指定することが可能です。スキャンコードは16進数で、キーコードは10進数で記述します。

ノート: setkeycodes は USB キーボードでは機能しません (Linux 3.14.44-1-lts):
# setkeycodes 45 30     # bind NumLock (0x45) to KEY_A (30) on AT keyboard
(successful)
# setkeycodes 70053 30  # bind NumLock (0x70053) to KEY_A (30) on USB keyboard
KDSETKEYCODE: Invalid argument
failed to set scancode 620d3 to keycode 31