「スキャンコードをキーコードにマップ」の版間の差分
(ページの作成:「Category:キーボード en:Map scancodes to keycodes {{Note|このページは既に特別なキーボードキーを読んでいることを前提として...」) |
(→udev を使う: 同期) |
||
(3人の利用者による、間の9版が非表示) | |||
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 キーの再マップにのみ使用できることに注意してください。同じ低レベルでより複雑なリマップを可能にするプログラムの[[入力リマップユーティリティ]]を参照してください。 |
||
− | Mapping ''scancodes'' to ''keycodes'' is universal and not specific to Linux console or Xorg, which means that changes to this mapping will be effective in both. |
||
''スキャンコード''を''キーコード''にマップする方法は2つあります: |
''スキャンコード''を''キーコード''にマップする方法は2つあります: |
||
* [[udev]] を使う |
* [[udev]] を使う |
||
− | * |
+ | * {{man|8|setkeycodes}} を使う |
+ | ''udev'' を使用する方法が推奨されます。udev は (情報源として信頼できる) ハードウェア情報を使ってデータベースからキーボードモデルを選択しているからです。あなたの使用しているキーボードモデルがデータベースから見つからなかった場合、あなたのキーは ''out of the box'' として認識されます。 |
||
− | The preferred method is to use ''udev'' because it uses hardware information (which is a quite reliable source) to choose the keyboard model in a database. It means that if your keyboard model has been found in the database, your keys are recognized ''out of the box''. |
||
== スキャンコードの確認 == |
== スキャンコードの確認 == |
||
17行目: | 18行目: | ||
== udev を使う == |
== 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'' のファイルからデータベースが作成されます。スキャンコードをキーコードにマッピングするデフォルトのマッピングファイルは {{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 |
+ | * AT キーボードの DMI データは以下の形式でマッチします: {{bc|evdev:atkbd:dmi:bvn*:bvr*:bd*:svn''<vendor>'':pn''<product>'':pvr*}} {{ic|''<vendor>''}} と {{ic|''<product>''}} はファームウェアによって供給される文字列でカーネルの DMI modalias を経由して確認できます。 |
− | * |
+ | * 入力ドライバーのデバイス名と DMI データは以下の形式でマッチします: {{bc|evdev:name:''<input device name>'':dmi:bvn*:bvr*:bd*:svn''<vendor>'':pn*}} {{ic|''<input_device_name>''}} はドライバーによって指定されたドライバーの名前、{{ic|''<vendor>''}} はカーネルの DMI modalias 経由で確認できるファームウェアの文字列です。 |
− | + | ブロックの本体部は各行とも {{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進数の値を指定することはできません。 |
|
− | === |
+ | === サンプル === |
+ | ==== すべてのデバイスを再マップする ==== |
||
− | The example hwdb file will match all USB and AT keyboards: |
||
+ | |||
+ | すべての 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 のアップデート === |
||
+ | 設定ファイルを変更した後は、ハードウェアデータベースインデックス {{ic|hwdb.bin}} を再構築する必要があります。 |
||
− | After changing the configuration files, the hardware database index, {{ic|hwdb.bin}}, needs to be rebuilt. |
||
− | * |
+ | * 次を実行して {{ic|hwdb.bin}} を手動でアップデート: |
# udevadm hwdb --update |
# udevadm hwdb --update |
||
+ | * {{ic|systemd-hwdb-update.service}} の {{ic|ConditionNeedsUpdate}} をコメントアウトすると再起動するたびに自動的に更新されます: |
||
− | * Update automatically on each reboot by commenting out {{ic|ConditionNeedsUpdate}} in {{ic|systemd-udev-hwdb-update.service}}. |
||
− | {{hc|/usr/lib/systemd/system/systemd |
+ | {{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-hwdb-update.service}} のロードが完了すると {{ic|systemd-trigger.service}} は {{ic|hwdb.bin}} の変更をリロードします。 |
|
− | {{ic|hwdb.bin}}. |
||
+ | * [[Systemd]] のアップグレード時には自動的に更新が行われます。 |
||
− | * Automatically after [[Systemd]] upgrade. |
||
− | + | [[Systemd]] のアップグレード時、インストールスクリプトが {{ic|# udevadm hwdb --update}} を実行して {{ic|hwdb.bin}} を再構築するため手動の操作は必要ありません。 |
|
=== Hardware Database Index のリロード === |
=== Hardware Database Index のリロード === |
||
+ | カーネルは起動時に {{ic|hwdb.bin}} を読み込むため、システムを再起動することで最新の {{ic|hwdb.bin}} をロードできます。 |
||
− | The kernel loads {{ic|hwdb.bin}} as part of the boot process, rebooting the system will promise the loading of the updated {{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 を使う == |
||
− | ''setkeycodes'' |
+ | ''setkeycodes'' は ''scancodes''-to-''keycodes'' マッピングテーブルを Linux カーネルにロードさせるツールです。使用方法は: |
# setkeycodes ''scancode'' ''keycode'' ... |
# setkeycodes ''scancode'' ''keycode'' ... |
||
+ | 一度に複数のペアを指定することが可能です。''スキャンコード''は16進数で、''キーコード''は10進数で記述します。 |
||
− | It is possible to specify multiple pairs at once. ''Scancodes'' are given in hexadecimal, ''keycodes'' in decimal. |
||
+ | |||
+ | {{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 を使う
- setkeycodes(8) を使う
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.service
のConditionNeedsUpdate
をコメントアウトすると再起動するたびに自動的に更新されます:
/usr/lib/systemd/system/systemd-hwdb-update.service
# This file is part of systemd. . . #ConditionNeedsUpdate=/etc . .
systemd-hwdb-update.service
のロードが完了すると systemd-trigger.service
は hwdb.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 を使う
setkeycodes は scancodes-to-keycodes マッピングテーブルを Linux カーネルにロードさせるツールです。使用方法は:
# setkeycodes scancode keycode ...
一度に複数のペアを指定することが可能です。スキャンコードは16進数で、キーコードは10進数で記述します。