hdd_fs.c
上传用户:poi891205
上传日期:2013-07-15
资源大小:9745k
文件大小:14k
源码类别:

DVD

开发平台:

C/C++

  1. /*=================================================================
  2.   hdd_fs.c: Some FileSystem Info Function for HDD
  3.   
  4. 2002-04-28 10:00AM Created  by Verdure
  5. 2002-06-12 08:42AM Modified by cyue
  6.   Copyright(c)2000-2002 by Worldplus Technology (ShenZhen) Co., Ltd.
  7.   ALL RIGHTS RESERVED
  8. =================================================================*/
  9. //#include <string.h>
  10. #include <math.h>
  11. #include "config.h"
  12. #include "set.h"
  13. #include "global.h"
  14. #include "hdd_if.h"
  15. #include "hdd_info.h"
  16. #include "stdlib.h"
  17. #ifdef USE_HDD // cyue: Skip code if not use hdd!!
  18. #define DBG_HDD_FS
  19. #ifndef DBG_HDD_FS
  20. #undef printf
  21. #define printf(f, a...)  {}
  22. #endif
  23. #undef print_block
  24. #define print_block(x,y) {}
  25. UINT8  FS_Emu_stricmp(UINT8* s1, UINT8* s2)
  26. {
  27.     UINT16 i;
  28. #if 1
  29.     for(i=0;(i<11);i++,s1++,s2++)
  30.     { if((!*s1)&&(!*s2))
  31. return 0;
  32. if(((*s1)&~0x20)!=((*s2)&~0x20))
  33. return 1;
  34.     }
  35.     //printf("Match: %s -- %s n",s1-11,s2-11);
  36.     return 0;
  37. #else
  38.     //while(i<11)
  39.     while(string1[i]!=''||string2[i]!='')
  40.     {
  41. if(string1[i]==string2[i])
  42. i += 1;
  43. else if((string1[i]>=0x41&&string1[i]<=0x5A)||(string1[i]>=0x61&&string1[i]<=0x7A))
  44.             if(abs(string1[i]-string2[i])==0x20) 
  45.    i += 1;
  46.    else return 1;
  47.    else return 1;
  48.     }
  49.     return 0;
  50. #endif
  51. }
  52. UINT8  HDD_Mount(void)
  53. {
  54.     //HDD_Reset(); //cyue: need reset too? 2002-07-03 11:10AM
  55.     
  56.     HD_EXIST = HDD_DEV_Existence();
  57.     if (!HD_EXIST)
  58.     {
  59. HDD_MakeInfo(&HDD_Info,Info_buff);
  60. printf("nStart_LBA:%dn",Start_LBA);
  61. FS_ReadInfoSec(Start_LBA,1);
  62. FS_check_BootSec(Info_buff);
  63. return 1;
  64.     }
  65.     return 0;
  66.     
  67. //    return 1;
  68. }
  69. void  HDD_Backup_FAT(void)
  70. {
  71.     UINT32 i=BPB.FATSize32;
  72.     UINT16 SecCnt,j;
  73.     SecCnt=sizeof(Info_buff)>>BPB.BytesPerSecPwr;
  74.     
  75.     if(BPB.NumFATs==2)
  76.     {
  77. if(i%SecCnt)
  78. {
  79. FS_ReadInfoSec(BPB.FAT1_Start,i%SecCnt);
  80. HDD_WriteSec(Info_buff,BPB.FAT2_Start,i%SecCnt);
  81. for(j=(i%SecCnt),i-=(i%SecCnt);i>0;i-=SecCnt,j+=SecCnt)
  82. {
  83. FS_ReadInfoSec(BPB.FAT1_Start+j,SecCnt);
  84. HDD_WriteSec(Info_buff,BPB.FAT2_Start+j,SecCnt);
  85. }
  86. }
  87. else for(j=0;i>0;i-=SecCnt,j+=SecCnt)
  88. {
  89. FS_ReadInfoSec(BPB.FAT1_Start+j,SecCnt);
  90. HDD_WriteSec(Info_buff,BPB.FAT2_Start+j,SecCnt);
  91. }
  92.     }
  93. }
  94. PLAY_BLOCK *HDD_BuildPlayBlock(FILE_INFO *pfdb,PLAY_BLOCK *pblock)
  95. {
  96. // Generate Cluster blocks of this file
  97. UINT32 st,next,lba_count=LBA_COUNT(pfdb->fsize),sec_count=BPB.SecPerClus; 
  98. int i;
  99. for(i=0,st=pfdb->start_clus,next=0;
  100. i<MAX_FILE_LINK_ITEM;
  101. i++)
  102. { pblock->block[i].lba=0;// End Mark first
  103. pblock->block[i].len=0;
  104. if(st>=0x0FFFFFFF)//End?
  105. { break;
  106. }
  107. pblock->block[i].lba=FS_Clus2LBA(st);
  108. do
  109. { if(lba_count>=sec_count)
  110. { pblock->block[i].len+=sec_count;
  111. lba_count-=sec_count;
  112. }
  113. else
  114. { pblock->block[i].len+=lba_count;
  115. }
  116. //printf("n$$ next clus:0x%lx ",next);
  117. next=FS_Get_NextClus(st);
  118. st++;
  119. // cyue test multiblock!! 2002-06-17 03:26PM
  120. //if(pblock->block[i].len>0x4000)
  121. // st=0;
  122. }
  123. while(next==st);
  124. st=next;
  125. }
  126. pblock->curr_blk=0; pblock->curr_lba=pblock->block[0].lba;
  127. #ifdef DBG_HDD_FS
  128. for(i=0;i<MAX_FILE_LINK_ITEM;i++)
  129. { if(!(pblock->block[i].lba)) break;
  130. printf("### Blk:%d lba:0x%lx len:0x%lxn",
  131. i,pblock->block[i].lba,pblock->block[i].len);
  132. }
  133. #endif
  134. return pblock;
  135. }
  136. FILE_INFO *GetFileInfo(FAT32_FDB *fdb,FILE_INFO *pfinfo)
  137. {
  138. UINT16 i;
  139. printf(__FUNCTION__);
  140. #if 0
  141. // copy Filename (8.3 format)
  142. { UINT8 *d,*s;
  143. for(i=0,d=pfinfo->name,s=(UINT8*)fdb
  144. ;i<11; i++,d++,s++)
  145. *d=*s;
  146. *d=0;
  147. }
  148. #endif
  149. Data_Start_Clus=pfinfo->start_clus=(UINT32)((fdb->start_hi)<<16|(fdb->start_lo));
  150. if(pfinfo->start_clus==0) //cyue: '..' to root!!
  151. {
  152. printf(" It's Root !! ");
  153. Data_Start_Clus=pfinfo->start_clus=BPB.RootClus;
  154. }
  155. pfinfo->start_lba=FS_Clus2LBA(pfinfo->start_clus);//((pfinfo->start_clus-2)<<BPB.SecPerClusPwr)+BPB.Data_Area_Start;
  156. pfinfo->fsize=fdb->fsize;
  157. pfinfo->attrib=fdb->attrib;
  158. i=BPB.BytesPerSecPwr;
  159. #ifdef DBG_HDD_FS
  160. printf("### start_lba: 0x%lxn### size: 0x%lx start_clus 0x%lxnn",
  161. pfinfo->start_lba,
  162. pfinfo->fsize,
  163. pfinfo->start_clus);
  164. #endif
  165. return pfinfo;
  166. }
  167. /*
  168. ========================================================
  169. =  FILE_INFO*  SearchFile(UINT32 dir_clus,UINT8 *name)
  170. =      Search file(or subdir) in dir_clus cluster
  171. =  ARGUMENT(S):
  172. =      UINT32  dir_clus: the start cluster of dir to search file
  173. =      UINT8   *fname: filename to play, 11 CHAR in 8.3 
  174. =                     format
  175. =  RETURN VALUE:
  176. =      FILE_INFO: info of this file.
  177. =  GLOBAL USING:
  178. =      Info_buff: buffer to read a sector (512 bytes)
  179. =      BPB: HD infos
  180. =  SIDE EFFECT:
  181. =      Info_buff: Contains Last FDB Sector that have this file
  182. =      Data_Start_Clus: first clustor of file 
  183. =  2002-06-12 08:38AM Modified by cyue
  184. =                     play continue LBAs currently 
  185. ========================================================
  186. */
  187. FILE_INFO* SearchFile(UINT32 dir_clus,UINT8 *name)
  188. {
  189. UINT32 lba;
  190. UINT32 i,offset;
  191. static FILE_INFO finfo;
  192. for(;dir_clus<0x0FFFFFFF;dir_clus=FS_Get_NextClus(dir_clus))
  193. {
  194. lba=FS_Clus2LBA(dir_clus);
  195. for(i=BPB.SecPerClus;i;i--,lba++)
  196. {
  197. printf("### DirLBA:0x%lxn",lba);
  198. FS_ReadInfoSec(lba,1);
  199. for(offset=0;offset<BPB.BytesPerSec;offset+=32)
  200. {
  201. switch(Info_buff[offset])
  202. {
  203. case 0: // free FDB, End!!
  204. printf("nNo Such File Here!! %sn",name);
  205. BPB.curr_fdb_lba=lba; // store file info location
  206. BPB.curr_fdb_offset=offset; // store file info location
  207. return NULL; 
  208. case 0xE5: //deleted FDB
  209. continue;
  210. #if 0
  211. case '.'://Parrent or this dir
  212. if(Info_buff[offset+1]=='.')
  213. { printf("n Parrent Dir(..)");
  214. }
  215. else
  216. { printf("n This Dir(.)");
  217. }
  218. continue;
  219. #endif
  220. default:
  221. if(FS_Emu_stricmp(&Info_buff[offset],name)==0)
  222. { BPB.curr_fdb_lba=lba; // store file info location
  223. BPB.curr_fdb_offset=offset; // store file info location
  224. GetFileInfo((FAT32_FDB*)(&Info_buff[offset]),&finfo);
  225. finfo.fdb_lba=lba;
  226. finfo.fdb_offset=offset;
  227. return &finfo;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. return NULL;
  234. }
  235. /*
  236. ========================================================
  237. =  FILE_INFO*  HDD_SearchFile(UINT8* name_buff)
  238. =      Search file in path/path/.../fname 
  239. =  ARGUMENT(S):
  240. =      UINT8   *fname: path/../filename to search,  
  241. =                      CHAR in 8.3 format
  242. =  RETURN VALUE:
  243. =      FILE_INFO: info of files
  244. =  GLOBAL USING:
  245. =      BPB: HD infos
  246. =  SIDE EFFECT:
  247. =      Info_buff: Contains Last FDB Sector that have this file
  248. =      Data_Start_Clus: first clustor of file 
  249. =  2002-06-12 08:38AM Modified by cyue
  250. =                     play continue LBAs currently 
  251. ========================================================
  252. */
  253. FILE_INFO*  HDD_SearchFile(UINT8 *s)
  254. {
  255. FILE_INFO* ret=NULL;
  256. UINT32 clus,i;
  257. UINT8 part_name[12],*d;
  258. //printf(__FUNCTION__":n");
  259. if(*s=='/') //FROM ROOT
  260. {
  261. clus=BPB.RootClus;
  262. s++;
  263. }
  264. else //FROM CURRENT
  265. {
  266. clus=BPB.CurrDirClus;
  267. }
  268. do
  269. {
  270. // clear part_name buff;
  271. for(i=0,d=part_name;i<11;i++,d++) *d=' ';
  272. *d=0;
  273. d=part_name;
  274. // clear leading '/'
  275. if(*s=='/')s++;
  276. if(*s=='.') // self or parrent?
  277. {
  278. *(d++)='.';
  279. if(*(s+1)=='.')// parrent?
  280. {  
  281. *(d++)='.'; s++;
  282. }
  283. *d=0; s++;
  284. }
  285. else
  286. { //copy part_name
  287. while((*s!='/')&&(*s!=0))
  288. {
  289. if(*s=='.') 
  290. {
  291. d=&part_name[8];
  292. }
  293. else
  294. {
  295. *d++=*s;
  296. }
  297. s++;
  298. }
  299. *d=0;
  300. }
  301. // Get Part-File Info
  302. ret=SearchFile(clus,part_name);
  303. if(ret==NULL) return NULL;
  304. if(ret->attrib&FAT_ATTR_D) // Is this a subdir file?
  305. {
  306. if(*s==0) // End Search string => just get the dir info
  307. {
  308. printf(" CD to new dir (%s)!!",part_name);
  309. return ret;
  310. }
  311. }
  312. else // A real file finded
  313. { //printf(" Final Name: %sn",ret->name);
  314. return ret;
  315. clus=ret->start_clus;
  316. }while(1);
  317. }
  318. FILE_INFO*  HDD_cd(UINT8 *s)
  319. {
  320. FILE_INFO* ret;
  321. ret=HDD_SearchFile(s);
  322. if(ret==NULL) return NULL;
  323. printf("n***  BPB.CurrDirClus: 0x%lx ",BPB.CurrDirClus);
  324. if(ret->attrib&FAT_ATTR_D) // Is this a subdir file?
  325. {
  326. BPB.CurrDirClus=ret->start_clus;
  327. return ret;
  328. }
  329. return NULL; // No such dir, but such file!!
  330. }
  331. extern UINT32 Last_FAT_Lba;
  332. void HDD_dir()
  333. {
  334. UINT32 dir_clus,lba;
  335. UINT32 i,j;
  336. UINT8 name[12];
  337. printf("nDIR:n");
  338. Last_FAT_Lba=0x0FFFFFFF;
  339. for(dir_clus=BPB.CurrDirClus;
  340. dir_clus<0x0FFFFFFF;
  341. dir_clus=FS_Get_NextClus(dir_clus))
  342. {
  343. lba=FS_Clus2LBA(dir_clus);
  344. for(i=BPB.SecPerClus;i;i--,lba++)
  345. {
  346. FS_ReadInfoSec(lba,1);
  347. for(j=0;j<BPB.BytesPerSec;j+=32)
  348. {
  349. UINT8 *s;
  350. s=&Info_buff[j];
  351. if(*s==0)
  352. {
  353. printf("n");
  354. return; // No more file in dir
  355. }
  356. if(*s==0xE5) continue; // deleted file
  357. memcpy(name,s,11);
  358. name[11]=0;
  359. printf("t[ %s ]",name);
  360. }
  361. }
  362. }
  363. }
  364. #if 0
  365. void  HDD_LinkFileClus(void)
  366. {
  367.     UINT32 cluster=Data_Start_Clus;
  368.     UINT32 i;
  369.     
  370.     read_le32(Info_buff+BPB.BytesPerSec)=FS_Clus2LBA(cluster);//((cluster-2)<<BPB.SecPerClusPwr)+BPB.Data_Area_Start;
  371.     for(i=4;i<4096;i+=4)
  372.     {
  373. cluster=FS_Get_NextClus(cluster);
  374. /* save the first LBA of every cluster */
  375. read_le32(Info_buff+BPB.BytesPerSec+i)=FS_Clus2LBA(cluster);//((cluster-2)<<BPB.SecPerClusPwr)+BPB.Data_Area_Start;
  376.     }
  377.     //print_block(Info_buff+BPB.BytesPerSec,512*8);
  378. }
  379. #endif
  380. /*
  381. ========================================================
  382. = UINT32  HDD_FindFreeClus(UINT32 first_clus, UINT32 count)
  383. =      Find Free Cluster(s) (by count number)
  384. =  ARGUMENT(S):
  385. =      UINT32 first_clus: find free clusters after this 
  386. =      UINT32 count: count of free clusters needs
  387. =
  388. =  RETURN VALUE:
  389. =      0xFFFFFFFF: No such more free clusters
  390. =      otherwise: start clus of the linked clusters
  391. =  GLOBAL USING:
  392. =      BPB: HD infos
  393. =  SIDE EFFECT:
  394. =      Info_buff: Contains Last FDB Sector that have this file
  395. =      Data_Start_Clus: first clustor of file 
  396. =  2002-06-12 08:38AM Modified by cyue
  397. =                     play continue LBAs currently 
  398. ========================================================
  399. */
  400. UINT32  HDD_FindFreeClus(UINT32 first_clus, UINT32 count)
  401. {
  402. UINT32 fat_lba=BPB.FAT1_Start+(first_clus>>(BPB.BytesPerSecPwr-2));
  403. //UINT32 cluster;
  404. UINT32 offset;//clus_ret,
  405. while(fat_lba<BPB.FAT2_Start)  //at the end of FAT1
  406. {
  407. FS_ReadInfoSec(fat_lba,1);
  408. for(offset=0;offset<BPB.BytesPerSec;offset+=4)
  409. {
  410. if(read_le32(Info_buff+offset)==0)
  411. {
  412. Data_Next_Clus=(((fat_lba-BPB.FAT1_Start)<<7)+(offset>>2));
  413. read_le32(Info_buff+offset)=0xfffffff;
  414. HDD_WriteSec(Info_buff,fat_lba, 1);
  415. printf("%lx,%lx,%lxn",fat_lba,offset,Data_Next_Clus);
  416. return 1;
  417. }
  418. }
  419. fat_lba ++;
  420. }
  421. if(fat_lba==BPB.FAT2_Start)
  422. printf("The HD is Fulln");
  423. return 0;
  424. }
  425. /* Fill the empty FDB */
  426. UINT8  HDD_Set_FDB(UINT8* name_buff)
  427. {
  428.     UINT32 lba;
  429.     UINT16 offset=0;
  430.     UINT8   file_flag=0;
  431.     UINT8   i;
  432.     if(1) lba=BPB.Data_Area_Start;  //under the root directory
  433.     else {};
  434.     
  435.     while(1)
  436.     {
  437.         FS_ReadInfoSec(lba,1);
  438.         File_FDB_Lba=lba;
  439.         do
  440.         {    
  441. file_flag=Info_buff[offset];
  442. if((file_flag==0xE5)||(file_flag==0x00))
  443. {
  444. //set name
  445. for(i=0;i<11;i++)
  446. Info_buff[offset+i]=name_buff[i];
  447. Info_buff[offset+11]=0x21;
  448. //set the access cluster
  449. read_le16(Info_buff+offset+20)=(Data_Next_Clus>>16)&0xfff;
  450. read_le16(Info_buff+offset+26)=Data_Next_Clus&0xffff;
  451. HDD_WriteSec(Info_buff, lba, 1);
  452. //print_block(Info_buff,BPB.BytesPerSec);
  453. return 1;
  454. }
  455. offset += 32;
  456.         } while(offset<BPB.BytesPerSec);
  457.         lba += 1;
  458.     }
  459. }
  460. FILE_INFO *HDD_CreatFile(UINT8* name_buff)
  461. {
  462.     UINT32 clus_lba=BPB.FAT1_Start;
  463.     UINT32 data_lba;
  464.     //UINT16 offset=0;
  465.     //UINT8   file_flag=0;
  466.     //UINT8   i;
  467.     /* Creat a file in the first layer of HD */
  468.     if(HDD_FindFreeClus(0,clus_lba)!=0)
  469. HDD_Set_FDB(name_buff);
  470.     else
  471.     {
  472.         printf("Can't Creat File,HD is Fulln");
  473.         return 0;
  474.     }
  475.     
  476.     Data_Curr_Clus=Data_Next_Clus;
  477.     //while(1)
  478.     {
  479.         data_lba=FS_Clus2LBA(Data_Curr_Clus);//BPB.Data_Area_Start+((Data_Curr_Clus-2)<<BPB.SecPerClusPwr);
  480.         //HDD_WriteSec(buff,data_lba,seccnt);
  481.         //if("It is over") return 1;
  482.         clus_lba=(Data_Curr_Clus>>7)+BPB.FAT1_Start;
  483.         if(HDD_FindFreeClus(0,clus_lba)!=0)
  484.         {
  485.             FS_ReadInfoSec(clus_lba,1);
  486.             read_le32(Info_buff+ (Data_Curr_Clus>>(7-2)) )=Data_Next_Clus;
  487.             HDD_WriteSec(Info_buff,clus_lba,1);
  488.         }
  489.         else
  490.         {
  491. printf("Can't Creat File,HD is Fulln");
  492. return 0;
  493.         }
  494.         printf("%lx,%lxn",Data_Curr_Clus,Data_Next_Clus);
  495.         //print_block(Info_buff,BPB.BytesPerSec);
  496.         Data_Curr_Clus=Data_Next_Clus; return 0;
  497.     }
  498. }
  499. /* Fill the FAT Chain with zero */
  500. void  HDD_ResetFAT(void)
  501. {
  502.     Data_Curr_Clus=Data_Start_Clus;
  503.     FS_ReadInfoSec((Data_Curr_Clus>>7)+BPB.FAT1_Start,1);
  504.     
  505.     while(Data_Curr_Clus!=0x0fffffff)
  506.     {
  507. FS_Get_NextClus(Data_Curr_Clus);
  508. read_le32(Info_buff+((Data_Curr_Clus&0x7F)<<2))=0;
  509. HDD_WriteSec(Info_buff,(Data_Curr_Clus>>7)+BPB.FAT1_Start,1);
  510. if((Data_Next_Clus>>7)!=(Data_Curr_Clus>>7))
  511. FS_ReadInfoSec((Data_Next_Clus>>7)+BPB.FAT1_Start,1);
  512. Data_Curr_Clus=Data_Next_Clus;
  513.     }
  514.     read_le32(Info_buff+((Data_Curr_Clus&0x7F)<<2))=0;
  515.     HDD_WriteSec(Info_buff,(Data_Curr_Clus>>7)+BPB.FAT1_Start,1); 
  516. }
  517. UINT32  HDD_DelFile(UINT8* name_buff)
  518. {
  519.     FILE_INFO *pfinfo;
  520.     if(NULL==(pfinfo=HDD_SearchFile(name_buff))) return -1; //No File ERR
  521.     Info_buff[pfinfo->fdb_offset]=0xE5;// Mark file deleted!!
  522.     HDD_WriteSec(Info_buff,pfinfo->fdb_lba,1);
  523.     HDD_ResetFAT();//clear FAT chain
  524.     printf("File Deletedn");
  525.     
  526.     return 0; //No ERR
  527. }
  528. #endif //USE_HDD