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

DVD

开发平台:

C/C++

  1. /*=================================================================
  2.   hdd_info.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 "set.h"
  10. #include "config.h"
  11. #include "global.h"
  12. #include "hdd_if.h"
  13. #include "hdd_info.h"
  14. #ifdef USE_HDD // cyue: Skip code if not use hdd!!
  15. #define DBG_HDD_INFO
  16. #ifndef DBG_HDD_INFO
  17. #undef printf
  18. #undef print_block
  19. #define printf(f, a...) {}
  20. #define print_block(x,y) {}
  21. #endif
  22. // Global for FAT FS
  23. //#define MAX_INFO_BUFF (512*2)
  24. //UINT8  Info_buff[MAX_INFO_BUFF];
  25. UINT8  HD_EXIST;
  26. HDD_INFO HDD_Info;
  27. BPB_INFO BPB;
  28. //FAT32_FDB* FDB;
  29. UINT32 Data_Start_Clus;
  30. UINT32 File_FDB_Lba;
  31. UINT32 Start_LBA;
  32. UINT32 Data_Curr_Clus;
  33. UINT32 Data_Next_Clus;
  34. int FS_Get_BPBPara(UINT8*);
  35. /*
  36. ========================================================
  37. = PARTITION_INFO* HDD_AddPE(HDD_INFO* HDD_Info,UINT32 MBR,PARTITION_ENTRY* pe)
  38. =
  39. =    Add partition entry to HDD_Info;
  40. =
  41. =  ARGUMENT(S):
  42. =      HDD_INFO* HDD_Info : HDD infos
  43. =      UINT32 MBR : MBR LBA of current partition
  44. =      PARTITION_ENTRY* pe
  45. =  RETURN VALUE:
  46. =      NONE 
  47. =  GLOBAL USING:
  48. =      NONE 
  49. =  SIDE EFFECT:
  50. =      NONE
  51. =  2002-06-12 08:38AM Modified by cyue
  52. =                     play continue LBAs currently 
  53. ========================================================
  54. */
  55. PARTITION_INFO* HDD_AddPE(HDD_INFO* HDD_Info,UINT32 MBR,PARTITION_ENTRY* pe)
  56. {
  57. PARTITION_INFO *pi=0;
  58. #ifdef PI_USE_MATRIX
  59. int j;
  60. for(j=0;j<MAX_PART_INFO;j++)
  61. if(!HDD_Info->part[j].type) break;
  62. pi=&HDD_Info->part[j]; 
  63. #else
  64. PARTITION_INFO *hddpi;
  65. pi=(PARTITION_INFO*)malloc(sizeof(PARTITION_INFO));
  66. #endif
  67. pi->type=pe->type;
  68. pi->next=NULL;
  69. pi->startlba=MBR+(pe->secfrommbr_hi<<16|pe->secfrommbr_lo);
  70. Start_LBA=pi->startlba;
  71. pi->seccnt=pe->seccnt_hi<<16|pe->seccnt_lo;
  72. pi->act=pe->act; 
  73. #ifndef PI_USE_MATRIX
  74. if(HDD_Info->partition_list==NULL)
  75. HDD_Info->partition_list=pi;
  76. else
  77. { for(hddpi=HDD_Info->partition_list;hddpi->next!=NULL;hddpi=hddpi->next);
  78. hddpi->next=pi;
  79. }
  80. #endif 
  81. return pi; 
  82. }
  83. /*
  84. ========================================================
  85. = int HDD_MakeInfo(HDD_INFO *HDD_Info,UINT8* buff)
  86. =    Make HDD partition infos to terminal
  87. =
  88. =  ARGUMENT(S):
  89. =      HDD_INFO* HDD_Info : HDD infos
  90. =      UINT8* buff : buff to put sector infos
  91. =  RETURN VALUE:
  92. =      NONE 
  93. =  GLOBAL USING:
  94. =      NONE 
  95. =  SIDE EFFECT:
  96. =      NONE
  97. =  2002-06-12 08:38AM Modified by cyue
  98. =                     play continue LBAs currently 
  99. ========================================================
  100. */
  101. int HDD_MakeInfo(HDD_INFO *HDD_Info,UINT8* buff)
  102. {
  103. PARTITION_ENTRY *pe;
  104. UINT32 i;
  105. //UINT16 c=0,h=0,s=0;
  106. UINT32 MBR=0,secfrommbr,seccnt;
  107. #ifdef PI_USE_MATRIX
  108. for(i=0;i<MAX_PART_INFO;i++)
  109. HDD_Info->part[i].type=0;
  110. #else
  111. HDD_Info->partition_list=NULL;
  112. #endif
  113. HDD_ReadSec(buff,MBR,1);
  114. for(i=0;i<4;i++)//Parse Primary partitions
  115. {
  116. pe=(PARTITION_ENTRY*)(buff+ 0x1be +i*16);
  117. secfrommbr=pe->secfrommbr_hi<<16|pe->secfrommbr_lo;
  118. seccnt=pe->seccnt_hi<<16|pe->seccnt_lo;
  119. if (!pe->type)
  120. continue;
  121. if ((pe->type==0x0f)||(pe->type==0x05))
  122. {
  123. // Extended Partition!!
  124. UINT32 MBREXT=MBR+secfrommbr;
  125. do
  126. {
  127. HDD_ReadSec(buff,MBREXT,1);
  128. printf("n Parse EXT %lu... ",MBREXT);
  129. print_sector(buff+512);
  130. if (*(UINT16*)(buff+512+510)!=0xaa55)
  131. {
  132. printf("n Fail EXT Partition!!");
  133. break;
  134. }
  135. pe=(PARTITION_ENTRY*)(buff+512+ 0x1be);
  136. secfrommbr=pe->secfrommbr_hi<<16|pe->secfrommbr_lo;
  137. seccnt=pe->seccnt_hi<<16|pe->seccnt_lo;
  138. printf("n--secfrommbr=%lx--n",secfrommbr);
  139. if (pe->type)
  140. {
  141. HDD_AddPE(HDD_Info,MBREXT,pe);
  142. }
  143. else  break;
  144. pe=(PARTITION_ENTRY*)(buff+512+ 0x1be +16);
  145. secfrommbr=pe->secfrommbr_hi<<16|pe->secfrommbr_lo;
  146. seccnt=pe->seccnt_hi<<16|pe->seccnt_lo;
  147. printf("n--secfrommbr=%lx--n",secfrommbr);
  148. if (MBREXT+secfrommbr >= HDD_Info->seccnt)
  149. //if(!pe->type)
  150. {
  151. printf("nLast MBR!!");
  152. MBREXT=HDD_Info->seccnt - seccnt;
  153. //break;
  154. }
  155. else
  156. {
  157. MBREXT+=secfrommbr;
  158. }
  159. }while((pe->type==0x0f)||(pe->type==0x05));
  160. else
  161. {
  162. HDD_AddPE(HDD_Info,MBR,pe);
  163. printf("primary=%d",i);
  164. }
  165. }
  166. return 0;
  167. }
  168. /*
  169. ========================================================
  170. = void HDD_Dump_Info(HDD_INFO* HDD_Info)
  171. =    Dump HDD partition infos to terminal
  172. =
  173. =  ARGUMENT(S):
  174. =      HDD_INFO* HDD_Info : HDD infos
  175. =  RETURN VALUE:
  176. =      NONE 
  177. =  GLOBAL USING:
  178. =      NONE 
  179. =  SIDE EFFECT:
  180. =      NONE
  181. =  2002-06-12 08:38AM Modified by cyue
  182. =                     play continue LBAs currently 
  183. ========================================================
  184. */
  185. void HDD_Dump_Info(HDD_INFO* HDD_Info)
  186. { PARTITION_INFO *pi;
  187. int i;
  188. printf("nnHDD: C=%lu H=%lu S=%lu",HDD_Info->cyl,HDD_Info->head,HDD_Info->sec);
  189. printf("nHDD total Sectors = %lu, %lu MB ",HDD_Info->seccnt,HDD_Info->seccnt/2000);
  190. printf("nPAR  A TYPE START LBA       COUNT"); 
  191. #ifdef PI_USE_MATRIX
  192. for(i=0;i<MAX_PART_INFO;i++)
  193. { pi= &HDD_Info->part[i];
  194. if(pi->type)
  195. printf("n%2d  %02x  %02x %10lu  %10lun",i,pi->act,pi->type,pi->startlba,pi->seccnt);
  196. }
  197. #else
  198. for(i=0,pi=HDD_Info->partition_list;pi!=NULL;i++,pi=pi->next)
  199. { printf("n%2d  %02x  %02x  %10lu  %10lu",i,pi->act,pi->type,pi->startlba,pi->seccnt);
  200. }
  201. #endif
  202. }
  203. /*
  204. ========================================================
  205. = static int FS_check_SecPerClus(unsigned SecPerClus)
  206. =
  207. =
  208. =  ARGUMENT(S):
  209. =      unsigned SecPerClus :
  210. =  RETURN VALUE:
  211. =      int 
  212. =  GLOBAL USING:
  213. =      NONE 
  214. =  SIDE EFFECT:
  215. =      NONE
  216. =  2002-06-12 08:38AM Modified by cyue
  217. =                     play continue LBAs currently 
  218. ========================================================
  219. */
  220. static int FS_check_SecPerClus(unsigned SecPerClus)
  221. {
  222.     unsigned char log;
  223.     for(log = 0; log < 8; log++)
  224.     {
  225. if(SecPerClus & 1)
  226. {
  227. SecPerClus >>= 1;
  228. return (SecPerClus != 0) ? -1 : log;
  229. }
  230. SecPerClus >>= 1;
  231. }
  232. return -1;
  233. }
  234. /*
  235. ========================================================
  236. =  int FS_check_BootSec(UINT8* buf)
  237. =      Check & Get BPB info form the buffer of BPB sectors
  238. =  ARGUMENT(S):
  239. =      UINT8 *buf : BPB sector buffer
  240. =  RETURN VALUE:
  241. =      int : 0 for no error
  242. =  GLOBAL USING:
  243. =      BPB 
  244. =  SIDE EFFECT:
  245. =      BPB: selected BPB infos
  246. =  2002-06-12 08:38AM Modified by cyue
  247. =                     play continue LBAs currently 
  248. ========================================================
  249. */
  250. int FS_check_BootSec(UINT8* buf)
  251. {
  252.     UINT16 temp;
  253.     //check Jump Code + NOP
  254.     if(buf[0] == 0xE9)
  255. /* OK */;
  256. else if(buf[0] == 0xEB && buf[2] == 0x90)
  257. /* OK */;
  258. else
  259.     {
  260. printf("Missing JMP/NOPn");
  261. return 1;
  262.     }
  263.     //check Sectors Per Cluster
  264.     temp = buf[13];
  265.     if(FS_check_SecPerClus(temp) < 0)
  266.     {
  267. printf("Sectors per cluster (%u) is not a power of 2n",temp);
  268. return 1;
  269.     }
  270.     //check the Number of FATs
  271.     temp = buf[16];
  272.     if(temp != 1 && temp != 2)
  273.     {
  274. printf("Invalid number of FATs (%u)n",temp);
  275. return 1;
  276.     }
  277.     //check Sectors Per Track
  278.     temp = read_le16(buf + 24);
  279.     if(temp == 0 || temp > 63)
  280.     {
  281. printf("Invalid number of sectors (%u)n",temp);
  282. return 1;
  283.     }
  284.     //check Number of Heads
  285.     temp = read_le16(buf + 26);
  286.     if(temp == 0 || temp > 255)
  287.     {
  288. printf("Invalid number of heads (%u)n",temp);
  289. return 1;
  290.     }
  291.     return FS_Get_BPBPara(buf);
  292. }
  293. /*
  294. ========================================================
  295. =  int FS_Get_BPBPara(UINT8* buf)
  296. =      Get BPB info form the buffer of BPB sectors
  297. =  ARGUMENT(S):
  298. =      UINT8 *buf : BPB sector buffer
  299. =  RETURN VALUE:
  300. =      int : 0 for no error
  301. =  GLOBAL USING:
  302. =      BPB 
  303. =  SIDE EFFECT:
  304. =      BPB: selected BPB infos
  305. =  2002-06-12 08:38AM Modified by cyue
  306. =                     play continue LBAs currently 
  307. ========================================================
  308. */
  309. int FS_Get_BPBPara(UINT8* buf)
  310. {
  311. BPB.BytesPerSec=(buf[12]<<8)|buf[11];
  312. switch(BPB.BytesPerSec)
  313. { case 512: BPB.BytesPerSecPwr=9; break;
  314. case 2048: BPB.BytesPerSecPwr=11; break;
  315. case 256: BPB.BytesPerSecPwr=8; break;
  316. }
  317. printf("n## BytesPerSec:%d ",BPB.BytesPerSec);
  318. BPB.SecPerClus=buf[13];
  319. switch(BPB.SecPerClus)
  320. { case 128: BPB.SecPerClusPwr=7; break; //64K allocation unit
  321. case  64: BPB.SecPerClusPwr=6; break; //32K allocation unit
  322. case  32: BPB.SecPerClusPwr=5; break; //16K allocation unit
  323. case  16: BPB.SecPerClusPwr=4; break; // 8K allocation unit
  324. case   8: BPB.SecPerClusPwr=3; break; // 4K allocation unit
  325. case   4: BPB.SecPerClusPwr=2; break; // 2K allocation unit
  326. }
  327. printf("n## SecPerClus:%d ",BPB.SecPerClus);
  328. BPB.ReserSecCnt=read_le16(buf + 14);
  329. BPB.NumFATs=buf[16];
  330. //   BPB.MediaDescriptor=buf[21];
  331. //   BPB.SecPerTrack=read_le16(buf + 24);
  332. //   BPB.NumHeads=read_le16(buf + 26);
  333. //   BPB.HiddenSecCnt=read_le32(buf + 28);
  334. //   BPB.TolSec32=read_le32(buf + 32);
  335. BPB.FATSize32=read_le32(buf + 36);
  336. printf("n## FATSize32:%d ",BPB.FATSize32);
  337. BPB.CurrDirClus=BPB.RootClus=read_le32(buf + 44);
  338. BPB.FAT1_Start=Start_LBA+BPB.ReserSecCnt;
  339. printf("n## BPB.FAT1_Start:%d ",BPB.FAT1_Start);
  340. if (BPB.NumFATs==1) 
  341. BPB.FAT2_Start=0;
  342. if (BPB.NumFATs==2)
  343. BPB.FAT2_Start=BPB.FAT1_Start+BPB.FATSize32;
  344. BPB.Data_Area_Start=((BPB.RootClus-2)*BPB.SecPerClus)  
  345. +BPB.FAT1_Start+BPB.FATSize32*BPB.NumFATs;
  346. printf("n## BPB.Data_Area_Start:%d ",BPB.Data_Area_Start);
  347. return 0;
  348. }
  349. UINT32 Last_FAT_Lba=0x0FFFFFFF; // cyue: Try to make a cache 2002-06-11 11:14PM
  350. UINT8 *FS_ReadInfoSec(UINT32 lba,int seccnt)
  351. {
  352. if(Last_FAT_Lba!=lba)
  353. { HDD_ReadSec(Info_buff,lba,seccnt);
  354. }
  355. return Info_buff;
  356. }
  357. /*
  358. ========================================================
  359. =  UINT32  FS_Get_NextClus(UINT32 currClus)
  360. =      Get Next Cluster of current cluster by FAT 
  361. =  ARGUMENT(S):
  362. =      UINT32   *currClus: current cluster
  363. =  RETURN VALUE:
  364. =      UINT32: next cluster number, 0x0FFFFFFF for no cluster
  365. =  GLOBAL USING:
  366. =      UINT32 Last_FAT_Lba: cache mark for last lba // carefully to use it!!
  367. =  SIDE EFFECT:
  368. =      Info_buff: Contains Last FAT Sector that have this file
  369. =      Data_Next_Clus: first clustor of file 
  370. =  2002-06-12 08:38AM Modified by cyue
  371. =                     play continue LBAs currently 
  372. ========================================================
  373. */
  374. UINT32  FS_Get_NextClus(UINT32 currClus)
  375. {
  376.     UINT32  tmpLba;
  377.     UINT32    tmpOffset;
  378.     tmpOffset=currClus&0x7F;//%128;
  379.     tmpLba=(currClus>>7)+BPB.FAT1_Start;
  380.     FS_ReadInfoSec(tmpLba,1);
  381.     Data_Next_Clus=read_le32(Info_buff+(tmpOffset<<2))&0x0fffffff;
  382.     //printf("Data_Next_Clus=%lxn",Data_Next_Clus);
  383.     return Data_Next_Clus;
  384. }
  385. #endif //USE_HDD