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

📄 file.c

📁 usb2.0驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
// 输 出: Null
// 功能描述:有NandFlash中载入字库
// 全局变量:aucHZK,aucEK
// 注 意: NandFlash中必须要有HZ267616.txt(16*16汉字库)和ASCI4096.txt(16*8字母库)
//        若没有,则可通过USB下载后,将系统重起
//------------------------------------------------------------------
static void LoadFont(void)
{
//	INT8U aucHzName[32]={'H','Z','2','6','7','6','1','6','T','X','T'};
//	INT8U aucEngName[32]={'A','S','C','I','4','0','9','6','T','X','T'};
//	INT8U aucPyName[32] = {'P','Y','K','1','6','6','7','6','T','X','T'};

//	FlashReadFile(aucHzName,aucHZK);
//	FlashReadFile(aucEngName,aucEK);
//	FlashReadFile(aucPyName,aucPYK);
}

//------------------------------------------------------------------
// 函数名:INT32U Dir(INT32U root_block_num, INT8U *file_count)
// 输 入: INT32U root_block_num 所要显示的目录所在的block号
//		 INT8U *file_count	 当前目录文件个数
// 输 出: 1--成功
//		 0--失败
// 功能描述: 显示root_block_num内的文件目录
// 全局变量: INT8U root_Buf[512][32]存放当前目录表的信息
//          INT32U pre_root   上层目录的位置
//          INT32U current_root 当前目录的位置
//			DIR_Flash  每个数组元素存放一个文件的信息
//------------------------------------------------------------------
INT32U Dir(INT32U root_block_num, INT8U *file_count)
{
	INT32U ulPageNum,Pointer,j,i,j_backup;
    INT8U  iInfNum,iNamePoint; 
    memset(root_buf, 0,512*32);
    memset(DIR_Flash, 0,100*sizeof(STRU_LongDIR_INFO));
    for(ulPageNum=0;ulPageNum<32;ulPageNum++)
	{
		/*将Root information读到root_buf中*/
		ReadPage(root_block_num,ulPageNum,Page_Buf);
		for(Pointer=0;Pointer<512;Pointer++)
		{
			root_buf[ulPageNum*16+Pointer/32][Pointer%32]=Page_Buf[Pointer];
			//root_buf[文件条序号][文件目录信息],每页16个32byte结构(即每页16条文件信息)
		}
	}
   
  
   
   //--------------------------------------------------------------------

 		for ( iNamePoint=0,j = 0; j < 512&&iNamePoint<100; j++)                  // j 是当前的infomation号码
		{
			 if ((root_buf[j][0]== 0)||(root_buf[j][0]== 0x05)||(root_buf[j][0]== 0xe5))
			{
				continue;
			}
			else if(root_buf[j][11]== 0x0f)   //长文件名
				{
					iInfNum=0x0f&root_buf[j][0];    //长文件名所占信息条数
					DIR_Flash[iNamePoint].ulUnitNo=j;
					DIR_Flash[iNamePoint].ucUnitNum=iInfNum+1;
					j_backup=j+iInfNum+1;
					for(i=0;i<11;i++)        //存储它的短文件名信息
					{
						DIR_Flash[iNamePoint].ucDirShortName[i]=root_buf[j_backup][i];
					}
					DIR_Flash[iNamePoint].ucDirAttr=root_buf[j_backup][11];
					DIR_Flash[iNamePoint].ulDirFileSize=((INT32U)root_buf[j_backup][29]<<8)+(INT32U)root_buf[j_backup][28]+
                                                               ((INT32U)root_buf[j_backup][31]<<24)+((INT32U)root_buf[j_backup][30]<<16);
					DIR_Flash[iNamePoint].ulDirFstClus=((INT32U)root_buf[j_backup][27]<<8)+(INT32U)root_buf[j_backup][26];
					j_backup--;               //j_backup指向01条文件信息
					for(Pointer=0;iInfNum>0;iInfNum--)
					{
						for(i=1;i<32;i++,Pointer++,j_backup--)
						{
							switch(i)
								{
									case 11:	i=14;
												break;
									case 26:	i=28;
												break;
									default:	break;
								}
							
							DIR_Flash[iNamePoint].ucDirName[Pointer]=root_buf[j_backup][i];

						}
					}
					iNamePoint++;
			       }
			else						//短文件名
			{
					DIR_Flash[iNamePoint].ulUnitNo=j;
					DIR_Flash[iNamePoint].ucUnitNum=1;
					for(i=0;i<11;i++)        //存储它的短文件名信息
					{
						DIR_Flash[iNamePoint].ucDirShortName[i]=root_buf[j][i];
						DIR_Flash[iNamePoint].ucDirName[i]=root_buf[j][i];
					}
					DIR_Flash[iNamePoint].ucDirAttr=root_buf[j][11];
					DIR_Flash[iNamePoint].ulDirFileSize=((INT32U)root_buf[j][29]<<8)+(INT32U)root_buf[j][28]+
                                                               ((INT32U)root_buf[j][31]<<24)+((INT32U)root_buf[j][30]<<16);
					DIR_Flash[iNamePoint].ulDirFstClus=((INT32U)root_buf[j][27]<<8)+(INT32U)root_buf[j][26];
					iNamePoint++;
				
			}
			
		}
	
   //--------------------------------------------------------------------
   

	*file_count=iNamePoint;
  if(iNamePoint==100)  return 0;    
   else 		return 1;
    
    
}
//------------------------------------------------------------------
// INT32U Dir_Path(INT8U *pathString, INT8U *file_count);
// 输 入: INT8U *pathString--路径,根目录为"..",例如INT8U *pathString="..\MUSIC\MP3"
//		INT8U *file_count--文件个数
//	     INT8U ucDataNum--要求输出字符个数
// 输 出: 1--成功
//		 0--失败
// 功能描述: 显示指定路径下的文件目录
// 全局变量: INT8U root_Buf[512][32]存放当前目录表的信息
//                INT32U pre_root   上层目录的位置
//                INT32U current_root 当前目录的位置
//		     DIR_Flash  每个数组元素存放一个文件的信息
//------------------------------------------------------------------
INT32U Dir_Path (INT8U *pathString, INT8U *file_count)
{
	INT8U  *pucCurDirString, ucCurDirStrlen;   //current Directory name and name length
	INT32U ulReturnVal;
       while(*pathString!=0)
       {
       	pucCurDirString=pathString;
       	ucCurDirStrlen=0;
       	while(*pathString!=47)   // '/'
       	{
       		pathString++;
       		ucCurDirStrlen++;
       		if(ucCurDirStrlen>8)
       		{
       			Uart_Printf("directory is too long.\n");
       			return FALSE;
       		}
		if((*pucCurDirString==46)&&(*(pucCurDirString+1)==46))     //'.'
			Dir(Root_Cluster, file_count);
		else
		{
              	ulReturnVal=find_file(pucCurDirString, ucCurDirStrlen);
              	if(ulReturnVal==0xFFFF)
              	{
       			Uart_Printf("can't find the directory.\n");
       			return FALSE;
       		}
              	Dir(DIR_Flash[ulReturnVal].ulDirFstClus, file_count);

		}	
		
      }
       	pathString++;


    }
       return OK;
}
//---------------------------------------------------------------------
// INT32U Dir_Ext(INT8U *pathString, INT8U *extName,INT8U *file_count);
// 输 入: INT8U *pathString--路径,根目录为"..",例如INT8U *pathString="..\MUSIC\MP3"
//		INT8U *extName--文件扩展名,例如INT8U *extName="EXE"
//	       INT8U *file_count--指定扩展名文件的个数
// 输 出: 1--成功
//		 0--失败
// 功能描述: 显示指定路径下的文件目录
// 全局变量: INT8U root_Buf[512][32]存放当前目录表的信息
//                INT32U pre_root   上层目录的位置
//                INT32U current_root 当前目录的位置
//		     DIR_Flash  每个数组元素存放一个文件的信息
//------------------------------------------------------------------
INT32U Dir_Ext(INT8U *pathString, INT8U *extName,INT8U *file_count)
{
	INT32U ulReturnVal;
	INT8U  ucFileNum,ucPoint=0,i=0;
	STRU_LongDIR_INFO DIR_File_Ext[100]; 
	memset(DIR_File_Ext, 0, 100*sizeof(STRU_LongDIR_INFO));
	ulReturnVal=Dir_Path(pathString, file_count);
	if(ulReturnVal==FALSE) return FALSE;
	ucFileNum=*file_count;
	while(ucFileNum>ucPoint)
	{
		if((DIR_Flash[ucPoint].ucDirShortName[8]==*extName)&&
			(DIR_Flash[ucPoint].ucDirShortName[9]==*(extName+1))&&
			(DIR_Flash[ucPoint].ucDirShortName[10]==*(extName+2)))
		{
			memcpy(&(DIR_File_Ext[i]),&(DIR_Flash[ucPoint]),sizeof(STRU_LongDIR_INFO));
			i++;
		}
		ucPoint++;

	}
	memcpy(DIR_Flash, DIR_File_Ext, 100*sizeof(STRU_LongDIR_INFO));
     *file_count=i;
     return 1;

}


//-----------------------------------------------------------------------------------
//INT32U FileSeek( INT8U *pucFileName,INT32U ulPosition,INT8U *pucOutPut, INT8U ucDataNum)
// 输 入: INT8U *pucFileName--文件名
//		 INT8U *pucOutPut--输出字符指针
//	     INT8U ucDataNum--要求输出字符个数
// 输 出: 1--成功
//		 0--失败
// 功能描述:查找并读出指定文件的指定位置的字符
// 全局变量:DIR_Flash[100]
//---------------------------------------------------------------------------------
INT32U FileSeek( INT8U *pucFileName,INT32U ulPosition, INT8U *pucOutPut, INT16U usDataNum)
{
	INT8U Pointer,i;
	INT16U usDataBlock1,usDataBlock2;
	INT32U ulClusterNum, ulRestNum,ulRestNum1;
	INT32U ulReadBlockNo; 
	INT8U *pucBlockBuf;
	INT32U ulBlockByteNum=16384;     //512*32
	for(Pointer=0;Pointer<100;Pointer++)
	{
		if(comp_filename(&(DIR_Flash[Pointer].ucDirShortName[0]),pucFileName)==0) break;	  

	}
	if(Pointer==100) return 0;
	ulClusterNum=(ulPosition>>14)+1;       			    //在第几个cluster(以一为开始)
	ulRestNum=ulPosition%(ulBlockByteNum);         		//the position of the data in this cluster     
	pucBlockBuf = (INT8U*)malloc(ulBlockByteNum);

	for(ulReadBlockNo=DIR_Flash[Pointer].ulDirFstClus;ulClusterNum>0;ulClusterNum--)
	{
		ReadFileOneBlock(pucBlockBuf, ulReadBlockNo);
		ulReadBlockNo=next_block;
	}
	if(ulRestNum+(INT32U)usDataNum<ulBlockByteNum) 
	{
		for(;usDataNum>0;usDataNum--)
		{
			*pucOutPut++=*(pucBlockBuf+ulRestNum);
			ulRestNum++;
		}
	}
	else
	{
	    
		usDataBlock2=(INT16U)(ulRestNum+usDataNum-ulBlockByteNum);  //the others block's data
		usDataBlock1=usDataNum-usDataBlock2;
		for(;usDataBlock1>0;usDataBlock1--)
		{
			*pucOutPut++=*(pucBlockBuf+ulRestNum);
			ulRestNum++;
		}
		
		i=usDataBlock2>>14;
		usDataBlock2=usDataBlock2%(ulBlockByteNum);
		while(i>0)
		{
			ReadFileOneBlock(pucBlockBuf,ulReadBlockNo);
			ulReadBlockNo=next_block;
			i--;
			for(usDataBlock1=ulBlockByteNum,ulRestNum=0;usDataBlock1>0;usDataBlock1--)
			{
			*pucOutPut++=*(pucBlockBuf+ulRestNum);
			ulRestNum++;
			}
		}
		if(usDataBlock2>0)
		{
			ReadFileOneBlock(pucBlockBuf,ulReadBlockNo);
			for(ulRestNum=0;usDataBlock2>0;usDataBlock2--)
			{
				*pucOutPut++=*(pucBlockBuf+ulRestNum);
				ulRestNum++;
			}
		}
	}	

	free(pucBlockBuf);
	return 1;
}

//-----------------------------------------------------------------------------------
//INT32U FileChang( INT8U *pucFileName,INT32U ulPosition,INT8U *pucInPut, INT8U ucDataNum)
// 输 入: INT8U *pucFileName--文件名
//		 INT8U *pucInPut--输入字符指针
//	     INT8U ucDataNum--要求修改字符个数
// 输 出: 1--成功
//		 0--失败
// 功能描述:查找并修改指定文件的指定位置的字符
// 全局变量:DIR_Flash[100]
//---------------------------------------------------------------------------------
INT32U FileChang( INT8U *pucFileName,INT32U ulPosition, INT8U *pucInPut, INT8U ucDataNum)
{
	INT8U ulPageNum,ucDataBlock1,ucDataBlock2;
	INT32U Pointer,ulClusterNum, ulRestNum;
	INT32U ulReadBlockNo; 
	INT8U *pucBlockBuf;
	INT32U ulBlockByteNum=16384;     //512*32
	for(Pointer=0;Pointer<100;Pointer++)
	{
		if(comp_filename(&(DIR_Flash[Pointer].ucDirShortName[0]),pucFileName)==0) break;	  

	}
	if(Pointer==100) return 0;
	ulClusterNum=(ulPosition>>14)+1;        //在第几个cluster(以一为开始)
	ulRestNum=ulPosition%(ulBlockByteNum);
	pucBlockBuf = (INT8U*)malloc(ulBlockByteNum);

	for(ulReadBlockNo=DIR_Flash[Pointer].ulDirFstClus;ulClusterNum>0;ulClusterNum--)
	{
		ReadFileOneBlock(pucBlockBuf, ulReadBlockNo);
		ulReadBlockNo=next_block;
	}
	if(ulRestNum+(INT32U)ucDataNum<ulBlockByteNum) 
	{
		for(;ucDataNum>0;ucDataNum--)
		{
			*(pucBlockBuf+ulRestNum)=*pucInPut++;
			ulRestNum++;
		}
		Erase_Block(current_block);
		for(ulPageNum=0;ulPageNum<32;ulPageNum++)
		{
			for(Pointer=0;Pointer<512;Pointer++)
			{
				Page_Buf[Pointer]=*pucBlockBuf;
		//	*pucBlockBuf=0xff;
				pucBlockBuf++;
			}
			WritePage(current_block,ulPageNum,Page_Buf);					
		}
	}
	else
	{
		ucDataBlock2=(INT8U)(ulRestNum+(INT32U)ucDataNum-ulBlockByteNum);
		ucDataBlock1=ucDataNum-ucDataBlock2;
		for(;ucDataBlock1>0;ucDataBlock1--)
		{
			*(pucBlockBuf+ulRestNum)=*pucInPut++;
			ulRestNum++;
		}
		Erase_Block(current_block);
		for(ulPageNum=0;ulPageNum<32;ulPageNum++)
		{
			for(Pointer=0;Pointer<512;Pointer++)
			{
				Page_Buf[Pointer]=*pucBlockBuf;
		//	*pucBlockBuf=0xff;
				pucBlockBuf++;
			}
			WritePage(current_block,ulPageNum,Page_Buf);					
		}
		ReadFileOneBlock(pucBlockBuf,ulReadBlockNo);
		for(ulRestNum=0;ucDataBlock2>0;ucDataBlock2--)
		{
			*(pucBlockBuf+ulRestNum)=*pucInPut++;
			ulRestNum++;
		}
		Erase_Block(current_block);
		for(ulPageNum=0;ulPageNum<32;ulPageNum++)
		{
			for(Pointer=0;Pointer<512;Pointer++)
			{
				Page_Buf[Pointer]=*pucBlockBuf;
		//	*pucBlockBuf=0xff;
				pucBlockBuf++;
			}
			WritePage(current_block,ulPageNum,Page_Buf);					
		}
	}
	free(pucBlockBuf);
	return 1;
}	
//-------------------------------------------------------------------


⌨️ 快捷键说明

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