⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.h

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 H
📖 第 1 页 / 共 2 页
字号:
/* *  fat.h * *  Constants/data structures/prototypes for low-level operations on a volume *  with FAT filesystem * *  Copyright (C) 2001 OKTET Ltd., St.-Petersburg, Russia *  Author: Eugeny S. Mints <Eugeny.Mints@oktet.ru> * *  The license and distribution terms for this file may be *  found in the file LICENSE in this distribution or at *  http://www.rtems.com/license/LICENSE. * *  @(#) $Id: fat.h,v 1.3.2.3 2003/09/04 18:47:02 joel Exp $ */#ifndef __DOSFS_FAT_H__#define __DOSFS_FAT_H__#ifdef __cplusplusextern "C" {#endif#include <string.h>#include <rtems/seterr.h>/* XXX: temporary hack :(( */#ifndef set_errno_and_return_minus_one#define set_errno_and_return_minus_one rtems_set_errno_and_return_minus_one#endif /* set_errno_and_return_minus_one */#include <rtems/score/cpu.h>#include <errno.h>#include <rtems/bdbuf.h>#ifndef RC_OK#define RC_OK 0x00000000#endif/*  * Remember that all FAT file system on disk data structure is  * "little endian"!  * (derived from linux) *//* * Conversion from and to little-endian byte order. (no-op on i386/i486) * * Naming: Ca_b_c, where a: F = from, T = to, b: LE = little-endian, * BE = big-endian, c: W = word (16 bits), L = longword (32 bits) */#if (CPU_BIG_ENDIAN == TRUE)#    define CF_LE_W(v) CPU_swap_u16((unsigned16)v)#    define CF_LE_L(v) CPU_swap_u32((unsigned32)v)#    define CT_LE_W(v) CPU_swap_u16((unsigned16)v)#    define CT_LE_L(v) CPU_swap_u32((unsigned32)v)#else  #    define CF_LE_W(v) (v)#    define CF_LE_L(v) (v)#    define CT_LE_W(v) (v)#    define CT_LE_L(v) (v)#endif  #define MIN(a, b)  (((a) < (b)) ? (a) : (b))#define FAT_HASH_SIZE   2#define FAT_HASH_MODULE FAT_HASH_SIZE#define FAT_SECTOR512_SIZE     512 /* sector size (bytes) */#define FAT_SECTOR512_BITS       9 /* log2(SECTOR_SIZE) *//* maximum + 1 number of clusters for FAT12 */#define FAT_FAT12_MAX_CLN      4085 /* maximum + 1 number of clusters for FAT16 */#define FAT_FAT16_MAX_CLN      65525 #define FAT_FAT12              0x01#define FAT_FAT16              0x02#define FAT_FAT32              0x04 #define FAT_UNDEFINED_VALUE     (unsigned32)0xFFFFFFFF #define FAT_FAT12_EOC          0x0FF8#define FAT_FAT16_EOC          0xFFF8#define FAT_FAT32_EOC          (unsigned32)0x0FFFFFF8#define FAT_FAT12_FREE         0x0000#define FAT_FAT16_FREE         0x0000#define FAT_FAT32_FREE         0x00000000#define FAT_GENFAT_EOC         (unsigned32)0xFFFFFFFF#define FAT_GENFAT_FREE        (unsigned32)0x00000000#define FAT_FAT12_SHIFT        0x04#define FAT_FAT12_MASK         0x00000FFF#define FAT_FAT16_MASK         0x0000FFFF#define FAT_FAT32_MASK         (unsigned32)0x0FFFFFFF#define FAT_MAX_BPB_SIZE       90/* size of useful information in FSInfo sector */#define FAT_USEFUL_INFO_SIZE   12#define FAT_VAL8(x, ofs)       (unsigned8)(*((unsigned8 *)(x) + (ofs))) #define FAT_VAL16(x, ofs)                                   \    (unsigned16)( (*((unsigned8 *)(x) + (ofs))) |           \                  ((*((unsigned8 *)(x) + (ofs) + 1)) << 8) )#define FAT_VAL32(x, ofs)                                                 \    (unsigned32)( (unsigned32)(*((unsigned8 *)(x) + (ofs))) |             \                  ((unsigned32)(*((unsigned8 *)(x) + (ofs) + 1)) << 8)  | \                  ((unsigned32)(*((unsigned8 *)(x) + (ofs) + 2)) << 16) | \                  ((unsigned32)(*((unsigned8 *)(x) + (ofs) + 3)) << 24) )                    /* 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  * 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_FSINFO_FREE_CLUSTER_COUNT_OFFSET 488#define FAT_FSINFO_NEXT_FREE_CLUSTER_OFFSET  492#define FAT_RSRVD_CLN                        0x02  #define FAT_FSINFO_LEAD_SIGNATURE_VALUE      0x41615252#define FAT_FSI_LEADSIG_SIZE                 0x04#define FAT_FSI_INFO                         484#define MS_BYTES_PER_CLUSTER_LIMIT           0x8000     /* 32K */#define FAT_BR_EXT_FLAGS_MIRROR              0x0080#define FAT_BR_EXT_FLAGS_FAT_NUM             0x000F#define FAT_DIRENTRY_SIZE          32  #define FAT_DIRENTRIES_PER_SEC512  16/*  * Volume descriptor * Description of the volume the FAT filesystem is located on - generally  * the fields of the structure corresponde to Boot Sector and BPB Srtucture * fields */typedef struct fat_vol_s {    unsigned16   bps;            /* bytes per sector */    unsigned8    sec_log2;       /* log2 of bps */    unsigned8    sec_mul;        /* log2 of 512bts sectors number per sector */    unsigned8    spc;            /* sectors per cluster */    unsigned8    spc_log2;       /* log2 of spc */    unsigned16   bpc;            /* bytes per cluster */    unsigned8    bpc_log2;       /* log2 of bytes per cluster */    unsigned8    fats;           /* number of FATs */    unsigned8    type;           /* FAT type */    unsigned32   mask;    unsigned32   eoc_val;    unsigned16   fat_loc;        /* FAT start */    unsigned32   fat_length;     /* sectors per FAT */    unsigned32   rdir_loc;       /* root directory start */    unsigned16   rdir_entrs;     /* files per root directory */    unsigned32   rdir_secs;      /* sectors per root directory */    unsigned32   rdir_size;      /* root directory size in bytes */    unsigned32   tot_secs;       /* total count of sectors */    unsigned32   data_fsec;      /* first data sector */    unsigned32   data_cls;       /* count of data clusters */    unsigned32   rdir_cl;        /* first cluster of the root directory */    unsigned16   info_sec;       /* FSInfo Sector Structure location */    unsigned32   free_cls;       /* last known free clusters count */    unsigned32   next_cl;        /* next free cluster number */    unsigned8    mirror;         /* mirroring enabla/disable */    unsigned32   afat_loc;       /* active FAT location */    unsigned8    afat;           /* the number of active FAT */    dev_t        dev;            /* device ID */    disk_device *dd;             /* disk device (see libblock) */    void        *private_data;   /* reserved */} fat_vol_t;typedef struct fat_cache_s{    unsigned32     blk_num;    rtems_boolean  modified;    unsigned8      state;    bdbuf_buffer   *buf;} fat_cache_t;    /*   * This structure identifies the instance of the filesystem on the FAT  * ("fat-file") level. */typedef struct fat_fs_info_s{    fat_vol_t      vol;           /* volume descriptor */    Chain_Control *vhash;         /* "vhash" of fat-file descriptors */    Chain_Control *rhash;         /* "rhash" of fat-file descriptors */    char          *uino;          /* array of unique ino numbers */    unsigned32     index;    unsigned32     uino_pool_size; /* size */    unsigned32     uino_base;    fat_cache_t    c;             /* cache */    unsigned8     *sec_buf; /* just placeholder for anything */} fat_fs_info_t;/*  * if the name we looking for is file we store not only first data cluster * number, but and cluster number and offset for directory entry for this  * name */typedef struct fat_auxiliary_s{    unsigned32 cln;    unsigned32 ofs;} fat_auxiliary_t;#define FAT_FAT_OFFSET(fat_type, cln)                  \    ((fat_type) & FAT_FAT12 ? ((cln) + ((cln) >> 1)) : \     (fat_type) & FAT_FAT16 ? ((cln) << 1)           : \     ((cln) << 2))#define FAT_CLUSTER_IS_ODD(n)  ((n) & 0x0001)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -