LPC1114 USBブートローダー
前回ご紹介したLPC1114FN28/104のHID-SerialアダプターはLPC1114のリソースからして随分と勿体無い使い方でした。
この点を鑑み、今回の作例はリソースを十分に生かせるUSB直結のブートローダーです。
(mbed全盛の今、無謀な試みとも言える。)
2015.06.30 追記 ターゲットボードの回路図を更新し、基板を作り直しました。



----------------------------- 追記 ここまで
2015.07.01 追記
ブートローダーの動作確認には
"番外 LPC1114FN28/102 アセンブラサンプル"のページで紹介したHEXファイルが使用できます。
以下は上記ページに添付の"flash_dump.hex"を読み込ませ、3つのSWをOFFにした状態でリセット
SWを押し、プログラムを実行させた結果です。
これはアセンブラで作成したHEXファイルですが、もちろんCで作成したHEXファイルでもサイズの制約を満たせば、
問題なく作動します。

------------------------------ 追記 ここまで
2015.09.02 追記 以下の情報は間違いでしたので削除します。
RecepcionUSB:
push {lr}
nop
@ nop
@ nop
mov r1,r8
RecepcionUSB:
push {lr}
nop
nop
@ nop
mov r1,r8
RecepcionUSB:
push {lr}
nop
nop
nop
mov r1,r8

[1]ファームウエアのジェネリック化
従来紹介してきたUSBのファームウエアは全てHID仕様でした。
HID仕様ではWindows標準のデバイスドライバーが使用されるため使い勝手が良いのですが、
ホストからの定期的な問い合わせに応える必要があります。
今回のファームウエアではHIDの仕様をジェネリック(汎用)の仕様に変更しました。
[2]ファームウエアの仕様
①汎用デバイスの場合、別途デバイスドライバーが必要ですが、これには16FUSBで公開しているlibusbのドライバーを使用します。
②16FUSBのソースを参考にLPC1114のソースに手を加えて、HIDの選択・非選択が行えるようにしました。
③データはホストからのVendor Requestに載せて転送される。
④Vendor Request概要
ホストからの bmrequesttype = 01000000B を受信すると、続くbmrequestの内容(コマンド)により該当するIAPを操作します。
ホストから転送されるコマンドは4種類
E:セクター0からセクター6までを一括消去、ブートローダーのファームウエアが書きこまれるセクター7は消去しない。
W:ホストから転送された4バイトのデータをバッファーRAM(アドレス$10000200~$100005FF)に書き込む。
C:バッファーRAMの内容1024バイトをPage No.で指定したFlash領域に書き込む。
B:バッファーRAMの消去(0xFFを書き込む)。
⑤ホストの要求によりデバイスからホストへデータを返すことも出来ますが、今回は使用していません。

⑥ブートローダーモードとユーザープログラムモード
USBから給電できるのでUSBを繋いだままユーザープログラムを実行できるように工夫しました。
D-とプルアップ抵抗の間にスイッチ(Boot SW)を設け、ブートローダーを作動させる時のみBootSWをONにします。
書き込みが完了したら、USBプラグを抜かずにBootSWをOFFにします。
このときPCで認識していたUSBデバイスは無効となり、(認識が取り消される)USBケーブルは電源供給にのみ使用されます。
この状態でリセットSWを押すとユーザープログラムが起動します。
プログラムのフローチャートを以下に示します。
USBのD-とBootSWに繋がるPIO1_1の端子はBootSWをOFFにしてもデフォルトで内部プルアップされているので、いったんプルダウンしてからBootSWの状態を検出し、ブートローダーモードとユーザープログラムモードを切り替えます。

⑦各モードのメモリーマップ
ユーザープログラムモード(右側)
転送されたHEXファイルと同じコードが書き込まれるが、リセットベクター$00000004~$00000007のみ書き換える。
元のリセットベクターは$00006FFC~$00006FFFの領域に書き込まれる。
ユーザープログラムは$00000000~$00006FFBの範囲で作成しなければならない。
ユーザープログラムのRAMの使用と割り込みの使用に制約はない。
ブートローダーモード(左側)
ブートローダーモードではホストとの接続手順に入る前にRAMをROM領域にリマップする。
GPIO1割り込みを使用するのでリマップされたRAM上$000000B8~$000000BBに割り込みベクターを記述する。
※この手順によりユーザーはGPIO1割り込みを自由に使用できる。
USBとブートローダーの作業変数は$00000000~$0000009Fに配置、IAPで使用する作業領域もここに配置する。
ブートローダー本体は$00007000~$00007FFFに配置されブートローダーホストによりコード保護される。
※RAMをROM領域にリマップした状態でもFlashの消去・書き込みは正常に行える。

[3]ホストプログラム
VC++CLIでlibusbの使用例がないかネットで探したところ、非常に使い易いフレームワークを見つけました。
Joseph Chiu さんの作成されたWinFormLibUsbというプログラムです。
Joseph Chiu さんに感謝申し上げます。すばらしいプログラムをどうもありがとうございました。
http://libusb.6.n5.nabble.com/Accessing-LibUsb-Win32-with-Visual-C-and-WinForms-td10502.html
今回は16FUSBの16FUSB_dio_sample_application_win32-src-1.0のソースを参考にWinFormLibUsbを書き換えてホストプログラムを作成しました。

[4]書き込みの手順
①ターゲットボードのBootSWをオンにして、D-の信号線をプルアップする。
②USBコネクタを接続する。
③ホストプログラムを立ち上げる。
④左下のメッセージを確認する。
"\\.\libusb 0-0001-0x04d8-0x0628" 正常
"Device was not detected" 異常
⑤"Browse"ボタンを押して書き込みしたいHEXファイルを選択する。
⑥"File transfer"ボタンを押すと書き込みを開始する。書き込み中は右側に緑色のゲージが表示される。
[5]書き込んだプログラムをテストする。
⑥に続く、USBは抜かずに、
⑦ターゲットボードのBootSWをオフにする。
⑧ResetSWを押すと書き込んだプログラムが実行される。
⑨ユーザープログラムでGPIO1_0とGPIO1_1を使用する場合はそれぞれのショートピンを外し、USB
のデータ線から切り離す。
[6]ターゲットボードの回路図

本ページに記載のソフト一式は以下のページからダウンロードできます。
https://drive.google.com/file/d/15E0i_LeM6qlqwQaU73GmjclGMpqBKFZy/view?usp=sharing
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT