summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs
diff options
context:
space:
mode:
authorRalf Corsepius <ralf.corsepius@rtems.org>2004-11-20 03:11:41 +0000
committerRalf Corsepius <ralf.corsepius@rtems.org>2004-11-20 03:11:41 +0000
commitc36f885aa7b4390efdf5b89adc6866e1024e1ceb (patch)
treea386de34a591223bba3bbb03cc2759048ba964a3 /cpukit/libfs
parent2004-11-20 Ralf Corsepius <ralf.corsepiu@rtems.org> (diff)
downloadrtems-c36f885aa7b4390efdf5b89adc6866e1024e1ceb.tar.bz2
2004-11-20 Ralf Corsepius <ralf.corsepiu@rtems.org>
PR 720/filesystem: * libfs/src/dosfs/dosfs.h, libfs/src/dosfs/fat.c, libfs/src/dosfs/fat.h, libfs/src/dosfs/msdos_format.c: Adaptations to msdos_format. (From Thomas Doerfler <Thomas.Doerfler@imd-systems.de>). * libfs/src/dosfs/dosfs.h, libfs/src/dosfs/fat.c, libfs/src/dosfs/fat.h, libfs/src/dosfs/msdos_format.c: Adaptations to RTEMS-4.7.
Diffstat (limited to 'cpukit/libfs')
-rw-r--r--cpukit/libfs/src/dosfs/dosfs.h48
-rw-r--r--cpukit/libfs/src/dosfs/fat.c64
-rw-r--r--cpukit/libfs/src/dosfs/fat.h202
-rw-r--r--cpukit/libfs/src/dosfs/msdos_format.c90
4 files changed, 289 insertions, 115 deletions
diff --git a/cpukit/libfs/src/dosfs/dosfs.h b/cpukit/libfs/src/dosfs/dosfs.h
index 2524690aec..ff9ef0037f 100644
--- a/cpukit/libfs/src/dosfs/dosfs.h
+++ b/cpukit/libfs/src/dosfs/dosfs.h
@@ -12,6 +12,7 @@
*
* @(#) $Id$
*/
+
#ifndef __DOSFS_DOSFS_H__
#define __DOSFS_DOSFS_H__
@@ -24,6 +25,53 @@ extern "C" {
extern rtems_filesystem_operations_table msdos_ops;
+#define MSDOS_FMT_FATANY 0
+#define MSDOS_FMT_FAT12 1
+#define MSDOS_FMT_FAT16 2
+#define MSDOS_FMT_FAT32 3
+
+/*
+ * data to be filled out for formatter: parameters for format call
+ * any parameter set to 0 or NULL will be automatically detected/computed
+ */
+typedef struct {
+ const char *OEMName; /* OEM Name string or NULL */
+ const char *VolLabel; /* Volume Label string or NULL */
+ uint32_t sectors_per_cluster; /* request value: sectors per cluster */
+ uint32_t fat_num; /* request value: number of FATs on disk */
+ uint32_t files_per_root_dir; /* request value: file entries in root */
+ uint8_t fattype; /* request value: MSDOS_FMT_FAT12/16/32 */
+ uint8_t media; /* media code. default: 0xF8 */
+ boolean quick_format; /* TRUE: do not clear out data sectors */
+ uint32_t cluster_align; /* requested value: cluster alignment */
+ /* make sector number of first sector */
+ /* of first cluster divisible by this */
+ /* value. This can optimize clusters */
+ /* to be located at start of track */
+ /* or start of flash block */
+} msdos_format_request_param_t;
+
+/*=========================================================================*\
+| Function: |
+\*-------------------------------------------------------------------------*/
+int msdos_format
+(
+/*-------------------------------------------------------------------------*\
+| Purpose: |
+| format device with msdos filesystem |
++---------------------------------------------------------------------------+
+| Input Parameters: |
+\*-------------------------------------------------------------------------*/
+ const char *devname, /* device name */
+ const msdos_format_request_param_t *rqdata /* requested fmt parameters */
+ /* set to NULL for automatic */
+ /* determination */
+ );
+/*-------------------------------------------------------------------------*\
+| Return Value: |
+| 0, if success, -1 and errno if failed |
+\*=========================================================================*/
+
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/libfs/src/dosfs/fat.c b/cpukit/libfs/src/dosfs/fat.c
index e0bcdb2cc0..a566829b91 100644
--- a/cpukit/libfs/src/dosfs/fat.c
+++ b/cpukit/libfs/src/dosfs/fat.c
@@ -247,10 +247,10 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
}
close(fd);
- vol->bps = FAT_BR_BYTES_PER_SECTOR(boot_rec);
-
- if ( (vol->bps != 512) &&
- (vol->bps != 1024) &&
+ vol->bps = FAT_GET_BR_BYTES_PER_SECTOR(boot_rec);
+
+ if ( (vol->bps != 512) &&
+ (vol->bps != 1024) &&
(vol->bps != 2048) &&
(vol->bps != 4096))
{
@@ -263,7 +263,7 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
for (vol->sec_log2 = 0, i = vol->bps; (i & 1) == 0;
i >>= 1, vol->sec_log2++);
- vol->spc = FAT_BR_SECTORS_PER_CLUSTER(boot_rec);
+ vol->spc = FAT_GET_BR_SECTORS_PER_CLUSTER(boot_rec);
/*
* "sectors per cluster" of zero is invalid
* (and would hang the following loop)
@@ -289,33 +289,33 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
for (vol->bpc_log2 = 0, i = vol->bpc; (i & 1) == 0;
i >>= 1, vol->bpc_log2++);
- vol->fats = FAT_BR_FAT_NUM(boot_rec);
- vol->fat_loc = FAT_BR_RESERVED_SECTORS_NUM(boot_rec);
-
- vol->rdir_entrs = FAT_BR_FILES_PER_ROOT_DIR(boot_rec);
+ vol->fats = FAT_GET_BR_FAT_NUM(boot_rec);
+ vol->fat_loc = FAT_GET_BR_RESERVED_SECTORS_NUM(boot_rec);
+ vol->rdir_entrs = FAT_GET_BR_FILES_PER_ROOT_DIR(boot_rec);
+
/* calculate the count of sectors occupied by the root directory */
vol->rdir_secs = ((vol->rdir_entrs * FAT_DIRENTRY_SIZE) + (vol->bps - 1)) /
vol->bps;
vol->rdir_size = vol->rdir_secs << vol->sec_log2;
- if ( (FAT_BR_SECTORS_PER_FAT(boot_rec)) != 0)
- vol->fat_length = FAT_BR_SECTORS_PER_FAT(boot_rec);
+ if ( (FAT_GET_BR_SECTORS_PER_FAT(boot_rec)) != 0)
+ vol->fat_length = FAT_GET_BR_SECTORS_PER_FAT(boot_rec);
else
- vol->fat_length = FAT_BR_SECTORS_PER_FAT32(boot_rec);
-
- vol->data_fsec = vol->fat_loc + vol->fats * vol->fat_length +
+ vol->fat_length = FAT_GET_BR_SECTORS_PER_FAT32(boot_rec);
+
+ vol->data_fsec = vol->fat_loc + vol->fats * vol->fat_length +
vol->rdir_secs;
/* for FAT12/16 root dir starts at(sector) */
vol->rdir_loc = vol->fat_loc + vol->fats * vol->fat_length;
-
- if ( (FAT_BR_TOTAL_SECTORS_NUM16(boot_rec)) != 0)
- vol->tot_secs = FAT_BR_TOTAL_SECTORS_NUM16(boot_rec);
+
+ if ( (FAT_GET_BR_TOTAL_SECTORS_NUM16(boot_rec)) != 0)
+ vol->tot_secs = FAT_GET_BR_TOTAL_SECTORS_NUM16(boot_rec);
else
- vol->tot_secs = FAT_BR_TOTAL_SECTORS_NUM32(boot_rec);
-
+ vol->tot_secs = FAT_GET_BR_TOTAL_SECTORS_NUM32(boot_rec);
+
data_secs = vol->tot_secs - vol->data_fsec;
vol->data_cls = data_secs / vol->spc;
@@ -345,15 +345,15 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
if (vol->type == FAT_FAT32)
{
- vol->rdir_cl = FAT_BR_FAT32_ROOT_CLUSTER(boot_rec);
-
- vol->mirror = FAT_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_MIRROR;
+ vol->rdir_cl = FAT_GET_BR_FAT32_ROOT_CLUSTER(boot_rec);
+
+ vol->mirror = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_MIRROR;
if (vol->mirror)
- vol->afat = FAT_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
+ vol->afat = FAT_GET_BR_EXT_FLAGS(boot_rec) & FAT_BR_EXT_FLAGS_FAT_NUM;
else
vol->afat = 0;
- vol->info_sec = FAT_BR_FAT32_FS_INFO_SECTOR(boot_rec);
+ vol->info_sec = FAT_GET_BR_FAT32_FS_INFO_SECTOR(boot_rec);
if( vol->info_sec == 0 )
{
rtems_disk_release(vol->dd);
@@ -367,9 +367,9 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
{
rtems_disk_release(vol->dd);
return -1;
- }
-
- if (FAT_FSINFO_LEAD_SIGNATURE(fs_info_sector) !=
+ }
+
+ if (FAT_GET_FSINFO_LEAD_SIGNATURE(fs_info_sector) !=
FAT_FSINFO_LEAD_SIGNATURE_VALUE)
{
rtems_disk_release(vol->dd);
@@ -383,11 +383,11 @@ fat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry)
{
rtems_disk_release(vol->dd);
return -1;
- }
-
- vol->free_cls = FAT_FSINFO_FREE_CLUSTER_COUNT(fs_info_sector);
- vol->next_cl = FAT_FSINFO_NEXT_FREE_CLUSTER(fs_info_sector);
- rc = fat_fat32_update_fsinfo_sector(mt_entry, 0xFFFFFFFF,
+ }
+
+ vol->free_cls = FAT_GET_FSINFO_FREE_CLUSTER_COUNT(fs_info_sector);
+ vol->next_cl = FAT_GET_FSINFO_NEXT_FREE_CLUSTER(fs_info_sector);
+ rc = fat_fat32_update_fsinfo_sector(mt_entry, 0xFFFFFFFF,
0xFFFFFFFF);
if ( rc != RC_OK )
{
diff --git a/cpukit/libfs/src/dosfs/fat.h b/cpukit/libfs/src/dosfs/fat.h
index 43f56b7393..97e46d5c8a 100644
--- a/cpukit/libfs/src/dosfs/fat.h
+++ b/cpukit/libfs/src/dosfs/fat.h
@@ -51,11 +51,11 @@ extern "C" {
*/
#if (CPU_BIG_ENDIAN == TRUE)
-# define CF_LE_W(v) CPU_swap_u16((uint16_t )v)
-# define CF_LE_L(v) CPU_swap_u32((uint32_t )v)
-# define CT_LE_W(v) CPU_swap_u16((uint16_t )v)
-# define CT_LE_L(v) CPU_swap_u32((uint32_t )v)
-#else
+# define CF_LE_W(v) CPU_swap_u16((uint16_t)(v))
+# define CF_LE_L(v) CPU_swap_u32((uint32_t)(v))
+# define CT_LE_W(v) CPU_swap_u16((uint16_t)(v))
+# define CT_LE_L(v) CPU_swap_u32((uint32_t)(v))
+#else
# define CF_LE_W(v) (v)
# define CF_LE_L(v) (v)
# define CT_LE_W(v) (v)
@@ -101,55 +101,180 @@ extern "C" {
#define FAT_FAT32_MASK (uint32_t )0x0FFFFFFF
#define FAT_MAX_BPB_SIZE 90
+#define FAT_TOTAL_MBR_SIZE 512
/* size of useful information in FSInfo sector */
#define FAT_USEFUL_INFO_SIZE 12
-#define FAT_VAL8(x, ofs) (uint8_t )(*((uint8_t *)(x) + (ofs)))
+#define FAT_GET_ADDR(x, ofs) ((uint8_t *)(x) + (ofs))
+
+#define FAT_GET_VAL8(x, ofs) (uint8_t)(*((uint8_t *)(x) + (ofs)))
+
+#define FAT_GET_VAL16(x, ofs) \
+ (uint16_t)( (*((uint8_t *)(x) + (ofs))) | \
+ ((*((uint8_t *)(x) + (ofs) + 1)) << 8) )
+
+#define FAT_GET_VAL32(x, ofs) \
+ (uint32_t)( (uint32_t)(*((uint8_t *)(x) + (ofs))) | \
+ ((uint32_t)(*((uint8_t *)(x) + (ofs) + 1)) << 8) | \
+ ((uint32_t)(*((uint8_t *)(x) + (ofs) + 2)) << 16) | \
+ ((uint32_t)(*((uint8_t *)(x) + (ofs) + 3)) << 24) )
+
+#define FAT_SET_VAL8(x, ofs,val) \
+ (*((uint8_t *)(x)+(ofs))=(uint8_t)(val))
+
+#define FAT_SET_VAL16(x, ofs,val) do { \
+ FAT_SET_VAL8((x),(ofs),(val)); \
+ FAT_SET_VAL8((x),(ofs)+1,(val)>>8);\
+ } while (0)
+
+#define FAT_SET_VAL32(x, ofs,val) do { \
+ FAT_SET_VAL16((x),(ofs),(val)); \
+ FAT_SET_VAL16((x),(ofs)+2,(val)>>16);\
+ } while (0)
-#define FAT_VAL16(x, ofs) \
- (uint16_t )( (*((uint8_t *)(x) + (ofs))) | \
- ((*((uint8_t *)(x) + (ofs) + 1)) << 8) )
+/* macros to access boot sector fields */
+#define FAT_GET_BR_JMPBOOT(x) FAT_GET_VAL8( x, 0)
+#define FAT_SET_BR_JMPBOOT(x,val) FAT_SET_VAL8( x, 0,val)
-#define FAT_VAL32(x, ofs) \
- (uint32_t )( (uint32_t )(*((uint8_t *)(x) + (ofs))) | \
- ((uint32_t )(*((uint8_t *)(x) + (ofs) + 1)) << 8) | \
- ((uint32_t )(*((uint8_t *)(x) + (ofs) + 2)) << 16) | \
- ((uint32_t )(*((uint8_t *)(x) + (ofs) + 3)) << 24) )
+#define FAT_GET_ADDR_BR_OEMNAME(x) FAT_GET_ADDR( x, 3)
+#define FAT_BR_OEMNAME_SIZE (8)
-/* macros to access boot sector fields */
-#define FAT_BR_BYTES_PER_SECTOR(x) FAT_VAL16(x, 11)
-#define FAT_BR_SECTORS_PER_CLUSTER(x) FAT_VAL8(x, 13)
-#define FAT_BR_RESERVED_SECTORS_NUM(x) FAT_VAL16(x, 14)
-#define FAT_BR_FAT_NUM(x) FAT_VAL8(x, 16)
-#define FAT_BR_FILES_PER_ROOT_DIR(x) FAT_VAL16(x, 17)
-#define FAT_BR_TOTAL_SECTORS_NUM16(x) FAT_VAL16(x, 19)
-#define FAT_BR_MEDIA(x) FAT_VAL8(x, 21)
-#define FAT_BR_SECTORS_PER_FAT(x) FAT_VAL16(x, 22)
-#define FAT_BR_TOTAL_SECTORS_NUM32(x) FAT_VAL32(x, 32)
-#define FAT_BR_SECTORS_PER_FAT32(x) FAT_VAL32(x, 36)
-#define FAT_BR_EXT_FLAGS(x) FAT_VAL16(x, 40)
-#define FAT_BR_FAT32_ROOT_CLUSTER(x) FAT_VAL32(x, 44)
-#define FAT_BR_FAT32_FS_INFO_SECTOR(x) FAT_VAL16(x, 48)
-#define FAT_FSINFO_LEAD_SIGNATURE(x) FAT_VAL32(x, 0)
-/*
- * I read FSInfo sector from offset 484 to access the information, so offsets
+#define FAT_GET_BR_BYTES_PER_SECTOR(x) FAT_GET_VAL16(x, 11)
+#define FAT_SET_BR_BYTES_PER_SECTOR(x,val) FAT_SET_VAL16(x, 11,val)
+
+#define FAT_GET_BR_SECTORS_PER_CLUSTER(x) FAT_GET_VAL8( x, 13)
+#define FAT_SET_BR_SECTORS_PER_CLUSTER(x,val)FAT_SET_VAL8( x, 13,val)
+
+#define FAT_GET_BR_RESERVED_SECTORS_NUM(x) FAT_GET_VAL16(x, 14)
+#define FAT_SET_BR_RESERVED_SECTORS_NUM(x,val) FAT_SET_VAL16(x, 14,val)
+
+#define FAT_GET_BR_FAT_NUM(x) FAT_GET_VAL8( x, 16)
+#define FAT_SET_BR_FAT_NUM(x,val) FAT_SET_VAL8( x, 16,val)
+
+#define FAT_GET_BR_FILES_PER_ROOT_DIR(x) FAT_GET_VAL16(x, 17)
+#define FAT_SET_BR_FILES_PER_ROOT_DIR(x,val) FAT_SET_VAL16(x, 17,val)
+
+#define FAT_GET_BR_TOTAL_SECTORS_NUM16(x) FAT_GET_VAL16(x, 19)
+#define FAT_SET_BR_TOTAL_SECTORS_NUM16(x,val)FAT_SET_VAL16(x, 19,val)
+
+#define FAT_GET_BR_MEDIA(x) FAT_GET_VAL8( x, 21)
+#define FAT_SET_BR_MEDIA(x,val) FAT_SET_VAL8( x, 21,val)
+
+#define FAT_GET_BR_SECTORS_PER_FAT(x) FAT_GET_VAL16(x, 22)
+#define FAT_SET_BR_SECTORS_PER_FAT(x,val) FAT_SET_VAL16(x, 22,val)
+
+#define FAT_GET_BR_SECTORS_PER_TRACK(x) FAT_GET_VAL16(x, 24)
+#define FAT_SET_BR_SECTORS_PER_TRACK(x,val) FAT_SET_VAL16(x, 24,val)
+
+#define FAT_GET_BR_NUMBER_OF_HEADS(x) FAT_GET_VAL16(x, 26)
+#define FAT_SET_BR_NUMBER_OF_HEADS(x,val) FAT_SET_VAL16(x, 26,val)
+
+#define FAT_GET_BR_HIDDEN_SECTORS(x) FAT_GET_VAL32(x, 28)
+#define FAT_SET_BR_HIDDEN_SECTORS(x,val) FAT_SET_VAL32(x, 28,val)
+
+#define FAT_GET_BR_TOTAL_SECTORS_NUM32(x) FAT_GET_VAL32(x, 32)
+#define FAT_SET_BR_TOTAL_SECTORS_NUM32(x,val) FAT_SET_VAL32(x, 32,val)
+ /* --- start of FAT12/16 specific fields */
+#define FAT_GET_BR_DRVNUM(x) FAT_GET_VAL8( x, 36)
+#define FAT_SET_BR_DRVNUM(x,val) FAT_SET_VAL8( x, 36,val)
+
+#define FAT_GET_BR_RSVD1(x) FAT_GET_VAL8( x, 37)
+#define FAT_SET_BR_RSVD1(x,val) FAT_SET_VAL8( x, 37,val)
+
+#define FAT_GET_BR_BOOTSIG(x) FAT_GET_VAL8( x, 38)
+#define FAT_SET_BR_BOOTSIG(x,val) FAT_SET_VAL8( x, 38,val)
+#define FAT_BR_BOOTSIG_VAL (0x29)
+
+#define FAT_GET_BR_VOLID(x) FAT_GET_VAL32(x, 39)
+#define FAT_SET_BR_VOLID(x,val) FAT_SET_VAL32(x, 39,val)
+
+#define FAT_GET_ADDR_BR_VOLLAB(x) FAT_GET_ADDR (x, 43)
+#define FAT_BR_VOLLAB_SIZE (11)
+
+#define FAT_GET_ADDR_BR_FILSYSTYPE(x) FAT_GET_ADDR (x, 54)
+#define FAT_BR_FILSYSTYPE_SIZE (8)
+ /* --- end of FAT12/16 specific fields */
+ /* --- start of FAT32 specific fields */
+#define FAT_GET_BR_SECTORS_PER_FAT32(x) FAT_GET_VAL32(x, 36)
+#define FAT_SET_BR_SECTORS_PER_FAT32(x,val) FAT_SET_VAL32(x, 36,val)
+
+#define FAT_GET_BR_EXT_FLAGS(x) FAT_GET_VAL16(x, 40)
+#define FAT_SET_BR_EXT_FLAGS(x,val) FAT_SET_VAL16(x, 40,val)
+
+#define FAT_GET_BR_FSVER(x) FAT_GET_VAL16(x, 42)
+#define FAT_SET_BR_FSVER(x,val) FAT_SET_VAL16(x, 42,val)
+
+#define FAT_GET_BR_FAT32_ROOT_CLUSTER(x) FAT_GET_VAL32(x, 44)
+#define FAT_SET_BR_FAT32_ROOT_CLUSTER(x,val) FAT_SET_VAL32(x, 44,val)
+
+#define FAT_GET_BR_FAT32_FS_INFO_SECTOR(x) FAT_GET_VAL16(x, 48)
+#define FAT_SET_BR_FAT32_FS_INFO_SECTOR(x,val) FAT_SET_VAL16(x, 48,val)
+
+#define FAT_GET_BR_FAT32_BK_BOOT_SECTOR(x) FAT_GET_VAL16(x, 50)
+#define FAT_SET_BR_FAT32_BK_BOOT_SECTOR(x,val) FAT_SET_VAL16(x, 50,val)
+
+#define FAT_GET_ADDR_BR_FAT32_RESERVED(x) FAT_GET_ADDR (x, 52)
+#define FAT_BR_FAT32_RESERVED_SIZE (12)
+
+#define FAT_GET_BR_FAT32_DRVNUM(x) FAT_GET_VAL8( x, 64)
+#define FAT_SET_BR_FAT32_DRVNUM(x,val) FAT_SET_VAL8( x, 64,val)
+
+#define FAT_GET_BR_FAT32_RSVD1(x) FAT_GET_VAL8( x, 65)
+#define FAT_SET_BR_FAT32_RSVD1(x,val) FAT_SET_VAL8( x, 65,val)
+
+#define FAT_GET_BR_FAT32_BOOTSIG(x) FAT_GET_VAL8( x, 66)
+#define FAT_SET_BR_FAT32_BOOTSIG(x,val) FAT_SET_VAL8( x, 66,val)
+#define FAT_BR_FAT32_BOOTSIG_VAL (0x29)
+
+#define FAT_GET_BR_FAT32_VOLID(x) FAT_GET_VAL32(x, 67)
+#define FAT_SET_BR_FAT32_VOLID(x,val) FAT_SET_VAL32(x, 67,val)
+
+#define FAT_GET_ADDR_BR_FAT32_VOLLAB(x) FAT_GET_ADDR (x, 71)
+#define FAT_BR_FAT32_VOLLAB_SIZE (11)
+
+#define FAT_GET_ADDR_BR_FAT32_FILSYSTYPE(x) FAT_GET_ADDR (x, 82)
+#define FAT_BR_FAT32_FILSYSTYPE_SIZE (8)
+ /* --- end of FAT32 specific fields */
+
+#define FAT_GET_BR_SIGNATURE(x) FAT_GET_VAL16(x,510)
+#define FAT_SET_BR_SIGNATURE(x,val) FAT_SET_VAL16(x,510,val)
+#define FAT_BR_SIGNATURE_VAL (0xAA55)
+
+ /*
+ * FAT32 FSINFO description
+ */
+#define FAT_GET_FSINFO_LEAD_SIGNATURE(x) FAT_GET_VAL32(x, 0)
+#define FAT_SET_FSINFO_LEAD_SIGNATURE(x,val) FAT_SET_VAL32(x, 0,val)
+#define FAT_FSINFO_LEAD_SIGNATURE_VALUE (0x41615252)
+
+#define FAT_GET_FSINFO_STRUC_SIGNATURE(x) FAT_GET_VAL32(x,484)
+#define FAT_SET_FSINFO_STRUC_SIGNATURE(x,val) FAT_SET_VAL32(x,484,val)
+#define FAT_FSINFO_STRUC_SIGNATURE_VALUE (0x61417272)
+
+#define FAT_GET_FSINFO_TRAIL_SIGNATURE(x) FAT_GET_VAL32(x,508)
+#define FAT_SET_FSINFO_TRAIL_SIGNATURE(x,val) FAT_SET_VAL32(x,508,val)
+#define FAT_FSINFO_TRAIL_SIGNATURE_VALUE (0x000055AA)
+/*
+ * I read FSInfo sector from offset 484 to access the information, so offsets
* of these fields a relative
*/
-#define FAT_FSINFO_FREE_CLUSTER_COUNT(x) FAT_VAL32(x, 4)
-#define FAT_FSINFO_NEXT_FREE_CLUSTER(x) FAT_VAL32(x, 8)
+#define FAT_GET_FSINFO_FREE_CLUSTER_COUNT(x) FAT_GET_VAL32(x, 4)
+#define FAT_SET_FSINFO_FREE_CLUSTER_COUNT(x,val) FAT_SET_VAL32(x, 4,val)
+#define FAT_GET_FSINFO_NEXT_FREE_CLUSTER(x) FAT_GET_VAL32(x, 8)
+#define FAT_SET_FSINFO_NEXT_FREE_CLUSTER(x,val) FAT_SET_VAL32(x, 8,val)
-#define FAT_FSINFO_FREE_CLUSTER_COUNT_OFFSET 488
+#define FAT_FSI_INFO 484
+#define FAT_FSINFO_STRUCT_OFFSET 488
+#define FAT_FSINFO_FREE_CLUSTER_COUNT_OFFSET (FAT_FSINFO_STRUCT_OFFSET+0)
-#define FAT_FSINFO_NEXT_FREE_CLUSTER_OFFSET 492
+#define FAT_FSINFO_NEXT_FREE_CLUSTER_OFFSET (FAT_FSINFO_STRUCT_OFFSET+4)
#define FAT_RSRVD_CLN 0x02
-#define FAT_FSINFO_LEAD_SIGNATURE_VALUE 0x41615252
-
#define FAT_FSI_LEADSIG_SIZE 0x04
-#define FAT_FSI_INFO 484
+#define FAT_TOTAL_FSINFO_SIZE 512
#define MS_BYTES_PER_CLUSTER_LIMIT 0x8000 /* 32K */
@@ -157,6 +282,7 @@ extern "C" {
#define FAT_BR_EXT_FLAGS_FAT_NUM 0x000F
+#define FAT_BR_MEDIA_FIXED 0xf8
#define FAT_DIRENTRY_SIZE 32
diff --git a/cpukit/libfs/src/dosfs/msdos_format.c b/cpukit/libfs/src/dosfs/msdos_format.c
index a34b4ce750..9af5b9c15f 100644
--- a/cpukit/libfs/src/dosfs/msdos_format.c
+++ b/cpukit/libfs/src/dosfs/msdos_format.c
@@ -42,27 +42,27 @@
#include "dosfs.h"
typedef struct {
- unsigned32 bytes_per_sector;
- unsigned32 totl_sector_cnt;
- unsigned32 rsvd_sector_cnt;
-
- unsigned32 sectors_per_cluster;
- unsigned32 sectors_per_fat;
-
- unsigned32 fat_start_sec;
- unsigned32 files_per_root_dir;
- unsigned32 root_dir_sectors;
- unsigned32 root_dir_start_sec;
- unsigned32 root_dir_fmt_sec_cnt;
- unsigned32 mbr_copy_sec; /* location of copy of mbr or 0 */
- unsigned32 fsinfo_sec; /* location of fsinfo sector or 0 */
- unsigned8 fat_num;
- unsigned8 media_code;
- unsigned8 fattype;
- char OEMName[FAT_BR_OEMNAME_SIZE+1];
- char VolLabel[FAT_BR_VOLLAB_SIZE+1];
- boolean VolLabel_present;
- unsigned32 vol_id;
+ uint32_t bytes_per_sector;
+ uint32_t totl_sector_cnt;
+ uint32_t rsvd_sector_cnt;
+
+ uint32_t sectors_per_cluster;
+ uint32_t sectors_per_fat;
+
+ uint32_t fat_start_sec;
+ uint32_t files_per_root_dir;
+ uint32_t root_dir_sectors;
+ uint32_t root_dir_start_sec;
+ uint32_t root_dir_fmt_sec_cnt;
+ uint32_t mbr_copy_sec; /* location of copy of mbr or 0 */
+ uint32_t fsinfo_sec; /* location of fsinfo sector or 0 */
+ uint8_t fat_num;
+ uint8_t media_code;
+ uint8_t fattype;
+ char OEMName[FAT_BR_OEMNAME_SIZE+1];
+ char VolLabel[FAT_BR_VOLLAB_SIZE+1];
+ boolean VolLabel_present;
+ uint32_t vol_id;
} msdos_format_param_t;
/*=========================================================================*\
@@ -77,8 +77,8 @@ static int msdos_format_write_sec
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int fd, /* file descriptor index */
- unsigned32 start_sector, /* sector number to write to */
- unsigned32 sector_size, /* size of sector */
+ uint32_t start_sector, /* sector number to write to */
+ uint32_t sector_size, /* size of sector */
const char *buffer /* buffer with write data */
)
/*-------------------------------------------------------------------------*\
@@ -112,9 +112,9 @@ static int msdos_format_fill_sectors
| Input Parameters: |
\*-------------------------------------------------------------------------*/
int fd, /* file descriptor index */
- unsigned32 start_sector, /* sector number to fill to */
- unsigned32 sector_cnt, /* number of sectors to fill to */
- unsigned32 sector_size, /* size of sector */
+ uint32_t start_sector, /* sector number to fill to */
+ uint32_t sector_cnt, /* number of sectors to fill to */
+ uint32_t sector_size, /* size of sector */
const char fill_byte /* byte to fill into sectors */
)
/*-------------------------------------------------------------------------*\
@@ -169,7 +169,7 @@ static int msdos_format_gen_volid
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
- unsigned32 *volid_ptr /* volume ID return pointer */
+ uint32_t *volid_ptr /* volume ID return pointer */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
@@ -203,13 +203,13 @@ static int msdos_format_eval_sectors_per_cluster
+---------------------------------------------------------------------------+
| Input Parameters: |
\*-------------------------------------------------------------------------*/
- int fattype, /* type code of FAT (FAT_FAT12 ...) */
- unsigned32 bytes_per_sector, /* byte count per sector (512) */
- unsigned32 fatdata_sec_cnt, /* sectors available for FAT and data */
- unsigned8 fat_num, /* number of fat copies */
- unsigned32 sectors_per_cluster, /* sectors per cluster (requested) */
- unsigned32 *sectors_per_cluster_adj, /* ret: sec per cluster (granted) */
- unsigned32 *sectors_per_fat_ptr /* ret: sectors needed for one FAT */
+ int fattype, /* type code of FAT (FAT_FAT12 ...) */
+ uint32_t bytes_per_sector, /* byte count per sector (512) */
+ uint32_t fatdata_sec_cnt, /* sectors available for FAT and data */
+ uint8_t fat_num, /* number of fat copies */
+ uint32_t sectors_per_cluster, /* sectors per cluster (requested) */
+ uint32_t *sectors_per_cluster_adj, /* ret: sec per cluster (granted) */
+ uint32_t *sectors_per_fat_ptr /* ret: sectors needed for one FAT */
)
/*-------------------------------------------------------------------------*\
| Return Value: |
@@ -219,10 +219,10 @@ static int msdos_format_eval_sectors_per_cluster
boolean finished = FALSE;
int ret_val = 0;
- unsigned32 fatdata_cluster_cnt;
- unsigned32 fat_capacity;
- unsigned32 sectors_per_fat;
- unsigned32 data_cluster_cnt;
+ uint32_t fatdata_cluster_cnt;
+ uint32_t fat_capacity;
+ uint32_t sectors_per_fat;
+ uint32_t data_cluster_cnt;
/*
* ensure, that maximum cluster size (32KByte) is not exceeded
*/
@@ -308,9 +308,9 @@ static int msdos_format_determine_fmt_params
\*=========================================================================*/
{
int ret_val = 0;
- unsigned32 fatdata_sect_cnt;
- unsigned32 onebit;
- unsigned32 sectors_per_cluster_adj;
+ uint32_t fatdata_sect_cnt;
+ uint32_t onebit;
+ uint32_t sectors_per_cluster_adj;
memset(fmt_params,0,sizeof(*fmt_params));
/*
@@ -396,13 +396,13 @@ static int msdos_format_determine_fmt_params
* are a compromise concerning capacity and efficency
*/
if (fmt_params->totl_sector_cnt
- < ((unsigned32)FAT_FAT12_MAX_CLN)*8) {
+ < ((uint32_t)FAT_FAT12_MAX_CLN)*8) {
fmt_params->fattype = FAT_FAT12;
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
}
else if (fmt_params->totl_sector_cnt
- < ((unsigned32)FAT_FAT16_MAX_CLN)*32) {
+ < ((uint32_t)FAT_FAT16_MAX_CLN)*32) {
fmt_params->fattype = FAT_FAT16;
/* start trying with small clusters */
fmt_params->sectors_per_cluster = 2;
@@ -638,8 +638,8 @@ static int msdos_format_gen_mbr
| 0, if success, -1 and errno if failed |
\*=========================================================================*/
{
- unsigned32 total_sectors_num16 = 0;
- unsigned32 total_sectors_num32 = 0;
+ uint32_t total_sectors_num16 = 0;
+ uint32_t total_sectors_num32 = 0;
/* store total sector count in either 16 or 32 bit field in mbr */
if (fmt_params->totl_sector_cnt < 0x10000) {