From c36f885aa7b4390efdf5b89adc6866e1024e1ceb Mon Sep 17 00:00:00 2001 From: Ralf Corsepius Date: Sat, 20 Nov 2004 03:11:41 +0000 Subject: 2004-11-20 Ralf Corsepius 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 ). * 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. --- cpukit/libfs/src/dosfs/dosfs.h | 48 ++++++++ cpukit/libfs/src/dosfs/fat.c | 64 +++++------ cpukit/libfs/src/dosfs/fat.h | 202 +++++++++++++++++++++++++++------- cpukit/libfs/src/dosfs/msdos_format.c | 90 +++++++-------- 4 files changed, 289 insertions(+), 115 deletions(-) (limited to 'cpukit/libfs') 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) { -- cgit v1.2.3