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

📄 fat.h

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 H
📖 第 1 页 / 共 2 页
字号:
#define FAT12_SHIFT      0x4    /* half of a byte *//* initial size of array of unique ino */#define FAT_UINO_POOL_INIT_SIZE  0x100/* cache support */#define FAT_CACHE_EMPTY   0x0#define FAT_CACHE_ACTUAL  0x1#define FAT_OP_TYPE_READ  0x1#define FAT_OP_TYPE_GET   0x2static inline unsigned32fat_cluster_num_to_sector_num(    rtems_filesystem_mount_table_entry_t *mt_entry,    unsigned32                            cln    ){    register fat_fs_info_t *fs_info = mt_entry->fs_info;      if ( (cln == 0) && (fs_info->vol.type & (FAT_FAT12 | FAT_FAT16)) )        return fs_info->vol.rdir_loc;      return (((cln - FAT_RSRVD_CLN) << fs_info->vol.spc_log2) +             fs_info->vol.data_fsec);} static inline unsigned32fat_cluster_num_to_sector512_num(    rtems_filesystem_mount_table_entry_t *mt_entry,    unsigned32                            cln    ){    fat_fs_info_t *fs_info = mt_entry->fs_info;    if (cln == 1)        return 1;    return (fat_cluster_num_to_sector_num(mt_entry, cln) <<            fs_info->vol.sec_mul);} static inline intfat_buf_access(fat_fs_info_t *fs_info, unsigned32 blk, int op_type,                bdbuf_buffer **buf){    rtems_status_code sc = RTEMS_SUCCESSFUL;    unsigned8         i;    rtems_boolean     sec_of_fat;        if (fs_info->c.state == FAT_CACHE_EMPTY)    {        if (op_type == FAT_OP_TYPE_READ)            sc = rtems_bdbuf_read(fs_info->vol.dev, blk, &fs_info->c.buf);        else            sc = rtems_bdbuf_get(fs_info->vol.dev, blk, &fs_info->c.buf);            if (sc != RTEMS_SUCCESSFUL)            set_errno_and_return_minus_one(EIO);        fs_info->c.blk_num = blk;    	fs_info->c.modified = 0;            fs_info->c.state = FAT_CACHE_ACTUAL;        }        sec_of_fat = ((fs_info->c.blk_num >= fs_info->vol.fat_loc) &&                   (fs_info->c.blk_num < fs_info->vol.rdir_loc));    if (fs_info->c.blk_num != blk)    {        if (fs_info->c.modified)        {            if (sec_of_fat && !fs_info->vol.mirror)                memcpy(fs_info->sec_buf, fs_info->c.buf->buffer,                        fs_info->vol.bps);                        sc = rtems_bdbuf_release_modified(fs_info->c.buf);	    fs_info->c.state = FAT_CACHE_EMPTY;            fs_info->c.modified = 0;                if (sc != RTEMS_SUCCESSFUL)                set_errno_and_return_minus_one(EIO);                        if (sec_of_fat && !fs_info->vol.mirror)            {                bdbuf_buffer *b;                            for (i = 1; i < fs_info->vol.fats; i++)                {                    sc = rtems_bdbuf_get(fs_info->vol.dev,                                         fs_info->c.blk_num +                                          fs_info->vol.fat_length * i,                                          &b);                    if ( sc != RTEMS_SUCCESSFUL)                        set_errno_and_return_minus_one(ENOMEM);                    memcpy(b->buffer, fs_info->sec_buf, fs_info->vol.bps);                    sc = rtems_bdbuf_release_modified(b);                    if ( sc != RTEMS_SUCCESSFUL)                        set_errno_and_return_minus_one(ENOMEM);                }            }            }        else        {            sc = rtems_bdbuf_release(fs_info->c.buf);	    fs_info->c.state = FAT_CACHE_EMPTY;            if (sc != RTEMS_SUCCESSFUL)                set_errno_and_return_minus_one(EIO);                }                 if (op_type == FAT_OP_TYPE_READ)            sc = rtems_bdbuf_read(fs_info->vol.dev, blk, &fs_info->c.buf);        else            sc = rtems_bdbuf_get(fs_info->vol.dev, blk, &fs_info->c.buf);            if (sc != RTEMS_SUCCESSFUL)            set_errno_and_return_minus_one(EIO);        fs_info->c.blk_num = blk;	fs_info->c.state = FAT_CACHE_ACTUAL;    }    *buf = fs_info->c.buf;    return RC_OK;}static inline int fat_buf_release(fat_fs_info_t *fs_info){    rtems_status_code sc = RTEMS_SUCCESSFUL;    unsigned8         i;    rtems_boolean     sec_of_fat;            if (fs_info->c.state == FAT_CACHE_EMPTY)        return RC_OK;                sec_of_fat = ((fs_info->c.blk_num >= fs_info->vol.fat_loc) &&                   (fs_info->c.blk_num < fs_info->vol.rdir_loc));    if (fs_info->c.modified)    {        if (sec_of_fat && !fs_info->vol.mirror)            memcpy(fs_info->sec_buf, fs_info->c.buf->buffer, fs_info->vol.bps);                    sc = rtems_bdbuf_release_modified(fs_info->c.buf);        if (sc != RTEMS_SUCCESSFUL)            set_errno_and_return_minus_one(EIO);        fs_info->c.modified = 0;                      if (sec_of_fat && !fs_info->vol.mirror)        {            bdbuf_buffer *b;                        for (i = 1; i < fs_info->vol.fats; i++)            {                sc = rtems_bdbuf_get(fs_info->vol.dev,                                     fs_info->c.blk_num +                                      fs_info->vol.fat_length * i,                                      &b);                if ( sc != RTEMS_SUCCESSFUL)                    set_errno_and_return_minus_one(ENOMEM);                memcpy(b->buffer, fs_info->sec_buf, fs_info->vol.bps);                sc = rtems_bdbuf_release_modified(b);                if ( sc != RTEMS_SUCCESSFUL)                    set_errno_and_return_minus_one(ENOMEM);            }        }        }    else    {        sc = rtems_bdbuf_release(fs_info->c.buf);        if (sc != RTEMS_SUCCESSFUL)            set_errno_and_return_minus_one(EIO);    }             fs_info->c.state = FAT_CACHE_EMPTY;    return RC_OK;}static inline voidfat_buf_mark_modified(fat_fs_info_t *fs_info){    fs_info->c.modified = TRUE;}ssize_t_fat_block_read(rtems_filesystem_mount_table_entry_t *mt_entry,                unsigned32                            start,                unsigned32                            offset,                unsigned32                            count,                void                                 *buff);ssize_t_fat_block_write(rtems_filesystem_mount_table_entry_t *mt_entry,                 unsigned32                            start,                 unsigned32                            offset,                 unsigned32                            count,                 const void                           *buff);ssize_tfat_cluster_read(rtems_filesystem_mount_table_entry_t *mt_entry,                  unsigned32                           cln,                  void                                *buff);ssize_tfat_cluster_write(rtems_filesystem_mount_table_entry_t *mt_entry,                   unsigned32                           cln,                   const void                          *buff);intfat_init_volume_info(rtems_filesystem_mount_table_entry_t *mt_entry);intfat_init_clusters_chain(rtems_filesystem_mount_table_entry_t *mt_entry,                        unsigned32                            start_cln);unsigned32fat_cluster_num_to_sector_num(rtems_filesystem_mount_table_entry_t *mt_entry,                              unsigned32                            cln);intfat_shutdown_drive(rtems_filesystem_mount_table_entry_t *mt_entry);unsigned32fat_get_unique_ino(rtems_filesystem_mount_table_entry_t *mt_entry);                                                           rtems_booleanfat_ino_is_unique(rtems_filesystem_mount_table_entry_t *mt_entry,                  unsigned32                            ino);voidfat_free_unique_ino(rtems_filesystem_mount_table_entry_t *mt_entry,                    unsigned32                            ino);intfat_fat32_update_fsinfo_sector(  rtems_filesystem_mount_table_entry_t *mt_entry,  unsigned32                            free_count,  unsigned32                            next_free  );                       #ifdef __cplusplus}#endif                                            #endif /* __DOSFS_FAT_H__ */

⌨️ 快捷键说明

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