hidmon-14kの使い方

HIDmon-14K50

ReadMe.txtより抜粋


 -------------------------------------------------------------------
             PIC 18F14K50  用 HID bootloader / HIDmon
 -------------------------------------------------------------------

■ 概要

  これはdiolanが提供しているPIC 18F4455用のHIDブートローダーを元にして
  作成した HID bootloader 兼 HID monitorです。

■ 何に使うのですか?

  MicroChipが提供しているFirmware-Bと呼ばれるブートローダーの代替に使えます。
  ブートローダーとは:
  18F2550/4550/14K50 シリーズのPICは、USBでパソコンと簡単に接続できるので、
  最初にブートローダーを焼いておくことによって、毎回PICライターを使用
  することなく、USB経由でプログラムを転送、実行出来、手軽にPICプログラム
  の開発が出来ます。
  それだけではなく、AVRでお馴染みの HIDmon の機能も併せ持っています。

■ 用意するハードウェアは?

    PIC 18F14K50   ( 秋月電子通商にて 1個 200円 で販売されています )
    制作する場合の必要最小限の外付け部品は、
(1)  RC0,RC1 にLEDを接続。 LED は電流制限抵抗1kΩ程度を直列に繋いで、片側(-)はGND接続とします.
(2)  RC2 は10kΩ程度でPULL-UPして、手動の押しボタンスイッチを押している間だけ GNDに接地する
     ように配線します。
(3)  RESETスイッチをMCLR端子とGND間に用意します。
その他必要な配線.
	 水晶 12MHz  
	 水晶用の負荷コンデンサ2個(15pF程度? 無くてもとりあえず発振はします) 
    USBコネクタ(D+ D-) 
    他電源まわりの配線、
	 パスコン(5V-GND間は0.1uF積層セラミック+10uF電解,Uvsb-GND間は0.1uF積層)
    などが必要となります。

■ ブートローダーとして使えますか?

  ●一応使えます。
  ・外部のPICライターを用意して、hexfiles/bootloader-0000.hex を焼きます。
  ・USB側に繋ぐと、RC0に接続されたLEDが点滅を始めればOKです。
   host/picmon.exe   : HIDmon の PICバージョンです。
   host/picboot.exe  : ブートローダーです。 HEXファイルを書き込みできます。
   が動作することを確認します。
  ●基本的な使い方.
  C:> picboot myfile.hex
  myfile.hex をFlashに書き込みます。
  C:> picboot -r
  Flashに書き込まれている0x800番地から実行可能なプログラムを起動します。
  C:> picboot -r myfile.hex
  myfile.hex をFlashに書き込んで、実行します。(上記の2つの動作を一度に行います)
  C:> picboot -rp a.hex
  現在書き込まれているFlashの内容を HEXFILE形式で 'a.hex' に出力します。
  C:> picboot -E
  Flashの内容を全消去します。(通常の書き込みでは、書き込みに必要な部分のみ消去します)
  ● オプションの説明
  ・'-s'オプションについて.
      picboot -s1000 USBDevice-CDC-BasicDemo-C18-LowPinCountUSBDevelopmentKit.hex
    '-s' に続けて16進数で開始アドレスを指定すると、0x800番地スタートでないアプリケーション
  についてもブート可能な形で書き込み出来ます。(0x800番地にjmpテーブルが書き込まれます)
  ・'-B'オプションについて.
    '-B' オプションはブートプログラム領域に対する読み書きを許可するオプションです。

  これをうまく使うことで、0x800番地に書かれたブートローダーから、0x0000番地のブートローダー   の更新を行うことが出来ます。

■ picbootの使い方に関する注意

  ・ブートローダーとして機能させる場合はRC2端子に接続されたスイッチを押してRC2=Lowレベル
    にした状態から通電、あるいはリセットを行ってください。
  ・そうでない場合は0x800番地のアプリケーションが起動するようになっています。
  ・アプリケーションが書き込まれていない状態(最初にブートローダーを書き込んだ直後)では
    RC2端子状態にかかわらずブートローダーが起動するようになっています。
    (0x800番地に、ブートローダーに戻るjumpコードが書き込まれています)

■ テスト版(0x0800オリジン)の使い方を教えてください。

  ・このブートローダーを使って、新しいバージョンもしくは新機能を追加したローダー
    を開発する場合に使用します。

■ 再ビルドの方法は?

  ・MicroChipの MPLab(MPASMWIN) をインストールして、MPASMWIN.EXEの実行パスを
   通しておいてください。
  ・make を実行します。 make.exe はWinAVRなどで使用している一般的なGNU make 
    が使えます。
  ・GNUPICツールの gpasm を使用することも検討しましたが、gpasmの致命的なバグ
    により、どうあがいても正しいHIDディスクリプタが生成出来ないようですので
    お勧めはいたしません。
    ( gpasm のバグが修正されれば再検討します )
  ● ホスト側ツールは MinGW gcc を使ってビルドしてください。
     -mno-cygwin オプションを付けることで、 Cywin gcc でもコンパイルできる
     はずですが、テストはしていません。

■ オリジナル版bootloaderからの変更点

  ・ PIC18F14K50 に対応しました。
  ・ 他のブートローダーから起動できるようにオリジンを変えられるようにしました。
  ・ 暗号処理は容量の都合で削除しました。
  ・ XINST (PIC18F2550などで追加された拡張命令) を使用しないようにしています。
     具体的には addfsr と subfsr 命令です。
  ・ HID Reportの転送方法を全て Control 転送で行うように変更しています。

■ 注意事項

  ・ このブートローダーは XINST=ON / OFF のどちらでも動作しますが、ブートローダー
     から起動するプログラムは、その書き方によりどちらかを仮定していることが殆ど
     です。
  ・ 特に、sdccでコンパイルされたプログラムはXINST=OFFでないと動作しません。
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  ・ 焼く場合に XINST のモードをよく確認してください。
     変更する場合は、 fuse.h の XINST= の項目を編集して再ビルドしてください。
  ・ 添付しているhexfiles は XINST=OFF で作成しました。

■ 他に使い道はないのですか?

  ● 以下のような用途を考えています。

  ・PIC 18F2550 を使用した、最小構成のHID-USBフレームワークとして。

    HIDではデバイスドライバーを書いたり、インストールする必要がありません。
    Win32APIを使用して、HIDコントロール転送を自由に使用できます。

■ 問題点

  ・現状のソースの書き方がフルアセンブラ風味なので、C言語と比べてメンテナンス性に    問題があります。

  ・たとえば、BSR(バンクセレクトレジスタ)がデフォルト値(現在は4)である前提で    コーディングされているので、C言語から呼ぶエントリーを設けるとすると    それらの先頭にmovlb 4 を付加する必要があります。

    --> 2009-0507: biosコールのエントリーに付いては対策済みです.

  ・FSR を使いまくっているため、同レジスタをスタックポインタとして使うsdccと競合します。

    --> 2009-0506: FSR1 を使わないよう改造しました。
    --> 2009-0507: FSR2 も保存する必要性を発見しました。FSR2はスタックフレームレジスタ
        になっていて、上位が 0x01 固定です。 (FSR1も同じ)
        sdccではスタックエリアは 0x100 〜 0x1ff となっているようです。(まるでmcs6502! )
        現状では FSR2 が破壊される問題が残ったままです。

  ・AccessAreaのRAM(0番地〜0x5f番地)の使用に関してもCとasmで競合が発生します。

    --> 2009-0507: 0x0000 〜 0x01ff を全く使わないように bootloaderを書き換えました。

■ どうしてC言語を使わないのですか?

  ・diolan社に聞いてください。

  ・C言語で2kBに収まるHID bootloaderを書くのは至難の業なのかもしれません。

    MicroChipのHID bootloaderは4kBもあります。

  ・試しにC言語でコーディングしてみるとすぐ分かります。

    asm リストを見ると笑っちゃうようなコードが吐かれていますが、誰にもどうする
    こともできません。 
    たぶん gcc を移植しても PIC18Fのアーキテクチャーの前には全てが徒労に終わるでしょう。
    唯一の解決策は、全部手でコーディングすることです。TK-80の時代に戻りましょう。

■ ライセンスは?

  ・GPL (GNU Public License v3)だそうです。

■ PIC BIOS 内蔵です。

   bootloader のエリア 0x000c 〜 0x0018 にJump Table を設けて、BIOSの一部機能
   をアプリケーションから呼び出せるようにしています。
   
   サンプルソースは hidmon/test/ 以下にあります。
   テストする場合は、g.bat を起動してください。
   
   機能としては、
	・1文字 bios_putc(char c)
   ・文字列 bios_puts(char *s) 
	・bootloaderに戻る bios_exit()
	があります。
	
	サンプルでは
	Hello World を16回表示したのち、bootloader に制御を戻すようになっています。
	
	Hello World の表示中(sdccで書かれたアプリ動作中)でもESCか^Cキーを押すとモニタ
	の機能が使えるようになっています。
	
	print 表示機能に戻す場合は 引数なしの "run" コマンドを実行してください。
	
  ・BIOSエントリー(仮)

;----------------------------------------------------------------------------- ; 0x000c 〜 0x0018: 6 Entries.

	bra		bootloader_loop	; ブートローダー側のメインループ処理.
	bra		bios_task  ; main_loop のようなところで毎回呼ぶ。USBステートマシン.
	bra		bios_puts  ; 未実装.  test/bios.c 内に代用実装済み.
	bra		bios_getc  ; 1文字を入力. 戻り値は WREG . キー入力が空なら 0を返す.
	bra		bios_putc  ; 1文字を表示. 引数仕様は WREG = ascii コード.
	bra		bios_setmode ; 文字列取得モードの変更.WREG = mode (0xc0がデフォルト)
                        ; アプリを terminateしたいときは先に mode = 0xc9 を与える.
						 ; そうするとhost側(picmon.exe)が "* Terminate"文字列を出す.

;-----------------------------------------------------------------------------

■ オプションの切り替え方法

(1) Makefile:

   VECTOR=0000
   #VECTOR=0800
   #VECTOR=1000
   上記 VECTOR = の定義 を差し替えれば、0番地オリジン,800番地オリジンの切り替えが
   可能です。書き換えた後、make cleanしてから makeしてください。
   VECTOR=0800 を選んだ場合は0x800番地オリジンになり、他のブートローダーもしくは
   このブートローダーを使用してデバッグできます。

# --------------------------------------------------------