SD.c
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:52k
源码类别:

压缩解压

开发平台:

C++ Builder

  1. /*==========================================================================
  2. Copyright (c) 2004 ALi Corporation. All Rights Reserved
  3. File: SD.c
  4. content: SD control/read/write functions
  5. History: Created by Vicky Hsu 2004/07/01
  6. ==========================================================================*/
  7. #define _SD_H_
  8. #include "TypeDef.h"
  9. #include "Const.h"
  10. #include "Reg5661.h"
  11. #include "Common.h"
  12. #include "SD.h"
  13. #if(ENABLE_SD_FUNCTION)
  14. //vicky050506#1
  15. #define _SD_INIT_  0
  16. #define _SD_READ_  0
  17. #define _SD_WRITE_ 0
  18. #if(_SD_API_ATAPI_)
  19. #include "Usb.h"
  20. #include "Ata.h"
  21. #undef _SD_INIT_
  22. #undef _SD_READ_
  23. #undef _SD_WRITE_
  24. #define _SD_INIT_  1
  25. #define _SD_READ_  1
  26. #define _SD_WRITE_ 1
  27. #else
  28. #if(_SD_API_INIT_)
  29. #undef _SD_INIT_
  30. #define _SD_INIT_  1
  31. #endif
  32. #if(_SD_API_READ_)
  33. #undef _SD_READ_
  34. #define _SD_READ_ 1
  35. #endif
  36. #if(_SD_API_WRITE_)
  37. #undef _SD_WRITE_
  38. #define _SD_WRITE_ 1
  39. #endif
  40. #endif
  41. #if((_PM_USB_ | _PM_MPTEST_|_PM_MTP_INIT_)) //allen050530
  42. #define _SD_CLK_USE_USB 1
  43. #else
  44. #define _SD_CLK_USE_USB 0
  45. #endif
  46. //-------------------------------------------------------------------
  47. // Global variables
  48. //-------------------------------------------------------------------
  49. XBYTE  gfSDPowerUp; //Indicate that R1 Power UP bit=TRUE (i.e CMD1/ACMD41 PASS) //Walace070102#1
  50. XBYTE  gxbSDLastCardState; //the last card state of SD/MMC card
  51. #if(_SD_INIT_) //vciky050607#4
  52. XBYTE  gxbSd_cmd; //the divisor of SD Clock (function: controll SD clock <400KHZ.)
  53. XBYTE  gxbOCR[4];
  54. XDWORD gxdwSD_Blocklen; //the size of a block (it is 512 byte in most situation.) 
  55. #endif
  56. /*SD Card Only==========================================*/
  57. //
  58. /*not used now ==========================================*/
  59. //XBYTE  gxbSDSmallerBlockAllowed;//Vicky 0812 del
  60. //XBYTE  gxbSD_TRAN_SPEED;//Vicky 0812 del
  61. //XBYTE  gbSDLastCardCMD;//Vicky 0810 del
  62. //XWORD  gxwSDMaxBlockLength;//Vicky 0810 del 
  63. #if(_SD_API_ATAPI_)
  64. XDWORD gxdwLBA_address;//the LBA acceptd from PC (in  USB read/write)
  65. #endif
  66. //-------------------------------------------------------------------
  67. // Function prototype
  68. //-------------------------------------------------------------------
  69. //Card's State Diagram+Basic Command
  70. bit CMD0(void); //go idle state
  71. bit CMD1(void); //send_OP_COND(MMC only),Response=R3 (OCR)
  72. bit CMD2(void); //all send CID,Response=R2(CID).
  73. bit CMD3(void); //Set addr(MMC:00 01),Response=R1; Send addr (SD),Response=R6.
  74. bit CMD6(BYTE bAccess, BYTE bIndex, BYTE bValue, BYTE CMDSet);//Nick061103#1 switch mode
  75. bit CMD7(void); //select/deselect card,Response=R1.
  76. bit CMD8(void); //Nick061103 send interface condition
  77. bit CMD9(void); //send CSD,Response=R2.
  78. bit CMD12(bit fpolling); //stop transmition after multiple block read,Response=R1.
  79. bit CMD13(void); //send status,Response=R1.
  80. bit CMD16(void); //set blocklen,Response=R1.
  81. bit CMD55(bit fRCA); //App cmd;fRCA=TRUE,addressed cmd for (SD only).else, for ACMD41 in SD init(SD only).Response=R1.
  82. bit ACMD41(void); //send_OP_COND(SD only),Response=R3 (OCR)
  83. bit ACMD6(void); //set bus width(SD only--> 4 bit bus),Response=R1.
  84. bit ACMD23(WORD wlen) large; //SET_WR_BLK_ERASE_COUNT,Response=R1.
  85. void CMD1_PRE(void);
  86. void ACMD41_PRE(void);
  87. void CMD18PRE(DWORD dwLBA) large; //setting of muliple block read ,dwLBA=LBA
  88. void CMD25PRE(DWORD dwLBA) large; //setting of muliple block write ,dwLBA=LBA
  89. /*SET SD Arg ========================================*/
  90. void SDArg(void); //addressd SD in argument
  91. void MMCArg(void); //addressd MMC in argument
  92. void SDStuffArg(void); //all are stuff bits in argument
  93. void SDOCRArg(void); //OCR in argument
  94. /*Check SD/MMC Response REG ==============================*/
  95. void SD_CheckR1(void); //R1 (card status, 32 error bits)
  96. void SD_CheckR6(void); //R6 (get card's Relative addr.SD only)
  97. BYTE SD_CheckR7(void); //R7 (check supplied votage accepted by SD or not) //Nick061103
  98. void SD_CheckR3(void); //R3 (OCR, Operation Condition REG)
  99. void SD_CheckR2CSD(void) large; //R2 (CSD, Card Specific REG)
  100. //SD/MMC Common Func
  101. //void SD_POWER_OFF(void);
  102. void SD_POWER_ON(void);
  103. void  DETECT_SD_WP(void);
  104. void SD_Init1(void); //SD init400k  step1 func.
  105. void SD_Init2(void)large; //SD init400k  step2 func.
  106. void SD_Delay(unsigned int DelayCnt); //Delay func
  107. bit SD_CheckStatus(void)large; //check obSDCTRL(cmd_start),obSDSTS(cmd_busy)
  108. bit SDpolling(BYTE *bCmd, BYTE bStatus,bit fTrue) large; //polling until fTRUE (max value=0xffff)
  109. bit SD_RESP_DelayCount(BYTE bResponse) large; //polling until SD State =bResponse. (max value=0x8fff)
  110. /***************************************************************************
  111. SD/MMC API function
  112. ****************************************************************************/
  113. API void SD_POWER_OFF(void) //Vicky1005 remodify
  114. {
  115. PIN_SD_PDDAT|=SD_PD; //SD power on
  116. PIN_SD_PDDIR|=SD_PD; //PDJ(Output)
  117. #if(_SD_DET_PULL) //Walace060814#1 Write Protection Output High after power down SD
  118. PIN_SD_WPDIR&=(~SD_WP);
  119. obGPIOHPUEN |=SD_WP; 
  120. obGPIOHPUHI |=SD_WP; 
  121. #else
  122. PIN_SD_WPDAT|=SD_WP;
  123. PIN_SD_WPDIR|=SD_WP;
  124. #endif
  125. obGPIOGPUEN |=0x5F; 
  126. obGPIOGPUHI &=0xA0; 
  127. obCLKSDCTRL =0x50;//Vicky041130#1 /vicky050601#1
  128. gfSDinit = FALSE;
  129. gfSDWP = FALSE;//Vicky1019
  130. gxbSDMMCState = 0;//Nick061103
  131. //gfSDStop=FALSE;
  132. gfSDPowerUp=FALSE;
  133. gfSDPowerOn =FALSE;
  134. gxbSD_Error=0;
  135. gfR1Err=FALSE;//Vicky041126#2
  136. #if(_SD_API_INIT_) 
  137. /******************************************************************************************
  138. //  SD INIT FUNC
  139. *******************************************************************************************/
  140. /*--------------------------------------------------------------------------
  141. Description:
  142. SD Initialization.
  143. Global arguments:
  144. gfSDinit:  indicate that SD/MMC card had been initialized.
  145. gxbSd_cmd: the divisor to controll the SD/MMC Clock (<400KHZ)
  146. gfMediumChange:  indicate that FW need to let Host know medium change. (since SD insert and init OK).
  147. Returns:
  148. TRUE: SD/MMC card was initialized successfully.
  149. FALSE: SD/MMc card  was not initialized successfully.(including SD/MMC is not inserted)
  150. 2004/08/11: Edit by Vicky
  151. --------------------------------------------------------------------------*/
  152. API bit SD_Init_400K(void) //Vicky1019  //vicky050506#1
  153. {
  154.         
  155.        #if( _SD_DET_PULL)
  156.    //Nick060808 start
  157. PIN_SD_DETDIR&=(~SD_CD);  //Nick060308#1 add it
  158. PIN_SD_DET_PULL_EN|=SD_CD;
  159. PIN_SD_DET_PULL_HIGH|=SD_CD;   
  160. //Nick060808 end
  161. #else
  162. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
  163. PIN_SD_DETDAT&=~SD_CD;
  164. PIN_SD_DETDIR&=~SD_CD;
  165. #else
  166. PIN_SD_DETDAT|=SD_CD;
  167. PIN_SD_DETDIR|=SD_CD;
  168. #endif
  169. #endif
  170. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
  171. if(PIN_SD_DETDAT&SD_CD)
  172. #else
  173. if(!(PIN_SD_DETDAT&SD_CD)) //Card IN//Vicky1005 change
  174. #endif
  175. {
  176. #if( _SD_DET_PULL)
  177. PIN_SD_DET_PULL_EN&=(~SD_CD); //Nick060808 mark it
  178. #else
  179. PIN_SD_DETDIR&=(~SD_CD);//Vicky1019
  180. #endif
  181. #if(_SD_API_ATAPI_) //allen050530
  182. if(gfSDinit && (!gfSDStop)) //Have been Initialized OK
  183. return TRUE;
  184. #else
  185. if(gfSDinit) //Have been Initialized OK
  186. return TRUE;
  187. #endif
  188. #if(_SD_API_ATAPI_) //allen050530
  189. if( (!gfSDinit) && (!gfSDStop) ) //need to Initialize
  190. #else
  191. if(!gfSDinit ) //need to Initialize
  192. #endif
  193. {
  194. for(gxbSd_cmd=90;gxbSd_cmd<100;gxbSd_cmd++)
  195. {
  196. SD_Init1();
  197. SD_Init2();
  198. if(gfSDinit==TRUE)
  199. {
  200. gfMediumChange=TRUE;//Vicky 0816 add
  201. gxbSDretry=0;
  202. return TRUE;
  203. }
  204. }
  205. }
  206. }
  207. #if( _SD_DET_PULL)
  208. PIN_SD_DET_PULL_EN&=(~SD_CD); //Nick060808
  209. #else
  210. PIN_SD_DETDIR&=(~SD_CD);
  211. #endif
  212. SD_POWER_OFF();
  213. return FALSE;
  214. }
  215. #endif // _SD_API_INIT_
  216. #if(_SD_API_READ_) //vicky050506#1
  217. /*--------------------------------------------------------------------------
  218. Description:
  219. Read data from SD. (data target: SRAM )
  220. Arguments:
  221. Global arguments:
  222. gbStorTransLen: the number of blocks to be transfered.
  223. gbStorPath:  the addr of Target  (in SRAM)
  224. gdwStorLba:  the LBA of Source  (in SD/MMC Card)
  225. gxbSD_Error:  error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
  226. gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
  227. gfR1Err: TRUE,R1 report error.
  228. Returns: 
  229. TRUE: all data are transfered to SD.
  230. FALSE: some error occured.
  231. 2004/08/11: Edit by Vicky
  232. --------------------------------------------------------------------------*/
  233. bit SD_Read(void) large
  234. {
  235. // DWORD dwStorLba; //Nick061103 mark it
  236. WORD wtransferlen=(WORD)gbStorTransLen*0x0200;
  237. gxbSD_Error=0;
  238. //Nick060808 start
  239. #if(!SD_DET_USE_INT1)
  240. if(!SD_Det(SD_DET))
  241. goto SD_DMAreset;
  242. #else
  243. if(!gfSDinit)
  244. {
  245. SD_Det(SD_FORCE_REMOVE);
  246. goto SD_DMAreset;
  247. }
  248. #endif
  249. //Nick060808 end
  250. ClkSdEn();//Vicky041126#1
  251.   //Vicky051021#1
  252.  if( (gbStorTransLen==0) || //Check Length
  253.   (gdwStorLba>gxdwSD_Blocknum) ||  //Vicky051221#3
  254.     ((gdwStorLba+gbStorTransLen) >gxdwSD_Blocknum) //Check End LBA
  255.   )   
  256. {
  257. gxbSD_Error=ERR_SD_RES2|ERR_SD_OUTOFCAPA;//Vicky1019
  258. goto SD_DMAreset;
  259. }
  260. obRACTL &= RA_DMA_DISJ;
  261. obSOURCEPATHCTRL = 0x00; //Source Dis
  262. obTARGETPATHCTRL = 0x00; //Target Dis
  263. obMODSEL3 &= NOTBYPASS_RAJ; //not bypass RA
  264. obSOURCEPATHCTRL = 0x10; //Source SD
  265. obTARGETPATHCTRL = 0x00; //Target Dis
  266. obRACTL = RA_INIT; // DMA INI
  267. obRACTL = RA_NORMAL;
  268. obRACTL = RA_COPY_MODE;
  269. obRAINIADRL = (gbStorPath*0x0200) & 0xFF;
  270. obRAINIADRH = (((gbStorPath*0x0200) >> 8) & 0x1F);
  271. obRAINIADRH |= RA_ADDR_LOAD;
  272. obRABANKSIZEH = wtransferlen>>8;
  273. obRABANKSIZEL = (BYTE)wtransferlen;
  274. obSDBLOCKLENH = 02;
  275.      obSDBLOCKLENL = 00;
  276. obSDBLOCKNUM=gbStorTransLen-1;
  277. obRACTL |= RA_DMA_EN;
  278. //Nick061103 start
  279. if(gxbSDMMCState&SD_HIGH_CAPACITY)
  280. CMD18PRE(gdwStorLba);
  281. else
  282. CMD18PRE(gdwStorLba<<9);
  283. /* dwStorLba = (gdwStorLba<<9);
  284. CMD18PRE(dwStorLba);*/
  285. //Nick061103 end
  286. if(!SDpolling(&obSDCTRL,SD_CMD_START,0)) 
  287. {
  288. gxbSD_Error=ERR_SD_CMD_START;
  289. goto SD_DMAreset;
  290. }
  291. if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0)) 
  292. {
  293. gxbSD_Error=ERR_SD_CMD18|ERR_SD_CMD_BUSY;
  294. goto SD_DMAreset;
  295. }
  296. if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
  297. {
  298. gxbSD_Error=ERR_SD_CMD12|ERR_SD_DATLINE_BUSY;
  299. goto SD_DMAreset;
  300. }
  301. if(!CMD12(FALSE))
  302. {
  303. gxbSD_Error|=ERR_SD_CMD12;
  304. goto SD_DMAreset;
  305. }
  306. if(!SD_RESP_DelayCount(SD_STATE_TRAN))
  307. {
  308. gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE;
  309. goto SD_DMAreset;
  310. }
  311. SD_DMAreset:
  312. obRACTL &= RA_DMA_DISJ;
  313. obSOURCEPATHCTRL = 0x00; //Source Dis
  314. obTARGETPATHCTRL = 0x00; //Target Dis
  315.  
  316. if(gxbSD_Error)
  317. {
  318. if((gxbSD_Error&ERR_SD_RES2)==ERR_SD_RES2) //Vicky041126#2
  319. return FALSE; //Vicky041126#2
  320. obSYSSOFTRSTCTRL &= SD_RST_ENJ;
  321. obSYSSOFTRSTCTRL |= SD_RST_DIS;  // Disable SD reset signal
  322. //gxbSD_Error=0; //Vicky041126#2
  323. SD_Det(SD_DET); //vicky050506#1 //Nick060808 add SD_DET
  324. return FALSE;
  325. }
  326. return TRUE;
  327. }
  328. #endif
  329. #if(_SD_API_WRITE_) //Vicky050506#1
  330. /*--------------------------------------------------------------------------
  331. Description:
  332. Write data to SD. (data source: SRAM )
  333. Arguments:
  334. Global arguments:
  335. gbStorTransLen: the number of blocks to be transfered.
  336. gbStorPath:  the addr of Source (in SRAM)
  337. gdwStorLba:  the LBA of Target  (in SD/MMC Card)
  338. gxbSD_Error:  error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
  339. gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
  340. gfR1Err: TRUE, R1 report error.
  341. Returns: 
  342. TRUE: all data are transfered to SD.
  343. FALSE: some error occured.
  344. 2004/08/11: Edit by Vicky
  345. --------------------------------------------------------------------------*/
  346. bit SD_Write(void) large
  347. {
  348. // DWORD dwStorLba; //Nick061103 mark it
  349. WORD wtransferlen=(WORD)gbStorTransLen*0x0200;
  350. gxbSD_Error=0;
  351. //Nick060808 start
  352. #if(!SD_DET_USE_INT1)
  353. if(!SD_Det(SD_DET))
  354. goto SD_DMAreset;
  355. #else
  356. if(!gfSDinit)
  357. {
  358. SD_Det(SD_FORCE_REMOVE);
  359. goto SD_DMAreset;
  360. }
  361. #endif
  362. //Nick060808 end
  363. ClkSdEn();//Vicky041126#1
  364. if(gfSDWP)
  365. {
  366. gxbSD_Error=ERR_SD_RES2|ERR_SD_WP;
  367. goto SD_DMAreset;
  368. }
  369. //Vicky051021#1
  370.  if( (gbStorTransLen==0) || //Check Length
  371.    (gdwStorLba>gxdwSD_Blocknum) ||  //Vicky051221#3
  372.     ((gdwStorLba+gbStorTransLen) >gxdwSD_Blocknum) //Check End LBA
  373.   )   
  374. {
  375. gxbSD_Error=ERR_SD_RES2|ERR_SD_OUTOFCAPA;
  376. goto SD_DMAreset;
  377. }
  378.  //
  379. obRACTL &= RA_DMA_DISJ;
  380. obSOURCEPATHCTRL = 0x00; //Source Dis
  381. obTARGETPATHCTRL = 0x00; //Target Dis
  382. obTCNTLDDATAL=(BYTE)(wtransferlen/2);
  383. obTCNTLDDATAH=(wtransferlen/2)>>8;
  384. obTCNTCTRL|=TCOUNT_LOAD;
  385. obTCNTCTRL&=TCOUNT_ENJ;
  386. obMODSEL3 &= NOTBYPASS_RAJ; //not bypass RA
  387. obRACTL = RA_INIT; // DMA INI
  388. obRACTL = RA_NORMAL;
  389. obSOURCEPATHCTRL = 0x00; //Source Dis
  390. obTARGETPATHCTRL = 0x10; //Target SD
  391. obRACTL = RA_COPY_MODE;
  392. obRAINIADRL = (gbStorPath*0x0200) & 0xFF;
  393. obRAINIADRH = (((gbStorPath*0x0200) >> 8) & 0x1F);
  394. obRAINIADRH |= RA_ADDR_LOAD;
  395. obRABANKSIZEH = wtransferlen>>8;
  396. obRABANKSIZEL = (BYTE)wtransferlen;
  397. obSDBLOCKLENH = 02;
  398.      obSDBLOCKLENL = 00;
  399. obSDBLOCKNUM=gbStorTransLen-1;
  400. // dwStorLba = (gdwStorLba<<9);//LBA is byte addressed for SD/MMC. //Nick061103 mark it
  401. if(gxbSDCardType == SD_MODE)
  402.      {
  403.      if(!CMD55(TRUE))
  404. {
  405. gxbSD_Error|=ERR_SD_CMD55;
  406. goto SD_DMAreset;
  407. }
  408. if(!ACMD23(gbStorTransLen))
  409. {
  410. gxbSD_Error|=ERR_SD_ACMD23;
  411. goto SD_DMAreset;
  412. }
  413. }
  414. //Nick061103 start
  415. if(gxbSDMMCState&SD_HIGH_CAPACITY)//Nick061103
  416. CMD25PRE(gdwStorLba);
  417. else
  418. CMD25PRE(gdwStorLba<<9);
  419. //Nick061103 end
  420. if(!SDpolling(&obSDCTRL,SD_CMD_START,0)) 
  421. {
  422. gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_START;
  423. goto SD_DMAreset;
  424. }
  425. obRACTL |= RA_DMA_EN;
  426. if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0)) 
  427. {
  428. gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_BUSY;
  429. goto SD_DMAreset;
  430. }
  431. //modify by Nick 2006/03/06 mark it. neednt add this here. it just for debug purpose originally.
  432. //And gxbSDLastCardState=(obSDRESP2>>1)&0x0F; will let SD IP lunch command randomly and unexpectly.
  433. //SD_CheckR1();
  434. if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0)) 
  435. {
  436. gxbSD_Error=ERR_SD_CMD25|ERR_SD_DAT_TBUSY;
  437. goto SD_DMAreset;
  438. }
  439. if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1)) 
  440. {
  441. gxbSD_Error=ERR_SD_CMD25|ERR_SD_DATLINE_BUSY;
  442. goto SD_DMAreset;
  443. }
  444. if(!CMD12(TRUE))
  445. {
  446. gxbSD_Error|=ERR_SD_CMD12;
  447. goto SD_DMAreset;
  448. }
  449. obSDCLOCKWIDTH |= 0x01;
  450. if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1))
  451. {
  452. gxbSD_Error=ERR_SD_CMD12|ERR_SD_DATLINE_BUSY;
  453. goto SD_DMAreset;
  454. }
  455. obSDCLOCKWIDTH &= 0xFE;
  456.    
  457. if(!SD_RESP_DelayCount(SD_STATE_TRAN))
  458. {
  459. gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE;
  460. goto SD_DMAreset;
  461. }   
  462. if(!SDpolling(&obTCNTCTRL,TCOUNT_FINISH,0)) 
  463. {
  464. gxbSD_Error=ERR_SD_RES1;
  465. goto SD_DMAreset;
  466. }
  467. SD_DMAreset:
  468. obRACTL &= RA_DMA_DISJ;
  469. obTCNTCTRL|=TCOUNT_DIS;
  470. obTCNTCTRL&=TCOUNT_LOAD_DIS;
  471. obSOURCEPATHCTRL = 0x00; //Source Dis
  472. obTARGETPATHCTRL = 0x00; //Target Dis
  473. if(gxbSD_Error)
  474. {
  475. if((gxbSD_Error&ERR_SD_RES2)==ERR_SD_RES2) //Vicky041126#2
  476. return FALSE; //Vicky041126#2
  477. obSYSSOFTRSTCTRL &= SD_RST_ENJ;
  478. obSYSSOFTRSTCTRL |= SD_RST_DIS; // Disable SD reset signal
  479. //gxbSD_Error=0; //Vicky041126#2
  480. SD_Det(SD_DET); //vicky050506#1 //Nick060808 add SD_DET
  481. return FALSE;
  482. }
  483. return TRUE;
  484. }
  485. #endif //_SD_API_WRITE_
  486. /***************************************************************************
  487. SD/MMC Common Func
  488. ****************************************************************************/
  489. /*--------------------------------------------------------------------------
  490. Description:
  491. Check whether SD/MMC card is inserted or not.
  492. Returns: 
  493. TRUE: SD/MMC card is inseted.
  494. FALSE: SD/MMC card is not inseted.
  495. --------------------------------------------------------------------------*/
  496. bit SD_Det(BOOL fForceSDRemove)  //vicky050506#1 //Nick060808 add BOOL fForceSDRemove
  497. {
  498.        #if( _SD_DET_PULL)
  499.    //Nick060808 start
  500.     PIN_SD_DETDIR&=SD_CDJ; //Nick060308#1 add it
  501. PIN_SD_DET_PULL_EN|=SD_CD;
  502. PIN_SD_DET_PULL_HIGH|=SD_CD;
  503.    //Nick060808 end
  504. #else
  505. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
  506. PIN_SD_DETDAT&=~SD_CD;
  507. PIN_SD_DETDIR&=~SD_CD;
  508. #else
  509. PIN_SD_DETDAT|=SD_CD;
  510. PIN_SD_DETDIR|=SD_CD;
  511. #endif
  512. #endif
  513. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:24
  514. if((!(PIN_SD_DETDAT&SD_CD) )|| fForceSDRemove)//Vicky1005 change //Nick060808 add || fForceSDRemove
  515. #else
  516. if((PIN_SD_DETDAT&SD_CD) || fForceSDRemove)//Vicky1005 change //Nick060808 add || fForceSDRemove
  517. #endif
  518. {
  519.  #if( _SD_DET_PULL)
  520.  //Nick060308#1 begin
  521. // obGPIOEPUEN&=(~SD_CD);
  522.   PIN_SD_DET_PULL_EN&=SD_CDJ; //Nick060808
  523.  //Nick060308#1 end
  524.  #else
  525. PIN_SD_DETDIR&=(~SD_CD);
  526. #endif
  527. if(gfSDPowerOn)
  528. SD_POWER_OFF();
  529. gxbSD_Error=ERR_SD_RES2|ERR_SD_REMOVE;//Vicky060126#1 //vicky061208#1 Move to here
  530. return FALSE;
  531. }
  532.  #if( _SD_DET_PULL)
  533.  //Nick060308#1 begin
  534. // obGPIOEPUEN&=(~SD_CD);
  535.   PIN_SD_DET_PULL_EN&=SD_CDJ; //Nick060808 
  536.  //Nick060308#1 end
  537.  #else
  538. PIN_SD_DETDIR&=(~SD_CD);
  539. #endif
  540. return TRUE;
  541. }
  542. #if(_SD_INIT_|_SD_READ_|_SD_WRITE_)
  543. /******************************************************************************************
  544. //  Check the status of the command sent  to SD/MMC Card
  545. *******************************************************************************************/
  546. bit SD_CheckStatus(void) large //vicky050506#1
  547. {
  548. DWORD times; 
  549. if(!SD_Det(SD_DET)) //Nick060808 add SD_DET
  550. return FALSE;
  551. times = 200;//Vicky0909
  552. while((obSDCTRL&SD_CMD_START)&&times) 
  553. {times--;}
  554. if(!times)
  555.        {
  556.        gfSDinit = FALSE;
  557. gxbSD_Error=ERR_SD_CMD_START; 
  558.        return FALSE;
  559.        }
  560. times =1000;//Vicky0909
  561. while((obSDSTS&SD_CMD_BUSY)&&times)
  562.        {times--;}
  563. if(!times)
  564.        {
  565.        gfSDinit = FALSE;
  566. gxbSD_Error=ERR_SD_CMD_BUSY; 
  567.          return FALSE;
  568. }
  569. return TRUE;
  570. }
  571. /*--------------------------------------------------------------------------
  572. Description:
  573. Polling until the result of "*bCmd &bStatus" is equal to fTrue. 
  574. or Sd_DelayTemp is equal to zero.
  575. Arguments:
  576. bCmd: the addr of the Reg.
  577. bStatus: the value to be compared.
  578. Return:
  579. TRUE: the result of "*bCmd &bStatus" is equal to fTrue.
  580. FALSE: Sd_DelayTemp is equal to zero.
  581. 2004/08/11: Edit by Vicky
  582. --------------------------------------------------------------------------*/
  583. bit SDpolling(BYTE *bCmd, BYTE bStatus,bit fTrue) large
  584. {
  585. //DWORD Sd_DelayTemp=0x8FFFF;//Vicky 0816 dis
  586. DWORD Sd_DelayTemp; //Vicky0908 add
  587. Sd_DelayTemp=0xFFFFF;
  588. while(Sd_DelayTemp)
  589. {
  590. if( fTrue)
  591. {
  592. if(((*bCmd) & bStatus)==bStatus) 
  593. break;
  594. }
  595. else
  596. {
  597. if(((*bCmd) & bStatus)!=bStatus) 
  598. break;
  599. }
  600. Sd_DelayTemp--; 
  601. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:24
  602. if(!(PIN_SD_DETDAT&SD_CD)) //Walace050928 bug00059
  603. #else
  604. if(PIN_SD_DETDAT&SD_CD) //Walace050928 bug00059
  605. #endif
  606.         return FALSE;
  607.    
  608. }
  609. if(!Sd_DelayTemp) 
  610. return FALSE;
  611. return TRUE;
  612. }
  613. /*--------------------------------------------------------------------------
  614. Description:
  615. Polling until 
  616. gxbSDLastCardState is the same as bResponse 
  617. or Sd_DelayTemp is equal to zero .
  618. Arguments:
  619. bResponse:card's state 
  620. 0x00:IDLE, 0x01:READY, 0x02:IDENT, 0x03:STBY
  621. 0x04:TRAN, 0x05:DATA, 0x06:RCV, 0x07:PRG, 0x08:DIS-CON   
  622. Global arguments:
  623. gxbSDLastCardState: card's state, received from the response of CMD13.(i.e. R1) 
  624. --------------------------------------------------------------------------*/
  625. bit SD_RESP_DelayCount(BYTE bResponse) large//Vicky0908 modify
  626. {
  627. DWORD Sd_DelayTemp;
  628. Sd_DelayTemp=0xFFFFF;
  629. while(Sd_DelayTemp)
  630. {
  631. CMD13();
  632. SD_CheckR1();
  633. if(gxbSDLastCardState == bResponse)
  634. break;
  635. else
  636. Sd_DelayTemp--;
  637. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:24
  638. if(!(PIN_SD_DETDAT&SD_CD)) //Walace050928 bug00059
  639. #else
  640. if(PIN_SD_DETDAT&SD_CD) //Walace050928 bug00059
  641. #endif
  642.         return FALSE;
  643. }
  644. if(!Sd_DelayTemp) 
  645. return FALSE;
  646. return TRUE;
  647. }
  648. bit CMD13(void)
  649. {
  650.     obSDCMD = 0x0D;  // CMD13: SEND_STATUS
  651.     if(gxbSDCardType == SD_MODE)
  652.     {
  653.        SDArg();
  654.        obSDCTRL = SD_R1_AC_START;
  655.     }
  656.     else if(gxbSDCardType == MMC_MODE)
  657.     {
  658.        MMCArg();
  659.        obSDCTRL = MMC_R1_AC_START;
  660.     }
  661.     if(!SD_CheckStatus())
  662. return FALSE;
  663.     if(obSDSTS&SD_CRC_ERR)
  664.     {
  665.      SD_POWER_OFF();
  666.      return FALSE;
  667.     }
  668.     return TRUE;
  669. }
  670. //Common
  671. /***************************************************************************
  672. Wreite SD Arg  
  673. ***************************************************************************/
  674. //Arg: Addressed SD Card
  675. void SDArg(void)
  676. {
  677. obSDARG0=0x00;
  678.   obSDARG1=0x00;
  679.   obSDARG2=gxbRcaL;
  680.   obSDARG3=gxbRcaH;
  681. }
  682. //Arg: Addressed MMC Card 
  683. void MMCArg(void)
  684. {
  685.    obSDARG0=0x00;
  686.    obSDARG1=0x00;
  687.    obSDARG2=0x01;
  688.    obSDARG3=0x00;
  689. }
  690. //Arg: All Stuff bits
  691. void SDStuffArg(void)
  692. {
  693.    obSDARG0 = 0x00;
  694.    obSDARG1 = 0x00;
  695.    obSDARG2 = 0x00;
  696.    obSDARG3 = 0x00;
  697. }
  698. /******************************************************************************************
  699. //  SD Responses --- R1 (card status, 32 error bits)
  700. *******************************************************************************************/
  701. void SD_CheckR1(void)
  702. {
  703. //gbSDLastCardCMD=obSDRESP5;
  704. gxbSDLastCardState=(obSDRESP2>>1)&0x0F; 
  705. //Vicky051021#1 (Skip Out of Range Flag, FW will check END LBA)
  706. if((obSDRESP4&0x40)||(obSDRESP3&0xF8)) //Vicky041126#2
  707. gfR1Err=TRUE; //Vicky041126#2
  708. }
  709. #endif
  710. #if(_SD_INIT_)
  711. /*--------------------------------------------------------------------------
  712. Description:
  713. SD Initialization. Step 1. 
  714. Global arguments:
  715. gxbSd_cmd: the divisor to controll the SD/MMC Clock (<400KHZ)
  716. gxbSD_Error:  error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
  717. 2004/08/11: Edit by Vicky
  718. --------------------------------------------------------------------------*/
  719. void SD_Init1(void)
  720. {
  721. SD_POWER_OFF();
  722. SD_POWER_ON();
  723. SD_Delay(0x2FFF);//Power-up to ready need more than 50msec.
  724. obSYSSOFTRSTCTRL &= SD_RST_ENJ;
  725. obSYSSOFTRSTCTRL |= SD_RST_DIS; // Disable SD reset signal
  726. gxbSD_Error=0;
  727.   // MMC Clock = 20MHz 0x(98,02),SD Clock= 24MHz 0x(88,03)
  728. // #if((_PM_USB_ | _PM_MPTEST_)) 050528
  729. #if(_SD_CLK_USE_USB)
  730.      obCLKSDDIVF = 0x02; 
  731.  obCLKSDCTRL = 0x98;
  732. #else
  733. //Nick060327#1 mark it and add it.the same clk source with MCU. begin
  734. // obCLKSDDIVF = 0x02;
  735. //  obCLKSDCTRL = 0xb8; //73(67)/4=18.25(16.75) //David
  736. obCLKSDDIVF = 0x06;
  737. obCLKSDCTRL = 0xC8;  
  738. //Nick060327#1 mark it and add it.the same clk source with MCU. end
  739. #endif
  740.      SD_Delay(500);
  741. obSDFREQDIV = gxbSd_cmd; //<400k 
  742. obSDCLOCKWIDTH &=0xFE;//Vicky0908 add 
  743. //obSDCLOCKWIDTH = gxbSd_cmd/2;   //Vicky0908 del
  744. }
  745. /*--------------------------------------------------------------------------
  746. Description:
  747. SD Initialization. Step 2. 
  748. Global arguments:
  749. gxbSd_cmd:   the divisor to controll the SD/MMC Clock (<400KHZ)
  750. gxbSD_Error:    error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
  751. gxbSDCardType:   SD_MODE(SD),MMC_MODE(MMC)
  752.   gfSDinit:   TRUE, indicate SD/MMC Card had been initialized.
  753. gfSDWP:   TRUE, indicate SD/MMC Card is write-protected.
  754. gfSDPowerUp:  TRUE, indicate R1 Power UP bit=TRUE (i.e CMD1/ACMD41 PASS)
  755. gxbSDLastCardState:card's state, received from the response of CMD13.(i.e. R1) 
  756. 2004/08/11: Edit by Vicky
  757. --------------------------------------------------------------------------*/
  758. void SD_Init2(void) large
  759. {
  760.   WORD times; //retry times
  761.   gfSDinit = FALSE;
  762. gfSDWP=FALSE;
  763. gfSDPowerUp=FALSE;
  764. gxbSDMMCState = 0;//Nick061103
  765. CMD0();
  766.    CMD1_PRE();// This step is used to distinguish SD or MMC
  767.    SD_Delay(5000);   // Wait for CMD1 finished correctly//Vicky0909 change//Vicky0908 change
  768.    if((obSDSTS&SD_CMD_BUSY) == 0x00)   //MMC
  769.    {
  770.       gxbSDCardType = MMC_MODE;
  771. CMD1_PRE();     
  772.       if(!SD_CheckStatus())
  773.       return;     
  774.    }
  775. else //SD
  776.    { 
  777.    gxbSD_Error=0;
  778.      gxbSDCardType = SD_MODE;
  779. obSYSSOFTRSTCTRL&= SD_RST_ENJ;//SD reset.
  780. obSYSSOFTRSTCTRL|= SD_RST_DIS;//Disable SD reset.
  781.     //SD Clock=24MHz 0x(88,03)(usb);  24.3/22.3 MHz (b8,01)(DCV)
  782. // #if((_PM_USB_ | _PM_MPTEST_)) 050528
  783. #if(_SD_CLK_USE_USB)
  784.      obCLKSDDIVF = 0x03; //Vicky0908 add
  785. obCLKSDCTRL = 0x88;//Vicky0908 add
  786. #else
  787. //Nick060327#1 mark it and add it.the same clk source with MCU. begin
  788. // obCLKSDDIVF = 0x01;
  789. // obCLKSDCTRL = 0xb8; //73(67)/3=24.3(22.3) //David
  790. obCLKSDDIVF = 0x04;
  791. obCLKSDCTRL = 0xC8;
  792. //Nick060327#1 mark it and add it.the same clk source with MCU. end
  793. #endif
  794.      SD_Delay(50);
  795. obSDFREQDIV = gxbSd_cmd;
  796. obSDCLOCKWIDTH &=0xFE;//Vicky0908 add 
  797. //obSDCLOCKWIDTH = gxbSd_cmd/2; //Vicky0908 del 
  798. if(!CMD0())
  799. return;
  800. //Nick061103 start
  801. if(CMD8())
  802. {
  803. if(SD_CheckR7() != SD_VOTAGE_ACCEPT)
  804. return;
  805. gxbSDMMCState |= SD_20;
  806. }
  807. else
  808. {
  809. gxbSD_Error=0;
  810. obSYSSOFTRSTCTRL&= SD_RST_ENJ;//SD reset.
  811. obSYSSOFTRSTCTRL|= SD_RST_DIS;//Disable SD reset.
  812. obSDFREQDIV = gxbSd_cmd;
  813. obSDCLOCKWIDTH &=0xFE;//Vicky0908 add 
  814. }
  815. //Nick061103 end
  816.      if(!CMD55(FALSE))
  817.     return;
  818. ACMD41_PRE();    
  819.      if(!SD_CheckStatus())
  820.      return;     
  821. }//end of  check card type
  822. for(times=0;times<1000;times++)//Vicky 0809 change
  823. {
  824. SD_CheckR3();//Vicky0908 add 
  825.    if((obSDRESP4&SD_POWER_UP) == 0x80)
  826. {
  827. gfSDPowerUp=TRUE;
  828. //Nick061103 start
  829. if((gxbSDMMCState&SD_20) && (obSDRESP4&SD_CAPACITY_STATUS))
  830. gxbSDMMCState |= SD_HIGH_CAPACITY;
  831. //Nick061103 end
  832. break;
  833.    }
  834. else
  835. {
  836. gfSDPowerUp=FALSE;
  837. if(gxbSDCardType == MMC_MODE)
  838. {
  839. if(!CMD1())
  840. return;
  841. }
  842. else if(gxbSDCardType == SD_MODE)
  843. {
  844. if(!CMD55(FALSE))
  845. return;
  846.            if(!ACMD41())
  847. return;
  848. }
  849. }
  850. }
  851.  
  852. if(gfSDPowerUp==FALSE)
  853. return;
  854. gxbSD_Error=0;
  855. CMD2();
  856. if(!CMD3())
  857. return;
  858.    SD_CheckR6();
  859.    if(gxbSDLastCardState != SD_STATE_IDENT) 
  860. return;
  861.    if(!CMD9())
  862. return;
  863.    SD_CheckR2CSD();
  864.    if(!CMD7())
  865. return;
  866.    SD_CheckR1();
  867.    if(gxbSDLastCardState != SD_STATE_STBY)
  868.        return;
  869.    if(!CMD16())
  870. return;
  871.    if(gxbSDCardType == SD_MODE)
  872.    {  
  873. if(!CMD55(TRUE))
  874. return;
  875. if(!ACMD6()) // 4 bit bus width
  876. return;
  877. DETECT_SD_WP();
  878.   }
  879. //Nick061103#1 start
  880. if(gxbSDMMCState&MMC_Ver_40)
  881. {
  882. CMD6(Access_WriteByte, Index_BusWidth, 1, 0);//switch to 4 bit data bus
  883. if(CMD13())
  884. {
  885. if(!(obSDRESP0&0x80))//check if switch error
  886. {
  887. gxbSDMMCState |= MMC_4bit_data_bus;
  888. }
  889. }
  890. }
  891. //Nick061103#1 end
  892. gxbSD_Error=0;
  893. gfR1Err=FALSE;//Vicky041126#2
  894.    gfSDinit = TRUE;
  895. obSDFREQDIV = 0x01;  
  896.    obSDCLOCKWIDTH = 0x00;    
  897. }
  898. //Nick060309#1 mark it and add it. begin
  899. /*
  900. void SD_POWER_ON(void) //Vicky1005 remodify
  901. {
  902. PIN_SD_PDDAT&=SD_PDJ; //SD power on
  903. PIN_SD_PDDIR|=SD_PD; //PDJ(Output)
  904. obMODSEL1|=MOD_SD_EN;
  905. obGPIOGPUEN&=0xA0;
  906. gfSDPowerOn=TRUE;
  907. }
  908. */
  909. void SD_POWER_ON(void) //Vicky1005 remodify 
  910. {
  911. BYTE  j;
  912. WORD i;
  913. PIN_SD_PDDIR|=SD_PD; //PDJ(Output)
  914. for(i=0; i < 0x1FE; i++)
  915. {
  916. PIN_SD_PDDAT&=SD_PDJ; //SD power on
  917. PIN_SD_PDDAT|=SD_PD; //SD power off
  918. for(j = 0; j < 0x5F; j++){}
  919. }
  920. PIN_SD_PDDAT&=SD_PDJ; //SD power on
  921. obGPIOGPUEN &= 0xA0; // disable pull resistor on GPIOG0,1,2,3,4,6
  922. obMODSEL1|=MOD_SD_EN;
  923. gfSDPowerOn=TRUE;
  924. }
  925. //Nick060309#1 mark it and add it. end
  926. /*--------------------------------------------------------------------------
  927. Description:
  928. Check whether SD Card is write-protected or not.(SD Card Only)
  929. Global arguments:
  930. gfSDWP: TRUE, indicate that SD Card is write-protected.
  931. 2004/08/11: Edit by Vicky
  932. --------------------------------------------------------------------------*/
  933. void  DETECT_SD_WP(void) //Vicky01019 //vicky050506#1
  934. {
  935. #if(SETTING_FOR_ICE_START|(SD_WP_SWTICH==0)) //allen050628 //Vicky060606#1
  936. if(DEBUG_SDWP) //050528
  937. gfSDWP=TRUE;
  938. else
  939. gfSDWP=FALSE;
  940. #else
  941. #if(_SD_DET_PULL)
  942. PIN_SD_WPDIR&=(~SD_WP);
  943. obGPIOHPUEN |=SD_WP; 
  944. obGPIOHPUHI |=SD_WP; 
  945. #else
  946. PIN_SD_WPDAT|=SD_WP;
  947. PIN_SD_WPDIR|=SD_WP;
  948. #endif
  949. gfSDWP=FALSE;
  950. if(PIN_SD_WPDAT&SD_WP)
  951. gfSDWP=TRUE;
  952. #if(_SD_DET_PULL)
  953. obGPIOHPUEN &=(~SD_WP); 
  954. #else
  955. PIN_SD_WPDIR&=(~SD_WP);
  956. #endif
  957. #endif
  958. }
  959. //Basic command
  960. bit CMD0(void)
  961. {
  962. obSDCMD = 0x00;  // CMD0: GO_IDLE_STATE
  963. SDStuffArg();  
  964.      obSDCTRL = 0x01;
  965.      SD_Delay(1000);//Vicky 0810 del 
  966.       if(!SD_CheckStatus())
  967. return FALSE;
  968.      if(obSDSTS&SD_CRC_ERR) 
  969. return FALSE;
  970. return TRUE;
  971. }
  972. void CMD1_PRE(void)
  973. {
  974. obSDCMD = 0x01;
  975.    obSDARG3 = 0x00;
  976.    obSDARG2 = 0xFF;
  977.    obSDARG1 = 0x00;
  978.    obSDARG0 = 0x00;
  979.    obSDCTRL = MMC_MODE&SD_RESP_R3|SD_CMD_BCR|SD_CMD_START;
  980. }
  981. bit CMD1(void)
  982. {
  983. if(gxbSd_cmd<91)//Vicky0908 add
  984. {
  985. obSDCMD = 0x01;  // CMD1: SEND_OP_COND    
  986.      SDOCRArg();
  987.      obSDCTRL = MMC_MODE|SD_RESP_R3|SD_CMD_BCR|SD_CMD_START;  //0x33
  988. }
  989. else
  990. CMD1_PRE();
  991.      if(!SD_CheckStatus())
  992. return FALSE;
  993.      if(obSDSTS&SD_CRC_ERR)
  994. return FALSE;
  995. return TRUE;
  996. }
  997. bit CMD2(void)
  998. {
  999. obSDCMD = 0x02;  // CMD2: ALL_SEND_CID
  1000.      SDStuffArg();
  1001.      if(gxbSDCardType == SD_MODE)
  1002. {obSDCTRL = SD_MODE|SD_RESP_R2|SD_CMD_BCR|SD_CMD_START;}
  1003.      else if(gxbSDCardType == MMC_MODE)
  1004.      {obSDCTRL = MMC_MODE&SD_RESP_R2|SD_CMD_BCR|SD_CMD_START;}
  1005.      if(!SD_CheckStatus())
  1006. return FALSE;
  1007.      if(obSDSTS&SD_CRC_ERR)
  1008. return FALSE;
  1009. return TRUE;
  1010. }
  1011. bit CMD3(void)
  1012. {
  1013. obSDCMD = 0x03;  
  1014.      if(gxbSDCardType == SD_MODE)// CMD3: SEND_RELATIVE_ADDR
  1015.      {
  1016.         SDStuffArg();
  1017.         obSDCTRL = SD_MODE|SD_RESP_R6|SD_CMD_BCR|SD_CMD_START;
  1018.      }
  1019.      else if(gxbSDCardType == MMC_MODE)// CMD3: SET_RELATIVE_ADDR
  1020.      {
  1021.         MMCArg();
  1022.         obSDCTRL =MMC_R1_AC_START;
  1023.      }
  1024.      if(!SD_CheckStatus())
  1025. return FALSE;
  1026.      if(obSDSTS&SD_CRC_ERR)
  1027. return FALSE;
  1028. return TRUE;
  1029. }
  1030. //Nick061103#1 start MMC 40 later only
  1031. bit CMD6(BYTE bAccess, BYTE bIndex, BYTE bValue, BYTE CMDSet)
  1032. {
  1033. obSDCMD = 0x06;  // CMD6: switch
  1034.    obSDARG0=CMDSet;
  1035.    obSDARG1=bValue;
  1036.    obSDARG2=bIndex;
  1037.    obSDARG3=bAccess;
  1038.        obSDCTRL =MMC_R1_AC_START;
  1039.    
  1040.      if(!SD_CheckStatus())
  1041. return FALSE;
  1042.      if(obSDSTS&SD_CRC_ERR)
  1043. return FALSE;
  1044. return TRUE;
  1045. }
  1046. //Nick061103#1 end
  1047. bit CMD7(void)
  1048. {
  1049. obSDCMD = 0x07;  // CMD7: SELECT/DESELECT_CARD
  1050.      if(gxbSDCardType == SD_MODE)
  1051.      {
  1052. SDArg();
  1053.         obSDCTRL = SD_R1_AC_START;
  1054.      }
  1055.      else if(gxbSDCardType == MMC_MODE)
  1056.      {
  1057.         MMCArg();
  1058.         obSDCTRL =MMC_R1_AC_START;
  1059.     }
  1060.      if(!SD_CheckStatus())
  1061. return FALSE;
  1062.      if(obSDSTS&SD_CRC_ERR)
  1063. return FALSE;
  1064. return TRUE;
  1065. }
  1066. //Nick061103 start
  1067. bit CMD8(void)
  1068. {
  1069. obSDCMD = 0x08;  // CMD8: send interface condition SEND_IF_COND
  1070.         
  1071. obSDARG0=SD_CMD8_CHECK_PATTERN;//check pattern
  1072.   obSDARG1=0x01; //supply votage 0001b 2.7~3.6V
  1073.   obSDARG2=0x00;//reserved bit
  1074.   obSDARG3=0x00; //reserved bit
  1075. //actually response of CMD9 is R7, but it's 48 bits, the same with R6. 
  1076.     obSDCTRL = SD_MODE|SD_RESP_R6|SD_CMD_BCR|SD_CMD_START;
  1077.     
  1078.      if(!SD_CheckStatus())
  1079. return FALSE;
  1080.      if(obSDSTS&SD_CRC_ERR)
  1081. return FALSE;
  1082. return TRUE;
  1083. }
  1084. //Nick061103 end
  1085. bit CMD9(void)
  1086. {
  1087. obSDCMD = 0x09;  // CMD9: SEND_CSD
  1088.      if(gxbSDCardType == SD_MODE)
  1089.      {
  1090.         SDArg();
  1091.         obSDCTRL = SD_MODE|SD_RESP_R2|SD_CMD_AC_CMD|SD_CMD_START;
  1092.      }
  1093.      else if(gxbSDCardType == MMC_MODE)
  1094.      {
  1095.         MMCArg();
  1096.         obSDCTRL = MMC_MODE&SD_RESP_R2|SD_CMD_AC_CMD|SD_CMD_START;
  1097.      }
  1098.      if(!SD_CheckStatus())
  1099. return FALSE;
  1100.      if(obSDSTS&SD_CRC_ERR)
  1101. return FALSE;
  1102. return TRUE;
  1103. }
  1104. bit CMD16(void)
  1105. {
  1106.     obSDCMD = 0x10;  // CMD16: SET_BLOCKLEN
  1107.     obSDARG3 = 0x00;
  1108.     obSDARG2 = 0x00;
  1109.     obSDARG1 = 0x02;
  1110.     obSDARG0 = 0x00;
  1111.     gxdwSD_Blocknum = gxdwSD_Blocknum * (gxdwSD_Blocklen/512); //Nick060425#1
  1112.     gxdwSD_Blocklen = 512;
  1113.     if(gxbSDCardType == SD_MODE)
  1114.           obSDCTRL = SD_R1_AC_START;    
  1115.     else if(gxbSDCardType == MMC_MODE)
  1116.            obSDCTRL = MMC_R1_AC_START;
  1117.     
  1118.     if(!SD_CheckStatus())
  1119. return FALSE;
  1120.     if(obSDSTS&SD_CRC_ERR)
  1121. return FALSE;
  1122.     return TRUE;
  1123. }
  1124. bit ACMD6(void)
  1125. {
  1126. obSDCMD = 0x06;  // ACMD6: SET_BUS_WIDTH
  1127. obSDARG3 = 0x00;
  1128. obSDARG2 = 0x00;
  1129. obSDARG1 = 0x00;
  1130. obSDARG0 = 0x02;
  1131. obSDCTRL = SD_R1_AC_START;
  1132. if(!SD_CheckStatus())
  1133. return FALSE;
  1134. if(obSDSTS&SD_CRC_ERR)
  1135. return FALSE;
  1136. return TRUE;
  1137. }
  1138. void ACMD41_PRE(void)
  1139. {
  1140. obSDCMD = 0x29;
  1141. if(gxbSDMMCState&SD_20) //Nick061103
  1142. {
  1143.      obSDARG3 = 0x40; //support HCS
  1144.      obSDARG2 = 0xFF; //support votage range 2.7~3.6
  1145.      obSDARG1 = 0x80; //support votage range 2.7~3.6
  1146.      obSDARG0 = 0x00;
  1147. }
  1148. else
  1149. {
  1150.      obSDARG3 = 0x00;
  1151.      obSDARG2 = 0xFF;
  1152.      obSDARG1 = 0x00;
  1153.      obSDARG0 = 0x00;
  1154. }
  1155.      obSDCTRL = SD_MODE|SD_RESP_R3|SD_CMD_BCR|SD_CMD_START;
  1156. }
  1157. bit ACMD41(void)
  1158. {
  1159.     obSDCMD = 0x29;  // ACMD41: SD_APP_OP_COND
  1160.     SDOCRArg();
  1161.     obSDCTRL = SD_MODE|SD_RESP_R3|SD_CMD_BCR|SD_CMD_START;  //0xB3
  1162.     if(!SD_CheckStatus())
  1163. return FALSE;;
  1164.     if(obSDSTS&SD_CRC_ERR)
  1165. return FALSE;
  1166. return TRUE;
  1167. }
  1168. // REG
  1169. //Arg: OCR, Operation Condition REG  
  1170. void SDOCRArg(void)
  1171. {
  1172.    obSDARG0=gxbOCR[0];
  1173.    obSDARG1=gxbOCR[1];
  1174.    obSDARG2=gxbOCR[2];
  1175.    obSDARG3=gxbOCR[3];
  1176. }
  1177. //Nick061103 start
  1178. BYTE SD_CheckR7(void)
  1179. {
  1180.      if(obSDSTS&SD_CRC_ERR)
  1181. return SD_CRC_ERR;
  1182. if(obSDRESP1 != 0xAA)
  1183. return SD_CMD8_CHECK_PATTERN_ERR;
  1184. if((obSDRESP2&0x0F) != 0x01)
  1185. return SD_CMD8_VOTAGE_NOT_SUPPORT;
  1186. return SD_VOTAGE_ACCEPT;
  1187. }
  1188. //Nick061103 end
  1189. //R6 (get card's Relative addr.SD only)
  1190. void SD_CheckR6(void)
  1191. {
  1192. //gbSDLastCardCMD=obSDRESP5;
  1193. gxbSDLastCardState=(obSDRESP2>>1)&0x0F;
  1194.      if(gxbSDCardType==SD_MODE)
  1195.      {             
  1196.      gxbRcaL=obSDRESP3;
  1197.          gxbRcaH=obSDRESP4;
  1198.      } 
  1199. }
  1200. //R3 (OCR, Operation Condition REG)
  1201. void SD_CheckR3(void)
  1202. {
  1203.     gxbOCR[0]=obSDRESP1;  // OCR bit[ 7: 0]
  1204.     gxbOCR[1]=obSDRESP2;  // OCR bit[15: 8]
  1205.     gxbOCR[2]=obSDRESP3;  // OCR bit[23:16]
  1206.     gxbOCR[3]=obSDRESP4;  // OCR bit[31:24]
  1207. }
  1208. //R2 (CSD, Card Specific REG)
  1209. void SD_CheckR2CSD(void) large //Vicky1005 remodify
  1210. XBYTE c_size_mult;
  1211. //BYTE c_size_mult_0,c_size_mult_1;
  1212. DWORD c_size;
  1213. //WORD c_size_0,c_size_1,c_size_2;
  1214. WORD mult;
  1215. BYTE rd_block_len;
  1216. //BYTE wr_block_len;//Vicky 0812 del 
  1217. //c_size_mult_0=obSDRESP5&0x80;
  1218. //c_size_mult_1=obSDRESP6&0x03;
  1219. //c_size_mult=(c_size_mult_0>>7)|(c_size_mult_1<<1);
  1220. SD_Delay(100);//Vicky1005 add(important, can't del)
  1221. c_size_mult=((obSDRESP5&0x80)>>7)+((obSDRESP6&0x03)<<1);
  1222. //c_size_mult=((0x80)>>7)+((obSDRESP6&0x03)<<1);
  1223. switch(c_size_mult)
  1224. {
  1225. case 0:mult=4;break;
  1226. case 1:mult=8;break;
  1227. case 2:mult=16;break;
  1228. case 3:mult=32;break;
  1229. case 4:mult=64;break;
  1230. case 5:mult=128;break;
  1231. case 6:mult=256;break;
  1232. case 7:mult=512;break;
  1233. default:mult=1024;break;
  1234. }
  1235. //c_size_0=obSDRESP7&0xC0;
  1236. //c_size_1=obSDRESP8;
  1237. //c_size_2=obSDRESP9&0x03;
  1238. //c_size=(c_size_0>>6)|(c_size_1<<2)|(c_size_2<<10);
  1239. if(gxbSDMMCState&SD_HIGH_CAPACITY) //Nick061103 start
  1240. {
  1241. c_size = (((DWORD)(obSDRESP8&0x3F))<<16) |(((DWORD)obSDRESP7)<<8) |((DWORD)obSDRESP6);
  1242. gxdwSD_Blocknum = (c_size+1) << 10;
  1243. }
  1244. else
  1245. {
  1246. c_size=(((WORD)(obSDRESP7&0xC0))>>6)+(((WORD)(obSDRESP8))<<2)+(((WORD)obSDRESP9&0x03)<<10);
  1247. gxdwSD_Blocknum=((DWORD)(c_size+1)*(DWORD)mult); //Vicky051021#1
  1248. }//Nick061103 end
  1249. //gxdwSD_Blocknum=((DWORD)(c_size+1)*(DWORD)mult); //Vicky051021#1 //Nick061103 remove
  1250. rd_block_len=obSDRESPA&0x0F;
  1251. //wr_block_len=((obSDRESP2&0xC0)>>6)|((obSDRESP3&0x03)<<2);//Vicky 0812 del
  1252. //if(rd_block_len!=wr_block_len) gxwSDMaxBlockLength=0x8000;
  1253. //Nick061103 start
  1254. gxdwSD_Blocklen = 1;
  1255. gxdwSD_Blocklen <<= rd_block_len;
  1256. /* switch(rd_block_len)
  1257. {
  1258. case 0:gxdwSD_Blocklen=1;break;
  1259. case 1:gxdwSD_Blocklen=2;break;
  1260. case 2:gxdwSD_Blocklen=4;break;
  1261. case 3:gxdwSD_Blocklen=8;break;
  1262. case 4:gxdwSD_Blocklen=16;break;
  1263. case 5:gxdwSD_Blocklen=32;break;
  1264. case 6:gxdwSD_Blocklen=64;break;
  1265. case 7:gxdwSD_Blocklen=128;break;
  1266. case 8:gxdwSD_Blocklen=256;break;
  1267. case 9:gxdwSD_Blocklen=512;break;
  1268. case 10:gxdwSD_Blocklen=1024;break;
  1269. case 11:gxdwSD_Blocklen=2048;break;
  1270. case 12:
  1271. case 13:
  1272. case 14:
  1273. case 15:gxdwSD_Blocklen=4096;break;
  1274. }*/
  1275. //Nick061103 end
  1276. //gxwSDMaxBlockLength=gxwSDMaxBlockLength|gxdwSD_Blocklen; //Vicky1005
  1277. //Vicky 0812 del
  1278. /*
  1279. gxbSDSmallerBlockAllowed=0;
  1280. if(obSDRESP9&0x80) //Read_BL_partial
  1281. gxbSDSmallerBlockAllowed=0x01;
  1282. if(obSDRESP2&0x20) //Write_BL_partial
  1283. gxbSDSmallerBlockAllowed=gxbSDSmallerBlockAllowed|0x10;
  1284. */
  1285. //gxbSD_TRAN_SPEED=obSDRESPC;//Vicky 0812 del
  1286. //temp1=obSDRESP5;
  1287. if(obSDRESP1&0x20)
  1288. gfSDWP=TRUE;
  1289. //Nick061103#1 start
  1290. if((gxbSDCardType == MMC_MODE) && ((obSDRESPF&0x3C) == 0x10))//check if MMC 4.0
  1291. gxbSDMMCState |= MMC_Ver_40;
  1292. //Nick061103#1 end
  1293. #if(SETTING_FOR_ICE_START|(SD_WP_SWTICH==0)) //allen050628 //Vicky060606#1
  1294. if(DEBUG_SDWP) //050528
  1295. gfSDWP=TRUE;
  1296. else
  1297. gfSDWP=FALSE;
  1298. #endif
  1299. return;
  1300. }
  1301. //Tool
  1302. void SD_Delay(unsigned int DelayCnt) 
  1303. {
  1304. while(DelayCnt) {DelayCnt--;}
  1305. }
  1306. #endif
  1307. //Basic Command
  1308. #if(_SD_READ_|_SD_WRITE_)
  1309. bit CMD12(bit fpolling)  // Stop Command for Write
  1310. {
  1311. obSDCMD = 0x0C;  // CMD12: STOP_TRANSMISSION
  1312.      SDStuffArg();
  1313.      if(gxbSDCardType == SD_MODE)
  1314. {obSDCTRL =SD_R1_AC_START;}  // obSDCTL = 0x95
  1315.      else if(gxbSDCardType == MMC_MODE)
  1316.      {obSDCTRL = MMC_R1_AC_START;}
  1317.      if(!SD_CheckStatus())
  1318.          return FALSE;
  1319. if(fpolling)
  1320. {
  1321. if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0)) 
  1322. {
  1323. gxbSD_Error=ERR_SD_DAT_TBUSY; 
  1324. return FALSE;
  1325. }
  1326. }
  1327.      if(obSDSTS&SD_CRC_ERR)
  1328. {
  1329. gxbSD_Error=ERR_SD_CRC;
  1330. SD_POWER_OFF();//Vicky 0817 add
  1331. return FALSE;
  1332. }
  1333. return TRUE;
  1334. }
  1335. #endif
  1336. #if(_SD_READ_)
  1337. void CMD18PRE(DWORD dwLBA) large
  1338. {
  1339. obSDCMD = 0x12;
  1340. obSDARG3 = *((BYTE*)&dwLBA + 0);
  1341. obSDARG2 = *((BYTE*)&dwLBA + 1);
  1342. obSDARG1 = *((BYTE*)&dwLBA + 2);
  1343. obSDARG0 = *((BYTE*)&dwLBA + 3);
  1344. if(gxbSDCardType == SD_MODE || gxbSDMMCState&MMC_4bit_data_bus)//Nick061103#1
  1345. {obSDCTRL = SD_MODE|SD_RESP_R1|SD_CMD_ADTC_RD|SD_CMD_START;}
  1346. else if(gxbSDCardType == MMC_MODE)
  1347. {obSDCTRL = MMC_MODE&SD_RESP_R1|SD_CMD_ADTC_RD|SD_CMD_START;}
  1348. }
  1349. #endif
  1350. #if(_SD_WRITE_)
  1351. bit CMD55(bit fRCA)
  1352. {
  1353. obSDCMD = 0x37;  // CMD55: APP_CMD
  1354. if(fRCA)
  1355. SDArg();
  1356. else
  1357. SDStuffArg();   
  1358.   obSDCTRL = SD_R1_AC_START;  //0x95
  1359.      if(!SD_CheckStatus())
  1360. return FALSE;
  1361.      if(obSDSTS&SD_CRC_ERR) 
  1362. {
  1363. gxbSD_Error=ERR_SD_CRC;
  1364. return FALSE;
  1365.      }
  1366. return TRUE;
  1367. }
  1368. bit ACMD23(WORD wlen) large
  1369. {
  1370. obSDCMD = 0x17;  // ACMD23: SET_WR_BLK_ERASE_COUNT
  1371. obSDARG3 = 0x00;
  1372. obSDARG2 = 0x00;
  1373. obSDARG1 = *((BYTE*)&wlen + 0);
  1374. obSDARG0 = *((BYTE*)&wlen + 1);
  1375. obSDCTRL = SD_R1_AC_START;//0x95
  1376. if(!SD_CheckStatus())
  1377. return FALSE;
  1378. if(obSDSTS&SD_CRC_ERR)
  1379. {
  1380. gxbSD_Error=ERR_SD_CRC;
  1381. SD_POWER_OFF();
  1382. return FALSE;
  1383. }
  1384. return TRUE;
  1385. }
  1386. void CMD25PRE(DWORD dwLBA) large
  1387. {
  1388. obSDCMD = 0x19;
  1389. obSDARG3 = *((BYTE*)&dwLBA + 0);
  1390. obSDARG2 = *((BYTE*)&dwLBA + 1);
  1391. obSDARG1 = *((BYTE*)&dwLBA + 2);
  1392. obSDARG0 = *((BYTE*)&dwLBA + 3);
  1393. if(gxbSDCardType == SD_MODE || gxbSDMMCState&MMC_4bit_data_bus)//Nick061103#1
  1394.         {obSDCTRL = SD_MODE|SD_RESP_R1|SD_CMD_ADTC_WR|SD_CMD_START;}
  1395. else if(gxbSDCardType == MMC_MODE)
  1396.         {obSDCTRL = MMC_MODE&SD_RESP_R1|SD_CMD_ADTC_WR|SD_CMD_START;}
  1397. }
  1398. #endif
  1399. #if(_SD_API_ATAPI_)
  1400. API void CardDetach(void) //Vicky1019  //Vicky050506#1
  1401. {
  1402.        #if( _SD_DET_PULL)
  1403.    //Nick060808 start
  1404. PIN_SD_DETDIR&=(~SD_CD);
  1405. PIN_SD_DET_PULL_EN|=SD_CD;
  1406. PIN_SD_DET_PULL_HIGH|=SD_CD;
  1407. //Nick060808 end
  1408. #else
  1409. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
  1410. PIN_SD_DETDAT&=~SD_CD;
  1411. PIN_SD_DETDIR&=~SD_CD;
  1412. #else
  1413. PIN_SD_DETDAT|=SD_CD;
  1414. PIN_SD_DETDIR|=SD_CD;
  1415. #endif
  1416. #endif
  1417. if(gfSDPowerOn==TRUE)
  1418. {
  1419. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
  1420. if((!(PIN_SD_DETDAT&SD_CD))||(!gfSDinit))//Vicky1005 change
  1421. #else
  1422. if((PIN_SD_DETDAT&SD_CD)||(!gfSDinit))//Vicky1005 change
  1423. #endif
  1424. SD_POWER_OFF();
  1425. }
  1426. else
  1427. {
  1428. #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
  1429. if(!(PIN_SD_DETDAT&SD_CD))//Vicky1005 change
  1430. #else
  1431. if(PIN_SD_DETDAT&SD_CD)//Vicky1005 change
  1432. #endif
  1433. {
  1434. gfSDinit=FALSE;
  1435. gfSDStop=FALSE;
  1436. }
  1437. }
  1438. #if( _SD_DET_PULL)
  1439. PIN_SD_DET_PULL_EN&=(~SD_CD); //Nick060808  
  1440. #else
  1441. PIN_SD_DETDIR&=(~SD_CD);
  1442. #endif
  1443. }
  1444. /*--------------------------------------------------------------------------
  1445. Description:
  1446. ATAPI FunC.
  1447. (Send 8 bytes data to PC, 
  1448. including the number of blocks in card(4 bytes),the number of bytes in a block(4bytes).)
  1449. when accepted Read-Capacity CMD(opcode=0x25).
  1450. Global arguments:
  1451. gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
  1452. gxdwSD_Blocklen: the number of bytes in a block.
  1453. 2004/08/11: Edit by Vicky
  1454. --------------------------------------------------------------------------*/
  1455. API void SDReadCapa(void) //Vicky051021#1 fix the error capa (Should return the end LBA)
  1456. {
  1457. DWORD dwcapa;
  1458. if(gxdwSD_Blocknum)
  1459. dwcapa=gxdwSD_Blocknum-1;
  1460. else
  1461. dwcapa=0;
  1462. // Logical Block Address (MSB first)
  1463. WaitEPANotFull(); obUSBDEVEPAFIFO = (dwcapa >> 24) & 0xFF;
  1464. WaitEPANotFull(); obUSBDEVEPAFIFO = (dwcapa >> 16) & 0xFF;
  1465. WaitEPANotFull(); obUSBDEVEPAFIFO = (dwcapa >> 8) & 0xFF;
  1466. WaitEPANotFull(); obUSBDEVEPAFIFO = dwcapa & 0xFF;
  1467. // Block Length in Bytes (MSB first)
  1468. WaitEPANotFull(); obUSBDEVEPAFIFO = (gxdwSD_Blocklen >> 24) & 0xFF;
  1469. WaitEPANotFull(); obUSBDEVEPAFIFO = (gxdwSD_Blocklen >> 16) & 0xFF;
  1470. WaitEPANotFull(); obUSBDEVEPAFIFO = (gxdwSD_Blocklen >> 8) & 0xFF;
  1471. WaitEPANotFull(); obUSBDEVEPAFIFO = gxdwSD_Blocklen & 0xFF;
  1472. }
  1473. /*--------------------------------------------------------------------------
  1474. Description:
  1475. ATAPI FunC.(Send 8 bytes data to PC, including card's write-protected information.)
  1476. when accepted Modesense6 CMD(opcode=0x1A).
  1477. Global arguments:
  1478. gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
  1479. gfSDWP: TRUE,the SD/MMC card is write-protected.
  1480. 2004/08/11: Edit by Vicky
  1481. --------------------------------------------------------------------------*/
  1482. /*API void SDModeSense6Data(void) //Nick060531 mark it
  1483. {
  1484. //obUSBDEVEPAFIFO = 0x08;
  1485. obUSBDEVEPAFIFO = 0x3E;
  1486. obUSBDEVEPAFIFO = 0x00;
  1487. if( gfSDWP==TRUE )
  1488. obUSBDEVEPAFIFO = 0x80;
  1489. else
  1490. obUSBDEVEPAFIFO = 0x00;
  1491. if(gxbSDCardType == SD_MODE)
  1492. obUSBDEVEPAFIFO = 0x08;
  1493. else
  1494. obUSBDEVEPAFIFO = 0x01;
  1495. obUSBDEVEPAFIFO = 0x00;
  1496. obUSBDEVEPAFIFO = 0x00;
  1497. obUSBDEVEPAFIFO = 0x00;
  1498. }*/
  1499. /*--------------------------------------------------------------------------
  1500. Description:
  1501. Write data to SD. (data Source: USB )
  1502. Arguments:
  1503. Global arguments:
  1504. gdwCBWDataTransferLength: the number of bytes to be transfered.
  1505. gxdwLBA_address:  the LBA of Source  (in SD/MMC Card)
  1506. gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
  1507. gxwSD_SecCnt: the number of Blocks to be transfered everytime ,when SD_USBRead() is called.
  1508. gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
  1509. gfSplitCommand: TRUE,the number of Blocks to be transfered is more than 255.
  1510. gfR1Err: TRUE,R1 report error.
  1511. gxbSD_Error:  error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
  1512. Returns: 
  1513. TRUE: all data are transfered to USB.
  1514. FALSE: some error occured.
  1515. 2004/08/11: Edit by Vicky
  1516. --------------------------------------------------------------------------*/
  1517. API bit SD_USBWrite(void)large//Vicky0908 modify //Vicky050506#1
  1518. {
  1519. BYTE SD_SecCnt;
  1520. gxbSD_Error=0;//Vicky0908 add
  1521. if(!SD_Det(SD_DET)) //Nick060808 add SD_DET
  1522. return FALSE;
  1523. if( gbCBWCB[8] == 0 ) 
  1524. {
  1525. gxwSD_SecCnt = 0x100;//256 Block
  1526. SD_SecCnt=0xff;
  1527. gbCBWCB[7]--;
  1528. }
  1529. else 
  1530. {
  1531. gxwSD_SecCnt = (WORD)gbCBWCB[8];
  1532. SD_SecCnt=gbCBWCB[8]-1;
  1533. }
  1534.      obSDBLOCKLENH = 0x02;
  1535.      obSDBLOCKLENL = 0x00;
  1536. if( !gfSplitCommand )
  1537. {
  1538. obUSBOTGDMACLR = *((BYTE *)&gdwCBWDataTransferLength+3);
  1539. obUSBOTGDMACMR = *((BYTE *)&gdwCBWDataTransferLength+2);
  1540. obUSBOTGDMACHR= *((BYTE *)&gdwCBWDataTransferLength+1);
  1541. obUSBOTGSPEED &= TRANSFER_DISJ; //disable DMA
  1542. obMODSEL3 |= BYPASS_RA;     //bypass RA
  1543. obSOURCEPATHCTRL = 0x13; //Source USB
  1544. obTARGETPATHCTRL = 0x10; //Target SD
  1545. obUSBOTGSPEED |= TRANSFER_EN; //Enable DMA
  1546. }
  1547. *((BYTE*)&gxdwLBA_address + 0) = gbCBWCB[2];
  1548. *((BYTE*)&gxdwLBA_address + 1) = gbCBWCB[3];
  1549. *((BYTE*)&gxdwLBA_address + 2) = gbCBWCB[4];
  1550. *((BYTE*)&gxdwLBA_address + 3) = gbCBWCB[5];
  1551. if(   (gxdwLBA_address>gxdwSD_Blocknum) ||  //Vicky051221#3
  1552. ((gxdwLBA_address+(DWORD)SD_SecCnt+1) > gxdwSD_Blocknum)) //Vicky051021#1
  1553. {
  1554. obUSBOTGSPEED &= TRANSFER_DISJ; //disable DMA
  1555. //SDError();//Vicky1005 del
  1556. //SD_POWER_OFF();
  1557. return FALSE;
  1558. }
  1559. if(!(gxbSDMMCState&SD_HIGH_CAPACITY))//Nick061103
  1560. gxdwLBA_address = (gxdwLBA_address<<9);
  1561. if(gxbSDCardType == SD_MODE)
  1562.        {
  1563. if(!CMD55(TRUE))
  1564. {
  1565. gxbSD_Error|=ERR_SD_CMD55;
  1566. return FALSE;
  1567. }
  1568. if(!ACMD23(gxwSD_SecCnt))
  1569. {
  1570. gxbSD_Error|=ERR_SD_ACMD23;
  1571. return FALSE;
  1572. }
  1573.         }
  1574. obSDBLOCKNUM = SD_SecCnt;
  1575. CMD25PRE(gxdwLBA_address);
  1576. if(!SDpolling(&obSDCTRL,SD_CMD_START,0))
  1577. {
  1578. gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_START; 
  1579. return FALSE;
  1580. }
  1581. if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0))
  1582. {
  1583. gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_BUSY; 
  1584. return FALSE;
  1585. }
  1586. SD_CheckR1();
  1587. if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
  1588. {
  1589. gxbSD_Error=ERR_SD_CMD25|ERR_SD_DAT_TBUSY; 
  1590. return FALSE;
  1591. }
  1592. if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1))
  1593. {
  1594. gxbSD_Error=ERR_SD_CMD25|ERR_SD_DATLINE_BUSY; 
  1595. return FALSE;
  1596. }
  1597. if(!CMD12(TRUE))
  1598. {
  1599. gxbSD_Error|=ERR_SD_CMD12;
  1600. return FALSE;
  1601. }
  1602. obSDCLOCKWIDTH |= 0x01;
  1603. if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1))
  1604. {
  1605. gxbSD_Error=ERR_SD_CMD12|ERR_SD_DATLINE_BUSY; 
  1606. return FALSE;
  1607. }
  1608.    obSDCLOCKWIDTH &= 0xFE;   
  1609. if(!SD_RESP_DelayCount(SD_STATE_TRAN))
  1610. {
  1611. gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE; 
  1612. return FALSE;
  1613. }
  1614. if(gfR1Err) //Vicky041126#2
  1615. return FALSE; //Vicky041126#2
  1616. return TRUE;
  1617. }
  1618. /*--------------------------------------------------------------------------
  1619. Description:
  1620. Read data from SD. (data Target: USB )
  1621. Arguments:
  1622. Global arguments:
  1623. gdwCBWDataTransferLength: the number of bytes to be transfered.
  1624. gxdwLBA_address:  the LBA of Source  (in SD/MMC Card)
  1625. gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
  1626. gxwSD_SecCnt: the number of Blocks to be transfered everytime ,when SD_USBRead() is called.
  1627. gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
  1628. gfSplitCommand: TRUE,the number of Blocks to be transfered is more than 255.
  1629. gfR1Err: TRUE,R1 report error.
  1630. gxbSD_Error:  error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
  1631. Returns: 
  1632. TRUE: all data are transfered to USB.
  1633. FALSE: some error occured.
  1634. 2004/08/11: Edit by Vicky
  1635. --------------------------------------------------------------------------*/
  1636. API bit SD_USBRead(void) large//Vicky0908 modify
  1637. {
  1638. BYTE SD_SecCnt;
  1639. gxbSD_Error=0;//Vicky0908 add
  1640. if(!SD_Det(SD_DET)) //Nick060808 add SD_DET
  1641. return FALSE;
  1642. if( gbCBWCB[8] == 0 ) 
  1643. {
  1644. gxwSD_SecCnt = 0x100;//256 Block
  1645. SD_SecCnt=0xff;
  1646. gbCBWCB[7]--;
  1647. }
  1648. else 
  1649. {
  1650. gxwSD_SecCnt = (WORD)gbCBWCB[8];
  1651. SD_SecCnt=gbCBWCB[8]-1;
  1652. }
  1653. obSDBLOCKLENH = 0x02;
  1654.        obSDBLOCKLENL = 0x00;
  1655. if(!gfSplitCommand)
  1656. {
  1657. obUSBOTGDMACLR = *((BYTE *)&gdwCBWDataTransferLength+3);
  1658. obUSBOTGDMACMR = *((BYTE *)&gdwCBWDataTransferLength+2);
  1659. obUSBOTGDMACHR= *((BYTE *)&gdwCBWDataTransferLength+1);
  1660. obUSBOTGSPEED &= TRANSFER_DISJ; //disable DMA
  1661. obMODSEL3 |= BYPASS_RA;     //bypass RA
  1662. obSOURCEPATHCTRL = 0x10; //Source SD
  1663. obTARGETPATHCTRL = 0x13; //Target USB
  1664. obUSBOTGSPEED |= TRANSFER_EN; //Enable DMA
  1665. }
  1666. obSDBLOCKNUM = SD_SecCnt;
  1667. *((BYTE*)&gxdwLBA_address + 0) = gbCBWCB[2];
  1668.      *((BYTE*)&gxdwLBA_address + 1) = gbCBWCB[3];
  1669. *((BYTE*)&gxdwLBA_address + 2) = gbCBWCB[4];
  1670.       *((BYTE*)&gxdwLBA_address + 3) = gbCBWCB[5];
  1671. if(  (gxdwLBA_address>gxdwSD_Blocknum) ||  //Vicky051221#3
  1672. ((gxdwLBA_address+(DWORD)SD_SecCnt+1) > gxdwSD_Blocknum)  ) //Vicky051021#1
  1673. {
  1674. //gfMediumChange=TRUE;
  1675. obUSBOTGSPEED &= TRANSFER_DISJ;
  1676. //SD_POWER_OFF();
  1677. return FALSE;
  1678. }
  1679. if(!(gxbSDMMCState&SD_HIGH_CAPACITY))//Nick061103
  1680.      gxdwLBA_address = (gxdwLBA_address<<9);
  1681. CMD18PRE(gxdwLBA_address);
  1682. if(!SDpolling(&obSDCTRL,SD_CMD_START,0)) 
  1683. {
  1684. gxbSD_Error=ERR_SD_CMD18|ERR_SD_CMD_START;
  1685. return FALSE;
  1686. }
  1687. if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0)) 
  1688. {
  1689. gxbSD_Error=ERR_SD_CMD18|ERR_SD_CMD_BUSY; 
  1690. return FALSE;
  1691. }
  1692. if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
  1693. {
  1694. gxbSD_Error=ERR_SD_CMD18|ERR_SD_DAT_TBUSY;
  1695. return FALSE;
  1696. }
  1697. if(!CMD12(FALSE))
  1698. {
  1699. gxbSD_Error|=ERR_SD_CMD12;
  1700. return FALSE;
  1701. }
  1702. if(!SD_RESP_DelayCount(SD_STATE_TRAN))
  1703. {
  1704. gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE;
  1705. return FALSE;
  1706. }
  1707. if(gfR1Err) //Vicky041126#2
  1708. return FALSE; //Vicky041126#2
  1709. return TRUE;
  1710. }
  1711. #if 0 //v03210 del
  1712. /*--------------------------------------------------------------------------
  1713. Description:
  1714. ATAPI FunC.
  1715. (Send 20 bytes data to PC, 
  1716. including the number of blocks in card(4 bytes),the number of bytes in a block(3bytes).)
  1717. when accepted Read-Format-Capacity CMD(opcode=0x23).
  1718. Global arguments:
  1719. gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
  1720. gfSDWP: TRUE,the SD/MMC card is write-protected.
  1721. gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
  1722. gxdwSD_Blocklen: the number of bytes in a block.
  1723. gdwCBWDataTransferLength: the number of bytes that PC requested to transfer. 
  1724. 2004/08/11: Edit by Vicky
  1725. --------------------------------------------------------------------------*/
  1726. bit SDFormatCapa(void) large
  1727. {
  1728. BYTE cbtemp;
  1729. if(gfSDinit)
  1730. {
  1731. //.Capacity header
  1732. WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;//(byte 0) reserved
  1733. WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;//(byte 1) reserved
  1734. WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;//(byte 2) reserved
  1735. WaitEPANotFull();obUSBDEVEPAFIFO = 0x10;//(byte 0) length
  1736. /*Capacity descriptor0*/
  1737. //.Number of blocks
  1738. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>24);
  1739. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>16);
  1740. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>8);
  1741. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum);
  1742. //.Descriptor type
  1743. WaitEPANotFull();obUSBDEVEPAFIFO = 0x02; //TYPE_FORMATTED
  1744. //.Block Length in Bytes (MSB first)
  1745. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>16);
  1746. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>8);
  1747. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen);
  1748. /*Formattable capacity descriptor*/
  1749. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>24);
  1750. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>16);
  1751. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>8);
  1752. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum);
  1753. //.format type
  1754. WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;
  1755. //.Block Length in Bytes (MSB first)
  1756. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>16);
  1757. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>8);
  1758. WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen);
  1759. return TRUE;
  1760. }
  1761. else
  1762. {
  1763. for(cbtemp = 0; cbtemp < gdwCBWDataTransferLength; cbtemp++)
  1764. {WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;}
  1765. return FALSE;
  1766. }
  1767. }
  1768. #endif
  1769. #endif
  1770. #else //Walace060929#1 start
  1771. #if(!(_PM_PLAY_DATA_RTN_RESTORE_|_PM_FM_)) //modify by Rojam 2007-03-29 17:9
  1772. bit SD_Write(void) large
  1773. {
  1774. return FALSE;
  1775. }
  1776. #if(!(_PM_PLAY_MAIN_|_PM_PLAY_PRC_)) //modify by Rojam 2007-04-12 11:24
  1777. void SDReadCapa(void) 
  1778. {
  1779. ;
  1780. }
  1781. bit SD_Init_400K(void)
  1782. {
  1783. return FALSE;
  1784. }
  1785. bit SD_USBRead(void) large//Vicky0908 modify
  1786. {
  1787. return FALSE;
  1788. }
  1789. bit SD_USBWrite(void) large//Vicky0908 modify
  1790. {
  1791. return FALSE;
  1792. }
  1793. bit SD_Det(BOOL fForceSDRemove) 
  1794. {
  1795. fForceSDRemove=fForceSDRemove; // modify by Rojam 2007-03-29 16:40
  1796. return FALSE;
  1797. }
  1798. void SD_POWER_OFF(void) 
  1799. {
  1800. ;
  1801. }
  1802. #endif
  1803. #endif
  1804. #endif //Walace060929#1 end