📄 fat.h
字号:
#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 + -