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月21日水曜日
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を使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。
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を使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。
登録:
投稿 (Atom)