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

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

目次
 目的と経緯

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

 ふと突然、長らくほっぽってあったマイコンボードを弄りたくなって、埃まみれ(苦笑)になっていたボードを引っ張りだしてきました。

 依然として、ネットラジオが最終目標ではありますが、何もかも忘れていた(更に苦笑)こともあって、ここはリハビリを兼ねて、FatFsから再開する事にしました。
(一部動作結果が思わしくなかったことが、何となく引っかかっていたのもあったのですが。)


 FatFsを最新版に差し替える

 再開に伴い、FatFsを今回の作業時点での最新版(R0.09)に差し替えてみました。

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

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


 作業の記録

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

 <ディレクトリの再編成>
  1. ベースには、その7bで使用した「FatFs for TOPPERS(R0.04ベース)」を用いる。

  2. ffsample.zip(R0.09)を展開し、できたffsampleフォルダを(任意の場所に)置いた。
  3. ffsample/h8/h8_mmc/から、mmc.cを、toppers_fatfs/source/config/h8_akih8_3069f/にコピー(旧ファイルを差し替え)
  4. ffsample/h8/h8_mmc/から、mmc.cを除いたもの全てを(不要なものもあるが、手っ取り早く)、toppers_fatfs/source/fatfs/にコピー(旧ファイルを差し替え)
 <ソースの編集>
  1. toppers_fatfs/source/fatfs/integer.h
    //typedef int		INT;  // TOPPERS側と二重定義になるのでコメントアウト
    //typedef unsigned int	UINT;  // TOPPERS側と二重定義になるのでコメントアウト
    typedef unsigned int	UINT2;  // UINTをUINT2として再定義(あまりに安直なので、良い子はまねしないで下さい(笑)
    
    これに伴い、以下のファイルの「UINT」を「UINT2」に全置換。
    toppers_fatfs/source/fatfs/ff.h
    toppers_fatfs/source/fatfs/ff.c
    toppers_fatfs/source/config/h8_akih8_3069f/mmc.c
  2. toppers_fatfs/source/sample/sample1.c
    void test_read_write(FATFS *fs)
    {
    …
    //WORD	n;
    UINT2	n;
    …
    }
    
    void test_seek(FATFS *fs)
    {
    …
    //WORD	n;
    UINT2	n;
    …
    }
    
    void make_file(char *filename)
    {
    …
    //WORD	n;
    UINT2	n;
    …
    }
    
    さらに、「sects_clust」を「csize」に全置換。
    あと、scan_files()はこちらのページの使用例のものに差し替えています。
  3. toppers_fatfs/source/fatfs/ff.c(R0.04の時と同様の内容)
    最後に追加(注:入れる場所は検討の余地あり。未実装なのはコピー元のFatFs for TOPPERSがそうなっているため)
    /*
     *  日付・時刻の取得
     *    ToDo:未実装
     */
    DWORD
    get_fattime(void)
    {
    	return ((DWORD)0);
    }
    
  4. toppers_fatfs/source/config/h8_akih8_3069f/mmc.c(R0.04の時と同様の内容)
    //#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();コメントアウト
     …
    }
    
 なお、ビルドは、カーネルから行う必要はなく(?)、サンプルプログラムの方だけでOKのようです。


 動作テスト

 結果として、サンプルプログラムの各テスト項目とも、正常に動作しました。
(ただし、若干の紆余曲折がありました。詳細は、次項の「考察」を参照して下さい。)


 考察

 当初は、FatFsを最新版に変更しても、処理の途中でエラーが出て止まっていました。
(以下のケース以外にも、ディレクトリ検索の途中(3階層目に入るとダメみたい)で終わってしまう、とか、ソースを弄るごとに症状は様々。)

 印象としては、メモリ破壊のような感じだったので、あれこれ試行錯誤した結果、「sample1.cの、test_dir()とscan_files()のstaticを外してやる」ことで、うまくいくようになりました。
関数のstaticって、スコープの役割だけでなく、メモリ配置にも関係するんでしょうか。よく分かりません。
 ただし、(UINTのUINT2へのリプレースといい)あまりにも行き当たりばったり過ぎる(笑)ので、もっと真面目に構成を見直した方がいいとは思いますが、まぁ、個人が学習(道楽)目的でやってる程度であれば許してもらえる範囲かな、という感じです。
 なお、SDカードをMacに接続すると、いろいろ隠しファイル/フォルダが作られますが、それらも一通りリストアップする事が出来ました。


 お世話になったサイト

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

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


 更新履歴

 2011.11.12 新規作成


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