# 構成オプション

FatFsには多くの構成オプションがあり、それぞれのプロジェクトの要求に応じて柔軟に機能を構成することができます。構成オプションは、`ffconf.h`に記述されます。

### 基本機能の設定

#### _FS_READONLY

0:リード/ライト or 1:リード オンリ。リード オンリ構成では、`f_write`、`f_sync`、`f_unlink`、`f_mkdir`、`f_chmod`、`f_rename`、`f_truncate`、`f_getfree`の基本API関数およびオプションの書き込み系API関数が削除されます。

#### _FS_MINIMIZE

基本API関数を段階的に削除します。

値 | 解説
--- | ---
0 | 全ての基本API関数が利用可能。
1 | `f_stat`、`f_getfree`、`f_unlink`、`f_mkdir`、`f_chmod`、`f_utime`、`f_truncate`、`f_rename`関数が削除される。
2 | 1に加え、`f_opendir`、`f_readdir`、`f_closedir`関数が削除される。
3 | 2に加え、`f_lseek`関数が削除される。

#### _USE_STRFUNC

文字列入出力API関数`f_gets`, `f_putc`, `f_puts` and `f_printf`の構成。

値 | 解説
--- | ---
0 | 文字列入出力API関数を使用しない。
1 | 文字列入出力API関数を使用する。データのLF-CRLF変換はしない。
2 | 文字列入出力API関数を使用する。データのLF-CRLF変換をする。

#### _USE_FIND

フィルタ付きディレクトリ読み出し機能の構成(0:無効 または 1:有効)。有効にすると、`f_findfirst`、`f_findnext`関数が利用可能になります。

#### _USE_MKFS

ボリューム作成機能の構成(0:無効 または 1:有効)。有効にすると`f_mkfs`関数が利用可能になります。

#### _USE_FASTSEEK

高速シーク機能の構成(0:無効 または 1:有効)。有効にすると、`f_lseek`、`f_read`、`f_write`関数の高速化モードが利用可能になります。詳しくは、こちらを参照してください。

#### _USE_LABEL

ボリューム ラベル操作機能の構成(0:無効 または 1:有効)。有効にすると、`f_getlabel`、`f_setlabel`関数が利用可能になります。

#### _USE_FORWARD

ストリーミング読み出し機能の構成(0:無効 または 1:有効)。これと`_FS_TINY`を有効にすると、`f_forward`関数が利用可能になります。

### 名前空間とロケールの設定

#### _CODE_PAGE

パス名等の文字列データのコード ページを指定します。不適切な設定は、ファイル オープン エラーの原因になる可能性があります。拡張文字が全く使われない場合は、どれを選んでも同じです。

値 | 解説
--- | ---
1 | ASCII (非LFN構成でのみ有効)
437 | U.S.
720 | Arabic
737 | Greek
771 | KBL
775 | Baltic
850 | Latin 1
852 | Latin 2
855 | Cyrillic
857 | Turkish
860 | Portuguese
861 | Icelandic
862 | Hebrew
863 | Canadian French
864 | Arabic
865 | Nordic
866 | Russian
869 | Greek 2
932 | 日本語 (DBCS)
936 | 簡体字中国語 (DBCS)
949 | 韓国語 (DBCS)
950 | 繁体字中国語 (DBCS)

#### _USE_LFN

LFN(長いファイル名)対応を設定します。LFN機能を有効にするときは、Unicode操作関数`option/unicode.c`をプロジェクトに加える必要があります。また、LFN操作バッファ(`(_MAX_LFN + 1) * 2`バイトを占有)を使用します。バッファをスタックに確保するときは、スタック オーバ フローに注意する必要があります。ヒープに確保するときは、メモリ操作関数、`ff_memalloc`と`ff_memfree`(`option/syscall.c`にサンプルあり)、をプロジェクトに加える必要があります。

値 | 解説
--- | ---
0 | LFN機能を使わない。8.3形式の名前のみ使用可能。
1 | LFN機能を使う。LFN操作バッファは静的に確保。常にスレッド セーフではない。
2 | LFN機能を使う。LFN操作バッファはスタックから確保。
3 | LFN機能を使う。LFN操作バッファはヒープから確保。

#### _MAX_LFN

LFN操作バッファのサイズを文字単位で指定(12～255)します。LFN機能が無効のときは意味を持ちません。

#### _LFN_UNICODE

ファイルAPI上におけるUnicode対応機能を設定します。非LFN構成のときは、0でなければなりません。LFN構成のときに1を選択すると、ファイルAPI上の文字列データ`TCHAR`型の定義が切り替わり、パス名等にUnicodeを使用するようになります。この機能は、文字列入出力関数にも影響します。詳しくは、こちらを参照してください。

#### _STRF_ENCODE

Unicode API構成のとき、文字列入出力関数、`f_gets`、`f_putc`、`f_puts`、`f_printf`、におけるファイル上のエンコーディングを指定します。非Unicode API構成のときは意味を持ちません。

値 | 解説
--- | ---
0 | ANSI/OEM
1 | UTF-16LE
2 | UTF-16BE
3 | UTF-8

#### _FS_RPATH

相対パス機能を設定します。この機能は、ディレクトリ読み出し関数の出力にも影響します。詳しくは、こちらを参照してください。

値 | 解説
--- | ---
0 | 相対パス機能を使わない。パス名は常にルート ディレクトリから辿る。
1 | 相対パス機能を使う。`f_chdir`、`f_chdrive`関数が利用可能になる。
2 | 1に加え、`f_getcwd`関数が利用可能になる。

### ボリューム/物理ドライブの設定

#### _VOLUMES

利用するボリューム(論理ドライブ)の数を1～9の範囲で設定します。

#### _STR_VOLUME_ID

文字列ボリュームIDの設定(0:無効 または 1:有効)。パス名中のボリュームIDに数字に加え任意の文字列も使用できるようにするオプションです。ボリュームID文字列は`_VOLUME_STRS`で定義します。

#### _VOLUME_STRS

ボリュームID文字列を定義します。`_VOLUMES`で設定された個数の文字列を`"RAM","SD","CF",...` のように挙列します。使用可能な文字はA～Zおよび0～9で、先頭の項目が論理ドライブ0に対応します。

#### _MULTI_PARTITION

マルチ区画機能の設定(0:無効 または 1:有効)。無効のときは、個々の論理ドライブは同じ番号の物理ドライブに1:1で対応し、それぞれの物理ドライブ中の最初の区画に結びつけられます。マルチ区画機能を有効にすると、論理ドライブはそれぞれ任意の物理ドライブの任意の区画に結びつけることができます。マッピングは、ユーザ定義の変換テーブル`VolToPart[]`によって行います。また、`f_fdisk`関数が利用可能になります。詳しくは、こちらを参照してください。

#### _MIN_SS、_MAX_SS

使用する物理ドライブのセクタ サイズ(データの読み書きの最小単位)を設定します。有効な値は、512、1024、2048、4096です。`_MIN_SS`は最小サイズ、`_MAX_SS`は最大サイズを設定します。メモリ カードやハードディスクでは、常に両方に512を設定しますが、オンボード メモリや一部の光学メディアでは大きな値を設定する必要があるかも知れません。`_MAX_SS > _MIN_SS`に設定したときは可変セクタ サイズ構成となり、`disk_ioctl`関数には`GET_SECTOR_SIZE`コマンドを実装する必要があります。

#### _USE_TRIM

ATA-TRIM機能の使用の設定(0:無効 または 1:有効)。この機能を有効にしたときは、`disk_ioctl`関数に`CTRL_TRIM`コマンドを実装するべきです。

#### _FS_NOFSINFO

FAT32ボリュームのFSINFOの使用の設定(0～3)。FAT32ボリュームで必ず正確な空き容量を取得する必要があるとき、設定値のビット0をセットすると`f_getfree`関数はFSINFOの情報を使わずに全FATスキャンを行って空き容量を得ます。ビット1は最終割り当てクラスタ番号の利用の制御です。

値 | 解説
--- | ---
bit0=0 | FSINFOの空きクラスタ情報が有効なときはそれを利用する。
bit0=1 | FSINFOの空きクラスタ情報を利用しない。
bit1=0 | FSINFOの最終割り当てクラスタ番号が有効なときはそれを利用する。
bit1=1 | FSINFOの最終割り当てクラスタ番号を利用しない。

### システムの設定

#### _FS_TINY

ファイル データ転送バッファの構成(0:ノーマル または 1:タイニ)。タイニ構成では、ファイル オブジェクト`FIL`内のプライベート セクタ バッファが削除され、`_MAX_SS`バイト小さくなります。ファイル データの転送には、代わりにファイル システム オブジェクト`FATFS`内のボリューム共有セクタ バッファが使われます。

#### _FS_NORTC

RTC機能の使用の設定(0:使用する または 1:使用しない)。システムがRTC(カレンダ時計)をサポートしない場合は、1をセットします。この場合、FatFsが変更を加えたオブジェクトのタイムスタンプはデフォルトの日時を持ちます。RTCが使用可能なときは、0を設定し、`get_fattime`関数をプロジェクトに加えます。リード オンリ構成ではこのオプションは意味を持ちません。

#### _NORTC_MON、_NORTC_MDAY、_NORTC_YEAR

デフォルト日時の設定。`_FS_NORTC`が1のとき、固定して与えられる日付を指定します。`_FS_NORTC`が0のとき、およびリード オンリ構成ではこれらのオプションは意味を持ちません。

#### _FS_LOCK

ファイル ロック機能の設定。このオプションは、開かれたオブジェクトに対する不正な操作の制御機能を設定します。リード オンリ構成では0に設定しなければなりません。なお、ファイル ロック機能はリエントランシーとは関係ありません。

値 | 解説
--- | ---
0 | ファイル ロック機能を使わない。ボリュームの破損を防ぐため、アプリケーションは不正なファイル操作を避けなければならない。
>0 | ファイル ロック機能を使う。数値は同時にオープンできるファイルやサブ ディレクトリの数を設定します。

#### _FS_REENTRANT

リエントランシーの設定(0:無効 または 1:有効)。このオプションは、FatFsモジュール自体のリエントランシー(スレッド セーフ)の設定をします。異なるボリュームに対するファイル アクセスはこのオプションに関係なく常にリエントラントで、`f_mount`、`f_mkfs`、`f_fdisk`などのボリューム操作関数はこのオプションに関係なく常にリエントラントではありません。同じボリュームに対するファイル アクセス(つまり、ファイル システム オブジェクトの排他使用)のみがこのオプションの制御下にあります。このオプションを有効にしたときは、同期関数である`ff_req_grant`、`ff_rel_grant`、`ff_del_syncobj`、`ff_cre_syncobj`をプロジェクトに追加する必要があります。サンプルが`option/syscall.c`にあります。

#### _FS_TIMEOUT

タイムアウト時間の設定。待ち合わせ時間が長いときに`FR_TIMEOUT`でファイル関数をアボートする時間を設定します。`_FS_REENTRANT`が0のときは意味を持ちません。

#### _SYNC_t

O/S定義の同期オブジェクトの型を設定します。例: `HANDLE`、`ID`、`OS_EVENT*`、`SemaphoreHandle_t`など。また、O/S機能のヘッダ ファイルを`ff.c`のスコープ内にインクルードする必要があります。`_FS_REENTRANT`が0のときは意味を持ちません。

#### _WORD_ACCESS

ボリューム上のワード データへのアクセス方法を設定します。唯一のプラットフォーム依存オプションです。

値 | 解説
--- | ---
0 | Byte-by-byteアクセス。全てのプラットフォームでコンパチブル。
1 | ワード アクセス。コード サイズが少し減るが、次の条件を共に満たしていない限り選択できない。 ・非アライン メモリ アクセスが常に全ての命令で使用可能。 ・メモリ上のバイト順がリトル エンディアン。

次にいくつかのプロセッサにおける許可された設定を示します。

       ARM7TDMI   0   *2          ColdFire   0    *1         V850E      0    *2
       Cortex-M3  0   *3          Z80        0/1             V850ES     0/1
       Cortex-M0  0   *2          x86        0/1             TLCS-870   0/1
       AVR        0/1             RX600(LE)  0/1             TLCS-900   0/1
       AVR32      0   *1          RL78       0    *2         R32C       0    *2
       PIC18      0/1             SH-2       0    *1         M16C       0/1
       PIC24      0   *2          H8S        0    *1         MSP430     0    *2
       PIC32      0   *1          H8/300H    0    *1         8051       0/1

       *1:ビッグ エンディアン
       *2:非アライン メモリ アクセス不可
       *3:いくつかのコンパイラがmem_cpy関数にLDM/STM命令を生成する

戻る