亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ff.c

?? STM32SDCardSourceCodeFATFS.rar
?? C
?? 第 1 頁 / 共 5 頁
字號:
			break;

		case FS_FAT32 :
			res = move_window(fs, fsect + (clst / (SS(fs) / 4)));
			if (res != FR_OK) break;
			ST_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)], val);
			break;

		default :
			res = FR_INT_ERR;
		}
		fs->wflag = 1;
	}

	return res;
}
#endif /* !_FS_READONLY */




/*-----------------------------------------------------------------------*/
/* FAT handling - Remove a cluster chain                                 */
/*-----------------------------------------------------------------------*/
#if !_FS_READONLY
static
FRESULT remove_chain (
	FATFS *fs,			/* File system object */
	DWORD clst			/* Cluster# to remove a chain from */
)
{
	FRESULT res;
	DWORD nxt;


	if (clst < 2 || clst >= fs->max_clust) {	/* Check the range of cluster# */
		res = FR_INT_ERR;

	} else {
		res = FR_OK;
		while (clst < fs->max_clust) {			/* Not a last link? */
			nxt = get_fat(fs, clst);			/* Get cluster status */
			if (nxt == 0) break;				/* Empty cluster? */
			if (nxt == 1) { res = FR_INT_ERR; break; }	/* Internal error? */
			if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; }	/* Disk error? */
			res = put_fat(fs, clst, 0);			/* Mark the cluster "empty" */
			if (res != FR_OK) break;
			if (fs->free_clust != 0xFFFFFFFF) {	/* Update FSInfo */
				fs->free_clust++;
				fs->fsi_flag = 1;
			}
			clst = nxt;	/* Next cluster */
		}
	}

	return res;
}
#endif




/*-----------------------------------------------------------------------*/
/* FAT handling - Stretch or Create a cluster chain                      */
/*-----------------------------------------------------------------------*/
#if !_FS_READONLY
static
DWORD create_chain (	/* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */
	FATFS *fs,			/* File system object */
	DWORD clst			/* Cluster# to stretch. 0 means create a new chain. */
)
{
	DWORD cs, ncl, scl, mcl;


	mcl = fs->max_clust;
	if (clst == 0) {		/* Create new chain */
		scl = fs->last_clust;			/* Get suggested start point */
		if (scl == 0 || scl >= mcl) scl = 1;
	}
	else {					/* Stretch existing chain */
		cs = get_fat(fs, clst);			/* Check the cluster status */
		if (cs < 2) return 1;			/* It is an invalid cluster */
		if (cs < mcl) return cs;		/* It is already followed by next cluster */
		scl = clst;
	}

	ncl = scl;				/* Start cluster */
	for (;;) {
		ncl++;							/* Next cluster */
		if (ncl >= mcl) {				/* Wrap around */
			ncl = 2;
			if (ncl > scl) return 0;	/* No free custer */
		}
		cs = get_fat(fs, ncl);			/* Get the cluster status */
		if (cs == 0) break;				/* Found a free cluster */
		if (cs == 0xFFFFFFFF || cs == 1)/* An error occured */
			return cs;
		if (ncl == scl) return 0;		/* No free custer */
	}

	if (put_fat(fs, ncl, 0x0FFFFFFF))	/* Mark the new cluster "in use" */
		return 0xFFFFFFFF;
	if (clst != 0) {					/* Link it to the previous one if needed */
		if (put_fat(fs, clst, ncl))
			return 0xFFFFFFFF;
	}

	fs->last_clust = ncl;				/* Update FSINFO */
	if (fs->free_clust != 0xFFFFFFFF) {
		fs->free_clust--;
		fs->fsi_flag = 1;
	}

	return ncl;		/* Return new cluster number */
}
#endif /* !_FS_READONLY */




/*-----------------------------------------------------------------------*/
/* Get sector# from cluster#                                             */
/*-----------------------------------------------------------------------*/


DWORD clust2sect (	/* !=0: Sector number, 0: Failed - invalid cluster# */
	FATFS *fs,		/* File system object */
	DWORD clst		/* Cluster# to be converted */
)
{
	clst -= 2;
	if (clst >= (fs->max_clust - 2)) return 0;		/* Invalid cluster# */
	return clst * fs->csize + fs->database;
}




/*-----------------------------------------------------------------------*/
/* Directory handling - Seek directory index                             */
/*-----------------------------------------------------------------------*/

static
FRESULT dir_seek (
	DIR *dj,		/* Pointer to directory object */
	WORD idx		/* Directory index number */
)
{
	DWORD clst;
	WORD ic;


	dj->index = idx;
	clst = dj->sclust;
	if (clst == 1 || clst >= dj->fs->max_clust)	/* Check start cluster range */
		return FR_INT_ERR;
	if (!clst && dj->fs->fs_type == FS_FAT32)	/* Replace cluster# 0 with root cluster# if in FAT32 */
		clst = dj->fs->dirbase;

	if (clst == 0) {	/* Static table */
		dj->clust = clst;
		if (idx >= dj->fs->n_rootdir)		/* Index is out of range */
			return FR_INT_ERR;
		dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32);	/* Sector# */
	}
	else {				/* Dynamic table */
		ic = SS(dj->fs) / 32 * dj->fs->csize;	/* Entries per cluster */
		while (idx >= ic) {	/* Follow cluster chain */
			clst = get_fat(dj->fs, clst);				/* Get next cluster */
			if (clst == 0xFFFFFFFF) return FR_DISK_ERR;	/* Disk error */
			if (clst < 2 || clst >= dj->fs->max_clust)	/* Reached to end of table or int error */
				return FR_INT_ERR;
			idx -= ic;
		}
		dj->clust = clst;
		dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / 32);	/* Sector# */
	}

	dj->dir = dj->fs->win + (idx % (SS(dj->fs) / 32)) * 32;	/* Ptr to the entry in the sector */

	return FR_OK;	/* Seek succeeded */
}




/*-----------------------------------------------------------------------*/
/* Directory handling - Move directory index next                        */
/*-----------------------------------------------------------------------*/

static
FRESULT dir_next (	/* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not streach */
	DIR *dj,		/* Pointer to directory object */
	BOOL streach	/* FALSE: Do not streach table, TRUE: Streach table if needed */
)
{
	DWORD clst;
	WORD i;


	i = dj->index + 1;
	if (!i || !dj->sect)	/* Report EOT when index has reached 65535 */
		return FR_NO_FILE;

	if (!(i % (SS(dj->fs) / 32))) {	/* Sector changed? */
		dj->sect++;					/* Next sector */

		if (dj->clust == 0) {	/* Static table */
			if (i >= dj->fs->n_rootdir)	/* Report EOT when end of table */
				return FR_NO_FILE;
		}
		else {					/* Dynamic table */
			if (((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0) {	/* Cluster changed? */
				clst = get_fat(dj->fs, dj->clust);				/* Get next cluster */
				if (clst <= 1) return FR_INT_ERR;
				if (clst == 0xFFFFFFFF) return FR_DISK_ERR;
				if (clst >= dj->fs->max_clust) {				/* When it reached end of dynamic table */
#if !_FS_READONLY
					BYTE c;
					if (!streach) return FR_NO_FILE;			/* When do not streach, report EOT */
					clst = create_chain(dj->fs, dj->clust);		/* Streach cluster chain */
					if (clst == 0) return FR_DENIED;			/* No free cluster */
					if (clst == 1) return FR_INT_ERR;
					if (clst == 0xFFFFFFFF) return FR_DISK_ERR;
					/* Clean-up streached table */
					if (move_window(dj->fs, 0)) return FR_DISK_ERR;	/* Flush active window */
					mem_set(dj->fs->win, 0, SS(dj->fs));			/* Clear window buffer */
					dj->fs->winsect = clust2sect(dj->fs, clst);	/* Cluster start sector */
					for (c = 0; c < dj->fs->csize; c++) {		/* Fill the new cluster with 0 */
						dj->fs->wflag = 1;
						if (move_window(dj->fs, 0)) return FR_DISK_ERR;
						dj->fs->winsect++;
					}
					dj->fs->winsect -= c;						/* Rewind window address */
#else
					return FR_NO_FILE;			/* Report EOT */
#endif
				}
				dj->clust = clst;				/* Initialize data for new cluster */
				dj->sect = clust2sect(dj->fs, clst);
			}
		}
	}

	dj->index = i;
	dj->dir = dj->fs->win + (i % (SS(dj->fs) / 32)) * 32;

	return FR_OK;
}




/*-----------------------------------------------------------------------*/
/* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry   */
/*-----------------------------------------------------------------------*/
#if _USE_LFN
static
const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30};	/* Offset of LFN chars in the directory entry */


static
BOOL cmp_lfn (			/* TRUE:Matched, FALSE:Not matched */
	WCHAR *lfnbuf,		/* Pointer to the LFN to be compared */
	BYTE *dir			/* Pointer to the directory entry containing a part of LFN */
)
{
	int i, s;
	WCHAR wc, uc;


	i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13;	/* Get offset in the LFN buffer */
	s = 0; wc = 1;
	do {
		uc = LD_WORD(dir+LfnOfs[s]);	/* Pick an LFN character from the entry */
		if (wc) {	/* Last char has not been processed */
			wc = ff_wtoupper(uc);		/* Convert it to upper case */
			if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++]))	/* Compare it */
				return FALSE;			/* Not matched */
		} else {
			if (uc != 0xFFFF) return FALSE;	/* Check filler */
		}
	} while (++s < 13);				/* Repeat until all chars in the entry are checked */

	if ((dir[LDIR_Ord] & 0x40) && wc && lfnbuf[i])	/* Last segment matched but different length */
		return FALSE;

	return TRUE;					/* The part of LFN matched */
}



static
BOOL pick_lfn (			/* TRUE:Succeeded, FALSE:Buffer overflow */
	WCHAR *lfnbuf,		/* Pointer to the Unicode-LFN buffer */
	BYTE *dir			/* Pointer to the directory entry */
)
{
	int i, s;
	WCHAR wc, uc;


	i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13;	/* Offset in the LFN buffer */

	s = 0; wc = 1;
	do {
		uc = LD_WORD(dir+LfnOfs[s]);			/* Pick an LFN character from the entry */
		if (wc) {	/* Last char has not been processed */
			if (i >= _MAX_LFN) return FALSE;	/* Buffer overflow? */
			lfnbuf[i++] = wc = uc;				/* Store it */
		} else {
			if (uc != 0xFFFF) return FALSE;		/* Check filler */
		}
	} while (++s < 13);						/* Read all character in the entry */

	if (dir[LDIR_Ord] & 0x40) {				/* Put terminator if it is the last LFN part */
		if (i >= _MAX_LFN) return FALSE;	/* Buffer overflow? */
		lfnbuf[i] = 0;
	}

	return TRUE;
}


#if !_FS_READONLY
static
void fit_lfn (
	const WCHAR *lfnbuf,	/* Pointer to the LFN buffer */
	BYTE *dir,				/* Pointer to the directory entry */
	BYTE ord,				/* LFN order (1-20) */
	BYTE sum				/* SFN sum */
)
{
	int i, s;
	WCHAR wc;


	dir[LDIR_Chksum] = sum;			/* Set check sum */
	dir[LDIR_Attr] = AM_LFN;		/* Set attribute. LFN entry */
	dir[LDIR_Type] = 0;
	ST_WORD(dir+LDIR_FstClusLO, 0);

	i = (ord - 1) * 13;				/* Get offset in the LFN buffer */
	s = wc = 0;
	do {
		if (wc != 0xFFFF) wc = lfnbuf[i++];	/* Get an effective char */
		ST_WORD(dir+LfnOfs[s], wc);	/* Put it */
		if (!wc) wc = 0xFFFF;		/* Padding chars following last char */
	} while (++s < 13);
	if (wc == 0xFFFF || !lfnbuf[i]) ord |= 0x40;	/* Bottom LFN part is the start of LFN sequence */
	dir[LDIR_Ord] = ord;			/* Set the LFN order */
}

#endif
#endif



/*-----------------------------------------------------------------------*/
/* Create numbered name                                                  */
/*-----------------------------------------------------------------------*/
#if _USE_LFN
void gen_numname (
	BYTE *dst,			/* Pointer to genartated SFN */
	const BYTE *src,	/* Pointer to source SFN to be modified */
	const WCHAR *lfn,	/* Pointer to LFN */
	WORD num			/* Sequense number */
)
{
	char ns[8];
	int i, j;


	mem_cpy(dst, src, 11);

	if (num > 5) {	/* On many collisions, generate a hash number instead of sequencial number */
		do num = (num >> 1) + (num << 15) + (WORD)*lfn++; while (*lfn);
	}

	/* itoa */
	i = 7;
	do {
		ns[i--] = (num % 10) + '0';
		num /= 10;
	} while (num);
	ns[i] = '~';

	/* Append the number */
	for (j = 0; j < i && dst[j] != ' '; j++) {
		if (IsDBCS1(dst[j])) {
			if (j == i - 1) break;
			j++;
		}
	}
	do {
		dst[j++] = (i < 8) ? ns[i++] : ' ';
	} while (j < 8);
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91农村精品一区二区在线| 欧美一级生活片| 国产精品天美传媒| 欧美一区二区三区四区在线观看 | 久久久久久久久久久99999| 亚洲精品国产第一综合99久久 | 久久久蜜桃精品| 欧美一区二区黄| 亚洲一级二级三级在线免费观看| 在线一区二区视频| 日韩电影一区二区三区| 日韩欧美亚洲一区二区| 成人午夜私人影院| 亚洲免费av观看| 欧美二区三区的天堂| 久草精品在线观看| 中文字幕va一区二区三区| 亚洲自拍欧美精品| 国产精品久久久久久久久久免费看 | 中文字幕的久久| 欧美一区二区三区人| 久久电影国产免费久久电影 | 91精品欧美福利在线观看| 玖玖九九国产精品| 国产精品丝袜久久久久久app| 91原创在线视频| 日韩不卡一二三区| 国产精品免费久久久久| 欧美日韩免费高清一区色橹橹| 麻豆91在线播放| 亚洲三级视频在线观看| 91精品国产综合久久久久久久 | 日韩精品一卡二卡三卡四卡无卡| 欧美精品xxxxbbbb| 成人激情开心网| 免费成人美女在线观看| 国产精品免费久久久久| 欧美电影免费提供在线观看| av不卡免费电影| 久草这里只有精品视频| 亚洲综合视频网| 国产欧美久久久精品影院| 欧美日韩极品在线观看一区| 成人一级片在线观看| 人人狠狠综合久久亚洲| 成人免费在线视频| 久久久精品免费网站| 777色狠狠一区二区三区| 成人高清视频在线| 狠狠久久亚洲欧美| 三级久久三级久久久| 亚洲少妇屁股交4| 中文字幕av免费专区久久| 欧美一级片在线| 欧美日韩亚洲高清一区二区| yourporn久久国产精品| 国产精品一区二区无线| 秋霞av亚洲一区二区三| 99久久久无码国产精品| 亚洲精品国产无天堂网2021| 国产喷白浆一区二区三区| 日韩一区二区电影网| 欧洲精品在线观看| 91免费观看在线| 色综合久久综合网欧美综合网| 国产盗摄一区二区| 国产一区二区视频在线播放| 蜜桃av一区二区三区| 日韩1区2区日韩1区2区| 午夜国产不卡在线观看视频| 亚洲人成在线播放网站岛国| 国产精品久久福利| 欧美国产日产图区| 中文字幕的久久| 国产精品国产自产拍在线| 欧美激情一区二区| 一色桃子久久精品亚洲| 国产精品成人网| 综合久久久久久| 亚洲免费色视频| 亚洲午夜久久久久久久久电影院| 国产精品高清亚洲| 久久久www成人免费毛片麻豆| 99re8在线精品视频免费播放| 国产乱色国产精品免费视频| 久久国产精品99久久久久久老狼| 青青草原综合久久大伊人精品 | 国产福利视频一区二区三区| 国产乱人伦偷精品视频不卡| 高清国产午夜精品久久久久久| 粉嫩蜜臀av国产精品网站| 不卡一区在线观看| 色婷婷狠狠综合| 欧美日韩国产另类不卡| 欧美一区二区在线免费观看| 日韩三级av在线播放| 国产人久久人人人人爽| 亚洲专区一二三| 日韩福利电影在线| 国产一区视频导航| 99热精品一区二区| 欧美日本一区二区三区| 欧美tickling挠脚心丨vk| 国产亚洲精品aa午夜观看| 日韩毛片一二三区| 国产另类ts人妖一区二区| 男男视频亚洲欧美| 亚洲精品一区二区三区影院 | 久久精品人人爽人人爽| 中文字幕制服丝袜成人av| 亚洲一本大道在线| 激情综合亚洲精品| 色婷婷av一区二区三区gif| 欧美一区二区三区在线| 中文在线一区二区| 日韩和欧美一区二区三区| 国产九九视频一区二区三区| 91福利在线免费观看| 久久午夜电影网| 亚洲成人一区在线| 国产成人亚洲综合a∨猫咪| 欧美午夜影院一区| 久久久久久久久久久黄色| 亚洲小说欧美激情另类| 高清不卡一二三区| 欧美日韩高清一区二区不卡| 国产日韩精品一区二区三区| 亚洲超丰满肉感bbw| 成人国产精品免费网站| 日韩欧美国产三级| 亚洲一区二区三区四区五区中文 | 日韩av成人高清| 亚洲福利视频一区二区| 福利视频网站一区二区三区| 91精品久久久久久久91蜜桃| 亚洲精品福利视频网站| 国内一区二区在线| 日韩一区二区三区免费观看| 亚洲伦理在线免费看| 国产不卡高清在线观看视频| 日韩亚洲欧美一区二区三区| 一级日本不卡的影视| 成人黄色片在线观看| 久久亚洲捆绑美女| 美日韩黄色大片| 欧美精品日韩一本| 亚洲自拍与偷拍| 99久久伊人久久99| 日本一区二区三区免费乱视频| 极品销魂美女一区二区三区| 欧美精品一卡两卡| 亚洲成人综合在线| 欧美伊人精品成人久久综合97 | 91蜜桃网址入口| 中文字幕av一区二区三区| 国产高清不卡一区二区| 精品国产乱码久久久久久图片 | 国产精品无人区| 激情小说亚洲一区| 日韩欧美第一区| 日韩不卡一二三区| 91精品国产综合久久小美女| 亚洲国产美女搞黄色| 91视频观看视频| 亚洲欧美电影一区二区| 99视频国产精品| 中文字幕亚洲不卡| 91原创在线视频| 亚洲精品国久久99热| 欧美亚州韩日在线看免费版国语版| 国产精品二三区| 91香蕉视频黄| 伊人色综合久久天天人手人婷| 91蜜桃在线观看| 性感美女久久精品| 日韩一级成人av| 国产精品资源网| 国产精品久久久久一区二区三区 | 欧美乱熟臀69xxxxxx| 石原莉奈在线亚洲二区| 日韩精品一区二区三区三区免费| 精品伊人久久久久7777人| 亚洲天堂免费看| 亚洲精品欧美激情| 亚洲男人的天堂网| 免费看黄色91| 精品国产伦一区二区三区免费 | 性做久久久久久免费观看欧美| 欧美久久婷婷综合色| 麻豆精品一区二区| 久久久.com| 色噜噜夜夜夜综合网| 日本不卡一二三| 久久精品欧美一区二区三区不卡| 99这里只有久久精品视频| 亚洲电影在线播放| 精品日本一线二线三线不卡| 成人免费观看av| 亚洲成人777| 国产精品天美传媒沈樵|