From 625f3adcbba82cea0ba8083f8c443b2b422db550 Mon Sep 17 00:00:00 2001 From: savelij13 Date: Thu, 11 Sep 2025 09:43:16 +0300 Subject: [PATCH] fatfs v0.08a Aug 16,2010: - Added f_getcwd(). (_FS_RPATH = 2) - Added sector erase feature. (_USE_ERASE) - Moved file lock semaphore table from fs object to the bss. - Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. - Fixed f_mkfs() creates wrong FAT32 volume. --- doc/00index_e.html | 50 +-- doc/00index_j.html | 22 +- doc/css_e.css | 4 +- doc/css_j.css | 4 +- doc/en/appnote.html | 137 ++++---- doc/en/chdir.html | 4 +- doc/en/chdrive.html | 4 +- doc/en/close.html | 2 +- doc/en/dinit.html | 4 +- doc/en/dioctl.html | 9 +- doc/en/dread.html | 4 +- doc/en/dwrite.html | 4 +- doc/en/filename.html | 25 +- doc/en/getfree.html | 2 +- doc/en/mkdir.html | 2 +- doc/en/mkfs.html | 3 +- doc/en/mount.html | 2 +- doc/en/open.html | 10 +- doc/en/rename.html | 4 +- doc/en/sfile.html | 2 +- doc/en/sfileinfo.html | 2 +- doc/en/truncate.html | 2 +- doc/en/unlink.html | 8 +- doc/en/utime.html | 2 +- doc/img/rwtest2.png | Bin 7525 -> 8153 bytes doc/ja/appnote.html | 146 +++++---- doc/ja/close.html | 2 +- doc/ja/dinit.html | 2 +- doc/ja/dioctl.html | 12 +- doc/ja/dread.html | 4 +- doc/ja/dwrite.html | 4 +- doc/ja/filename.html | 6 +- doc/ja/forward.html | 4 +- doc/ja/getfree.html | 2 +- doc/ja/lseek.html | 2 +- doc/ja/mkdir.html | 2 +- doc/ja/mkfs.html | 9 +- doc/ja/mount.html | 2 +- doc/ja/open.html | 18 +- doc/ja/readdir.html | 2 +- doc/ja/rename.html | 12 +- doc/ja/sfile.html | 6 +- doc/ja/stat.html | 2 +- doc/ja/truncate.html | 2 +- doc/ja/unlink.html | 6 +- doc/ja/utime.html | 2 +- doc/ja/write.html | 4 +- doc/updates.txt | 7 + src/00readme.txt | 10 +- src/diskio.c | 213 ------------- src/diskio.h | 51 +-- src/ff.c | 717 ++++++++++++++++++++++++++---------------- src/ff.h | 120 ++----- src/ffconf.h | 51 +-- src/option/ccsbcs.c | 2 +- 55 files changed, 865 insertions(+), 869 deletions(-) delete mode 100644 src/diskio.c diff --git a/doc/00index_e.html b/doc/00index_e.html index 56f6405..1927f46 100644 --- a/doc/00index_e.html +++ b/doc/00index_e.html @@ -4,15 +4,13 @@ - - -ELM - FAT File System Module +ELM - FatFs Generic File System Module -

FAT File System Module

+

FatFs Generic File System Module


@@ -28,7 +26,7 @@

Description

-

Renames an object and can also move it to other directory. The logical drive number is determined by old name, new name must not contain a logical drive number. Do not rename open objects.

+

Renames an object (file or directory) and can also move it to other directory. The logical drive number is determined by old name, new name must not contain a logical drive number. Do not rename open objects.

diff --git a/doc/en/sfile.html b/doc/en/sfile.html index 693391e..3df25d2 100644 --- a/doc/en/sfile.html +++ b/doc/en/sfile.html @@ -31,7 +31,7 @@ typedef struct { BYTE* dir_ptr; /* Ponter to the directory entry in the window */ #endif #if _USE_FASTSEEK - DWORD* cltbl; /* Pointer to the cluster link map table */ + DWORD* cltbl; /* Pointer to the cluster link map table (Nulled on file open) */ #endif #if _FS_SHARE UINT lockid; /* File lock ID */ diff --git a/doc/en/sfileinfo.html b/doc/en/sfileinfo.html index 1d972e6..26153c4 100644 --- a/doc/en/sfileinfo.html +++ b/doc/en/sfileinfo.html @@ -23,7 +23,7 @@ typedef struct { TCHAR fname[13]; /* Short file name (8.3 format) */ #if _USE_LFN TCHAR* lfname; /* Pointer to the LFN buffer */ - int lfsize; /* Size of LFN buffer [characters] */ + int lfsize; /* Size of the LFN buffer in unit of TCHAR */ #endif } FILINFO; diff --git a/doc/en/truncate.html b/doc/en/truncate.html index 9e6e9a4..d0cef9e 100644 --- a/doc/en/truncate.html +++ b/doc/en/truncate.html @@ -51,7 +51,7 @@ FRESULT f_truncate (

Description

-

The f_truncate function truncates the file size to the current file R/W point. When the file R/W pointer is already pointing end of the file, this function has no effect.

+

The f_truncate function truncates the file size to the current file read/write point. This function has no effect if the file read/write pointer is already pointing end of the file.

diff --git a/doc/en/unlink.html b/doc/en/unlink.html index bc5fee5..c5eaea7 100644 --- a/doc/en/unlink.html +++ b/doc/en/unlink.html @@ -13,7 +13,7 @@

f_unlink

-

The f_unlink removes an object.

+

The f_unlink function removes an object.

 FRESULT f_unlink (
   const TCHAR* FileName  /* Pointer to the object name */
@@ -45,7 +45,7 @@ FRESULT f_unlink (
 
The drive number is invalid.
FR_DENIED
The function was denied due to either of following reasons: -
  • The object has read-only attribute
  • The directory is not empty.
+
  • The object has read-only attribute
  • Not empty directory
  • Current directory
FR_NOT_READY
The disk drive cannot work due to no medium in the drive or any other reason.
FR_WRITE_PROTECTED
@@ -59,14 +59,14 @@ FRESULT f_unlink (
FR_NO_FILESYSTEM
There is no valid FAT volume on the drive.
FR_LOCKED
-
The function was rejected due to file shareing policy.
+
The function was rejected due to file shareing policy (_FS_SHARE).

Description

-

The f_unlink function removes an object. Do not remove open objects and current directory.

+

The f_unlink function removes an object. Do not remove open objects.

diff --git a/doc/en/utime.html b/doc/en/utime.html index a01d837..45bc306 100644 --- a/doc/en/utime.html +++ b/doc/en/utime.html @@ -86,7 +86,7 @@ FRESULT set_timestamp ( fno.fdate = (WORD)(((year - 1980) * 512U) | month * 32U | mday); fno.ftime = (WORD)(hour * 2048U | min * 32U | sec / 2U); - return f_utime(obj, &fno); + return f_utime(obj, &fno); } diff --git a/doc/img/rwtest2.png b/doc/img/rwtest2.png index aeb38be63a7d8f1142a2c94ac36e2afe71d487ab..41a8c1f55a8771e3877542515a037d976a1cdcd9 100644 GIT binary patch literal 8153 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 AM*si- literal 7525 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 bzZLPw*ZrD#HZT9~2hVF)%nd&o+

FatFs繝「繧ク繝・繝シ繝ォ 繧「繝励Μ繧ア繝シ繧キ繝ァ繝ウ繝サ繝弱シ繝

+
    +
  1. 繝昴シ繝繧」繝ウ繧ー縺ョ髫帙↓驟肴ョ縺吶∋縺阪%縺ィ
  2. +
  3. 髯千阜蛟、
  4. +
  5. 繝。繝「繝ェ菴ソ逕ィ驥
  6. +
  7. 繝「繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺ョ邵ョ蟆
  8. +
  9. 髟キ縺繝輔ぃ繧、繝ォ蜷
  10. +
  11. 譌・譛ャ隱槭ヵ繧。繧、繝ォ蜷阪ョ螟ァ譁蟄怜、画鋤
  12. +
  13. Unicode蜈・蜃コ蜉帙∈縺ョ蟇セ蠢
  14. +
  15. 繝ェ繧ィ繝ウ繝医Λ繝ウ繧キ繝シ
  16. +
  17. 螟夐阪ヵ繧。繧、繝ォ繝サ繧「繧ッ繧サ繧ケ
  18. +
  19. 蜉ケ邇逧縺ェ繝輔ぃ繧、繝ォ繝サ繧「繧ッ繧サ繧ケ
  20. +
  21. 繝輔Λ繝繧キ繝・繝サ繝。繝「繝ェ縺ョ迚ケ諤ァ縺ク縺ョ驟肴ョ
  22. +
  23. 繧ッ繝ェ繝√き繝ォ繝サ繧サ繧ッ繧キ繝ァ繝ウ
  24. +
  25. FatFs縺ョ繝ゥ繧、繧サ繝ウ繧ケ縺ォ縺、縺縺ヲ
  26. +

-
+

繝昴シ繝繧」繝ウ繧ー縺ョ髫帙↓驟肴ョ縺吶∋縺阪%縺ィ

+

遘サ讀阪ョ髫帙ョ蜑肴署譚。莉カ

FatFs繝「繧ク繝・繝シ繝ォ縺ッ遘サ讀肴ァ縺ォ髢「縺励※谺。縺ョ轤ケ繧貞燕謠舌→縺励※縺縺セ縺吶

  • 蜃ヲ逅邉サ縺ッANSI C貅匁侠縺ァ縺ゅk縺薙→縲
    -FatFs繝「繧ク繝・繝シ繝ォ縺ッANSI C貅匁侠縺ァ險倩ソー縺輔l縺ヲ縺繧九ョ縺ァ縲、NSI C貅匁侠縺ョ繧ウ繝ウ繝代う繝ゥ縺ェ繧臥音縺ォ蜃ヲ逅邉サ萓晏ュ倥↑轤ケ縺ッ縺ゅj縺セ縺帙s縲
  • +FatFs繝「繧ク繝・繝シ繝ォ縺ッANSI C(C89)貅匁侠縺ァ險倩ソー縺輔l縺ヲ縺繧九ョ縺ァ縲、NSI C縺ォ貅匁侠縺励◆縺セ縺ィ繧ゅ↑繧ウ繝ウ繝代う繝ゥ縺ェ繧臥音縺ォ蜃ヲ逅邉サ萓晏ュ倥↓縺ェ繧狗せ縺ッ縺ゅj縺セ縺帙s縲
  • char/short/long縺ョ繧オ繧、繧コ縺ッ縲√◎繧後◇繧8/16/32繝薙ャ繝医〒縲(nt縺ッ16縺セ縺溘ッ32繝薙ャ繝医〒縺ゅk縺薙→縲
    繧オ繧、繧コ繧呈守、コ縺吶k謨エ謨ー縺ョ蝙九′ integer.h 蜀縺ァ螳夂セゥ縺輔l縺ヲ縺縺セ縺吶よ紛謨ー縺ョ蝙九→繧オ繧、繧コ縺ォ髢「縺励※縺ッ縲√∪縺」縺ィ縺縺ェ蜃ヲ逅邉サ縺ェ繧牙撫鬘後↑縺縺ッ縺壹〒縺吶′縲∵里蟄倥ョ螳夂セゥ縺ィ陦晉ェ√@縺溷エ蜷医ッ繝ヲ繝シ繧カ縺ォ繧医▲縺ヲ隗」豎コ縺輔l縺ェ縺代l縺ー縺ェ繧翫∪縺帙s縲
-
- -
-

繝昴シ繝繧」繝ウ繧ー縺ョ縺励°縺

+

繝ヲ繝シ繧カ縺ョ菴懈舌☆繧矩未謨ー

蠢隕√↑縺ョ縺ッ FatFs繝「繧ク繝・繝シ繝ォ縺ョ隕∵アゅ☆繧九ョ繧」繧ケ繧ッ髢「謨ー繧堤畑諢上☆繧九%縺ィ縺縺代〒縲√◎繧御サ・螟悶↓縺吶k縺薙→縺ッ縺ゅj縺セ縺帙s縲よ里縺ォ蜍穂ス懊@縺ヲ縺繧九ョ繧」繧ケ繧ッ髢「謨ー縺後≠繧九↑繧峨◎縺ョ API繧 FatFs縺ォ蜷医o縺帙k縺縺代〒貂医∩縺セ縺吶′縲∫┌縺蝣エ蜷医ッ縺サ縺九°繧臥ァサ讀阪☆繧九°縲∵怙蛻昴°繧画嶌縺上°縺吶k蠢隕√′縺ゅj縺セ縺吶ょョ夂セゥ縺輔l縺ヲ縺繧句ィ縺ヲ縺ョ髢「謨ー縺悟クク縺ォ蠢隕√↑繧上¢縺ァ縺ッ縺ゅj縺セ縺帙s縲ゆセ九∴縺ー縲√Μ繝シ繝峨サ繧ェ繝ウ繝ェ繝シ讒区舌〒縺ッ譖ク縺崎セシ縺ソ邉サ髢「謨ー縺ッ蠢隕√≠繧翫∪縺帙s縲よャ。縺ョ陦ィ縺ォ讒区舌が繝励す繝ァ繝ウ縺ィ隕∵アゅ&繧後k髢「謨ー縺ョ蟇セ蠢懊r遉コ縺励∪縺吶

- + @@ -37,6 +50,7 @@ FatFs繝「繧ク繝・繝シ繝ォ縺ッANSI C貅匁侠縺ァ險倩ソー縺輔l縺ヲ縺繧九ョ縺ァ縲、NSI C貅匁侠 + @@ -49,7 +63,7 @@ FatFs繝「繧ク繝・繝シ繝ォ縺ッANSI C貅匁侠縺ァ險倩ソー縺輔l縺ヲ縺繧九ョ縺ァ縲、NSI C貅匁侠
繝ヲ繝シ繧カ菴懈宣未謨ー蠢隕√→縺ェ繧区擅莉カ蛯呵
disk_initialize蟶ク譎ffsample.zip (繧オ繝ウ繝励Ν)
縺昴ョ莉殆eb荳翫↓螟壽焚
disk_initialize蟶ク譎ffsample.zip (繧オ繝ウ繝励Ν)
縺昴ョ莉殆eb荳翫↓螟壽焚
disk_status蟶ク譎
disk_read蟶ク譎
disk_write_FS_READONLY == 0
disk_ioctl (GET_SECTOR_COUNT)_USE_MKFS == 1
disk_ioctl (GET_SECTOR_SIZE)_MAX_SS >= 1024
disk_ioctl (GET_BLOCK_SIZE)_USE_MKFS == 1
disk_ioctl (CTRL_ERASE_SECTOR)_USE_ERASE == 1
get_fattime_FS_READONLY == 0
ff_convert_USE_LFN >= 1option/cc*.c
ff_wtoupper_USE_LFN >= 1
-
+

髯千阜蛟、

  • FAT繧ソ繧、繝: FAT12, FAT16, FAT32縲
  • @@ -62,17 +76,17 @@ FatFs繝「繧ク繝・繝シ繝ォ縺ッANSI C貅匁侠縺ァ險倩ソー縺輔l縺ヲ縺繧九ョ縺ァ縲、NSI C貅匁侠
-
-

繝。繝「繝ェ菴ソ逕ィ驥 (R0.08)

+
+

繝。繝「繝ェ菴ソ逕ィ驥 (R0.08a)

谺。縺ョ陦ィ縺ォ縺縺上▽縺九ョ繧ソ繝シ繧イ繝繝医↓縺翫¢繧九Γ繝「繝ェ菴ソ逕ィ驥上ョ萓九r遉コ縺励∪縺吶ゅユ繧ケ繝域凾縺ョ讒区舌が繝励す繝ァ繝ウ縺ッ縺昴ョ荳九ョ騾壹j縺ァ縺吶よ焚蛟、縺ョ蜊倅ス阪ッ繝舌う繝医〒縲D縺ッ隲也炊繝懊Μ繝・繝シ繝謨ー縲F縺ッ蜷梧凾繧ェ繝シ繝励Φ繝サ繝輔ぃ繧、繝ォ謨ー繧堤、コ縺励∪縺吶ゅさ繝ウ繝代う繝ゥ縺ョ譛驕ゥ蛹悶が繝励す繝ァ繝ウ縺ッ繧ウ繝シ繝峨サ繧オ繧、繧コ縺ィ縺励※縺縺セ縺吶

- - - - + + + + @@ -94,41 +108,42 @@ _FS_SHARE 0 (Disable shareing control) -
+

繝「繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺ョ邵ョ蟆

谺。縺ョ陦ィ縺ッ讒区舌が繝励す繝ァ繝ウ縺ョ險ュ螳壼、縺ォ繧医j縺ゥ縺ョ讖溯ス縺悟炎髯、縺輔l繧九°繧堤、コ縺励∪縺吶

AVRH8/300HPIC24V850ESSH-2AARM7x86
CompilerWinAVR(gcc)CH38C30(gcc)CA850SHCWinARM(gcc)VC6
_WORD_ACCESS1001001
text (Full, R/W)12700106861137677308592105207545
text (Min, R/W)8386698073954930560066364923
text (Full, R/O)6012487452503556384846563450
text (Min, R/O)4384377439392684299634162664
text (Full, R/W)12646106861143077328752105607545
text (Min, R/W)8306698674134938557666804923
text (Full, R/O)5960487652503554380446883450
text (Min, R/O)4366377039392684294034522664
bssD*2 + 2D*4 + 2D*2 + 2D*4 + 2D*4 + 2D*4 + 2D*4 + 2
Work area
(_FS_TINY == 0)
D*560 +
F*544
D*560 +
F*550
D*560 +
F*544
D*560 +
F*550
D*560 +
F*550
D*560 +
F*550
D*560 +
F*550
Work area
(_FS_TINY == 1)
D*560 +
F*32
D*560 +
F*36
D*560 +
F*32
D*560 +
F*36
D*560 +
F*36
D*560 +
F*36
D*560 +
F*36
- - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_MKFS_USE_FORWARD
12310000
f_mount
f_open
f_close
f_read
f_writex
f_syncx
f_lseekx
f_opendirxx
f_readdirxx
f_statxxx
f_getfreexxxx
f_truncatexxxx
f_unlinkxxxx
f_mkdirxxxx
f_chmodxxxx
f_utimexxxx
f_renamexxxx
f_chdirx
f_chdrivex
f_mkfsxx
f_forwardx
f_putcxx
f_putsxx
f_printfxx
f_getsx
Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_MKFS_USE_FORWARD
012301010120101
f_mount
f_open
f_close
f_read
f_writex
f_syncx
f_lseekx
f_opendirxx
f_readdirxx
f_statxxx
f_getfreexxxx
f_truncatexxxx
f_unlinkxxxx
f_mkdirxxxx
f_chmodxxxx
f_utimexxxx
f_renamexxxx
f_chdirx
f_chdrivex
f_getcwdxx
f_mkfsxx
f_forwardx
f_putcxx
f_putsxx
f_printfxx
f_getsx
-
+

髟キ縺繝輔ぃ繧、繝ォ蜷

FatFs繝「繧ク繝・繝シ繝ォ縺ッR0.07縺九i髟キ縺繝輔ぃ繧、繝ォ蜷(LFN)繧偵し繝昴シ繝医@縺セ縺励◆縲ゅヵ繧。繧、繝ォ縺ォ莉倥¢繧峨l縺2縺、縺ョ逡ー縺ェ繧句錐蜑(遏ュ縺繝輔ぃ繝ォ蜷阪→髟キ縺繝輔ぃ繧、繝ォ蜷)縺ッ縲’_readdir髢「謨ー繧帝勁縺上ヵ繧。繧、繝ォ謫堺ス憺未謨ー縺ォ縺翫>縺ヲ騾城℃縺ァ縺吶LFN讖溯ス繧呈怏蜉ケ縺ォ縺吶k縺ォ縺ッ縲_USE_LFN繧1,2縺セ縺溘ッ3縺ォ險ュ螳壹@縲ゞnicode螟画鋤髢「謨ーff_convert(), ff_wtoupper()繧偵励Ο繧ク繧ァ繧ッ繝医↓霑ス蜉縺励∪縺吶ゅ%繧後i縺ョ髢「謨ー縺ッ縲option/cc*.c縺ォ蜷ォ縺セ繧後※縺縺セ縺吶LFN讖溯ス縺ッ縲∝刈縺医※縺ゅk遞句コヲ縺ョ繝ッ繝シ繧ッ繝サ繧ィ繝ェ繧「(LFN謫堺ス懊ヰ繝繝輔ぃ)繧貞ソ隕√→縺励∪縺吶ゅヰ繝繝輔ぃ髟キ縺ッ菴ソ逕ィ縺ァ縺阪k繝。繝「繝ェ縺ォ蠢懊§縺ヲ_MAX_LFN繧ェ繝励す繝ァ繝ウ縺ァ讒区舌&繧後k縺薙→縺後〒縺阪∪縺吶LFN縺ョ髟キ縺輔ッ譛螟ァ255譁蟄励↓驕斐☆繧九ョ縺ァ縲´FN螳悟ィ蟇セ蠢懊ョ縺溘a縺ォ縺ッ_MAX_LFN縺ッ255縺ォ險ュ螳壹&繧後k縺ケ縺阪〒縺吶ゆク弱∴繧峨l縺溘ヵ繧。繧、繝ォ蜷阪↓蟇セ縺励※繝舌ャ繝輔ぃ髟キ縺御ク崎カウ縺励◆蝣エ蜷医√ヵ繧。繧、繝ォ髢「謨ー縺ッFR_INVALID_NAME縺ァ螟ア謨励@縺セ縺吶

LFN讖溯ス繧偵Μ繧ィ繝ウ繝医Λ繝ウ繝域ァ区舌〒菴ソ逕ィ縺吶k蝣エ蜷医ッ縲_USE_LFN縺ッ2縺セ縺溘ッ3縺ォ險ュ螳壹&繧後↑縺代l縺ー縺ェ繧翫∪縺帙s縲ゅ%縺ョ蝣エ蜷医√ヵ繧。繧、繝ォ髢「謨ー縺ッ繝舌ャ繝輔ぃ繧偵せ繧ソ繝繧ッ繧繝偵シ繝励↓遒コ菫昴@縺セ縺吶ゅヰ繝繝輔ぃ繝サ繧オ繧、繧コ縺ッ縲(_MAX_LFN + 1) * 2繝舌う繝医↓縺ェ繧九ョ縺ァ縲√せ繧ソ繝繧ッ遲峨ョ繧オ繧、繧コ縺ッ縺昴l繧定諷ョ縺励◆蜊∝縺ェ繧オ繧、繧コ縺ァ縺ェ縺代l縺ー縺ェ繧翫∪縺帙s縲

@@ -141,37 +156,37 @@ _FS_SHARE 0 (Disable shareing control) 949(Korean)+139857 950(Big5)+111497 -

LFN繧呈怏蜉ケ縺ォ縺吶k縺ィ縲驕ク謚槭&繧後◆繧ウ繝シ繝峨サ繝壹シ繧ク縺ォ蠢懊§縺ヲ繝「繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺悟「怜、ァ縺輔l縺セ縺吶ょ承縺ョ陦ィ縺ォ蜷繧ウ繝シ繝峨サ繝壹シ繧ク縺ォ縺翫¢繧記FN繧呈怏蜉ケ縺ォ縺励◆縺ィ縺阪ョ繝「繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺ョ驕輔>繧堤、コ縺励∪縺吶らァ√◆縺。譌・譛ャ莠コ縲∽クュ蝗ス莠コ縺翫h縺ウ髻灘嵜莠コ縺ッ謨ー荳縺ョ譁蟄励r謖√■縺セ縺吶ゆク榊ケク縺ェ縺薙→縺ォ縲√◎繧後ッ蟾ィ螟ァ縺ェOEMシ攻nicode逶ク莠貞、画鋤繝繝シ繝悶Ν繧定ヲ∵アゅ@縲√Δ繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺ッ蜉逧縺ォ蠅怜、ァ縺輔l縺セ縺吶ゅ◎縺ョ邨先棡縲´FN繧呈怏蜉ケ縺ォ縺励◆FatFs繝「繧ク繝・繝シ繝ォ縺ッ縲、VR繧貞性繧谿縺ゥ縺ョ8繝薙ャ繝医サ繝槭う繧ウ繝ウ縺ォ繧、繝ウ繝励Μ繝。繝ウ繝医&繧後k縺薙→縺後〒縺阪∪縺帙s縲縺薙l縺ッ髟キ縺髢鍋ァ√′LFN繧偵う繝ウ繝励Μ繝。繝ウ繝医☆繧九%縺ィ縺ォ闊亥袖繧呈戟縺」縺ヲ縺薙↑縺九▲縺溽炊逕ア縺ァ縺吶

-

豕ィ: FAT繝輔ぃ繧、繝ォ繝サ繧キ繧ケ繝繝荳翫ョLFN讖溯ス縺ッ繝槭う繧ッ繝ュ繧ス繝輔ヨ遉セ縺ョ迚ケ險ア縺ァ縺吶ょ膚逕ィ陬ス蜩√〒縺昴l繧呈怏蜉ケ縺ォ縺吶k縺ィ縺阪ッ縲∵怙邨ゆサ募髄蝨ー縺ォ繧医▲縺ヲ縺ッ繝ゥ繧、繧サ繝ウ繧ケ縺悟ソ隕√°繧ら衍繧後∪縺帙s縲

+

LFN讖溯ス縺ョ荳頑焔縺ェ菴ソ縺譁ケ縺ッ縲√◎繧後r菴ソ繧上↑縺縺ィ縺縺縺薙→縺ァ縺吶ょョ滄圀縲∫オ縺ソ霎シ縺ソ逕ィ騾斐〒縺ッLFN讖溯ス縺後←縺縺励※繧ょソ隕√↓縺ェ繧九→縺縺縺薙→縺ッ縺サ縺ィ繧薙←辟。縺縺ッ縺壹〒縺吶LFN繧呈怏蜉ケ縺ォ縺吶k縺ィ縲驕ク謚槭&繧後◆繧ウ繝シ繝峨サ繝壹シ繧ク縺ォ蠢懊§縺ヲ繝「繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺悟「怜、ァ縺輔l縺セ縺吶ょ承縺ョ陦ィ縺ォ蜷繧ウ繝シ繝峨サ繝壹シ繧ク縺ォ縺翫¢繧記FN繧呈怏蜉ケ縺ォ縺励◆縺ィ縺阪ョ繝「繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺ョ驕輔>繧堤、コ縺励∪縺吶らァ√◆縺。譌・譛ャ莠コ縲∽クュ蝗ス莠コ縺翫h縺ウ髻灘嵜莠コ縺ッ謨ー荳縺ョ譁蟄励r謖√■縺セ縺吶ゆク榊ケク縺ェ縺薙→縺ォ縲√◎繧後ッ蟾ィ螟ァ縺ェOEMシ攻nicode逶ク莠貞、画鋤繝繝シ繝悶Ν繧定ヲ∵アゅ@縲√Δ繧ク繝・繝シ繝ォ繝サ繧オ繧、繧コ縺ッ蜉逧縺ォ蠅怜、ァ縺輔l縺セ縺吶ゅ◎縺ョ邨先棡縲´FN繧呈怏蜉ケ縺ォ縺励◆FatFs繝「繧ク繝・繝シ繝ォ縺ッ縲、VR繧貞性繧谿縺ゥ縺ョ8繝薙ャ繝医サ繝槭う繧ウ繝ウ縺ォ繧、繝ウ繝励Μ繝。繝ウ繝医&繧後k縺薙→縺後〒縺阪∪縺帙s縲縺薙l縺ッ髟キ縺髢鍋ァ√′LFN繧偵う繝ウ繝励Μ繝。繝ウ繝医☆繧九%縺ィ縺ォ闊亥袖繧呈戟縺」縺ヲ縺薙↑縺九▲縺溽炊逕ア縺ァ縺吶

+

豕ィ: 繝槭う繧ッ繝ュ繧ス繝輔ヨ遉セ縺ッFAT繝輔ぃ繧、繝ォ繝サ繧キ繧ケ繝繝縺ォ縺、縺縺ヲ縺縺上▽縺九ョ迚ケ險ア繧剃ソ晄怏縺励※縺縺セ縺吶ゅ>縺壹l繧LFN縺ョ螳溯」縺ォ髢「縺吶k繧ゅョ縺ァ縲´FN讖溯ス縺ォ蟇セ縺励※$0.25/unit縺ョ繝ゥ繧、繧サ繝ウ繧ケ譁吶r隕∵アゅ@縺ヲ縺縺セ縺吶ゅ%縺ョ縺溘a縲∝膚逕ィ陬ス蜩√〒LFN讖溯ス譛牙柑縺ォ縺吶k縺ィ縺阪ッ縲∵怙邨ゆサ募髄蝨ー縺ォ繧医▲縺ヲ縺ッ繝ゥ繧、繧サ繝ウ繧ケ縺悟ソ隕√°繧ら衍繧後∪縺帙s縲

-
+

譌・譛ャ隱槭ヵ繧。繧、繝ォ蜷阪ョ螟ァ譁蟄怜、画鋤

-

CP932(Shift_JIS)縺ァ縺九▽髱朖FN讒区舌ョ縺ィ縺阪ッ縲∵僑蠑オ譁蟄励ョ蟆乗枚蟄(2繝舌う繝郁恭蟄励サ繧ュ繝ェ繝ォ譁蟄励サ繧ョ繝ェ繧キ繝」譁蟄)縺ォ蟇セ縺励※螟ァ譁蟄怜、画鋤繧定。後o縺壹∝ー乗枚蟄励ョ縺セ縺セSFN繧ィ繝ウ繝医Μ縺ォ險倬鹸繝サ讀懃エ「縺輔l縺セ縺吶ゅ%繧後ッ譌・譛ャ隱朞SDOS縺ィ蜷後§莉墓ァ倥→縺ェ繧翫∪縺吶ゅ%縺ョ縺溘a縲髱朖FN讒区舌〒蜈ィ隗貞ー乗枚蟄励r蜷ォ繧繝輔ぃ繧、繝ォ繧剃ス懈舌☆繧九→縲¨T邉サWindows縺ァ縺昴ョ繝輔ぃ繧、繝ォ繧帝幕縺代↑縺上↑繧翫∪縺吶LFN讒区舌〒縺ッ螟ァ譁蟄怜、画鋤繧定。後>縺セ縺(NT邉サWindows莉墓ァ)縲

+

CP932(Shift_JIS)縺ァ縺九▽髱朖FN讒区舌ョ縺ィ縺阪ッ縲∵僑蠑オ譁蟄励ョ蟆乗枚蟄(2繝舌う繝郁恭蟄励サ繧ュ繝ェ繝ォ譁蟄励サ繧ョ繝ェ繧キ繝」譁蟄)縺ォ蟇セ縺励※螟ァ譁蟄怜、画鋤繧定。後o縺壹∝ー乗枚蟄励ョ縺セ縺セSFN繧ィ繝ウ繝医Μ縺ォ險倬鹸繝サ讀懃エ「縺輔l縺セ縺(譌・譛ャ隱朞SDOS莉墓ァ)縲ゅ%縺ョ縺溘a縲髱朖FN讒区舌〒蜈ィ隗貞ー乗枚蟄励r蜷ォ繧繝輔ぃ繧、繝ォ繧剃ス懈舌☆繧九→縲¨T邉サWindows縺ァ縺昴ョ繝輔ぃ繧、繝ォ繧帝幕縺代↑縺上↑繧翫∪縺吶LFN讒区舌〒縺ッ螟ァ譁蟄怜、画鋤繧定。後>縺セ縺(NT邉サWindows莉墓ァ)縲

-
+

Unicode蜈・蜃コ蜉帙∈縺ョ蟇セ蠢

繝輔ぃ繧、繝ォ髢「謨ー縺ョ繝輔ぃ繧、繝ォ蜷榊・蜃コ蜉帙ッ繝繝輔か繝ォ繝医〒縺ッ ANSI/OEM繧ウ繝シ繝峨〒縺吶′縲√%繧後rUnicode縺ォ蛻繧頑崛縺医k縺薙→繧ゅ〒縺阪∪縺吶6nicode繝輔ぃ繧、繝ォ蜷阪↓髢「縺吶k隧ウ邏ー縺ッ縲繝輔ぃ繧、繝ォ蜷繧貞盾辣ァ縺励※縺上□縺輔>縲

-
+

繝ェ繧ィ繝ウ繝医Λ繝ウ繧キ繝シ

-

莠偵>縺ォ逡ー縺ェ繧九懊Μ繝・繝シ繝縺ォ蟇セ縺吶k繝輔ぃ繧、繝ォ謫堺ス懊ッ縲∝クク縺ォ蜷梧凾蟷ウ陦後↓蜍穂ス懊〒縺阪∪縺吶ょ酔縺倥懊Μ繝・繝シ繝縺ォ蟇セ縺励※縺ッ繝繝輔か繝ォ繝医〒縺ッ繝ェ繧ィ繝ウ繝医Λ繝ウ繝医〒縺ッ縺ゅj縺セ縺帙s縺後_FS_REENTRANT繧ェ繝励す繝ァ繝ウ縺ァ繝ェ繧ィ繝ウ繝医Λ繝ウ繝医↓縺吶k縺薙→繧ゅ〒縺阪∪縺吶ゅ%縺ョ蝣エ蜷医^S萓晏ュ倥ョ蜷梧悄繧ェ繝悶ず繧ァ繧ッ繝域桃菴憺未謨ーff_cre_syncobj, ff_del_syncobj, ff_req_grant 縺ィ ff_rel_grant繧ゅ∪縺溘励Ο繧ク繧ァ繧ッ繝医↓霑ス蜉縺輔l縺ェ縺代l縺ー縺ェ繧翫∪縺帙s縲ゅし繝ウ繝励Ν繝サ繧ウ繝シ繝峨→隗」隱ャ縺ッoption/syncobj.c縺ォ縺ゅj縺セ縺吶

+

莠偵>縺ォ逡ー縺ェ繧九懊Μ繝・繝シ繝縺ォ蟇セ縺吶k繝輔ぃ繧、繝ォ謫堺ス懊ッ繝ェ繧ィ繝ウ繝医Λ繝ウ繝医〒縲∝クク縺ォ蜷梧凾蟷ウ陦後↓蜍穂ス懊〒縺阪∪縺吶ょ酔縺倥懊Μ繝・繝シ繝縺ォ蟇セ縺励※縺ッ繝繝輔か繝ォ繝医〒縺ッ繝ェ繧ィ繝ウ繝医Λ繝ウ繝医〒縺ッ縺ゅj縺セ縺帙s縺後_FS_REENTRANT繧ェ繝励す繝ァ繝ウ縺ァ繝ェ繧ィ繝ウ繝医Λ繝ウ繝(繧ケ繝ャ繝繝峨サ繧サ繝シ繝)縺ォ縺吶k縺薙→縺ッ縺ァ縺阪∪縺吶ゅ%縺ョ蝣エ蜷医^S萓晏ュ倥ョ蜷梧悄繧ェ繝悶ず繧ァ繧ッ繝域桃菴憺未謨ーff_cre_syncobj, ff_del_syncobj, ff_req_grant 縺ィ ff_rel_grant繧ゅ∪縺溘励Ο繧ク繧ァ繧ッ繝医↓霑ス蜉縺輔l縺ェ縺代l縺ー縺ェ繧翫∪縺帙s縲ゅし繝ウ繝励Ν繝サ繧ウ繝シ繝峨→隗」隱ャ縺ッoption/syncobj.c縺ォ縺ゅj縺セ縺吶

縺ゅk繧ソ繧ケ繧ッ縺後懊Μ繝・繝シ繝繧剃スソ逕ィ荳ュ縺ォ莉悶ョ繧ソ繧ケ繧ッ縺九i縺昴ョ繝懊Μ繝・繝シ繝縺ォ蟇セ縺吶k繝輔ぃ繧、繝ォ髢「謨ー縺悟他縺ウ蜃コ縺輔l繧九→縲√◎縺ョ繧「繧ッ繧サ繧ケ縺ッ蜈医ョ繧ソ繧ケ繧ッ縺後ヵ繧。繧、繝ォ髢「謨ー繧呈栢縺代k縺セ縺ァ繝悶Ο繝繧ッ縺輔l縺セ縺吶ゅb縺励∝セ縺。譎る俣縺_TIMEOUT縺ァ謖螳壹&繧後◆譛滄俣繧定カ翫☆縺ィ縲√◎縺ョ髢「謨ー縺ッFR_TIMEOUT縺ァ繧「繝懊シ繝医@縺セ縺吶ゅ>縺上▽縺九ョRTOS縺ァ縺ッ繧ソ繧、繝繧「繧ヲ繝域ゥ溯ス縺ッ繧オ繝昴シ繝医&繧後↑縺縺九b遏・繧後∪縺帙s縲

縺イ縺ィ縺、縺ョ萓句、悶′f_mount()縺ィf_mkfs()縺ォ縺ゅj縺セ縺吶ゅ%繧後i縺ョ髢「謨ー縺ッ蜷後§繝懊Μ繝・繝シ繝縺ォ蟇セ縺励※繝ェ繧ィ繝ウ繝医Λ繝ウ繝医〒縺ッ縺ゅj縺セ縺帙s縲ゅ%繧後i縺ョ髢「謨ー繧剃スソ逕ィ縺吶k縺ィ縺阪ッ縲√い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繝サ繝ャ繝吶Ν縺ァ謗剃サ門宛蠕。縺励↑縺代l縺ー縺ェ繧翫∪縺帙s縲

豕ィ: 縺薙ョ繧サ繧ッ繧キ繝ァ繝ウ縺ッFatFs繝「繧ク繝・繝シ繝ォ縺昴l閾ェ菴薙ョ繝ェ繧ィ繝ウ繝医Λ繝ウ繧キ繝シ縺ォ縺、縺縺ヲ隱ャ譏弱@縺ヲ縺縺セ縺吶ゅョ繧」繧ケ繧ッI/O繝「繧ク繝・繝シ繝ォ縺ョ繝ェ繧ィ繝ウ繝医Λ繝ウ繧キ繝シ縺ォ髢「縺励※縺ッ菴輔ョ蜑肴署繧ゅ≠繧翫∪縺帙s縲

-
+

螟夐阪ヵ繧。繧、繝ォ繝サ繧「繧ッ繧サ繧ケ

FatFs繝「繧ク繝・繝シ繝ォ縺ァ縺ッ繝繝輔か繝ォ繝医〒縺ッ螟夐阪い繧ッ繧サ繧ケ蛻カ蠕。讖溯ス繧偵し繝昴シ繝医@縺ヲ縺縺セ縺帙s縲ゅヵ繧。繧、繝ォ縺ォ蟇セ縺吶k螟夐阪い繧ッ繧サ繧ケ縺ッ縲√◎縺ョ繧「繧ッ繧サ繧ケ繝サ繝「繝シ繝峨↓繧医▲縺ヲ蛻カ髯舌&繧後∪縺吶ゆク縺、縺ョ繝輔ぃ繧、繝ォ縺ォ蟇セ縺吶k螟夐阪が繝シ繝励Φ縺ッ縲√◎繧後i縺悟ィ縺ヲ繝ェ繝シ繝峨サ繝「繝シ繝峨ョ縺ィ縺阪↓髯舌▲縺ヲ險ア蜿ッ縺輔l縺セ縺吶よ嶌縺崎セシ縺ソ繝「繝シ繝峨r蜷ォ繧螟夐阪が繝シ繝励Φ縲√∪縺滄幕縺九l縺ヲ縺繧九ヵ繧。繧、繝ォ縺ォ蟇セ縺吶k繝ェ繝阪シ繝繧蜑企勁縲√き繝ャ繝ウ繝医サ繝繧」繝ャ繧ッ繝医Μ縺ョ蜑企勁繧定。後▲縺ヲ縺ッ縺ェ繧翫∪縺帙s縲ゅ&繧ゅ↑縺縺ィ縲√◎縺ョ繝懊Μ繝・繝シ繝縺ョFAT讒矩縺檎エ螢翫&繧後k蜿ッ閭ス諤ァ縺後≠繧翫∪縺吶

_FS_SHARE縺ォ1莉・荳翫ョ蛟、繧偵そ繝繝医☆繧九%縺ィ縺ォ繧医j縲√ヵ繧。繧、繝ォ蜊倅ス阪ョ謗剃サ門宛蠕。繧定ェ蜍輔〒陦後≧縺薙→繧ゅ〒縺阪∪縺吶ゅ%縺ョ蝣エ蜷医∽ク願ィ倥ョ繝ォ繝シ繝ォ繧堤エ縺」縺溘が繝シ繝励Φ繝サ繝ェ繝阪シ繝繝サ蜑企勁繧定ゥヲ縺ソ繧九→縲√◎縺ョ髢「謨ー縺ッFR_LOCKED縺ァ螟ア謨励@縺セ縺吶

-
+

蜉ケ邇逧縺ェ繝輔ぃ繧、繝ォ繝サ繧「繧ッ繧サ繧ケ

-

蟆剰ヲ乗ィ。縺ェ邨霎シ繧キ繧ケ繝繝縺ァ縺ョ繝輔ぃ繧、繝ォ縺ョ隱ュ縺ソ譖ク縺阪↓縺翫¢繧句柑邇縺ョ濶ッ縺繧「繧ッ繧サ繧ケ縺ョ縺溘a縲√い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繝サ繝励Ο繧ー繝ゥ繝槭ッFatFs繝「繧ク繝・繝シ繝ォ縺ョ荳ュ縺ァ縺ゥ縺ョ繧医≧縺ェ蜃ヲ逅縺瑚。後o繧後※縺繧九°閠諷ョ縺吶∋縺阪〒縺吶ゅョ繧」繧ケ繧ッ荳翫ョ繝繝シ繧ソ縺ッf_read髢「謨ー縺ォ繧医j谺。縺ョ繧キ繝シ繧ア繝ウ繧ケ縺ァ霆「騾√&繧後∪縺吶

+

蟆剰ヲ乗ィ。縺ェ邨霎シ繧キ繧ケ繝繝縺ァ縺ョ繝輔ぃ繧、繝ォ縺ョ隱ュ縺ソ譖ク縺阪↓縺翫¢繧句柑邇縺ョ濶ッ縺繧「繧ッ繧サ繧ケ縺ョ縺溘a縲√い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繝サ繝励Ο繧ー繝ゥ繝槭ッFatFs繝「繧ク繝・繝シ繝ォ縺ョ荳ュ縺ァ縺ゥ縺ョ繧医≧縺ェ蜃ヲ逅縺瑚。後o繧後※縺繧九°閠諷ョ縺吶∋縺阪〒縺吶ゅせ繝医Ξ繝シ繧ク荳翫ョ繝繝シ繧ソ縺ッf_read髢「謨ー縺ォ繧医j谺。縺ョ繧キ繝シ繧ア繝ウ繧ケ縺ァ霆「騾√&繧後∪縺吶

蝗ウ1. 繧サ繧ッ繧ソ繝サ繝溘せ繧「繝ゥ繧、繝ウ繝峨サ繝ェ繝シ繝 (繧キ繝ァ繝シ繝)
fig.1

@@ -186,9 +201,22 @@ _FS_SHARE 0 (Disable shareing control)

縺薙ョ繧医≧縺ォ縲√そ繧ッ繧ソ縺ォ繧「繝ゥ繧、繝。繝ウ繝医@縺溘ヵ繧。繧、繝ォ縺ョ隱ュ縺ソ譖ク縺阪∈縺ョ驟肴ョ縺ッ繝舌ャ繝輔ぃ邨檎罰縺ョ繝繝シ繧ソ霆「騾√r驕ソ縺代∬ェュ縺ソ譖ク縺肴ァ閭ス縺ッ謾ケ蝟縺輔l繧九〒縺励g縺縲ゅ◎縺ョ蜉ケ譫懊↓蜉縺医√ち繧、繝九シ讒区舌〒繧ュ繝」繝繧キ繝・縺輔l縺檳AT繝繝シ繧ソ縺後ヵ繧。繧、繝ォ繝サ繝繝シ繧ソ縺ョ霆「騾√↓繧医j繝輔Λ繝繧キ繝・縺輔l縺壹髱槭ち繧、繝九シ讒区舌→蜷後§諤ァ閭ス繧貞ー上&縺ェ繝。繝「繝ェ繝サ繝輔ャ繝医励Μ繝ウ繝医〒驕疲舌〒縺阪∪縺吶

-
+
+

繝輔Λ繝繧キ繝・繝サ繝。繝「繝ェ縺ョ迚ケ諤ァ縺ク縺ョ驟肴ョ

+

HDD縺ェ縺ゥ縺ョ繝繧」繧ケ繧ッ繝サ繝。繝繧」繧「縺ィ縺ッ逡ー縺ェ繧翫ヾDC繧ГFC縺ェ縺ゥ縺ョ繝輔Λ繝繧キ繝・繝サ繝。繝「繝ェ繝サ繝。繝繧」繧「縺ョ諤ァ閭ス繧貞シ輔″蜃コ縺吶↓縺ッ縲√◎縺ョ迚ケ諤ァ繧呈э隴倥@縺溷宛蠕。縺悟ソ隕√↓縺ェ繧翫∪縺吶

+

繝槭Ν繝√サ繧サ繧ッ繧ソ譖ク縺崎セシ縺ソ

+
+蝗ウ6. 繝槭Ν繝/繧キ繝ウ繧ー繝ォ繝サ繧サ繧ッ繧ソ繝サ繝ゥ繧、繝医ョ豈碑シ
+fig.6 +
+

繝輔Λ繝繧キ繝・繝サ繝。繝「繝ェ繝サ繝。繝繧」繧「縺ョ譖ク縺崎セシ縺ソ騾溷コヲ縺ッ繧キ繝ウ繧ー繝ォ繝サ繧サ繧ッ繧ソ譖ク縺崎セシ縺ソ縺ョ譎ゅ↓譛繧ゆス弱>繧ゅョ縺ォ縺ェ繧翫∽ク蝗槭ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺ァ霆「騾√&繧後k繧サ繧ッ繧ソ謨ー縺悟、ァ縺阪¥縺ェ繧九⊇縺ゥ譖ク縺崎セシ縺ソ騾溷コヲ縺ッ蜷台ク翫@縺セ縺吶ゅ%縺ョ蜉ケ譫懊ッ繝舌せ騾溷コヲ縺碁ォ倬溘↓縺ェ繧九⊇縺ゥ鬘戊送縺ァ縲10蛟堺サ・荳翫ョ蟾ョ縺檎樟繧後k縺薙→繧ら渚縺励¥縺ゅj縺セ縺帙s縲よ嶌縺崎セシ縺ソ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺ョ蝗樊焚縺ッ縺セ縺溘√Γ繝繧」繧「縺ョ蟇ソ蜻ス縺ォ繧ょスア髻ソ縺励※縺阪∪縺吶ゅ%縺ョ縺溘a縲√い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ッ縺ェ繧九∋縺丞、ァ縺阪↑繝悶Ο繝繧ッ(繧ッ繝ゥ繧ケ繧ソ繝サ繧オ繧、繧コ縺セ縺溘ッ2縺ョ邏ッ荵励そ繧ッ繧ソ蠅逡後↓繧「繝ゥ繧、繝。繝ウ繝医@縺)縺ァ隱ュ縺ソ譖ク縺阪r陦後≧蠢隕√′縺ゅj縺セ縺吶ゅb縺。繧阪s縲√い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺九i繝。繝繧」繧「縺ォ閾ウ繧句ィ縺ヲ縺ョ繝ャ繧、繝、縺後槭Ν繝√サ繧サ繧ッ繧ソ霆「騾√↓蟇セ蠢懊@縺ヲ縺縺ェ縺縺ィ諢丞袖縺後≠繧翫∪縺帙s縲よョ句ソオ縺ェ縺後i縲∵里蟄倥ョ繧ェ繝シ繝励Φ繝サ繧ス繝シ繧ケ縺ョ繝峨Λ繧、繝舌ョ螟壹¥縺ッ繝槭Ν繝√サ繧サ繧ッ繧ソ霆「騾√↓譛ェ蟇セ蠢懊〒縺吶ゅ↑縺翫:atFs繝「繧ク繝・繝シ繝ォ縺翫h縺ウ縺昴l逕ィ縺ョ繧オ繝ウ繝励Ν繝サ繝峨Λ繧、繝舌ッ繝槭Ν繝√サ繧サ繧ッ繧ソ霆「騾√↓蟇セ蠢懊@縺ヲ縺縺セ縺吶

+

譏守、コ逧縺ェ繝。繝「繝ェ豸亥悉

+

騾壼クク縺ョ繝輔ぃ繧、繝ォ豸亥悉縺ァ縺ッ縲∬ィ倬鹸縺輔l縺溘ョ繝シ繧ソ縺ォ蟇セ縺励※菴輔i縺九ョ蛻カ蠕。縺瑚。後o繧後k繧上¢縺ァ縺ッ縺ェ縺上∝腰縺ォFAT荳翫↓譛ェ菴ソ逕ィ繧ッ繝ゥ繧ケ繧ソ縺ィ縺励※險倬鹸縺輔l縺ヲ縺繧九□縺代〒縺吶ゅ%縺ョ縺溘a縲√ヵ繧。繧、繝ォ縺梧カ亥悉縺輔l縺溘≠縺ィ繧ゅ◎繧後i縺ッ譛牙柑縺ェ繝。繝「繝ェ繝サ繝悶Ο繝繧ッ縺ィ縺励※繝輔Λ繝繧キ繝・繝サ繝。繝「繝ェ荳翫↓谿九j縺セ縺吶ゅ◎縺薙〒縲√ヵ繧。繧、繝ォ繧呈カ亥悉縺吶k縺ィ縺阪∝頃譛峨@縺ヲ縺縺溘ョ繝シ繧ソ繝サ繧サ繧ッ繧ソ繧呈守、コ逧縺ォ豸亥悉(縺、縺セ繧頑悴菴ソ逕ィ繝悶Ο繝繧ッ縺ォ縺吶k)縺吶k縺薙→縺ォ繧医j縲√Γ繝繧」繧「蜀縺ョ遨コ縺阪ヶ繝ュ繝繧ッ繧貞「励d縺吶%縺ィ縺後〒縺阪∪縺吶ゅ%繧後↓繧医j縲∵ャ。縺ォ縺昴ョ繝悶Ο繝繧ッ縺ォ譖ク縺崎セシ繧縺ィ縺阪ョ豸亥悉蜍穂ス懊′辟。縺上↑繧翫∵嶌縺崎セシ縺ソ諤ァ閭ス縺悟髄荳翫☆繧句庄閭ス諤ァ縺後≠繧翫∪縺吶ゅ∪縺溘√え繧ァ繧「繝ャ繝吶Μ繝ウ繧ー縺ォ菴ソ縺医k繝悶Ο繝繧ッ縺悟「励∴縲√Γ繝繧」繧「縺ョ閠蝉ケ諤ァ繧ょ髄荳翫☆繧九°繧ら衍繧後∪縺帙s縲ゅ%縺ョ讖溯ス繧呈怏蜉ケ縺ォ縺吶k縺ォ縺ッ縲∵ァ区舌が繝励す繝ァ繝ウ縺ョ_USE_ERASE縺ォ1繧定ィュ螳壹@縺セ縺吶ゅ%繧後ッ繝輔Λ繝繧キ繝・繝サ繝。繝「繝ェ繝サ繝。繝繧」繧「縺ョ蜀驛ィ蜍穂ス懊↓譛溷セ縺励◆蛻カ蠕。縺ェ縺ョ縺ァ縲∝柑譫懊′縺ゅk縺ィ縺ッ髯舌j縺セ縺帙s縲ゅ∪縺溘√ヵ繧。繧、繝ォ豸亥悉縺ョ譎る俣縺悟サカ縺ウ繧九%縺ィ繧り諷ョ縺ォ蜈・繧後k縺ケ縺阪〒縺吶

+
+ +

繧ッ繝ェ繝√き繝ォ繝サ繧サ繧ッ繧キ繝ァ繝ウ

-

繝繧」繧ケ繧ッ荳翫ョFAT讒矩繧呈桃菴懊@縺ヲ縺繧矩比クュ縺ァ縲∝●髮サ縲∽ク肴ュ」縺ェ繝。繝繧」繧「縺ョ蜿悶j螟悶@縲∝屓蠕ゥ荳崎ス縺ェ繝繝シ繧ソ繝サ繧ィ繝ゥ繝シ遲峨ョ髫懷ョウ縺檎匱逕溘☆繧九→縲∝ヲ逅縺御クュ騾泌濠遶ッ縺ェ迥カ諷九〒荳ュ譁ュ縺輔l縲√◎縺ョ邨先棡縺ィ縺励※FAT讒矩縺檎エ螢翫&繧後k蜿ッ閭ス諤ァ縺後≠繧翫∪縺吶よャ。縺ォFatFs繝「繧ク繝・繝シ繝ォ縺ォ縺翫¢繧九け繝ェ繝√き繝ォ繝サ繧サ繧ッ繧キ繝ァ繝ウ縺ィ縲√◎縺ョ髢薙ョ髫懷ョウ縺ォ繧医j襍キ縺阪≧繧九お繝ゥ繝シ縺ョ迥カ諷九r遉コ縺励∪縺吶

+

繧ケ繝医Ξ繝シ繧ク荳翫ョFAT讒矩繧呈桃菴懊@縺ヲ縺繧矩比クュ縺ァ縲∝●髮サ縲∽ク肴ュ」縺ェ繝。繝繧」繧「縺ョ蜿悶j螟悶@縲∝屓蠕ゥ荳崎ス縺ェ繝繝シ繧ソ繝サ繧ィ繝ゥ繝シ遲峨ョ髫懷ョウ縺檎匱逕溘☆繧九→縲∝ヲ逅縺御クュ騾泌濠遶ッ縺ェ迥カ諷九〒荳ュ譁ュ縺輔l縲√◎縺ョ邨先棡縺ィ縺励※FAT讒矩縺檎エ螢翫&繧後k蜿ッ閭ス諤ァ縺後≠繧翫∪縺吶よャ。縺ォFatFs繝「繧ク繝・繝シ繝ォ縺ォ縺翫¢繧九け繝ェ繝√き繝ォ繝サ繧サ繧ッ繧キ繝ァ繝ウ縺ィ縲√◎縺ョ髢薙ョ髫懷ョウ縺ォ繧医j襍キ縺阪≧繧九お繝ゥ繝シ縺ョ迥カ諷九r遉コ縺励∪縺吶

蝗ウ4. 髟キ縺繧ッ繝ェ繝√き繝ォ繝サ繧サ繧ッ繧キ繝ァ繝ウ
fig.4 @@ -204,22 +232,22 @@ _FS_SHARE 0 (Disable shareing control)
  • 霑ス險倅クュ縺ョ繝輔ぃ繧、繝ォ縺後が繝シ繝励Φ蜑阪ョ迥カ諷九↓謌サ繧九
  • 譁ー隕上↓菴懈舌&繧後◆繝輔ぃ繧、繝ォ縺梧カ医∴繧九
  • 譁ー隕上∪縺溘ッ荳頑嶌縺阪〒菴懈舌&繧後◆繝輔ぃ繧、繝ォ縺ョ髟キ縺輔′繧シ繝ュ縺ォ縺ェ縺」縺ヲ谿九k縲
  • -
  • 繝ュ繧ケ繝医メ繧ァ繝シ繝ウ縺ョ逋コ逕溘↓繧医j繝繧」繧ケ繧ッ縺ョ蛻ゥ逕ィ蜉ケ邇縺梧が蛹悶☆繧九
  • +
  • 繝ュ繧ケ繝医メ繧ァ繝シ繝ウ縺ョ逋コ逕溘↓繧医j繝懊Μ繝・繝シ繝縺ョ蛻ゥ逕ィ蜉ケ邇縺梧が蛹悶☆繧九
  • 縺縺壹l繧よ嶌縺崎セシ縺ソ荳ュ繧謫堺ス懷ッセ雎。縺ァ縺ェ縺繝輔ぃ繧、繝ォ縺ォ縺ッ蠖ア髻ソ縺ッ縺ゅj縺セ縺帙s縲ゅ%繧後i縺ョ繧ッ繝ェ繝√き繝ォ繝サ繧サ繧ッ繧キ繝ァ繝ウ縺ッ縲√ヵ繧。繧、繝ォ繧呈嶌縺崎セシ縺ソ繝「繝シ繝峨〒髢九>縺ヲ縺繧区凾髢薙r譛蟆城剞縺ォ縺吶k縺九’_sync()繧帝←螳應スソ逕ィ縺吶k縺薙→縺ァ蝗ウ5縺ョ繧医≧縺ォ繝ェ繧ケ繧ッ繧呈怙蟆丞喧縺吶k縺薙→縺後〒縺阪∪縺吶

    -
    +

    FatFs縺ョ繝ゥ繧、繧サ繝ウ繧ケ縺ォ縺、縺縺ヲ

    繧ス繝シ繧ケ繝サ繝輔ぃ繧、繝ォ縺ョ繝倥ャ繝縺ォ繝ゥ繧、繧サ繝ウ繧ケ譚。莉カ縺瑚ィ倩ソー縺輔l縺ヲ縺繧九ョ縺ァ縲∝茜逕ィ縺ョ髫帙ッ縺昴l縺ォ蠕薙≧縺薙→縲り恭隱槭r隱ュ繧√↑縺譁ケ縺ョ縺溘a縺ォ莉・荳九↓譌・譛ャ隱櫁ィウ繧堤、コ縺励※縺翫″縺セ縺吶

    /*----------------------------------------------------------------------------/
    -/  FatFs - FAT file system module  R0.08                    (C)ChaN, 2009
    +/  FatFs - FAT file system module  R0.08a                   (C)ChaN, 2010
     /-----------------------------------------------------------------------------/
     / FatFs繝「繧ク繝・繝シ繝ォ縺ッ縲∝ー剰ヲ乗ィ。縺ェ邨縺ソ霎シ縺ソ繧キ繧ケ繝繝蜷代¢縺ョ豎守畑FAT繝輔ぃ繧、繝ォ繧キ繧ケ繝繝繝サ
     / 繝「繧ク繝・繝シ繝ォ縺ァ縺吶ゅ%繧後ッ繝輔Μ繝シ繝サ繧ス繝輔ヨ繧ヲ繧ァ繧「縺ィ縺励※縲∵蕗閧イ繝サ遐皮ゥカ繝サ髢狗匱縺ョ縺溘a縺ォ
     / 莉・荳九ョ繝ゥ繧、繧サ繝ウ繧ケ繝サ繝昴Μ繧キ繝シ縺ョ荳九〒蜈ャ髢九&繧後※縺縺セ縺吶
     /
    -/  Copyright (C) 2009, ChaN, all right reserved.
    +/  Copyright (C) 2010, ChaN, all right reserved.
     /
     / * FatFs繝「繧ク繝・繝シ繝ォ縺ッ繝輔Μ繝シ繝サ繧ス繝輔ヨ繧ヲ繧ァ繧「縺ァ縺ゅj縲√∪縺辟。菫晁ィシ縺ァ縺縲
     / * 逕ィ騾斐↓蛻カ髯舌ッ縺ゅj縺セ縺帙s縲縺ゅ↑縺溘ョ雋ャ莉サ縺ョ荳九↓縺翫>縺ヲ縲∝倶ココ逧繝サ髱槫霧蛻ゥ逧縺ェ
    diff --git a/doc/ja/close.html b/doc/ja/close.html
    index 8d397c1..a22c8aa 100644
    --- a/doc/ja/close.html
    +++ b/doc/ja/close.html
    @@ -49,7 +49,7 @@ FRESULT f_close (
     
     

    解説

    -

    ファイルを閉じます。何らかの書き込みの行われたファイルの場合、キャッシュされた状態(リード/ライト・バッファ上のデータ、変更されたFATやディレクトリ項目)はディスクに書き戻されます。関数が正常終了すると、そのファイル・オブジェクトは無効になり、そのメモリも解放できます。読み込み専用モードで開かれたファイル・オブジェクトは、この関数によるクローズ処理を経ずに破棄することもできますが、推奨はされません。

    +

    ファイルを閉じます。何らかの書き込みの行われたファイルの場合、キャッシュされた状態(リード/ライト・バッファ上のデータ、変更されたFATやディレクトリ項目)はディスクに書き戻されます。関数が正常終了すると、そのファイル・オブジェクトは無効になり、そのメモリも解放できます。

    diff --git a/doc/ja/dinit.html b/doc/ja/dinit.html index f4b9530..5a8a111 100644 --- a/doc/ja/dinit.html +++ b/doc/ja/dinit.html @@ -38,7 +38,7 @@ DSTATUS disk_initialize (

    解説

    ディスク・ドライブを初期化します。関数が成功すると、戻り値のSTA_NOINITフラグがクリアされます。

    -

    FatFsモジュールは、自動マウント動作により必要に応じてこの関数を呼び出します。アプリケーションからこの関数を呼び出してはなりません。さもないとFAT構造が破壊される可能性があります。エラー等により再初期化が必要なときは、f_mount()を使用します。

    +

    アプリケーションからこの関数を呼び出すと、FATボリュームが破壊される可能性があります。エラー等により再初期化が必要なときは、f_mount()を使用します。FatFsモジュールは、自動マウント動作により、必要に応じてこの関数を呼び出します。

    戻る

    diff --git a/doc/ja/dioctl.html b/doc/ja/dioctl.html index e164a27..e272ead 100644 --- a/doc/ja/dioctl.html +++ b/doc/ja/dioctl.html @@ -31,7 +31,7 @@ DRESULT disk_ioctl (
    Command
    制御コマンド・コードを指定します。
    Buffer
    -
    制御コマンドに依存したパラメータを授受するバッファを指すポインタを指定します。バッファを使用しないコマンドの場合は、NULLを指定します。
    +
    制御コマンドに依存したパラメータを授受するバッファを指すポインタを指定します。データの授受のないコマンドの場合は、NULLを指定します。
    @@ -51,14 +51,14 @@ DRESULT disk_ioctl (

    解説

    -

    物理ドライブの種類によりサポートされるコマンドは異なりますが、FatFsモジュールでは、次の汎用コマンドのみ使用し、ドライブの種類に依存した制御は行いません。

    -

    この関数はリード・オンリー構成では必要とされません。

    +

    物理ドライブの種類によりサポートされるコマンドは異なりますが、FatFsモジュールでは、次の汎用コマンドのみ使用し、特定のハードウェアに依存した制御は行いません。

    - - + + - + +
    コマンド解説
    CTRL_SYNCドライブがデータの書き込み処理を完了するのを待ちます。また、ライト・バック・キャッシュが存在する場合は、書き込まれていないデータを即時書き戻します。
    GET_SECTOR_SIZEBufferの指すWORD変数にドライブのセクタ・サイズを返します。セクタサイズが固定(_MAX_SSが512)のときはこのコマンドは必要ありません。
    CTRL_SYNCドライブがデータの書き込み処理を完了するのを待ちます。また、ライト・バック・キャッシュが存在する場合は、書き込まれていないデータを即時書き戻します。リード・オンリー構成では使用されません。
    GET_SECTOR_SIZEBufferの指すWORD変数にドライブのセクタ・サイズを返します。セクタ・サイズが固定(_MAX_SSが512)のときはこのコマンドは使われません。
    GET_SECTOR_COUNTBufferの指すDWORD変数にドライブ上の総セクタ数を返します。f_mkfs関数内で作成するボリュームのサイズを決定するために使用されます。
    GET_BLOCK_SIZEフラッシュ・メモリ・アレーの消去ブロック・サイズが分かる場合は、Bufferの指すDWORD変数にそれをセクタ単位で返します。1から32768でかつ2の累乗の値でなければなりません。f_mkfs関数内でのみ使用され、データ領域はこの境界にアライメントされます。不明な場合またはディスク・ドライブでは1を返します。
    GET_BLOCK_SIZEフラッシュ・メモリの消去ブロック・サイズをBufferの指すDWORD変数にセクタ単位で返します。1から32768でかつ2の累乗の値でなければなりません。不明な場合またはフラッシュ・メモリ以外のメディアでは1を返します。f_mkfs関数内でのみ使用され、ボリュームのデータ領域はこの境界にアライメントされます。
    CTRL_ERASE_SECTORフラッシュ・メモリの一部の領域を消去します。Bufferの指すDWORD配列には消去する領域 {開始セクタ,終了セクタ} を指定して呼び出します。この機能をサポートしない場合やフラッシュ・メモリ以外のメディアでは何もしません。この機能の戻り値はチェックされず、また、指定領域の消去が完全に行われなかったとしてもファイル・システムの動作には影響ありません。_USE_ERASEが1のとき、クラスタが解放されるときに呼び出されます。
    diff --git a/doc/ja/dread.html b/doc/ja/dread.html index 9e7841e..b5dca8d 100644 --- a/doc/ja/dread.html +++ b/doc/ja/dread.html @@ -30,11 +30,11 @@ DRESULT disk_read (
    Drive
    物理ドライブ番号(0-9)を指定します。
    Buffer
    -
    ディスクから読み出したデータを格納するバイト配列で、読み出されるバイト数分のサイズが必要です。アドレスはアライメントされているとは限りません。
    +
    ディスクから読み出したデータを格納するバイト配列で、読み出されるバイト数分のサイズが必要です。指定されるアドレスはワード・アライメントされているとは限りません。
    SectorNumber
    読み出しを開始するセクタ番号。LBAで指定します。
    SectorCount
    -
    読み出すセクタ数。 1〜255の範囲で設定します
    +
    読み出すセクタ数。 1〜128の範囲で指定します。一般的に、複数セクタの転送要求はデバイスに対してマルチ・セクタ転送しなければなりません。複数のシングル・セクタ転送に分解した場合、読み出し速度が低下します。
    diff --git a/doc/ja/dwrite.html b/doc/ja/dwrite.html index f0cf8a7..556108c 100644 --- a/doc/ja/dwrite.html +++ b/doc/ja/dwrite.html @@ -30,11 +30,11 @@ DRESULT disk_write (
    Drive
    物理ドライブ番号(0-9)を指定します。
    Buffer
    -
    ディスクに書き込むバイト配列を指定します。アドレスはアライメントされているとは限りません。
    +
    ディスクに書き込むバイト配列を指定します。指定されるアドレスはワード・アライメントされているとは限りません。
    SectorNumber
    書き込みを開始するセクタ番号。LBAで指定します。
    SectorCount
    -
    書き込むセクタ数。 1〜255で設定します。
    +
    書き込むセクタ数。 1〜128で指定します。一般的に、複数セクタの転送要求はデバイスに対してマルチ・セクタ転送しなければなりません。複数のシングル・セクタ転送に分解した場合、書き込み速度は極端に低下します。
    diff --git a/doc/ja/filename.html b/doc/ja/filename.html index 4f60495..3f93f2f 100644 --- a/doc/ja/filename.html +++ b/doc/ja/filename.html @@ -11,7 +11,7 @@
    -

    繝輔ぃ繧、繝ォ繝サ繝繧」繝ャ繧ッ繝医Μ縺ョ謖螳壽婿豕

    +

    繝輔ぃ繧、繝ォ繝サ繝繧」繝ャ繧ッ繝医Μ縺ョ謖螳壽婿豕

    FatFs繝「繧ク繝・繝シ繝ォ縺ァ縺ョ繝輔ぃ繧、繝ォ縲√ョ繧」繝ャ繧ッ繝医Μ縲√ラ繝ゥ繧、繝悶ョ謖螳壽婿豕輔ッDOS/Windows縺ィ縺サ縺シ蜷後§縺ァ縺吶ゅヱ繧ケ蜷阪ョ繝輔か繝シ繝槭ャ繝医ッ谺。縺ョ騾壹j縺ァ縺吶

    "[隲也炊繝峨Λ繧、繝也分蜿キ:][/]繝繧」繝ャ繧ッ繝医Μ蜷/繝輔ぃ繧、繝ォ蜷"

    FatFs繝「繧ク繝・繝シ繝ォ縺ッ髟キ縺繝輔ぃ繧、繝ォ蜷(LFN)縺翫h縺ウ8.3蠖「蠑上ヵ繧。繧、繝ォ蜷(SFN)縺ォ蟇セ蠢懊@縺ヲ縺縺セ縺吶LFN縺ッ縲(_USE_LFN > 0)縺ョ縺ィ縺堺スソ逕ィ蜿ッ閭ス縺ォ縺ェ繧翫∪縺吶DOS/Windows縺ィ縺ョ驕輔>縺ッ縲√ョ繧」繝ャ繧ッ繝医Μ繝サ繧サ繝代Ξ繝シ繧ソ縺ィ隲也炊繝峨Λ繧、繝也分蜿キ縺ョ謖螳壹〒縺吶ゅョ繧」繝ャ繧ッ繝医Μ繝サ繧サ繝代Ξ繝シ繧ソ縺ォ縺ッ / 縺セ縺溘ッ \ 繧剃スソ逕ィ縺励∪縺吶りォ也炊繝峨Λ繧、繝也分蜿キ縺ッ縲'0'ス'9'縺ョ荳譁蟄励ョ謨ー蟄励→繧ウ繝ュ繝ウ縺ァ謖螳壹@縲∫怐逡・縺励◆蝣エ蜷医ッ繝繝輔か繝ォ繝医サ繝峨Λ繧、繝(0縺セ縺溘ッ繧ォ繝ャ繝ウ繝医サ繝峨Λ繧、繝)縺碁∈謚槭&繧後∪縺吶

    @@ -36,7 +36,7 @@


    -

    Unicode API

    +

    Unicode API

    繝輔ぃ繧、繝ォ髢「謨ー縺ョ蜈・蜃コ蜉帙ョ縺縺。繝輔ぃ繧、繝ォ蜷阪d繝代せ蜷阪r謖螳壹☆繧句シ墓焚縺ョ蝙九ッ縲TCHAR縺ァ螳夂セゥ縺輔l縺ヲ縺縺セ縺吶′縲√%繧後ッchar縺ョ繧ィ繝ェ繧「繧ケ縺ォ縺ェ縺」縺ヲ縺縺セ縺吶ゅ◎縺励※縲_CODE_PAGE縺ァ謖螳壹&繧後k ANSI/OEM繧ウ繝シ繝(SBCS縺セ縺溘ッDBCS)縺ョ譁蟄怜励→縺励※謇ア繧上l縺セ縺吶ゅヵ繧。繧、繝ォ蜷榊・蜃コ蜉帙rUnicode縺ィ縺吶k讒区(LFN讒区舌〒縲√°縺、_LFN_UNICODE繧 1)縺ォ縺励◆縺ィ縺阪ッ縲TCHAR縺ッ繝ッ繧、繝画枚蟄(unsigned short)縺ォ蛻繧頑崛繧上j縲√ヱ繧ケ蜷阪↓Unicode繧剃スソ逕ィ縺吶k繧医≧縺ォ縺ェ繧翫∪縺吶ゅ%繧後↓繧医j LFN繝輔Ν蟇セ蠢懊→縺ェ繧翫、NSI/OEM繧ウ繝シ繝峨↓縺ェ縺譁蟄(縺溘→縺医ー 笨昶亂笨。笘ク笘ュ縺ェ縺ゥ)繧ゆスソ逕ィ縺ァ縺阪∪縺吶ゅ%縺ョ險ュ螳壹ッ譁蟄怜怜・蜃コ蜉幃未謨ー縺ョ繝繝シ繧ソ蝙九→繧ィ繝ウ繧ウ繝シ繝繧」繝ウ繧ー縺ォ繧ょスア髻ソ繧剃ク弱∴縺セ縺吶ゅΜ繝繝ゥ繝ォ譁蟄怜励r螳夂セゥ縺吶k縺ィ縺阪∵ャ。縺ォ遉コ縺吶h縺縺ォ_T(s)縺翫h縺ウ_TEXT(s)繝槭け繝ュ繧剃スソ縺」縺ヲANSI/OEM縺ィUnicode繧定ェ蜍募繧頑崛縺医☆繧九%縺ィ縺後〒縺阪∪縺吶

      f_open(fp, "filename.txt", FA_READ);      /* ANSI/OEM蟆ら畑繧ウ繝シ繝 */
    @@ -47,7 +47,7 @@
     
     


    -

    隲也炊繝峨Λ繧、繝(繝懊Μ繝・繝シ繝)縺ィ迚ゥ逅繝峨Λ繧、繝(繝繧」繧ケ繧ッ陬鄂ョ)縺ョ蟇セ蠢

    +

    隲也炊繝峨Λ繧、繝(繝懊Μ繝・繝シ繝)縺ィ迚ゥ逅繝峨Λ繧、繝(繝繧」繧ケ繧ッ陬鄂ョ)縺ョ蟇セ蠢

    繝繝輔か繝ォ繝医ョ讒区舌〒縺ッ縲√◎繧後◇繧後ョ隲也炊繝峨Λ繧、繝悶ッ蜷後§逡ェ蜿キ縺ョ迚ゥ逅繝峨Λ繧、繝悶↓1:1縺ァ邨舌ウ縺、縺代i繧後※縺縺ヲ縲∫黄逅繝峨Λ繧、繝悶ョ蜈磯ュ縺ョ蛹コ逕サ縺ォ縺ゅk繝懊Μ繝・繝シ繝縺後槭え繝ウ繝医&繧後∪縺吶_MULTI_PARTITION縺ォ 1繧呈欠螳壹☆繧九→縲∝九縺ョ隲也炊繝峨Λ繧、繝悶↓蟇セ縺励※蛟句挨縺ォ迚ゥ逅繝峨Λ繧、繝也分蜿キ繝サ蛹コ逕サ繧呈欠螳壹〒縺阪k繧医≧縺ォ縺ェ繧翫∪縺吶ゅ%縺ョ讒区舌〒縺ッ縲∬ォ也炊繝峨Λ繧、繝悶→蛹コ逕サ縺ョ蟇セ蠢懊r隗」豎コ縺吶k縺溘a縺ョ繝繝シ繝悶Ν繧呈ャ。縺ォ遉コ縺吶h縺縺ォ螳夂セゥ縺吶k蠢隕√′縺ゅj縺セ縺吶

     萓:隲也炊繝峨Λ繧、繝0ス2繧堤黄逅繝峨Λ繧、繝0(蝗コ螳壹ョ繧」繧ケ繧ッ)縺ョ3縺、縺ョ蝓コ譛ャ蛹コ逕サ縺ォ蜑イ繧雁ス薙※縲
    diff --git a/doc/ja/forward.html b/doc/ja/forward.html
    index 8eebaf7..fed6bdf 100644
    --- a/doc/ja/forward.html
    +++ b/doc/ja/forward.html
    @@ -60,7 +60,7 @@ FRESULT f_forward (
     
     

    解説

    -

    ファイルのデータをバッファに読み出さずに送信ストリームに直接転送します。アプリケーション側でデータ・バッファを必要としないので、メモリの限られた環境で有効です。転送開始位置は、現在のファイルR/Wポインタからになります。ファイルR/Wポインタは転送されたバイト数だけ進みます。指定されたバイト数の転送中にファイルの終端に達した場合や送信ストリームがビジーになった場合、*ByteFwdByteToFwdよりも小さくなります。

    +

    ファイルのデータをバッファに読み出さずに送信ストリームに直接転送します。アプリケーション側でデータ・バッファを必要としないので、メモリの限られた環境で有効です。リード/ライト・ポインタは転送されたバイト数だけ進みます。指定されたバイト数の転送中にファイルの終端に達した場合や送信ストリームがビジーになった場合、*ByteFwdByteToFwdよりも小さくなります。

    @@ -129,7 +129,7 @@ FRESULT play_file ( /* ファイルを閉じて戻る */ f_close(&fil); - return rc; + return rc; }
    diff --git a/doc/ja/getfree.html b/doc/ja/getfree.html index c8d5963..d408263 100644 --- a/doc/ja/getfree.html +++ b/doc/ja/getfree.html @@ -81,7 +81,7 @@ FRESULT f_getfree ( if (res) die(res); /* 全セクタ数と空きセクタ数を計算 */ - tot_sect = (fs->max_clust - 2) * fs->csize; + tot_sect = (fs->n_fatent - 2) * fs->csize; fre_sect = fre_clust * fs->csize; /* ドライブサイズと空きサイズの表示 (512バイト/セクタと仮定) */ diff --git a/doc/ja/lseek.html b/doc/ja/lseek.html index 7389479..3f7e2b7 100644 --- a/doc/ja/lseek.html +++ b/doc/ja/lseek.html @@ -106,7 +106,7 @@ FRESULT f_lseek ( DWORD lktbl[SZ_TBL]; /* リンク・マップ・テーブル格納バッファ */ - res = f_lseek(&file, ofs1); /* 通常シーク (オープン時は file.cltbl == NULL) */ + res = f_lseek(&file, ofs1); /* 通常シーク (オープン時、file.cltbl == NULL) */ file.cltbl = lktbl; /* 高速シーク機能の有効化 */ lktbl[0] = SZ_TBL; /* 先頭要素に配列要素数をセット */ diff --git a/doc/ja/mkdir.html b/doc/ja/mkdir.html index 3a60a25..9fe4fcf 100644 --- a/doc/ja/mkdir.html +++ b/doc/ja/mkdir.html @@ -44,7 +44,7 @@ FRESULT f_mkdir (
    FR_DENIED
    ディスクやディレクトリ・エントリが満杯の場合など。
    FR_EXIST
    -
    同名のディレクトリやファイルが存在する。
    +
    同名のオブジェクトが存在する。
    FR_NOT_READY
    メディアがセットされていないなど、物理ドライブが動作不能状態。
    FR_WRITE_PROTECTED
    diff --git a/doc/ja/mkfs.html b/doc/ja/mkfs.html index 4f3bdde..5e9d25d 100644 --- a/doc/ja/mkfs.html +++ b/doc/ja/mkfs.html @@ -13,7 +13,7 @@

    f_mkfs

    -

    ドライブ上にFATファイル・システムを作成(フォーマット)します。

    +

    物理ドライブ上にFATボリュームを作成(フォーマット)します。

     FRESULT f_mkfs (
       BYTE  Drive,              /* 論理ドライブ番号 */
    @@ -29,7 +29,7 @@ FRESULT f_mkfs (
     
    Drive
    フォーマットする論理ドライブ(0-9)。
    PartitioningRule
    -
    0を指定すると、ドライブの全領域を占める基本DOS区画を作成したあと、その区画にファイル・システムを作成します(FDISKフォーマット)。1を指定すると、区画テーブルを作成せず物理ドライブの先頭セクタから直接ファイル・システムを作成します(super floppy (SFD) フォーマット)。
    +
    0を指定すると、ドライブの全領域を占める基本DOS区画を作成したあと、そこにFATボリュームを作成します(FDISKフォーマット)。1を指定すると、区画テーブルを作成せず物理ドライブの先頭セクタから直接ファイル・システムを作成します(super floppy (SFD) フォーマット)。
    AllocSize
    クラスタ・サイズをバイト単位で指定します。2の累乗、且つセクタ・サイズ以上、且つセクタ・サイズの128倍以下でなければなりません。無効な値を指定した場合、ドライブ・サイズに応じたデフォルトのクラスタ・サイズが選択されます。特に指定しない場合は、0を指定して自動選択とします。
    @@ -55,7 +55,7 @@ FRESULT f_mkfs (
    • ディスク・サイズが小さすぎる。
    • 何らかの引数が不正。
    • -
    • そのクラスタ・サイズが使えない。クラスタ数が0xFF7と0xFFF7近辺になるとき発生する可能性がある。
    • +
    • そのクラスタ・サイズが使えない。クラスタ数がFATタイプの境界に近くなるとき発生する可能性がある。
    @@ -63,8 +63,9 @@ FRESULT f_mkfs (

    説明

    -

    f_mkfs関数はFATファイル・システムをドライブ上に作成します。リムーバブル・メディアのパーテーショニング・ルールとしてはFDISK形式とSFD形式があり、メモリ・カードではFDISK形式が普通です。この関数は複数区画には対応していないので、その物理ドライブの既存の区画は全て削除され、全体が一つの区画になります。

    +

    f_mkfs関数は物理ドライブ上にFATボリュームを作成します。リムーバブル・メディアのパーテーショニング・ルールとしてはFDISK形式とSFD形式があり、メモリ・カードではFDISK形式が普通です。この関数は複数区画には対応していないので、その物理ドライブの既存の区画は全て削除され、全体が一つの区画になります。

    FATタイプ(FAT12/FAT16/FAT32)は、その論理ドライブ上のクラスタ数によってのみ決定される決まり[FAT仕様書より]になっていて、それ以外の要因はありません。したがって、どのFATタイプになるかはドライブ・サイズとクラスタ・サイズに依存します。クラスタ・サイズは大きくするほど性能が上がり、逆にディスク利用効率は落ちます。

    +

    クラスタ数がFATタイプの境界に近くなるときは、FR_MKFS_ABORTEDで関数が失敗する可能性があります。

    diff --git a/doc/ja/mount.html b/doc/ja/mount.html index 6139527..76989f6 100644 --- a/doc/ja/mount.html +++ b/doc/ja/mount.html @@ -46,7 +46,7 @@ FRESULT f_mount (

    解説

    FatFsモジュールではそれぞれの論理ドライブにファイル・システム・オブジェクトというワーク・エリアが必要です。この関数は論理ドライブにそのワーク・エリアを登録したり抹消したりします。何らかのファイル関数を使用する前にこの関数でその論理ドライブのワーク・エリアを与えておかなければなりません。FileSystemObjectにヌル・ポインタを指定するとその論理ドライブのワーク・エリアの登録は抹消され、登録されていたワーク・エリアは破棄できます。操作対象のドライブに対して開かれているファイルやディレクトリがあった場合、それらは全て無効になります。

    -

    この関数内では下位レイヤ(物理ドライブ)へのアクセスは発生せず、ワーク・エリアを初期化して内部配列にそのアドレスを登録するだけです。実際のマウント動作は、f_mount()またはメディア交換後、最初のファイル・アクセスのときに行われます。

    +

    この関数は、ドライブの状態に関わらず常に成功します。関数内では下位レイヤ(物理ドライブ)へのアクセスは発生せず、ワーク・エリアを初期化して内部配列にそのアドレスを登録するだけです。実際のマウント動作は、この関数の実行またはメディア交換発生の後、最初のファイル・アクセスのときに行われます。

    diff --git a/doc/ja/open.html b/doc/ja/open.html index 13dabc8..c81913c 100644 --- a/doc/ja/open.html +++ b/doc/ja/open.html @@ -37,8 +37,8 @@ FRESULT f_open ( FA_READ読み出しモードで開きます。読み書きする場合はFA_WRITEと共に指定します。 FA_WRITE書き込みモードで開きます。読み書きする場合はFA_READと共に指定します。 FA_OPEN_EXISTING既存のファイルを開きます。ファイルが無いときはエラーになります。(デフォルト) -FA_OPEN_ALWAYS既存のファイルを開きます。ファイルが無いときはファイルを作成します。追記する場合は、この方法でオープンした後、f_lseek()でファイルの最後尾に移動してください。 -FA_CREATE_NEWファイルを作成します。同名のファイルがある場合は、エラーになります。 +FA_OPEN_ALWAYS既存のファイルを開きます。ファイルが無いときはファイルを作成します。追記操作する場合は、この方法でオープンした後、f_lseek()でファイルの最後尾に移動してください。 +FA_CREATE_NEWファイルを作成します。同名のファイルがある場合は、エラー(FR_EXIST)になります。 FA_CREATE_ALWAYSファイルを作成します。同名のファイルがある場合は、サイズを0にしてから開きます。 @@ -60,9 +60,15 @@ FRESULT f_open (
    FR_INVALID_DRIVE
    ドライブ番号が不正。
    FR_EXIST
    -
    同名のファイルが既にある。
    +
    同名のファイルが既に存在する。
    FR_DENIED
    -
    アクセスが拒否された。リード・オンリー・ファイルの書き込みモード・オープン、同名のディレクトリまたはリード・オンリー・ファイルがある状態でのファイル作成、ディスクまたはディレクトリ・テーブルが満杯でファイルを作成できないなど。
    +
    アクセスが拒否された。 +
      +
    • リード・オンリー・ファイルの書き込みモード・オープン。
    • +
    • 同名のディレクトリまたはリード・オンリー・ファイルがある状態でのファイル作成。
    • +
    • ディレクトリ・テーブルが満杯でファイルを作成できない。
    • +
    +
    FR_NOT_READY
    メディアがセットされていないなど、物理ドライブが動作不能状態。
    FR_WRITE_PROTECTED
    @@ -76,7 +82,7 @@ FRESULT f_open (
    FR_NO_FILESYSTEM
    有効なFATボリュームが見つからない。
    FR_LOCKED
    -
    ファイル共有機能によるアクセス拒否。
    +
    ファイル共有機能(_FS_SHARE)によるアクセス拒否。
    @@ -105,7 +111,7 @@ void main (void) FRESULT res; /* FatFs function common result code */ UINT br, bw; /* File R/W count */ - /* ドライブ0,1にワーク・エリアを与える */ + /* ドライブ0,1にワーク・エリアを与える (常に成功する) */ f_mount(0, &fs[0]); f_mount(1, &fs[1]); diff --git a/doc/ja/readdir.html b/doc/ja/readdir.html index 4580517..4bda830 100644 --- a/doc/ja/readdir.html +++ b/doc/ja/readdir.html @@ -26,7 +26,7 @@ FRESULT f_readdir (

    引数

    DirObject
    -
    ディレクトリ・オブジェクト構造体へのポインタを指定します。
    +
    有効なディレクトリ・オブジェクト構造体へのポインタを指定します。
    FileInfo
    読み出したディレクトリ項目を格納するファイル情報構造体へのポインタを指定します。
    diff --git a/doc/ja/rename.html b/doc/ja/rename.html index b4f75c9..5f54f0c 100644 --- a/doc/ja/rename.html +++ b/doc/ja/rename.html @@ -13,11 +13,11 @@

    f_rename

    -

    ファイルまたはディレクトリの名前の変更または移動。

    +

    オブジェクトの名前の変更または移動。

     FRESULT f_rename (
    -  const TCHAR* OldName, /* 古いファイルまたはディレクトリ名 */
    -  const TCHAR* NewName  /* 新しいファイルまたはディレクトリ名 */
    +  const TCHAR* OldName, /* 古いオブジェクト名 */
    +  const TCHAR* NewName  /* 新しいオブジェクト名 */
     );
     
    @@ -28,7 +28,7 @@ FRESULT f_rename (
    OldName
    変更対象のオブジェクト(ファイルまたはディレクトリ)へのパス名の入った'\0'で終わる文字列へのポインタを指定します。
    NewName
    -
    新しいファイルまたはディレクトリのフルパス名の入った'\0'で終わる文字列へのポインタを指定します。既に存在する名前は使えません。また、ドライブ番号は指定できず、OldNameで指定された論理ドライブ上のオブジェクトとして扱われます。
    +
    新しいオブジェクトのフルパス名の入った'\0'で終わる文字列へのポインタを指定します。既に存在する名前は使えません。また、ドライブ番号は指定できず、OldNameで指定された論理ドライブ上のオブジェクトとして扱われます。
    @@ -62,13 +62,15 @@ FRESULT f_rename (
    論理ドライブにワークエリアが割り当てられていない。
    FR_NO_FILESYSTEM
    有効なFATボリュームが見つからない。
    +
    FR_LOCKED
    +
    ファイル共有機能(_FS_SHARE)によるアクセス拒否。

    解説

    -

    オブジェクトの名前を変更します。また、別のディレクトリへの移動(同じドライブ内のみ)も可能です。開かれているオブジェクトに対して使用してはなりません

    +

    オブジェクトの名前を変更します。また、別のディレクトリへの移動も可能です。開かれているオブジェクトに対して使用してはなりません

    diff --git a/doc/ja/sfile.html b/doc/ja/sfile.html index 7b0385a..6a1ed88 100644 --- a/doc/ja/sfile.html +++ b/doc/ja/sfile.html @@ -21,9 +21,9 @@ typedef struct { WORD id; /* 親ファイル・システム・オブジェクトのマウントID */ BYTE flag; /* ファイル・ステータス・フラグ */ BYTE pad1; - DWORD fptr; /* ファイル読み書きポインタ(ファイル先頭からのバイト・オフセット) */ + DWORD fptr; /* ファイル読み書きポインタ (ファイル先頭からのバイト・オフセット) */ DWORD fsize; /* ファイル・サイズ(バイト単位) */ - DWORD org_clust; /* ファイル開始クラスタ番号 (0: fsize==0) */ + DWORD org_clust; /* ファイル開始クラスタ番号 (0 on fsize==0) */ DWORD curr_clust; /* 現在のクラスタ */ DWORD dsect; /* 現在のデータ・セクタ */ #if _FS_READONLY == 0 @@ -31,7 +31,7 @@ typedef struct { BYTE* dir_ptr; /* このファイルのディレクトリへのポインタ */ #endif #if _USE_FASTSEEK - DWORD* cltbl; /* ファイルのクラスタ・リンク情報へのポインタ */ + DWORD* cltbl; /* ファイルのクラスタ・リンク情報へのポインタ (Nulled on file open) */ #endif #if _FS_SHARE UINT lockid; /* ファイル・ロックID */ diff --git a/doc/ja/stat.html b/doc/ja/stat.html index d1ef041..a4599f9 100644 --- a/doc/ja/stat.html +++ b/doc/ja/stat.html @@ -16,7 +16,7 @@
     FRESULT f_stat (
       const TCHAR* FileName,  /* ファイルまたはディレクトリ名へのポインタ */
    -  FILINFO* FileInfo       /* ファイル情報構造体へのポインタ *
    +  FILINFO* FileInfo       /* ファイル情報構造体へのポインタ */
     );
     
    diff --git a/doc/ja/truncate.html b/doc/ja/truncate.html index 601532f..da491ba 100644 --- a/doc/ja/truncate.html +++ b/doc/ja/truncate.html @@ -51,7 +51,7 @@ FRESULT f_truncate (

    解説

    -

    ファイルの長さが現在のファイルR/Wポインタに切り詰められます。ファイルR/Wポインタがファイルの終端を指しているときは、この関数は何の効果も持ちません。

    +

    ファイルの長さが現在のリード/ライト・ポインタに切り詰められます。リード/ライト・ポインタが既にファイルの終端を指しているときは、この関数は何の効果も持ちません。

    diff --git a/doc/ja/unlink.html b/doc/ja/unlink.html index 86ed443..a357586 100644 --- a/doc/ja/unlink.html +++ b/doc/ja/unlink.html @@ -44,7 +44,7 @@ FRESULT f_unlink (
    FR_INVALID_DRIVE
    ドライブ番号が不正。
    FR_DENIED
    -
    対象オブジェクトがリード・オンリー属性、ディレクトリの場合は空でない場合など。
    +
    対象オブジェクトがリード・オンリー属性、空でないディレクトリやカレント・ディレクトリ。
    FR_NOT_READY
    メディアがセットされていないなど、物理ドライブが動作不能状態。
    FR_WRITE_PROTECTED
    @@ -58,14 +58,14 @@ FRESULT f_unlink (
    FR_NO_FILESYSTEM
    有効なFATボリュームが見つからない。
    FR_LOCKED
    -
    ファイル共有機能によるアクセス拒否。
    +
    ファイル共有機能(_FS_SHARE)によるアクセス拒否。

    解説

    -

    オブジェクトを削除します。開かれているオブジェクトやカレント・ディレクトリは削除してはなりません

    +

    オブジェクトを削除します。開かれているオブジェクトは削除してはなりません

    diff --git a/doc/ja/utime.html b/doc/ja/utime.html index 3a7f3f4..95156b8 100644 --- a/doc/ja/utime.html +++ b/doc/ja/utime.html @@ -86,7 +86,7 @@ FRESULT set_timestamp ( fno.fdate = (WORD)(((year - 1980) * 512U) | month * 32U | mday); fno.ftime = (WORD)(hour * 2048U | min * 32U | sec / 2U); - return f_utime(obj, &fno); + return f_utime(obj, &fno); }
    diff --git a/doc/ja/write.html b/doc/ja/write.html index 3e75c93..bb69582 100644 --- a/doc/ja/write.html +++ b/doc/ja/write.html @@ -44,14 +44,14 @@ FRESULT f_write (
    FR_OK (0)
    正常終了。
    -
    FR_DENIED
    -
    非書き込みモードで開かれたファイルに書き込もうとした。
    FR_DISK_ERR
    ディスク・エラーによる失敗。
    FR_INT_ERR
    不正なFAT構造または内部エラーによる失敗。
    FR_NOT_READY
    メディアがセットされていないなど、物理ドライブが動作不能状態。
    +
    FR_DENIED
    +
    非書き込みモードで開かれたファイルに書き込もうとした。
    FR_INVALID_OBJECT
    無効なファイルオブジェクト。
    diff --git a/doc/updates.txt b/doc/updates.txt index 04e07e7..d3434bd 100644 --- a/doc/updates.txt +++ b/doc/updates.txt @@ -1,3 +1,10 @@ +R0.08a, Aug 16, 2010 + Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. + Fixed f_mkfs() creates wrong FAT32 volume. + R0.08, May 15, 2010 Added a memory configuration option. (_USE_LFN) Added file lock feature. (_FS_SHARE) diff --git a/src/00readme.txt b/src/00readme.txt index fa2fa84..42b7fd7 100644 --- a/src/00readme.txt +++ b/src/00readme.txt @@ -1,4 +1,4 @@ -FatFs Module Source Files R0.08 (C)ChaN, 2010 +FatFs Module Source Files R0.08a (C)ChaN, 2010 FILES @@ -7,7 +7,6 @@ FILES ff.h Common include file for FatFs and application module. ff.c FatFs module. diskio.h Common include file for FatFs and disk I/O module. - diskio.c Skeleton of low level disk I/O module. integer.h Alternative type definitions for integer variables. option Optional external functions. @@ -115,3 +114,10 @@ REVISION HISTORY Changed some types on the API, XCHAR->TCHAR. Changed fname member in the FILINFO structure on Unicode cfg. String functions support UTF-8 encoding files on Unicode cfg. + + Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. + Fixed f_mkfs() creates wrong FAT32 volume. + diff --git a/src/diskio.c b/src/diskio.c deleted file mode 100644 index 6e012b0..0000000 --- a/src/diskio.c +++ /dev/null @@ -1,213 +0,0 @@ -/*-----------------------------------------------------------------------*/ -/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */ -/*-----------------------------------------------------------------------*/ -/* This is a stub disk I/O module that acts as front end of the existing */ -/* disk I/O modules and attach it to FatFs module with common interface. */ -/*-----------------------------------------------------------------------*/ - -#include "diskio.h" - -/*-----------------------------------------------------------------------*/ -/* Correspondence between physical drive number and physical drive. */ -/*-----------------------------------------------------------------------*/ - -#define ATA 0 -#define MMC 1 -#define USB 2 - - - -/*-----------------------------------------------------------------------*/ -/* Inidialize a Drive */ -/*-----------------------------------------------------------------------*/ - -DSTATUS disk_initialize ( - BYTE drv /* Physical drive nmuber (0..) */ -) -{ - DSTATUS stat; - int result; - - switch (drv) { - case ATA : - result = ATA_disk_initialize(); - // translate the reslut code here - - return stat; - - case MMC : - result = MMC_disk_initialize(); - // translate the reslut code here - - return stat; - - case USB : - result = USB_disk_initialize(); - // translate the reslut code here - - return stat; - } - return STA_NOINIT; -} - - - -/*-----------------------------------------------------------------------*/ -/* Return Disk Status */ -/*-----------------------------------------------------------------------*/ - -DSTATUS disk_status ( - BYTE drv /* Physical drive nmuber (0..) */ -) -{ - DSTATUS stat; - int result; - - switch (drv) { - case ATA : - result = ATA_disk_status(); - // translate the reslut code here - - return stat; - - case MMC : - result = MMC_disk_status(); - // translate the reslut code here - - return stat; - - case USB : - result = USB_disk_status(); - // translate the reslut code here - - return stat; - } - return STA_NOINIT; -} - - - -/*-----------------------------------------------------------------------*/ -/* Read Sector(s) */ -/*-----------------------------------------------------------------------*/ - -DRESULT disk_read ( - BYTE drv, /* Physical drive nmuber (0..) */ - BYTE *buff, /* Data buffer to store read data */ - DWORD sector, /* Sector address (LBA) */ - BYTE count /* Number of sectors to read (1..255) */ -) -{ - DRESULT res; - int result; - - switch (drv) { - case ATA : - result = ATA_disk_read(buff, sector, count); - // translate the reslut code here - - return res; - - case MMC : - result = MMC_disk_read(buff, sector, count); - // translate the reslut code here - - return res; - - case USB : - result = USB_disk_read(buff, sector, count); - // translate the reslut code here - - return res; - } - return RES_PARERR; -} - - - -/*-----------------------------------------------------------------------*/ -/* Write Sector(s) */ -/*-----------------------------------------------------------------------*/ -/* The FatFs module will issue multiple sector transfer request -/ (count > 1) to the disk I/O layer. The disk function should process -/ the multiple sector transfer properly Do. not translate it into -/ multiple single sector transfers to the media, or the data read/write -/ performance may be drasticaly decreased. */ - -#if _READONLY == 0 -DRESULT disk_write ( - BYTE drv, /* Physical drive nmuber (0..) */ - const BYTE *buff, /* Data to be written */ - DWORD sector, /* Sector address (LBA) */ - BYTE count /* Number of sectors to write (1..255) */ -) -{ - DRESULT res; - int result; - - switch (drv) { - case ATA : - result = ATA_disk_write(buff, sector, count); - // translate the reslut code here - - return res; - - case MMC : - result = MMC_disk_write(buff, sector, count); - // translate the reslut code here - - return res; - - case USB : - result = USB_disk_write(buff, sector, count); - // translate the reslut code here - - return res; - } - return RES_PARERR; -} -#endif /* _READONLY */ - - - -/*-----------------------------------------------------------------------*/ -/* Miscellaneous Functions */ -/*-----------------------------------------------------------------------*/ - -DRESULT disk_ioctl ( - BYTE drv, /* Physical drive nmuber (0..) */ - BYTE ctrl, /* Control code */ - void *buff /* Buffer to send/receive control data */ -) -{ - DRESULT res; - int result; - - switch (drv) { - case ATA : - // pre-process here - - result = ATA_disk_ioctl(ctrl, buff); - // post-process here - - return res; - - case MMC : - // pre-process here - - result = MMC_disk_ioctl(ctrl, buff); - // post-process here - - return res; - - case USB : - // pre-process here - - result = USB_disk_ioctl(ctrl, buff); - // post-process here - - return res; - } - return RES_PARERR; -} - diff --git a/src/diskio.h b/src/diskio.h index bf5d188..3abc509 100644 --- a/src/diskio.h +++ b/src/diskio.h @@ -1,11 +1,11 @@ /*----------------------------------------------------------------------- -/ Low level disk interface modlue include file R0.07 (C)ChaN, 2009 +/ Low level disk interface modlue include file (C)ChaN, 2010 /-----------------------------------------------------------------------*/ #ifndef _DISKIO -#define _READONLY 0 /* 1: Read-only mode */ -#define _USE_IOCTL 1 +#define _READONLY 0 /* 1: Remove write functions */ +#define _USE_IOCTL 1 /* 1: Use disk_ioctl fucntion */ #include "integer.h" @@ -26,6 +26,7 @@ typedef enum { /*---------------------------------------*/ /* Prototypes for disk control functions */ +int assign_drives (int, int); DSTATUS disk_initialize (BYTE); DSTATUS disk_status (BYTE); DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); @@ -43,26 +44,34 @@ DRESULT disk_ioctl (BYTE, BYTE, void*); #define STA_PROTECT 0x04 /* Write protected */ -/* Command code for disk_ioctrl() */ +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (defined for FatFs) */ +#define CTRL_SYNC 0 /* Flush disk cache (for write functions) */ +#define GET_SECTOR_COUNT 1 /* Get media size (for only f_mkfs()) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (for multiple sector size (_MAX_SS >= 1024)) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (for only f_mkfs()) */ +#define CTRL_ERASE_SECTOR 4 /* Force erased a block of sectors (for only _USE_ERASE) */ /* Generic command */ -#define CTRL_SYNC 0 /* Mandatory for write functions */ -#define GET_SECTOR_COUNT 1 /* Mandatory for only f_mkfs() */ -#define GET_SECTOR_SIZE 2 /* Mandatory for multiple sector size cfg */ -#define GET_BLOCK_SIZE 3 /* Mandatory for only f_mkfs() */ -#define CTRL_POWER 4 -#define CTRL_LOCK 5 -#define CTRL_EJECT 6 -/* MMC/SDC command */ -#define MMC_GET_TYPE 10 -#define MMC_GET_CSD 11 -#define MMC_GET_CID 12 -#define MMC_GET_OCR 13 -#define MMC_GET_SDSTAT 14 -/* ATA/CF command */ -#define ATA_GET_REV 20 -#define ATA_GET_MODEL 21 -#define ATA_GET_SN 22 +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + +/* NAND specific ioctl command */ +#define NAND_FORMAT 30 /* Create physical format */ #define _DISKIO diff --git a/src/ff.c b/src/ff.c index 236c86f..b09f32d 100644 --- a/src/ff.c +++ b/src/ff.c @@ -1,5 +1,5 @@ /*----------------------------------------------------------------------------/ -/ FatFs - FAT file system module R0.08 (C)ChaN, 2010 +/ FatFs - FAT file system module R0.08a (C)ChaN, 2010 /-----------------------------------------------------------------------------/ / FatFs module is a generic FAT file system module for small embedded systems. / This is a free software that opened for education, research and commercial @@ -46,14 +46,12 @@ / Feb 03,'08 R0.05a Added f_truncate() and f_utime(). / Fixed off by one error at FAT sub-type determination. / Fixed btr in f_read() can be mistruncated. -/ Fixed cached sector is not flushed when create and close -/ without write. +/ Fixed cached sector is not flushed when create and close without write. / / Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). -/ Improved performance of f_lseek() on moving to the same -/ or following cluster. +/ Improved performance of f_lseek() on moving to the same or following cluster. / -/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. (_FS_TINY) / Added long file name support. / Added multiple code page support. / Added re-entrancy for multitask operation. @@ -72,15 +70,19 @@ / Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. / Fixed name matching error on the 13 char boundary. / Added a configuration option, _LFN_UNICODE. -/ Changed f_readdir() to return the SFN with always upper -/ case on non-LFN cfg. +/ Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. / -/ May 15,'10 R0.08 Added a memory configuration option. (_USE_LFN) +/ May 15,'10 R0.08 Added a memory configuration option. (_USE_LFN = 3) / Added file lock feature. (_FS_SHARE) / Added fast seek feature. (_USE_FASTSEEK) / Changed some types on the API, XCHAR->TCHAR. / Changed fname member in the FILINFO structure on Unicode cfg. / String functions support UTF-8 encoding files on Unicode cfg. +/ Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) +/ Added sector erase feature. (_USE_ERASE) +/ Moved file lock semaphore table from fs object to the bss. +/ Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. +/ Fixed f_mkfs() creates wrong FAT32 volume. /---------------------------------------------------------------------------*/ #include "ff.h" /* FatFs configurations and declarations */ @@ -93,25 +95,20 @@ ---------------------------------------------------------------------------*/ -#if _FATFS != 8085 +#if _FATFS != 8255 #error Wrong include file (ff.h). #endif -/* FAT sub-type boundaries */ -/* Note that the FAT spec by Microsoft says 4085 but Windows works with 4087! */ -#define MIN_FAT16 4086 /* Minimum number of clusters for FAT16 */ -#define MIN_FAT32 65526 /* Minimum number of clusters for FAT32 */ - - -/* Definitions corresponds to multiple sector size */ -#if _MAX_SS == 512 /* Single sector size */ -#define SS(fs) 512U -#elif _MAX_SS == 1024 || _MAX_SS == 2048 || _MAX_SS == 4096 /* Multiple sector size */ -#define SS(fs) ((fs)->ssize) -#else +/* Definitions on sector size */ +#if _MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096 #error Wrong sector size. #endif +#if _MAX_SS != 512 +#define SS(fs) ((fs)->ssize) /* Multiple sector size */ +#else +#define SS(fs) 512U /* Fixed sector size */ +#endif /* Reentrancy related */ @@ -121,16 +118,33 @@ #endif #define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } #define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } - #else #define ENTER_FF(fs) #define LEAVE_FF(fs, res) return res - #endif #define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } +/* File shareing feature */ +#if _FS_SHARE +#if _FS_READONLY +#error _FS_SHARE must be 0 on read-only cfg. +#endif +typedef struct { + FATFS *fs; /* File ID 1, volume (NULL:blank entry) */ + DWORD clu; /* File ID 2, directory */ + WORD idx; /* File ID 3, directory index */ + WORD ctr; /* File open counter, 0:none, 0x01..0xFF:read open count, 0x100:write mode */ +} FILESEM; +#endif + + +/* Misc definitions */ +#define LD_CLUST(dir) (((DWORD)LD_WORD(dir+DIR_FstClusHI)<<16) | LD_WORD(dir+DIR_FstClusLO)) +#define ST_CLUST(dir,cl) {ST_WORD(dir+DIR_FstClusLO, cl); ST_WORD(dir+DIR_FstClusHI, (DWORD)cl>>16);} + + /* Character code support macros */ #define IsUpper(c) (((c)>='A')&&((c)<='Z')) #define IsLower(c) (((c)>='a')&&((c)<='z')) @@ -168,23 +182,93 @@ #define NS_DOT 0x20 /* Dot entry */ +/* FAT sub-type boundaries */ +/* Note that the FAT spec by Microsoft says 4085 but Windows works with 4087! */ +#define MIN_FAT16 4086 /* Minimum number of clusters for FAT16 */ +#define MIN_FAT32 65526 /* Minimum number of clusters for FAT32 */ + + +/* FatFs refers the members in the FAT structures as byte array instead of +/ structure member because there are incompatibility of the packing option +/ between compilers. */ + +#define BS_jmpBoot 0 +#define BS_OEMName 3 +#define BPB_BytsPerSec 11 +#define BPB_SecPerClus 13 +#define BPB_RsvdSecCnt 14 +#define BPB_NumFATs 16 +#define BPB_RootEntCnt 17 +#define BPB_TotSec16 19 +#define BPB_Media 21 +#define BPB_FATSz16 22 +#define BPB_SecPerTrk 24 +#define BPB_NumHeads 26 +#define BPB_HiddSec 28 +#define BPB_TotSec32 32 +#define BS_DrvNum 36 +#define BS_BootSig 38 +#define BS_VolID 39 +#define BS_VolLab 43 +#define BS_FilSysType 54 +#define BPB_FATSz32 36 +#define BPB_ExtFlags 40 +#define BPB_FSVer 42 +#define BPB_RootClus 44 +#define BPB_FSInfo 48 +#define BPB_BkBootSec 50 +#define BS_DrvNum32 64 +#define BS_BootSig32 66 +#define BS_VolID32 67 +#define BS_VolLab32 71 +#define BS_FilSysType32 82 +#define FSI_LeadSig 0 +#define FSI_StrucSig 484 +#define FSI_Free_Count 488 +#define FSI_Nxt_Free 492 +#define MBR_Table 446 +#define BS_55AA 510 + +#define DIR_Name 0 +#define DIR_Attr 11 +#define DIR_NTres 12 +#define DIR_CrtTime 14 +#define DIR_CrtDate 16 +#define DIR_FstClusHI 20 +#define DIR_WrtTime 22 +#define DIR_WrtDate 24 +#define DIR_FstClusLO 26 +#define DIR_FileSize 28 +#define LDIR_Ord 0 +#define LDIR_Attr 11 +#define LDIR_Type 12 +#define LDIR_Chksum 13 +#define LDIR_FstClusLO 26 + + /*------------------------------------------------------------*/ /* Work area */ -#if !_DRIVES +#if _VOLUMES +static +FATFS *FatFs[_VOLUMES]; /* Pointer to the file system objects (logical drives) */ +#else #error Number of drives must not be 0. #endif + static WORD Fsid; /* File system mount ID */ -static -FATFS *FatFs[_DRIVES]; /* Pointer to the file system objects (logical drives) */ #if _FS_RPATH static -BYTE Drive; /* Current drive */ +BYTE CurrVol; /* Current drive */ #endif +#if _FS_SHARE +static +FILESEM Files[_FS_SHARE]; /* File lock semaphores */ +#endif #if _USE_LFN == 0 /* No LFN */ #define DEF_NAMEBUF BYTE sfn[12] @@ -192,13 +276,13 @@ BYTE Drive; /* Current drive */ #define FREE_BUF() #elif _USE_LFN == 1 /* LFN with static LFN working buffer */ -static WCHAR LfnBuf[_MAX_LFN + 1]; +static WCHAR LfnBuf[_MAX_LFN+1]; #define DEF_NAMEBUF BYTE sfn[12] #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = LfnBuf; } #define FREE_BUF() #elif _USE_LFN == 2 /* LFN with dynamic LFN working buffer on the stack */ -#define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN + 1] +#define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1] #define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = lbuf; } #define FREE_BUF() @@ -229,7 +313,7 @@ static WCHAR LfnBuf[_MAX_LFN + 1]; /* Copy memory to memory */ static -void mem_cpy (void* dst, const void* src, int cnt) { +void mem_cpy (void* dst, const void* src, UINT cnt) { BYTE *d = (BYTE*)dst; const BYTE *s = (const BYTE*)src; @@ -246,7 +330,7 @@ void mem_cpy (void* dst, const void* src, int cnt) { /* Fill memory */ static -void mem_set (void* dst, int val, int cnt) { +void mem_set (void* dst, int val, UINT cnt) { BYTE *d = (BYTE*)dst; while (cnt--) @@ -255,7 +339,7 @@ void mem_set (void* dst, int val, int cnt) { /* Compare memory to memory */ static -int mem_cmp (const void* dst, const void* src, int cnt) { +int mem_cmp (const void* dst, const void* src, UINT cnt) { const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; int r = 0; @@ -318,18 +402,19 @@ FRESULT chk_lock ( /* Check if the file can be accessed */ /* Search file semaphore table */ for (i = be = 0; i < _FS_SHARE; i++) { - if (dj->fs->flsem[i].ctr) { /* Existing entry */ - if (dj->fs->flsem[i].clu == dj->sclust && /* The file is found (identified with its location) */ - dj->fs->flsem[i].idx == dj->index) break; - } else { /* Blank entry */ + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dj->fs && /* Check if the file matched with an open file */ + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; + } else { /* Blank entry */ be++; } } - if (i == _FS_SHARE) /* The file has not been opened */ - return (be || acc != 2) ? FR_OK : FR_TOO_MANY_OPEN_FILES; /* Is there a blank entry for new file? */ + if (i == _FS_SHARE) /* The file is not opened */ + return (be || acc == 2) ? FR_OK : FR_TOO_MANY_OPEN_FILES; /* Is there a blank entry for new file? */ /* The file has been opened. Reject any open against writing file and all write mode open */ - return (acc || dj->fs->flsem[i].ctr == 0x100) ? FR_LOCKED : FR_OK; + return (acc || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; } @@ -340,7 +425,7 @@ int enq_lock ( /* Check if an entry is available for a new file */ { UINT i; - for (i = 0; i < _FS_SHARE && fs->flsem[i].ctr; i++) ; + for (i = 0; i < _FS_SHARE && Files[i].fs; i++) ; return (i == _FS_SHARE) ? 0 : 1; } @@ -355,21 +440,23 @@ UINT inc_lock ( /* Increment file open counter and returns its index (0:int erro for (i = 0; i < _FS_SHARE; i++) { /* Find the file */ - if (dj->fs->flsem[i].ctr && - dj->fs->flsem[i].clu == dj->sclust && - dj->fs->flsem[i].idx == dj->index) break; + if (Files[i].fs == dj->fs && + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; } if (i == _FS_SHARE) { /* Not opened. Register it as new. */ - for (i = 0; i < _FS_SHARE && dj->fs->flsem[i].ctr; i++) ; + for (i = 0; i < _FS_SHARE && Files[i].fs; i++) ; if (i == _FS_SHARE) return 0; /* No space to register (int err) */ - dj->fs->flsem[i].clu = dj->sclust; - dj->fs->flsem[i].idx = dj->index; + Files[i].fs = dj->fs; + Files[i].clu = dj->sclust; + Files[i].idx = dj->index; + Files[i].ctr = 0; } - if (acc && dj->fs->flsem[i].ctr) return 0; /* Access violation (int err) */ + if (acc && Files[i].ctr) return 0; /* Access violation (int err) */ - dj->fs->flsem[i].ctr = acc ? 0x100 : dj->fs->flsem[i].ctr + 1; /* Set semaphore value */ + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ return i + 1; } @@ -377,7 +464,6 @@ UINT inc_lock ( /* Increment file open counter and returns its index (0:int erro static FRESULT dec_lock ( /* Decrement file open counter */ - FATFS* fs, /* File system object */ UINT i /* Semaphore index */ ) { @@ -386,10 +472,11 @@ FRESULT dec_lock ( /* Decrement file open counter */ if (--i < _FS_SHARE) { - n = fs->flsem[i].ctr; - if (n >= 0x100) n = 0; + n = Files[i].ctr; + if (n == 0x100) n = 0; if (n) n--; - fs->flsem[i].ctr = n; + Files[i].ctr = n; + if (!n) Files[i].fs = 0; res = FR_OK; } else { res = FR_INT_ERR; @@ -397,6 +484,18 @@ FRESULT dec_lock ( /* Decrement file open counter */ return res; } + +static +void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < _FS_SHARE; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} #endif @@ -481,6 +580,24 @@ FRESULT sync ( /* FR_OK: successful, FR_DISK_ERR: failed */ +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + + +DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= (fs->n_fatent - 2)) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + /*-----------------------------------------------------------------------*/ /* FAT access - Read value of a FAT entry */ /*-----------------------------------------------------------------------*/ @@ -599,7 +716,9 @@ FRESULT remove_chain ( { FRESULT res; DWORD nxt; - +#if _USE_ERASE + DWORD scl = clst, ecl = clst, resion[2]; +#endif if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ res = FR_INT_ERR; @@ -617,6 +736,16 @@ FRESULT remove_chain ( fs->free_clust++; fs->fsi_flag = 1; } +#if _USE_ERASE + if (ecl + 1 == nxt) { /* Next cluster is contiguous */ + ecl = nxt; + } else { /* End of contiguous clusters */ + resion[0] = clust2sect(fs, scl); /* Start sector */ + resion[1] = clust2sect(fs, ecl) + fs->csize - 1; /* End sector */ + disk_ioctl(fs->drv, CTRL_ERASE_SECTOR, resion); /* Erase the block */ + scl = ecl = nxt; + } +#endif clst = nxt; /* Next cluster */ } } @@ -639,6 +768,7 @@ DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk err ) { DWORD cs, ncl, scl; + FRESULT res; if (clst == 0) { /* Create a new chain */ @@ -666,44 +796,27 @@ DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk err if (ncl == scl) return 0; /* No free cluster */ } - if (put_fat(fs, ncl, 0x0FFFFFFF)) /* Mark the new cluster "last link" */ - return 0xFFFFFFFF; - if (clst != 0) { /* Link it to the previous one if needed */ - if (put_fat(fs, clst, ncl)) - return 0xFFFFFFFF; + res = put_fat(fs, ncl, 0x0FFFFFFF); /* Mark the new cluster "last link" */ + if (res == FR_OK && clst != 0) { + res = put_fat(fs, clst, ncl); /* Link it to the previous one if needed */ + } + if (res == FR_OK) { + fs->last_clust = ncl; /* Update FSINFO */ + if (fs->free_clust != 0xFFFFFFFF) { + fs->free_clust--; + fs->fsi_flag = 1; + } + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; } - fs->last_clust = ncl; /* Update FSINFO */ - if (fs->free_clust != 0xFFFFFFFF) { - fs->free_clust--; - fs->fsi_flag = 1; - } - - return ncl; /* Return new cluster number */ + return ncl; /* Return new cluster number or error code */ } #endif /* !_FS_READONLY */ -/*-----------------------------------------------------------------------*/ -/* Get sector# from cluster# */ -/*-----------------------------------------------------------------------*/ - - -DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ - FATFS *fs, /* File system object */ - DWORD clst /* Cluster# to be converted */ -) -{ - clst -= 2; - if (clst >= (fs->n_fatent - 2)) return 0; /* Invalid cluster# */ - return clst * fs->csize + fs->database; -} - - - - /*-----------------------------------------------------------------------*/ /* Directory handling - Set directory index */ /*-----------------------------------------------------------------------*/ @@ -725,13 +838,13 @@ FRESULT dir_sdi ( if (!clst && dj->fs->fs_type == FS_FAT32) /* Replace cluster# 0 with root cluster# if in FAT32 */ clst = dj->fs->dirbase; - if (clst == 0) { /* Static table */ + if (clst == 0) { /* Static table (root-dir in FAT12/16) */ dj->clust = clst; if (idx >= dj->fs->n_rootdir) /* Index is out of range */ return FR_INT_ERR; dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32); /* Sector# */ } - else { /* Dynamic table */ + else { /* Dynamic table (sub-dirs or root-dir in FAT32) */ ic = SS(dj->fs) / 32 * dj->fs->csize; /* Entries per cluster */ while (idx >= ic) { /* Follow cluster chain */ clst = get_fat(dj->fs, clst); /* Get next cluster */ @@ -833,7 +946,7 @@ int cmp_lfn ( /* 1:Matched, 0:Not matched */ BYTE *dir /* Pointer to the directory entry containing a part of LFN */ ) { - int i, s; + UINT i, s; WCHAR wc, uc; @@ -864,7 +977,7 @@ int pick_lfn ( /* 1:Succeeded, 0:Buffer overflow */ BYTE *dir /* Pointer to the directory entry */ ) { - int i, s; + UINT i, s; WCHAR wc, uc; @@ -899,7 +1012,7 @@ void fit_lfn ( BYTE sum /* SFN sum */ ) { - int i, s; + UINT i, s; WCHAR wc; @@ -936,7 +1049,7 @@ void gen_numname ( ) { BYTE ns[8], c; - int i, j; + UINT i, j; mem_cpy(dst, src, 11); @@ -981,7 +1094,7 @@ BYTE sum_sfn ( ) { BYTE sum = 0; - int n = 11; + UINT n = 11; do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); return sum; @@ -1129,7 +1242,8 @@ FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many fn = dj->fn; lfn = dj->lfn; mem_cpy(sn, fn, 12); - if (_FS_RPATH && (sn[NS] & NS_DOT)) return FR_INVALID_NAME; /* Cannot create dot entry */ + if (_FS_RPATH && (sn[NS] & NS_DOT)) /* Cannot create dot entry */ + return FR_INVALID_NAME; if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ fn[NS] = 0; dj->lfn = 0; /* Find only SFN */ @@ -1277,7 +1391,7 @@ FRESULT create_name ( #if _USE_LFN /* LFN configuration */ BYTE b, cf; WCHAR w, *lfn; - int i, ni, si, di; + UINT i, ni, si, di; const TCHAR *p; /* Create LFN in Unicode */ @@ -1291,13 +1405,13 @@ FRESULT create_name ( return FR_INVALID_NAME; #if !_LFN_UNICODE w &= 0xFF; - if (IsDBCS1(w)) { /* If it is a DBC 1st byte */ - b = p[si++]; /* Get 2nd byte */ - if (!IsDBCS2(b)) /* Reject invalid code for DBC */ - return FR_INVALID_NAME; - w = (w << 8) + b; + if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + b = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(b)) + return FR_INVALID_NAME; /* Reject invalid sequence */ + w = (w << 8) + b; /* Create a DBC */ } - w = ff_convert(w, 1); /* Convert OEM to Unicode */ + w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ if (!w) return FR_INVALID_NAME; /* Reject invalid code */ #endif if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */ @@ -1307,8 +1421,8 @@ FRESULT create_name ( *path = &p[si]; /* Return pointer to the next segment */ cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ #if _FS_RPATH - if ((di == 1 && lfn[di - 1] == '.') || /* Is this a dot entry? */ - (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { + if ((di == 1 && lfn[di-1] == '.') || /* Is this a dot entry? */ + (di == 2 && lfn[di-1] == '.' && lfn[di-2] == '.')) { lfn[di] = 0; for (i = 0; i < 11; i++) dj->fn[i] = (i < di) ? '.' : ' '; @@ -1317,7 +1431,7 @@ FRESULT create_name ( } #endif while (di) { /* Strip trailing spaces and dots */ - w = lfn[di - 1]; + w = lfn[di-1]; if (w != ' ' && w != '.') break; di--; } @@ -1359,14 +1473,14 @@ FRESULT create_name ( cf |= NS_LFN; /* Force create LFN entry */ } - if (_DF1S && w >= 0x100) { /* Double byte char */ + if (_DF1S && w >= 0x100) { /* Double byte char (always false on SBCS cfg) */ if (i >= ni - 1) { cf |= NS_LOSS | NS_LFN; i = ni; continue; } dj->fn[i++] = (BYTE)(w >> 8); } else { /* Single byte char */ - if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal chars for SFN */ - w = '_'; cf |= NS_LOSS | NS_LFN; /* Lossy conversion */ + if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal chars for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ } else { if (IsUpper(w)) { /* ASCII large capital */ b |= 2; @@ -1397,7 +1511,7 @@ FRESULT create_name ( #else /* Non-LFN configuration */ BYTE b, c, d, *sfn; - int ni, si, i; + UINT ni, si, i; const char *p; /* Create file name in directory form */ @@ -1426,24 +1540,24 @@ FRESULT create_name ( i = 8; ni = 11; b <<= 2; continue; } - if (c >= 0x80) { /* Extended char */ + if (c >= 0x80) { /* Extended char? */ + b |= 3; /* Eliminate NT flag */ #ifdef _EXCVT - c = excvt[c - 0x80]; /* Convert extend char (SBCS) */ + c = excvt[c-0x80]; /* Upper conversion (SBCS) */ #else - b |= 3; /* Eliminate NT flag if extended char is exist */ #if !_DF1S /* ASCII only cfg */ return FR_INVALID_NAME; #endif #endif } - if (IsDBCS1(c)) { /* DBC 1st byte? */ + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ d = (BYTE)p[si++]; /* Get 2nd byte */ if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ return FR_INVALID_NAME; sfn[i++] = c; sfn[i++] = d; } else { /* Single byte code */ - if (chk_chr("\"*+,:<=>\?[]|\x7F", c)) /* Reject illegal chrs for SFN */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) /* Reject illegal chrs for SFN */ return FR_INVALID_NAME; if (IsUpper(c)) { /* ASCII large capital? */ b |= 2; @@ -1484,7 +1598,7 @@ void get_fileinfo ( /* No return code */ FILINFO *fno /* Pointer to the file information to be filled */ ) { - int i; + UINT i; BYTE nt, *dir; TCHAR *p, c; @@ -1499,7 +1613,7 @@ void get_fileinfo ( /* No return code */ if (c == 0x05) c = (TCHAR)0xE5; if (_USE_LFN && (nt & NS_BODY) && IsUpper(c)) c += 0x20; #if _LFN_UNICODE - if (IsDBCS1(c) && i < 7 && IsDBCS2(dir[i + 1])) + if (IsDBCS1(c) && i < 7 && IsDBCS2(dir[i+1])) c = (c << 8) | dir[++i]; c = ff_convert(c, 1); if (!c) c = '?'; @@ -1513,7 +1627,7 @@ void get_fileinfo ( /* No return code */ if (c == ' ') break; if (_USE_LFN && (nt & NS_EXT) && IsUpper(c)) c += 0x20; #if _LFN_UNICODE - if (IsDBCS1(c) && i < 10 && IsDBCS2(dir[i + 1])) + if (IsDBCS1(c) && i < 10 && IsDBCS2(dir[i+1])) c = (c << 8) | dir[++i]; c = ff_convert(c, 1); if (!c) c = '?'; @@ -1526,10 +1640,10 @@ void get_fileinfo ( /* No return code */ fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ } - *p = 0; + *p = 0; /* Terminate SFN str by a \0 */ #if _USE_LFN - if (fno->lfname) { + if (fno->lfname && fno->lfsize) { TCHAR *tp = fno->lfname; WCHAR w, *lfn; @@ -1540,14 +1654,14 @@ void get_fileinfo ( /* No return code */ #if !_LFN_UNICODE w = ff_convert(w, 0); /* Unicode -> OEM conversion */ if (!w) { i = 0; break; } /* Could not convert, no LFN */ - if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC */ + if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC (always false on SBCS cfg) */ tp[i++] = (TCHAR)(w >> 8); #endif - if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overrun, no LFN */ + if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overflow, no LFN */ tp[i++] = (TCHAR)w; } } - tp[i] = 0; /* Terminator */ + tp[i] = 0; /* Terminate the LFN str by a \0 */ } #endif } @@ -1609,7 +1723,7 @@ FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ res = FR_NO_PATH; break; } - dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + dj->sclust = LD_CLUST(dir); } } @@ -1646,7 +1760,7 @@ BYTE check_fs ( /* 0:The FAT BR, 1:Valid BR but not an FAT, 2:Not a BR, 3:Disk e /*-----------------------------------------------------------------------*/ -/* Make sure that the file system is valid */ +/* Check if the file system object is valid or not */ /*-----------------------------------------------------------------------*/ static @@ -1665,52 +1779,53 @@ FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */ FATFS *fs; /* Get logical drive number from the path name */ - vol = p[0] - '0'; /* Is there a drive number? */ - if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ - p += 2; *path = p; /* Return pointer to the path name */ - } else { /* No drive number is given */ + vol = p[0] - '0'; /* Is there a drive number? */ + if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ + p += 2; *path = p; /* Return pointer to the path name */ + } else { /* No drive number is given */ #if _FS_RPATH - vol = Drive; /* Use current drive */ + vol = CurrVol; /* Use current drive */ #else - vol = 0; /* Use drive 0 */ + vol = 0; /* Use drive 0 */ #endif } /* Check if the logical drive is valid or not */ - if (vol >= _DRIVES) /* Is the drive number valid? */ + if (vol >= _VOLUMES) /* Is the drive number valid? */ return FR_INVALID_DRIVE; - *rfs = fs = FatFs[vol]; /* Return pointer to the corresponding file system object */ - if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + *rfs = fs = FatFs[vol]; /* Return pointer to the corresponding file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ - ENTER_FF(fs); /* Lock file system */ + ENTER_FF(fs); /* Lock file system */ - if (fs->fs_type) { /* If the logical drive has been mounted */ + if (fs->fs_type) { /* If the logical drive has been mounted */ stat = disk_status(fs->drv); - if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ #if !_FS_READONLY if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ return FR_WRITE_PROTECTED; #endif - return FR_OK; /* The file system object is valid */ + return FR_OK; /* The file system object is valid */ } } - /* The logical drive must be mounted. Following code attempts to mount the volume (initialize the file system object) */ + /* The logical drive must be mounted. */ + /* Following code attempts to mount a volume. (analyze BPB and initialize the fs object) */ fs->fs_type = 0; /* Clear the file system object */ fs->drv = (BYTE)LD2PD(vol); /* Bind the logical drive and a physical drive */ stat = disk_initialize(fs->drv); /* Initialize low level disk I/O layer */ - if (stat & STA_NOINIT) /* Check if the drive is ready */ - return FR_NOT_READY; -#if _MAX_SS != 512 /* Get disk sector size if needed */ - if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) - return FR_NO_FILESYSTEM; + if (stat & STA_NOINIT) /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no media or hard error */ +#if _MAX_SS != 512 /* Get disk sector size (variable sector size cfg only) */ + if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &fs->ssize) != RES_OK) + return FR_DISK_ERR; #endif #if !_FS_READONLY if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */ return FR_WRITE_PROTECTED; #endif - /* Search FAT partition on the drive (Supports only generic partitionings, FDISK and SFD) */ + /* Search FAT partition on the drive. Supports only generic partitionings, FDISK and SFD. */ fmt = check_fs(fs, bsect = 0); /* Check sector 0 if it is a VBR */ if (fmt == 1) { /* Not an FAT-VBR, the disk may be partitioned */ /* Check the partition listed in top of the partition table */ @@ -1737,7 +1852,7 @@ FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */ fasize *= b; /* Number of sectors for FAT area */ fs->csize = b = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ - if (!b || (b & (b - 1))) return FR_NO_FILESYSTEM; /* (Must be 1,2,4...128) */ + if (!b || (b & (b - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Number of root directory entries */ if (fs->n_rootdir % (SS(fs) / 32)) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be sector aligned) */ @@ -1800,8 +1915,7 @@ FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */ fs->cdir = 0; /* Current directory (root dir) */ #endif #if _FS_SHARE /* Clear file lock semaphores */ - for (vol = 0; vol < _FS_SHARE; vol++) - fs->flsem[vol].ctr = 0; + clear_lock(fs); #endif return FR_OK; @@ -1854,11 +1968,14 @@ FRESULT f_mount ( FATFS *rfs; - if (vol >= _DRIVES) /* Check if the drive number is valid */ + if (vol >= _VOLUMES) /* Check if the drive number is valid */ return FR_INVALID_DRIVE; rfs = FatFs[vol]; /* Get current fs object */ if (rfs) { +#if _FS_SHARE + clear_lock(rfs); +#endif #if _FS_REENTRANT /* Discard sync object of the current volume */ if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR; #endif @@ -1922,18 +2039,18 @@ FRESULT f_open ( if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { DWORD dw, cl; - if (res != FR_OK) { /* No file, create new */ - if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ #if _FS_SHARE res = enq_lock(dj.fs) ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; #else res = dir_register(&dj); #endif - mode |= FA_CREATE_ALWAYS; - dir = dj.dir; /* New entry */ + mode |= FA_CREATE_ALWAYS; /* File is created */ + dir = dj.dir; /* New entry */ } - else { /* Any object is already existing */ - if (mode & FA_CREATE_NEW) { /* Cannot create new */ + else { /* Any object is already existing */ + if (mode & FA_CREATE_NEW) { /* Cannot create new */ res = FR_EXIST; } else { if (dir[DIR_Attr] & (AM_RDO | AM_DIR)) /* Cannot overwrite it (R/O or DIR) */ @@ -1941,13 +2058,12 @@ FRESULT f_open ( } } if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ - dw = get_fattime(); /* Created time */ + dw = get_fattime(); /* Created time */ ST_DWORD(dir+DIR_CrtTime, dw); dir[DIR_Attr] = 0; /* Reset attribute */ ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ - cl = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); /* Get start cluster */ - ST_WORD(dir+DIR_FstClusHI, 0); /* cluster = 0 */ - ST_WORD(dir+DIR_FstClusLO, 0); + cl = LD_CLUST(dir); /* Get start cluster */ + ST_CLUST(dir, 0); /* cluster = 0 */ dj.fs->wflag = 1; if (cl) { /* Remove the cluster chain if exist */ dw = dj.fs->winsect; @@ -1970,8 +2086,8 @@ FRESULT f_open ( } } if (res == FR_OK) { - if (mode & (FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) - mode |= FA__WRITTEN; /* Set file changed flag */ + if (mode & FA_CREATE_ALWAYS) /* Set file change flag if created or overwritten */ + mode |= FA__WRITTEN; fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ fp->dir_ptr = dir; #if _FS_SHARE @@ -1994,8 +2110,7 @@ FRESULT f_open ( if (res == FR_OK) { fp->flag = mode; /* File access mode */ - fp->org_clust = /* File start cluster */ - ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + fp->org_clust = LD_CLUST(dir); /* File start cluster */ fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ fp->fptr = 0; /* File pointer */ fp->dsect = 0; @@ -2073,13 +2188,13 @@ FRESULT f_read ( } #if !_FS_TINY #if !_FS_READONLY - if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ + if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); fp->flag &= ~FA__DIRTY; } #endif - if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (fp->dsect != sect) { /* Fill sector buffer with file data */ if (disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) ABORT(fp->fs, FR_DISK_ERR); } @@ -2196,7 +2311,7 @@ FRESULT f_write ( #endif fp->dsect = sect; } - wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Put partial sector into file I/O buffer */ + wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs));/* Put partial sector into file I/O buffer */ if (wcnt > btw) wcnt = btw; #if _FS_TINY if (move_window(fp->fs, fp->dsect)) /* Move sector window */ @@ -2210,7 +2325,7 @@ FRESULT f_write ( } if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ - fp->flag |= FA__WRITTEN; /* Set file changed flag */ + fp->flag |= FA__WRITTEN; /* Set file change flag */ LEAVE_FF(fp->fs, FR_OK); } @@ -2247,8 +2362,7 @@ FRESULT f_sync ( dir = fp->dir_ptr; dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ - ST_WORD(dir+DIR_FstClusLO, fp->org_clust); /* Update start cluster */ - ST_WORD(dir+DIR_FstClusHI, fp->org_clust >> 16); + ST_CLUST(dir, fp->org_clust); /* Update start cluster */ tim = get_fattime(); /* Update updated time */ ST_DWORD(dir+DIR_WrtTime, tim); fp->flag &= ~FA__WRITTEN; @@ -2289,11 +2403,11 @@ FRESULT f_close ( #if _FS_REENTRANT res = validate(fp->fs, fp->id); if (res == FR_OK) { - res = dec_lock(fp->fs, fp->lockid); + res = dec_lock(fp->lockid); unlock_fs(fp->fs, FR_OK); } #else - res = dec_lock(fp->fs, fp->lockid); + res = dec_lock(fp->lockid); #endif } #endif @@ -2306,32 +2420,30 @@ FRESULT f_close ( /*-----------------------------------------------------------------------*/ -/* Change Current Drive/Directory */ +/* Current Drive/Directory Handlings */ /*-----------------------------------------------------------------------*/ -#if _FS_RPATH +#if _FS_RPATH >= 1 FRESULT f_chdrive ( BYTE drv /* Drive number */ ) { - if (drv >= _DRIVES) return FR_INVALID_DRIVE; + if (drv >= _VOLUMES) return FR_INVALID_DRIVE; - Drive = drv; + CurrVol = drv; return FR_OK; } - FRESULT f_chdir ( const TCHAR *path /* Pointer to the directory path */ ) { FRESULT res; DIR dj; - BYTE *dir; DEF_NAMEBUF; @@ -2341,12 +2453,11 @@ FRESULT f_chdir ( res = follow_path(&dj, path); /* Follow the path */ FREE_BUF(); if (res == FR_OK) { /* Follow completed */ - dir = dj.dir; /* Pointer to the entry */ - if (!dir) { + if (!dj.dir) { dj.fs->cdir = dj.sclust; /* Start directory itself */ } else { - if (dir[DIR_Attr] & AM_DIR) /* Reached to the directory */ - dj.fs->cdir = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + if (dj.dir[DIR_Attr] & AM_DIR) /* Reached to the directory */ + dj.fs->cdir = LD_CLUST(dj.dir); else res = FR_NO_PATH; /* Reached but a file */ } @@ -2357,7 +2468,78 @@ FRESULT f_chdir ( LEAVE_FF(dj.fs, res); } + +#if _FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR *path, /* Pointer to the directory path */ + UINT sz_path /* Size of path */ +) +{ + FRESULT res; + DIR dj; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMEBUF; + + + *path = 0; + res = chk_mounted((const TCHAR**)&path, &dj.fs, 0); /* Get current volume */ + if (res == FR_OK) { + INIT_BUF(dj); + i = sz_path; /* Bottom of buffer (dir stack base) */ + dj.sclust = dj.fs->cdir; /* Start to follow upper dir from current dir */ + while ((ccl = dj.sclust) != 0) { /* Repeat while current dir is a sub-dir */ + res = dir_sdi(&dj, 1); /* Get parent dir */ + if (res != FR_OK) break; + res = dir_read(&dj); + if (res != FR_OK) break; + dj.sclust = LD_CLUST(dj.dir); /* Goto parent dir */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child dir */ + res = dir_read(&dj); + if (res != FR_OK) break; + if (ccl == LD_CLUST(dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; +#if _USE_LFN + fno.lfname = path; + fno.lfsize = i; #endif + get_fileinfo(&dj, &fno); /* Get the dir name and push it to the buffer */ + tp = fno.fname; + if (_USE_LFN && *path) tp = path; + for (n = 0; tp[n]; n++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) path[--i] = tp[--n]; + path[--i] = '/'; + } + tp = path; + if (res == FR_OK) { + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; + if (i == sz_path) { /* Root-dir */ + *tp++ = '/'; + } else { /* Sub-dir */ + do /* Add stacked path str */ + *tp++ = path[i++]; + while (i < sz_path); + } + } + *tp = 0; + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} +#endif /* _FS_RPATH >= 2 */ +#endif /* _FS_RPATH >= 1 */ @@ -2513,7 +2695,7 @@ FRESULT f_lseek ( fp->dsect = nsect; } #if !_FS_READONLY - if (fp->fptr > fp->fsize) { /* Set changed flag if the file size is extended */ + if (fp->fptr > fp->fsize) { /* Set change flag if the file size is extended */ fp->fsize = fp->fptr; fp->flag |= FA__WRITTEN; } @@ -2536,7 +2718,6 @@ FRESULT f_opendir ( ) { FRESULT res; - BYTE *dir; DEF_NAMEBUF; @@ -2546,10 +2727,9 @@ FRESULT f_opendir ( res = follow_path(dj, path); /* Follow the path to the directory */ FREE_BUF(); if (res == FR_OK) { /* Follow completed */ - dir = dj->dir; - if (dir) { /* It is not the current dir */ - if (dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ - dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + if (dj->dir) { /* It is not the root dir */ + if (dj->dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ + dj->sclust = LD_CLUST(dj->dir); } else { /* The object is not a directory */ res = FR_NO_PATH; } @@ -2584,11 +2764,11 @@ FRESULT f_readdir ( res = validate(dj->fs, dj->id); /* Check validity of the object */ if (res == FR_OK) { if (!fno) { - res = dir_sdi(dj, 0); + res = dir_sdi(dj, 0); /* Rewind the directory object */ } else { INIT_BUF(*dj); - res = dir_read(dj); - if (res == FR_NO_FILE) { + res = dir_read(dj); /* Read an directory item */ + if (res == FR_NO_FILE) { /* Reached end of dir */ dj->sect = 0; res = FR_OK; } @@ -2788,7 +2968,7 @@ FRESULT f_unlink ( if (dir[DIR_Attr] & AM_RDO) res = FR_DENIED; /* Cannot remove R/O object */ } - dclst = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + dclst = LD_CLUST(dir); if (res == FR_OK && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-dir? */ if (dclst < 2) { res = FR_INT_ERR; @@ -2862,14 +3042,12 @@ FRESULT f_mkdir ( dir[DIR_Name] = '.'; dir[DIR_Attr] = AM_DIR; ST_DWORD(dir+DIR_WrtTime, tim); - ST_WORD(dir+DIR_FstClusLO, dcl); - ST_WORD(dir+DIR_FstClusHI, dcl >> 16); + ST_CLUST(dir, dcl); mem_cpy(dir+32, dir, 32); /* Create ".." entry */ dir[33] = '.'; pcl = dj.sclust; if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase) pcl = 0; - ST_WORD(dir+32+DIR_FstClusLO, pcl); - ST_WORD(dir+32+DIR_FstClusHI, pcl >> 16); + ST_CLUST(dir+32, pcl); for (n = dj.fs->csize; n; n--) { /* Write dot entries and clear following sectors */ dj.fs->winsect = dsc++; dj.fs->wflag = 1; @@ -2880,13 +3058,12 @@ FRESULT f_mkdir ( } if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */ if (res != FR_OK) { - remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */ + remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */ } else { dir = dj.dir; - dir[DIR_Attr] = AM_DIR; /* Attribute */ - ST_DWORD(dir+DIR_WrtTime, tim); /* Created time */ - ST_WORD(dir+DIR_FstClusLO, dcl); /* Table start cluster */ - ST_WORD(dir+DIR_FstClusHI, dcl >> 16); + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD(dir+DIR_WrtTime, tim); /* Created time */ + ST_CLUST(dir, dcl); /* Table start cluster */ dj.fs->wflag = 1; res = sync(dj.fs); } @@ -3016,8 +3193,8 @@ FRESULT f_rename ( mem_cpy(buf, djo.dir+DIR_Attr, 21); /* Save the object information except for name */ mem_cpy(&djn, &djo, sizeof(DIR)); /* Check new object */ res = follow_path(&djn, path_new); - if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ - if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ + if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ + if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ /* Start critical section that any interruption or error can cause cross-link */ res = dir_register(&djn); /* Register the new entry */ if (res == FR_OK) { @@ -3026,7 +3203,7 @@ FRESULT f_rename ( dir[DIR_Attr] = buf[0] | AM_ARC; djo.fs->wflag = 1; if (djo.sclust != djn.sclust && (dir[DIR_Attr] & AM_DIR)) { /* Update .. entry in the directory if needed */ - dw = clust2sect(djn.fs, (DWORD)LD_WORD(dir+DIR_FstClusHI) | LD_WORD(dir+DIR_FstClusLO)); + dw = clust2sect(djn.fs, LD_CLUST(dir)); if (!dw) { res = FR_INT_ERR; } else { @@ -3034,8 +3211,7 @@ FRESULT f_rename ( dir = djn.fs->win+32; /* .. entry */ if (res == FR_OK && dir[1] == '.') { dw = (djn.fs->fs_type == FS_FAT32 && djn.sclust == djn.fs->dirbase) ? 0 : djn.sclust; - ST_WORD(dir+DIR_FstClusLO, dw); - ST_WORD(dir+DIR_FstClusHI, dw >> 16); + ST_CLUST(dir, dw); djn.fs->wflag = 1; } } @@ -3126,8 +3302,8 @@ FRESULT f_forward ( /*-----------------------------------------------------------------------*/ /* Create File System on the Drive */ /*-----------------------------------------------------------------------*/ -#define N_ROOTDIR 512 /* Multiple of 32 */ -#define N_FATS 1 /* 1 or 2 */ +#define N_ROOTDIR 512 /* Multiple of 32 */ +#define N_FATS 1 /* 1 or 2 */ FRESULT f_mkfs ( @@ -3139,16 +3315,16 @@ FRESULT f_mkfs ( static const WORD vst[] = { 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 0}; static const WORD cst[] = {32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512}; BYTE fmt, md, *tbl; - DWORD n_clst, vs, n; - UINT as, i; - DWORD b_vol, b_fat, b_dir, b_data; /* Area offset (LBA) */ - DWORD n_vol, n_rsv, n_fat, n_dir; /* Area size */ + DWORD n_clst, vs, n, wsect; + UINT i; + DWORD b_vol, b_fat, b_dir, b_data; /* Offset (LBA) */ + DWORD n_vol, n_rsv, n_fat, n_dir; /* Size */ FATFS *fs; DSTATUS stat; /* Check mounted drive and clear work area */ - if (drv >= _DRIVES) return FR_INVALID_DRIVE; + if (drv >= _VOLUMES) return FR_INVALID_DRIVE; fs = FatFs[drv]; if (!fs) return FR_NOT_ENABLED; fs->fs_type = 0; @@ -3159,12 +3335,12 @@ FRESULT f_mkfs ( if (stat & STA_NOINIT) return FR_NOT_READY; if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; #if _MAX_SS != 512 /* Get disk sector size */ - if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) + if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR; #endif if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128) return FR_DISK_ERR; - b_vol = (sfd == 1) ? 0 : 63; /* Volume start sector */ + b_vol = (sfd) ? 0 : 63; /* Volume start sector */ n_vol -= b_vol; if (au & (au - 1)) au = 0; /* Check validity of the allocation unit size */ if (!au) { /* AU auto selection */ @@ -3172,7 +3348,6 @@ FRESULT f_mkfs ( for (i = 0; vs < vst[i]; i++) ; au = cst[i]; } - if (_MAX_SS != 512 && au < SS(fs)) au = SS(fs); au /= SS(fs); /* Number of sectors per cluster */ if (au == 0) au = 1; if (au > 128) au = 128; @@ -3200,17 +3375,15 @@ FRESULT f_mkfs ( if (n_vol < b_data + au) return FR_MKFS_ABORTED; /* Too small volume */ /* Align data start sector to erase block boundary (for flash memory media) */ - if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK) return FR_DISK_ERR; - if (!n || n > 32768) return FR_MKFS_ABORTED; - n = (b_data + n - 1) & ~(n - 1); /* Next nearest boundary from current data start */ + if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK || !n || n > 32768) n = 1; + n = (b_data + n - 1) & ~(n - 1); /* Next nearest erase block from current data start */ n = (n - b_data) / N_FATS; - if (fmt == FS_FAT32) { /* FAT32: Move FAT start */ + if (fmt == FS_FAT32) { /* FAT32: Move FAT offset */ n_rsv += n; b_fat += n; } else { /* FAT12/16: Expand FAT size */ n_fat += n; } - /* b_dir and b_data are no longer used below */ /* Determine number of cluster and final check of validity of the FAT sub-type */ n_clst = (n_vol - n_rsv - n_fat * N_FATS - n_dir) / au; @@ -3219,14 +3392,14 @@ FRESULT f_mkfs ( return FR_MKFS_ABORTED; /* Create partition table if required */ - if (sfd == 1) { + if (sfd) { md = 0xF0; } else { DWORD n_disk = b_vol + n_vol; mem_set(fs->win, 0, SS(fs)); tbl = fs->win+MBR_Table; - ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ + ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */ n_disk = n_disk / 63 / 255; tbl[7] = (BYTE)n_disk; @@ -3235,62 +3408,63 @@ FRESULT f_mkfs ( ST_WORD(&tbl[6], 0xFFFF); } tbl[5] = 254; - if (fmt != FS_FAT32) /* System ID */ + if (fmt != FS_FAT32) /* System ID */ tbl[4] = (n_vol < 0x10000) ? 0x04 : 0x06; else tbl[4] = 0x0c; - ST_DWORD(tbl+8, 63); /* Partition start in LBA */ - ST_DWORD(tbl+12, n_vol); /* Partition size in LBA */ - ST_WORD(tbl+64, 0xAA55); /* Signature */ + ST_DWORD(tbl+8, 63); /* Partition start in LBA */ + ST_DWORD(tbl+12, n_vol); /* Partition size in LBA */ + ST_WORD(tbl+64, 0xAA55); /* Signature */ if (disk_write(drv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; md = 0xF8; } - /* Create VBR */ - tbl = fs->win; /* Clear buffer */ + /* Create volume boot record */ + tbl = fs->win; /* Clear sector */ mem_set(tbl, 0, SS(fs)); - ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ - as = SS(fs); /* Sector size */ - ST_WORD(tbl+BPB_BytsPerSec, as); - tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ - ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ - tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ - as = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of rootdir entries */ - ST_WORD(tbl+BPB_RootEntCnt, as); - if (n_vol < 0x10000) { /* Number of total sectors */ + mem_cpy(tbl, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot code, OEM name */ + i = SS(fs); /* Sector size */ + ST_WORD(tbl+BPB_BytsPerSec, i); + tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ + ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + i = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of rootdir entries */ + ST_WORD(tbl+BPB_RootEntCnt, i); + if (n_vol < 0x10000) { /* Number of total sectors */ ST_WORD(tbl+BPB_TotSec16, n_vol); } else { ST_DWORD(tbl+BPB_TotSec32, n_vol); } - tbl[BPB_Media] = md; /* Media descriptor */ - ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ - ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ - ST_DWORD(tbl+BPB_HiddSec, b_vol); /* Hidden sectors */ - n = get_fattime(); /* Use current time as VSN */ + tbl[BPB_Media] = md; /* Media descriptor */ + ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl+BPB_HiddSec, b_vol); /* Hidden sectors */ + n = get_fattime(); /* Use current time as VSN */ if (fmt == FS_FAT32) { - ST_DWORD(tbl+BS_VolID32, n); /* VSN */ - ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of sectors per FAT */ - ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory start cluster (2) */ - ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (VBR+1) */ - ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (VBR+6) */ - tbl[BS_DrvNum32] = 0x80; /* Drive number */ - tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ - mem_cpy(tbl+BS_VolLab32, "NO NAME FAT32 ", 19); /* Volume label, FAT signature */ + ST_DWORD(tbl+BS_VolID32, n); /* VSN */ + ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory start cluster (2) */ + ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (VBR+1) */ + ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (VBR+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ } else { - ST_DWORD(tbl+BS_VolID, n); /* VSN */ - ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of sectors per FAT */ - tbl[BS_DrvNum] = 0x80; /* Drive number */ - tbl[BS_BootSig] = 0x29; /* Extended boot signature */ - mem_cpy(tbl+BS_VolLab, "NO NAME FAT ", 19); /* Volume label, FAT signature */ + ST_DWORD(tbl+BS_VolID, n); /* VSN */ + ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of sectors per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ } - ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ - if (disk_write(drv, tbl, b_vol, 1) != RES_OK) /* Original (VBR) */ + ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ + if (disk_write(drv, tbl, b_vol, 1) != RES_OK)/* Write original (VBR) */ return FR_DISK_ERR; - if (fmt == FS_FAT32) /* Backup (VBR+6) */ + if (fmt == FS_FAT32) /* Write backup (VBR+6) */ disk_write(drv, tbl, b_vol + 6, 1); /* Initialize FAT area */ + wsect = b_fat; for (i = 0; i < N_FATS; i++) { mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ n = md; /* Media descriptor byte */ @@ -3298,36 +3472,45 @@ FRESULT f_mkfs ( n |= (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT12/16) */ } else { - n |= 0x0FFFFF00; + n |= 0xFFFFFF00; ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT32) */ - ST_DWORD(tbl+4, 0x0FFFFFFF); + ST_DWORD(tbl+4, 0xFFFFFFFF); ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ } - if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + if (disk_write(drv, tbl, wsect++, 1) != RES_OK) return FR_DISK_ERR; - mem_set(tbl, 0, SS(fs)); /* Fill following FAT entries with zero */ - for (n = 1; n < n_fat; n++) { /* This loop may take a time on FAT32 volume due to many single sector write */ - if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + mem_set(tbl, 0, SS(fs)); /* Fill following FAT entries with zero */ + for (n = 1; n < n_fat; n++) { /* This loop may take a time on FAT32 volume due to many single sector write */ + if (disk_write(drv, tbl, wsect++, 1) != RES_OK) return FR_DISK_ERR; } } /* Initialize root directory */ - n = (fmt == FS_FAT32) ? as : n_dir; - while (n--) { - if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + i = (fmt == FS_FAT32) ? au : n_dir; + do { + if (disk_write(drv, tbl, wsect++, 1) != RES_OK) return FR_DISK_ERR; - } + } while (--i); - /* Create FSInfo record if needed */ +#if _USE_ERASE /* Erase data area if needed */ + { + DWORD eb[2]; + + eb[0] = wsect; eb[1] = wsect + n_clst * au - 1; + disk_ioctl(drv, CTRL_ERASE_SECTOR, eb); + } +#endif + + /* Create FSInfo if needed */ if (fmt == FS_FAT32) { ST_WORD(tbl+BS_55AA, 0xAA55); ST_DWORD(tbl+FSI_LeadSig, 0x41615252); ST_DWORD(tbl+FSI_StrucSig, 0x61417272); ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF); - disk_write(drv, tbl, b_vol + 1, 1); /* Original (VBR+1) */ - disk_write(drv, tbl, b_vol + 7, 1); /* Backup (VBR+7) */ + disk_write(drv, tbl, b_vol + 1, 1); /* Write original (VBR+1) */ + disk_write(drv, tbl, b_vol + 7, 1); /* Write backup (VBR+7) */ } return (disk_ioctl(drv, CTRL_SYNC, (void*)0) == RES_OK) ? FR_OK : FR_DISK_ERR; diff --git a/src/ff.h b/src/ff.h index d739704..5aa8f14 100644 --- a/src/ff.h +++ b/src/ff.h @@ -1,5 +1,5 @@ /*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module include file R0.08 (C)ChaN, 2010 +/ FatFs - FAT file system module include file R0.08a (C)ChaN, 2010 /----------------------------------------------------------------------------/ / FatFs module is a generic FAT file system module for small embedded systems. / This is a free software that opened for education, research and commercial @@ -15,7 +15,7 @@ /----------------------------------------------------------------------------*/ #ifndef _FATFS -#define _FATFS 8085 /* Revision ID */ +#define _FATFS 8255 /* Revision ID */ #ifdef __cplusplus extern "C" { @@ -224,20 +224,20 @@ extern "C" { -/* Definitions corresponds to volume management */ +/* Definitions of volume management */ #if _MULTI_PARTITION /* Multiple partition configuration */ -#define LD2PD(drv) (Drives[drv].pd) /* Get physical drive# */ -#define LD2PT(drv) (Drives[drv].pt) /* Get partition# */ +#define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive# */ +#define LD2PT(vol) (VolToPart[vol].pt) /* Get partition# */ typedef struct { BYTE pd; /* Physical drive# */ BYTE pt; /* Partition # (0-3) */ } PARTITION; -extern const PARTITION Drives[]; /* Logical drive# to physical location conversion table */ +extern const PARTITION VolToPart[]; /* Volume - Physical location resolution table */ #else /* Single partition configuration */ -#define LD2PD(drv) (drv) /* Physical drive# is equal to the logical drive# */ -#define LD2PT(drv) 0 /* Always mounts the 1st partition */ +#define LD2PD(vol) (vol) /* Logical drive# is bound to the same physical drive# */ +#define LD2PT(vol) 0 /* Always mounts the 1st partition */ #endif @@ -266,21 +266,6 @@ typedef char TCHAR; -/* Definitions corresponds to file shareing feature */ - -#if _FS_SHARE -#if _FS_READONLY -#error _FS_SHARE must be 0 on R/O cfg. -#endif -typedef struct { - DWORD clu; /* File ID 1, directory */ - WORD idx; /* File ID 2, index in the directory */ - WORD ctr; /* File open counter, 0:none, 0x01..0xFF:read open count, 0x100:in write open */ -} FILESEM; -#endif - - - /* File system object structure (FATFS) */ typedef struct { @@ -313,9 +298,6 @@ typedef struct { DWORD database; /* Data start sector */ DWORD winsect; /* Current sector appearing in the win[] */ BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */ -#if _FS_SHARE - FILESEM flsem[_FS_SHARE]; /* File lock semaphores */ -#endif } FATFS; @@ -327,7 +309,7 @@ typedef struct { WORD id; /* Owner file system mount ID */ BYTE flag; /* File status flags */ BYTE pad1; - DWORD fptr; /* File read/write pointer */ + DWORD fptr; /* File read/write pointer (0 on file open) */ DWORD fsize; /* File size */ DWORD org_clust; /* File start cluster (0 when fsize==0) */ DWORD curr_clust; /* Current cluster */ @@ -337,10 +319,10 @@ typedef struct { BYTE* dir_ptr; /* Ponter to the directory entry in the window */ #endif #if _USE_FASTSEEK - DWORD* cltbl; /* Pointer to the cluster link map table */ + DWORD* cltbl; /* Pointer to the cluster link map table (null on file open) */ #endif #if _FS_SHARE - UINT lockid; /* File lock ID */ + UINT lockid; /* File lock ID (index of file semaphore table) */ #endif #if !_FS_TINY BYTE buf[_MAX_SS]; /* File data read/write buffer */ @@ -378,7 +360,7 @@ typedef struct { TCHAR fname[13]; /* Short file name (8.3 format) */ #if _USE_LFN TCHAR* lfname; /* Pointer to the LFN buffer */ - int lfsize; /* Size of LFN buffer [chrs] */ + UINT lfsize; /* Size of LFN buffer in TCHAR */ #endif } FILINFO; @@ -421,6 +403,7 @@ FRESULT f_close (FIL*); /* Close an open file object */ FRESULT f_opendir (DIR*, const TCHAR*); /* Open an existing directory */ FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ FRESULT f_stat (const TCHAR*, FILINFO*); /* Get file status */ + #if !_FS_READONLY FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ FRESULT f_getfree (const TCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ @@ -432,28 +415,36 @@ FRESULT f_chmod (const TCHAR*, BYTE, BYTE); /* Change attriburte of the file/d FRESULT f_utime (const TCHAR*, const FILINFO*); /* Change timestamp of the file/dir */ FRESULT f_rename (const TCHAR*, const TCHAR*); /* Rename/Move a file or directory */ #endif + #if _USE_FORWARD FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ #endif + #if _USE_MKFS FRESULT f_mkfs (BYTE, BYTE, UINT); /* Create a file system on the drive */ #endif + #if _FS_RPATH -FRESULT f_chdir (const TCHAR*); /* Change current directory */ FRESULT f_chdrive (BYTE); /* Change current drive */ +FRESULT f_chdir (const TCHAR*); /* Change current directory */ +FRESULT f_getcwd (TCHAR*, UINT); /* Get current directory */ #endif + #if _USE_STRFUNC int f_putc (TCHAR, FIL*); /* Put a character to the file */ int f_puts (const TCHAR*, FIL*); /* Put a string to the file */ int f_printf (FIL*, const TCHAR*, ...); /* Put a formatted string to the file */ TCHAR* f_gets (TCHAR*, int, FIL*); /* Get a string from the file */ -#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) -#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) #ifndef EOF #define EOF (-1) #endif #endif +#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) +#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->fsize) + /*--------------------------------------------------------------*/ @@ -528,69 +519,6 @@ void ff_rel_grant (_SYNC_t); /* Unlock sync object */ #define CREATE_LINKMAP 0xFFFFFFFF -/* FatFs refers the members in the FAT structures with byte offset instead of -/ structure member because there are incompatibility of the packing option -/ between various compilers. */ - -#define BS_jmpBoot 0 -#define BS_OEMName 3 -#define BPB_BytsPerSec 11 -#define BPB_SecPerClus 13 -#define BPB_RsvdSecCnt 14 -#define BPB_NumFATs 16 -#define BPB_RootEntCnt 17 -#define BPB_TotSec16 19 -#define BPB_Media 21 -#define BPB_FATSz16 22 -#define BPB_SecPerTrk 24 -#define BPB_NumHeads 26 -#define BPB_HiddSec 28 -#define BPB_TotSec32 32 -#define BS_55AA 510 - -#define BS_DrvNum 36 -#define BS_BootSig 38 -#define BS_VolID 39 -#define BS_VolLab 43 -#define BS_FilSysType 54 - -#define BPB_FATSz32 36 -#define BPB_ExtFlags 40 -#define BPB_FSVer 42 -#define BPB_RootClus 44 -#define BPB_FSInfo 48 -#define BPB_BkBootSec 50 -#define BS_DrvNum32 64 -#define BS_BootSig32 66 -#define BS_VolID32 67 -#define BS_VolLab32 71 -#define BS_FilSysType32 82 - -#define FSI_LeadSig 0 -#define FSI_StrucSig 484 -#define FSI_Free_Count 488 -#define FSI_Nxt_Free 492 - -#define MBR_Table 446 - -#define DIR_Name 0 -#define DIR_Attr 11 -#define DIR_NTres 12 -#define DIR_CrtTime 14 -#define DIR_CrtDate 16 -#define DIR_FstClusHI 20 -#define DIR_WrtTime 22 -#define DIR_WrtDate 24 -#define DIR_FstClusLO 26 -#define DIR_FileSize 28 -#define LDIR_Ord 0 -#define LDIR_Attr 11 -#define LDIR_Type 12 -#define LDIR_Chksum 13 -#define LDIR_FstClusLO 26 - - - /*--------------------------------*/ /* Multi-byte word access macros */ diff --git a/src/ffconf.h b/src/ffconf.h index 430c35d..76a659d 100644 --- a/src/ffconf.h +++ b/src/ffconf.h @@ -1,5 +1,5 @@ /*---------------------------------------------------------------------------/ -/ FatFs - FAT file system module configuration file R0.08 (C)ChaN, 2010 +/ FatFs - FAT file system module configuration file R0.08a (C)ChaN, 2010 /----------------------------------------------------------------------------/ / / CAUTION! Do not forget to make clean the project after any changes to @@ -7,7 +7,7 @@ / /----------------------------------------------------------------------------*/ #ifndef _FFCONF -#define _FFCONF 8085 /* Revision ID */ +#define _FFCONF 8255 /* Revision ID */ /*---------------------------------------------------------------------------/ @@ -26,14 +26,14 @@ / f_truncate and useless f_getfree. */ -#define _FS_MINIMIZE 0 /* 0, 1, 2 or 3 */ +#define _FS_MINIMIZE 0 /* 0 to 3 */ /* The _FS_MINIMIZE option defines minimization level to remove some functions. / / 0: Full function. / 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename / are removed. -/ 2: f_opendir and f_readdir are removed in addition to level 1. -/ 3: f_lseek is removed in addition to level 2. */ +/ 2: f_opendir and f_readdir are removed in addition to 1. +/ 3: f_lseek is removed in addition to 2. */ #define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable */ @@ -94,12 +94,12 @@ #define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ /* The _USE_LFN option switches the LFN support. / -/ 0: Disable LFN. _MAX_LFN and _LFN_UNICODE have no effect. -/ 1: Enable LFN with static working buffer on the bss. NOT REENTRANT. +/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. / 2: Enable LFN with dynamic working buffer on the STACK. / 3: Enable LFN with dynamic working buffer on the HEAP. / -/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. When enable LFN, +/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, / Unicode handling functions ff_convert() and ff_wtoupper() must be added / to the project. When enable to use heap, memory control functions / ff_memalloc() and ff_memfree() must be added to the project. */ @@ -110,9 +110,13 @@ / enable LFN feature and set _LFN_UNICODE to 1. */ -#define _FS_RPATH 0 /* 0:Disable or 1:Enable */ -/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir, -/ f_chdrive function are available. +#define _FS_RPATH 0 /* 0 to 2 */ +/* The _FS_RPATH option configures relative path feature. +/ +/ 0: Disable relative path feature and remove related functions. +/ 1: Enable relative path. f_chdrive() and f_chdir() are available. +/ 2: f_getcwd() is available in addition to 1. +/ / Note that output of the f_readdir fnction is affected by this option. */ @@ -121,7 +125,7 @@ / Physical Drive Configurations /----------------------------------------------------------------------------*/ -#define _DRIVES 1 +#define _VOLUMES 1 /* Number of volumes (logical drives) to be used. */ @@ -133,10 +137,14 @@ / to the disk_ioctl function. */ -#define _MULTI_PARTITION 0 /* 0:Single parition or 1:Multiple partition */ -/* When _MULTI_PARTITION is set to 0, each volume is bound to the same physical -/ drive number and can mount only first primaly partition. When it is set to 1, -/ each volume is tied to the partitions listed in Drives[]. */ +#define _MULTI_PARTITION 0 /* 0:Single partition or 1:Multiple partition */ +/* When set to 0, each volume is bound to the same physical drive number and +/ it can mount only first primaly partition. When it is set to 1, each volume +/ is tied to the partitions listed in VolToPart[]. */ + + +#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ +/* To enable sector erase feature, set _USE_ERASE to 1. */ @@ -157,11 +165,12 @@ / performance and code size. */ +/* Include a header file here to define sync object types on the O/S */ +/* #include , , or ohters. */ + #define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ #define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ #define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ -/* Include a header file here to define O/S system calls */ -/* #include , , or ohters. */ /* The _FS_REENTRANT option switches the reentrancy of the FatFs module. / @@ -172,10 +181,8 @@ #define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ -/* To enable file shareing feature, set _FS_SHARE to >= 1 and also user - provided memory handlers, ff_memalloc and ff_memfree function must be - added to the project. The value defines number of files can be opened - per volume. */ +/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value + defines how many files can be opened simultaneously. */ #endif /* _FFCONFIG */ diff --git a/src/option/ccsbcs.c b/src/option/ccsbcs.c index e125953..2a50589 100644 --- a/src/option/ccsbcs.c +++ b/src/option/ccsbcs.c @@ -329,7 +329,7 @@ const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042D, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,