PIC HID Bootloader

last updata : 2016/02/11

新型 2KB版 HID Bootloader 【Microchip製 HID Bootloader互換】

雲

2012年の雲

阿蘇の山と雲の写真やまなみハイウェイから

マイクロチップ社製 HID Bootloader と XC8コンパイラ

マイクロチップの「 Microchipアプリケーション用ライブラリ(MLA)

MPLAB® IDEは、MPLAB® X IDEに完全にバトンタッチしてXC8コンパイラが幅を利かせております。 ユーザープログラムのHID Bootloader対応もXC8で十分できる様になりました。

mlaのHID Bootloaderのプログラムコードを読んでみると、一部機能が強化されているではありませんか。 追加しないと。

例によってfree版XC8では、純正ブートローダーのコンパイルする事もままならないです。 PRO版で何とかなるらしいので、60日制限版で試してみることは出来るでしょうけど… まっ何とかなるでしょ。

GOOD == 600D ?

追加されている機能は、ローダーのバージョン等の拡張情報呼び出しと、 正常に書き込んだと言うサインをユーザープログラム領域に書き込む機能です。

機能は大したことはなく2時間位で動作しました。 4KByteの互換版は…でも2KByteから237byteもオーバーしています。 ちょっとやそっとの修正では絶対2KByteには収まりません。 泣く泣く2.5KByteに変更しました。

小見出しの600D(ろくぜろぜろでい)は、サインとしてGOODとして書き込むそうです。 これにより、ユーザープログラム領域を消去しただけでブートローダーが起動できるようになります。 (書き込みエラーやエントリが不正なユーザープログラムが多少暴走しなくなります。)

ここまで前回の話

と 前回 様変わりしていたと伝えました。 HIDのXC8対応サンプルプログラムを作って見ましたが、今までのように直接MASMとくっ付けることは難しいと判断しました。

そこで、BIOS機能を廃止して縮小、まとめられる部分はまとめて2KB以内に収めることにしました。

またXC8コンパイラを使ってみて判ったのですが、C18に比べてローカルな記述が少なく割りと使いやすかったです。 という事でサンプルプログラムは、XC8専用に作ってみました。 他にMPLAB® X IDEの複数プロジェクト対応というのにも挑戦。まっそんなものかと…

ソフトウェア 3.12版 (2016/02/11)

Ver 3.10でEEPROMに書き込みしようとするとベリファイエラーになるバグがありました。 もしかすると昔からEEROMが読みだせなかったかもしれません。エラーにならないだけで…。 今回少しEEPROM周りを修正しています。

Bootloader.asm 不具合箇所

#ifdef DEVICE_WITH_EEPROM
        movlw   0xF0
        cpfseq  (mPKTToPC + Adr24)
        bra     Read_FlashROM ; <------ bra から bnz  に変更してください。
Read_EEPROM:
        movf    (mPKTToPC + Adr8), W
        movwf   EEADR
Read_EEPROM_Loop:
        movlw   b'00000001'

これだけ直せば、EEPROMを読み出してベリファイエラーにはなりません。 ただ、純正の処理に近づけるために少し変更を加えてあります。

Ver3.0から 開発環境をMPLAB® X IDEにしています。ただし言語はアセンブラ(MPASMWIN)であることは変わりません。

このプログラム自身のバージョンは、3.1xですが、 ブートローダーとしてパソコン側の書き込みプログラムと通信する場合は、互換をとって1.02と返しています。

今回、XC8コンパイラ専用としてPIC18Non_JのUSB PICに対応しました。

  • PIC18(L)F14K50, PIC18(L)F13K50
  • PIC18(L)F24K50, PIC18(L)F25K50, PIC18(L)F45K50
  • PIC18F2450, PIC18F2455, PIC18F2458
  • PIC18F2550, PIC18F2553
  • PIC18F4450, PIC18F4455, PIC18F4458
  • PIC18F4550, PIC18F4553

もしローダーとして上手く動作しないとかあったら連絡頂けるとありがたいです。

ダウンロード

PIC18Non_J用 (HID Bootloader 2KB版 Restart Address:0x0800)

bootloader-18Non_J_312.zip

選択

上記圧縮ファイルには、Hexファイルとソースファイルが入っています。

ソースファイルはMPLAB® X IDEの環境ごと入れてありますので、[BOOT_18xxxxx]を選んでビルドしてください。 (右の図を参照)

下記の「使い方」で使えるサンプルも入れてあります。

各機能に付いて

  • ブートローダースイッチ
  • 初期設定のブートローダースイッチは、MCLRピンに設定し使用できるようにしています。 純正も他のピン変更はほぼ不可なので、それに習い変更不可にしてあります。 ただし、純正もユーザープログラムからブートローダーに移行する機能が出来ました。

    旧のブートローダーに移行する機能は、廃止しました。

  • LED
  • 2個使いから1個に変更しています。 多少でも小さくなるようにです。

    初期設定のLEDは、使用しないにしてあります。 各ボード毎にLEDの配置が違うので、修正してビルドすれば使えるようになります。 (PIC毎に分けていないから使い難いかも。)

  • Bios
  • この機能は、Ver3.10より廃止しました。

ホストプログラム

作っていません。 何故ならば、マイクロチップ社製と互換があるのでそっちダウンロードしてね。 「 Microchipアプリケーション用ライブラリ(MLA)」此処です。

[bootloders]-[utilities]-[bin]-[win] に"HIDBootloader.exe"があります。

重要. Ver2.9j 以降を使用すること。それ以前を使用すると新しい機能が使えないだけではなく、ユーザープログラムが起動しません。。

ベンダーID/プロダクトIDに付いて

このブートローダーに使っているベンダーID/プロダクトIDは、マイクロチップ社のHID Bootloaderと同じです。

動作や機能が同じなので、個人的や社内でテスト的に使う分には問題はでないと思います。が、 2KB版 HID Bootloader を製品(プログラム用開発ボード等含む)に組み込んで販売する事はできません。

ただ、同じベンダーID/プロダクトIDを使って別なPICブートローダーを公開している企業も有るようです。 何処まで良いのか日本マイクロチップに少し問い合わせしてみましたが回答は無かったです。(2013/6/12)

上記の様に販売したい場合は、開発または販売元でベンダーID/プロダクトIDを取得してプログラムを変更してください。 また組み込んだ事に依るデータ喪失や機器損傷等の損害等の保証は一切受けられません。

回路図

サンプル回路図

テストに使っているブートローダーの回路図を載せておきます。

使い方

作成したブートローダのHEXファイル単体をpickit3等のライタで書き込むことでHIDブートローダーの使用が可能になります。

ただし実際のプログラムにXC8を使う場合 HEXファイルを同時に付加する必要があるので下記のサンプルを参照してください。

サンプルプログラム 2016/03/12

USBのプラグアンドプレイ部分にバグがあり特定の条件で接続までに時間がかかっていました。 それを修正しています

HID sample (HID Bootloader 2KB版 Restart Address:0x0800)

HID_sample120.zip

開発環境も含んでいますので下記の作業は要らないのですが、新しく作る場合は必ずいる作業になります。

PICのブートローダーを使うユーザープログラムをXC8で作成するには、

Codeoffset ROM Ranges

上の図のように、リンカを設定します。

Codeoffset : 0x800

ROM ranges : default,-0-7FF,-806-807,-816-817

となります。

後は、普通にプログラムするだけでブートローダに対応できてしまいます。 ブートローダで書き込みましょう。パチパチ…ちゃんと動きます。

ぇっ あれ?

でも落とし穴が…

Codeoffsetによりプログラム本体が移動しただけですので、 本当のリセットアドレス0x0000には、何も書かれていないためPICkit2等でのスタンドアロン書き込みに対応できません。

対処方法は、MPLAB® X IDEの[projects]-[Loadable]にブートローダーのHexファイルを登録してビルドすると各プログラムを連結(マージ)してくれます。 Configuration Word は、ブートローダーとユーザープログラムを一致させておく必要があります。

MPLAB® X IDEは、[window]-[PIC Memory View]-[Configuration Bits]を使って簡単にコンフィグのコード生成が出来ます。 その為、コンフィグが不一致になってエラーになりやすいです。(やってしまった)

C18に比べ簡単。でも今回XC8の吐き出すアセンブラコードを色々見ることとなりかなり幻滅。やっぱりPRO版欲しいかも。

で、本当の落とし穴。ROM ranges で -A16-A17を除外しているけど、実際free版XC8ではlinkerの指示を無視して割り込みコードが書かれています。(と言うより割り込み関数が、再配置不可のコードをコンパイラが吐き出しているのでしょう。)

ブートローダーでは、A16-A17にアプリケーションバージョンが有るとして読み出しているのだけど?まっ使ってない様だけど。

上記については、High/Low両割り込みを使えば旨くいくみたい。Highだけだとダメだった。

使い方 (複数プロジェクト)

サンプルプログラム 2016/03/12

上記サンプル同様で修正してあります。

Complexed HID sample (HID Bootloader 2KB版 Restart Address:0x0800)

Complexed320.zip

複数のプロジェクトを扱う方法です。 簡単に言うとHIDBootloader とHID sampleを同時にアセンブルとコンパイルが行えるようにしたものです。 ついでにAE-PIC18F14K50も扱えるようにしています。

include directories

Codeoffset

ヘッダファイル(.h)が複数のフォルダに分かれている時、ここにそのフォルダ名を記載するとうまくいきます。 直接 #include にフォルダ名付きで書いてもOKですが、こちらの方が使い勝手が良いです。

PC側 プログラム

HID コンソール プログラム (Visual Studio Community 2015 / Visual C++にて作成)

HIDConsole_1502.zip

Codeoffset

コンソールプログラムとソース ファイルを同封しています。 Visual Studio Community 2015 に開発環境を移しました。 ソースファイルは、変更有りません。

setupapi.h - 2015/11/29 誤記修正 -

WindowsでHIDにてデータを受け渡すには、<setupapi.h>をインクルードして、setupapi.libを登録します。

ここら辺までは、"Device - HID - Custom Demos"を見れば判るのですが…。 WriteFlie/ReadFileのハンドル取得までが大変。 一応複数同一ベンダーID/プロダクトIDが有ってもハンドル取得可能なようですが試してません。 (Ver1.5で複数同一ベンダーID/プロダクトIDを取得可能にしてみましたがテストしてません。)

もう少しHIDに深く入り込みたいならhid.libを登録して"hidsdi.h"をインクルードしてって思いますが、 SDKを探して来ないと行けないし今回は殆ど使うことないから止めました。

バッファサイズは65byte

HIDは、固定バイトのデータの受け渡しをします。 その為の約束事をデバイスが"HID Report Descriptor"を送って決めています。 ブートローダーでは、一回のレポートを送るのに64byteと決めています。 5byteでも200byteでも構わないのですが、エンドポイントと同じサイズの64byteが都合がよいのでしょう。

"HID Report Descriptor"の情報からWriteFlie/ReadFileのバッファサイズが決まるようです。 64byteでは無くて1byte付加されて65byteです。 1byte目に0x00を入れて残りがデータバッファです。

"hidpi.h"にあるHidP_GetCaps関数を使うとバッファサイズ(65byte)とが取れるらしいのですが試していません。 製造者名とか製品名も取り出したくなると思うので、hid.libを登録して試してみるかもしれません。 (Ver1.5でHidP_GetCaps関数を取得するようにしました。8Byteでも32Byteでも多分対応できてると思います。)

1mS間隔で読み出し?

データはインターラプト転送なので、1mS間隔毎に受信/送信されています。 受信はReadFileで行ないますが、同期処理なら有効なデータが来るまで待ってしまいます。 その間アプリケーションは何もできず止まった状態になります。

今回は、別スレッドにしてアプリケーション自体は止まらない状態にしています。 ただ別スレッドでも止まった状態なので、終了時には空のデータをWriteFlieにて送ってエコーバックを貰って終了します。 (Ver1.5でReadFileの非同期処理に完全対応しました。のでエコーバック処理は不要になりました。)

他の方法として、ReadFileの非同期処理があります。 有効なデータが無ければすぐ戻ってくるので1mS毎に確認しに行くと言う手も有るかもしれません。 (Ver1.5でReadFileの非同期処理に完全対応しました。)

Ver1.5で、受信を同期処理/非同期の両方を扱えるようにしました。 完全な1送信対1受信処理を行なうときだけ同期処理に、それ以外は非同期処理に出来ます。

PIC16F145x

この、PICにもUSBが付いていて今回は純正のブートローダーが出来ています。 前に少し試した事があるのですが、製造ロットによっては大きなバグがあるのでローダーを作るのを見送っていました。

やはり、純正もPIC16F145xのリビジョンID "A5" 以降 対応ですか。 ブートーローダーの仕様上、仕方がないかもしれません。

と言うことで、一応検討してみることにします。

免 責

情報は出来るだけ正確に書くつもりです。ただこの記事を見て作ると思ったときは、 個人の責任において作業を行なってください。 データの喪失や機器の損傷が有っても、一切の責任は取れません。