monolithic kernel

YMDK YMD40 のために QMK Firmware をカスタマイズ

YMDK YMD09 を購入したことで調子に乗って、今度は同じメーカーの YMD40 というキーボードを購入した。iPad mini に繋いで文字を打つのに、HHKB よりもコンパクトなキーボードがあったらいいなと思い手に取った。

AliExpress では DIY キットだけでなく組み立て済みの状態でも販売されていたので、自分で作業する必要はなかった。また、好きなケース、キーキャップ、キースイッチの組み合わせを自由に選んで注文できた。キーキャップは別途選んでカートに入れる必要があるので、商品説明をよく読んで注文したほうがよい。

今回は YMD09 のときとは異なり、到着した時点では VIA でのキーマップの書き換えができなかった。これについては、商品説明ページにある PCB VIA manuals に沿って作業することで解決。VIA を使うところで usevia.app のサイトではなく VIA 1.3.1 をインストールして使うように指示されているのが気になったが、確かに指示に従わないと動かなかった。

ただ、ファームウェアを自分で qmk_firmware からビルドして書き込んだところ、インストールした VIA と公式の Keymap JSON の組み合わせでは認識してくれない。逆に、qmk_firmware リポジトリのファームウェアを書き込んだ場合には usevia.app のサイトだと認識してくれるようになった。結果としてはそのほうが都合がよいのでよいのだが、それに気づかずあれこれ試行錯誤して時間をだいぶ無駄にした。

# Vendor ID や Product ID の値が公式と qmk_firmware で食い違っているのに違和感を覚えたのだが、直したところで動かなかったので謎。

ファームウェアのカスタマイズ内容には例によってオリジナリティは特になく、以下のページの2つの変更を組み合わせて導入した。

スペースキーの両隣にある押している間レイヤを切り替えるキーをそのまま活かしつつ、単体で押した場合はそれぞれ変換/無変換 (Mac ではかな/英数) として使えるというキーの節約と他環境の再現を目指したような内容。似たような話として、US キーボードの Mac の人が Command キーをかな/英数として使えるようにしているのはよく聞く。

コードはこんな感じ。

ただ、独自キーコードを定義してそれを VIA から使うのにどうすべきかというところでちょっと困った。

ドキュメントによると、ほんとは SAFE_RANGE という定数を使って既存のキーコードと衝突しないようにしておく必要があるはずなのだが、SAFE_RANGE の値は頻繁に変化する (ように見えた) ため、VIA 側で指定するのに都合が悪いように思えた。これを書いている 2022-11-12 時点で SAFE_POINT の値は 23986 であったため、とりあえず適当に 0x8000 として VIA で指定しやすいようにした。

enum custom_keycodes {
    IMEON = 0x8000,
    IMEOFF,
};

このようなファームウェアを書き込んだ上で、VIA 側では Any を選んで 0x8000 ないし 0x8001 と指定してあげれば使える。

VIA を使わずに keymaps で定義する分には特に問題にならないところだが、(特に最初は) キーマップをいろいろ変えて試したいので速度優先でこのようにしている。落ち着いたらちゃんと SAFE_POINT を使ったほうがよいかもしれない。