fatfs文件系统fat表条目的获取和设置
//指定蔟号,获取fat表中对应的位置的值
//返回值:
//0xFFFFFFFF:磁盘错误
//1:文件系统内部错误
//2..0x7FFFFFFF:蔟状态
static DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */
FFOBJID* obj, /* Corresponding object */
DWORD clst//蔟号。/* Cluster number to get the value */
)
{
UINT wc, bc;
DWORD val;
FATFS *fs = obj->fs;//文件系统
//蔟号必须是大于等于2的
//蔟号不能超过fat表中条目数
if (clst < 2 || clst >= fs->n_fatent) {
/* Check if in valid range */
val = 1;//内部错误。/* Internal error */
} else {
val = 0xFFFFFFFF;//默认值为磁盘错误。/* Default value falls on disk error */
switch (fs->fs_type) {
//文件系统类型
case FS_FAT12 ://fat12文件系统
//fat12文件系统fat表中使用1.5个字节表示一个条目
//起始字节偏移量:clst*1.5 = clst + clst / 2
bc = (UINT)clst;
bc += bc / 2;//起始字节偏移量
if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break;//获取bc所在扇区数据
wc = fs->win[bc++ % SS(fs)];//求余得到距离扇区开头的偏移量,同时将bc递增,需要获取下一个字节数据/* Get 1st byte of the entry */
if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break;//获取bc所在扇区数据
wc |= fs->win[bc % SS(fs)] << 8;//将两个字节合并,第二个字节在高8位。/* Merge 2nd byte of the entry */
//蔟号为奇数,则wc右移四位,使用高12位
//为偶数,则只保留低12位
//由此可以看出:
//蔟0:byte1低4位 + byte0组合的12bit
//蔟1:byte2 + byte1高4位组合的12bit
//蔟2:byte4低4位 + byte3组合的12bit
//蔟3:byte5 + byte4高4位组合的12bit
val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF);<