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

📄 u_disk.c

📁 基于Embest开发环境
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	LWORD temp;
	temp=clusterNum-2;
	temp=temp*ClusterSize;//clustersize是没簇扇区数
	temp=temp+FileDataAddr;//filedataaddr是数据区起始扇区
	return temp;
}
/////////////////////////////////////////////////////////////////////////////////
LWORD ThisFatSecNum(WORD clusterNum)//通过簇号,确定这个簇号在第几个扇区
{
   LWORD temp;
   temp=clusterNum*2;
   temp=temp/SectorSize;//sectorsize是每扇区字节数
   temp=temp+FATAddr;//fataddr是fat表起始地址
   return temp;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
WORD ThisFatEntOffset(WORD clusterNum)//通过簇号,确定这个这个簇号是扇区中的第几个字节
{
	LWORD temp1,temp2;
	temp1=2*clusterNum;
	temp2=temp1/SectorSize;
	temp1=temp1-temp2*SectorSize;
	return temp1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
WORD GetNextClusterNum(WORD clusterNum)//得到下一个簇号
{
	LWORD xxgFatSecNum;
	WORD  xxgFatEntOffset,i;
	
	xxgFatSecNum=ThisFatSecNum(clusterNum);
	xxgFatEntOffset=ThisFatEntOffset(clusterNum);
	
	i=0;
	while(i<20){
		if(UFLReadSector(xxgFatSecNum)) break;//读下一个簇号所在扇区

		USB_Delay(200);				

		Reset_U();
	
		USB_Delay(200);				
	
		UFLRequestSense();
		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return FALSE;
	clusterNum=MassStorageDataBuf[xxgFatEntOffset+1];//大小端是否对?将下一个簇号存放到clusternum中,返回
	clusterNum=clusterNum<<8;
	clusterNum+=MassStorageDataBuf[xxgFatEntOffset];	
	return clusterNum;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
BYTE DeleteClusterLink(WORD clusterNum)//删除一个文件的簇链
{
	LWORD xxgFatSecNum;
	WORD  xxgFatEntOffset,i;
	while((clusterNum>1)&&(clusterNum<0xfff0))
	{
	xxgFatSecNum=ThisFatSecNum(clusterNum);
	xxgFatEntOffset=ThisFatEntOffset(clusterNum);
	
	i=0;
	while(i<20){
		if(UFLReadSector(xxgFatSecNum)) break;//读下一个簇号所在扇区

		USB_Delay(200);				

		Reset_U();
	
		USB_Delay(200);				
	
		UFLRequestSense();
		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return FALSE;
	
		clusterNum=MassStorageDataBuf[xxgFatEntOffset+1];//找出下一簇的簇号
		clusterNum=clusterNum<<8;
		clusterNum+=MassStorageDataBuf[xxgFatEntOffset];	
		
	MassStorageDataBuf[xxgFatEntOffset]=0x00; //fat表中这个簇的内容清0,表示此簇可用
	MassStorageDataBuf[xxgFatEntOffset+1]=0x00;	
	//DelayMs(5);
	if(!UFLWriteSector(xxgFatSecNum))
		return FALSE;
	//DelayMs(5);
	if(!UFLWriteSector(xxgFatSecNum+FATLength))//fatlength是一个fat占的扇区数
		return FALSE;
	}
	return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
WORD GetClusterNumFromSectorNum(LWORD sectorNum)//从数据所在的扇区号得到该数据所在簇的簇号
{
	LWORD temp;
	temp=sectorNum-FileDataAddr;
	temp=temp/SectorSize;
	temp=temp+2;
	return (WORD)temp;
}

//////////////////////////////////////////////////////////////////////////////////////////
WORD GetFreeCusterNum(void)//得到一个free的簇的簇号,簇对应的fat表填写为ffff
{
	WORD clusterNum,i;
	LWORD sectorNum;
	clusterNum=0;
	sectorNum=FATAddr;
	while(sectorNum<FATLength+FATAddr)//fat中的每一个扇区查过来,直到发现free的簇
	{
		i=0;
	while(i<20){
		if(UFLReadSector(sectorNum)) break;//读fat的下一个扇区

		USB_Delay(200);				

		Reset_U();
	
		USB_Delay(200);				
	
		UFLRequestSense();
		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return FALSE;
		for(i=0;i<SectorSize;i=i+2)//fat扇区中检查每一个簇,判断是不是free
		  	{
		  	 if((MassStorageDataBuf[i]==0)&&(MassStorageDataBuf[i+1]==0))
		  	 	{	
		  	 	MassStorageDataBuf[i]=0xff;//是free就把fat中的值置为ffff
		  	 	MassStorageDataBuf[i+1]=0xff;
		  	 	//DelayMs(10);
		  	 	if(!UFLWriteSector(sectorNum))
		  	 		return 0x00;
		  	 	//DelayMs(10);
		  	 	if(!UFLWriteSector(sectorNum+FATLength))
		  	 		return 0x00;
		  	 	return	clusterNum; 
		  	 	}
		  	 clusterNum++;
		  	}	
				sectorNum=2*clusterNum/SectorSize+FATAddr;	
	}
	return 0x0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
WORD CreateClusterLink(WORD currentCluster)//参数是现在簇号,返回是下一簇的簇号
{										//用getfreecusernum得到下一free簇的簇号,			
	WORD 		newCluster;				//然后将下一簇的簇号填写到现在簇对应的fat表的位置,
	LWORD 	xxgFatSecNum;				//完成了一次簇的连接
	WORD  	xxgFatEntOffset;
	
	newCluster=GetFreeCusterNum();
		
	xxgFatSecNum=ThisFatSecNum(currentCluster);
	xxgFatEntOffset=ThisFatEntOffset(currentCluster);
	if(UFLReadSector(xxgFatSecNum))
		{
		//clusterNum=DBUF[xxgFatEntOffset+1];
		//clusterNum=clusterNum<<8;
		//clusterNum+=DBUF[xxgFatEntOffset];	
		//return clusterNum;
		MassStorageDataBuf[xxgFatEntOffset]=newCluster;
		MassStorageDataBuf[xxgFatEntOffset+1]=newCluster>>8;
		//DelayMs(5);
		if(!UFLWriteSector(xxgFatSecNum))
			return 0x00;
		//DelayMs(10);
		if(!UFLWriteSector(xxgFatSecNum+FATLength))
			return 0x00;
		}
	else
		return 0x00;
	
	return newCluster;
}



//////////////////////////////////////////////////////////////////////////
//
//  移动硬盘检测函数
//
//////////////////////////////////////////////////////////////////////////

unsigned char U_Disk_DETECT(void)
{

	BYTE i,j;
	
	sl811h_init();

	while(!SLAVE_ENUMERATED){
    		slave_detect();
		i++;
		if(i>0x10)   {
			Uart_SendString(" no usb dev!\n");//没有检测到USB设备 
			return  0x01;
    }

	
	if(uDev[1].bClass!=0x08){//1
		Uart_SendString("not u_disk!\n");//USB设备不是U盘
		return  0x02;
	}
	if(uDev[1].bNumOfEPs<2){//判断USB设备端点个数
		return 0x03;//USB设备不是U盘
	}
	
	Uart_SendString("******FOUND USB DEVICE******\n");
	Uart_SendString("endpoint testing ......\n");
	
	//确定端口的输入输出特性
	EPOut =0x00;
	EPIn  =0x00;	 
	if((uDev[1].bEPAddr[1]==0x01)&&(uDev[1].bEPAddr[2]==0x82)){
		EPOut =0x01;
		EPIn  =0x02;
	}
	if((uDev[1].bEPAddr[1]==0x81)&&(uDev[1].bEPAddr[2]==0x02)){
		EPOut =0x02;
		EPIn  =0x01;
	}
	if((EPOut==0x00)||(EPIn==0x00)){
		return 0x04;//USB设备不是U盘
	}
	//判断端点的传输特性,必须是批量传输
	if((uDev[1].bAttr[1]!=0x02)||(uDev[1].bAttr[2]!=0x02)){
		return 0x05;//USB设备不是U盘
	}

	
	OutPayLoad=uDev[1].wPayLoad[EPOut];
	InPayLoad=uDev[1].wPayLoad[EPIn];	
	
	//	Uart_Printf("%x,%x\n",OutPayLoad,InPayLoad);
	//	Get_LUN();//取得设备最大逻辑单元,对爱国者迷你王128M(U盘型),Max_LUN=1
	//	MaxLUN=MassStorageDataBuf[0];
	//	if(MaxLUN>1)  return 0x11;//USB设备不支持本通信协议for debug
	

	if(!UFLInquiry()){//获取设备信息
		return 0x06;//USB设备不支持本通信协议
	}

	i=0;
	while(i<20){
		if(UFLReadCapacity()) break;

		USB_Delay(200);				
		Reset_U();		//如果读取数据失败,则Reset USB设备和接口
		USB_Delay(200);				
		UFLRequestSense();
		
		USB_Delay(200);	
		i++;	
		
	}	
	if(i==20) return 0x07;//USB设备不支持本通信协

	
	Uart_SendString(" CONFIGER U_DISK SUCCESSFUL  !! \n");

	return  0x00;  //ok go out 

}}




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




⌨️ 快捷键说明

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