【Vial】STM32F103用ブートローダーviblの改造【自作キーボード】

最近自作キーボード界隈では流行りのVialですが、STM32F103での対応はやや面倒な話を以前に書きました。

普通にSTM32F303のようなUSBのDFUを持っている場合の対応は以下の記事で書きました。

という感じで、STM32F103でVial対応をしようと思うと

  1. 他マイコンと同じようにVial対応をする。
  2. STM32F103専用に設定、ファイルを追加する。
  3. 専用ブートローダーviblを用意する
  4. viblを書き込みの上、Vialに接続してファームウェア(.vfw)を書き込む

という手順になり、他のマイコンに比べて手順が多いことがわかります。尤も、ちゃんと設定を行えばブートローダーなしでも起動するとは思います。純正のDFUでも動くようにアドレスを適切に指定する必要はありますがね。ただ、推奨手順になっているviblブートローダーを使うとこういう手順になっていしまいます(なぜかSTM32Duinoブートローダーを設定すると起動しない)。

ユーザー目線で考えても純正DFUの起動からにしてしまうと、万一プログラムをしくじると、純正DFU→SWDでプログラムを書く必要があり非常に面倒なので、何かしらUSBのブートローダーを入れるべきだと個人的にも思います。もし使わないとすれば機能満載にして、ROM容量が足りずブートローダーのフットプリント分のサイズを削りたいときや、少しでも起動を早くしたいときぐらいかと思います。

なので、Vialを使う際は基本的にviblブートローダーを書き込むことが良いということになるのですが、viblブートローダーには気になる点があります。viblブートローダーのGithubはこちらです。

viblブートローダーはHIDブートローダーというものをベースに改良されたもので、よく用いられるSTM32Duinoブートローダーに比べてフットプリントのサイズが半分であるという特徴があります。STM32Duinoが8KBなので、HIDの方は4KBですね。少しでも容量を稼ぎたいVialにはちょうど良いです。

このHIDブートローダーにはない機能がviblブートローダーには加えられているわけですが、それは緊急ブートモードです。緊急ブートモードは、Vialを通じて書き込んだ.vfwファイルに不具合などがあり異常な挙動を示す場合に、強制的に別の.vfwを書けるようにするモードです。ブートローダーのふるまいとしては、「緊急ブートモードへのトリガー」があれば、キーボードのアプリ領域にジャンプせずブートローダにとどまり続けるという動作をします。

この緊急モードへのトリガーについて不満というか実装が足りていないように感じる部分があります。

緊急ブートモードへのトリガーというのは、キーボードマトリクス回路のうちどの部分が押されているかになっています。実装を見ていただくとわかるのですが、ダイオードを使ったマトリクス回路に限定されています。

全てのキーボードが必ずしも配列を利用しているわけではありません。QMKでのピン判定はマトリクス以外にGPIO直結のものもあります。キー数が少ないキーボードではGPIO直結の方が回路も簡単で理にかなっています。

私の作るキーボードではGPIO直結のものがあるのですが、これだと緊急ブートローダーモードにすることができません。すでに作っているボードを対応するとなると、回路側を変更できないのでソフト側で対応するしかありません。

この部分の不満を解消するべく改造したブートローダーを作りました。コードは以下においています。

-GitHub-
https://github.com/T-H-Un/vibl

差分を見ればやっていることはなんとなくわかるかと思いますが、シングルピンであった場合でも緊急ブートモードに入れるように機能を実装しています。具体的には、あるGPIOがLOWになっているときに緊急ブートモードに入れるように実装しています。

viblで通常しないといけない設定は同様に設定する必要がありますが、config.hに追記をします。そのサンプルが以下。

#elif defined(TARGET_SINGLEPIN)
#define VIAL_KEYBOARD_UID {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
/* setup for judging single-pin */
#define BOOTLOADER_USE_SINGLE_PIN 1
#define BOOTLOADER_PIN_BANK GPIOB
#define BOOTLOADER_PIN_NUMBER 12

CmakeLists.txtにはadd_bootloader(singlepin)と設定したとします。するとこの部分がelifで有効になります。

UIDについては同じ設定をしてください。

BOOTLOADER_USE_SINGLE_PIN 1を定義することで今回追加した機能を有効にします。defineを1でなくtrueにすればいいものを色々やっているうちに1と定義したままコミットしてしまったのですが、実用上問題ないのでこのままにしています…

#define BOOTLOADER_PIN_BANK GPIOB
#define BOOTLOADER_PIN_NUMBER 12

これはdefine値をを意図的に寄せないようこのようにしました。PB12ピンのときは上記のように設定します。PA4ならGPIOAと4でdefineすれば大丈夫です。

この設定をすればあとはviblの通常の手順と同じ方法でビルドします。これを書き込んで、指定GPIOをLOWになるようにすれば緊急ブートモードに入れるはずです。

これでGPIOに直接使うキーボードでも緊急ブートモードに入ることができるようになりました。表に出ていないキーでも裏面に緊急ブートモード用のスイッチをつけるようなやり方もできるので、実装の幅も広がります。

困っている方は小数だと思いますが、STM32F103は安価で構成なマイコンなので色々してみたい方の助けになればと思います。

以上です。お読みいただきありがとうございました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です