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

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

?? ff.c

?? STM32讀取SD卡上FAT12_16_32文件系統源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:


/*-----------------------------------------------------------------------*/
/* Change Timestamp                                                      */
/*-----------------------------------------------------------------------*/

FRESULT f_utime (
	const char *path,		/* Pointer to the file/directory name */
	const FILINFO *finfo	/* Pointer to the timestamp to be set */
)
{
	FRESULT res;
	DIR dj;
	BYTE *dir;
	char fn[8+3+1];


	res = auto_mount(&path, &dj.fs, 1);
	if (res == FR_OK) {
		res = trace_path(&dj, fn, path, &dir);	/* Trace the file path */
		if (res == FR_OK) {				/* Trace completed */
			if (!dir) {
				res = FR_INVALID_NAME;	/* Root directory */
			} else {
				ST_WORD(&dir[DIR_WrtTime], finfo->ftime);
				ST_WORD(&dir[DIR_WrtDate], finfo->fdate);
				res = sync(dj.fs);
			}
		}
	}
	return res;
}




/*-----------------------------------------------------------------------*/
/* Rename File/Directory                                                 */
/*-----------------------------------------------------------------------*/

FRESULT f_rename (
	const char *path_old,	/* Pointer to the old name */
	const char *path_new	/* Pointer to the new name */
)
{
	FRESULT res;
	DIR dj;
	DWORD sect_old;
	BYTE *dir_old, *dir_new, direntry[32-11];
	char fn[8+3+1];


	res = auto_mount(&path_old, &dj.fs, 1);
	if (res != FR_OK) return res;

	res = trace_path(&dj, fn, path_old, &dir_old);	/* Check old object */
	if (res != FR_OK) return res;				/* The old object is not found */
	if (!dir_old) return FR_NO_FILE;
	sect_old = dj.fs->winsect;					/* Save the object information */
	memcpy(direntry, &dir_old[DIR_Attr], 32-11);

	res = trace_path(&dj, fn, path_new, &dir_new);	/* Check new object */
	if (res == FR_OK) return FR_EXIST;			/* The new object name is already existing */
	if (res != FR_NO_FILE) return res;			/* Is there no old name? */
	res = reserve_direntry(&dj, &dir_new); 		/* Reserve a directory entry */
	if (res != FR_OK) return res;

	memcpy(&dir_new[DIR_Attr], direntry, 32-11);	/* Create new entry */
	memcpy(&dir_new[DIR_Name], fn, 8+3);
	dir_new[DIR_NTres] = fn[11];
	dj.fs->winflag = 1;

	if (!move_window(dj.fs, sect_old)) return FR_RW_ERROR;	/* Delete old entry */
	dir_old[DIR_Name] = 0xE5;

	return sync(dj.fs);
}

#endif /* !_FS_READONLY */
#endif /* _FS_MINIMIZE == 0 */
#endif /* _FS_MINIMIZE <= 1 */
#endif /* _FS_MINIMIZE <= 2 */



#if _USE_MKFS && !_FS_READONLY
/*-----------------------------------------------------------------------*/
/* Create File System on the Drive                                       */
/*-----------------------------------------------------------------------*/
#define N_ROOTDIR	512			/* Multiple of 32 and <= 2048 */
#define N_FATS		1			/* 1 or 2 */
#define MAX_SECTOR	64000000UL	/* Maximum partition size */
#define MIN_SECTOR	2000UL		/* Minimum partition size */



FRESULT f_mkfs (
	BYTE drv,			/* Logical drive number */
	BYTE partition,		/* Partitioning rule 0:FDISK, 1:SFD */
	WORD allocsize		/* Allocation unit size [bytes] */
)
{
	BYTE fmt, m, *tbl;
	DWORD b_part, b_fat, b_dir, b_data;		/* Area offset (LBA) */
	DWORD n_part, n_rsv, n_fat, n_dir;		/* Area size */
	DWORD n_clust, n;
	FATFS *fs;
	DSTATUS stat;


	/* Check validity of the parameters */
	if (drv >= _DRIVES) return FR_INVALID_DRIVE;
	if (partition >= 2) return FR_MKFS_ABORTED;
	for (n = 512; n <= 32768U && n != allocsize; n <<= 1);
	if (n != allocsize) return FR_MKFS_ABORTED;

	/* Check mounted drive and clear work area */
	fs = FatFs[drv];
	if (!fs) return FR_NOT_ENABLED;
	fs->fs_type = 0;
	drv = LD2PD(drv);

	/* Get disk statics */
	stat = disk_initialize(drv);
	if (stat & STA_NOINIT) return FR_NOT_READY;
	if (stat & STA_PROTECT) return FR_WRITE_PROTECTED;
	if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR)
		return FR_MKFS_ABORTED;
	if (n_part > MAX_SECTOR) n_part = MAX_SECTOR;
	b_part = (!partition) ? 63 : 0;		/* Boot sector */
	n_part -= b_part;
#if S_MAX_SIZ > 512						/* Check disk sector size */
	if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK
		|| SS(fs) > S_MAX_SIZ
		|| SS(fs) > allocsize)
		return FR_MKFS_ABORTED;
#endif
	allocsize /= SS(fs);		/* Number of sectors per cluster */

	/* Pre-compute number of clusters and FAT type */
	n_clust = n_part / allocsize;
	fmt = FS_FAT12;
	if (n_clust >= 0xFF5) fmt = FS_FAT16;
	if (n_clust >= 0xFFF5) fmt = FS_FAT32;

	/* Determine offset and size of FAT structure */
	switch (fmt) {
	case FS_FAT12:
		n_fat = ((n_clust * 3 + 1) / 2 + 3 + SS(fs) - 1) / SS(fs);
		n_rsv = 1 + partition;
		n_dir = N_ROOTDIR * 32 / SS(fs);
		break;
	case FS_FAT16:
		n_fat = ((n_clust * 2) + 4 + SS(fs) - 1) / SS(fs);
		n_rsv = 1 + partition;
		n_dir = N_ROOTDIR * 32 / SS(fs);
		break;
	default:
		n_fat = ((n_clust * 4) + 8 + SS(fs) - 1) / SS(fs);
		n_rsv = 33 - partition;
		n_dir = 0;
	}
	b_fat = b_part + n_rsv;			/* FATs start sector */
	b_dir = b_fat + n_fat * N_FATS;	/* Directory start sector */
	b_data = b_dir + n_dir;			/* Data start sector */

	/* Align data start sector to erase block boundary (for flash memory media) */
	if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK) return FR_MKFS_ABORTED;
	n = (b_data + n - 1) & ~(n - 1);
	n_fat += (n - b_data) / N_FATS;
	/* b_dir and b_data are no longer used below */

	/* Determine number of cluster and final check of validity of the FAT type */
	n_clust = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize;
	if (   (fmt == FS_FAT16 && n_clust < 0xFF5)
		|| (fmt == FS_FAT32 && n_clust < 0xFFF5))
		return FR_MKFS_ABORTED;

	/* Create partition table if needed */
	if (!partition) {
		DWORD n_disk = b_part + n_part;

		tbl = &fs->win[MBR_Table];
		ST_DWORD(&tbl[0], 0x00010180);	/* Partition start in CHS */
		if (n_disk < 63UL * 255 * 1024) {	/* Partition end in CHS */
			n_disk = n_disk / 63 / 255;
			tbl[7] = (BYTE)n_disk;
			tbl[6] = (BYTE)((n_disk >> 2) | 63);
		} else {
			ST_WORD(&tbl[6], 0xFFFF);
		}
		tbl[5] = 254;
		if (fmt != FS_FAT32)			/* System ID */
			tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06;
		else
			tbl[4] = 0x0c;
		ST_DWORD(&tbl[8], 63);			/* Partition start in LBA */
		ST_DWORD(&tbl[12], n_part);		/* Partition size in LBA */
		ST_WORD(&tbl[64], 0xAA55);		/* Signature */
		if (disk_write(drv, fs->win, 0, 1) != RES_OK)
			return FR_RW_ERROR;
	}

	/* Create boot record */
	tbl = fs->win;								/* Clear buffer */
	memset(tbl, 0, SS(fs));
	ST_DWORD(&tbl[BS_jmpBoot], 0x90FEEB);		/* Boot code (jmp $, nop) */
	ST_WORD(&tbl[BPB_BytsPerSec], SS(fs));		/* Sector size */
	tbl[BPB_SecPerClus] = (BYTE)allocsize;		/* Sectors per cluster */
	ST_WORD(&tbl[BPB_RsvdSecCnt], n_rsv);		/* Reserved sectors */
	tbl[BPB_NumFATs] = N_FATS;					/* Number of FATs */
	ST_WORD(&tbl[BPB_RootEntCnt], SS(fs) / 32 * n_dir); /* Number of rootdir entries */
	if (n_part < 0x10000) {						/* Number of total sectors */
		ST_WORD(&tbl[BPB_TotSec16], n_part);
	} else {
		ST_DWORD(&tbl[BPB_TotSec32], n_part);
	}
	tbl[BPB_Media] = 0xF8;						/* Media descripter */
	ST_WORD(&tbl[BPB_SecPerTrk], 63);			/* Number of sectors per track */
	ST_WORD(&tbl[BPB_NumHeads], 255);			/* Number of heads */
	ST_DWORD(&tbl[BPB_HiddSec], b_part);		/* Hidden sectors */
	n = get_fattime();							/* Use current time as a VSN */
	if (fmt != FS_FAT32) {
		ST_DWORD(&tbl[BS_VolID], n);			/* Volume serial number */
		ST_WORD(&tbl[BPB_FATSz16], n_fat);		/* Number of secters per FAT */
		tbl[BS_DrvNum] = 0x80;					/* Drive number */
		tbl[BS_BootSig] = 0x29;					/* Extended boot signature */
		memcpy(&tbl[BS_VolLab], "NO NAME    FAT     ", 19);	/* Volume lavel, FAT signature */
	} else {
		ST_DWORD(&tbl[BS_VolID32], n);			/* Volume serial number */
		ST_DWORD(&tbl[BPB_FATSz32], n_fat);		/* Number of secters per FAT */
		ST_DWORD(&tbl[BPB_RootClus], 2);		/* Root directory cluster (2) */
		ST_WORD(&tbl[BPB_FSInfo], 1);			/* FSInfo record (bs+1) */
		ST_WORD(&tbl[BPB_BkBootSec], 6);		/* Backup boot record (bs+6) */
		tbl[BS_DrvNum32] = 0x80;				/* Drive number */
		tbl[BS_BootSig32] = 0x29;				/* Extended boot signature */
		memcpy(&tbl[BS_VolLab32], "NO NAME    FAT32   ", 19);	/* Volume lavel, FAT signature */
	}
	ST_WORD(&tbl[BS_55AA], 0xAA55);			/* Signature */
	if (disk_write(drv, tbl, b_part+0, 1) != RES_OK)
		return FR_RW_ERROR;
	if (fmt == FS_FAT32)
		disk_write(drv, tbl, b_part+6, 1);

	/* Initialize FAT area */
	for (m = 0; m < N_FATS; m++) {
		memset(tbl, 0, SS(fs));		/* 1st sector of the FAT  */
		if (fmt != FS_FAT32) {
			n = (fmt == FS_FAT12) ? 0x00FFFFF8 : 0xFFFFFFF8;
			ST_DWORD(&tbl[0], n);			/* Reserve cluster #0-1 (FAT12/16) */
		} else {
			ST_DWORD(&tbl[0], 0xFFFFFFF8);	/* Reserve cluster #0-1 (FAT32) */
			ST_DWORD(&tbl[4], 0xFFFFFFFF);
			ST_DWORD(&tbl[8], 0x0FFFFFFF);	/* Reserve cluster #2 for root dir */
		}
		if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)
			return FR_RW_ERROR;
		memset(tbl, 0, SS(fs));		/* Following FAT entries are filled by zero */
		for (n = 1; n < n_fat; n++) {
			if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)
				return FR_RW_ERROR;
		}
	}

	/* Initialize Root directory */
	m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir);
	do {
		if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)
			return FR_RW_ERROR;
	} while (--m);

	/* Create FSInfo record if needed */
	if (fmt == FS_FAT32) {
		ST_WORD(&tbl[BS_55AA], 0xAA55);
		ST_DWORD(&tbl[FSI_LeadSig], 0x41615252);
		ST_DWORD(&tbl[FSI_StrucSig], 0x61417272);
		ST_DWORD(&tbl[FSI_Free_Count], n_clust - 1);
		ST_DWORD(&tbl[FSI_Nxt_Free], 0xFFFFFFFF);
		disk_write(drv, tbl, b_part+1, 1);
		disk_write(drv, tbl, b_part+7, 1);
	}

	return (disk_ioctl(drv, CTRL_SYNC, NULL) == RES_OK) ? FR_OK : FR_RW_ERROR;
}

#endif /* _USE_MKFS && !_FS_READONLY */




#if _USE_STRFUNC >= 1
/*-----------------------------------------------------------------------*/
/* Get a string from the file                                            */
/*-----------------------------------------------------------------------*/
char* fgets (
	char* buff,	/* Pointer to the string buffer to read */
	int len,	/* Size of string buffer */
	FIL* fil	/* Pointer to the file object */
)
{
	int i = 0;
	char *p = buff;
	UINT rc;


	while (i < len - 1) {			/* Read bytes until buffer gets filled */
		f_read(fil, p, 1, &rc);
		if (rc != 1) break;			/* Break when no data to read */
#if _USE_STRFUNC >= 2
		if (*p == '\r') continue;	/* Strip '\r' */
#endif
		i++;
		if (*p++ == '\n') break;	/* Break when reached end of line */
	}
	*p = 0;
	return i ? buff : 0;			/* When no data read (eof or error), return with error. */
}



#if !_FS_READONLY
#include <stdarg.h>
/*-----------------------------------------------------------------------*/
/* Put a character to the file                                           */
/*-----------------------------------------------------------------------*/
int fputc (
	int chr,	/* A character to be output */
	FIL* fil	/* Ponter to the file object */
)
{
	UINT bw;
	char c;


#if _USE_STRFUNC >= 2
	if (chr == '\n') fputc ('\r', fil);	/* LF -> CRLF conversion */
#endif
	if (!fil) {	/* Special value may be used to switch the destination to any other device */
	/*	put_console(chr);	*/
		return chr;
	}
	c = (char)chr;
	f_write(fil, &c, 1, &bw);	/* Write a byte to the file */
	return bw ? chr : EOF;		/* Return the resulut */
}




/*-----------------------------------------------------------------------*/
/* Put a string to the file                                              */
/*-----------------------------------------------------------------------*/
int fputs (
	const char* str,	/* Pointer to the string to be output */
	FIL* fil			/* Pointer to the file object */
)
{
	int n;


	for (n = 0; *str; str++, n++) {
		if (fputc(*str, fil) == EOF) return EOF;
	}
	return n;
}




/*-----------------------------------------------------------------------*/
/* Put a formatted string to the file                                    */
/*-----------------------------------------------------------------------*/
int fprintf (
	FIL* fil,			/* Pointer to the file object */
	const char* str,	/* Pointer to the format string */
	...					/* Optional arguments... */
)
{
	va_list arp;
	UCHAR c, f, r;
	ULONG val;
	char s[16];
	int i, w, res, cc;


	va_start(arp, str);

	for (cc = res = 0; cc != EOF; res += cc) {
		c = *str++;
		if (c == 0) break;			/* End of string */
		if (c != '%') {				/* Non escape cahracter */
			cc = fputc(c, fil);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久日韩精品一区二区五区| 国产精品午夜免费| 国产成人精品在线看| 亚洲一区二区欧美日韩| 国产日韩在线不卡| 欧美一区二区三区在线视频| av电影一区二区| 狠狠色丁香婷婷综合久久片| 亚洲韩国一区二区三区| 国产欧美日韩中文久久| 日韩欧美国产三级电影视频| 色国产精品一区在线观看| 国产成人av影院| 欧美aⅴ一区二区三区视频| 亚洲欧美国产高清| 国产精品美女视频| 久久日一线二线三线suv| 91精品蜜臀在线一区尤物| 色综合久久久久网| 成人高清在线视频| 国产999精品久久久久久| 久久电影网电视剧免费观看| 三级在线观看一区二区| 夜夜嗨av一区二区三区| 亚洲欧美视频在线观看视频| 国产精品乱人伦一区二区| 久久婷婷国产综合国色天香| 日韩欧美一级在线播放| 欧美一区二区三区四区久久| 欧美日韩激情一区二区三区| 日本韩国欧美在线| 色一情一乱一乱一91av| 色天天综合久久久久综合片| www.在线成人| aa级大片欧美| 成人国产一区二区三区精品| 粉嫩13p一区二区三区| 成人在线视频首页| 波波电影院一区二区三区| 成人免费观看av| www.av亚洲| 色综合色狠狠综合色| 一本大道久久a久久综合| 99久久婷婷国产综合精品| av电影在线观看完整版一区二区 | 激情综合网av| 国内精品第一页| 国产精品一卡二| 国产a精品视频| av激情综合网| 欧美日韩和欧美的一区二区| 337p亚洲精品色噜噜| 欧美电影一区二区| 亚洲精品在线免费播放| 国产午夜精品理论片a级大结局| 国产亚洲精品aa午夜观看| 中文字幕乱码亚洲精品一区| 亚洲色图欧美激情| 亚洲国产日韩一级| 毛片基地黄久久久久久天堂| 国产久卡久卡久卡久卡视频精品| 国产成人av资源| 日本精品裸体写真集在线观看 | 日韩欧美在线观看一区二区三区| 日韩欧美色电影| 久久久99精品久久| 一区二区三区丝袜| 日韩二区三区四区| 成人午夜精品一区二区三区| 色一情一乱一乱一91av| 日韩欧美一级精品久久| 国产精品人成在线观看免费| 亚洲电影在线播放| 国产一区二区三区香蕉| 一本大道久久a久久精品综合| 欧美精品日韩一本| 欧美精彩视频一区二区三区| 亚洲最新视频在线观看| 免费观看一级欧美片| 99久久国产综合精品女不卡 | 亚洲四区在线观看| 喷水一区二区三区| av激情综合网| 欧美r级在线观看| 亚洲女性喷水在线观看一区| 青青草国产成人av片免费| 成人动漫一区二区在线| 欧美日韩dvd在线观看| 国产午夜精品久久久久久久| 天堂精品中文字幕在线| 波多野结衣精品在线| 欧美一级xxx| 亚洲激情自拍视频| 国产高清成人在线| 91精品国产一区二区三区蜜臀| 国产精品夫妻自拍| 老司机免费视频一区二区三区| 色域天天综合网| 国产精品乱人伦中文| 精品一区二区成人精品| 欧美中文字幕一区| 综合在线观看色| 国产乱人伦偷精品视频不卡 | 亚洲色欲色欲www在线观看| 精品亚洲国内自在自线福利| 欧美日韩免费高清一区色橹橹| 国产精品美女久久久久aⅴ国产馆| 另类小说欧美激情| 4438x成人网最大色成网站| 亚洲少妇最新在线视频| 丁香六月综合激情| 久久亚洲免费视频| 久久国产精品区| 日韩一区二区电影在线| 性做久久久久久免费观看| 色综合婷婷久久| 国产精品另类一区| 国产成人无遮挡在线视频| 欧美变态口味重另类| 欧美aaaaa成人免费观看视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 中文久久乱码一区二区| 国产白丝精品91爽爽久久| 久久精品人人做人人综合| 国产精品一区二区x88av| 精品成人一区二区| 精品午夜一区二区三区在线观看 | 亚洲色欲色欲www| 成人av免费在线| 国产女主播视频一区二区| 国产福利一区二区三区| 久久久久成人黄色影片| 欧美男生操女生| 亚州成人在线电影| 欧美日产在线观看| 日韩精品免费视频人成| 777久久久精品| 麻豆国产精品777777在线| 欧美sm极限捆绑bd| 国产精品18久久久久久久久| 国产日产欧美一区二区三区| 成人综合婷婷国产精品久久| 国产精品麻豆网站| 99re成人精品视频| 亚洲精品视频观看| 欧美日韩aaaaaa| 久久精品99国产精品| 久久久久久久久免费| youjizz国产精品| 亚洲国产裸拍裸体视频在线观看乱了| 欧美日本精品一区二区三区| 日本欧美一区二区| 欧美精品一区二区不卡| 福利电影一区二区三区| ㊣最新国产の精品bt伙计久久| 色哟哟国产精品免费观看| 日日摸夜夜添夜夜添国产精品 | 欧美一级一级性生活免费录像| 蜜桃在线一区二区三区| 国产清纯在线一区二区www| 91香蕉视频mp4| 天堂蜜桃91精品| 久久精品一区二区三区不卡 | 成人午夜激情片| 一区二区在线观看免费视频播放| 欧美乱妇15p| 国产成人av一区二区三区在线 | 精品一区二区三区在线播放视频 | 国产一区二区h| 亚洲色图20p| 日韩欧美精品三级| 99视频有精品| 日韩成人午夜精品| 国产欧美日韩精品一区| 欧美色倩网站大全免费| 国产在线观看免费一区| 艳妇臀荡乳欲伦亚洲一区| 精品少妇一区二区三区日产乱码 | av电影天堂一区二区在线观看| 亚洲成人中文在线| 国产日韩精品一区二区三区| 色先锋资源久久综合| 激情久久久久久久久久久久久久久久| 国产精品国产三级国产有无不卡| 制服丝袜激情欧洲亚洲| caoporn国产精品| 精品综合免费视频观看| 一区二区三区不卡视频| 久久精品日韩一区二区三区| 欧美日韩一区二区三区在线看 | 亚洲国产成人tv| 国产欧美日韩视频在线观看| 欧美日韩中文字幕一区| 成人性生交大合| 久久国产尿小便嘘嘘尿| 亚洲综合偷拍欧美一区色| 国产精品天美传媒沈樵| 精品国产免费一区二区三区香蕉| 欧美影视一区在线| 成人app在线|