PIC18F4550と18F2550用HIDBootloaderの改造

今夜は、USBコントローラ内蔵のPICマイコン用HIDブートローダーのお話

USB経由でアプリを書き換えられるという便利なファームウェアがMicrochip社からソースコード付きで公開されているのですが、純正評価ボード用なので、オリジナルボードで使うには手を入れる必要が出てきます。

以下の内容は、18F4550と18F2550でしか確認していませんので、それ以外のチップの場合は参考レベルとしてください。

ブートローダーは、以前にも紹介したMicrochip社提供のライブラリ集(microchip-application-libraries)に含まれています。

PICマイコンに書き込むファームウェアのソースコード一式は以下のパスにインストールされます。
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!


勿論、アプリ側もこのブートローダーが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アプリ開発環境の完成です(笑)


コメント

このブログの人気の投稿

ARM用クロスコンパイラのビルド(Windows8+Cygwin)

Raspberry Pi のsleep時間測定

Quartus2 V13.1 ~エントリー編 HDL回路から回路図用シンボルを作成する~