前回に続いて、USB 単体で書き込みができるようになる USB HID ブートローダーの導入をします。
USB ペリフェラルを搭載した PIC マイコンは、最近の32bitマイコンのように、デフォルトで ROM 以外の領域に USB ブートローダーが存在し、使用できるということを想像していました。
まあこの時代のマイコンはそんなことないですね。同世代(?)のマイコンである AVR の ATmega16U2 でもブートローダーは任意に書き換え可能でした。PIC も同様に、ROM 上にブートローダープログラムをユーザーが書き込んで利用します。この PIC が AVR と異なるのは、
- PIC のシステムとしてブートローダー領域が設定されていない
- AVR では特定の条件を満たすと、起動時にブートローダー領域にジャンプしてくれる
- PIC は通常のユーザープログラムの一部としてブートローダーが動作する
- PIC にはそもそもデフォルトのブートローダープログラムが書き込まれていない
- AVR ではデフォルトで存在するが...
といったところでしょうか。それで、僕はやっぱりよほど使えないというような事がない限りは純正の物を使いたい派なので、公式の HID ブートローダー なるものを入れてみることにしました。これが手順が多くて面倒なので、今回の記事はこれについて備忘録です。
ダウンロード・インストール
まずはダウンロードとインストール。Microchip から MLA(Microchip Libraries for Applications) なるライブラリ一式が手に入るらしいので、こちらからダウンロード&インストール。途中ウィザードで何をインストールするか尋ねられますが、大した容量ではなさそうなので全て入れてしまいました。デフォルトのパスだと ~/microchip/mla
にインストールされます。
ビルド
ブートローダーはデフォルトでコンパイルされておらず、自前でビルドをしてあげる必要があります。
まず、MPLAB X にインポート。結構階層が深くて探すのが大変でした(小並感)。
apps/usb/device/bootloaders/firmware/pic18_non_j
そしたら IDE 左のプロジェクトペインから忘れずに main project として設定し、ビルドします。取り敢えずこれで準備完了...と思うじゃん??はい、ビルドが完了しません。以下対処法です。
コンパイラツールチェインの選択を確認
デフォルトでは、このブートローダープロジェクトの設定が皆さんお使いの環境とあっていないので、XC8 ツールチェインの設定をする必要があります。
プロジェクトのプロパティを選び、Conf から XC8 の該当バージョンを選択します。
そして、コンパイラオプションの言語を C90 にします。C99 にしたい感じはありますが、こうすると #asm
プリプロセッサディレクティブが通らなくなるので、仕方なしです。
Fuse Bitsの設定
ブートローダー側の Fuse 設定です。これがいかなるユーザープログラムでも適用されます。なので自前で設定したものをそのままブートローダープロジェクト中の main.c にある C O N F I G U R A T I O N
と書かれたセクションにペーストします。その前に、当該部分の ifdef 部分を全削除すると良いかも。
無料版だとプログラムサイズがオーバーする
これが一番深刻な問題です。通常の無料版ではコードの最適化に制限がかけられており、そのせいでブートローダーが設定されているサイズをオーバーしてしまいます。これではエラーが発生し、リンクが成功しません。
色々解決法はあると思いますが、XC8 ツールチェインをインストールし直して、有料版(PRO 版)のお試しをするのが一番だと思います。お試しの 90 日間は最適化制限がありませんし、いくらでもコンパイル可能です。今回は小賢しい手ですが、こちらの方法で解決しました。
ビルドが成功したら、適当な書き込み器(僕は MPLAB Snap) で書き込んであげてください。ブートローダー起動後には RD0 ピンが起動のインジケータになります。ここに LED をつないで、高速点滅していれば USB HID ブートローダーの起動が成功しています!
また、RB4 が起動モード選択端子になっていますので、こちらにスイッチをつなぐといいのでは、と思います。具体的には、High にするとユーザープログラムが起動し、Low にするとブートローダーが起動します。
ブートローダーに対応したプロジェクトを作る
ではこのブートローダーに対応したプロジェクトを作りましょう。ユーザーコードの開始アドレスがブートローダー分だけズレていますので、その設定が必要です。とは言っても簡単。
- 普通にプロジェクトを作る
- プロジェクトのプロパティを開き、以下のように設定する(全て XC8 Liner 内での設定)
- Memory model の ROM ranges を default,-0-FFF,-1006-1007,-1016-1017 に
- Additinal options の Codeoffset を 0x1000 に
これだけです。また、Fuse Bits はブートローダーで設定済みなので、プロジェクトごとに値を書き込むヘッダを用意する必要はありません。まあ用意しないと警告が出るでしょうがね。
書き込みソフトの準備
MpHidFlash というものを使えばコマンドラインでできます。ちなみに先程インストールした MLA にも GUI の書き込みツールが入っていますが、何故か起動できません。これだから GUI は...
ここからクローン。バイナリが入っているのでそのまま使えます。
書き込みは簡単。hex ファイルを指定します。こんなふうに。
$ mphidflash -w hoge.hex -r
-w
は書き込み、-r
はリセットを掛けるオプションです。ブートローダー起動後に RB4 を High にしたあとにこのコマンドを実行すると、書き込み直後からユーザープログラムが起動していいですね〜〜〜
〆
ということで、書き込み環境の整備でした。
次回は USB ペリフェラルのハマりどころを説明したいと思います。Ping-Pong バッファについては触れません。悪しからず。