📄 u_disk.c
字号:
{
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 + -