ホームページH8をMacで>その7b・TOPPERSに移行する(ファイルシステム編)

その7b・TOPPERSに移行する(ファイルシステム編)

目次
 目的と経緯

 以下は、マイコンボードのOSをMESからTOPPERS/JSPに移行した際の覚書です。

 ここでは、TOPPERS/JSPにSDカードベースのファイルシステム機能を追加するため、FatFsというモジュールを組み込みます。
 ただし、調べた限りでは、H8/3069F + SDカードI/F + TOPPERS/JSP + FatFsの、そのものズバリのサンプルは公開されていないようなので、あれこれ継ぎ剥ぐことになりました。

 なお、現状では完動はしていませんが、めどは立ったということで、記しておきます。
注)今回のjspはTINETを含んでいない、オリジナルを用いています。TINETとFatFsの合体は、今後の課題です。

 現状確認と方針

 TOPPERSの公式サイトでは、FatFs for TOPPERSが公開されています。ただしこれは、
 プロセッサ  SH3(SH7727)
 ボード  MS7727CP01(日立超LSIシステムズ)
 PCカード・コントローラ  MR-SHPC-01 V2T-F(丸文)
 PCカード・アダプタ  PCCF-ADP(I/O DATA)
 記録メディア  コンパクト・フラッシュ・カード
であり、共通点が全くありません。

 一方、FatFsの作者様のサイトでは各種サンプル・プロジェクトが公開されていますが、H8向けは、
 プロセッサ  H8/3694F
 ボード  自作?
 記録メディア  MMC/SD
 OS  使用せず
 IDE  HEW
で、こちらも、そのまま適用できるものではありません。

 ここで考えなければならないことは、
  1. 全体の構成をどうするか?
  2. ドライバをどう組み込むか?
  3. ハードウェアとの整合性をどう取るか?
 まず、全体の構成は、FatFs for TOPPERSを流用することとします。
 理由は、FatFs for TOPPERSがドライバ部分を独立した構成にしているため、差し替えが容易なのと、Makefile等を一から書かなくて済むことです。

 次にドライバは、FatFs作者様のH8/3694F用サンプルを使わせて頂くことにします。
 ドライバの切り口は、FatFs for TOPPERSと一致している(というか、TOPPERS側がFatFsに合わせ込んでいるようだ)ので、基本的にはソースファイルを移動してくるだけで済みます。

 最後にハードウェアとの整合性ですが、MESではPBポートをシリアルポートとして使っていたのですが、これを通常のI/Oポートとして使用することとし、一部の配線を変更します。
ドライバのソースを見ると、クロックはハードウェアではなく、ソフトウェアで実現しています。(どうも「手クロック」と呼ぶらしい。)
そこで、SDのCLK端子を、従来のSCK2(38番ピン)からPB3(36番ピン)に移動します。
変更前 変更後
2 - 32 34 36 38
SCK2
40
RxD2
1 - 31 33
PB0
35 37 39
TxD2
 注)上段:ピン番号、下段:信号名
2 - 32 34 36
PB3
38 40
PB7
1 - 31 33
PB0
35 37 39
PB6
 注)上段:ピン番号、下段:信号名
(マニュアルを読むと、PB5は汎用のI/Oピンとしては使えないようだったので移動しました。自分の理解が間違っているかもしれませんが…)
(追記:完全に間違っていました。PB5でも問題なく使えます。)(2009.12.11)
なお、H8/3694F用サンプルでは、カード挿抜によるパワーオン/オフ、ライトプロテクトにも対応しているようですが、ウチでは使わないので、とりあえず無視しています。
 また、ハードウェアに合わせて、ドライバのI/Oピン周りの設定を書き換えます。
そのためには、iodefine.hという、レジスタへのアクセスを容易にするMPU固有のファイルがあると便利なのですが、ドライバのサンプル・プロジェクト添付のものはH8/3694F用なので使えません。
今回はルネサスの統合環境であるHEWをWindowsマシンにインストールし、H8/3069用のプロジェクトを新規作成することで取得しました。
ファイルだけを入手できるのかは不明です。
追記:jsp/config/h8/h8_3069f.hが、iodefine.hに相当するファイルのようです。ただし、defineの書式が異なるので、h8_3069f.hを用いる場合は、当該箇所を適宜書き換えて下さい。(2009.02.18)

 必要なものを入手する

 FatFs for TOPPERSは、以下の公式サイトからダウンロードできます。

 参考サイト(1):TOPPERSプロジェクト/INDEX

 FatFsサンプルは、以下の作者様のサイトからダウンロードできます。(資料の「サンプル・プロジェクト 」)

 参考サイト(2):えるむELM - 汎用FATファイルシステム・モジュール

 また、HEW(Windows用)は、以下のメーカサイトからダウンロードできます。(要ユーザ登録)

 参考サイト(3):ルネサス テクノロジ(無償評価版ソフトウェアダウンロード>H8SX, H8S, H8ファミリ用C/C++コンパイラパッケージ)


 作業の記録

 以下は対症療法的試行錯誤の結果を整理したものです。漏れや何か問題がある可能性があります。

 <ディレクトリの再編成>
  1. fatfs-for-toppers-r0.04.tar.gzを展開し、できたtoppers_fatfsフォルダを~/Documents/h8-Toppers/に置いた。
  2. toppers_fatfs/jspを、最新のもの(jsp-1.4.3.tar.gz)に置き換え。
  3. toppers_fatfs/source/から、ata , pcicフォルダを削除。
  4. toppers_fatfs/source/config/内の「sh3_ms7727cp01」フォルダを「h8_akih8_3069f」にリネームし、ff_cfg.h , Makefile.fatfsを除いて他を削除。

  5. ffsample.zipを展開し、できたffsampleフォルダを(任意の場所に)置いた。
  6. ffsample/h8/h8_mmc/から、mmc.cを、toppers_fatfs/source/config/h8_akih8_3069f/にコピー。
  7. ffsample/h8/h8_mmc/から、diskio.hを、toppers_fatfs/source/fatfs/にコピー(同名のファイルがあるので差し替えになる)。

  8. HEWを用いてiodefine.hを生成し、toppers_fatfs/source/config/h8_akih8_3069f/にコピー。
 <Makefileの編集>
  1. toppers_fatfs/sample/sample1.cfg
    #include "../source/config/sh3_ms7727cp01/pcic.cfg"をコメントアウト(または削除。以下も同様)
  2. toppers_fatfs/sample/Makefile(以下の項目を書き換え)
    # ターゲット名の定義
    CPU = h8
    SYS = akih8_3069f

    # ミドルウェアのMakefileをインクルード
    include $(FATDIR)/config/h8_akih8_3069f/Makefile.fatfs
  3. toppers_fatfs/source/config/h8_akih8_3069f/Makefile.fatfs(#有はコメントアウト、#無は書き換え)
    # ミドルウェアのディレクトリ
    #PCIC_GDIC = $(FATDIR)/pcic/gdic
    #PCIC_PDIC = $(FATDIR)/pcic/pdic/mrshpc01v2t

    #ATA = $(FATDIR)/ata

    MTASK_DIR = $(PCIC_CONFIG):$(FAT)

    # ミドルウェアの C 言語のオブジェクトファイルを追加する.
    #PCIC_COBJ = pcic.o mrshpc01v2t.o
    #ATA_COBJ = ata.o ata_command.o ata_command_protocol.o hw_ata.o
    FAT_COBJ = ff.o mmc.o
    MTASK_COBJS = $(FAT_COBJ)

    # ミドルウェアをコンパイルするときのオプションを指定する.

    INCLUDES = -I$(FATDIR) -I$(PCIC_CONFIG) -I$(FAT)
 <ソースの編集>
  1. toppers_fatfs/source/fatfs/ff.c
    最後に追加(注:入れる場所は検討の余地あり。未実装なのはコピー元のFatFs for TOPPERSがそうなっているため)
    /*
     *  日付・時刻の取得
     *    ToDo:未実装
     */
    DWORD
    get_fattime(void)
    {
    	return ((DWORD)0);
    }
    
  2. toppers_fatfs/source/config/h8_akih8_3069f/mmc.c
    //#include "machine.h"  // コメントアウト
    
    /* Control signals (Platform dependent) */
    //#define MMCLK     IO.PDR5.BIT.B0	/* MMC SCLK */
    //#define MMDI      IO.PDR5.BIT.B1	/* MMC DI */
    //#define MMDO      IO.PDR5.BIT.B2	/* MMC DO */
    //#define MMCS      IO.PDR5.BIT.B3	/* MMC CS */
    //#define SELECT()  MMCS = 0		/* MMC CS = L */
    //#define DESELECT() MMCS = 1		/* MMC CS = H */
    #define MMCLK       PBDR.BIT.B3		/* MMC SCLK */ // MESベースから変更
    #define MMDI        PBDR.BIT.B6		/* MMC DI */ // MESベースと変更なし
    #define MMDO        PBDR.BIT.B7		/* MMC DO */ // MESベースと変更なし
    #define	MMCS        PBDR.BIT.B0		/* MMC CS */ // MESベースと変更なし
    #define SELECT()    MMCS = 1		/* MMC CS = L */ // ハードウェアで論理が反転している?ので逆を指定
    #define	DESELECT()  MMCS = 0		/* MMC CS = H */ // ハードウェアで論理が反転している?ので逆を指定
    
    //#define SOCKPORT	IO.PDR5.BYTE	/* Socket control port */
    #define SOCKPORT	PBDR.BYTE	/* Socket control port */
    
    …
    
    void power_on (void)は(ウチでは使わないので)全文コメントアウト
    void power_off (void)は(ウチでは使わないので)全文コメントアウト
    
    …
    
    DSTATUS disk_initialize (
     …
    )
    {
    
    	PBDDR = 0x49;		/* I/O port の種別を指定(入れる場所は検討の余地あり) */
     …
    //	power_on();			/* Force socket power on */コメントアウト
     …
    //		power_off();コメントアウト
     …
    }
    

 ビルドする

 ビルドはマニュアルを参考に、以下の手順で行いました。
  1. gccの場所にパスを通す。(あらかじめ設定してあれば不要。)
    $ export PATH=/Applications/h8/Local/bin:${PATH}
  2. カーネルのコンフィギュレータをビルドする。
    $ cd /Users/hoge/Documents/h8-Toppers/toppers_fatfs/jsp/cfg
    $ make depend
    $ make
  3. サンプルプログラムをビルドする。
    $ cd /Users/hoge/Documents/h8-Toppers/toppers_fatfs/sample
    $ make depend
    $ make
    注)jsp.srecはsampleフォルダにできます。


 動作テスト

 今回は(も?)不確定要因が多すぎるため、テスト項目はディレクトリ・ツリーの表示に絞って行いました。
 そのため、toppers_fatfs/sample/sample1.cの、main_task内の「各種テスト関数の呼び出し」で、test_dir();以外をコメントアウトし、ビルドし直しました。

 ビルドしたjsp.srecをMac-H8ToppersからH8 用簡易モニタにアクセスしてRAMに転送し、実行してみました。
 結果、ディレクトリ・ツリーが表示されました。

注)disk_initialize行とauto_mount行はウチで追加したものです。また、多くのファイル名が文字化けしていますが、これは以前からSDカードに入っていたファイルで、日本語かつロングファイルネームなため、このように表示されるのは仕様です。
 どうやら、ハードウェアとドライバの整合性、ドライバとOSの整合性は、ともに問題なさそうです。
 これで、第一関門はクリアできたとみてよさそうです

 さて、今回のもう一つの成果は、MESではマウントできなかった128MBのSDカードにもアクセスできるようになったことです。(こちらを参照
 やはり、マウントできなかったのはハードウェアレベルの問題ではなく、MESとSDカードの相性?だったようです。
 小容量のSDカードは(今や他に)殆ど使い道がないため、H8ボードで利用できるようになったのは嬉しいです。


 今後の課題

 まだRead/Writeはできていませんし、サブフォルダへのアクセスもおかしな感じなので、まずは全機能が動作することを確認できるまで、追い込んでいきたいと思います。
(注:その後判明したこと等はこちらに記してあります。)

 「その8・uClinuxに浮気してみる(ハイブリッド編)」へ続く
 「その7c・TOPPERSに移行する(シリアル転送編)」へ続く


 お世話になったサイト

 有用なソフトウェアおよび貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)

 参考サイト(1):TOPPERSプロジェクト/INDEX
 参考サイト(2):えるむELM - 汎用FATファイルシステム・モジュール
 参考サイト(3):ルネサス テクノロジ


 更新履歴

 2009.12.12 「現状確認と方針」に追記を追加。「今後の課題」にリンクを追加。
 2009.02.18 「現状確認と方針」に追記を追加。
 2009.02.17 新規作成


[Home]  [MacSoft]  [Donation]  [History]