改版履歴

Cente SD Card FileSystem for TDS701

MMCカードに対応
MMCA 4.1規格に準拠したMMC(Multi Media Card)に対応しました。(1ビットモード及び最大周波数20MHzまで対応) 

SDCLK停止処理追加
unmount関数内でTDS701 SD Control Register“SDCLKOFFEN”bitを0に設定し、SDCLKを停止する処理を追加しました。

SDカード挿入/抜去モジュールの移動
SDカード挿入/抜去モジュール部を、新たに追加したfs_TDS701_config.cファイル内に移動しました。

TDS701関連ユーザーカスタマイズ定義の移動
fs_TDS701.hファイル内に定義されていたTDS701関連ユーザーカスタマイズ定義を、新たに追加したfs_TDS701_config.hファイル内に移動しました。

ライトプロテクトフラグのセット/クリア処理追加
マウント処理時にライトプロテクト(書き込み保護スイッチ)の検出を行ない、ライトプロテクトフラグをセット/クリアする処理を追加しました。(上位のFileSystemのために必要な処理)

write_sector関数、read_sector関数不具合修正
write_sector関数、read_sector関数について、SD_WriteBlock関数(またはSD_ReadBlock関数)からエラーを返された場合に、SD_Card_check関数の戻り値を返してしまっていたため、上位のFileSystemが誤動作する不具合を修正しました。

SD_SendSCR関数、SD_SendSD_Status関数不具合修正
・マウント処理時のSD_SetBusWidth関数実行前にSD_SendSCR関数(SCRの取得)を実行しているが、そのデータアクセスが完了する前にSD_SetBusWidth関数の処理が行なわれ、コマンドの発行に失敗してしまうことがあったため、処理終了時にデータアクセス完了のチェック処理を追加しました。(SD_SendSD_Status関数の処理も同様)

・SD_Info2_check関数を使用した、TDS701内部バッファのリードイネーブルチェック部について、関数からの戻り値を変数に渡していないのにも関わらず、変数の値を返していたため修正しました。

SD変換アダプタ挿入時の対応
miniSDカードなどのアダプタのみが挿入された場合(miniSDカード自体は取り外されている状態)の対応として、SD_SendOpCond関数内のCMD55及びACMD41発行部のcontinue処理をreturn処理に変更し、即座にエラー終了するような形に改善しました。

クロック設定後に74Clockウェイト処理
SDカードの規格上、SD_SetClk()による100KHz – 400KHz設定後に74clock分のウェイトを追加する必要があるため、1MSEC以上のウェイト処理を追加しました。

R1レスポンスの有効ビット抽出
R1レスポンスに対して、各コマンドで定められている有効ビット(エラーステータス)のみを抽出し、評価を行うように変更しました。

未使用のエラーコードをリザーブ化
fs_TDS701.hファイル内で定義されているエラーコードについて、ドライバ内で使用していないエラーコードについては、全て“#define SD_ERROR10  -10 /**< Reserved */”のようにリザーブ扱いに変更しました。

Hardware Swapに対応
BigEndian環境でのDMA使用時にHardware側でSwapする機構を設けた場合、マクロ(#define SDC_HARDWARE_SWAP)の設定切り替えにより容易にHardware Swap環境への対応が可能なように改善を行ないました。

リード/ライト時のタイムアウト変更
SD_Info2_check関数によるTDS701内部バッファのリード/ライトイネーブルチェック部に、SDカードの規格に定義されている時間のタイムアウトを設けるように変更しました。

High Speed Modeに対応
CMD6発行によるHigh Speed Mode対応カードの検出及び、High Speed Modeへの切り替えが行なわれるように改善を行ないました。

物理フォーマット機能を追加
MBR(Master Boot Record)、PBS(Partition Boot Sector)、FSINFO(FAT32のみ)、FAT、ROOTDIRECTORY領域の初期化を行なう物理フォーマット機能を追加しました。

ウェイト処理削除
通常動作時(リード/ライト時)の動作クロック設定後に行っていたウェイト処理を削除しました。

カード抜去によるループ処理の中断対応
タイムアウト分のループ処理が行なわれる箇所について、SD_Card_check関数によるカード挿抜状態のチェック処理を追加し、カードが抜かれた場合は即座にループから抜け、エラー終了するように改善を行ないました。

永久ループ箇所のタイムアウト化
SD_SetClk関数内のTDS701 SD_INFO2 Register“CBSY”bitチェック部について、“CBSY”bitが1である限り永久にループしてしまう可能性があったため、タイムアウト処理を設けました。

R7フォーマットのレスポンス取得対応
SD_GetResponses関数内にR7フォーマットが指定された場合の対応処理を追加し、CMD8発行時にR7フォーマットの指定が行なえるように改善を行ないました。

独自のデータタイプに対応
変数に対するデータタイプ(型)として、独自に定義したデータタイプを使用するように変更しました。(fs_typedef.hファイル内に定義)

定数のマクロ定義化
マクロが定義されていない定数についてマクロを定義し、そのマクロをドライバ内で参照するように変更しました。

インクルードファイルの一元化
fs_TDS701.hファイル内で、ユーザーカスタマイズ定義部のヘッダファイルをまとめてインクルードするように変更しました。

カード挿抜チェック周期ハンドラのタスク化
周期起動ハンドラに対応していないOSがあるため、カード挿抜チェックをタスクにより行う形に変更しました。

関数名変更
my_wait関数の名前をsd_waitに変更、SDINFO1_INT_body関数の名前をSDINFO2_INT_bodyに変更しました。

BSP環境変更
BSP環境を「SH7709Sリファレンス基板+SD-EVA-BOARD」上で動作する環境からCente評価ボード(ESPT/ESPT2/ESPT-SH7673 + ESPT-SD)上で動作する環境に変更しました。

Cente FileSystem

・new_cluster、next_cluster、fs_vins_clust関数修正
戻り値の型がunsigned longであるにも関わらず、マイナス値を返していた箇所を修正しました。

・fs_ini_disklock、fs_rst_disklock関数修正
アンマウント実行時にセマフォの削除が行えず、再度マウントを実行すると過剰にセマフォを生成してしまう不具合を修正しました。

・fread、fwrite、ct_ins_clust関数修正
get_api_fsyserによる、マルチタスク環境下でのエラーの詳細コード取得に対応できていない不具合を修正しました。

・ini_blk_cache_dir関数修正
ini_blk_cache_dir()の引数には最低でも、バッファサイズ / (キャッシュサイズ * ブロック数) が3以上になる値が指定される必要があるが、それを下回る値を指定することができてしまう不具合を修正しました。

・fwrite関数修正
アクセス速度パラメータ(#define WRITE_CLUSTER)に 1 を設定した場合で、書き込み開始クラスタの先頭から書き込み終了位置までのサイズが1クラスタ以上、2クラスタ未満の場合に、セクタ番号の更新が行われず DATAが上書きされてしまう不具合を修正しました。

・fs_find_dir_entry関数修正
FAT領域アクセス用のセマフォ獲得及び返却に失敗した場合に、それ以前にディレクトリエントリ領域アクセス用に獲得したセマフォの返却が行なわれない不具合を修正しました。

・fs_ini_disklock関数修正
複数のパーティションに分割されたメディアにおいて、各ドライブは同一ドライバで動作するため、生成するセマフォは1つになるが、 fs_ini_disklock()の先頭でセマフォIDのクリアを行なっていたため、同一ドライバでも複数個セマフォが生成されてしまう不具合を修正しました。

・ini_disk_sect、mount_disk関数修正
fs_ini_disklock()によりセマフォ資源を生成している箇所について、その後の処理でエラー終了した場合にセマフォ資源の削除が行なわれない不具合を修正しました。

・ct_ini_disk_sect、mount_disk関数修正
連続未使用クラスタ検索機能を有効(#define FS_FREE_CLUST 1)にした状態でのマウント処理において、獲得したワーク用バッファの返却を二重に行なっている箇所があり、その結果OSの誤動作を招く不具合を修正しました。

・fopen、fopen_cl、fopen_hash、fopen_uni関数修正
高速fseek機能有効時(#define FS_SEEK_BF 1)、fseek用2次キャッシュバッファ獲得後の処理でエラー終了した場合に、バッファの返却が行なわれない不具合を修正しました。

・ini_disk_sect、mount_disk、remove_hash、fs_r_sect、fs_w_sect関数修正
セマフォの獲得/返却またはメモリプールの獲得/返却に失敗した場合に、OSシステムコールのエラーコードをそのままFileSsytem APIが戻り値として返してしまう不具合を修正しました。

・fopen_hash、hash_entry、hash_delete、ini_fsys、reset_fsys関数修正
fopen_hash()で作成したファイルをmoveで移動した後、再度同一名称のファイルをfopen_hash()で作成しようとした場合、ハッシュテーブルへのハッシュ値が存在するため、エラーで終了してしまう不具合を修正しました。

・get_dev0関数修正
マルチパーティション環境(#define FS_MULTI_P 1)で、スーパーフロッピーディスク形式に対応するためのコードを追加しました。

・unmount_disk関数修正
ファイル操作中にメディアが抜かれてしまった場合の対応として、入出力バッファ、高速fseek用バッファのメモリブロック解放がunmount_disk()実行時に必ず行なわれるように改善しました。

・ini_disk、ini_disk_sect、mount_disk、unmount_disk関数修正
デバイスドライバ上でエラーが発生した場合は戻り値として-2を返すように変更を行ない、デバイスドライバ上のエラー、FileSystem上のエラーを区別できるように改善を行ないました。

・fs_find_dir_entry_root、fs_find_dir_entry、fs_fat_chain_clear、 set_fsinfo、fs_find_dir_entry_root_uni、fs_find_dir_entry_uni、 fs_remove_entry関数修正
サブ関数を新設し、セマフォ獲得・返却関数の呼び出しが一回で済むような形に改善しました。

・fs_iniworkmem関数修正
正常の場合の戻り値としてOSシステムコールからの戻り値をそのまま返していたため、「0」に置き換えて返すように修正しました。

・ini_fsys、ini_disk_sect、reset_fsys関数修正
エラー発生時に直ぐにエラー終了せず、そのエラーが無視され処理が続けて行なわれてしまう不具合を修正しました。

・fread、chg_filelen関数修正
マウントのチェック処理が抜けていたため追加を行ないました。

・save_cache関数修正
FAT領域保護用のセマフォ獲得/返却はct_save_cache()内で行なっているが、メタデータ保護機能又はキャッシュの自動保存機能を有効にした際、各APIではfs_save_cache()を実行しているため、fs_save_cahe()内でFAT領域保護用のセマフォ獲得/返却が行なわれるように修正しました。

・mount_disk、ini_disk_sect関数修正
マウント処理時にFAT32用のディスク構造体メンバの初期化処理を追加しました。

・fclose関数修正
入出力バッファの解放前にファイル構造体メンバの stat を 0 に初期化していたため、マルチタスク環境下では入出力バッファの解放前にそのファイル構造体が別のファイルに割り当てられしまう不具合を修正しました。

・fopen_cl、fopen_hash関数修正
FAT12/16ルートディレクトリ上において、オープン対象ファイルのディレクトリエントリの位置が1セクタを超える場合に正しいディレクトリエントリの検索が行なえず、誤ったディレクトリエントリにサイズ情報を書き込んでしまう不具合を修正しました。

・ライトプロテクトチェックの追加
キャッシュ機能有効の状態でライトプロテクト機構のあるメディアを使用した場合、キャッシュの自動フラッシュが起こってしまい誤動作する可能性があるため、書き込み系APIではST_DISK構造体のdsk_flgにセットされたライトプロテクトビットのチェックを行い、早期にエラー終了するように修正しました。

・デバッグログの削除
メタデータ保護機能評価用として各ソースファイル内に組み込まれていたデバッグログを全て削除しました。

・エラーコード返却不具合修正

  • fs_er()により戻された0/-1の値を再びfs_er()に渡してしまっている箇所を修正しました。
  • 発生したエラー

Page 18 of 26