HPI.C
上传用户:jcsy2001
上传日期:2013-11-29
资源大小:201k
文件大小:30k
开发平台:

C/C++

  1. #include "common.h"
  2. #include "DEVICE.H"
  3. #include "HPI.H"
  4. #include "HAL.H"
  5. #include "Fat.h"
  6. #include "Fat32.h"
  7. #include "HPI32.H"
  8. extern FLAGS bdata bFlags;
  9. extern unsigned char xdata DBUF[BUFFER_LENGTH];
  10. //////////////////////////////////////////
  11. unsigned char xdata UARTBUF[UARTBUF_LENGTH];
  12. SYS_INFO_BLOCK xdata DeviceInfo;
  13. FILE_INFO xdata ThisFile;
  14. Command_Def xdata Command;
  15. Response_Def xdata Response;
  16. unsigned int xdata DirStartCluster,NowCluster;
  17. unsigned long xdata NowSector;
  18. ShowFileName_Def xdata ShowFileName[MaxLFNum]; //long file struct
  19. /////////////////////////////////////////////
  20. void UartSendRsp(void)
  21. {
  22. unsigned int i;
  23. unsigned char *pBuf=(unsigned char *)&Response;
  24. MCU_LED4=0;
  25. for(i=0;i<5;i++)
  26. ComSendByte(*(pBuf+i));
  27. if(Response.len!=0)
  28. {
  29. for(i=0;i<Response.len;i++)
  30. ComSendByte(UARTBUF[i]);
  31.     }
  32. MCU_LED4=1;
  33. }
  34. unsigned char UartHandler(void)
  35. {
  36.   Response.Result=0;Response.len=0;
  37.   switch(Command.CLass)
  38.   {
  39.     case 0x00: //List
  40.      Response.Result=List();
  41.      break;  
  42.    case 0x01: //Open File
  43.   Response.Result=OpenFile(Command.Parameter);
  44.       break;
  45. case 0x02: //Read File
  46. Response.Result=ReadFile(Command.len,UARTBUF);
  47. break;   
  48.     case 0x03: //Set Pointer
  49. Response.Result=SetFilePointer(Command.len);
  50. break;
  51. case 0x04: //Great File
  52. Response.Result=OpenFile(Command.Parameter);
  53. if(Response.Result)
  54. {
  55. Response.Result=SetFilePointer(ThisFile.LengthInByte);
  56. }
  57. else
  58.      Response.Result=CreateFile(Command.len,Command.Parameter,UARTBUF);    
  59.      break; 
  60. case 0x05: //Write File
  61.      Response.Result=WriteFile(Command.len,UARTBUF);
  62.      break; 
  63.     case 0x06: //Remove File
  64.      ThisFile.bFileOpen=0;
  65.      Response.Result=RemoveFile(Command.Parameter);
  66.      break; 
  67. case 0x07: //Get Space    
  68.      Response.Result=GetCapacity();
  69.      break;     
  70. case 0x08:  //DetectDisk
  71. if(bFlags.bits.SLAVE_IS_ATTACHED)
  72. Response.Result=1;
  73. break;
  74. case 0x09:  //Great Dir
  75. Response.Result=DownDir(Command.Parameter);
  76. if(!Response.Result)
  77. Response.Result=CreateDir(Command.len,Command.Parameter,UARTBUF);    
  78.      break; 
  79. case 0x0a: //Down Dir
  80. Response.Result=DownDir(Command.Parameter);
  81. break;
  82. case 0x0b: //Up Dir
  83. Response.Result=UpDir();
  84. break;
  85. case 0x0c: //Up RootDir
  86. Response.Result=UpRootDir();
  87. break;
  88.   }
  89.   UartSendRsp();
  90.   ///////////////////////////////
  91.   return TRUE;  
  92. }
  93. unsigned char List(void)
  94. {
  95. unsigned int item,i;
  96. unsigned char k,bstop,sector;
  97. unsigned char Lcount,Ncount,base;
  98. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  99. return FALSE;
  100. item=0;
  101. bstop=0;
  102. ////////////////////////////////////
  103. Lcount=0;
  104. for(i=0;i<MaxLFNum;i++)
  105. {
  106. ShowFileName[i].LongName[0]=0x00;
  107. ShowFileName[i].LongName[1]=0x00;
  108. }
  109. /////////////////////////////////////
  110. if(DirStartCluster==0) //Root Dir
  111. {
  112. for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
  113.     {   
  114. if(!SdReadSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  115. return FALSE;
  116. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  117. {
  118. if(DBUF[i]==0x00)
  119. {bstop=1;
  120. break;}
  121. else if(DBUF[i]==0xE5)
  122. continue;
  123. else
  124. {
  125. for(k=0;k<32;k++)
  126. UARTBUF[item*32+k]=DBUF[i+k];
  127. item=item+1;
  128.     if(item>=(UARTBUF_LENGTH/32))  {bstop=1;break;}  //串口缓冲 只能有512项目录,强行结束
  129. /////////////////////////////////
  130. if(Lcount<MaxLFNum)
  131. {
  132. if(DBUF[i+11]==0x0F)
  133. {
  134. base=((DBUF[i]&0x1F)-1)*26;
  135. if(base<=224)
  136. {
  137. Ncount=0;
  138. for(k=1;k<11;k++)
  139. {
  140. ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
  141. Ncount++;
  142. }
  143. for(k=14;k<26;k++)
  144. {
  145. ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
  146. Ncount++;
  147. }
  148. for(k=28;k<32;k++)
  149. {
  150. ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
  151. Ncount++;
  152. }
  153. }
  154. }
  155. else
  156. {
  157. for(k=0;k<32;k++)
  158. ShowFileName[Lcount].item[k]=DBUF[i+k];
  159.     Lcount++;
  160. }
  161. }//if(Lcount<MaxLFNum)
  162. /////////////////////////////////
  163. }
  164. }
  165. if(bstop==1)break;
  166.     }
  167. Response.len=item*32;
  168. return TRUE;
  169. }
  170. //////////////////////////////////////////////////////////////////   
  171. else //Son Dir
  172. {
  173. NowCluster=DirStartCluster;
  174. do
  175. {
  176. NowSector=FirstSectorofCluster(NowCluster);
  177. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  178.      {   
  179. if(!SdReadSector(NowSector+sector,1,DBUF))
  180. return FALSE;
  181. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  182. {
  183. if(DBUF[i]==0x00)
  184. {bstop=1;break;}
  185. else if(DBUF[i]==0xE5)
  186. continue;
  187. else
  188. {
  189. for(k=0;k<32;k++)
  190. UARTBUF[item*32+k]=DBUF[i+k];
  191. item=item+1;
  192. /////////////////////////////////
  193. if(DBUF[i+11]==0x0F)
  194. {
  195. base=((DBUF[i]&0x1F)-1)*26;
  196. if(base<=224)
  197. {
  198. Ncount=0;
  199. for(k=1;k<11;k++)
  200. {
  201. ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
  202. Ncount++;
  203. }
  204. for(k=14;k<26;k++)
  205. {
  206. ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
  207. Ncount++;
  208. }
  209. for(k=28;k<32;k++)
  210. {
  211. ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
  212. Ncount++;
  213. }
  214. }
  215. }
  216. else
  217. {
  218. for(k=0;k<32;k++)
  219. ShowFileName[Lcount].item[k]=DBUF[i+k];
  220.      Lcount++;
  221. }
  222. /////////////////////////////////
  223. }
  224. }
  225. if(bstop==1)break;
  226.      }
  227. if(bstop==1)break;
  228. NowCluster=GetNextClusterNum(NowCluster); 
  229. }while(NowCluster<=0xffef);
  230. Response.len=item*32;
  231. return TRUE;
  232. }
  233. }
  234. unsigned char OpenFile(unsigned char *pBuffer)
  235. {
  236. unsigned int i;
  237. unsigned char j,bstop,sector;
  238. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  239. return FALSE;
  240. ThisFile.bFileOpen=0;
  241. if(DirStartCluster==0) //Root Dir
  242. {
  243. for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
  244.     {   
  245. if(!SdReadSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  246. return FALSE;
  247. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  248. {
  249. if(DBUF[i]==0x00)
  250. return FALSE;
  251. j=0;
  252. while(DBUF[i+j]==*(pBuffer+j))
  253. {
  254.  j=j+1;
  255.  if(j>10)
  256.   break;
  257. }
  258. if(j>10&&(DBUF[i+11]&0x10)!=0x10)
  259.     {
  260.     for(j=0;j<32;j++)
  261.      UARTBUF[j]=DBUF[i+j];     
  262.     bstop=1;
  263.     break;}
  264. }
  265. if(bstop==1)break;
  266. }
  267.     
  268.     if(sector>=DeviceInfo.BPB_RootEntCnt)
  269.      return FALSE;
  270. }
  271. ///////////////////////////////////////////////////////////////////////////////////////
  272. else
  273. {
  274. NowCluster=DirStartCluster;
  275. do
  276. {
  277. NowSector=FirstSectorofCluster(NowCluster);
  278. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  279.      {   
  280. if(!SdReadSector(NowSector+sector,1,DBUF))
  281. return FALSE;
  282. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  283. {
  284. if(DBUF[i]==0x00)
  285. return FALSE;
  286. j=0;
  287. while(DBUF[i+j]==*(pBuffer+j))
  288. {
  289.  j=j+1;
  290.  if(j>10)
  291.   break;
  292. }
  293. if(j>10&&(DBUF[i+11]&0x10)!=0x10)
  294.      { 
  295. for(j=0;j<32;j++)
  296.      UARTBUF[j]=DBUF[i+j];     
  297.      bstop=1;
  298.      break;
  299. }
  300. }
  301. if(bstop==1)break;
  302.      }
  303. if(bstop==1)break;
  304. NowCluster=GetNextClusterNum(NowCluster);
  305. }while(NowCluster<=0xffef);
  306. if(NowCluster>0xffef)
  307.      return FALSE;
  308. }
  309. ThisFile.bFileOpen=1;
  310. ThisFile.StartCluster=LSwapINT16(UARTBUF[26],UARTBUF[27]);
  311. ThisFile.LengthInByte=LSwapINT32(UARTBUF[28],UARTBUF[29],UARTBUF[30],UARTBUF[31]);
  312. ThisFile.ClusterPointer=ThisFile.StartCluster;
  313. ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
  314. ThisFile.OffsetofSector=0;
  315. ThisFile.SectorofCluster=0;
  316. ThisFile.FatSectorPointer=0;
  317. ThisFile.pointer=0;
  318. Response.len=32;
  319. return TRUE;
  320. }
  321. unsigned char ReadFile(unsigned long readLength,unsigned char *pBuffer)
  322. {
  323. unsigned int len,i;
  324. unsigned int tlen;
  325. unsigned long blen;
  326. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  327. return FALSE;
  328. if(!ThisFile.bFileOpen)
  329. return FALSE;
  330. blen=readLength;
  331. tlen=0;
  332. if(readLength>MAX_READ_LENGTH)
  333. return FALSE;
  334. if(readLength+ThisFile.pointer>ThisFile.LengthInByte)
  335. return FALSE;
  336. ////////////////////////////////////////////
  337. while(readLength>0)
  338. {
  339.    if(readLength+ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec)
  340.     len=DeviceInfo.BPB_BytesPerSec;
  341.    else
  342.     len=readLength+ThisFile.OffsetofSector;
  343.    
  344.    //////////////////////////////////////////////////////
  345.    if(ThisFile.OffsetofSector>0)
  346.     {
  347.     if(SdReadSector(ThisFile.SectorPointer,1,DBUF))
  348.     {
  349.    
  350.     len=len-ThisFile.OffsetofSector;
  351.     for(i=0;i<len;i++)
  352.    
  353.     *(pBuffer+i)=DBUF[ThisFile.OffsetofSector+i];
  354.     ThisFile.OffsetofSector=ThisFile.OffsetofSector+len;
  355.     }
  356.     else
  357.     return FALSE;    
  358.     }
  359.    else
  360.     {
  361.     if(!SdReadSector(ThisFile.SectorPointer,1,pBuffer+tlen))
  362.     return FALSE;
  363.     ThisFile.OffsetofSector=len;
  364.     }
  365.    ////////////////////////////////////////////////////////////
  366.    readLength-=len;
  367.    tlen+=len;
  368.   
  369.    /////////////////////////////////////////////////////////
  370.    if(ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec-1)
  371.    {
  372.     ThisFile.OffsetofSector-=DeviceInfo.BPB_BytesPerSec;
  373.     ThisFile.SectorofCluster+=1;
  374.     if(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
  375.     {
  376.     ThisFile.SectorofCluster=0;
  377.    ThisFile.ClusterPointer=GetNextClusterNum(ThisFile.ClusterPointer);
  378.    if(ThisFile.ClusterPointer>0xffef)
  379.        return FALSE;    
  380.    ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.ClusterPointer); 
  381.     }
  382.     else
  383.     ThisFile.SectorPointer=ThisFile.SectorPointer+1;
  384.     }
  385.    //////////////////////////////////////////////////////////////////
  386. }//end while
  387. ThisFile.bFileOpen=1;
  388. ThisFile.pointer+=tlen;
  389. //////////////////////////////////////////////
  390. Response.len=blen;
  391. return TRUE;
  392. }
  393. unsigned char SetFilePointer(unsigned long pointer)
  394. {
  395. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  396. return FALSE;
  397. if(!ThisFile.bFileOpen)
  398. return FALSE;
  399. ///////////////////////////////////////////////////////////
  400. ThisFile.pointer=pointer;
  401. if(ThisFile.pointer>ThisFile.LengthInByte)
  402. return FALSE;
  403. if(!GoToPointer(ThisFile.pointer))
  404. {
  405. ThisFile.bFileOpen=0;
  406. return FALSE;
  407. }
  408. //////////////////////////////////////////////
  409. return TRUE;
  410. }
  411. unsigned char CreateFile(unsigned long len,unsigned char *pBuffer,unsigned char *pName)
  412. {
  413. unsigned int sector,i,j,DirCount;
  414. unsigned int cnum,ClusterPointer;
  415. unsigned char xdata bstop,InByte,bwrite;
  416. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  417. return FALSE;
  418. if((len%32)!=0)
  419. return FALSE;
  420. if((len+32)>DeviceInfo.BPB_BytesPerSec)
  421. return FALSE;
  422. ThisFile.bFileOpen=0;
  423. cnum=GetFreeCusterNum();
  424. if(cnum<0x02)
  425. return FALSE;
  426. pBuffer[26]=(unsigned char)(cnum);
  427. pBuffer[27]=(unsigned char)(cnum>>8);
  428. pBuffer[28]=0;pBuffer[29]=0;pBuffer[30]=0;pBuffer[31]=0;
  429. bstop=0;
  430. if(DirStartCluster==0)
  431. {
  432. /////// Search a free space in the root dir space and build the item ///
  433. for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
  434.     {   
  435. if(!SdReadSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  436. return FALSE;
  437. DirCount=0;bwrite=0;
  438. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  439. {
  440. if(len==0)
  441. {
  442. if((DBUF[i]==0x00)||(DBUF[i]==0xE5))
  443. {
  444. for(j=0;j<32;j++)
  445. DBUF[i+j]=*(pBuffer+j);
  446. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  447.      return FALSE;     
  448. bstop=1;
  449. break;
  450. }
  451. }
  452. else
  453. {
  454. if(DirCount==0)
  455. InByte=i;
  456. if(DBUF[i]==0xE5)
  457. DirCount++;
  458. else if(DBUF[i]==0x00)
  459. {
  460. DirCount++;
  461. DBUF[i]=0xE5;
  462. bwrite=1;
  463. }
  464. else
  465. DirCount=0;
  466. if((DirCount*32)>=(len+32))
  467. {
  468. for(j=0;j<len;j++)
  469. DBUF[InByte+j]=*(pName+j);
  470. for(j=0;j<32;j++)
  471. DBUF[InByte+len+j]=*(pBuffer+j);
  472. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  473.      return FALSE;     
  474. bstop=1;
  475. break;
  476. }
  477.  }
  478. }
  479. if(bstop==1)break;
  480. if((len!=0)&&(bwrite==1))
  481. {
  482. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  483.    return FALSE;
  484.      }
  485. }
  486. if(sector>=DeviceInfo.BPB_RootEntCnt)
  487. return FALSE;
  488. }
  489. ////////////////////////////////////////////////////////////
  490. else
  491. {
  492. NowCluster=DirStartCluster;
  493. do
  494. {
  495. NowSector=FirstSectorofCluster(NowCluster);
  496. ClusterPointer=NowCluster;
  497. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  498.      {   
  499. if(!SdReadSector(NowSector+sector,1,DBUF))
  500. return FALSE;
  501. DirCount=0;bwrite=0;
  502. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  503. {
  504. if(len==0)
  505. {
  506. if((DBUF[i]==0x00)||(DBUF[i]==0xE5))
  507. {
  508. for(j=0;j<32;j++)
  509. DBUF[i+j]=*(pBuffer+j);
  510. if(!SdWriteSector(NowSector+sector,1,DBUF))
  511.      return FALSE;     
  512. bstop=1;
  513. break;
  514. }
  515. }
  516. else
  517. {
  518. if(DirCount==0)
  519. InByte=i;
  520. if(DBUF[i]==0xE5)
  521. DirCount++;
  522. else if(DBUF[i]==0x00)
  523. {
  524. DirCount++;
  525. DBUF[i]=0xE5;
  526. bwrite=1;
  527. }
  528. else
  529. DirCount=0;
  530. if((DirCount*32)>=(len+32))
  531. {
  532. for(j=0;j<len;j++)
  533. DBUF[InByte+j]=*(pName+j);
  534. for(j=0;j<32;j++)
  535. DBUF[InByte+len+j]=*(pBuffer+j);
  536. if(!SdWriteSector(NowSector+sector,1,DBUF))
  537.      return FALSE;     
  538. bstop=1;
  539. break;
  540. }
  541.  }
  542. }
  543. if(bstop==1)break;
  544. if((len!=0)&&(bwrite==1))
  545. {
  546. if(!SdWriteSector(NowSector+sector,1,DBUF))
  547.    return FALSE;
  548.      }
  549.      }
  550. if(bstop==1)break;
  551. NowCluster=GetNextClusterNum(NowCluster);
  552. if(NowCluster>0xffef)
  553.      {
  554. NowCluster=CreateClusterLink(ClusterPointer);
  555.   if(NowCluster==0x00)
  556.    return FALSE;
  557. NowSector=FirstSectorofCluster(NowCluster);
  558. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i++) DBUF[i]=0x00;
  559. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  560. {
  561. if(!SdWriteSector(NowSector+sector,1,DBUF))
  562.      return FALSE;
  563. }
  564. }
  565. }while(NowCluster<=0xffef);
  566. if(NowCluster>0xffef)
  567.     return FALSE;
  568. }
  569. ////////////////////////////////////////////////////////////////
  570. ThisFile.StartCluster=cnum;
  571. ThisFile.LengthInByte=0;
  572. ThisFile.ClusterPointer=ThisFile.StartCluster;
  573. ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
  574. ThisFile.OffsetofSector=0;
  575. ThisFile.SectorofCluster=0;
  576. ThisFile.bFileOpen=1;
  577. ThisFile.pointer=0;
  578. ThisFile.FatSectorPointer=0;
  579. return TRUE;
  580. }
  581. unsigned char WriteFile(unsigned long writeLength,unsigned char *pBuffer)
  582. {
  583. unsigned int  len,sector,i,cnum,tlen;
  584. unsigned char bSuccess,bStop;
  585. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  586. return FALSE;
  587. if(!ThisFile.bFileOpen)
  588. return FALSE;
  589. ThisFile.bFileOpen=0;
  590. bSuccess=1;
  591. bStop=0;
  592. tlen=0;
  593. while(writeLength>0)
  594. {
  595. if(writeLength+ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec)
  596.     len=DeviceInfo.BPB_BytesPerSec;
  597. else
  598.     len=writeLength+ThisFile.OffsetofSector;
  599.    
  600.  //////////////////////////////////////////////////////
  601.  if(ThisFile.OffsetofSector>0)
  602.   {
  603.   if(SdReadSector(ThisFile.SectorPointer,1,DBUF))
  604.     {
  605.    
  606.     len=len-ThisFile.OffsetofSector;
  607.     for(i=0;i<len;i++)
  608.    
  609.     DBUF[ThisFile.OffsetofSector+i]=*(pBuffer+i);
  610.     if(!SdWriteSector(ThisFile.SectorPointer,1,DBUF))
  611.     return FALSE;    
  612.     ThisFile.OffsetofSector=ThisFile.OffsetofSector+len;
  613.     }
  614.     else
  615.     return FALSE;    
  616.   }
  617.  else
  618.   {
  619.   if(!SdWriteSector(ThisFile.SectorPointer,1,pBuffer+tlen))
  620.     return FALSE;    
  621.     ThisFile.OffsetofSector=len;
  622.   }
  623.  /////////////////////////////////////////////////////
  624.    writeLength-=len;
  625.    tlen+=len;
  626.  /////////////更新文件指针 //////////////////////////////
  627.   if(ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec-1)
  628.    {
  629.     ThisFile.OffsetofSector-=DeviceInfo.BPB_BytesPerSec;
  630.     ThisFile.SectorofCluster+=1;
  631.     if(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
  632.     {
  633.     ThisFile.SectorofCluster=0;
  634.    ThisFile.ClusterPointer=CreateClusterLink(ThisFile.ClusterPointer);
  635.    if(ThisFile.ClusterPointer==0x00)
  636.     return FALSE;  
  637.    ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.ClusterPointer); 
  638.     }
  639.     else
  640.     ThisFile.SectorPointer=ThisFile.SectorPointer+1;
  641.     }
  642. }//end while
  643. ThisFile.pointer+=tlen;
  644.     DelayMs(200);
  645. ///////////更新文件目录信息/////////////////////////////
  646. if(bSuccess==1)
  647. {
  648. if(DirStartCluster==0)
  649. {
  650. for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
  651.      {   
  652. //////////////////////////////////////////////////
  653. if(!SdReadSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  654. return FALSE;
  655. ///////////////////////////////////////////////////
  656. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  657. {
  658. cnum=LSwapINT16(DBUF[i+26],DBUF[i+27]);
  659. if((cnum==ThisFile.StartCluster)&&(DBUF[i]!=0xe5))
  660. {
  661. if(ThisFile.pointer>ThisFile.LengthInByte)
  662. ThisFile.LengthInByte=ThisFile.pointer;
  663. DBUF[i+28]=(unsigned char)(ThisFile.LengthInByte&0xff);
  664. DBUF[i+29]=(unsigned char)((ThisFile.LengthInByte>>8)&0xff);
  665. DBUF[i+30]=(unsigned char)((ThisFile.LengthInByte>>16)&0xff);
  666. DBUF[i+31]=(unsigned char)((ThisFile.LengthInByte>>24)&0xff);
  667. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  668.     return FALSE;    
  669.  bStop=1;
  670.  break;
  671. }
  672. }
  673. if(bStop==1)
  674. break;
  675.        }
  676. }
  677. //////////////////////////////////////////////////////////////////////////////
  678. else
  679. {
  680. NowCluster=DirStartCluster;
  681. do
  682. {
  683. NowSector=FirstSectorofCluster(NowCluster);
  684. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  685.       {   
  686. if(!SdReadSector(NowSector+sector,1,DBUF))
  687. return FALSE;
  688. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  689. {
  690. cnum=LSwapINT16(DBUF[i+26],DBUF[i+27]);
  691. if((cnum==ThisFile.StartCluster)&&(DBUF[i]!=0xe5))
  692. {
  693. if(ThisFile.pointer>ThisFile.LengthInByte)
  694. ThisFile.LengthInByte=ThisFile.pointer;
  695. DBUF[i+28]=(unsigned char)(ThisFile.LengthInByte&0xff);
  696. DBUF[i+29]=(unsigned char)((ThisFile.LengthInByte>>8)&0xff);
  697. DBUF[i+30]=(unsigned char)((ThisFile.LengthInByte>>16)&0xff);
  698. DBUF[i+31]=(unsigned char)((ThisFile.LengthInByte>>24)&0xff);
  699. if(!SdWriteSector(NowSector+sector,1,DBUF))
  700.     return FALSE;    
  701.  bStop=1;
  702.  break;
  703. }
  704.      }
  705. if(bStop==1)break;
  706. }
  707. if(bStop==1)break;
  708. NowCluster=GetNextClusterNum(NowCluster);
  709. }while(NowCluster<=0xffef);
  710. if(NowCluster>0xffef)
  711.      return FALSE;
  712. }
  713. }
  714. ThisFile.bFileOpen=1;
  715. //////////////////////////////////////////////
  716. return TRUE;
  717. }
  718. unsigned char RemoveFile(unsigned char *pBuffer)
  719. {
  720. unsigned int sector,i;
  721. unsigned char bStop,j;
  722. int k;
  723. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  724. return FALSE;
  725. if(DirStartCluster==0)
  726. {
  727. ////////////// 清除目录/////////////////////////////////////
  728. for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
  729.      {   
  730. //////////////////////////////////////////////////
  731. if(!SdReadSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  732. return FALSE;
  733. ///////////////////////////////////////////////////
  734. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  735. {
  736. if(DBUF[i]==0x00)
  737. return FALSE;
  738. ///////////////////////////////////////////
  739. j=0;
  740. while(DBUF[i+j]==*(pBuffer+j))
  741. {
  742.  j=j+1;
  743.  if(j>10) break;
  744.  }
  745. if(j>10)
  746.   {
  747.   DBUF[i]=0xE5;
  748.   ThisFile.StartCluster=LSwapINT16(DBUF[i+26],DBUF[i+27]);
  749. for(k=(i-32);k>=0;k=k-32)
  750. {
  751. if(DBUF[k+11]==0x0F)
  752. DBUF[k]=0xE5;
  753. else
  754. break;
  755. }
  756. DelayMs(15);
  757. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  758. return FALSE;
  759. /*
  760.   k=sector-1;
  761. if(k>=0)
  762. {
  763. if(!SdReadSector(DeviceInfo.RootStartSector+k,1,DBUF))
  764. return FALSE;
  765. for(k=DeviceInfo.BPB_BytesPerSec;k>=0;k=k-32)
  766. {
  767. if(DBUF[k+11]==0x0F)
  768. DBUF[k]=0xE5;
  769. else
  770. break;
  771. }
  772. // DelayMs(15);
  773.   if(!SdWriteSector(DeviceInfo.RootStartSector+sector-1,1,DBUF))
  774. return FALSE;
  775. }
  776. */
  777. //////////////////// 清除FAT中的纪录////////////////////////
  778. DelayMs(10);
  779. if(!DeleteClusterLink(ThisFile.StartCluster))
  780. return FALSE;
  781.   bStop=1;
  782.   break;
  783.   }
  784. }//end for
  785. if(bStop==1)
  786. break;
  787.        }//end search
  788. if(sector>=DeviceInfo.BPB_RootEntCnt)
  789. return FALSE;
  790. }
  791. else
  792. {
  793. NowCluster=DirStartCluster;
  794. do
  795. {
  796. NowSector=FirstSectorofCluster(NowCluster);
  797. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  798.      {   
  799. if(!SdReadSector(NowSector+sector,1,DBUF))
  800. return FALSE;
  801. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  802. {
  803. if(DBUF[i]==0x00)
  804. return FALSE;
  805. j=0;
  806. while(DBUF[i+j]==*(pBuffer+j))
  807. {
  808.  j=j+1;
  809.  if(j>10)
  810.   break;
  811. }
  812. if(j>10)
  813.      { 
  814. DBUF[i]=0xE5;
  815.   ThisFile.StartCluster=LSwapINT16(DBUF[i+26],DBUF[i+27]);
  816. for(k=(i-32);k>=0;k=k-32)
  817. {
  818. if(DBUF[k+11]==0x0F)
  819. DBUF[k]=0xE5;
  820. else
  821. break;
  822. }
  823.   DelayMs(15);
  824.   if(!SdWriteSector(NowSector+sector,1,DBUF))
  825. return FALSE;
  826. //////////////////// 清除FAT中的纪录////////////////////////
  827. DelayMs(10);
  828. if(!DeleteClusterLink(ThisFile.StartCluster))
  829. return FALSE;
  830.   bStop=1;
  831.   break;
  832. }
  833. }
  834. if(bStop==1)break;
  835.      }
  836. if(bStop==1)break;
  837. NowCluster=GetNextClusterNum(NowCluster);
  838. }while(NowCluster<=0xffef);
  839. if(NowCluster>0xffef)
  840.      return FALSE;
  841. }
  842. return TRUE;
  843. }
  844. unsigned char GetCapacity(void)
  845. {
  846. unsigned int sectorNum,i;
  847. unsigned long FreeSize,Freesectorcnt;
  848. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  849. return FALSE;
  850. ////////////////////////////////////////////////////////////////////////
  851. sectorNum=DeviceInfo.FatStartSector;
  852. Freesectorcnt=0;
  853. while(sectorNum<DeviceInfo.BPB_FATSz16+DeviceInfo.FatStartSector)
  854. {
  855. if(SdReadSector(sectorNum,1,DBUF))
  856. {
  857.   for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+2)
  858.    {     
  859.     if((DBUF[i]==0x00)&&(DBUF[i+1]==0x00))
  860.      {
  861.      Freesectorcnt++;
  862.      }   
  863.    }
  864. }
  865. else
  866. return FALSE;
  867. sectorNum++;
  868. }
  869. ////////////////////////////////////////////////////////////////////////
  870. FreeSize=DeviceInfo.BPB_BytesPerSec*DeviceInfo.BPB_SecPerClus;
  871. FreeSize=Freesectorcnt*FreeSize;
  872. UARTBUF[0]=(unsigned char)((FreeSize>>24)&0xff);
  873. UARTBUF[1]=(unsigned char)((FreeSize>>16)&0xff);
  874. UARTBUF[2]=(unsigned char)((FreeSize>>8)&0xff);
  875. UARTBUF[3]=(unsigned char)(FreeSize&0xff);
  876. Response.len=4;
  877. return TRUE;
  878. }
  879. unsigned char CreateDir(unsigned long len,unsigned char *pBuffer,unsigned char *pName)
  880. {
  881. unsigned int sector,i,j,DirCount;
  882. unsigned int cnum,ClusterPointer;
  883. unsigned char xdata bstop,InByte,bwrite;
  884. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  885. return FALSE;
  886. if((len%32)!=0)
  887. return FALSE;
  888. if((len+32)>DeviceInfo.BPB_BytesPerSec)
  889. return FALSE;
  890. ThisFile.bFileOpen=0;
  891. ThisFile.FatSectorPointer=0;
  892. cnum=GetFreeCusterNum();
  893. if(cnum<0x02)
  894. return FALSE;
  895. pBuffer[11]=0x10;
  896. pBuffer[26]=(unsigned char)(cnum);
  897. pBuffer[27]=(unsigned char)(cnum>>8);
  898. pBuffer[28]=0;pBuffer[29]=0;pBuffer[30]=0;pBuffer[31]=0;
  899. bstop=0;
  900. if(DirStartCluster==0)
  901. {
  902. /////// Search a free space in the root dir space and build the item ///
  903. for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
  904.     {   
  905. if(!SdReadSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  906. return FALSE;
  907. DirCount=0;bwrite=0;
  908. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  909. {
  910. if(len==0)
  911. {
  912. if((DBUF[i]==0x00)||(DBUF[i]==0xE5))
  913. {
  914. for(j=0;j<32;j++)
  915. DBUF[i+j]=*(pBuffer+j);
  916. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  917.      return FALSE;     
  918. bstop=1;
  919. break;
  920. }
  921. }
  922. else
  923. {
  924. if(DirCount==0)
  925. InByte=i;
  926. if(DBUF[i]==0xE5)
  927. DirCount++;
  928. else if(DBUF[i]==0x00)
  929. {
  930. DirCount++;
  931. DBUF[i]=0xE5;
  932. bwrite=1;
  933. }
  934. else
  935. DirCount=0;
  936. if((DirCount*32)>=(len+32))
  937. {
  938. for(j=0;j<len;j++)
  939. DBUF[InByte+j]=*(pName+j);
  940. for(j=0;j<32;j++)
  941. DBUF[InByte+len+j]=*(pBuffer+j);
  942. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  943.      return FALSE;     
  944. bstop=1;
  945. break;
  946. }
  947.  }
  948. }
  949. if(bstop==1)break;
  950. if((len!=0)&&(bwrite==1))
  951. {
  952. if(!SdWriteSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  953.    return FALSE;
  954.      }
  955.     }
  956. if(sector>=DeviceInfo.BPB_RootEntCnt)
  957. return FALSE;
  958. }
  959. ////////////////////////////////////////////////////////////
  960. else
  961. {
  962. NowCluster=DirStartCluster;
  963. do
  964. {
  965. NowSector=FirstSectorofCluster(NowCluster);
  966. ClusterPointer=NowCluster;
  967. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  968.      {   
  969. if(!SdReadSector(NowSector+sector,1,DBUF))
  970. return FALSE;
  971. DirCount=0;bwrite=0;
  972. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  973. {
  974. if(len==0)
  975. {
  976. if((DBUF[i]==0x00)||(DBUF[i]==0xE5))
  977. {
  978. for(j=0;j<32;j++)
  979. DBUF[i+j]=*(pBuffer+j);
  980. if(!SdWriteSector(NowSector+sector,1,DBUF))
  981.      return FALSE;     
  982. bstop=1;
  983. break;
  984. }
  985. }
  986. else
  987. {
  988. if(DirCount==0)
  989. InByte=i;
  990. if(DBUF[i]==0xE5)
  991. DirCount++;
  992. else if(DBUF[i]==0x00)
  993. {
  994. DirCount++;
  995. DBUF[i]=0xE5;
  996. bwrite=1;
  997. }
  998. else
  999. DirCount=0;
  1000. if((DirCount*32)>=(len+32))
  1001. {
  1002. for(j=0;j<len;j++)
  1003. DBUF[InByte+j]=*(pName+j);
  1004. for(j=0;j<32;j++)
  1005. DBUF[InByte+len+j]=*(pBuffer+j);
  1006. if(!SdWriteSector(NowSector+sector,1,DBUF))
  1007.      return FALSE;     
  1008. bstop=1;
  1009. break;
  1010. }
  1011.  }
  1012. }
  1013. if(bstop==1)break;
  1014. if((len!=0)&&(bwrite==1))
  1015. {
  1016. if(!SdWriteSector(NowSector+sector,1,DBUF))
  1017.    return FALSE;
  1018.      }
  1019.      }
  1020. if(bstop==1)break;
  1021. NowCluster=GetNextClusterNum(NowCluster);
  1022. if(NowCluster>0xffef)
  1023.      {
  1024. NowCluster=CreateClusterLink(ClusterPointer);
  1025.   if(NowCluster==0x00)
  1026.    return FALSE;
  1027. NowSector=FirstSectorofCluster(NowCluster);
  1028. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i++) DBUF[i]=0x00;
  1029. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  1030. {
  1031. if(!SdWriteSector(NowSector+sector,1,DBUF))
  1032.      return FALSE;
  1033. }
  1034. }
  1035. }while(NowCluster<=0xffef);
  1036. if(NowCluster>0xffef)
  1037.     return FALSE;
  1038. }
  1039. ////////////////////////////////////////////////////////////////
  1040. for(i=64;i<DeviceInfo.BPB_BytesPerSec;i++) DBUF[i]=0x00;
  1041. for(i=0;i<43;i++) DBUF[i]=0x20;
  1042. DBUF[0]=0x2e;
  1043. for(i=11;i<32;i++) DBUF[i]=pBuffer[i];
  1044. DBUF[32]=0x2e;DBUF[33]=0x2e;
  1045. for(i=43;i<64;i++) DBUF[i]=pBuffer[i-32];
  1046. DBUF[58]=(unsigned char)(DirStartCluster);
  1047. DBUF[59]=(unsigned char)(DirStartCluster>>8);
  1048. NowSector=FirstSectorofCluster(cnum);
  1049. if(!SdWriteSector(NowSector,1,DBUF))
  1050. return FALSE;
  1051. DirStartCluster=cnum;
  1052. // ThisFile.ClusterPointer=DirStartCluster;
  1053. ThisFile.ClusterPointer=0;
  1054. return TRUE;
  1055. }
  1056. unsigned char DownDir(unsigned char *pBuffer)
  1057. {
  1058. unsigned int i;
  1059. unsigned char j,bstop,sector;
  1060. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  1061. return FALSE;
  1062. ThisFile.bFileOpen=0;
  1063. bstop=0;
  1064. if(DirStartCluster==0) //Root Dir
  1065. {
  1066. for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
  1067.     {   
  1068. if(!SdReadSector(DeviceInfo.RootStartSector+sector,1,DBUF))
  1069. return FALSE;
  1070. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  1071. {
  1072. if(DBUF[i]==0x00)
  1073. return FALSE;
  1074. j=0;
  1075. while(DBUF[i+j]==*(pBuffer+j))
  1076. {
  1077.  j=j+1;
  1078.  if(j>10)
  1079.   break;
  1080. }
  1081. if(j>10&&(DBUF[i+11]&0x10))
  1082.     {    
  1083.     bstop=1;
  1084.      break;}
  1085. }
  1086. if(bstop==1)break;
  1087.     }
  1088.     
  1089.     if(sector>=DeviceInfo.BPB_RootEntCnt)
  1090.      return FALSE;
  1091.     
  1092. DirStartCluster=LSwapINT16(DBUF[i+26],DBUF[i+27]);
  1093. // ThisFile.ClusterPointer=DirStartCluster;
  1094. ThisFile.ClusterPointer=0;
  1095. return TRUE;
  1096. }
  1097. ////////////////////////////////////////////
  1098. else
  1099. {
  1100. NowCluster=DirStartCluster;
  1101. do
  1102. {
  1103. NowSector=FirstSectorofCluster(NowCluster);
  1104. for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
  1105.      {   
  1106. if(!SdReadSector(NowSector+sector,1,DBUF))
  1107. return FALSE;
  1108. for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
  1109. {
  1110. if(DBUF[i]==0x00)
  1111. return FALSE;
  1112. j=0;
  1113. while(DBUF[i+j]==*(pBuffer+j))
  1114. {
  1115.  j=j+1;
  1116.  if(j>10)
  1117.   break;
  1118. }
  1119. if(j>10&&(DBUF[i+11]&0x10))
  1120.      {bstop=1;break;}
  1121. }
  1122. if(bstop==1)break;
  1123.      }
  1124. if(bstop==1)break;
  1125. NowCluster=GetNextClusterNum(NowCluster);
  1126. }while(NowCluster<=0xffef);
  1127. if(NowCluster>0xffef)
  1128.      return FALSE;
  1129. DirStartCluster=LSwapINT16(DBUF[i+26],DBUF[i+27]);
  1130. // ThisFile.ClusterPointer=DirStartCluster;
  1131. ThisFile.ClusterPointer=0;
  1132. return TRUE;
  1133. }
  1134. }
  1135. unsigned char UpDir()
  1136. {
  1137. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  1138. return FALSE;
  1139. if(DirStartCluster==0) //Root Dir
  1140. return TRUE;
  1141. ThisFile.bFileOpen=0;
  1142. NowSector=FirstSectorofCluster(DirStartCluster);
  1143. if(!SdReadSector(NowSector,1,DBUF))
  1144. return FALSE;
  1145. if(DBUF[32]!=0x2e&&DBUF[33]!=0x2e) //..
  1146. return FALSE;
  1147. DirStartCluster=LSwapINT16(DBUF[58],DBUF[59]);
  1148. // ThisFile.ClusterPointer=DirStartCluster;
  1149. ThisFile.ClusterPointer=0;
  1150. return TRUE;
  1151. }
  1152. unsigned char UpRootDir()
  1153. {
  1154. if(!bFlags.bits.SLAVE_IS_ATTACHED)
  1155. return FALSE;
  1156. ThisFile.bFileOpen=0;
  1157. DirStartCluster=0; //Root Dir
  1158. return TRUE;
  1159. }