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

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

?? fat.c

?? FAT16, FAT32 Support with long file names
?? C
字號:

//*****************************************************************
//
// File Name	: 'fat.c'
// Title			: FAT file system implementation
// Author		: Pascal Stang
// Date			: 12/10/2000
// Revised		: 12/12/2000
// Version		: 0.1
// Target MCU	: ATmega103
// Editor Tabs	: 4
//
//*****************************************************************


#include <io.h>
#include <string.h>

#include "ata_if.h"
#include "fat.h"
#include "mem.h"
#include "progmem.h"
#include "uart.h"

unsigned char *SectorBuffer  = (unsigned char *) SECTOR_BUFFER;
unsigned char *long_name_buffer = (unsigned char *) LONGNAME_BUF;
unsigned char *dir_name_buffer = (unsigned char *) DIRNAME_BUF;

unsigned long FirstDataSector;
unsigned int  Bytes_Per_Sector;
unsigned int  Sectors_Per_Cluster;
unsigned long FirstFATSector;
unsigned long FirstDirSector;
unsigned long FileSize;
unsigned long FatInCache = 0;

/*************************************************************************/
/*************************************************************************/


unsigned long clust2sect(unsigned long clust)
{
	return ((clust-2) * Sectors_Per_Cluster) + FirstDataSector;
}

unsigned char init_fat( unsigned char device)
{
	struct partrecord *pr;
	struct bpb710 *bpb;
    unsigned long first_sec;


	// read partition table
    ATA_Read_Sectors_LBA( 	DRIVE0,				// TODO.... error checking
    						0,
							1,
                            SectorBuffer);
	
	pr = (struct partrecord *) ((struct partsector *) SectorBuffer)->psPart;

/*	
	switch (pr->prPartType)
	{

//		case DOS16:
//				lcd_print("DOS 16");
//				break;
//		case DOS16_32:
//				lcd_print("DOS 16/32");
//				break;
//		case FAT16_LBA:
//				lcd_print("FAT16 LBA");
//				break;

		case PART_TYPE_FAT32LBA:
				PRINT("FAT32 LBA");
				break;

		case PART_TYPE_FAT32:
                PRINT("FAT32");
//                return 1;	
				break;
		
		default:
				PRINT("Part.!");
				return 1;
				break;
	}

	EOL();
*/
	first_sec = pr->prStartLBA;
/*
    PRINT("First sector: ");
    UART_Printfu32(pr->prStartLBA);
	EOL();
    PRINT("Size: ");
    UART_Printfu32(pr->prSize);
	EOL();
*/  

	// Read the Partition BootSector

    ATA_Read_Sectors_LBA( 	DRIVE0,
    						first_sec,
							1,
                            SectorBuffer);

	bpb = (struct bpb710 *) ((struct bootsector710 *) SectorBuffer)->bsBPB;

/*
	PRINT("bytes/Sec. : ");
	UART_Printfu16(bpb->bpbBytesPerSec);
	EOL();
	
	PRINT("sec/clu : ");
	UART_Printfu08(bpb->bpbSecPerClust);
	EOL();

	PRINT("reserved : ");
	UART_Printfu16(bpb->bpbResSectors);
	EOL();
	
	PRINT("BigFatSects : ");
	UART_Printfu32(bpb->bpbBigFATsecs);
	EOL();

	PRINT("# Fats : ");
	UART_Printfu08(bpb->bpbFATs);
	EOL();

*/
	// setup some constants
	FirstDataSector 	= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
	FirstDataSector    += first_sec;
	Sectors_Per_Cluster = bpb->bpbSecPerClust;
	Bytes_Per_Sector 	= bpb->bpbBytesPerSec;

	FirstFATSector = bpb->bpbResSectors + first_sec;
	FirstDirSector = bpb->bpbRootClust;

	return 0;	
}

//////////////////////////////////////////////////////////////


unsigned int baseentry = 0;
unsigned int entrycount = 0;

unsigned long get_dir_entry(unsigned int entry, unsigned int count)
{
    unsigned long sector;
	struct direntry *de = 0;	// avoid compiler warning by initializing
	struct winentry *we;
	unsigned int hasBuffer;
	unsigned int b;
    int i,index;
    char *p;
	

	if (count == 0)
	{
		entrycount = 0;
		*dir_name_buffer = 0;
	}
	
	// read dir data
	
	sector = clust2sect(FirstDirSector);

	hasBuffer = 0;

	index = 16;	// crank it up
	do 
	{
		if (index == 16)	// time for next sector ?
		{
    		ATA_Read_Sectors_LBA( 	DRIVE0,
    								sector++,
									1,
                    	        	SectorBuffer);
			de = (struct direntry *) SectorBuffer;
			index = 0;
		}	
	
		if (*de->deName != 0xE5)	// if not a deleted entry
		{
			// long name entry
			if (de->deAttributes == ATTR_LONG_FILENAME)
			{
				we = (struct winentry *) de;
				b = 13 *( (we->weCnt-1) & 0x0f);				// index into string
				p = &long_name_buffer[b];
				for (i=0;i<5;i++)	*p++ = we->wePart1[i*2];	// copy first part			
				for (i=0;i<6;i++)	*p++ = we->wePart2[i*2];	// second part
				for (i=0;i<2;i++)	*p++ = we->wePart3[i*2];	// and third part
				if (we->weCnt & 0x40) *p = 0;					// in case dirnamelength is multiple of 13
				if ((we->weCnt & 0x0f) == 1) hasBuffer = 1;		// mark that we have a long entry
			}
			else // short name entry
			{
				if (hasBuffer)		// a long entry name has been collected
				{
					if (de->deAttributes == ATTR_DIRECTORY)	// is it a directory ?
					{
						unsigned long save = FirstDirSector;
						unsigned int save2 = baseentry;
						unsigned long rval;
						
						strcpy(dir_name_buffer,long_name_buffer);
						strcat(dir_name_buffer,"/");
						
//						UART_Puts(long_name_buffer); UART_SendByte('/'); //EOL();

						// call recursively
						FirstDirSector = ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
						rval = get_dir_entry(entry,1);
						FirstDirSector = save;
						baseentry = save2;
						if (rval)
							return rval;
						else	
						{
			    		  	ATA_Read_Sectors_LBA( 	DRIVE0,			// reload original sector
    												sector-1,
													1,
                    		    	    			SectorBuffer);
                    		
							entrycount--;			// decrement entry counter		
							*dir_name_buffer = 0;
                    	}
					}
					else // normal file entry
						if (entrycount == entry)		
							break;
					hasBuffer = 0;	// clear buffer	
					entrycount++;			// increment entry counter		
				}
				// else ignore short_name_only entries
			}
		}
		de++;
		index++;
	}	while (*de->deName || index == 16);	// 0 in de->deName[0] if no more entries

	if (hasBuffer == 0)		// end of entries
		return 0;
	
	FileSize = de->deFileSize;
	return (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
}


//
// return the size of the last directory entry
//
unsigned long get_filesize(void)
{
	return FileSize;
}


//
// return the long name of the last directory entry
//
char *get_filename(void)
{	
	return long_name_buffer;
}

//
// return the directory of the last directory entry
//
char *get_dirname(void)
{	
	return dir_name_buffer;
}


//
// load a clusterfull of data
//
void load_sectors(unsigned long cluster, unsigned char *buffer)
{
	// read cluster
	while ( ATA_Read_Sectors_LBA( 	DRIVE0,
   							clust2sect(cluster),
							Sectors_Per_Cluster,
           	                buffer) != 0);
}

//
// find next cluster in the FAT chain
//
unsigned long next_cluster(unsigned long cluster)
{
	unsigned long FatOffset = cluster << 2;	
	unsigned long sector = FirstFATSector + (FatOffset / Bytes_Per_Sector);
	unsigned int offset = FatOffset % Bytes_Per_Sector;

	if (sector != FatInCache)
	{
		// read sector
	    while (ATA_Read_Sectors_LBA(	DRIVE0,
	   									sector,
										1,
	           	                		(unsigned char*)FATCACHE) != 0);
		FatInCache = sector;
    }
           	                
	FatOffset =  (*((unsigned long*) &((char*)FATCACHE)[offset])) & FAT32_MASK;

	if (FatOffset == (CLUST_EOFE & FAT32_MASK))
		FatOffset = 0;

/*	UART_SendByte('>');
	UART_Printfu32(FatOffset);
	EOL();
*/	
	return FatOffset;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产日本欧洲亚洲| 3d动漫精品啪啪1区2区免费| 欧美精品久久一区| 国产女人aaa级久久久级 | 欧美色成人综合| 久久亚洲综合av| 五月激情丁香一区二区三区| 成人av网在线| 精品国产伦一区二区三区观看体验| 亚洲精品一卡二卡| 国产.精品.日韩.另类.中文.在线.播放 | 成人app网站| 日韩精品一区在线观看| 亚洲综合色在线| 不卡视频免费播放| 精品久久国产97色综合| 五月综合激情网| 91黄色免费网站| 中文字幕一区二区三区不卡| 久久成人18免费观看| 欧美日韩黄视频| 亚洲人午夜精品天堂一二香蕉| 国产一区二区三区精品欧美日韩一区二区三区 | 日韩免费电影一区| 亚洲v中文字幕| 在线免费观看视频一区| 中文字幕色av一区二区三区| 国产成人av电影在线观看| 精品国产91乱码一区二区三区 | 日韩高清欧美激情| 欧美亚日韩国产aⅴ精品中极品| 中文字幕精品—区二区四季| 国模少妇一区二区三区| 欧美一区二区精品久久911| 亚洲成人免费影院| 91国产视频在线观看| 中文字幕日本不卡| 成人免费视频播放| 欧美激情艳妇裸体舞| 国模少妇一区二区三区| 精品成人免费观看| 精品中文字幕一区二区| 欧美www视频| 麻豆成人在线观看| 欧美r级在线观看| 久久99热这里只有精品| 欧美变态tickling挠脚心| 麻豆专区一区二区三区四区五区| 欧美二区乱c少妇| 日韩va亚洲va欧美va久久| 欧美精品 日韩| 免费在线观看一区| 日韩视频不卡中文| 久久66热偷产精品| 久久久久久99精品| 国产成人精品亚洲午夜麻豆| 中文字幕精品三区| 91美女在线看| 亚洲成人高清在线| 欧美一区二区精美| 国模一区二区三区白浆| 国产三级精品三级| av男人天堂一区| 一区2区3区在线看| 欧美卡1卡2卡| 精品夜夜嗨av一区二区三区| 久久伊人蜜桃av一区二区| 成人开心网精品视频| 亚洲品质自拍视频| 欧美日韩成人在线一区| 美日韩黄色大片| 国产午夜亚洲精品理论片色戒| 国产成人亚洲综合a∨婷婷| 国产精品超碰97尤物18| 在线免费精品视频| 日本亚洲三级在线| 久久久久久久综合狠狠综合| 99久久99久久精品免费看蜜桃| 一区二区三区在线观看动漫| 777精品伊人久久久久大香线蕉| 久久精品国产99国产| 国产精品欧美一级免费| 在线亚洲人成电影网站色www| 午夜精品福利久久久| www日韩大片| 97se亚洲国产综合自在线观| 无吗不卡中文字幕| 国产欧美日韩激情| 精品视频免费在线| 国产一区亚洲一区| 一区二区三区中文字幕在线观看| 欧美一区二区在线视频| 成人性视频免费网站| 午夜av一区二区三区| 国产欧美综合色| 欧美日韩精品一区二区天天拍小说 | 一区二区三区四区在线| 日韩一级大片在线| 99免费精品在线| 日本中文字幕一区二区有限公司| 国产欧美精品区一区二区三区| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩av一级片| 中文字幕免费不卡在线| 欧美电影在线免费观看| 成人性色生活片免费看爆迷你毛片| 亚洲一区二区高清| 久久久久久久综合色一本| 欧洲一区二区三区在线| 国产精品影视在线观看| 亚洲高清免费一级二级三级| 亚洲国产成人午夜在线一区| 69堂成人精品免费视频| 成人18精品视频| 久久精品国产亚洲高清剧情介绍 | 国产亚洲欧美日韩日本| 欧美日韩精品高清| 成人国产在线观看| 久久国产免费看| 亚洲一线二线三线视频| 亚洲国产精品ⅴa在线观看| 91精品国产色综合久久ai换脸| 99久久精品一区| 国产精品一二三四| 免费美女久久99| 亚洲小少妇裸体bbw| 国产精品麻豆视频| 欧美成人a在线| 欧美精品第1页| 91蜜桃在线免费视频| 大白屁股一区二区视频| 免费成人av在线播放| 亚洲电影在线播放| 亚洲男同1069视频| 中文字幕一区二区三区在线播放| 精品美女一区二区| 3751色影院一区二区三区| 日本高清不卡视频| av亚洲精华国产精华| 成人黄色在线看| 国产剧情一区在线| 激情图片小说一区| 奇米亚洲午夜久久精品| 天天色综合成人网| 亚洲五码中文字幕| 亚洲综合免费观看高清在线观看| 国产精品另类一区| 国产免费久久精品| 国产喂奶挤奶一区二区三区| 欧美草草影院在线视频| 欧美一级二级三级乱码| 51精品国自产在线| 欧美一区二区三区在线电影| 欧美日韩免费一区二区三区| 色偷偷一区二区三区| 99久久99久久久精品齐齐| jlzzjlzz欧美大全| a美女胸又www黄视频久久| 国产suv精品一区二区883| 国产精品一区二区免费不卡| 国产一区欧美二区| 国产高清久久久| 国产成a人亚洲精| 成人精品一区二区三区中文字幕| 懂色av噜噜一区二区三区av| 成人小视频在线| 懂色av一区二区在线播放| 99久久精品99国产精品| 91美女片黄在线观看91美女| 91黄色免费观看| 91精品欧美一区二区三区综合在 | 欧美一区二区大片| 日韩一级二级三级| 久久亚洲春色中文字幕久久久| 亚洲精品一区二区三区香蕉| 久久久久亚洲蜜桃| 国产精品人人做人人爽人人添| 中文字幕亚洲成人| 亚洲网友自拍偷拍| 日产精品久久久久久久性色| 精品一区二区三区在线观看国产 | 久久99蜜桃精品| 国产精品白丝jk白祙喷水网站| 风流少妇一区二区| 色综合天天天天做夜夜夜夜做| 欧洲精品一区二区| 欧美一区二区三区视频| 精品动漫一区二区三区在线观看| 国产欧美视频一区二区三区| 日韩理论片中文av| 视频一区国产视频| 激情综合色播激情啊| bt7086福利一区国产| 欧美日韩激情一区| 久久精品视频在线免费观看| 日韩一区在线播放| 日韩精品1区2区3区| 国产精品996| 在线看日韩精品电影| 日韩欧美一区二区免费|