PIC18F4550と18F2550用HIDBootloaderの改造
今夜は、USBコントローラ内蔵のPICマイコン用HIDブートローダーのお話
以上で、幸せ!?なPICアプリ開発環境の完成です(笑)
USB経由でアプリを書き換えられるという便利なファームウェアがMicrochip社からソースコード付きで公開されているのですが、純正評価ボード用なので、オリジナルボードで使うには手を入れる必要が出てきます。
以下の内容は、18F4550と18F2550でしか確認していませんので、それ以外のチップの場合は参考レベルとしてください。
ブートローダーは、以前にも紹介したMicrochip社提供のライブラリ集(microchip-application-libraries)に含まれています。
PICマイコンに書き込むファームウェアのソースコード一式は以下のパスにインストールされます。
C:\Microchip Solutions v2012-02-15\USB\Device - Bootloaders\HID\Firmware - PIC18 Non-J
C:\Microchip Solutions v2012-02-15\USB\Device - Bootloaders\HID\Firmware - PIC18 Non-J
1.問題となるのは、18F4550用評価ボード(PICDEM FS USB Demo Board)にはLEDが搭載されており、ブートローダーがこのLEDを点灯させる記述がある事です。 もし、自作基板においてこのLEDポートに信号を入力していた場合、衝突によって最悪は故障してしまいますので、回避できる様に改版が必要です。
ファームウェア改版1 io_cfg.h
'LED_NOT_USED' 定義でLED出力可否を切り替えできる様に改版します。
#define LED_NOT_USED // Avoid a collision of an output port.
ファームウェア改版2 BootPIC18NonJ.c
mintAllLEDs()にてポートをLED用に出力モードに初期化しているので、スルーさせます。
void UserInit(void)
{
//change! see io_cfg.h 
#if !defined(LED_NOT_USED)
    mInitAllLEDs();  //Init them off.
#endif
ファームウェア改版3 main.c
BlinkUSBStatus()でLEDを点灯させています。ポートが出力モードになっていないので、信号の衝突は発生しませんが、無駄な処理なのでスルーさせます。
//change! see io_cfg.h
#if !defined(LED_NOT_USED)
  BlinkUSBStatus();
#endif
以上で、問題点は回避されているはずです。 見逃していたら御免なさい m(--)m
2.次に問題となるのは、折角改版したファームウェアが無償版コンパイラだと、ROM容量オーバーだと怒られてビルドに成功しない事です。
これもあれやこれやで解決したので、ご紹介しておきます。
根本的な問題は、正規版コンパイラを買うお金が無い事なんでしょうが、ホビー用に10万円近くするコンパイラを買える訳が無いデスヨネ!
ファームウェア改版4 BootModified.18f4550_g.lkr
ファームウェア用に確保するROM容量を拡げてしまえ!作戦です。
リンカースクリプトのアドレス定義をずらします。 ほんとは数10Hで良いのですが、キリの良い100Hとしています。
  CODEPAGE   NAME=vectors    START=0x0               END=0x1F           PROTECTED
  CODEPAGE   NAME=BootPage   START=0x20              END=0x10FF
#IFDEF _DEBUGCODESTART
  CODEPAGE   NAME=page       START=0x1100            END=_CODEEND     PROTECTED
  CODEPAGE   NAME=debug      START=_DEBUGCODESTART   END=_CEND        PROTECTED
#ELSE
  CODEPAGE   NAME=page       START=0x1100            END=0x7FFF       PROTECTED
#FI
ファームウェア改版5 BootPIC18NonJ.c
ファームウェアが増えた分、USB経由で受信したアプリの書き込み場所も100Hずらさねばなりません。
//Section defining the address range to erase for the erase device command, along with the valid programming range to be reported by the QUERY_DEVICE command.
#define ProgramMemStart     0x001100 //Beginning of application program memory (not occupied by bootloader).  **THIS VALUE MUST BE ALIGNED WITH 64 BYTE BLOCK BOUNDRY** Also, in order to work correctly, make sure the StartPageToErase is set to erase this section.
#if defined(__18F4550)||defined(__18F2550)
 #define StartPageToErase   68 //The 4096 byte section from 0x000-0xFFF contains the bootloader and will not be erased
ファームウェア改版6 main.c
書き込んだアプリのベクタアドレス、スタートアドレスもずれますから一致させます。
/** V E C T O R  R E M A P P I N G *******************************************/
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
    _asm goto 0x1108 _endasm
}
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
    _asm goto 0x1118 _endasm
}
    //Check Bootload Mode Entry Condition
 if(sw2 == 1) //This example uses the sw2 I/O pin to determine if the device should enter the bootloader, or the main application code
 {
        ADCON1 = 0x07;  //Restore "reset value" of the ADCON1 register
  _asm goto 0x1100   //If the user is not trying to enter the bootloader, go straight to the main application remapped "reset" vector.
  _endasm
 }
以上で、ファームウェア側の改版は完了です。無償版コンパイラでも無事にビルドに成功して、HEXファイルが生成されます。 ビルド時はオプティマイズオプションをALLにしておきます。
後は、このHEXファイルをPICマイコンに書き込んでおけば(ライター要)、以降のアプリの書き込みや書き換えはUSBケーブルでOK!
後は、このHEXファイルをPICマイコンに書き込んでおけば(ライター要)、以降のアプリの書き込みや書き換えはUSBケーブルでOK!
勿論、アプリ側もこのブートローダーがPIC内に存在している事を前提としてビルドしないと動作しませんので、説明しておきます。
アプリ main.c
下記の様なオマジナイを入れておきます。
/** VECTOR REMAPPING ***********************************************/
 #if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)
  #define REMAPPED_RESET_VECTOR_ADDRESS   0x1100
  #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x1108
  #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x1118 
  extern void _startup (void);        // See c018i.c in your C18 compiler dir
  #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
  void _reset (void)
  {
      _asm goto _startup _endasm
  }
 #endif
アプリ rm18f4550.lkr
リンカースクリプトのアドレス定義も一致させる。
CODEPAGE   NAME=bootloader START=0x0              END=0x10FF         PROTECTED
CODEPAGE   NAME=vectors    START=0x1100    END=0x1129         PROTECTED
CODEPAGE   NAME=page       START=0x112A          END=0x7FFF
以上で、幸せ!?なPICアプリ開発環境の完成です(笑)
 
 
 
コメント
コメントを投稿