QMK (2)

Date: 2022/01/18 (initial publish), 2022/08/23 (last update)

Source: jp/note-00040.md

Previous Post Top Next Post

TOC

QMKを使ってファームウエアー作成

手始めに、QMK : キーマップのカスタマイズ (2018年頃)も参考に、できるだけ今風の(2022年)qmkコマンドを使って、1つのキーのカスタムキーボードを作ります。

対象ハードはatmega32u4が載ったTeensy2.0の中華コンパチボードです。本物のTeensy2.0でないのでatmel-dfuがBOOTLOADERだったはずです。ただ、BOOTLOADERはISP接続で小さな(512 bytes)HIDデバイスのnanoBoot (w/LED)に書き換えています。

   .word       0x03EB         // idVendor             -- Vendor ID (Atmel VID, from LUFA)
   .word       0x2067         // idProduct            -- Product ID (HID Class Bootloader PID, from LUFA)

これってqmk-hidと同じIDです。ファームウエアーのサイズはqmk-hidの4KB(?)よりnanoBootは小さいメリットがあります。

ファームエアーのアップロードプロトコルは同じ halfkeyコンパチのID違いなので、指定は同じにして良い気がします。

作成デバイスはメディアキーのMUTE1つのデバイスです。

テンプレート作成

 $ qmk cd
 $ gitk --all
  ... (最新の「master」ブランチのリリースが0.15.15と確認)
 $ git checkout 0.15.15
 $ git checkout -b osamu1
 $ qmk new-keyboard
Ψ Generating a new QMK keyboard directory

Keyboard Name: one
Keyboard Type:
        1. avr
        2. ps2avrgb
Please enter your choice:  [1] 1
Your GitHub User Name: [Osamu Aoki] osamuaoki
Your real name: [osamuaoki] Osamu Aoki

Ψ Created a new keyboard called one.
Ψ To start working on things, `cd` into keyboards/one,
Ψ or open the directory in your preferred text editor.

名前のデフォルトは/etc/passwdみたいですね。

これで、keyboards/one/以下にテンプレートのソースが、data/templates/からAVR前提で作成されます。

ビルドシステムの動作確認

とりあえず試しにファームウエアーを作成します。

 $ qmk compile -km default -kb one
 ...

ビルドシステムは順調が確認できました。これからカスタマイズしていくので、ひとまず全クリーンです。

 $ qmk clean -a
 ...

キーボードスイッチ接続の考察

最初のテストデバイスは、D1にスイッチの1端子が繋がっていて、スイッチの反対の端子はGNDされています。ダイオードなど一切ついていません。

一方QMKの前提構成は、スイッチが2次元の格子状マトリクスとなっており、クロストーク防止のダイオードが使用されています。 スイッチの両方がMCUに繋がっていて、MCUの入力側は通常MCU内部のプルアップ抵抗が有効にされてい、MCUの出力側は通常VCCでGNDにすると有効となります。

COLとROWのどっち向けにダイオードが使用されているかで2通りあります。

つまり:

スイッチマトリクスが1次元で、スイッチの一方がGNDに繋がってる際:

出力側は繋いでも良いが、1つなので選択状態と同じGNDに常に繋いでも同じです。つまりデフォルトの#define DIODE_DIRECTION COL2ROW だと、D0がCOL側に定義となります。

ROW側に何も無しでソフトが動くのかどうか少々不安でしたが、まずはその線でconfig.hを設定しました。

#define MATRIX_ROW_PINS { }
#define MATRIX_COL_PINS { D0 }

keyboards/one/one.hの中のLAYOUTは以下に書き換えました。

#define LAYOUT( k00 ) { { k00 } }

さらにMUTEキーとすべく、keyboards/one/keymaps/default /keymap.cを以下としました。

// Defines names for use in layer keycodes and the keymap
enum layer_names {
    _BASE,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [_BASE] = LAYOUT( KC_AUDIO_MUTE )
};

MCU中のBOOTLOADERはISP接続で小さな(512 bytes)HIDデバイスのnanoBoot (w/LED)に書き換えているので、rules.mk中のBOOTLOADERqmk-hidです。あと、直接の影響はないファイルをいくつか変更しました。

ファームウエアーのビルド

ファームウエアーを作成します。

 $ qmk compile -km default -kb one
 ...
 $ qmk cd
 $ cd .build

うまくビルドし、one_default.hexができています。

FLASH(古いやり方)

私のシステムにLUFAのオリジナルのhid_bootloader_cliが入っていたのでそれを使ってみます。

kernel: usb 4-2: new full-speed USB device number 11 using xhci_hcd
kernel: usb 4-2: New USB device found, idVendor=03eb, idProduct=2067, bcdDevice= 0.01
kernel: usb 4-2: New USB device strings: Mfr=0, Product=0, SerialNumber=0
kernel: hid-generic 0003:03EB:2067.000E: hiddev3,hidraw4: USB HID v1.11 Device [HID 03eb:2067] on usb-0000:08:00.3-2/input0
 $ hid_bootloader_cli --mcu=atmega32u4 one_default.hex

念のためUSBケーブルを抜いて差し込み直し、カーネルメッセージ確認する。

kernel: usb 4-2: new full-speed USB device number 14 using xhci_hcd
kernel: usb 4-2: New USB device found, idVendor=feed, idProduct=0000, bcdDevice= 0.01
kernel: usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
kernel: usb 4-2: Product: one
kernel: usb 4-2: Manufacturer: osamuaoki
kernel: input: osamuaoki one as /devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2/4-2:1.0/0003:FEED:0000.0013/input/input45
kernel: hid-generic 0003:FEED:0000.0013: input,hidraw4: USB HID v1.11 Keyboard [osamuaoki one] on usb-0000:08:00.3-2/input0
kernel: input: osamuaoki one Mouse as /devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2/4-2:1.1/0003:FEED:0000.0014/input/input46
kernel: input: osamuaoki one System Control as /devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2/4-2:1.1/0003:FEED:0000.0014/input/input47
kernel: input: osamuaoki one Consumer Control as /devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2/4-2:1.1/0003:FEED:0000.0014/input/input48
kernel: hid-generic 0003:FEED:0000.0014: input,hidraw5: USB HID v1.11 Mouse [osamuaoki one] on usb-0000:08:00.3-2/input1
mtp-probe[160213]: checking bus 4, device 14: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2"
mtp-probe[160213]: bus: 4, device: 14 was not an MTP device
upowerd[1468]: treating change event as add on /sys/devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2
systemd-logind[939]: Watching system buttons on /dev/input/event23 (osamuaoki one System Control)
systemd-logind[939]: Watching system buttons on /dev/input/event24 (osamuaoki one Consumer Control)
systemd-logind[939]: Watching system buttons on /dev/input/event21 (osamuaoki one)
mtp-probe[160236]: checking bus 4, device 14: "/sys/devices/pci0000:00/0000:00:08.1/0000:08:00.3/usb4/4-2"
mtp-probe[160236]: bus: 4, device: 14 was not an MTP device

qmkでコンパイルしたファームウエアーが、qmk導入以前から使っているMCU側HIDブートローダーのnanoBootとLUFAのPCホスト側ブートローダーhid_bootloader_cli @ ~/.local/binで導入できました。

ちゃんと、ミュートボタンが機能しています。

FLASH(qmk)

ここまできたら、qmkでファームウエアーのコンパイルだけでなく、導入(FLASH)までしてみました。

今回は、qmkが導入したhid_bootloader_cli @ /usr/local/binが動いたようです。

 $ qmk flash -kb=one -km=default
Ψ Compiling keymap with gmake --jobs=1 one:default:flash


QMK Firmware 0.15.15
Making one with keymap default and target flash

avr-gcc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Size before:
   text	   data	    bss	    dec	    hex	filename
      0	  12512	      0	  12512	   30e0	.build/one_default.hex

Copying one_default.hex to qmk_firmware folder                                                      [OK]
Checking file size of one_default.hex                                                               [OK]
 * The firmware size is fine - 12512/28672 (43%, 16160 bytes free)
Drashna's HID Bootloader, Command Line, Version 2.2
Read ".build/one_default.hex": 12512 bytes, 38.8% usage
Waiting for HID Bootloader device...
 (hint: press the reset button)
Found HID Bootloader
Read ".build/one_default.hex": 12512 bytes, 38.8% usage
Programming..................................................................................................
Booting

確かにこの方が見やすい。いい感じです。

このあと、4つのスイッチを繋いだ別のfourというデバイスを作成、これもFLASHしました。

githubへのPUSH

これらは大した変更じゃないので、UPSTREAMマージのための作業はせず、バックアップを兼ねて自分のアカウントにフォークしたqmk_firmwareにPUSHしておきます。

 $ git remote add origin git@github.com:osamuaoki/qmk_firmware.git
 $ git push -u origin osamu1

さらに、56個のスイッチを繋いだコンパクトな形状の直行配列キーボードcgc56というデバイスを作成、これでとりあえずMCUをFLASHしました。 当分使いやすいように使いながら調整していきます。これも同じgithubにpushしておきます。意外と初期立ち上げは簡単でした。

これで、以下ができました。

実際何が起こっているのか?

コードを読む気のない人には、ややこしい部分を隠してくれていらぬ心配をさせない便利なqmkですが、ソフトの階層が増えると中身を読みたい時には逆に分かりにくいですね。

実はよく見たら最初に実行コマンドがかかれているのですが、見落としてしまいがちです。qmkは実行の際「-v」をつけるとさすがに見落とさなくなります。

 $ qmk flash -kb=one -km=default
Ψ Compiling keymap with gmake --jobs=1 one:default:flash


☐ Running command: ['gmake', '--jobs=1', 'one:default:flash']
QMK Firmware 0.15.15
...

ただ、これでもMakefileの起動コマンドは分かりますが、Makefileから実行されたコマンドが何かが確認できません。実は以下がMakefileの先頭にかかれているのがこの原因です。

ifndef VERBOSE
.SILENT:
endif
...

だからシェルから以下を実行すると、Makefileから実行されるコマンドが分かります。

$ make VERBOSE=1 --jobs=1 one:default:flash
Previous Post Top Next Post