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通りあります。
COL --|<---___./.___ ROW(pull-up)
– read (#define DIODE_DIRECTION ROW2COL
)ROW --|<---___./.___ COL(pull up)
– read (#define DIODE_DIRECTION COL2ROW
)
つまり:
- ダイオードのアノード側(矢印の根元)がMCU入力側
- カソード側(矢印の先端)がMCU出力側
スイッチマトリクスが1次元で、スイッチの一方がGNDに繋がってる際:
GND -------___./.___ ROW(pull-up)
– read (#define DIODE_DIRECTION ROW2COL
)GND -------___./.___ COL(pull up)
– read (#define DIODE_DIRECTION COL2ROW
)
出力側は繋いでも良いが、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
中のBOOTLOADER
はqmk-hid
です。あと、直接の影響はないファイルをいくつか変更しました。
ファームウエアーのビルド
ファームウエアーを作成します。
$ qmk compile -km default -kb one
...
$ qmk cd
$ cd .build
うまくビルドし、one_default.hex
ができています。
FLASH(古いやり方)
私のシステムにLUFAのオリジナルのhid_bootloader_cli
が入っていたのでそれを使ってみます。
- USBでteensy2.0もどきをUSBミニケーブルで接続。(なにも入っていないので、LEDはつかない)
- RESET BUTTONを押す。(スイッチを離すとLEDが点灯しブートローダーが立ち上がる)
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
- LEDが消えたら書き込み終了。(どうもファームウエアーが立ち上がって、HIDデバイスで動作中。)
念のため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しました。
- D0-D3: Key Switches (反対端子はGND)
- F0: RGB (最初は動くまでソフト設定せず)
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しておきます。意外と初期立ち上げは簡単でした。
これで、以下ができました。
- https://github.com/osamuaoki/qmk_firmware/tree/osamu1/keyboards/one
- https://github.com/osamuaoki/qmk_firmware/tree/osamu1/keyboards/four
- https://github.com/osamuaoki/qmk_firmware/tree/osamu1/keyboards/cgc56
実際何が起こっているのか?
コードを読む気のない人には、ややこしい部分を隠してくれていらぬ心配をさせない便利な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 |