FatFS R0.10b, released May 19, 2014

This commit is contained in:
Christopher Williams
2015-01-31 09:24:04 -07:00
parent 935031e4e5
commit 762b341574
75 changed files with 812 additions and 704 deletions
+12 -9
View File
@@ -44,17 +44,19 @@ FatFsモジュールはANSI C(C89)準拠で記述されているので、普通
<h4>システム構成</h4>
<p>下に示す依存関係図は、FatFsモジュール利用の組み込みシステムにおける代表的な構成を示します。</p>
<p><img src="../img/modules.png" width="580" height="280" alt="システム構成図"></p>
<p>(a) FatFs用に書かれたディスク・モジュールがある場合は、そのまま追加するだけです。 (b) しかし、多くの既存のディスク・モジュールはそのAPIをFatFsに合わせるため、グルー関数が必要になるでしょう。</p>
<p><img src="../img/funcs.png" width="680" height="430" alt="functional diagram"></p>
<h4>ユーザの作成する関数</h4>
<p>必要なのは FatFsモジュールの要求するディスク関数を用意することだけで、それ以外にすることはありません。既に動作しているディスク関数があるなら、その APIを FatFsに合わせるかグルー関数つなぐだけで済みますが、無い場合はほかから移植するか最初から書くかする必要があります。定義されている全ての関数が常に必要なわけではありません。例えば、リード・オンリー構成では書き込み系関数は必要ありません。次の表に構成オプションと要求される関数の対応を示します。</p>
<p>必要なのはFatFsモジュールの要求するディスク関数を用意することだけで、それ以外にすることはありません。既に動作しているディスク・モジュールがあるなら、そのAPIをFatFsに合わせるかグルー関数を介してつなぐだけで済みますが、無い場合はほかから移植するか最初から書くかする必要があります。定義されている全ての関数が常に必要なわけではありません。例えば、リード・オンリー構成では書き込み系関数は必要ありません。次の表に構成オプションと要求される関数の対応を示します。</p>
<table class="lst2">
<tr><th>ユーザ作成関数</th><th>必要となる条件</th><th>備考</th></tr>
<tr><td>disk_initialize<br>disk_status<br>disk_read</td><td>常時</td><td rowspan="5">ffsample.zip (サンプル)<br>その他web上に多数</td></tr>
<tr><th>必要な関数</th><th>必要となる条件</th><th>備考</th></tr>
<tr><td>disk_status<br>disk_initialize<br>disk_read</td><td>常時</td><td rowspan="5">ffsample.zip (サンプル)<br>その他web上に多数</td></tr>
<tr><td>disk_write<br>get_fattime<br>disk_ioctl (CTRL_SYNC)</td><td>_FS_READONLY == 0</td></tr>
<tr><td>disk_ioctl (GET_SECTOR_COUNT)<br>disk_ioctl (GET_BLOCK_SIZE)</td><td>_USE_MKFS == 1</td></tr>
<tr><td>disk_ioctl (GET_SECTOR_SIZE)</td><td>_MAX_SS != _MIN_SS</td></tr>
<tr><td>disk_ioctl (CTRL_ERASE_SECTOR)</td><td>_USE_ERASE == 1</td></tr>
<tr><td>ff_convert<br>ff_wtoupper</td><td>_USE_LFN &gt;= 1</td><td>option/cc*.c</td></tr>
<tr><td>ff_convert<br>ff_wtoupper</td><td>_USE_LFN &gt;= 1</td><td>option/unicode.c</td></tr>
<tr><td>ff_cre_syncobj<br>ff_rel_grant<br>ff_req_grant<br>ff_del_syncobj</td><td>_FS_REENTRANT == 1</td><td rowspan="2">option/syscall.c (サンプル)</td></tr>
<tr><td>ff_mem_alloc<br>ff_mem_free</td><td>_USE_LFN == 3</td></tr>
</table>
@@ -150,8 +152,8 @@ _FS_LOCK 0 (Disable file lock control)
<div class="para" id="lfn">
<h3>長いファイル名</h3>
<p>FatFsモジュールはR0.07から長いファイル名(LFN)をサポートしました。ファイルに付けられた2つの異なる名前(短いファル名と長いファイル名)は、<tt>f_readdir()</tt>を除くファイル操作関数において透過です。LFN機能を有効にするには、<tt>_USE_LFN</tt>を1,2または3に設定し、Unicode変換関数<tt>ff_convert(), ff_wtoupper()</tt>をプロジェクトに追加します。これらの関数は、<tt>option/cc*.c</tt>に含まれています。LFN機能は、加えてある程度のワーク・エリア(LFN操作バッファ)を必要とします。バッファ長は使用できるメモリに応じて<tt>_MAX_LFN</tt>オプションで構成されることができます。LFNの長さは最大255文字に達するので、LFN完全対応のためには<tt>_MAX_LFN</tt>は255に設定されるべきです。与えられたファイル名に対してバッファ長が不足した場合、ファイル関数は<tt>FR_INVALID_NAME</tt>で失敗します。</p>
<p>何らかのリエントラント状態の下でLFN機能を使用する場合は、<tt>_USE_LFN</tt>は2または3に設定されなければなりません。この場合、ファイル関数はバッファをスタックやヒープに確保します。バッファ・サイズは、<tt>(_MAX_LFN + 1) * 2</tt>バイトになるので、スタック等のサイズはそれを考慮した十分なサイズでなければなりません。</p>
<p>FatFsモジュールは長いファイル名(LFN)をサポートしま。ファイルに付けられた2つの異なる名前(短いファル名と長いファイル名)は、<tt>f_readdir()</tt>を除くファイル操作関数において透過です。デフォルト構成では、LFN機能はOFFになっています。LFN機能を有効にするには、<tt>_USE_LFN</tt>を1,2または3に設定し、<tt>option/unicode.c</tt>をプロジェクトに追加します。LFN機能は、加えてある程度のワーク・エリア(LFN操作バッファ)を必要とします。バッファ長は使用できるメモリに応じて<tt>_MAX_LFN</tt>オプションで構成されることができます。LFNの長さは最大255文字に達するので、LFN完全対応のためには<tt>_MAX_LFN</tt>は255に設定されるべきです。与えられたファイル名に対してバッファ長が不足した場合、ファイル関数は<tt>FR_INVALID_NAME</tt>で失敗します。</p>
<p>ファイル関数に再入を行う条件の下でLFN機能を使用する場合は、<tt>_USE_LFN</tt>は2または3に設定されなければなりません。この場合、ファイル関数はワーク・エリアを動的に確保(スタックまたはヒープ)します。バッファ・サイズは、<tt>(_MAX_LFN + 1) * 2</tt>バイトになるので、スタック等のサイズはそれを考慮した十分なサイズでなければなりません。</p>
<table class="lst2 rset">
<caption>LFN cfg on ARM7</caption>
<tr><th>コードページ</th><th>コードサイズ[bytes]</th></tr>
@@ -186,7 +188,7 @@ _FS_LOCK 0 (Disable file lock control)
<div class="para" id="dup">
<h3>多重ファイル・アクセス</h3>
<p>FatFsモジュールではデフォルトでは多重アクセス制御機能をサポートしていません。ファイルに対する多重アクセスは、そのアクセス・モードによって制限されます。一つのファイルに対する多重オープンは、それらが全てリード・モードのときに限って許可されます。書き込みモードを含む多重オープン、また開かれているファイルに対するリネームや削除を行ってはなりません。さもないと、そのボリュームのFAT構造が破壊される可能性があります。</p>
<p><tt>_FS_LOCK</tt>に1以上の値(値は同時に管理できるファイル数)をセットすることで多重アクセス制御機能が有効になり、ファイル単位のアクセス制御を自動で行うこともできます。この場合、上記のルールを破ったオープン・リネーム・削除を試みると、その関数は<tt>FR_LOCKED</tt>で失敗します。また、<tt>_FS_LOCK</tt>を越える数のファイルやディレクトリを同時にオープンしようとすると、<tt>FR_TOO_MANY_OPEN_FILES</tt>で失敗します。</p>
<p><tt>_FS_LOCK</tt>に1以上の値(値は同時に管理できるファイル数)をセットすることで多重アクセス制御機能が有効になり、ファイル単位のアクセス制御を自動で行うこともできます。この場合、上記のルールを破ったオープン・リネーム・削除を試みると、その関数は<tt>FR_LOCKED</tt>で失敗します。また、<tt>_FS_LOCK</tt>を越える数のファイルやサブ・ディレクトリを同時にオープンしようとすると、<tt>FR_TOO_MANY_OPEN_FILES</tt>で失敗します。</p>
</div>
<div class="para" id="fs1">
@@ -214,7 +216,7 @@ _FS_LOCK 0 (Disable file lock control)
図6. マルチ/シングル・セクタ・ライトの比較<br>
<img src="../img/f6.png" width="630" height="148" alt="fig.6">
</div>
<p>フラッシュ・メモリ・メディアの書き込み速度はシングル・セクタ書き込みの時に最も低いものになり、一回のトランザクションで転送されるセクタ数が大きくなるほど書き込み速度は向上します。この効果はバス速度が高速になるほど顕著で、10倍以上の差が現れることも珍しくありません。書き込みトランザクションの回数はまた、メディアの寿命にも影響してきます。このため、アプリケーションはなるべく大きなブロック(クラスタ・サイズまたは2の累乗セクタ境界にアライメントした)で読み書きを行う必要があります。もちろん、アプリケーションからメディアに至る全てのレイヤがマルチ・セクタ転送に対応していないと意味がありません。残念ながら、既存のオープン・ソースのドライバの多くはマルチ・セクタ転送に未対応です。なお、FatFsモジュールおよびそれ用のサンプル・ドライバはマルチ・セクタ転送に対応しています。</p>
<p>フラッシュ・メモリ・メディアの書き込み速度はシングル・セクタ書き込みの時に最も低いものになり、一回のトランザクションで転送されるセクタ数が大きくなるほど書き込み速度は向上します。この効果はバス速度が高速になるほど顕著で、10倍以上の差が現れることも珍しくありません。<a href="../img/rwtest2.png">テスト結果</a>は、マルチ・セクタ書き込み(W:16K, 32 sectors)がシングル・セクタ書き込み(W:100, 1 sector)よりどの程度速いかを明確に示しています。大容量メディアほどシングル・セクタ書き込みが遅くなる点もまた重要です。書き込みトランザクションの回数はまた、メディアの寿命にも影響してきます。このため、アプリケーションはなるべく大きなブロック(クラスタ・サイズまたは2の累乗セクタ境界にアライメントした)で読み書きを行う必要があります。もちろん、アプリケーションからメディアに至る全てのレイヤがマルチ・セクタ転送に対応していないと意味がありません。残念ながら、既存のオープン・ソースのドライバの多くはマルチ・セクタ転送に未対応です。なお、FatFsモジュールおよびサンプル・ドライバはマルチ・セクタ転送に対応しています。</p>
<h4>明示的なメモリ消去</h4>
<p>通常のファイル消去では、記録されたデータに対して何らかの制御が行われるわけではなく、単にFAT上に未使用クラスタとして記録されているだけです。このため、ファイルが消去されたあともそれらは有効なメモリ・ブロックとしてフラッシュ・メモリ上に残ります。そこで、ファイルを消去するとき、占有していたデータ・セクタを明示的に消去(つまり未使用ブロックにする)することにより、メディア内の空きブロックを増やすことができます。これにより、次にそのブロックに書き込むときの消去動作が無くなり、書き込み性能が向上する可能性があります。また、ウェアレベリングに使えるブロックが増え、メディアの耐久性も向上するかも知れません。この機能を有効にするには、構成オプションの<tt>_USE_ERASE</tt>に1を設定します。これはフラッシュ・メモリ・メディアの内部動作に期待した制御なので、効果があるとは限りません。また、ファイル消去の時間が延びることも考慮に入れるべきです。</p>
</div>
@@ -250,6 +252,7 @@ _FS_LOCK 0 (Disable file lock control)
<li><a href="../img/app2.c">ディレクトリを空にする</a></li>
<li><a href="../img/app3.c">ファイルに連続領域を割り当てる</a></li>
<li><a href="../img/app4.c">ディスクI/Oモジュールの機能/互換性チェッカー</a></li>
<li><a href="../img/mkfatimg.zip">FATイメージ作成ツール</a></li>
</ol>
</div>
@@ -257,7 +260,7 @@ _FS_LOCK 0 (Disable file lock control)
<h3>FatFsのライセンスについて</h3>
<p>ソース・ファイルのヘッダにライセンス条件が記述されているので、利用の際はそれに従うこと。英語を読めない方のために以下に日本語訳を示しておきます。</p>
<pre>/*----------------------------------------------------------------------------/
/ FatFs - FAT file system module R0.10a (C)ChaN, 2014
/ FatFs - FAT file system module R0.10b (C)ChaN, 2014
/-----------------------------------------------------------------------------/
/ FatFsモジュールは、小規模な組み込みシステム向けの汎用FATファイルシステム・
/ モジュールです。これはフリー・ソフトウェアとして、教育・研究・開発のために
+1 -1
View File
@@ -50,7 +50,7 @@ FRESULT f_chdir (
<div class="para desc">
<h4>解説</h4>
<p>各ボリュームのカレント・ディレクトリを変更します。カレント・ディレクトリはファイル・システム・オブジェクトの初期化が行われたとき、ルート・ディレクトリに設定されます。カレント・ディレクトリは、ファイル・システム・オブジェクトに保持されるため、そのボリュームを使用する全てのタスクに対して影響を与えます。</p>
<p>各ボリュームのカレント・ディレクトリを変更します。カレント・ディレクトリは、そのボリュームのマウント動作が行われたとき、ルート・ディレクトリに初期設定されます。カレント・ディレクトリは、ファイル・システム・オブジェクトに保持されるため、そのボリュームを使用する全てのタスクに対して影響を与えます。</p>
</div>
+1 -1
View File
@@ -41,7 +41,7 @@ FRESULT f_chdrive (
<div class="para desc">
<h4>解説</h4>
<p>カレント・ドライブを変更します。システム起動時の初期値は0です。この設定はFatFsモジュールの静的変数に記録されるため、全てのタスクに対して影響を与えます。</p>
<p>カレント・ドライブを変更します。システム起動時の初期値はドライブ0です。この設定はFatFsモジュールの静的変数に記録されるため、全てのタスクに対して影響を与えます。</p>
</div>
+4 -4
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>disk_initialize</h2>
<p>ディスク・ドライブを初期化します。</p>
<p>ストレージ・デバイスを初期化します。</p>
<pre>
DSTATUS disk_initialize (
BYTE <span class="arg">pdrv</span> <span class="c">/* [IN] 物理ドライブ番号 */</span>
@@ -25,7 +25,7 @@ DSTATUS disk_initialize (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>初期化する物理ドライブ番号(0-9)が指定されます。</dd>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。</dd>
</dl>
</div>
@@ -37,8 +37,8 @@ DSTATUS disk_initialize (
<div class="para desc">
<h4>解説</h4>
<p>ディスク・ドライブを初期化します。関数が成功すると、戻り値の<tt>STA_NOINIT</tt>フラグがクリアされます。</p>
<p><em>FatFsを使用中はアプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊されます。エラー等により再初期化が必要なときは、<tt>f_mount()</tt>を使用してください。</em>FatFsモジュールは、自動マウント動作により、必要に応じてこの関数を呼び出します。</p>
<p>ストレージ・デバイスを初期化し、データの読み書きなど全ての動作が可能な状態にします。関数が成功すると、戻り値の<tt>STA_NOINIT</tt>フラグがクリアされます。</p>
<p><em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。エラー等により再初期化が必要なときは、<tt>f_mount()</tt>を使用してください。</em>FatFsモジュールは、自動マウント動作により、必要に応じてこの関数を呼び出します。</p>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
+35 -8
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>disk_ioctl</h2>
<p>セクタの読み書き以外のディスク・ドライブ自体に対する様々な制御をます。</p>
<p>一般的なデータ読み書き以外のストレージ・デバイス自体に対する様々な制御を行います。</p>
<pre>
DRESULT disk_ioctl (
BYTE <span class="arg">pdrv</span>, <span class="c">/* [IN] 物理ドライブ番号 */</span>
@@ -27,11 +27,11 @@ DRESULT disk_ioctl (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>物理ドライブ番号(0-9)が指定されます。</dd>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。</dd>
<dt>cmd</dt>
<dd>制御コマンド・コードが指定されます。</dd>
<dt>buff</dt>
<dd>制御コマンドに依存したパラメータを授受するバッファを指すポインタが指定されます。ータの授受のないコマンドの場合は、値に意味はありません。</dd>
<dd>制御コマンドに依存したパラメータを授受するバッファを指すポインタが指定されます。パラメータの授受のないコマンドの場合は、値に意味はありません。</dd>
</dl>
</div>
@@ -51,15 +51,42 @@ DRESULT disk_ioctl (
<div class="para desc">
<h4>解説</h4>
<p>物理ドライブの種類によりサポートされるコマンドは異なりますが、FatFsモジュールは、次の汎用コマンドのみ使用し、特定のハードウェアに依存した制御は行いません。</p>
<p>ストレージ・デバイスの種類によりサポートされるコマンドは異なりますが、FatFsモジュール自体は、次の汎用コマンドのみ使用し、特定のデバイスに依存した制御は行いません。</p>
<table class="lst">
<caption>標準ioctlコマンド</caption>
<tr><th>コマンド</th><th>解説</th></tr>
<tr><td>CTRL_SYNC</td><td>ドライブ内のデータ書き込み処理完了待ち。ライト・バック・キャッシュなどが存在する場合は、書き込まれていないデータを即時書き戻します。リード・オンリー構成では使用されません。</td></tr>
<tr><td>GET_SECTOR_COUNT</td><td><tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にドライブ上の総セクタ数を返します。<tt>f_mkfs()</tt>内で呼び出され、作成するボリュームのサイズを決定するために使用されます。</td></tr>
<tr><td>GET_SECTOR_SIZE</td><td><tt class="arg">buff</tt>の指す<tt>WORD</tt>型変数にドライブのセクタ・サイズを返します。有効値は512、1024、2048または4096です。セクタ・サイズ固定構成(<tt>_MAX_SS ==_MIN_SS</tt>)のときはこのコマンドは使われることはなく、そのセクタ・サイズで動作しなければなりません。</td></tr>
<tr><td>CTRL_SYNC</td><td>ストレージ・デバイスのデータ書き込み処理完了させます。ライト・バック・キャッシュなどが存在する場合は、書き込まれていないデータを即時書き込みます。メディア上への書き込みがそれぞれ<tt>disk_write()</tt>の内で完了する場合は、このコマンドに対してすることはありません。</td></tr>
<tr><td>GET_SECTOR_COUNT</td><td><tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にドライブ上の総セクタ数を返します。<tt>f_mkfs()</tt>および<tt>f_fdisk()</tt>内から呼び出され、作成するボリュームのサイズを決定するために使用されます。</td></tr>
<tr><td>GET_SECTOR_SIZE</td><td><tt class="arg">buff</tt>の指す<tt>WORD</tt>型変数にドライブのセクタ・サイズを返します。有効値は512、1024、2048または4096です。セクタ・サイズ固定構成(<tt>_MAX_SS ==_MIN_SS</tt>)のときはこのコマンドは使われることはなく、常にそのセクタ・サイズで動作しなければなりません。</td></tr>
<tr><td>GET_BLOCK_SIZE</td><td><tt class="arg">buff</tt>の指す<tt>DWORD</tt>型変数にフラッシュ・メモリの消去ブロック・サイズ(セクタ単位)を返します。1から32768の範囲で2の累乗の値でなければなりません。不明な場合またはフラッシュ・メモリ以外のメディアでは1を返します。<tt>f_mkfs()</tt>内でのみ使用され、ボリュームのデータ領域はこの境界にアライメントされます。</td></tr>
<tr><td>CTRL_ERASE_SECTOR</td><td>フラッシュ・メモリ上の指定領域の消去。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型配列には消去する領域 {開始セクタ,終了セクタ} を指定して呼び出されます。<tt>_USE_ERASE</tt>が1のとき、クラスタが解放されるときに呼び出されます。これは、ATAコマンド・セットのTrimコマンドと等価で、この機能をサポートしない場合は何もする必要はありません。また、戻り値はチェックされず、消去が完全に行われなかったとしてもFatFsの動作には影響ありません。</td></tr>
<tr><td>CTRL_ERASE_SECTOR</td><td>フラッシュ・メモリ上の領域の明示的消去。<tt class="arg">buff</tt>の指す<tt>DWORD</tt>型配列には消去する領域 {開始セクタ,終了セクタ} を指定して呼び出されます。<tt>_USE_ERASE</tt>が1のとき、クラスタが解放されるときに呼び出されます。これは、ATAコマンド・セットのTrimコマンドと等価で、この機能をサポートしない場合は何もする必要はありません。また、戻り値はチェックされず、消去が完全に行われなかったとしてもFatFsの動作には影響ありません。</td></tr>
</table>
<p>FatFs自体はデバイス依存コマンドやユーザ定義コマンドは一切使用しませんが、アプリケーションから何らかのデバイス制御が行えると便利なことがあります。アプリケーション上で標準以外の制御が必要なときは、必要に応じてユーザ定義コマンドを追加して利用するとよいでしょう。次にコマンドの例を示します。</p>
<table class="lst">
<caption>ユーザ定義ioctlコマンドの例</caption>
<tr><th>コマンド</th><th>解説</th></tr>
<tr><td>CTRL_FORMAT</td><td>メディアの物理フォーマットを行います。<tt class="arg">buff</tt>はNULLでないとき、進行表示のためのコールバック関数のアドレスを示します。</td></tr>
<tr><td>CTRL_POWER_IDLE</td><td>デバイスをアイドル状態にします。通常の読み書き要求でアクティブ状態に戻るなら、<tt>STA_NOINIT</tt>フラグをセットする必要はありません。</td></tr>
<tr><td>CTRL_POWER_OFF</td><td>デバイスをシャットダウン状態にします。<tt>STA_NOINIT</tt>はセットされます。デバイスは<tt>disk_initialize()</tt>でアクティブ状態に戻ります。</td></tr>
<tr><td>CTRL_LOCK</td><td>ユーザによるメディアの取り出しを禁止します。</td></tr>
<tr><td>CTRL_UNLOCK</td><td>ユーザによるメディアの取り出しを許可します。</td></tr>
<tr><td>CTRL_EJECT</td><td>メディアを排出します。完了後、<tt>STA_NOINIT</tt><tt>STA_NODISK</tt>フラグはセットされます。</td></tr>
<tr><td>MMC_GET_TYPE</td><td>カード・タイプを示すフラグ(b0:MMCv3, b1:SDv1, b2:SDv2+, b3:LBA)を<tt class="arg">buff</tt>の示す<tt>BYTE</tt>変数に読み出します。(MMC/SDカード専用)</td></tr>
<tr><td>MMC_GET_CSD</td><td>CSDレジスタの内容を<tt class="arg">buff</tt>の示す16バイトのバッファに読み出します。(MMC/SDカード専用)</td></tr>
<tr><td>MMC_GET_CID</td><td>CIDレジスタの内容を<tt class="arg">buff</tt>の示す16バイトのバッファに読み出します。(MMC/SDカード専用)</td></tr>
<tr><td>MMC_GET_OCR</td><td>OCRレジスタの内容を<tt class="arg">buff</tt>の示す4バイトのバッファに読み出します。(MMC/SDカード専用)</td></tr>
<tr><td>MMC_GET_SDSTAT</td><td>SD STATUSレジスタの内容を<tt class="arg">buff</tt>の示す64バイトのバッファに読み出します。(SDカード専用)</td></tr>
<tr><td>ATA_GET_REV</td><td>リビジョン・コードを<tt class="arg">buff</tt>の示す16バイトのバッファに読み出します。(ATA/CFカード専用)</td></tr>
<tr><td>ATA_GET_MODEL</td><td>モデル・コードを<tt class="arg">buff</tt>の示す40バイトのバッファに読み出します。(ATA/CFカード専用)</td></tr>
<tr><td>ATA_GET_SN</td><td>シリアル番号を<tt class="arg">buff</tt>の示す20バイトのバッファに読み出します。(ATA/CFカード専用)</td></tr>
</table>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p>リード・オンリー構成で、かつセクタ・サイズ固定構成のときは、この関数は必要とされません。</p>
</div>
+6 -4
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>disk_read</h2>
<p>ドライブからセクタを読み出します。</p>
<p>ストレージ・デバイスからデータを読み出します。</p>
<pre>
DRESULT disk_read (
BYTE <span class="arg">pdrv</span>, <span class="c">/* [IN] 物理ドライブ番号 */</span>
@@ -28,13 +28,13 @@ DRESULT disk_read (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>物理ドライブ番号(0-9)が指定されます。</dd>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。</dd>
<dt>buff</dt>
<dd>ディスクから読み出したデータを格納する<em>バイト配列</em>で、読み出されるバイト数分のサイズが必要です。</dd>
<dd>ストレージ・デバイスから読み出したデータを格納する<em>バイト配列</em>が指定されます。</dd>
<dt>sector</dt>
<dd>読み出しを開始するセクタ番号。LBAで指定されます。</dd>
<dt>count</dt>
<dd>読み出すセクタ数。 1~128の範囲の値で指定されます。一般的に、複数セクタの転送要求はデバイスに対して可能な限りマルチ・セクタ転送しなければなりません。複数のシングル・セクタ読み出しに分解した場合、スループットが低下することがあります。</dd>
<dd>読み出すセクタ数。FatFsからの呼び出しでは1~128の範囲に限られます。</dd>
</dl>
</div>
@@ -62,6 +62,8 @@ DRESULT disk_read (
<li><tt>f_read()</tt>において、セクタ全体を含む転送を避ける - 直接転送が発生しない</li>
<li><tt>f_read(fp, buff, btr, &amp;br)</tt>において、<tt>(((UINT)buff &amp; 3) == (f_tell(fp) &amp; 3))</tt>を満足させる - <tt class="arg">buff</tt>のワード・アライメントが保証される</li>
</ul>
<p>一般的に、複数セクタの転送要求は、ストレージ・デバイスに対して可能な限りマルチ・セクタ転送しなければなりません。複数のシングル・セクタ読み出しに分解された場合、スループットが低下することがあります。</p>
</div>
<p class="foot"><a href="../00index_j.html">戻る</a></p>
+5 -5
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>disk_status</h2>
<p>ディスク・ドライブの状態を取得します。</p>
<p>ストレージ・デバイスの状態を取得します。</p>
<pre>
DSTATUS disk_status (
BYTE <span class="arg">pdrv</span> <span class="c">/* [IN] 物理ドライブ番号 */</span>
@@ -25,20 +25,20 @@ DSTATUS disk_status (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>ステータスを取得する物理ドライブ番号が指定されます。</dd>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。</dd>
</dl>
</div>
<div class="para ret">
<h4>戻り値</h4>
<p>物理ドライブの状態を次のフラグの組み合わせ値で返します。</p>
<p>ストレージ・デバイスの状態を次のフラグの組み合わせ値で返します。</p>
<dl class="ret">
<dt>STA_NOINIT</dt>
<dd>ドライブが初期化されていないことを示すフラグ。システム・リセットやメディアの取り外し等でセットされ、<tt>disk_initialize()</tt>の正常終了でクリア、失敗でセットされます。メディア交換は非同期に発生するイベントなので、過去にメディア交換があった場合もこのフラグに反映させる必要があります。FatFsモジュールは、このフラグを参照して自動マウント動作を行うかどうかを判断します。</dd>
<dd>デバイスが初期化されていないことを示すフラグ。システム・リセットやメディアの取り外し等でセットされ、<tt>disk_initialize()</tt>の正常終了でクリア、失敗でセットされます。メディア交換は非同期に発生するイベントなので、過去にメディア交換があった場合もこのフラグに反映させる必要があります。FatFsモジュールは、このフラグを参照して自動マウント動作を行うかどうかを判断します。</dd>
<dt>STA_NODISK</dt>
<dd>メディアが存在しないことを示すフラグ。メディアが取り外されている間はセットされ、セットされている間はクリアされます。固定ディスクでは常にクリアします。なお、このフラグはFatFsモジュールでは参照されません。</dd>
<dt>STA_PROTECTED</dt>
<dt>STA_PROTECT</dt>
<dd>メディアがライト・プロテクトされていることを示すフラグ。ライト・プロテクト機能をサポートしないときは、常にクリアします。リード・オンリ構成では参照されません。</dd>
</dl>
</div>
+15 -7
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>disk_write</h2>
<p>ディスクにデータを書き込みます。</p>
<p>ストレージ・デバイスにデータを書き込みます。</p>
<pre>
DRESULT disk_write (
BYTE <span class="arg">pdrv</span>, <span class="c">/* [IN] 物理ドライブ番号 */</span>
@@ -28,13 +28,13 @@ DRESULT disk_write (
<h4>引数</h4>
<dl class="par">
<dt>pdrv</dt>
<dd>物理ドライブ番号(0-9)が指定されます。</dd>
<dd>対象のデバイスを示す物理ドライブ番号(0-9)が指定されます。</dd>
<dt>buff</dt>
<dd>ディスクに書き込む<em>バイト配列</em>が指定されます。<em>アドレスは常にワード・アライメントされているとは限りません</em></dd>
<dd>ストレージ・デバイスに書き込むセクタ・データが格納された<em>バイト配列</em>が指定されます。バイト数は、セクタ・サイズ*<tt class="arg">count</tt>となります</dd>
<dt>sector</dt>
<dd>書き込みを開始するセクタ番号。LBAで指定されます。</dd>
<dt>count</dt>
<dd>書き込むセクタ数。 1~128の範囲の値で指定されます。一般的に、複数セクタの転送要求はデバイスに対して可能な限りマルチ・セクタ転送しなければなりません。複数のシングル・セクタ書き込みに分解した場合、スループットが極端に低下することがあります。</dd>
<dd>書き込むセクタ数。FatFsからの呼び出しでは1~128の範囲に限られます。</dd>
</dl>
</div>
@@ -51,15 +51,23 @@ DRESULT disk_write (
<dt>RES_PARERR</dt>
<dd>パラメータが不正。</dd>
<dt>RES_NOTRDY</dt>
<dd>ドライブが動作可能状態ではない(初期化されていない)。</dd>
<dd>デバイスが動作可能状態ではない(初期化されていない)。</dd>
</dl>
</div>
<div class="para desc">
<h4>解説</h4>
<p>リード・オンリー構成ではこの関数は必要とされません</p>
<p><em>FatFsの使用中はアプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊されます。エラー等により再初期化が必要なときは、<tt>f_mount()</tt>を使用してください。</em>FatFsモジュールは、自動マウント動作により、必要に応じてこの関数を呼び出します。</p>
<p><tt class="arg">buff</tt>に指定されるアドレスは<em>常にワード・アライメントされているとは限りません</em>。詳細は、<a href="dread.html"><tt>disk_read()</tt></a>の解説を参照してください</p>
<p>一般的に、複数セクタの転送要求は、デバイスに対して可能な限りマルチ・セクタ転送しなければなりません。複数のシングル・セクタ書き込みに分解された場合、スループットが著しく低下することがあります。</p>
<p>FatFsはディスク関数が遅延書き込み機能を持つことも想定しています。この関数から戻るとき、デバイスが書き込み中とかキャッシュに書き込まれただけなど、必ずしもデータの書き込みが完了している必要はありません。ただし、<tt class="arg">buff</tt>のデータは、この関数から戻ると無効となります。書き込み完了の要求は、<tt><a href="dioctl.html">disk_ioctl()</a></tt><tt>CTRL_SYNC</tt>コマンドによって行われます。このような遅延書き込み機能が実装された場合、スループットをさらに向上させることができます。</p>
<p><em>アプリケーションからはこの関数を呼び出してはなりません。さもないと、FATボリュームが破壊される可能性があります。</em></p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p>リード・オンリー構成(<tt>_FS_READONLY == 1</tt>)ではこの関数は必要とされません。</p>
</div>
+14 -8
View File
@@ -22,27 +22,33 @@ DWORD get_fattime (void);
<div class="para ret">
<h4>戻り値</h4>
<p>現在のローカル・タイム<tt>DWORD</tt>値にパックされて返されます。ビット・フィールドは次に示すようになります。</p>
<p>現在のローカル・タイム<tt>DWORD</tt>値にパックして返します。ビット・フィールドは次に示すようになります。</p>
<dl>
<dt>bit31:25</dt>
<dd>1980年を起点とした年 0..127 で入ります</dd>
<dd>1980年を起点とした年 0..127 でセット</dd>
<dt>bit24:21</dt>
<dd> 1..12 の値で入ります</dd>
<dd> 1..12 の値でセット</dd>
<dt>bit20:16</dt>
<dd> 1..31 の値で入ります</dd>
<dd> 1..31 の値でセット</dd>
<dt>bit15:11</dt>
<dd> 0..23 の値で入ります</dd>
<dd> 0..23 の値でセット</dd>
<dt>bit10:5</dt>
<dd> 0..59 の値で入ります</dd>
<dd> 0..59 の値でセット</dd>
<dt>bit4:0</dt>
<dd>秒/2 0..29 の値で入ります。</dd>
<dd>秒/2 0..29 の値でセット</dd>
</dl>
</div>
<div class="para desc">
<h4>解説</h4>
<p>RTCをサポートしないシステムでも、何らかの日付として有効な値を返さなければなりません。0を返した場合、そのファイルは日付を持ちません。リード・オンリー構成ではこの関数は必要とされません</p>
<p>RTCをサポートしないシステムでも、ダミーとして何らかの日付として有効な値を返すべきです。0などを返した場合、そのファイルのタイムスタンプは無効になります</p>
</div>
<div class="para comp">
<h4>対応情報</h4>
<p>リード・オンリー構成(<tt>_FS_READONLY == 1</tt>)ではこの関数は必要とされません。</p>
</div>
+2 -2
View File
@@ -39,7 +39,7 @@
<p><br></p>
<div class="para" id="uni">
<h3>Unicode API</h3>
<p>ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、<tt>TCHAR</tt>で定義されていますが、これは通常は<tt>char</tt>のエリアスになっています。そして、<tt>_CODE_PAGE</tt>で指定されるANSI/OEMコード(SBCSまたはDBCS)の文字列として扱われます。ファイル名入出力をUnicodeとする構成(<tt>_LFN_UNICODE == 1</tt>)にしたときは、<tt>TCHAR</tt>はワイド文字(<tt>WCHAR, unsigned short</tt>)に切り替わり、パス名の入出力にUnicodeを使用するようになります。これによりLFN規格に完全対応となり、ANSI/OEMコードにない文字(たとえば ✝☪✡☸☭など)も使用できます。この設定は文字列入出力関数のデータ型とエンコーディングにも影響を与えます。リテラル文字列を定義するとき、次に示すように<tt>_T(s)</tt>および<tt>_TEXT(s)</tt>マクロを使ってANSI/OEMとUnicodeを自動切り替えすることができます。</p>
<p>ファイル関数の入出力のうちファイル名やパス名を指定する引数の型は、<tt>TCHAR</tt>で定義されていますが、これは通常は<tt>char</tt>のエリアスになっています。そして、<tt>_CODE_PAGE</tt>で指定されるANSI/OEMコード(SBCSまたはDBCS)の文字列として扱われます。ファイル名入出力をUnicodeとする構成(<tt>_LFN_UNICODE == 1</tt>)にしたときは、<tt>TCHAR</tt>はワイド文字(<tt>WCHAR, unsigned short</tt>)に切り替わり、パス名の入出力にUnicodeを使用するようになります。これによりLFN規格に完全対応となり、ANSI/OEMコードにない文字(たとえば ✝☪✡☸☭など)も使用できます。この設定は文字列入出力関数のデータ型とファイル上のエンコーディングにも影響を与えます。リテラル文字列を定義するとき、次に示すように<tt>_T(s)</tt>および<tt>_TEXT(s)</tt>マクロを使ってANSI/OEMとUnicodeを自動切り替えすることができます。</p>
<pre>
f_open(fp, "filename.txt", FA_READ); <span class="c">/* ANSI/OEM専用コード */</span>
f_open(fp, L"filename.txt", FA_READ); <span class="c">/* Unicode専用コード */</span>
@@ -50,7 +50,7 @@
<p><br></p>
<div class="para" id="vol">
<h3>ボリューム管理</h3>
<p>デフォルトの構成では、それぞれの論理ドライブは同じ番号の物理ドライブに1:1で結びつけられていて、自動検出機能によりその物理ドライブ上の一つのFATボリュームがマウントされます。FATボリュームの検出は、セクタ0、第一区画、第二区画、第三区画、第四区画の順に行われます。</p>
<p>デフォルトの構成では、それぞれの論理ドライブは同じ番号の物理ドライブに1:1で結びつけられていて、自動検出機能によりその物理ドライブ上の一つのFATボリュームがマウントされます。FATボリュームの検出は、セクタ0、第一区画第四区画の順に行われます。</p>
<p><tt>_MULTI_PARTITION</tt>に1を指定すると、それぞれの論理ドライブに対して個別に物理ドライブ番号と区画を指定できるようになります。この構成では、論理ドライブと区画の対応を解決するためのテーブルを次に示すように定義する必要があります。</p>
<pre>
例:論理ドライブ0~2を物理ドライブ0(非リムーバブル)の3つの基本区画に割り当て、
+4 -4
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>f_getcwd</h2>
<p>カレント・ディレクトリを得ます</p>
<p>カレント・ディレクトリを得ます</p>
<pre>
FRESULT f_getcwd (
TCHAR* <span class="arg">buff</span>, <span class="c">/* [OUT] バッファ */</span>
@@ -26,9 +26,9 @@ FRESULT f_getcwd (
<h4>引数</h4>
<dl class="par">
<dt>buff</dt>
<dd>カレント・ディレクトリの文字列を格納するバッファ</dd>
<dd>カレント・ディレクトリのパス名文字列を格納するバッファ</dd>
<dt>len</dt>
<dd>TCHAR単位のバッファ・サイズ</dd>
<dd><tt>TCHAR</tt>単位のバッファ・サイズ</dd>
</dl>
</div>
@@ -50,7 +50,7 @@ FRESULT f_getcwd (
<div class="para desc">
<h4>解説</h4>
<p>カレント・ドライブのカレント・ディレクトリのフル・パス文字列を取得します。<tt>_VOLUMES</tt>が2以上のときは、論理ドライブ番号の付加されたフル・パス名となります。</p>
<p>カレント・ドライブのカレント・ディレクトリのフル・パス文字列を取得します。<tt>_VOLUMES</tt>が2以上のときは、論理ドライブ番号の付加されたパス名となります。</p>
</div>
+3 -3
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>f_getfree</h2>
<p>論理ドライブ上の未使用クラスタ数を取得します。</p>
<p>ボリューム上の空き領域のサイズを取得します。</p>
<pre>
FRESULT f_getfree (
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] 対象ドライブを指定します */</span>
@@ -29,7 +29,7 @@ FRESULT f_getfree (
<dt>path</dt>
<dd>調べる対象の論理ドライブを示す<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。ヌル文字列はカレント・ドライブを意味します。</dd>
<dt>nclst</dt>
<dd>空きクラスタ数を格納する<tt>DWORD</tt>変数へのポインタを指定します。</dd>
<dd>空きクラスタ数を格納する<tt>DWORD</tt>変数へのポインタを指定します。</dd>
<dt>fatfs</dt>
<dd>対象ドライブのファイル・システム・オブジェクトを指すポインタが返されます。</dd>
</dl>
@@ -53,7 +53,7 @@ FRESULT f_getfree (
<div class="para desc">
<h4>解説</h4>
<p>論理ドライブ上の空きクラスタ数を取得します。返されたファイル・システム・オブジェクトの<tt>csize</tt>メンバがクラスタあたりのセクタ数を示しているので、これを元に実際の空きサイズが計算できます。FAT32ボリュームにおいては、FSINFOが実際の状態と同期していない場合、不正確な空きサイズを返す可能性があります。この問題を避けるため、<tt>_FS_NOFSINFO</tt>オプションでFSINFOを無視して初回はフルFATスキャンをするように設定することもできます。</p>
<p>論理ドライブ上の空き領域のサイズをクラスタ単位で取得します。返されたファイル・システム・オブジェクトの<tt>csize</tt>メンバがクラスタあたりのセクタ数を示しているので、これを元にセクタ単位の空きサイズが計算できます。FAT32ボリュームにおいては、FSINFOの情報が実際の空きクラスタ数と同期していない場合、不正確なを返す可能性があります。この問題を避けるため、<tt>_FS_NOFSINFO</tt>オプションでマウント後の初回は必ずフルFATスキャンをするように構成することもできます。</p>
</div>
+5 -5
View File
@@ -17,8 +17,8 @@
<pre>
FRESULT f_getlabel (
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] 対象ドライブ */</span>
TCHAR* <span class="arg">name</span>, <span class="c">/* [OUT] ボリューム名を格納するバッファ */</span>
DWORD* <span class="arg">sn</span> <span class="c">/* [OUT] ボリューム・シリアル番号を格納する変数 */</span>
TCHAR* <span class="arg">label</span>, <span class="c">/* [OUT] ボリューム名を格納するバッファ */</span>
DWORD* <span class="arg">vsn</span> <span class="c">/* [OUT] ボリューム・シリアル番号を格納する変数 */</span>
);
</pre>
</div>
@@ -28,10 +28,10 @@ FRESULT f_getlabel (
<dl class="par">
<dt>path</dt>
<dd>対象となる論理ドライブの<a href="filename.html">パス名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。ヌル文字列の場合は、デフォルト・ドライブを指定したことになります。</dd>
<dt>name</dt>
<dt>label</dt>
<dd>ボリューム名を格納する配列へのポインタを指定します。少なくとも12要素のサイズが必要です。ボリューム名がない場合はヌル文字列が返されます。この情報が不要なときはヌル・ポインタを指定してください。</dd>
<dt>sn</dt>
<dd>ボリューム・シリアル番号を格納する<tt>DWORD</tt>変数へのポインタを指定します。この情報が不要なときはヌル・ポインタを指定してください。</dd>
<dt>vsn</dt>
<dd>ボリューム・シリアル番号を格納する<tt>DWORD</tt>変数へのポインタを指定します。この情報が不要なときはヌル・ポインタを指定してください。</dd>
</dl>
</div>
+3 -3
View File
@@ -38,14 +38,14 @@ TCHAR* f_gets (
<div class="para ret">
<h4>戻り値</h4>
<p>関数が成功すると<tt>buff</tt>が返されます。</p>
<p>関数が成功すると<tt class="arg">buff</tt>が返されます。</p>
</div>
<div class="para desc">
<h4>解説</h4>
<p>この関数は<a href="read.html"><tt>f_read()</tt></a>のラッパー関数です。読み出し動作は、最初の<tt>'\n'</tt>を読み込むか、ファイル終端に達するか、<tt>len - 1</tt>文字を読み出すまで続きます。読み込まれた文字列の終端には<tt>'\0'</tt>が付加されます。既にファイル終端で1文字も読み込まれなかったとき、または何らかのエラーが発生したときは関数は失敗しヌル・ポインタを返します。ファイル終端かエラーかは<tt>f_eof()</tt>,<tt>f_error()</tt>マクロで調べられます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<span class="arg">buff</span>はUTF-16文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で読み出します。</p>
<p>この関数は<a href="read.html"><tt>f_read()</tt></a>のラッパー関数です。読み出し動作は、最初の<tt>'\n'</tt>を読み込むか、ファイル終端に達するか、<tt class="arg">len</tt> - 1文字を読み出すまで続きます。読み込まれた文字列の終端には<tt>'\0'</tt>が付加されます。既にファイル終端で1文字も読み込まれなかったとき、または何らかのエラーが発生したときは関数は失敗しヌル・ポインタを返します。ファイル終端かエラーかは<tt>f_eof()</tt>,<tt>f_error()</tt>マクロで調べられます。</p>
<p>Unicode API構成(<tt>_LFN_UNICODE == 1</tt>)が選択されているときは、<tt class="arg">buff</tt>はUTF-16文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で読み出します。</p>
</div>
+5 -5
View File
@@ -31,7 +31,7 @@ FRESULT f_mkfs (
<dt>sfd</dt>
<dd>パーテーション形式。(0(FDISK) または 1(SFD))</dd>
<dt>au</dt>
<dd>クラスタ・サイズをバイト単位で指定します。対象ドライブのセクタ・サイズのn倍(n = 1~128で、2の累乗)でなければなりません。0を指定した場合、ボリュームのサイズに応じたデフォルトのクラスタ・サイズが選択されます。</dd>
<dd>クラスタ・サイズをバイト単位で指定します。値は対象ドライブのセクタ・サイズのn倍(n = 1~128で、2の累乗)でなければなりません。0などの無効値を指定した場合、ボリュームのサイズに応じたデフォルトのクラスタ・サイズが選択されます。</dd>
</dl>
</div>
@@ -49,10 +49,10 @@ FRESULT f_mkfs (
<div class="para desc">
<h4>説明</h4>
<p>物理ドライブ上にFATボリュームを作成します。FDISK形式が指定された場合は、物理ドライブ全体を占める基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。SFD形式では、FATボリューム物理ドライブの先頭セクタからベタで作成されます。</p>
<p>マルチパーテーション機能(<tt>_MULTI_PARTITION</tt>)により、指定された論理ドライブが特定の区画(1~4)に結び付けられている場合、その区画の中にFATボリュームが作成されます。この場合、<tt class="arg">sfd</tt>は無視され、また対応する物理ドライブはこれに先立ち、<tt>f_fdisk()</tt>または他のツールで適切に区画設定されている必要があります。</p>
<p>パーテーション形式には、FDISK形式とSFD形式の二通りあります。FDISK形式は、ハードディスク、MMC、SDC、CFC、U Diskなどで標準的に使用されます。FDISK形式では一台の物理ドライブ上に一つまたは複数の区画を作成することができます。管理情報はMBR(物理ドライブの先頭セクタ)に記録されます。SFD形式は単に何の分割も行わない形式で、ボリュームは物理ドライブの先頭セクタから開始します。SFD形式は、フロッピーディスク、マイクロドライブ、光学ディスク、およびその他スーパーフロッピーメディアで標準的に使用されています。</p>
<p>FATタイプ(FAT12/FAT16/FAT32)は、その論理ドライブ上の<em>クラスタ数によってのみ決定</em>される決まり[FAT仕様書より]になっていて、それ以外の要因はありません。したがって、どのFATタイプになるかはドライブ・サイズとクラスタ・サイズに依存します。クラスタ・サイズは大きくするほど性能が上がり、ディスク利用効率は落ちます。</p>
<p>物理ドライブ上にFATボリュームを作成します。FDISK形式が指定された場合は、物理ドライブ全体を占める基本区画(パーテーション)が作成され、その中にFATボリュームが作成されます。SFD形式では、FATボリューム物理ドライブの先頭セクタからベタで作成されます。</p>
<p>フォーマットする論理ドライブがマルチパーテーション機能(<tt>_MULTI_PARTITION</tt>)によって特定の区画(1~4)に結び付けられている場合、その区画の中にFATボリュームが作成されます。<tt class="arg">sfd</tt>は無視され、また対応する物理ドライブはこれに先立ち、<tt>f_fdisk()</tt>または他のツールで適切に区画設定されている必要があります。</p>
<p>パーテーション形式には、FDISK形式とSFD形式の二通りあります。FDISK形式は、ハードディスク、MMC、SDC、CFC、U Diskなどで標準的に使用されます。FDISK形式では一台の物理ドライブ上に一つまたは複数の区画を作成することができます。区画管理情報はMBR(物理ドライブの先頭セクタ)に記録されます。SFD形式は単に何の分割も行わない形式で、ボリュームは物理ドライブの先頭セクタから開始します。SFD形式は、フロッピーディスク、マイクロドライブ、光学ディスク、およびその他スーパーフロッピーメディアで標準的に使用されています。</p>
<p>FATタイプ(FAT12/FAT16/FAT32)は、そのボリューム上の<em>クラスタ数によってのみ決定</em>される決まり[FAT仕様書より]になっていて、それ以外の要因はありません。したがって、どのFATタイプになるかはボリューム・サイズとクラスタ・サイズに依存します。クラスタ・サイズは大きくするほど性能が上がります。</p>
<p>クラスタ数がFATタイプの境界に近くなるときは、<tt>FR_MKFS_ABORTED</tt>で関数が失敗する可能性があります。</p>
</div>
+4 -4
View File
@@ -16,7 +16,7 @@
<p>論理ドライブにファイル・システム・オブジェクトを登録・抹消します。</p>
<pre>
FRESULT f_mount (
FATFS* <span class="arg">fatfs</span>, <span class="c">/* [IN] ファイル・システム・オブジェクト */</span>
FATFS* <span class="arg">fs</span>, <span class="c">/* [IN] ファイル・システム・オブジェクト */</span>
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] 論理ドライブ番号 */</span>
BYTE <span class="arg">opt</span> <span class="c">/* [IN] オプション */</span>
);
@@ -26,7 +26,7 @@ FRESULT f_mount (
<div class="para arg">
<h4>引数</h4>
<dl class="par">
<dt>fatfs</dt>
<dt>fs</dt>
<dd>登録するファイル・システム・オブジェクトへのポインタ。</dd>
<dt>path</dt>
<dd>対象となる論理ドライブの<a href="filename.html">パス名</a>を示すヌル文字'\0'終端の文字列へのポインタを指定します。ドライブ番号を含まない場合は、デフォルト・ドライブを指定したことになります。</dd>
@@ -49,11 +49,11 @@ FRESULT f_mount (
<div class="para desc">
<h4>解説</h4>
<p>FatFsモジュールでは、それぞれの論理ドライブに<em>ファイル・システム・オブジェクト</em>というワーク・エリアが必要です。この関数は論理ドライブにファイル・システム・オブジェクトを登録したり抹消したりします。何らかのファイル関数を使用する前に、この関数でその論理ドライブのファイル・システム・オブジェクトを与えておかなければなりません。<tt class="arg">fatfs</tt>にヌル・ポインタを指定すると、その論理ドライブのファイル・システム・オブジェクトの登録は抹消されるだけです。登録抹消されたファイル・システム・オブジェクトのメモリは解放できます。操作対象の論理ドライブ上に開かれているファイルやディレクトリがあった場合、それらは全て無効になります。この関数の内部処理は次のような順に行われます。</p>
<p>FatFsモジュールでは、それぞれの論理ドライブに<em>ファイル・システム・オブジェクト</em>というワーク・エリアが必要です。この関数は論理ドライブにファイル・システム・オブジェクトを登録したり抹消したりします。何らかのファイル関数を使用する前に、この関数でその論理ドライブのファイル・システム・オブジェクトを与えておかなければなりません。<tt class="arg">fs</tt>にヌル・ポインタを指定すると、その論理ドライブのファイル・システム・オブジェクトの登録は抹消されるだけです。登録抹消されたファイル・システム・オブジェクトのメモリは解放できます。操作対象の論理ドライブ上に開かれているファイルやディレクトリがあった場合、それらは全て無効になります。この関数の内部処理は次のような順に行われます。</p>
<ol>
<li>対象の論理ドライブを<tt class="arg">path</tt>から得る。</li>
<li>既に登録されているファイル・システム・オブジェクトはクリアし、登録を解除する。</li>
<li><tt class="arg">fatfs</tt>が有効なポインタのときは、そのファイル・システム・オブジェクトをクリアし登録する。</li>
<li><tt class="arg">fs</tt>が有効なポインタのときは、そのファイル・システム・オブジェクトをクリアし登録する。</li>
<li>マウント動作が指定されているときは、それを実行する。</li>
</ol>
<p><tt class="arg">opt</tt>に0を指定すると、マウント動作(物理ドライブの初期化、FATボリュームの検索、BPBを解析しファイル・システム・オブジェクトを初期化)は行われず、関数は物理ドライブの状態に関わらず常に成功します。関数内では下位レイヤへのアクセスは発生せず、指定されたファイル・システム・オブジェクトをクリア(無効化)し、そのアドレスを内部配列に登録するだけです。単に登録済みのファイル・システム・オブジェクトをクリアする目的にも使えます。そして、続いてボリュームへのアクセスが行われたとき次のうちいずれかでも真の場合は、実際のマウント動作が行われます。</p>
+5 -5
View File
@@ -17,7 +17,7 @@
<pre>
FRESULT f_open (
FIL* <span class="arg">fp</span>, <span class="c">/* [OUT] 空のファイル・オブジェクト構造体へのポインタ */</span>
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] ファイルのフルパス名へのポインタ */</span>
const TCHAR* <span class="arg">path</span>, <span class="c">/* [IN] ファイル名へのポインタ */</span>
BYTE <span class="arg">mode</span> <span class="c">/* [IN] モードフラグ */</span>
);
</pre>
@@ -29,7 +29,7 @@ FRESULT f_open (
<dt>fp</dt>
<dd>新しく作成するファイル・オブジェクト構造体へのポインタを指定します。以降、そのファイルを閉じるまでこのファイル・オブジェクトを使用してファイル操作をします。</dd>
<dt>path</dt>
<dd>開く(または作成する)ファイルの <a href="filename.html">ファイル名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。</dd>
<dd>開くファイルの<a href="filename.html">ファイル名</a>を示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。</dd>
<dt>mode</dt>
<dd>ファイルのアクセス方法やオープン方法を決めるフラグです。このパラメータには次の組み合わせを指定します。<br>
<table class="lst">
@@ -103,15 +103,15 @@ int main (void)
f_mount(&amp;FatFs, "", 0);
<span class="c">/* テキスト・ファイルを開く */</span>
fr = f_open(&fil, "message.txt", FA_READ);
fr = f_open(&amp;fil, "message.txt", FA_READ);
if (fr) return (int)fr;
<span class="c">/* 1行ずつ読み出して表示 */</span>
while (f_gets(line, sizeof line, &fil))
while (f_gets(line, sizeof line, &amp;fil))
printf(line);
<span class="c">/* ファイルを閉じる */</span>
f_close(&fil);
f_close(&amp;fil);
return 0;
}
+10 -7
View File
@@ -56,8 +56,8 @@ int f_printf (
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt> 1または 2のとき使用可能になります。2の時は、出力に含まれる<tt>'\n'</tt><tt>"\r\n"</tt>に展開されてファイルに書き込まれます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<span class="arg">fmt</span>はUnicode文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能になります。2の時は、出力に含まれる<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<tt class="arg">fmt</tt>はUnicode文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
</div>
@@ -66,14 +66,17 @@ int f_printf (
<pre>
f_printf(&amp;fil, "%d", 1234); <span class="c">/* "1234" */</span>
f_printf(&amp;fil, "%6d,%3d%%", -200, 5); <span class="c">/* " -200, 5%" */</span>
f_printf(&amp;fil, "%-6u", 100); <span class="c">/* "100 " */</span>
f_printf(&amp;fil, "%ld", 12345678L); <span class="c">/* "12345678" */</span>
f_printf(&amp;fil, "%04x", 0xAB); <span class="c">/* "00ab" */</span>
f_printf(&amp;fil, "%ld", 12345L); <span class="c">/* "12345" */</span>
f_printf(&amp;fil, "%06d", 25); <span class="c">/* "000025" */</span>
f_printf(&amp;fil, "%06d", -25); <span class="c">/* "000-25" */</span>
f_printf(&amp;fil, "%-6d", 25); <span class="c">/* "25 " */</span>
f_printf(&amp;fil, "%u", -1); <span class="c">/* "65535" or "4294967295" */</span>
f_printf(&amp;fil, "%04x", 0xAB3); <span class="c">/* "0ab3" */</span>
f_printf(&amp;fil, "%08LX", 0x123ABCL); <span class="c">/* "00123ABC" */</span>
f_printf(&amp;fil, "%016b", 0x550F); <span class="c">/* "0101010100001111" */</span>
f_printf(&amp;fil, "%s", "String"); <span class="c">/* "String" */</span>
f_printf(&amp;fil, "%5s", "abc"); <span class="c">/* " abc" */</span>
f_printf(&amp;fil, "%-5s", "abc"); <span class="c">/* "abc " */</span>
f_printf(&amp;fil, "%8s", "abc"); <span class="c">/* " abc" */</span>
f_printf(&amp;fil, "%-8s", "abc"); <span class="c">/* "abc " */</span>
f_printf(&amp;fil, "%c", 'a'); <span class="c">/* "a" */</span>
f_printf(&amp;fil, "%f", 10.0); <span class="c">/* 浮動小数点は未サポート */</span>
</pre>
+2 -2
View File
@@ -36,7 +36,7 @@ int f_putc (
<div class="para ret">
<h4>戻り値</h4>
<p>文字が正常に書き込まれると書き込んだ文字数が返されます。ディスクが満杯またはエラーにより書き込まれなかったときは<tt>EOF (-1)</tt>が返されます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<span class="arg">chr</span>はUTF-16文字になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<tt class="arg">chr</tt>はUTF-16文字になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
</div>
@@ -48,7 +48,7 @@ int f_putc (
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が 1または 2のとき使用可能です。2を指定すると、<tt>'\n'</tt><tt>"\r\n"</tt>に展開されてファイルに書き込まれます。</p>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が 1または 2のとき使用可能です。2を指定すると、<tt>'\n'</tt><tt>'\r'+'\n'</tt>に展開されてファイルに書き込まれます。</p>
</div>
+2 -2
View File
@@ -36,7 +36,7 @@ int f_puts (
<div class="para ret">
<h4>戻り値</h4>
<p>文字列が正常に書き込まれると、書き込まれた文字数が返されます。ディスクが満杯またはエラーにより書き込みが中断されたときは<tt>EOF (-1)</tt>が返されます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<span class="arg">str</span>はUTF-16文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
<p>APIにUnicodeが選択(<tt>_LFN_UNICODE</tt>が1)されているときは、<tt class="arg">str</tt>はUTF-16文字列になりますが、ファイル上のエンコードは、<tt>_STRF_ENCODE</tt>オプションで選択できます。それ以外の時は無変換(1バイト/1文字)で書き込みます。</p>
</div>
@@ -48,7 +48,7 @@ int f_puts (
<div class="para comp">
<h4>対応情報</h4>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt> 1または 2のとき使用可能です。2を指定すると、文字列に含まれる<tt>'\n'</tt><tt>"\r\n"</tt>に展開されてファイルに書き込まれます。</p>
<p><tt>_FS_READONLY == 0</tt>で、且つ<tt>_USE_STRFUNC</tt>が1または2のとき使用可能です。2を指定すると、文字列に含まれる<tt>'\n'</tt><tt>'\r'+'\n'<tt>に展開されてファイルに書き込まれます。</p>
</div>
+11 -13
View File
@@ -17,15 +17,14 @@
<dt id="ok">FR_OK (0)</dt>
<dd>関数は成功した。</dd>
<dt id="de">FR_DISK_ERR</dt>
<dd>下位レイヤ(<tt>disk_read(), disk_write(), disk_ioctl()</tt>関数)で回復不能なエラーが発生した。</dd>
<dd>下位レイヤ(<tt>disk_read(), disk_write(), disk_ioctl()</tt>関数)で回復不能なエラーが発生した。<br>※開かれたファイルの操作においてこのエラーが発生すると、そのファイル・オブジェクトはアボート状態となり、クローズ以外のの操作ができなくなります。</dd>
<dt id="ie">FR_INT_ERR</dt>
<dd>内部処理の健全性に異常が検出された。原因としては次のようなことが考えられます。
<ul>
<li>ボリューム上のFAT構造にエラーがある。</li>
<li>スタック不足や他のタスク等によるワーク・エリア(ファイル・システム・オブジェクトやファイル・オブジェクト)の破壊。多くはこれが原因。</li>
<li>そのファイルオブジェクトでは過去に<tt>FR_DISK_ERR</tt>が発生している。</li>
<li>スタック不足や不正なメモリ操作等によるワーク・エリアの破壊。多くはこれが原因。</li>
</ul>
</dd>
※開かれたファイルの操作においてこのエラーが発生すると、そのファイル・オブジェクトはアボート状態となり、クローズ以外の操作ができなくなります。</dd>
<dt id="nr">FR_NOT_READY</dt>
<dd>物理ドライブが動作可能な状態にない。または、ドライブの初期化に失敗した。</dd>
<dt id="nf">FR_NO_FILE</dt>
@@ -40,20 +39,19 @@
<li>書き込み禁止属性(<tt>AM_RDO</tt>)を持つファイルを書き込みモードで開こうとした。</li>
<li>書き込み禁止属性を持つファイルやディレクトリを削除しようとした。</li>
<li>空でないディレクトリまたはカレント・ディレクトリを削除しようとした。</li>
<li><tt>FA_READ</tt>を付けずに開いたファイルに対して読み出しを行った。</li>
<li><tt>FA_WRITE</tt>を付けずに開いたファイルに対して変更操作を行った。</li>
<li>ディレクトリ・テーブルが満杯でファイルやディレクトリを作成できなかった。</li>
<li>ボリュームが満杯でディレクトリを作成できなかった。</li>
<li><tt>FA_READ</tt>フラグを付けずに開いたファイルに対して読み出しを行った。</li>
<li><tt>FA_WRITE</tt>フラグを付けずに開いたファイルに対して書き込みまたはそれに類する操作を行った。</li>
<li>ボリュームまたはディレクトリ・テーブルが満杯でファイルやディレクトリを作成できなかった。</li>
</ul>
</dd>
<dt id="ex">FR_EXIST</dt>
<dd>新しく作成しようとしたオブジェクトと同じ名前のオブジェクトが既に存在する。</dd>
<dt id="io">FR_INVALID_OBJECT</dt>
<dd>指定されたファイル・オブジェクトやディレクトリ・オブジェクトが無効(オープンされていない、既に閉じられた、破損しているなど)、またはヌル・ポインタが渡された。また、開かれたままのオブジェクトは、そボリュームのマウント動作により無効となります。</dd>
<dd>指定されたファイル・オブジェクトやディレクトリ・オブジェクトが無効(オープンされていない、既に閉じられた、破損しているなど)、またはヌル・ポインタが渡された。また、開かれたままのオブジェクトは、それの属するボリュームのマウント動作により無効となります。</dd>
<dt id="wp">FR_WRITE_PROTECTED</dt>
<dd>物理ドライブが書き込み禁止状態のとき、書き込み系の操作を行おうとした。</dd>
<dd>物理ドライブが書き込み禁止状態のとき、書き込みを伴う操作を行おうとした。</dd>
<dt id="id">FR_INVALID_DRIVE</dt>
<dd>パス名指定されたドライブ番号が無効、またはパス名にヌル・ポインタが渡された。(関連オプション: <tt>_VOLUMES</tt>)</dd>
<dd>パス名中に指定されたドライブ番号が無効、またはパス名にヌル・ポインタが渡された。(関連オプション: <tt>_VOLUMES</tt>)</dd>
<dt id="ne">FR_NOT_ENABLED</dt>
<dd>そのボリュームの操作に必要なワーク・エリア(ファイル・システム・オブジェクト構造体)が与えられていない。</dd>
<dt id="ns">FR_NO_FILESYSTEM</dt>
@@ -63,13 +61,13 @@
<ul>
<li>ボリュームが小さすぎる。</li>
<li>FATタイプの計算に矛盾が見つかった。クラスタ数がFATタイプの境界付近になるときに発生する場合があります。</li>
<li>論理ドライブに対応する区画が見つからなかった。(関連オプション: <tt>_MULTI_PARTITION</tt>)</li>
<li>その論理ドライブに対応する区画が見つからなかった。(関連オプション: <tt>_MULTI_PARTITION</tt>)</li>
</ul>
</dd>
<dt id="tm">FR_TIMEOUT</dt>
<dd><a href="appnote.html#reentrant">再入制御</a>による待ち時間が定義された時間を越えたため、関数は実行されなかった。(関連オプション: <tt>_TIMEOUT</tt>)</dd>
<dt id="lo">FR_LOCKED</dt>
<dd><a href="appnote.html#dup">多重アクセス排他機能</a>により、そのファイルに対して行おうとしたアクセスが拒否された。(関連オプション: <tt>_FS_LOCK</tt>)</dd>
<dd><a href="appnote.html#dup">多重アクセス排他機能</a>により、そのファイルやディレクトリに対して行おうとしたアクセスが拒否された。(関連オプション: <tt>_FS_LOCK</tt>)</dd>
<dt id="nc">FR_NOT_ENOUGH_CORE</dt>
<dd>メモリ不足による失敗。原因としては次のようなことが考えられます。
<ul>
+4 -3
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>f_readdir</h2>
<p>ディレクトリ項目を読み出します</p>
<p>ディレクトリ項目を読み出します</p>
<pre>
FRESULT f_readdir (
DIR* <span class="arg">dp</span>, <span class="c">/* [IN] ディレクトリ・ブジェクト構造体へのポインタ */</span>
@@ -49,8 +49,9 @@ FRESULT f_readdir (
<div class="para desc">
<h4>解説</h4>
<p>ディレクトリの項目(ファイルとディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fname[]</tt>メンバにヌル文字列が返されます。ドット・エントリ("."、"..")は、相対パスが有効なとき(<tt>_FS_RPATH &gt;= 1</tt>)にのみ現れます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。<tt class="arg">fno</tt>にヌル・ポインタを指定すると、そのディレクトリのリード・インデックスを先頭に巻き戻します。</p>
<p>LFN機能が有効な時は、<tt>f_readdir()</tt>関数の呼び出しに先立って<tt>FILINFO</tt>構造体の<tt>lfname</tt><tt>lfsize</tt>が有効な値で初期化されていなければなりません。<tt>lfname</tt>はLFNを格納するバッファで、<tt>lfsize</tt>はそのバッファの要素数です。LFNを読み出す必要がないときは、<tt>lfname</tt>にヌル・ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。</p>
<p>ディレクトリの項目(ファイルとディレクトリ)を順次読み出します。この関数を繰り返し実行することによりそのディレクトリの全ての項目を読み出すことができます。得られるファイル情報の詳細については <tt>FILINFO</tt>構造体を参照してください。全ての項目が読み出され、読み出す項目がもう無いときは、<tt>fname[]</tt>メンバにヌル文字列が返されます。<tt class="arg">fno</tt>にヌル・ポインタを指定すると、そのディレクトリのリード・インデックスを先頭に巻き戻します。また、この関数は次に示すように関連する構成オプションにより動作が変わります。</p>
<p>ドット・エントリ("."、"..")は、相対パスが有効なとき(<tt>_FS_RPATH &gt;= 1</tt>)にのみ出力に現れます。</p>
<p>LFN機能が有効な時は、この関数の呼び出しに先立って<tt>FILINFO</tt>構造体の<tt>lfname</tt><tt>lfsize</tt>が有効な値で初期化されていなければなりません。<tt>lfname</tt>はLFNを格納するバッファで、<tt>lfsize</tt>はそのバッファの要素数です。LFNを読み出す必要がないときは、<tt>lfname</tt>にヌル・ポインタをセットしてください。次の条件に一つでも該当する場合は、LFN格納バッファにヌル文字列が返されます。</p>
<ul>
<li>ディレクトリ項目にLFN情報が存在しない。</li>
<li>LFNの長さに対してLFN格納バッファまたはLFN操作バッファのサイズが不十分。</li>
+1 -1
View File
@@ -13,7 +13,7 @@
<div class="para func">
<h2>f_rename</h2>
<p>ファイルまたはサブ・ディレクトリの名前の変更または移動。</p>
<p>ファイルまたはサブ・ディレクトリの名前の変更または移動します</p>
<pre>
FRESULT f_rename (
const TCHAR* <span class="arg">old_name</span>, <span class="c">/* [IN] 古いオブジェクト名 */</span>
+2 -2
View File
@@ -28,8 +28,8 @@
UINT lockid; <span class="c">/* ロックID */</span>
<span class="k">#endif</span>
<span class="k">#if</span> _USE_LFN
WCHAR* lfn; <span class="c">/* LFNバッファへのポインタ */</span>
WORD lfn_idx; <span class="c">/* 最後にマッチしたLFNエントリの先頭インデックス (0xFFFF:無効) */</span>
WCHAR* lfn; <span class="c">/* LFNバッファへのポインタ (in/out) */</span>
WORD lfn_idx; <span class="c">/* LFNエントリの先頭インデックス (0xFFFF:無効) */</span>
<span class="k">#endif</span>
} DIR;
</pre>
+10 -10
View File
@@ -13,10 +13,10 @@
<div class="para func">
<h2>f_setlabel</h2>
<p>ボリューム・ラベルを書き込みます。</p>
<p>ボリュームにボリューム・ラベルを設定します。</p>
<pre>
FRESULT f_setlabel (
const TCHAR* <span class="arg">name</span> <span class="c">/* [IN] 設定するボリュームへのポインタ */</span>
const TCHAR* <span class="arg">label</span> <span class="c">/* [IN] 設定するボリューム・ラベルへのポインタ */</span>
);
</pre>
</div>
@@ -24,8 +24,8 @@ FRESULT f_setlabel (
<div class="para arg">
<h4>引数</h4>
<dl class="par">
<dt>name</dt>
<dd>設定するボリュームを示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。</dd>
<dt>label</dt>
<dd>設定するボリューム・ラベルを示すヌル文字<tt>'\0'</tt>終端の文字列へのポインタを指定します。</dd>
</dl>
</div>
@@ -49,11 +49,11 @@ FRESULT f_setlabel (
<div class="para desc">
<h4>解説</h4>
<p>文字列の先頭にドライブ番号を含む場合は、その論理ドライブに設定されます。含まない場合は、デフォルト・ドライブに設定されます。ボリュームを削除するときは、ヌル文字列を指定します。名前のフォーマットは、短いファイル名とほぼ同じですが、次の点が異なります。</p>
<p>文字列の先頭にドライブ番号を含む場合は、その論理ドライブに対して設定されます。含まない場合は、デフォルト・ドライブに設定されます。ボリューム・ラベルを削除するときは、ヌル文字列を指定します。ボリューム・ラベルのフォーマットは、ファイル名(SFN)とほぼ同じですが、次の点が異なります。</p>
<ul>
<li>ローカルコード換算で11バイト以下。</li>
<li>ローカル文字コード換算で11バイト以下。LFN拡張は適用されません。</li>
<li>ピリオドを含むことはできない。</li>
<li>任意の位置にスペースを置くことができる。ただし、最後尾スペースは除去される。</li>
<li>任意の位置にスペースを置くことができる。ただし、最後尾となるスペースは除去される。</li>
</ul>
</div>
@@ -66,13 +66,13 @@ FRESULT f_setlabel (
<div class="para use">
<h4>使用例</h4>
<pre>
<span class="c">/* デフォルト・ドライブにボリュームを設定 */</span>
<span class="c">/* デフォルト・ドライブにボリューム・ラベルを設定 */</span>
f_setlabel("DATA DISK");
<span class="c">/* ドライブ2にボリュームを設定 */</span>
<span class="c">/* ドライブ2にボリューム・ラベルを設定 */</span>
f_setlabel("2:DISK 3 OF 4");
<span class="c">/* ドライブ2のボリュームを削除 */</span>
<span class="c">/* ドライブ2のボリューム・ラベルを削除 */</span>
f_setlabel("2:");
</pre>
</div>
+2 -2
View File
@@ -13,7 +13,7 @@
<div class="para">
<h2>FATFS</h2>
<p><tt>FATFS</tt>構造体(ファイル・システム・オブジェクト)は、個々の論理ドライブのダイナミック・ワーク・エリアを保持し、<tt>f_mount()</tt>でFatFsモジュールに登録されます。初期化が行われるタイミングは、<tt>f_mount()</tt>またはメディア交換の後の最初のファイル・アクセスの時です。アプリケーションは、この構造体のメンバを書き換えてはなりません。</p>
<p><tt>FATFS</tt>構造体(ファイル・システム・オブジェクト)は、個々の論理ドライブのダイナミック・ワーク・エリアを保持し、<tt>f_mount()</tt>でFatFsモジュールに登録されます。初期化が行われるタイミングは、<tt>f_mount()</tt>(強制マウント指定)の実行またはメディア交換の後の最初のファイル・アクセスの時です。アプリケーションは、この構造体のメンバを書き換えてはなりません。</p>
<pre>
<span class="k">typedef</span> <span class="k">struct</span> {
@@ -25,7 +25,7 @@
BYTE fsi_flag; <span class="c">/* FSINFOフラグ (b7:Disabled, b0:Dirty)*/</span>
WORD id; <span class="c">/* ファイル・システム・マウントID */</span>
WORD n_rootdir; <span class="c">/* ルート・ディレクトリのエントリ数 (FAT12/16) */</span>
<span class="k">#if</span> _MAX_SS != 512
<span class="k">#if</span> _MAX_SS != _MIN_SS
WORD ssize; <span class="c">/* セクタ・サイズ (512, 1024, 2048 or 4096) */</span>
<span class="k">#endif</span>
<span class="k">#if</span> _FS_REENTRANT
+1 -1
View File
@@ -54,7 +54,7 @@ FRESULT f_stat (
<div class="para desc">
<h4>解説</h4>
<p>指定されたファイルまたはサブ・ディレクトリの存在を調べ、それ関する情報(サイズ、タイムスタンプおよび属性)を得ます。存在する場合は<tt>FR_OK</tt>が帰り、ファイル情報構造体にその情報がストアされます。存在しない場合は、<tt>FR_NO_FILE</tt>が帰ります。</p>
<p>指定されたファイルまたはサブ・ディレクトリの存在を調べます。存在しない場合は、<tt>FR_NO_FILE</tt>が帰ります。存在する場合は<tt>FR_OK</tt>が帰り、ファイル情報構造体にそれ関する情報(サイズ、タイムスタンプ、属性および短いファイル名)がストアされます。</p>
</div>
+1 -1
View File
@@ -46,7 +46,7 @@ FRESULT f_sync (
<div class="para desc">
<h4>解説</h4>
<p>この関数は<tt>f_close()</tt>と同じ処理を実行しますが、ファイルは引き続き開かれたままになり、読み書きを続行できます。ロギングなど、書き込みモードで長時間ファイルが開かれているアプリケーションにおいて、定期的または区切りの良いところでこの関数を使用することにより、不意の電源断やメディアの取り外しにより失われるデータを最小にすることができます。この背景については、<a href="appnote.html#critical">アプリケーション・ノート</a>も参照してください。</p>
<p>実際のところ、<tt>f_close()</tt>内ではこの関数を呼び出した後ファイル・オブジェクトを無効化しているだけなので、<tt>f_close()</tt>直前<tt>f_sync()</tt>は意味がありません</p>
<p>実際のところ、<tt>f_close()</tt>内ではこの関数を呼び出した後ファイル・オブジェクトを無効化しているだけなので、<tt>f_close()</tt>直前<tt>f_sync()</tt>を置くことは無意味です</p>
</div>
+4 -4
View File
@@ -54,11 +54,11 @@ FRESULT f_unlink (
<div class="para desc">
<h4>解説</h4>
<p>削除対象のオブジェクトが次の条件に当てはまる場合、そのアクセスは拒否(<tt>FR_DENIED</tt>または<tt>FR_LOCKED</tt>)され関数は失敗します。
<p>削除対象のオブジェクトが次の条件に当てはまる場合、そのアクセスは拒否され関数は失敗します。
<ul>
<li>リード・オンリー属性(<tt>AM_RDO</tt>)を持っている。</li>
<li>空でないサブ・ディレクトリまたはカレント・ディレクトリである。</li>
<li>開かれているファイルまたはサブ・ディレクトリである<a href="appnote.html#dup">多重アクセス制御</a>が有効なときは安全に拒否されますが、そうでないときは不正な操作となり、<em>FAT構造が破壊される可能性</em>があります。</li>
<li>リード・オンリー属性(<tt>AM_RDO</tt>)を持っている場合は、拒否(<tt>FR_DENIED</tt>)される</li>
<li>空でないサブ・ディレクトリまたはカレント・ディレクトリである場合は、拒否(<tt>FR_DENIED</tt>)される</li>
<li>開かれているファイルまたはサブ・ディレクトリである場合は、<a href="appnote.html#dup">多重アクセス制御</a>が有効な安全に拒否(<tt>FR_LOCKED</tt>)されますが、そうでないときは不正な操作となり、<em>FAT構造が破壊される可能性</em>があります。</li>
</ul>
</p>
</div>