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

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

?? f34x_msd_file_system.c

?? 有關單片機的學習文檔
?? C
?? 第 1 頁 / 共 3 頁
字號:
//-----------------------------------------------------------------------------
// F34x_MSD_File_System.c
//-----------------------------------------------------------------------------
// Copyright 2007 Silicon Laboratories, Inc.
// http://www.silabs.com
//
// Program Description:
//
// File contains the basic functions for file system commands.
//
//
//
// How To Test:    See Readme.txt
//
//
// FID:            34X000035
// Target:         C8051F34x
// Tool chain:     Keil
// Command Line:   See Readme.txt
// Project Name:   F34x_USB_MSD
//
// Release 1.2
//    -All changes by BD and PD
//    -5 OCT 2007
//    -Modified code in fwrite() and fat_chain() to fix cluster-spanning bug.
//    -Modified code in file_name_match() to fix bug with multiple files that
//       were recorded with the same name.
//    -Modified fat_chain_alloc() so that search for a free entry in the FAT
//       table will end when the search reaches the index of
//       MBR.index_of_last_cluster
//
//
// Release 1.1
//    -All changes by PKC
//    -09 JUN 2006
//    -No changes; incremented revision number to match project revision
//
// Release 1.0
//    -Initial Release
//

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include "F34x_MSD_Definitions.h"
#include "F34x_MSD_File_System.h"
#include "F34x_MSD_Sect_Serv.h"
#include "F34x_MSD_Util.h"
#include <string.h>
#include <stdio.h>
#include <ctype.h>

extern bootrecord_small xdata MBR;
void Print_File(FILE *file);

//-----------------------------------------------------------------------------
// file_name_match
//-----------------------------------------------------------------------------
//
// Return Value : 1 if they match
// Parameters   : filename - pointer to file name
//     			  direntryname - pointer to enterd directory name
//
// Compares the file name and directory name
//-----------------------------------------------------------------------------

static BYTE file_name_match(char* filename,char* direntryname)
{
  xdata BYTE i,j = filename[0];
  for(i=0;i<8;i++) {
    if(direntryname[i] == ' ' && (filename[i] == '\0' || filename[i] == '.'))
	{
	  if(!(j == '.' && filename[i] == '.'))
	      break;
	}
    if(tolower(direntryname[i])!=tolower(filename[i]))
      return 0;
  }
  j = i+1;
  for(i = 8; i < 11; i++) {
    if( filename[j] == '\0' && direntryname[i] != ' ')
      return 0;
    if( direntryname[i] == ' ' && (filename[j] == '\0' || filename[j] == '.'
        || filename[j-1] == '\0'))
      break;
    if(tolower(direntryname[i]) != tolower(filename[j]))
      return 0;
    j++;
  }
  return 1;
}


//-------------------------------------------------------------------------------
// Functions only for F340 device
//-------------------------------------------------------------------------------


#ifdef __F340_VER__

xdata unsigned char Path_Name[200];
xdata unsigned long Current_Dir_Block;
//xdata char current_dir_name[40];
static find_info xdata findinfo; // Shared find_info for fopen() and fdelete()
static unsigned fat_chain_alloc(unsigned from,unsigned nr) ;
static unsigned long fat_chain(unsigned long from,unsigned nr) ;
static void fat_chain_free(unsigned from);

//-----------------------------------------------------------------------------
// write_current_dir
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// This function printout current directory name
//-----------------------------------------------------------------------------
void write_current_dir()
{
	printf("%s",Path_Name);
}


//-----------------------------------------------------------------------------
// GetClusterOfParentDirectory
//-----------------------------------------------------------------------------
//
// Return Value : cluster number
// Parameters   : None
//
// Function returns cluster number which begins current directory
//-----------------------------------------------------------------------------
static unsigned GetClusterOfParentDirectory()
{
	if(Current_Dir_Block == Sect_Root_Dir())  return 0;
	return (Current_Dir_Block - Sect_File_Data()) / MBR.sectors_per_cluster;
}

//-----------------------------------------------------------------------------
// Get_Cluster_From_Sector
//-----------------------------------------------------------------------------
//
// Return Value : cluster number
// Parameters   : sector - sector which belongs to returned cluster
//
// Function returns cluster number which contains sector
//-----------------------------------------------------------------------------
static unsigned Get_Cluster_From_Sector(unsigned long sector)
{
	if(sector < (Sect_File_Data() + 2*MBR.sectors_per_cluster)) return 0;
	return ((sector - Sect_File_Data()) / MBR.sectors_per_cluster);
}

//-----------------------------------------------------------------------------
// Get_First_Sector
//-----------------------------------------------------------------------------
//
// Return Value : sector address
// Parameters   : cluster - cluster number
//
// Function returns first sector which belongs to the cluster
//-----------------------------------------------------------------------------
static unsigned long Get_First_Sector(unsigned cluster)
{
	if(cluster >= 2) return Sect_File_Data() + cluster*MBR.sectors_per_cluster;
	else return Sect_Root_Dir();
}

//-----------------------------------------------------------------------------
// Get_First_Block_Of_Next_Cluster
//-----------------------------------------------------------------------------
//
// Return Value : first block of next cluster in chain or 0xFFFFFFFF if cluster
//                is last in chain
//
// Parameters   : cluster - searching cluster
//
// Function returns number of first sector in next cluster in cluster chain
//-----------------------------------------------------------------------------
static unsigned long Get_First_Block_Of_Next_Cluster(unsigned cluster)
{
	xdata unsigned long ret = fat_chain(cluster,MBR.sectors_per_cluster);
	if(ret != 0xFFFFFFFF)
		return ret + Sect_File_Data();
	return ret;
}

//-----------------------------------------------------------------------------
// Get_Next_Cluster
//-----------------------------------------------------------------------------
//
// Return Value : cluster number
// Parameters   : next cluster in chain
//
// Function returns number of next cluster in chain
//-----------------------------------------------------------------------------
static unsigned Get_Next_Cluster(unsigned cluster)
{
	unsigned* xdata fat_table=Scratch;

    Sect_Read(Sect_Fat1() + cluster/(Sect_Block_Size()/2));

    return ntohs(fat_table[cluster%(Sect_Block_Size()/2)]);
}

//-----------------------------------------------------------------------------
// Get_File_Name
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : file_name - name of file [out] (must be allocated outside
//                            this function)
//				      direntry_name - name used in direntry [in]
//
// Function gets file name from direntry
//-----------------------------------------------------------------------------
static void Get_File_Name(char* direntry_name,char* file_name)
{
	unsigned i,j = 0,k = 0;
	for(i=0;i<11;i++)
	{
		if(direntry_name[i] == ' ')
		{
			j = 1;
			continue;
		}
		if(j)
		{
			file_name[k++] = '.';
			j = 0;
		}
		file_name[k++] = tolower(direntry_name[i]);
	}
	file_name[k] = 0;
}

//-----------------------------------------------------------------------------
// Get_First_Block_Directory_Cluster
//-----------------------------------------------------------------------------
//
// Return Value : first sector of cluster which belongs to current directory
//                fat chain
// Parameters   : sector - sector to check
//
// Function returns first sector of cluster which contains sector if this
// cluster belongs to FAT chain of current directory
//-----------------------------------------------------------------------------
static unsigned long Get_First_Block_Directory_Cluster(unsigned long sector)
{
	xdata unsigned cluster = Get_Cluster_From_Sector(sector);
	xdata unsigned next_dir_cluster = GetClusterOfParentDirectory();
	while(next_dir_cluster != cluster)
	{
		next_dir_cluster = Get_Next_Cluster(next_dir_cluster);
		if(next_dir_cluster >= 0xfff8) return next_dir_cluster;
	}
	return Get_First_Sector(cluster);
}


//-----------------------------------------------------------------------------
// Clear_Cluster
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : cluster - cluster number
//
// Function is used to clear all sectors of cluster
//-----------------------------------------------------------------------------
static void Clear_Cluster(unsigned cluster)
{
	xdata unsigned long sector = Get_First_Sector(cluster);
	xdata unsigned i;
	memset(Scratch,0,512);
	for(i=0;i<MBR.sectors_per_cluster;i++)
	{
		Sect_Write(sector+i);
	}

}

//-----------------------------------------------------------------------------
// FillDirEntry
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : direntry - dir entry
//				  dir_name - file/directory name
//
// Function fills dir entry with file name
//-----------------------------------------------------------------------------
static void FillDirEntry(dir_entry* direntry,char* dir_name)
{
  xdata BYTE i;
  for( i = 0; i < 10; i++)
    direntry->sfn.reserved[i] = 0;

  direntry->sfn.time.i = findinfo.direntry->sfn.date.i = 0;
  direntry->sfn.filesize = 0;

  // Fill in the filename
  for( i = 0; i < 11; i++ )
    direntry->sfn.name[i] = ' ';

  for( i = 0; i < 11; i++ ) {
    if(!dir_name[i])
	     break;
    direntry->sfn.name[i] = toupper(dir_name[i]);
  }
}

//-----------------------------------------------------------------------------
// FileSys_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : None
//
// Function initializes some data used to navigate over directories
//-----------------------------------------------------------------------------
void FileSys_Init()
{
	Current_Dir_Block = Sect_Root_Dir();
	strcpy(Path_Name,"\\");
}

//-----------------------------------------------------------------------------
// chngdir
//-----------------------------------------------------------------------------
//
// Return Value : 0 - if such directory not exists in current directory 1
//                    otherwise
// Parameters   : dirname - directory name to create
//
// Function tries to find and opens directory in current directory
//-----------------------------------------------------------------------------
BYTE chngdir(char* dirname)
{
  findfirst(&findinfo, 0);
  while(!file_name_match(dirname,findinfo.direntry->sfn.name)) {
    if(!findnext(&findinfo)) {
      return 0;
    }
  }
  if(findinfo.direntry->sfn.attrib & ATTRIB_SUBDIR)
  {
  	if(findinfo.direntry->sfn.starting_cluster == 0x00)
		Current_Dir_Block = Sect_Root_Dir();
	else
	  	Current_Dir_Block = Sect_File_Data() +
			(htons(findinfo.direntry->sfn.starting_cluster) * MBR.sectors_per_cluster);
	if(!strcmp(dirname,"."))	return 1;
	if(!strcmp(dirname,".."))
	{
		xdata unsigned char* next,*pos = strstr(Path_Name,"\\");

		while((next = strstr(pos,"\\")) != (NULL))
			pos = next+1;

		if(pos!=(Path_Name+1))
		pos--;

			*pos = '\0';
	}
	else
	{
		xdata unsigned len = strlen(Path_Name);
		if(Path_Name[len-1] != '\\')
		{
			strcpy(&Path_Name[len],"\\");
			len++;
		}
		strcpy(&Path_Name[len],dirname);
	}
	return 1;
  }
  return 0;
}

//-----------------------------------------------------------------------------
// mkdir
//-----------------------------------------------------------------------------
//
// Return Value : 0 if function succeeds other value if error occurs
// Parameters   : dir_name - directory name
//
// Function creates directory
//-----------------------------------------------------------------------------
BYTE mkdir(char* dir_name)
{

   xdata unsigned long dir_sectors;
   xdata dir_entry* entry;
   xdata unsigned start_cluster;
   unsigned max_len = strlen(dir_name);


  if((dir_name == NULL) || (max_len == 0) || (max_len > 8))
  {
	return DIRNAME_LENGTH_ERROR;
  }
  start_cluster = fat_chain_alloc(0,1);
  // try to find directory with such name
  findfirst(&findinfo, 0);
  while(findnext(&findinfo)) {
    if(file_name_match(dir_name,findinfo.direntry->sfn.name)) {
      return DIRECTORY_EXISTS;
    }
  }
  if(!findfirst(&findinfo,1)) return NO_PLACE_FOR_DIRECTORY;;

   // Fill in the direntry
  FillDirEntry(findinfo.direntry,dir_name);

  findinfo.direntry->sfn.starting_cluster = htons(start_cluster);
  // Don't forget to set the attrib:
  findinfo.direntry->sfn.attrib = ATTRIB_SUBDIR;

	// Write the new data to MMC
  Sect_Write(findinfo.block);

  // Clear dir_entry of directory and create dot and dotdot directory inside
  Clear_Cluster(start_cluster);
  dir_sectors = Sect_File_Data() + (start_cluster * MBR.sectors_per_cluster);

  entry = (dir_entry*)Scratch;
  FillDirEntry(entry,".");

  entry->sfn.starting_cluster = htons(start_cluster);
  entry->sfn.attrib = ATTRIB_SUBDIR;

  entry = (dir_entry*)&Scratch[32];

  FillDirEntry(entry,"..");

  entry->sfn.starting_cluster = htons(GetClusterOfParentDirectory());
  entry->sfn.attrib = ATTRIB_SUBDIR;


  Sect_Write(dir_sectors);
  return 0;
}

//-----------------------------------------------------------------------------
// rmdir
//-----------------------------------------------------------------------------
//
// Return Value : 1 if function suceeds other value if error occurs
// Parameters   : dir_name - directory name
//
// Function removes directory
//-----------------------------------------------------------------------------
BYTE rmdir(char* dir_name)
{
  unsigned dir_deep = 0;
  PREV_SEARCH prev_dir_block[40];
  char  first_part_of_dir[20];
  char  dir_tmp_name[20];
  char* tmp;

  // error if someone tries to removw root directory
  if(!strcmp(dir_name,"\\")) return 0;

  if((tmp = strstr(dir_name,"\\")) == NULL)
  {
  	strcpy(first_part_of_dir,dir_name);
  }
  else
  {
  	if(tmp == dir_name)
	{
		tmp = strstr(&dir_name[1],"\\");
		if(tmp != NULL)
			*tmp = 0;
		strcpy(first_part_of_dir,&dir_name[1]);
		if(tmp != NULL)
			*tmp = '\\';
	}
	else
	{
		*tmp = 0;
		strcpy(first_part_of_dir,dir_name);
		*tmp = '\\';
	}
  }

  if(!chngdir(dir_name)) return 0;
  if(!findfirst(&findinfo,0)) return 0;
  while(1)
  {
  	 if(findinfo.direntry->sfn.name[0]!=(char)0xE5)
	 {
	  	 if(!(findinfo.direntry->sfn.attrib & ATTRIB_LABEL))
		 {
			 if(findinfo.direntry->sfn.attrib & (ATTRIB_SUBDIR))
			 {
			 	if(!file_name_match(".",findinfo.direntry->sfn.name) &&
               !file_name_match("..",findinfo.direntry->sfn.name))
				{
				prev_dir_block[dir_deep].block = findinfo.block;
				prev_dir_block[dir_deep].offset = findinfo.offset;
				Get_File_Name(findinfo.direntry->sfn.name,dir_tmp_name);
				chngdir(dir_tmp_name);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区播放| av一区二区三区在线| 欧美人伦禁忌dvd放荡欲情| 亚洲欧美一区二区久久 | 日韩欧美一卡二卡| 精品一区二区三区在线观看国产| 欧美肥大bbwbbw高潮| 免费成人在线网站| 精品久久久久久久久久久久久久久久久 | 亚洲精品乱码久久久久久黑人| 一道本成人在线| 亚洲香肠在线观看| 欧美成人一区二区| 国产成人99久久亚洲综合精品| 国产精品理伦片| 精品视频在线免费| 加勒比av一区二区| 中文字幕一区二区三区视频| 色噜噜狠狠成人网p站| 舔着乳尖日韩一区| 久久亚洲精华国产精华液| 成人亚洲一区二区一| 亚洲自拍偷拍网站| 精品欧美一区二区在线观看| 成人免费高清视频| 视频一区二区不卡| 国产亚洲欧洲997久久综合| 91年精品国产| 免费观看久久久4p| 中文字幕一区二区三区四区不卡| 欧美肥妇bbw| 成人精品在线视频观看| 日本中文一区二区三区| 国产精品私房写真福利视频| 3751色影院一区二区三区| 国产精品一区二区三区乱码| 亚洲国产精品久久不卡毛片| 久久亚洲一区二区三区四区| 欧美日韩一区高清| 成人精品国产一区二区4080| 日韩成人精品视频| 亚洲日本在线天堂| xfplay精品久久| 欧美三级视频在线| 菠萝蜜视频在线观看一区| 五月激情综合婷婷| 一区二区三区日韩欧美精品| 久久亚洲精精品中文字幕早川悠里| 欧美在线不卡一区| 懂色av中文字幕一区二区三区| 视频一区视频二区中文字幕| 自拍偷在线精品自拍偷无码专区 | 亚洲欧洲99久久| 精品少妇一区二区三区在线视频| 在线观看视频一区| 成人黄色小视频在线观看| 久久精品久久99精品久久| 一区二区三区国产精华| 国产精品毛片久久久久久| 欧美成人综合网站| 欧美一级在线视频| 欧美曰成人黄网| 色综合久久中文综合久久97| 国产激情一区二区三区四区| 青青草成人在线观看| 亚洲国产精品久久久男人的天堂| 国产精品高潮久久久久无| 国产亚洲欧美日韩在线一区| 日韩欧美综合在线| 91精品中文字幕一区二区三区| 91黄色在线观看| 在线视频一区二区三区| 色婷婷av一区| 色综合天天做天天爱| 99精品国产热久久91蜜凸| 丁香啪啪综合成人亚洲小说| 激情综合亚洲精品| 韩国三级中文字幕hd久久精品| 麻豆中文一区二区| 极品少妇一区二区| 国产伦精品一区二区三区在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅| 日本视频一区二区三区| 日韩精品色哟哟| 蜜臀久久99精品久久久久宅男| 日韩电影在线观看电影| 日本一不卡视频| 寂寞少妇一区二区三区| 国产大陆a不卡| 国产91精品露脸国语对白| av欧美精品.com| 91免费在线播放| 欧美日韩精品久久久| 7777精品伊人久久久大香线蕉 | 亚洲精品久久嫩草网站秘色| 一区二区高清视频在线观看| 亚洲一区二区三区四区在线免费观看| 一区二区三区小说| 亚洲成a天堂v人片| 日本成人在线电影网| 国产一区二区三区免费| 成人一道本在线| 欧美吻胸吃奶大尺度电影| 欧美一级在线免费| 中文av一区二区| 亚洲午夜精品在线| 激情偷乱视频一区二区三区| 不卡视频免费播放| 欧美日韩第一区日日骚| 久久伊99综合婷婷久久伊| 亚洲视频一区二区免费在线观看 | 亚洲三级电影网站| 蜜桃av噜噜一区二区三区小说| 国产在线视视频有精品| 92精品国产成人观看免费 | 99这里都是精品| 欧美日韩成人综合| 久久欧美一区二区| 一个色在线综合| 激情亚洲综合在线| 在线一区二区视频| 欧美激情一区在线| 亚洲国产婷婷综合在线精品| 久久精品国产77777蜜臀| 成人精品一区二区三区中文字幕| 欧美日韩亚洲高清一区二区| 国产日韩欧美激情| 日韩黄色在线观看| av午夜一区麻豆| 欧美v日韩v国产v| 亚洲黄一区二区三区| 国产一区二区在线观看免费| 欧美视频第二页| 中文字幕电影一区| 开心九九激情九九欧美日韩精美视频电影| 成人丝袜18视频在线观看| 欧美一区二区三区在线观看视频| 亚洲少妇中出一区| 国产一本一道久久香蕉| 欧美午夜一区二区三区| 国产精品污网站| 麻豆精品国产91久久久久久| 色女孩综合影院| 欧美极品xxx| 精品一区二区三区视频在线观看| 91福利精品视频| 国产精品久久久久久户外露出| 久久精品二区亚洲w码| 欧美日韩美少妇| 亚洲综合免费观看高清完整版| 成人免费观看av| 欧美国产亚洲另类动漫| 激情久久五月天| 欧美一级视频精品观看| 亚洲电影在线免费观看| 99国产精品99久久久久久| 国产日本亚洲高清| 国产高清成人在线| 久久久久国产精品麻豆| 美国十次综合导航| 欧美sm极限捆绑bd| 久久精品99国产精品日本| 精品视频1区2区3区| 亚洲国产欧美在线| 欧美日韩精品一区二区三区蜜桃 | 欧美电视剧在线看免费| 日韩va欧美va亚洲va久久| 欧美日韩黄视频| 日韩精品福利网| 91精品国产综合久久久久久漫画 | 欧美日韩国产小视频| 亚洲成人av一区二区三区| 欧美日韩二区三区| 免费在线看一区| 久久综合一区二区| 国产大陆精品国产| 亚洲天天做日日做天天谢日日欢 | 日韩不卡一区二区| 日韩免费高清av| 国产高清一区日本| 国产精品国产三级国产aⅴ中文| 色噜噜狠狠色综合中国| 亚洲成在线观看| 精品久久免费看| 粉嫩一区二区三区性色av| 《视频一区视频二区| 欧美亚洲自拍偷拍| 麻豆高清免费国产一区| 久久久久久久综合日本| 成人免费三级在线| 亚洲一区二区高清| 日韩美女视频在线| 粉嫩蜜臀av国产精品网站| 亚洲精品精品亚洲| 欧美精品一二三四| 国产精品一区二区免费不卡| 国产精品久久久久久久久久久免费看| 91麻豆免费在线观看| 日韩av不卡一区二区| 日本一区二区三区视频视频|