2010年5月23日日曜日

SH-2A基板 32KB超プログラムのROM化を試しました。



先日、Interface誌 付属SH-2A基板特設ページ でリリースされた 「シリアル・フラッシュROM用ブート・ローダのプロジェクト・ファイル一式をアップロードしました(SPIbootloader1)」を参考にし、ブートローダープログラムを改造し、また、以前使用した「ROM化ユーザ・プログラム書き込み用プログラム(SPIwreterUserDI)」再度改造して、32KBを超えるサイズのプログラムをシリアル・フラッシュROM(M25P40)に書き込み、その動作を確認しました。


概要

1.プログラムの改造
 1)ブートローダープログラム(SPIbootloader1)のシリアル・フラッシュROMからの読み出しサイズを
448KB に拡張した。
 2)ROM化ユーザ・プログラム書き込み用プログラム(SPIwreterUserDI)で
  ・ブートローダープログラム
  ・HEWモニタプログラム
  ・ユーザープログラム
    の3つのプログラムを個別に書き込むように改造した。
2.ROM化プログラムの動作確認
  ・プログラムサイズ 42,364バイト のプログラムを書き込む
  ・リセット、USBケーブル 抜き差し(電源) での 稼動を確認
  ・HEWモニタの動作を確認  NMIピン High (JPP2 Open)

以下に今回の作業を述べます。

1.ブートローダープログラム(SPIbootloader1)の改造
 1)入手したブートローダープロジェクトの解析
 以前 Renesas サイトから入手した「シリアルフラッシュ・シリアルフラッシュメモリからのブート例」サンプルコード を参考にしながら、ソースコードを解析しました。
 気付いた点
  ・ロードするプログラムのサイズが実質固定で32KBであった。
   本来、0x00002000にあるプログラム情報(APPINFO)を取得し、プログラム開始・終了アドレスの差分をプログラムのロードサイズとしているが、今まで作成したプログラムの開始アドレスが0x1C000000(0x1C000500)であることを考えると、32KB固定と考えられる。
  ・プログラム情報(APPINFO)のアドレスの扱いが、ユーザープログラムの場合、0x00008020、HEWもにたの場合 0x00002020 ・・・・この 0x20(32バイト)のズレが不明 (このズレを無視して、0x00008000、0x00002000 で ローダプログラムを組むと不調 )
      
      32バイトのズレは、RESET_Vector のポインタが格納されている位置、

      Renesasのサンプル(sh7264_sflash_loader_prog)は、ブート開始時に PowerON_Reset_PC [0x1C000500] に跳び、
      SPIbootloader1の場合、RESET_Vector [0x1C000000]に跳ぶ、この違いがよく解らない。
 
      RESET_Vectorの最初のエントリはPowerON_Reset_PC 
      直接PowerON_Reset_PCに跳ぶか、
      一旦RESET_Vectorに跳ぶが、実はPowerON_Reset_PCに跳んでいた、同じようで同じでない、、、、

      何か苦肉の策で リザーブ8に RESET_Vector のポインタをセットして、このようなスキームを実現したのか、、、、 よく解らない。  

 2)ソース main.c の修正
   個々の疑問には、目をつぶり、
     /* アプリケーションプログラムを内蔵RAMにロード */
     sf_byte_read_long(0x00002000, (unsigned long *)app_top, app_len);
   の直前に、app_len = 0x00070000; //(448KB)を置く

    (app_len の算出等で改造の余地あり。)
  
2.ROM化ユーザ・プログラム書き込み用プログラム(SPIwreterUserDI)の再改造
 1)ブートローダープログラムのROM書き込み
  1.で作成したブートローダープログラムを 0x1C080000 に置いて、シリアルフラッシュROMのセクタ0の消しこみ後、先頭8KBに書き込む。

     /* SPI-ROMの書き込み処理 for HEW Loader Program */
     if( write_prog_data( (unsigned char *)0x1C080000, 0x00000000, 0x00002000) < 0 ){
        error();
     }

 2)HEWモニタプログラムのROM書き込み
   以前使用した「SPIシリアル接続フラッシュROM アップデート・ファイル」(SPIROM.BIN)のHEWモニタプログラムの部分をシリアルフラッシュROMの 8KB~32KB に書き込む。
   (HEWでは、SPIROM.BIN は 0x1C092000 に置く)   6/4追記

     /* SPI-ROMの書き込み処理 for HEW Monitor */
     if( write_prog_data_user( (unsigned char *)0x1C092000, 0x00002000, 0x00006000) < 0 ){
        error();
     }

 3)ユーザープログラムのROM書き込み
   作成した、ユーザープログラムをシリアルフラッシュROMの 32KB以降 に書き込む。書き込みが次セクタに及ぶ場合、先に、次セクタの消しこみを行う。
   (HEWでは、USERROM.BIN は 0x1C0A0000 に置く)   6/4追記
     app_prog_size = SECTOR_SIZE * SECTOR_NUM - 0x00008000;

     /* SPI-ROMの書き込み処理 for UserProgram */
     if( write_prog_data_user( (unsigned char *)0x1C0A0000, 0x00008000, app_prog_size) < 0 ){
        error();
     }

3.ROM化プログラムの動作確認
 今回の検証用に32KBを超えるプログラムを作成した、半ば強引に、動作が不十分なグラフィックモジュールを組み込んだ。現時点で動作確認できているモジュールについては、正常の動作が確認できました。
 後は、1MBを超えるプログラムサイズをどうするか、、まあ、不要なことかも知れません。


*write_prog_data_userのコード
  int write_prog_data_user(unsigned char *program_data, unsigned long sflash_addr, unsigned long size)
  {
    unsigned long sector_no;
    unsigned long saddr;
    unsigned long sz;
    unsigned char read_data;
    unsigned char *w_p;

    /* ==== 引数から値をローカル変数にコピー ==== */
    saddr = sflash_addr;
    sz = size;
    w_p = program_data;

    /* ==== シリアルフラッシュメモリへの書き込み ==== */
    while( sz > 0){
      sector_no = saddr / SECTOR_SIZE;

      /*セクタ消去を調整 No.0 セクタの消去除外 */
      if(sector_no > 0)
      {
        if( Is_erased_sector(sector_no) == 0 ){ /* 未消去であれば */
          sf_sector_erase(sector_no);  /* 消去する */
          set_erase_flag(sector_no);  /* 消去したら、消去済みフラグを立てる */
        }
      }
      sf_byte_program(saddr, w_p, 1 );  /* 1バイトずつ書き込む */
      w_p++;
      saddr++;
      sz--;
    }
    /* ==== ベリファイ処理(書き込みの検証)==== */
    saddr = sflash_addr;
    sz = size;
    w_p = program_data;

    while( sz > 0){
      sf_byte_read(saddr,&read_data, 1);  /* 書き込みしたデータを読み出し */

      if( *w_p != read_data ){
        return -1;    /* データが一致しない場合エラーとする */
      }
      w_p++;
      saddr++;
      sz--;
    }
    return 0;
  }
※5/24 訂正 0x1C090000 ==> 0x1C0A0000 ユーザープログラムROM書き込み

0 件のコメント:

コメントを投稿