2010年7月21日水曜日

付属SH-2A基板 SD/MMCカード対応ブート・ローダを試す。(その1:失敗の顛末)

SQ出版 Interface誌 Webサイト「付属SH-2A基板特設ページ」で SD/MMCカード対応ブート・ローダが先行公開されました。
 私、安直に、「これは、良い、今まで、外付けシリアルフラッシュで64(32)KByteオーバープログラムに対応していたのが、SDカードで置き換えられる。」と思い、早速試してみました。
 結論から言えば、現時点でまだ、この素晴らしい、ブート方式の検証は出来ていません。失敗事例とし今回、投稿します。ご容赦願います。

[概要]
1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造ポイント
 1)SDカードの端子変更
  CS: PG20(33)=> PG16(24)
  WP: PJ3(32) => PC6(27)
  CD: PJ1(31) => PC7(28)
 2)ff_loader.binの(ブート・ローダー)の扱い
  外付けシリアルフラッシュROMの先頭(0x00000000)に書き込む。
  =>外付けシリアルフラッシュROMの32KB以降(0x00008000)に書き込む。(訂正7/25)
2.稼動させたい、プログラム。
 過去に、シリアルフラッシュROMに書き込んだプログラム。「付属SH-2A基板 2Chオシロスコープ(弊ブログ)」を、PCでSDカードに、”app.bin”というファイル名で書き込む。
3.試行
  失敗
4.試行後
  既存のブート・ローダーおよびHEWモニターが潰れたため、付属基盤は不能に。
5.リカバリー
  「SH-2A基板用HEWモニタプログラムを外付けシリアル・フラッシュROMに書き込む。(弊ブログ)」で、元のブート・ローダーおよびHEWモニターを書き込み、復旧。


 以降、今回の失敗の詳細を述べます。


1.SD/MMCカード対応ブート・ローダ ”ff_loader” 改造
 1)SDカードの端子変更
  ①CS端子
   CN3 33はSPI Ch1のMISOで使いたいので、CN3 24 (PG16)に変更
   ・ソース:mmc.c のCS制御を
    #define CS_LOW() PORT.PGDR1.BIT.PG16DR = 0 /* MMC CS = L */
    #define CS_HIGH() PORT.PGDR1.BIT.PG16DR = 1 /* MMC CS = H */   
   に変更。
   ・ソース:mmc.c のpower_on()内のCS 設定を
    PORT.PGIOR1.WORD |= 0x0001; PORT.PGCR4.WORD &= 0xFFF0; /* MMC_CS */
   に変更。(7/23追記)
   


  ②WP端子、CD端子
   CN3 31,32は、LCD(モノクログラフィック)で使用のため、CN3 27,28 (PC6,PC7)に変更

   ・ソース:mmc.c のWP,CDのGPIOポート設定を
    #define SOCKPORT PORT.PCPR0.WORD /* ソケット状態入力(PC) */
    #define SOCKWP 0x0040 /* ライトプロテクト接点 (PC6) */
    #define SOCKINS 0x0080 /* カード検出接点 (PC7) */
   に変更
   ・ソース:mmc.c のpower_on()内のWP/CD 設定を
    if (_USE_CD) {PORT.PCIOR0.WORD &= 0xFF7F; PORT.PCCR0.WORD &= 0x0FFF;} /* MMC_CD */
    if (_USE_WP) {PORT.PCIOR0.WORD &= 0xFFBF; PORT.PCCR0.WORD &= 0xF0FF;} /* MMC_WP */
   に変更。(7/23追記)

 2)ff_loader.binの(ブート・ローダー)の扱い
  現在、シリアルフラッシュROM(SPI Ch0)に、プログラムを書き込むプログラムを改造し、シリアルフラッシュROMの先頭(0x00000000)にブート・ローダーのみを書き込みプログラムを作成し、改造後の”ff_loader.bin”を書き込みました。
 =>このブート・ローダーは、ユーザープログラムとして扱うようです。ユーザー・プログラムがさらに、別のユーザープログラムをロードすることで、SDカード上のプログラムを実行するようです。したがって、プログラム書き込み位置は、従来のユーザープログラムと同じ、シリアルフラッシュROMの32KB(0x00008000)以降になります。(7/25追記)


3.試行~5.リカバリー 上記のとおり、

6.疑問点
 SH7262のローダープログラムのサイズは8KBだった記憶があります。今回のブート・ローダーのプログラムサイズは12KB、少々疑問を持っています。=>この疑問無効(7/25追記)

※今回の失敗で、SDカードコネクタ周りの配線チェックを予定しています。チェックの方法として、以前試していた、SDカード関連のプログラムを元のSPI Ch0に戻し再度動作確認を行いたいと思います。

SDカードからのブートが実現できれば、結構快適に、付属SH-2A基板のプログラム開発が行えると期待してます。

7.状況
 7/23 I誌7月号第3章 「メモリカードとFATファイル・システムの実装」のプログラムの動作を実現し、SPI Ch0によるSDカードコネクタ周りの回路構成(配線等)を確認しました。
 7/25 I誌9月号を読みながら、GCC版、HEW版いずれも試すが、SDカードプログラムの稼動は確認出来ず。

2010年7月11日日曜日

SH-2A GNU GCC 4.5.0のインストール

CQ出版Interface誌付属SH-2A基盤にについて、色々と試行錯誤を繰り返してきました。
 HEWのライセンス切れで256KByteの制限が課せられ、TFTカラー液晶表示でのフォント表示、ファイルシステム(FAT)を利用したプログラムの開発が頓挫してしまいました。
 そこで、昨年同様GNU GCCでの開発に切り替えようと悪あがきを続けています。
 過去に述べたように、Interface誌Webサイト(GCC 4.4.0)、KPIT Webサイト(GCC 4.5.0)から入手したGNU GCCの開発環境でなかなか思い通りの動作が得られず独自にGNU GCCの環境の構築に挑戦しました。

[概要]
○パッケージ 
  GCC     4.5.0
  binutils  2.20.1(失敗)=> 2.19.1
  gmp     5.0.1
  mpfr     3.0.0
  mpc     0.8.2(GCC4.5.0から必須パッケージ)
  newlib   1.18.0
○インストール後の動作
  現時点で、Interface、KPIT 提供のGCC環境でのビルドと同じ動作。
  今まで発生したビルドエラーは、Makefileの記述ミスに起因したものでした。
○割り込み
  SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考にすると割り込み動作が初めて確認できました。 


※これ以降の記述は、Interface誌Webサイト等で公開されているGNU GCC開発環境を使えば不要です。当初 Makefile等の不備でGNU開発環境の構築を始めたのですが、結果的に不要な苦労をしたようです。(結構時間をとられてしまいました。)

1.インストール
 1)Cygwin 1.7.5 のインストール
  ・Archive Unzip
  ・Devel すべてインストール
  ・Libs すべてインストール
   今回GNUの一連のインストールでは ビルド時にプログラム”XXX”が無い、ライブラリ”libXXX”が無いといったビルドエラーが多発しました。手っ取り早く、CygwinのDevel、Libsのパッケージをすべてインストールすることでこの種のビルドエラーは回避できました。
   

 2)binutilsのインストール
  (1) 2.20.1では tc-arm.c のコンパイルエラー
   (メモ)binutils-2.20-2.20.1-patch ファイルの適用
     binutilsのインストール失敗に対応しようとし、パッチファイルを適用しようとしたが失敗。どうも、このパッチファイルは、binutils-2.20をbinutils-2.20.1にバージョンアップを行うものと思われる。
     (パッチの当て方 binutils-2.20.tar.gz を展開したディレクトリで「patch -p0 -d . < binutils-2.20-2.20.1-patch」を実行 )
  (2) 2.19.1をインストール
    ・mkdir build_binutils
    ・cd build_binutils
    ・../binutils-2.19.1/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
    ・make
    ・make check
    ・make install
  (3)CygwinのDevelの binutils をアンインストール
 3)gmp、mpfrのインストール 過去の記述を参照
 4)mpcのインストール
  ・mkdir  build_mpc
  ・cd build_mpc
  ・../mpc-0.8.2/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools
  ・make 
  ・make check
  ・make install
 5)GCCのインストール
  ・mkdir build_gcc
  ・cd build_gcc
  ・../gcc-4.5.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools --enable-interwork --enable-multilib --enable-languages=c --disable-libssp
  ・make
    (メモ)Cygwinのbinutillsパッケージでmakeすると「cannot compute suffix of object files」のエラー ==> 2)のbinutilsインストールで成功
  ・make check
     「autogen: Command not found」のエラー
    (メモ)autogen-5.10.2を入手しインストールを試みると、Configureで「Cannot find libguile」のエラー発生(CygwinのLibsはインストールはデフォルト(このときはすべてではなかった)=> 1)Cygwinのインストールに反映)
  ・make install(make chekuエラーは無視)
 6)newlibのインストール
  ・mkdir build_newlib
  ・cd build_newlib
  ・../newlib-1.18.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
  ・make 
  ・make check
  ・make install
 7)GCCのインストール その2
  ・cd build_gcc
  ・make all
  ・make install

※GNUの各パッケージのインストールは、ARM7TDMIとSH-2Aを並行して行いました。パッケージのビルドでtarget=arm-elf/target=sh-elfの差異がわからなかったので、各パッケージのインストール先はarm-tools/sh-toolsにしました。
また、各パッケージのインストール作業はビルドエラーを頻発しながら、繰り返しインストール作業を重ねました。

2.サンプルプログラム 動作確認
 1)gccのサンプルプログラム
   「第3章 メモリ・カードとFATファイル・システムの実装」の gcc用サンプル・プログラムを使用
 2)サンプルプログラムのビルド
  (1)asmfunc.sのエラー
    SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考に修正する。
   ・asmfunc.sの修正
    「メモリ・カード...」と「SD/MMCカード...」差異を調べSetImask()の後半に
      .global _set_sp
      _set_sp:
        MOV R4, R15
        RTS
        NOP
      を追加。
    (「メモリ・カード...」のasmfunc.sではコンパイルエラーが発生。)
  (2)main.cの修正
   ・割り込みハンドラー関数 Isr_CMI0() はLEDの点滅のみの動作に修正
   ・delay_ms()、SetCCR1(x)、IoInit()、 main ()以外の関数は削除
   ・main()は、
     int main (void)
     {
       IoInit();   /* 内蔵周辺モジュールの初期化 */

       /* 起動メッセージ */
       delay_ms(10);
       while(1) {}
     }
     に削り込みました。
  (3)Makefileの修正
   ・TARGET = cmt0_test
   ・CSRC = main.c
     ファイルシステム関連のソースファイルを削りました。
   ・LIBDIR = /usr/local/sh-tools/lib/gcc/sh-elf/4.5.0/m2a
     ライブラリ参照を m2 => m2a に変更
   ・CFLAGS = -Wall -g$(DEBUG) -m2a $(OPTIMIZE) $(DEFS)
     コンパイルオプション -m2 => -m2aに変更

※m2では割り込みは動作せず、m2aに変更して、割り込み動作を確認できました。
(偶然、m2aにしたタイミングで、割り込みが機能しただけかも知れません。)

※今回構築したGNU GCCの開発環境ですが、ビルド時(make check)のエラーを無視しています。作成したプログラムの動作が確認出来た状況です。
 感想として、GNU GCCの開発環境の構築は私にとって、かなり困難になってきたように思います。
GNUの各パッケージについて、リリース毎にインストール手順の説明があったらと思いました。(私が、その情報に辿り着けなかっただけかも知れません。)

※やはり、SHの開発はHEWを使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。