⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 usb2.0驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		for(Pointer=0;Pointer<512;Pointer++)
		{
			Page_Buf[Pointer]=*pucBlockBuf;
		//	*pucBlockBuf=0xff;
			pucBlockBuf++;
		}
		WritePage(current_block,ulPageNum,Page_Buf);					
	}
	pre_block=current_block;
	current_block=ulNextBlock;		
}
//------------------------------------------------------------------
// 函数名:INT8U read_file(INT8U *pucBlockBuf,INT32 lByteNum)
// 输 入: INT8U *pucBlockBuf	--	Block Buffer
//          INT32U lByteNum --块buffer
// 输 出: Null
// 功能描述:从当前块读取lByteNum个字节到pucBlockBuf
// 全局变量:Page_Buf
//------------------------------------------------------------------
INT8U read_file(INT8U *pucBlockBuf,INT32 lByteNum)
{	
	INT32U ulPageNum,Pointer;
//Uart_Printf("\nRead data,Current block is:%d",current_block);
	for(ulPageNum=0;ulPageNum<32;ulPageNum++)
	{
		ReadPage(current_block,ulPageNum,Page_Buf);		
		for(Pointer=0;Pointer<512;Pointer++)
		{
			*pucBlockBuf=Page_Buf[Pointer];
			pucBlockBuf++;
			lByteNum--;
			if(lByteNum==0)
			{
				current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
				return 1;
			}
		}
	}
	current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
	return 1;
}

//------------------------------------------------------------------
// 函数名:INT32U ReadFileOneBlock(INT8U *pucFileBuf,INT32 OneCluster)----------------------modificated in 3.27
//功 能:将文件的一个Block读入缓冲区中并返回下一个簇号
//输 入:INT32U OneCluster:欲读出的文件的Block号
//      INT8U * pucFileBuf:文件缓冲区(should be one Block size)
// 输 出:若正常结束,返回1;出错,返回0;
//       若返回值等于FAT_NO_NEXT_CLUSTER表示文件已读完;
// 全局变量:输出current_block为当前读的block,next_block为该文件下一个block号    

//------------------------------------------------------------------
INT32U ReadFileOneBlock(INT8U *pucFileBuf,INT32 OneCluster)
{	
	INT32U ulPageNum,Pointer;
	INT8U  *tempval;
	tempval=pucFileBuf;
	current_block=OneCluster;
//Uart_Printf("\nRead data,Current block is:%d",current_block);
	for(ulPageNum=0;ulPageNum<32;ulPageNum++)
	{
		ReadPage(OneCluster,ulPageNum,Page_Buf);		
		for(Pointer=0;Pointer<512;Pointer++)
		{
			*tempval=Page_Buf[Pointer];
			tempval++;
		}
	}
	next_block=Page_Buf[512+14]*256+Page_Buf[512+15];
	if (next_block>= FAT32_LAST_CLUSTER)
  	{
  		return FAT_NO_NEXT_CLUSTER;
  	}
    else return 1;
}


//------------------------------------------------------------------
// 函数名:INT32U comp_filename(INT8U *pucString1,INT8U *pucString2)
// 输 入: INT8U *pucString1
//          INT8U *pucString2
// 输 出: 0--相同
//		1--不相同
// 功能描述:比较两个文件名
// 全局变量:Null
// ***只比较短文件名
//------------------------------------------------------------------
INT32U comp_filename(INT8U *pucString1,INT8U *pucString2)
{
	INT32U ulDiffNum=0;
	INT32U ulNamePointer;

	for(ulNamePointer=0;ulNamePointer<11;ulNamePointer++)
	{
		if(pucString1[ulNamePointer]!=pucString2[ulNamePointer])
			ulDiffNum++;
	}
	return (ulDiffNum);
}
//------------------------------------------------------------------
// 函数名:INT32U find_file(INT8U *pucFileName)
// 输 入: INT8U *pucFileName --文件名
// 输 出: 该文件在DIR_Flash[ ]中的位置,即第几条记录,若输出为0xffff则表示未找到该文件
// 功能描述:查找文件在root表的位置
// 全局变量:root_buf, DIR_Flash[ ]
// 只支持短文件名当前
//------------------------------------------------------------------
INT32U find_file(INT8U *pucFileName, INT32U ulBlockNum)
{
	INT32U Pointer;
	INT8U  *pucNameCount;
	Dir(ulBlockNum, pucNameCount);

	for(Pointer=0;Pointer<*pucNameCount;Pointer++)
	{
		if(comp_filename(&(DIR_Flash[Pointer].ucDirShortName[0]), pucFileName)==0)
		return(Pointer);
	}
	return(0xFFFF);

}
//------------------------------------------------------------------
// 函数名:INT32U FlashWriteFile(INT8U *pucFileName, INT8U *pucFileBuf, INT32U ulFileLen, INT32U ulFlag)
// 输 入: INT8U *pucFileName --文件名
//		INT8U *pucFileBuf--缓冲区指针
//		INT32U ulFileLen--长度
//		INT32U ulFlag--Not really used now
// 输 出: 1--成功
//		0--失败,该文件已经存在
// 功能描述:将缓冲区ulFileLen长的一段写入文件
// 全局变量:Null
//------------------------------------------------------------------
INT32U FlashWriteFile(INT8U *pucFileName, INT8U *pucFileBuf, INT32U ulFileLen, INT32U ulFlag)
{
	INT32U i,ulBlockNum,ulRootLocation;
	INT8U pucFileInfo[32];
	ulRootLocation=find_file(pucFileName, current_block);              //需要对find_file函数的长文件名修改
	if(ulRootLocation!=FILE_NO_FOUND)
		return 0;				//This file is already exist!
	else
	{
		ulBlockNum=ulFileLen/(16*1024);
		if((ulFileLen%(16*1024))!=0)
			ulBlockNum++;
		for(i=0;i<32;i++)	//copy the file name
		{
			pucFileInfo[i]=*pucFileName++;
		}
		pucFileInfo[31]=ulFileLen/16777216;	ulFileLen%=16777216;
		pucFileInfo[30]=ulFileLen/65536;	ulFileLen%=65536;
		pucFileInfo[29]=ulFileLen/256;		ulFileLen%=256;
		pucFileInfo[28]=ulFileLen;
		creat_file(pucFileInfo,11,0,0);	//将文件信息添加到Root information,应该修改root区,而不是创建--------changed in 3.27
		for(i=0;i<ulBlockNum;i++)
		{
			if(i==(ulBlockNum-1))
				write_file(1,pucFileBuf);
			else
				write_file(0,pucFileBuf);
			pucFileBuf+=16*1024;
		}
		close_file(current_block);			////将修改后的Root information写回Block0
		return 1;
	}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashFileSize(INT8U *pucFileName)
// 输 入: INT8U *pucFileName --文件名
// 输 出: 文件长度
// 功能描述:获取文件大小
// 全局变量:root_buf
//------------------------------------------------------------------
INT32U FlashFileSize(INT8U *pucFileName)
{
	INT32U ulRootLocation,ulFileSize;
	ulRootLocation=find_file(pucFileName,current_block);
	if(ulRootLocation==FILE_NO_FOUND)
		return 0;
	else
	{
		//get the file first cluster//
		current_block=root_buf[ulRootLocation][27]*256+root_buf[ulRootLocation][26];
		//get the file size
		ulFileSize=root_buf[ulRootLocation][28]+
				root_buf[ulRootLocation][29]*256+
				root_buf[ulRootLocation][30]*65536+
				root_buf[ulRootLocation][31]*65536*256;
	}
	return ulFileSize;
}
//------------------------------------------------------------------
// 函数名:INT32U FlashReadFile(INT8U *pucFileName, INT8U * pucFileBuf)
// 输 入: INT8U *pucFileName --文件名
//		INT8U *pucFileBuf--缓冲区指针
// 输 出: 1--成功
//		0--失败,找不到该文件
// 功能描述:读取整个文件到缓冲区中
// 全局变量:Null
//------------------------------------------------------------------
INT32U FlashReadFile(INT8U *pucFileName, INT8U * pucFileBuf)
{
	INT32U ulRootLocation;
	INT32 lFileSize;
	ulRootLocation=find_file(pucFileName,current_block);
	
	if(ulRootLocation==FILE_NO_FOUND)
		return 0;
	else
	{
		//get the file first cluster//
		current_block=root_buf[ulRootLocation][27]*256+root_buf[ulRootLocation][26];
		//get the file size
		lFileSize=root_buf[ulRootLocation][28]+
				root_buf[ulRootLocation][29]*256+
				root_buf[ulRootLocation][30]*65536+
				root_buf[ulRootLocation][31]*65536*256;
		while(1)
		{
			if(lFileSize<=0)
				break;
			else if(lFileSize<(16*1024))
				read_file(pucFileBuf,lFileSize);
			else
				read_file(pucFileBuf,16*1024);
			pucFileBuf+=16*1024;	//point to next 16KB area
			lFileSize-=16*1024;
			current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
			if(current_block==LAST_BLOCK)
				break;	
		}
		return 1;
	}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashFormat(void)
// 输 入: Null
// 输 出: 1--成功
//		0--失败,找不到该文件
// 功能描述:格式化Flash
// 全局变量:Page_Buf
//------------------------------------------------------------------
INT32U FlashFormat(void)
{
	INT8U VerfyBuf[528];

	INT32U ulBlockNum,ulPageNum,Pointer;

	/*擦除数据区*/
	for(ulBlockNum=Start_Cluster;ulBlockNum<=End_Cluster;ulBlockNum++)
	{
		if(Erase_Block(ulBlockNum)==0)
		{
			/*Mark this Block with BAD flag*/
			Page_Buf[512]=0x00;
			WritePage(ulBlockNum,0,&Page_Buf[0]);
		}
	}
	//verfiy if all data is 0xff
	for(ulBlockNum=Start_Cluster;ulBlockNum<=End_Cluster;ulBlockNum++)
	{
		for(ulPageNum=0;ulPageNum<32;ulPageNum++)
		{
			ReadPage(ulBlockNum,ulPageNum,VerfyBuf);
			for(Pointer=0;Pointer<512;Pointer++)
			{
				if(VerfyBuf[Pointer]!=0xff)
					Pointer++;
			}
		}
	}
		
	
	//将root_buf中全部写0x00//
	for(ulPageNum=0;ulPageNum<32;ulPageNum++)
	{
		for(Pointer=0;Pointer<512;Pointer++)
		{
			Page_Buf[Pointer]=0;
		}
		//独立区以0xFF填充//
		for(Pointer=512;Pointer<(512+16);Pointer++)
		{
			Page_Buf[Pointer]=0xFF;
		}
		WritePage(Root_Cluster,ulPageNum,&Page_Buf[0]);
	}
	return 1;
}
//------------------------------------------------------------------
// 函数名:INT32U FlashRenameFile(INT8U *pucNewOldFileName)
// 输 入: INT8U *pucNewOldFileName--文件名
// 输 出: 1--成功
//		0--失败,找不到该文件
// 功能描述:修改文件名
// 全局变量:root_Buf
//------------------------------------------------------------------
INT32U FlashRenameFile(INT8U *pucNewOldFileName)
{
	INT32U Pointer,i;
	Pointer=find_file(pucNewOldFileName, current_block);
	if(Pointer==FILE_NO_FOUND)
		return 0;
	else
	{
		for(i=0;i<11;i++)
			root_buf[Pointer][i]=pucNewOldFileName[11+i];
		close_file(current_block);
		return 1;
	}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashDelFile(INT8U *pucFileName)
// 输 入: INT8U *pucFileName--文件名
// 输 出: 1--成功
//		0--失败,找不到该文件
// 功能描述:删除文件
// 全局变量:root_Buf
//------------------------------------------------------------------
INT32U FlashDelFile(INT8U *pucFileName, INT32U ulBlockNum)
{
	INT32U ulRootLocation,ulDelBlockNo,ulSrcLocation,ulDestLocation;
	
    // get the location of this file via look for its file name in Root Directory //
	ulRootLocation=find_file(pucFileName, ulBlockNum);
	
	if(ulRootLocation==FILE_NO_FOUND)
		return 0;
	else
	{
		//flush this file's recoder in root information//
		ulDestLocation=DIR_Flash[ulRootLocation].ulUnitNo;
		ulSrcLocation=ulDestLocation+DIR_Flash[ulRootLocation].ucUnitNum;
		if(ulSrcLocation>=512)
			memset(&(root_buf[ulDestLocation][0]), 0,32*DIR_Flash[ulRootLocation].ucUnitNum);
		else
		{
			for(;ulDestLocation<ulSrcLocation;ulDestLocation++)
				{
					if(ulSrcLocation>=511) ulSrcLocation=511;
					memcpy(root_buf[ulDestLocation],root_buf[ulSrcLocation],32);
					ulSrcLocation++;
				}
		}
//----------------------------------------------------
		//get the file first cluster//
		ulDelBlockNo=DIR_Flash[ulRootLocation].ulDirFstClus;
		while(1)
		{
			ReadPage(ulDelBlockNo,0,Page_Buf);
			Erase_Block(ulDelBlockNo);   //不知道是否正常工作,修改独立区的fat参数就可以了吧
			//get the next block number//
			ulDelBlockNo=Page_Buf[512+14]*256+Page_Buf[512+15];
			if(ulDelBlockNo==65535)
				break;
		}
		close_file(ulBlockNum);
		return 1;
	}
}
//------------------------------------------------------------------
// 函数名:INT32U FlashInit(INT8U *pucFileName)
// 输 入: INT8U *pucFileName--文件名
// 输 出: 1--成功,不会失败
// 功能描述:初始化Flash文件系统
// 全局变量:root_Buf
//------------------------------------------------------------------
INT32U FlashInit(void)
{
	INT32U ulPageNum,Pointer;
	INT8U pucPageBuf[512+16];
	/*读入Root informatiom*/
	for(ulPageNum=0;ulPageNum<32;ulPageNum++)
	{
		/*将Root information读到root_buf中*/
		ReadPage(Root_Cluster,ulPageNum,pucPageBuf);
		for(Pointer=0;Pointer<512;Pointer++)
		{
			root_buf[ulPageNum*16+Pointer/32][Pointer%32]=pucPageBuf[Pointer];
		}
	}
//	LoadFont();
	return 1;
}
//------------------------------------------------------------------
// 函数名:void LoadFont(void)
// 输 入: Null

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -