- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
SD.c
资源名称:SDK_M5661.rar [点击查看]
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:52k
源码类别:
压缩解压
开发平台:
C++ Builder
- /*==========================================================================
- Copyright (c) 2004 ALi Corporation. All Rights Reserved
- File: SD.c
- content: SD control/read/write functions
- History: Created by Vicky Hsu 2004/07/01
- ==========================================================================*/
- #define _SD_H_
- #include "TypeDef.h"
- #include "Const.h"
- #include "Reg5661.h"
- #include "Common.h"
- #include "SD.h"
- #if(ENABLE_SD_FUNCTION)
- //vicky050506#1
- #define _SD_INIT_ 0
- #define _SD_READ_ 0
- #define _SD_WRITE_ 0
- #if(_SD_API_ATAPI_)
- #include "Usb.h"
- #include "Ata.h"
- #undef _SD_INIT_
- #undef _SD_READ_
- #undef _SD_WRITE_
- #define _SD_INIT_ 1
- #define _SD_READ_ 1
- #define _SD_WRITE_ 1
- #else
- #if(_SD_API_INIT_)
- #undef _SD_INIT_
- #define _SD_INIT_ 1
- #endif
- #if(_SD_API_READ_)
- #undef _SD_READ_
- #define _SD_READ_ 1
- #endif
- #if(_SD_API_WRITE_)
- #undef _SD_WRITE_
- #define _SD_WRITE_ 1
- #endif
- #endif
- #if((_PM_USB_ | _PM_MPTEST_|_PM_MTP_INIT_)) //allen050530
- #define _SD_CLK_USE_USB 1
- #else
- #define _SD_CLK_USE_USB 0
- #endif
- //-------------------------------------------------------------------
- // Global variables
- //-------------------------------------------------------------------
- XBYTE gfSDPowerUp; //Indicate that R1 Power UP bit=TRUE (i.e CMD1/ACMD41 PASS) //Walace070102#1
- XBYTE gxbSDLastCardState; //the last card state of SD/MMC card
- #if(_SD_INIT_) //vciky050607#4
- XBYTE gxbSd_cmd; //the divisor of SD Clock (function: controll SD clock <400KHZ.)
- XBYTE gxbOCR[4];
- XDWORD gxdwSD_Blocklen; //the size of a block (it is 512 byte in most situation.)
- #endif
- /*SD Card Only==========================================*/
- //
- /*not used now ==========================================*/
- //XBYTE gxbSDSmallerBlockAllowed;//Vicky 0812 del
- //XBYTE gxbSD_TRAN_SPEED;//Vicky 0812 del
- //XBYTE gbSDLastCardCMD;//Vicky 0810 del
- //XWORD gxwSDMaxBlockLength;//Vicky 0810 del
- #if(_SD_API_ATAPI_)
- XDWORD gxdwLBA_address;//the LBA acceptd from PC (in USB read/write)
- #endif
- //-------------------------------------------------------------------
- // Function prototype
- //-------------------------------------------------------------------
- //Card's State Diagram+Basic Command
- bit CMD0(void); //go idle state
- bit CMD1(void); //send_OP_COND(MMC only),Response=R3 (OCR)
- bit CMD2(void); //all send CID,Response=R2(CID).
- bit CMD3(void); //Set addr(MMC:00 01),Response=R1; Send addr (SD),Response=R6.
- bit CMD6(BYTE bAccess, BYTE bIndex, BYTE bValue, BYTE CMDSet);//Nick061103#1 switch mode
- bit CMD7(void); //select/deselect card,Response=R1.
- bit CMD8(void); //Nick061103 send interface condition
- bit CMD9(void); //send CSD,Response=R2.
- bit CMD12(bit fpolling); //stop transmition after multiple block read,Response=R1.
- bit CMD13(void); //send status,Response=R1.
- bit CMD16(void); //set blocklen,Response=R1.
- bit CMD55(bit fRCA); //App cmd;fRCA=TRUE,addressed cmd for (SD only).else, for ACMD41 in SD init(SD only).Response=R1.
- bit ACMD41(void); //send_OP_COND(SD only),Response=R3 (OCR)
- bit ACMD6(void); //set bus width(SD only--> 4 bit bus),Response=R1.
- bit ACMD23(WORD wlen) large; //SET_WR_BLK_ERASE_COUNT,Response=R1.
- void CMD1_PRE(void);
- void ACMD41_PRE(void);
- void CMD18PRE(DWORD dwLBA) large; //setting of muliple block read ,dwLBA=LBA
- void CMD25PRE(DWORD dwLBA) large; //setting of muliple block write ,dwLBA=LBA
- /*SET SD Arg ========================================*/
- void SDArg(void); //addressd SD in argument
- void MMCArg(void); //addressd MMC in argument
- void SDStuffArg(void); //all are stuff bits in argument
- void SDOCRArg(void); //OCR in argument
- /*Check SD/MMC Response REG ==============================*/
- void SD_CheckR1(void); //R1 (card status, 32 error bits)
- void SD_CheckR6(void); //R6 (get card's Relative addr.SD only)
- BYTE SD_CheckR7(void); //R7 (check supplied votage accepted by SD or not) //Nick061103
- void SD_CheckR3(void); //R3 (OCR, Operation Condition REG)
- void SD_CheckR2CSD(void) large; //R2 (CSD, Card Specific REG)
- //SD/MMC Common Func
- //void SD_POWER_OFF(void);
- void SD_POWER_ON(void);
- void DETECT_SD_WP(void);
- void SD_Init1(void); //SD init400k step1 func.
- void SD_Init2(void)large; //SD init400k step2 func.
- void SD_Delay(unsigned int DelayCnt); //Delay func
- bit SD_CheckStatus(void)large; //check obSDCTRL(cmd_start),obSDSTS(cmd_busy)
- bit SDpolling(BYTE *bCmd, BYTE bStatus,bit fTrue) large; //polling until fTRUE (max value=0xffff)
- bit SD_RESP_DelayCount(BYTE bResponse) large; //polling until SD State =bResponse. (max value=0x8fff)
- /***************************************************************************
- SD/MMC API function
- ****************************************************************************/
- API void SD_POWER_OFF(void) //Vicky1005 remodify
- {
- PIN_SD_PDDAT|=SD_PD; //SD power on
- PIN_SD_PDDIR|=SD_PD; //PDJ(Output)
- #if(_SD_DET_PULL) //Walace060814#1 Write Protection Output High after power down SD
- PIN_SD_WPDIR&=(~SD_WP);
- obGPIOHPUEN |=SD_WP;
- obGPIOHPUHI |=SD_WP;
- #else
- PIN_SD_WPDAT|=SD_WP;
- PIN_SD_WPDIR|=SD_WP;
- #endif
- obGPIOGPUEN |=0x5F;
- obGPIOGPUHI &=0xA0;
- obCLKSDCTRL =0x50;//Vicky041130#1 /vicky050601#1
- gfSDinit = FALSE;
- gfSDWP = FALSE;//Vicky1019
- gxbSDMMCState = 0;//Nick061103
- //gfSDStop=FALSE;
- gfSDPowerUp=FALSE;
- gfSDPowerOn =FALSE;
- gxbSD_Error=0;
- gfR1Err=FALSE;//Vicky041126#2
- }
- #if(_SD_API_INIT_)
- /******************************************************************************************
- // SD INIT FUNC
- *******************************************************************************************/
- /*--------------------------------------------------------------------------
- Description:
- SD Initialization.
- Global arguments:
- gfSDinit: indicate that SD/MMC card had been initialized.
- gxbSd_cmd: the divisor to controll the SD/MMC Clock (<400KHZ)
- gfMediumChange: indicate that FW need to let Host know medium change. (since SD insert and init OK).
- Returns:
- TRUE: SD/MMC card was initialized successfully.
- FALSE: SD/MMc card was not initialized successfully.(including SD/MMC is not inserted)
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- API bit SD_Init_400K(void) //Vicky1019 //vicky050506#1
- {
- #if( _SD_DET_PULL)
- //Nick060808 start
- PIN_SD_DETDIR&=(~SD_CD); //Nick060308#1 add it
- PIN_SD_DET_PULL_EN|=SD_CD;
- PIN_SD_DET_PULL_HIGH|=SD_CD;
- //Nick060808 end
- #else
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
- PIN_SD_DETDAT&=~SD_CD;
- PIN_SD_DETDIR&=~SD_CD;
- #else
- PIN_SD_DETDAT|=SD_CD;
- PIN_SD_DETDIR|=SD_CD;
- #endif
- #endif
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
- if(PIN_SD_DETDAT&SD_CD)
- #else
- if(!(PIN_SD_DETDAT&SD_CD)) //Card IN//Vicky1005 change
- #endif
- {
- #if( _SD_DET_PULL)
- PIN_SD_DET_PULL_EN&=(~SD_CD); //Nick060808 mark it
- #else
- PIN_SD_DETDIR&=(~SD_CD);//Vicky1019
- #endif
- #if(_SD_API_ATAPI_) //allen050530
- if(gfSDinit && (!gfSDStop)) //Have been Initialized OK
- return TRUE;
- #else
- if(gfSDinit) //Have been Initialized OK
- return TRUE;
- #endif
- #if(_SD_API_ATAPI_) //allen050530
- if( (!gfSDinit) && (!gfSDStop) ) //need to Initialize
- #else
- if(!gfSDinit ) //need to Initialize
- #endif
- {
- for(gxbSd_cmd=90;gxbSd_cmd<100;gxbSd_cmd++)
- {
- SD_Init1();
- SD_Init2();
- if(gfSDinit==TRUE)
- {
- gfMediumChange=TRUE;//Vicky 0816 add
- gxbSDretry=0;
- return TRUE;
- }
- }
- }
- }
- #if( _SD_DET_PULL)
- PIN_SD_DET_PULL_EN&=(~SD_CD); //Nick060808
- #else
- PIN_SD_DETDIR&=(~SD_CD);
- #endif
- SD_POWER_OFF();
- return FALSE;
- }
- #endif // _SD_API_INIT_
- #if(_SD_API_READ_) //vicky050506#1
- /*--------------------------------------------------------------------------
- Description:
- Read data from SD. (data target: SRAM )
- Arguments:
- Global arguments:
- gbStorTransLen: the number of blocks to be transfered.
- gbStorPath: the addr of Target (in SRAM)
- gdwStorLba: the LBA of Source (in SD/MMC Card)
- gxbSD_Error: error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
- gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
- gfR1Err: TRUE,R1 report error.
- Returns:
- TRUE: all data are transfered to SD.
- FALSE: some error occured.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- bit SD_Read(void) large
- {
- // DWORD dwStorLba; //Nick061103 mark it
- WORD wtransferlen=(WORD)gbStorTransLen*0x0200;
- gxbSD_Error=0;
- //Nick060808 start
- #if(!SD_DET_USE_INT1)
- if(!SD_Det(SD_DET))
- goto SD_DMAreset;
- #else
- if(!gfSDinit)
- {
- SD_Det(SD_FORCE_REMOVE);
- goto SD_DMAreset;
- }
- #endif
- //Nick060808 end
- ClkSdEn();//Vicky041126#1
- //Vicky051021#1
- if( (gbStorTransLen==0) || //Check Length
- (gdwStorLba>gxdwSD_Blocknum) || //Vicky051221#3
- ((gdwStorLba+gbStorTransLen) >gxdwSD_Blocknum) //Check End LBA
- )
- {
- gxbSD_Error=ERR_SD_RES2|ERR_SD_OUTOFCAPA;//Vicky1019
- goto SD_DMAreset;
- }
- obRACTL &= RA_DMA_DISJ;
- obSOURCEPATHCTRL = 0x00; //Source Dis
- obTARGETPATHCTRL = 0x00; //Target Dis
- obMODSEL3 &= NOTBYPASS_RAJ; //not bypass RA
- obSOURCEPATHCTRL = 0x10; //Source SD
- obTARGETPATHCTRL = 0x00; //Target Dis
- obRACTL = RA_INIT; // DMA INI
- obRACTL = RA_NORMAL;
- obRACTL = RA_COPY_MODE;
- obRAINIADRL = (gbStorPath*0x0200) & 0xFF;
- obRAINIADRH = (((gbStorPath*0x0200) >> 8) & 0x1F);
- obRAINIADRH |= RA_ADDR_LOAD;
- obRABANKSIZEH = wtransferlen>>8;
- obRABANKSIZEL = (BYTE)wtransferlen;
- obSDBLOCKLENH = 02;
- obSDBLOCKLENL = 00;
- obSDBLOCKNUM=gbStorTransLen-1;
- obRACTL |= RA_DMA_EN;
- //Nick061103 start
- if(gxbSDMMCState&SD_HIGH_CAPACITY)
- CMD18PRE(gdwStorLba);
- else
- CMD18PRE(gdwStorLba<<9);
- /* dwStorLba = (gdwStorLba<<9);
- CMD18PRE(dwStorLba);*/
- //Nick061103 end
- if(!SDpolling(&obSDCTRL,SD_CMD_START,0))
- {
- gxbSD_Error=ERR_SD_CMD_START;
- goto SD_DMAreset;
- }
- if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD18|ERR_SD_CMD_BUSY;
- goto SD_DMAreset;
- }
- if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD12|ERR_SD_DATLINE_BUSY;
- goto SD_DMAreset;
- }
- if(!CMD12(FALSE))
- {
- gxbSD_Error|=ERR_SD_CMD12;
- goto SD_DMAreset;
- }
- if(!SD_RESP_DelayCount(SD_STATE_TRAN))
- {
- gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE;
- goto SD_DMAreset;
- }
- SD_DMAreset:
- obRACTL &= RA_DMA_DISJ;
- obSOURCEPATHCTRL = 0x00; //Source Dis
- obTARGETPATHCTRL = 0x00; //Target Dis
- if(gxbSD_Error)
- {
- if((gxbSD_Error&ERR_SD_RES2)==ERR_SD_RES2) //Vicky041126#2
- return FALSE; //Vicky041126#2
- obSYSSOFTRSTCTRL &= SD_RST_ENJ;
- obSYSSOFTRSTCTRL |= SD_RST_DIS; // Disable SD reset signal
- //gxbSD_Error=0; //Vicky041126#2
- SD_Det(SD_DET); //vicky050506#1 //Nick060808 add SD_DET
- return FALSE;
- }
- return TRUE;
- }
- #endif
- #if(_SD_API_WRITE_) //Vicky050506#1
- /*--------------------------------------------------------------------------
- Description:
- Write data to SD. (data source: SRAM )
- Arguments:
- Global arguments:
- gbStorTransLen: the number of blocks to be transfered.
- gbStorPath: the addr of Source (in SRAM)
- gdwStorLba: the LBA of Target (in SD/MMC Card)
- gxbSD_Error: error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
- gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
- gfR1Err: TRUE, R1 report error.
- Returns:
- TRUE: all data are transfered to SD.
- FALSE: some error occured.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- bit SD_Write(void) large
- {
- // DWORD dwStorLba; //Nick061103 mark it
- WORD wtransferlen=(WORD)gbStorTransLen*0x0200;
- gxbSD_Error=0;
- //Nick060808 start
- #if(!SD_DET_USE_INT1)
- if(!SD_Det(SD_DET))
- goto SD_DMAreset;
- #else
- if(!gfSDinit)
- {
- SD_Det(SD_FORCE_REMOVE);
- goto SD_DMAreset;
- }
- #endif
- //Nick060808 end
- ClkSdEn();//Vicky041126#1
- if(gfSDWP)
- {
- gxbSD_Error=ERR_SD_RES2|ERR_SD_WP;
- goto SD_DMAreset;
- }
- //Vicky051021#1
- if( (gbStorTransLen==0) || //Check Length
- (gdwStorLba>gxdwSD_Blocknum) || //Vicky051221#3
- ((gdwStorLba+gbStorTransLen) >gxdwSD_Blocknum) //Check End LBA
- )
- {
- gxbSD_Error=ERR_SD_RES2|ERR_SD_OUTOFCAPA;
- goto SD_DMAreset;
- }
- //
- obRACTL &= RA_DMA_DISJ;
- obSOURCEPATHCTRL = 0x00; //Source Dis
- obTARGETPATHCTRL = 0x00; //Target Dis
- obTCNTLDDATAL=(BYTE)(wtransferlen/2);
- obTCNTLDDATAH=(wtransferlen/2)>>8;
- obTCNTCTRL|=TCOUNT_LOAD;
- obTCNTCTRL&=TCOUNT_ENJ;
- obMODSEL3 &= NOTBYPASS_RAJ; //not bypass RA
- obRACTL = RA_INIT; // DMA INI
- obRACTL = RA_NORMAL;
- obSOURCEPATHCTRL = 0x00; //Source Dis
- obTARGETPATHCTRL = 0x10; //Target SD
- obRACTL = RA_COPY_MODE;
- obRAINIADRL = (gbStorPath*0x0200) & 0xFF;
- obRAINIADRH = (((gbStorPath*0x0200) >> 8) & 0x1F);
- obRAINIADRH |= RA_ADDR_LOAD;
- obRABANKSIZEH = wtransferlen>>8;
- obRABANKSIZEL = (BYTE)wtransferlen;
- obSDBLOCKLENH = 02;
- obSDBLOCKLENL = 00;
- obSDBLOCKNUM=gbStorTransLen-1;
- // dwStorLba = (gdwStorLba<<9);//LBA is byte addressed for SD/MMC. //Nick061103 mark it
- if(gxbSDCardType == SD_MODE)
- {
- if(!CMD55(TRUE))
- {
- gxbSD_Error|=ERR_SD_CMD55;
- goto SD_DMAreset;
- }
- if(!ACMD23(gbStorTransLen))
- {
- gxbSD_Error|=ERR_SD_ACMD23;
- goto SD_DMAreset;
- }
- }
- //Nick061103 start
- if(gxbSDMMCState&SD_HIGH_CAPACITY)//Nick061103
- CMD25PRE(gdwStorLba);
- else
- CMD25PRE(gdwStorLba<<9);
- //Nick061103 end
- if(!SDpolling(&obSDCTRL,SD_CMD_START,0))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_START;
- goto SD_DMAreset;
- }
- obRACTL |= RA_DMA_EN;
- if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_BUSY;
- goto SD_DMAreset;
- }
- //modify by Nick 2006/03/06 mark it. neednt add this here. it just for debug purpose originally.
- //And gxbSDLastCardState=(obSDRESP2>>1)&0x0F; will let SD IP lunch command randomly and unexpectly.
- //SD_CheckR1();
- if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_DAT_TBUSY;
- goto SD_DMAreset;
- }
- if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_DATLINE_BUSY;
- goto SD_DMAreset;
- }
- if(!CMD12(TRUE))
- {
- gxbSD_Error|=ERR_SD_CMD12;
- goto SD_DMAreset;
- }
- obSDCLOCKWIDTH |= 0x01;
- if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1))
- {
- gxbSD_Error=ERR_SD_CMD12|ERR_SD_DATLINE_BUSY;
- goto SD_DMAreset;
- }
- obSDCLOCKWIDTH &= 0xFE;
- if(!SD_RESP_DelayCount(SD_STATE_TRAN))
- {
- gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE;
- goto SD_DMAreset;
- }
- if(!SDpolling(&obTCNTCTRL,TCOUNT_FINISH,0))
- {
- gxbSD_Error=ERR_SD_RES1;
- goto SD_DMAreset;
- }
- SD_DMAreset:
- obRACTL &= RA_DMA_DISJ;
- obTCNTCTRL|=TCOUNT_DIS;
- obTCNTCTRL&=TCOUNT_LOAD_DIS;
- obSOURCEPATHCTRL = 0x00; //Source Dis
- obTARGETPATHCTRL = 0x00; //Target Dis
- if(gxbSD_Error)
- {
- if((gxbSD_Error&ERR_SD_RES2)==ERR_SD_RES2) //Vicky041126#2
- return FALSE; //Vicky041126#2
- obSYSSOFTRSTCTRL &= SD_RST_ENJ;
- obSYSSOFTRSTCTRL |= SD_RST_DIS; // Disable SD reset signal
- //gxbSD_Error=0; //Vicky041126#2
- SD_Det(SD_DET); //vicky050506#1 //Nick060808 add SD_DET
- return FALSE;
- }
- return TRUE;
- }
- #endif //_SD_API_WRITE_
- /***************************************************************************
- SD/MMC Common Func
- ****************************************************************************/
- /*--------------------------------------------------------------------------
- Description:
- Check whether SD/MMC card is inserted or not.
- Returns:
- TRUE: SD/MMC card is inseted.
- FALSE: SD/MMC card is not inseted.
- --------------------------------------------------------------------------*/
- bit SD_Det(BOOL fForceSDRemove) //vicky050506#1 //Nick060808 add BOOL fForceSDRemove
- {
- #if( _SD_DET_PULL)
- //Nick060808 start
- PIN_SD_DETDIR&=SD_CDJ; //Nick060308#1 add it
- PIN_SD_DET_PULL_EN|=SD_CD;
- PIN_SD_DET_PULL_HIGH|=SD_CD;
- //Nick060808 end
- #else
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
- PIN_SD_DETDAT&=~SD_CD;
- PIN_SD_DETDIR&=~SD_CD;
- #else
- PIN_SD_DETDAT|=SD_CD;
- PIN_SD_DETDIR|=SD_CD;
- #endif
- #endif
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:24
- if((!(PIN_SD_DETDAT&SD_CD) )|| fForceSDRemove)//Vicky1005 change //Nick060808 add || fForceSDRemove
- #else
- if((PIN_SD_DETDAT&SD_CD) || fForceSDRemove)//Vicky1005 change //Nick060808 add || fForceSDRemove
- #endif
- {
- #if( _SD_DET_PULL)
- //Nick060308#1 begin
- // obGPIOEPUEN&=(~SD_CD);
- PIN_SD_DET_PULL_EN&=SD_CDJ; //Nick060808
- //Nick060308#1 end
- #else
- PIN_SD_DETDIR&=(~SD_CD);
- #endif
- if(gfSDPowerOn)
- SD_POWER_OFF();
- gxbSD_Error=ERR_SD_RES2|ERR_SD_REMOVE;//Vicky060126#1 //vicky061208#1 Move to here
- return FALSE;
- }
- #if( _SD_DET_PULL)
- //Nick060308#1 begin
- // obGPIOEPUEN&=(~SD_CD);
- PIN_SD_DET_PULL_EN&=SD_CDJ; //Nick060808
- //Nick060308#1 end
- #else
- PIN_SD_DETDIR&=(~SD_CD);
- #endif
- return TRUE;
- }
- #if(_SD_INIT_|_SD_READ_|_SD_WRITE_)
- /******************************************************************************************
- // Check the status of the command sent to SD/MMC Card
- *******************************************************************************************/
- bit SD_CheckStatus(void) large //vicky050506#1
- {
- DWORD times;
- if(!SD_Det(SD_DET)) //Nick060808 add SD_DET
- return FALSE;
- times = 200;//Vicky0909
- while((obSDCTRL&SD_CMD_START)&×)
- {times--;}
- if(!times)
- {
- gfSDinit = FALSE;
- gxbSD_Error=ERR_SD_CMD_START;
- return FALSE;
- }
- times =1000;//Vicky0909
- while((obSDSTS&SD_CMD_BUSY)&×)
- {times--;}
- if(!times)
- {
- gfSDinit = FALSE;
- gxbSD_Error=ERR_SD_CMD_BUSY;
- return FALSE;
- }
- return TRUE;
- }
- /*--------------------------------------------------------------------------
- Description:
- Polling until the result of "*bCmd &bStatus" is equal to fTrue.
- or Sd_DelayTemp is equal to zero.
- Arguments:
- bCmd: the addr of the Reg.
- bStatus: the value to be compared.
- Return:
- TRUE: the result of "*bCmd &bStatus" is equal to fTrue.
- FALSE: Sd_DelayTemp is equal to zero.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- bit SDpolling(BYTE *bCmd, BYTE bStatus,bit fTrue) large
- {
- //DWORD Sd_DelayTemp=0x8FFFF;//Vicky 0816 dis
- DWORD Sd_DelayTemp; //Vicky0908 add
- Sd_DelayTemp=0xFFFFF;
- while(Sd_DelayTemp)
- {
- if( fTrue)
- {
- if(((*bCmd) & bStatus)==bStatus)
- break;
- }
- else
- {
- if(((*bCmd) & bStatus)!=bStatus)
- break;
- }
- Sd_DelayTemp--;
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:24
- if(!(PIN_SD_DETDAT&SD_CD)) //Walace050928 bug00059
- #else
- if(PIN_SD_DETDAT&SD_CD) //Walace050928 bug00059
- #endif
- return FALSE;
- }
- if(!Sd_DelayTemp)
- return FALSE;
- return TRUE;
- }
- /*--------------------------------------------------------------------------
- Description:
- Polling until
- gxbSDLastCardState is the same as bResponse
- or Sd_DelayTemp is equal to zero .
- Arguments:
- bResponse:card's state
- 0x00:IDLE, 0x01:READY, 0x02:IDENT, 0x03:STBY
- 0x04:TRAN, 0x05:DATA, 0x06:RCV, 0x07:PRG, 0x08:DIS-CON
- Global arguments:
- gxbSDLastCardState: card's state, received from the response of CMD13.(i.e. R1)
- --------------------------------------------------------------------------*/
- bit SD_RESP_DelayCount(BYTE bResponse) large//Vicky0908 modify
- {
- DWORD Sd_DelayTemp;
- Sd_DelayTemp=0xFFFFF;
- while(Sd_DelayTemp)
- {
- CMD13();
- SD_CheckR1();
- if(gxbSDLastCardState == bResponse)
- break;
- else
- Sd_DelayTemp--;
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:24
- if(!(PIN_SD_DETDAT&SD_CD)) //Walace050928 bug00059
- #else
- if(PIN_SD_DETDAT&SD_CD) //Walace050928 bug00059
- #endif
- return FALSE;
- }
- if(!Sd_DelayTemp)
- return FALSE;
- return TRUE;
- }
- bit CMD13(void)
- {
- obSDCMD = 0x0D; // CMD13: SEND_STATUS
- if(gxbSDCardType == SD_MODE)
- {
- SDArg();
- obSDCTRL = SD_R1_AC_START;
- }
- else if(gxbSDCardType == MMC_MODE)
- {
- MMCArg();
- obSDCTRL = MMC_R1_AC_START;
- }
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- {
- SD_POWER_OFF();
- return FALSE;
- }
- return TRUE;
- }
- //Common
- /***************************************************************************
- Wreite SD Arg
- ***************************************************************************/
- //Arg: Addressed SD Card
- void SDArg(void)
- {
- obSDARG0=0x00;
- obSDARG1=0x00;
- obSDARG2=gxbRcaL;
- obSDARG3=gxbRcaH;
- }
- //Arg: Addressed MMC Card
- void MMCArg(void)
- {
- obSDARG0=0x00;
- obSDARG1=0x00;
- obSDARG2=0x01;
- obSDARG3=0x00;
- }
- //Arg: All Stuff bits
- void SDStuffArg(void)
- {
- obSDARG0 = 0x00;
- obSDARG1 = 0x00;
- obSDARG2 = 0x00;
- obSDARG3 = 0x00;
- }
- /******************************************************************************************
- // SD Responses --- R1 (card status, 32 error bits)
- *******************************************************************************************/
- void SD_CheckR1(void)
- {
- //gbSDLastCardCMD=obSDRESP5;
- gxbSDLastCardState=(obSDRESP2>>1)&0x0F;
- //Vicky051021#1 (Skip Out of Range Flag, FW will check END LBA)
- if((obSDRESP4&0x40)||(obSDRESP3&0xF8)) //Vicky041126#2
- gfR1Err=TRUE; //Vicky041126#2
- }
- #endif
- #if(_SD_INIT_)
- /*--------------------------------------------------------------------------
- Description:
- SD Initialization. Step 1.
- Global arguments:
- gxbSd_cmd: the divisor to controll the SD/MMC Clock (<400KHZ)
- gxbSD_Error: error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- void SD_Init1(void)
- {
- SD_POWER_OFF();
- SD_POWER_ON();
- SD_Delay(0x2FFF);//Power-up to ready need more than 50msec.
- obSYSSOFTRSTCTRL &= SD_RST_ENJ;
- obSYSSOFTRSTCTRL |= SD_RST_DIS; // Disable SD reset signal
- gxbSD_Error=0;
- // MMC Clock = 20MHz 0x(98,02),SD Clock= 24MHz 0x(88,03)
- // #if((_PM_USB_ | _PM_MPTEST_)) 050528
- #if(_SD_CLK_USE_USB)
- obCLKSDDIVF = 0x02;
- obCLKSDCTRL = 0x98;
- #else
- //Nick060327#1 mark it and add it.the same clk source with MCU. begin
- // obCLKSDDIVF = 0x02;
- // obCLKSDCTRL = 0xb8; //73(67)/4=18.25(16.75) //David
- obCLKSDDIVF = 0x06;
- obCLKSDCTRL = 0xC8;
- //Nick060327#1 mark it and add it.the same clk source with MCU. end
- #endif
- SD_Delay(500);
- obSDFREQDIV = gxbSd_cmd; //<400k
- obSDCLOCKWIDTH &=0xFE;//Vicky0908 add
- //obSDCLOCKWIDTH = gxbSd_cmd/2; //Vicky0908 del
- }
- /*--------------------------------------------------------------------------
- Description:
- SD Initialization. Step 2.
- Global arguments:
- gxbSd_cmd: the divisor to controll the SD/MMC Clock (<400KHZ)
- gxbSD_Error: error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
- gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
- gfSDinit: TRUE, indicate SD/MMC Card had been initialized.
- gfSDWP: TRUE, indicate SD/MMC Card is write-protected.
- gfSDPowerUp: TRUE, indicate R1 Power UP bit=TRUE (i.e CMD1/ACMD41 PASS)
- gxbSDLastCardState:card's state, received from the response of CMD13.(i.e. R1)
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- void SD_Init2(void) large
- {
- WORD times; //retry times
- gfSDinit = FALSE;
- gfSDWP=FALSE;
- gfSDPowerUp=FALSE;
- gxbSDMMCState = 0;//Nick061103
- CMD0();
- CMD1_PRE();// This step is used to distinguish SD or MMC
- SD_Delay(5000); // Wait for CMD1 finished correctly//Vicky0909 change//Vicky0908 change
- if((obSDSTS&SD_CMD_BUSY) == 0x00) //MMC
- {
- gxbSDCardType = MMC_MODE;
- CMD1_PRE();
- if(!SD_CheckStatus())
- return;
- }
- else //SD
- {
- gxbSD_Error=0;
- gxbSDCardType = SD_MODE;
- obSYSSOFTRSTCTRL&= SD_RST_ENJ;//SD reset.
- obSYSSOFTRSTCTRL|= SD_RST_DIS;//Disable SD reset.
- //SD Clock=24MHz 0x(88,03)(usb); 24.3/22.3 MHz (b8,01)(DCV)
- // #if((_PM_USB_ | _PM_MPTEST_)) 050528
- #if(_SD_CLK_USE_USB)
- obCLKSDDIVF = 0x03; //Vicky0908 add
- obCLKSDCTRL = 0x88;//Vicky0908 add
- #else
- //Nick060327#1 mark it and add it.the same clk source with MCU. begin
- // obCLKSDDIVF = 0x01;
- // obCLKSDCTRL = 0xb8; //73(67)/3=24.3(22.3) //David
- obCLKSDDIVF = 0x04;
- obCLKSDCTRL = 0xC8;
- //Nick060327#1 mark it and add it.the same clk source with MCU. end
- #endif
- SD_Delay(50);
- obSDFREQDIV = gxbSd_cmd;
- obSDCLOCKWIDTH &=0xFE;//Vicky0908 add
- //obSDCLOCKWIDTH = gxbSd_cmd/2; //Vicky0908 del
- if(!CMD0())
- return;
- //Nick061103 start
- if(CMD8())
- {
- if(SD_CheckR7() != SD_VOTAGE_ACCEPT)
- return;
- gxbSDMMCState |= SD_20;
- }
- else
- {
- gxbSD_Error=0;
- obSYSSOFTRSTCTRL&= SD_RST_ENJ;//SD reset.
- obSYSSOFTRSTCTRL|= SD_RST_DIS;//Disable SD reset.
- obSDFREQDIV = gxbSd_cmd;
- obSDCLOCKWIDTH &=0xFE;//Vicky0908 add
- }
- //Nick061103 end
- if(!CMD55(FALSE))
- return;
- ACMD41_PRE();
- if(!SD_CheckStatus())
- return;
- }//end of check card type
- for(times=0;times<1000;times++)//Vicky 0809 change
- {
- SD_CheckR3();//Vicky0908 add
- if((obSDRESP4&SD_POWER_UP) == 0x80)
- {
- gfSDPowerUp=TRUE;
- //Nick061103 start
- if((gxbSDMMCState&SD_20) && (obSDRESP4&SD_CAPACITY_STATUS))
- gxbSDMMCState |= SD_HIGH_CAPACITY;
- //Nick061103 end
- break;
- }
- else
- {
- gfSDPowerUp=FALSE;
- if(gxbSDCardType == MMC_MODE)
- {
- if(!CMD1())
- return;
- }
- else if(gxbSDCardType == SD_MODE)
- {
- if(!CMD55(FALSE))
- return;
- if(!ACMD41())
- return;
- }
- }
- }
- if(gfSDPowerUp==FALSE)
- return;
- gxbSD_Error=0;
- CMD2();
- if(!CMD3())
- return;
- SD_CheckR6();
- if(gxbSDLastCardState != SD_STATE_IDENT)
- return;
- if(!CMD9())
- return;
- SD_CheckR2CSD();
- if(!CMD7())
- return;
- SD_CheckR1();
- if(gxbSDLastCardState != SD_STATE_STBY)
- return;
- if(!CMD16())
- return;
- if(gxbSDCardType == SD_MODE)
- {
- if(!CMD55(TRUE))
- return;
- if(!ACMD6()) // 4 bit bus width
- return;
- DETECT_SD_WP();
- }
- //Nick061103#1 start
- if(gxbSDMMCState&MMC_Ver_40)
- {
- CMD6(Access_WriteByte, Index_BusWidth, 1, 0);//switch to 4 bit data bus
- if(CMD13())
- {
- if(!(obSDRESP0&0x80))//check if switch error
- {
- gxbSDMMCState |= MMC_4bit_data_bus;
- }
- }
- }
- //Nick061103#1 end
- gxbSD_Error=0;
- gfR1Err=FALSE;//Vicky041126#2
- gfSDinit = TRUE;
- obSDFREQDIV = 0x01;
- obSDCLOCKWIDTH = 0x00;
- }
- //Nick060309#1 mark it and add it. begin
- /*
- void SD_POWER_ON(void) //Vicky1005 remodify
- {
- PIN_SD_PDDAT&=SD_PDJ; //SD power on
- PIN_SD_PDDIR|=SD_PD; //PDJ(Output)
- obMODSEL1|=MOD_SD_EN;
- obGPIOGPUEN&=0xA0;
- gfSDPowerOn=TRUE;
- }
- */
- void SD_POWER_ON(void) //Vicky1005 remodify
- {
- BYTE j;
- WORD i;
- PIN_SD_PDDIR|=SD_PD; //PDJ(Output)
- for(i=0; i < 0x1FE; i++)
- {
- PIN_SD_PDDAT&=SD_PDJ; //SD power on
- PIN_SD_PDDAT|=SD_PD; //SD power off
- for(j = 0; j < 0x5F; j++){}
- }
- PIN_SD_PDDAT&=SD_PDJ; //SD power on
- obGPIOGPUEN &= 0xA0; // disable pull resistor on GPIOG0,1,2,3,4,6
- obMODSEL1|=MOD_SD_EN;
- gfSDPowerOn=TRUE;
- }
- //Nick060309#1 mark it and add it. end
- /*--------------------------------------------------------------------------
- Description:
- Check whether SD Card is write-protected or not.(SD Card Only)
- Global arguments:
- gfSDWP: TRUE, indicate that SD Card is write-protected.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- void DETECT_SD_WP(void) //Vicky01019 //vicky050506#1
- {
- #if(SETTING_FOR_ICE_START|(SD_WP_SWTICH==0)) //allen050628 //Vicky060606#1
- if(DEBUG_SDWP) //050528
- gfSDWP=TRUE;
- else
- gfSDWP=FALSE;
- #else
- #if(_SD_DET_PULL)
- PIN_SD_WPDIR&=(~SD_WP);
- obGPIOHPUEN |=SD_WP;
- obGPIOHPUHI |=SD_WP;
- #else
- PIN_SD_WPDAT|=SD_WP;
- PIN_SD_WPDIR|=SD_WP;
- #endif
- gfSDWP=FALSE;
- if(PIN_SD_WPDAT&SD_WP)
- gfSDWP=TRUE;
- #if(_SD_DET_PULL)
- obGPIOHPUEN &=(~SD_WP);
- #else
- PIN_SD_WPDIR&=(~SD_WP);
- #endif
- #endif
- }
- //Basic command
- bit CMD0(void)
- {
- obSDCMD = 0x00; // CMD0: GO_IDLE_STATE
- SDStuffArg();
- obSDCTRL = 0x01;
- SD_Delay(1000);//Vicky 0810 del
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- void CMD1_PRE(void)
- {
- obSDCMD = 0x01;
- obSDARG3 = 0x00;
- obSDARG2 = 0xFF;
- obSDARG1 = 0x00;
- obSDARG0 = 0x00;
- obSDCTRL = MMC_MODE&SD_RESP_R3|SD_CMD_BCR|SD_CMD_START;
- }
- bit CMD1(void)
- {
- if(gxbSd_cmd<91)//Vicky0908 add
- {
- obSDCMD = 0x01; // CMD1: SEND_OP_COND
- SDOCRArg();
- obSDCTRL = MMC_MODE|SD_RESP_R3|SD_CMD_BCR|SD_CMD_START; //0x33
- }
- else
- CMD1_PRE();
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- bit CMD2(void)
- {
- obSDCMD = 0x02; // CMD2: ALL_SEND_CID
- SDStuffArg();
- if(gxbSDCardType == SD_MODE)
- {obSDCTRL = SD_MODE|SD_RESP_R2|SD_CMD_BCR|SD_CMD_START;}
- else if(gxbSDCardType == MMC_MODE)
- {obSDCTRL = MMC_MODE&SD_RESP_R2|SD_CMD_BCR|SD_CMD_START;}
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- bit CMD3(void)
- {
- obSDCMD = 0x03;
- if(gxbSDCardType == SD_MODE)// CMD3: SEND_RELATIVE_ADDR
- {
- SDStuffArg();
- obSDCTRL = SD_MODE|SD_RESP_R6|SD_CMD_BCR|SD_CMD_START;
- }
- else if(gxbSDCardType == MMC_MODE)// CMD3: SET_RELATIVE_ADDR
- {
- MMCArg();
- obSDCTRL =MMC_R1_AC_START;
- }
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- //Nick061103#1 start MMC 40 later only
- bit CMD6(BYTE bAccess, BYTE bIndex, BYTE bValue, BYTE CMDSet)
- {
- obSDCMD = 0x06; // CMD6: switch
- obSDARG0=CMDSet;
- obSDARG1=bValue;
- obSDARG2=bIndex;
- obSDARG3=bAccess;
- obSDCTRL =MMC_R1_AC_START;
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- //Nick061103#1 end
- bit CMD7(void)
- {
- obSDCMD = 0x07; // CMD7: SELECT/DESELECT_CARD
- if(gxbSDCardType == SD_MODE)
- {
- SDArg();
- obSDCTRL = SD_R1_AC_START;
- }
- else if(gxbSDCardType == MMC_MODE)
- {
- MMCArg();
- obSDCTRL =MMC_R1_AC_START;
- }
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- //Nick061103 start
- bit CMD8(void)
- {
- obSDCMD = 0x08; // CMD8: send interface condition SEND_IF_COND
- obSDARG0=SD_CMD8_CHECK_PATTERN;//check pattern
- obSDARG1=0x01; //supply votage 0001b 2.7~3.6V
- obSDARG2=0x00;//reserved bit
- obSDARG3=0x00; //reserved bit
- //actually response of CMD9 is R7, but it's 48 bits, the same with R6.
- obSDCTRL = SD_MODE|SD_RESP_R6|SD_CMD_BCR|SD_CMD_START;
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- //Nick061103 end
- bit CMD9(void)
- {
- obSDCMD = 0x09; // CMD9: SEND_CSD
- if(gxbSDCardType == SD_MODE)
- {
- SDArg();
- obSDCTRL = SD_MODE|SD_RESP_R2|SD_CMD_AC_CMD|SD_CMD_START;
- }
- else if(gxbSDCardType == MMC_MODE)
- {
- MMCArg();
- obSDCTRL = MMC_MODE&SD_RESP_R2|SD_CMD_AC_CMD|SD_CMD_START;
- }
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- bit CMD16(void)
- {
- obSDCMD = 0x10; // CMD16: SET_BLOCKLEN
- obSDARG3 = 0x00;
- obSDARG2 = 0x00;
- obSDARG1 = 0x02;
- obSDARG0 = 0x00;
- gxdwSD_Blocknum = gxdwSD_Blocknum * (gxdwSD_Blocklen/512); //Nick060425#1
- gxdwSD_Blocklen = 512;
- if(gxbSDCardType == SD_MODE)
- obSDCTRL = SD_R1_AC_START;
- else if(gxbSDCardType == MMC_MODE)
- obSDCTRL = MMC_R1_AC_START;
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- bit ACMD6(void)
- {
- obSDCMD = 0x06; // ACMD6: SET_BUS_WIDTH
- obSDARG3 = 0x00;
- obSDARG2 = 0x00;
- obSDARG1 = 0x00;
- obSDARG0 = 0x02;
- obSDCTRL = SD_R1_AC_START;
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- void ACMD41_PRE(void)
- {
- obSDCMD = 0x29;
- if(gxbSDMMCState&SD_20) //Nick061103
- {
- obSDARG3 = 0x40; //support HCS
- obSDARG2 = 0xFF; //support votage range 2.7~3.6
- obSDARG1 = 0x80; //support votage range 2.7~3.6
- obSDARG0 = 0x00;
- }
- else
- {
- obSDARG3 = 0x00;
- obSDARG2 = 0xFF;
- obSDARG1 = 0x00;
- obSDARG0 = 0x00;
- }
- obSDCTRL = SD_MODE|SD_RESP_R3|SD_CMD_BCR|SD_CMD_START;
- }
- bit ACMD41(void)
- {
- obSDCMD = 0x29; // ACMD41: SD_APP_OP_COND
- SDOCRArg();
- obSDCTRL = SD_MODE|SD_RESP_R3|SD_CMD_BCR|SD_CMD_START; //0xB3
- if(!SD_CheckStatus())
- return FALSE;;
- if(obSDSTS&SD_CRC_ERR)
- return FALSE;
- return TRUE;
- }
- // REG
- //Arg: OCR, Operation Condition REG
- void SDOCRArg(void)
- {
- obSDARG0=gxbOCR[0];
- obSDARG1=gxbOCR[1];
- obSDARG2=gxbOCR[2];
- obSDARG3=gxbOCR[3];
- }
- //Nick061103 start
- BYTE SD_CheckR7(void)
- {
- if(obSDSTS&SD_CRC_ERR)
- return SD_CRC_ERR;
- if(obSDRESP1 != 0xAA)
- return SD_CMD8_CHECK_PATTERN_ERR;
- if((obSDRESP2&0x0F) != 0x01)
- return SD_CMD8_VOTAGE_NOT_SUPPORT;
- return SD_VOTAGE_ACCEPT;
- }
- //Nick061103 end
- //R6 (get card's Relative addr.SD only)
- void SD_CheckR6(void)
- {
- //gbSDLastCardCMD=obSDRESP5;
- gxbSDLastCardState=(obSDRESP2>>1)&0x0F;
- if(gxbSDCardType==SD_MODE)
- {
- gxbRcaL=obSDRESP3;
- gxbRcaH=obSDRESP4;
- }
- }
- //R3 (OCR, Operation Condition REG)
- void SD_CheckR3(void)
- {
- gxbOCR[0]=obSDRESP1; // OCR bit[ 7: 0]
- gxbOCR[1]=obSDRESP2; // OCR bit[15: 8]
- gxbOCR[2]=obSDRESP3; // OCR bit[23:16]
- gxbOCR[3]=obSDRESP4; // OCR bit[31:24]
- }
- //R2 (CSD, Card Specific REG)
- void SD_CheckR2CSD(void) large //Vicky1005 remodify
- {
- XBYTE c_size_mult;
- //BYTE c_size_mult_0,c_size_mult_1;
- DWORD c_size;
- //WORD c_size_0,c_size_1,c_size_2;
- WORD mult;
- BYTE rd_block_len;
- //BYTE wr_block_len;//Vicky 0812 del
- //c_size_mult_0=obSDRESP5&0x80;
- //c_size_mult_1=obSDRESP6&0x03;
- //c_size_mult=(c_size_mult_0>>7)|(c_size_mult_1<<1);
- SD_Delay(100);//Vicky1005 add(important, can't del)
- c_size_mult=((obSDRESP5&0x80)>>7)+((obSDRESP6&0x03)<<1);
- //c_size_mult=((0x80)>>7)+((obSDRESP6&0x03)<<1);
- switch(c_size_mult)
- {
- case 0:mult=4;break;
- case 1:mult=8;break;
- case 2:mult=16;break;
- case 3:mult=32;break;
- case 4:mult=64;break;
- case 5:mult=128;break;
- case 6:mult=256;break;
- case 7:mult=512;break;
- default:mult=1024;break;
- }
- //c_size_0=obSDRESP7&0xC0;
- //c_size_1=obSDRESP8;
- //c_size_2=obSDRESP9&0x03;
- //c_size=(c_size_0>>6)|(c_size_1<<2)|(c_size_2<<10);
- if(gxbSDMMCState&SD_HIGH_CAPACITY) //Nick061103 start
- {
- c_size = (((DWORD)(obSDRESP8&0x3F))<<16) |(((DWORD)obSDRESP7)<<8) |((DWORD)obSDRESP6);
- gxdwSD_Blocknum = (c_size+1) << 10;
- }
- else
- {
- c_size=(((WORD)(obSDRESP7&0xC0))>>6)+(((WORD)(obSDRESP8))<<2)+(((WORD)obSDRESP9&0x03)<<10);
- gxdwSD_Blocknum=((DWORD)(c_size+1)*(DWORD)mult); //Vicky051021#1
- }//Nick061103 end
- //gxdwSD_Blocknum=((DWORD)(c_size+1)*(DWORD)mult); //Vicky051021#1 //Nick061103 remove
- rd_block_len=obSDRESPA&0x0F;
- //wr_block_len=((obSDRESP2&0xC0)>>6)|((obSDRESP3&0x03)<<2);//Vicky 0812 del
- //if(rd_block_len!=wr_block_len) gxwSDMaxBlockLength=0x8000;
- //Nick061103 start
- gxdwSD_Blocklen = 1;
- gxdwSD_Blocklen <<= rd_block_len;
- /* switch(rd_block_len)
- {
- case 0:gxdwSD_Blocklen=1;break;
- case 1:gxdwSD_Blocklen=2;break;
- case 2:gxdwSD_Blocklen=4;break;
- case 3:gxdwSD_Blocklen=8;break;
- case 4:gxdwSD_Blocklen=16;break;
- case 5:gxdwSD_Blocklen=32;break;
- case 6:gxdwSD_Blocklen=64;break;
- case 7:gxdwSD_Blocklen=128;break;
- case 8:gxdwSD_Blocklen=256;break;
- case 9:gxdwSD_Blocklen=512;break;
- case 10:gxdwSD_Blocklen=1024;break;
- case 11:gxdwSD_Blocklen=2048;break;
- case 12:
- case 13:
- case 14:
- case 15:gxdwSD_Blocklen=4096;break;
- }*/
- //Nick061103 end
- //gxwSDMaxBlockLength=gxwSDMaxBlockLength|gxdwSD_Blocklen; //Vicky1005
- //Vicky 0812 del
- /*
- gxbSDSmallerBlockAllowed=0;
- if(obSDRESP9&0x80) //Read_BL_partial
- gxbSDSmallerBlockAllowed=0x01;
- if(obSDRESP2&0x20) //Write_BL_partial
- gxbSDSmallerBlockAllowed=gxbSDSmallerBlockAllowed|0x10;
- */
- //gxbSD_TRAN_SPEED=obSDRESPC;//Vicky 0812 del
- //temp1=obSDRESP5;
- if(obSDRESP1&0x20)
- gfSDWP=TRUE;
- //Nick061103#1 start
- if((gxbSDCardType == MMC_MODE) && ((obSDRESPF&0x3C) == 0x10))//check if MMC 4.0
- gxbSDMMCState |= MMC_Ver_40;
- //Nick061103#1 end
- #if(SETTING_FOR_ICE_START|(SD_WP_SWTICH==0)) //allen050628 //Vicky060606#1
- if(DEBUG_SDWP) //050528
- gfSDWP=TRUE;
- else
- gfSDWP=FALSE;
- #endif
- return;
- }
- //Tool
- void SD_Delay(unsigned int DelayCnt)
- {
- while(DelayCnt) {DelayCnt--;}
- }
- #endif
- //Basic Command
- #if(_SD_READ_|_SD_WRITE_)
- bit CMD12(bit fpolling) // Stop Command for Write
- {
- obSDCMD = 0x0C; // CMD12: STOP_TRANSMISSION
- SDStuffArg();
- if(gxbSDCardType == SD_MODE)
- {obSDCTRL =SD_R1_AC_START;} // obSDCTL = 0x95
- else if(gxbSDCardType == MMC_MODE)
- {obSDCTRL = MMC_R1_AC_START;}
- if(!SD_CheckStatus())
- return FALSE;
- if(fpolling)
- {
- if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
- {
- gxbSD_Error=ERR_SD_DAT_TBUSY;
- return FALSE;
- }
- }
- if(obSDSTS&SD_CRC_ERR)
- {
- gxbSD_Error=ERR_SD_CRC;
- SD_POWER_OFF();//Vicky 0817 add
- return FALSE;
- }
- return TRUE;
- }
- #endif
- #if(_SD_READ_)
- void CMD18PRE(DWORD dwLBA) large
- {
- obSDCMD = 0x12;
- obSDARG3 = *((BYTE*)&dwLBA + 0);
- obSDARG2 = *((BYTE*)&dwLBA + 1);
- obSDARG1 = *((BYTE*)&dwLBA + 2);
- obSDARG0 = *((BYTE*)&dwLBA + 3);
- if(gxbSDCardType == SD_MODE || gxbSDMMCState&MMC_4bit_data_bus)//Nick061103#1
- {obSDCTRL = SD_MODE|SD_RESP_R1|SD_CMD_ADTC_RD|SD_CMD_START;}
- else if(gxbSDCardType == MMC_MODE)
- {obSDCTRL = MMC_MODE&SD_RESP_R1|SD_CMD_ADTC_RD|SD_CMD_START;}
- }
- #endif
- #if(_SD_WRITE_)
- bit CMD55(bit fRCA)
- {
- obSDCMD = 0x37; // CMD55: APP_CMD
- if(fRCA)
- SDArg();
- else
- SDStuffArg();
- obSDCTRL = SD_R1_AC_START; //0x95
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- {
- gxbSD_Error=ERR_SD_CRC;
- return FALSE;
- }
- return TRUE;
- }
- bit ACMD23(WORD wlen) large
- {
- obSDCMD = 0x17; // ACMD23: SET_WR_BLK_ERASE_COUNT
- obSDARG3 = 0x00;
- obSDARG2 = 0x00;
- obSDARG1 = *((BYTE*)&wlen + 0);
- obSDARG0 = *((BYTE*)&wlen + 1);
- obSDCTRL = SD_R1_AC_START;//0x95
- if(!SD_CheckStatus())
- return FALSE;
- if(obSDSTS&SD_CRC_ERR)
- {
- gxbSD_Error=ERR_SD_CRC;
- SD_POWER_OFF();
- return FALSE;
- }
- return TRUE;
- }
- void CMD25PRE(DWORD dwLBA) large
- {
- obSDCMD = 0x19;
- obSDARG3 = *((BYTE*)&dwLBA + 0);
- obSDARG2 = *((BYTE*)&dwLBA + 1);
- obSDARG1 = *((BYTE*)&dwLBA + 2);
- obSDARG0 = *((BYTE*)&dwLBA + 3);
- if(gxbSDCardType == SD_MODE || gxbSDMMCState&MMC_4bit_data_bus)//Nick061103#1
- {obSDCTRL = SD_MODE|SD_RESP_R1|SD_CMD_ADTC_WR|SD_CMD_START;}
- else if(gxbSDCardType == MMC_MODE)
- {obSDCTRL = MMC_MODE&SD_RESP_R1|SD_CMD_ADTC_WR|SD_CMD_START;}
- }
- #endif
- #if(_SD_API_ATAPI_)
- API void CardDetach(void) //Vicky1019 //Vicky050506#1
- {
- #if( _SD_DET_PULL)
- //Nick060808 start
- PIN_SD_DETDIR&=(~SD_CD);
- PIN_SD_DET_PULL_EN|=SD_CD;
- PIN_SD_DET_PULL_HIGH|=SD_CD;
- //Nick060808 end
- #else
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
- PIN_SD_DETDAT&=~SD_CD;
- PIN_SD_DETDIR&=~SD_CD;
- #else
- PIN_SD_DETDAT|=SD_CD;
- PIN_SD_DETDIR|=SD_CD;
- #endif
- #endif
- if(gfSDPowerOn==TRUE)
- {
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
- if((!(PIN_SD_DETDAT&SD_CD))||(!gfSDinit))//Vicky1005 change
- #else
- if((PIN_SD_DETDAT&SD_CD)||(!gfSDinit))//Vicky1005 change
- #endif
- SD_POWER_OFF();
- }
- else
- {
- #if(COLOR_MODE==3) //modify by Rojam 2007-05-17 17:21
- if(!(PIN_SD_DETDAT&SD_CD))//Vicky1005 change
- #else
- if(PIN_SD_DETDAT&SD_CD)//Vicky1005 change
- #endif
- {
- gfSDinit=FALSE;
- gfSDStop=FALSE;
- }
- }
- #if( _SD_DET_PULL)
- PIN_SD_DET_PULL_EN&=(~SD_CD); //Nick060808
- #else
- PIN_SD_DETDIR&=(~SD_CD);
- #endif
- }
- /*--------------------------------------------------------------------------
- Description:
- ATAPI FunC.
- (Send 8 bytes data to PC,
- including the number of blocks in card(4 bytes),the number of bytes in a block(4bytes).)
- when accepted Read-Capacity CMD(opcode=0x25).
- Global arguments:
- gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
- gxdwSD_Blocklen: the number of bytes in a block.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- API void SDReadCapa(void) //Vicky051021#1 fix the error capa (Should return the end LBA)
- {
- DWORD dwcapa;
- if(gxdwSD_Blocknum)
- dwcapa=gxdwSD_Blocknum-1;
- else
- dwcapa=0;
- // Logical Block Address (MSB first)
- WaitEPANotFull(); obUSBDEVEPAFIFO = (dwcapa >> 24) & 0xFF;
- WaitEPANotFull(); obUSBDEVEPAFIFO = (dwcapa >> 16) & 0xFF;
- WaitEPANotFull(); obUSBDEVEPAFIFO = (dwcapa >> 8) & 0xFF;
- WaitEPANotFull(); obUSBDEVEPAFIFO = dwcapa & 0xFF;
- // Block Length in Bytes (MSB first)
- WaitEPANotFull(); obUSBDEVEPAFIFO = (gxdwSD_Blocklen >> 24) & 0xFF;
- WaitEPANotFull(); obUSBDEVEPAFIFO = (gxdwSD_Blocklen >> 16) & 0xFF;
- WaitEPANotFull(); obUSBDEVEPAFIFO = (gxdwSD_Blocklen >> 8) & 0xFF;
- WaitEPANotFull(); obUSBDEVEPAFIFO = gxdwSD_Blocklen & 0xFF;
- }
- /*--------------------------------------------------------------------------
- Description:
- ATAPI FunC.(Send 8 bytes data to PC, including card's write-protected information.)
- when accepted Modesense6 CMD(opcode=0x1A).
- Global arguments:
- gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
- gfSDWP: TRUE,the SD/MMC card is write-protected.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- /*API void SDModeSense6Data(void) //Nick060531 mark it
- {
- //obUSBDEVEPAFIFO = 0x08;
- obUSBDEVEPAFIFO = 0x3E;
- obUSBDEVEPAFIFO = 0x00;
- if( gfSDWP==TRUE )
- obUSBDEVEPAFIFO = 0x80;
- else
- obUSBDEVEPAFIFO = 0x00;
- if(gxbSDCardType == SD_MODE)
- obUSBDEVEPAFIFO = 0x08;
- else
- obUSBDEVEPAFIFO = 0x01;
- obUSBDEVEPAFIFO = 0x00;
- obUSBDEVEPAFIFO = 0x00;
- obUSBDEVEPAFIFO = 0x00;
- }*/
- /*--------------------------------------------------------------------------
- Description:
- Write data to SD. (data Source: USB )
- Arguments:
- Global arguments:
- gdwCBWDataTransferLength: the number of bytes to be transfered.
- gxdwLBA_address: the LBA of Source (in SD/MMC Card)
- gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
- gxwSD_SecCnt: the number of Blocks to be transfered everytime ,when SD_USBRead() is called.
- gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
- gfSplitCommand: TRUE,the number of Blocks to be transfered is more than 255.
- gfR1Err: TRUE,R1 report error.
- gxbSD_Error: error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
- Returns:
- TRUE: all data are transfered to USB.
- FALSE: some error occured.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- API bit SD_USBWrite(void)large//Vicky0908 modify //Vicky050506#1
- {
- BYTE SD_SecCnt;
- gxbSD_Error=0;//Vicky0908 add
- if(!SD_Det(SD_DET)) //Nick060808 add SD_DET
- return FALSE;
- if( gbCBWCB[8] == 0 )
- {
- gxwSD_SecCnt = 0x100;//256 Block
- SD_SecCnt=0xff;
- gbCBWCB[7]--;
- }
- else
- {
- gxwSD_SecCnt = (WORD)gbCBWCB[8];
- SD_SecCnt=gbCBWCB[8]-1;
- }
- obSDBLOCKLENH = 0x02;
- obSDBLOCKLENL = 0x00;
- if( !gfSplitCommand )
- {
- obUSBOTGDMACLR = *((BYTE *)&gdwCBWDataTransferLength+3);
- obUSBOTGDMACMR = *((BYTE *)&gdwCBWDataTransferLength+2);
- obUSBOTGDMACHR= *((BYTE *)&gdwCBWDataTransferLength+1);
- obUSBOTGSPEED &= TRANSFER_DISJ; //disable DMA
- obMODSEL3 |= BYPASS_RA; //bypass RA
- obSOURCEPATHCTRL = 0x13; //Source USB
- obTARGETPATHCTRL = 0x10; //Target SD
- obUSBOTGSPEED |= TRANSFER_EN; //Enable DMA
- }
- *((BYTE*)&gxdwLBA_address + 0) = gbCBWCB[2];
- *((BYTE*)&gxdwLBA_address + 1) = gbCBWCB[3];
- *((BYTE*)&gxdwLBA_address + 2) = gbCBWCB[4];
- *((BYTE*)&gxdwLBA_address + 3) = gbCBWCB[5];
- if( (gxdwLBA_address>gxdwSD_Blocknum) || //Vicky051221#3
- ((gxdwLBA_address+(DWORD)SD_SecCnt+1) > gxdwSD_Blocknum)) //Vicky051021#1
- {
- obUSBOTGSPEED &= TRANSFER_DISJ; //disable DMA
- //SDError();//Vicky1005 del
- //SD_POWER_OFF();
- return FALSE;
- }
- if(!(gxbSDMMCState&SD_HIGH_CAPACITY))//Nick061103
- gxdwLBA_address = (gxdwLBA_address<<9);
- if(gxbSDCardType == SD_MODE)
- {
- if(!CMD55(TRUE))
- {
- gxbSD_Error|=ERR_SD_CMD55;
- return FALSE;
- }
- if(!ACMD23(gxwSD_SecCnt))
- {
- gxbSD_Error|=ERR_SD_ACMD23;
- return FALSE;
- }
- }
- obSDBLOCKNUM = SD_SecCnt;
- CMD25PRE(gxdwLBA_address);
- if(!SDpolling(&obSDCTRL,SD_CMD_START,0))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_START;
- return FALSE;
- }
- if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_CMD_BUSY;
- return FALSE;
- }
- SD_CheckR1();
- if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_DAT_TBUSY;
- return FALSE;
- }
- if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1))
- {
- gxbSD_Error=ERR_SD_CMD25|ERR_SD_DATLINE_BUSY;
- return FALSE;
- }
- if(!CMD12(TRUE))
- {
- gxbSD_Error|=ERR_SD_CMD12;
- return FALSE;
- }
- obSDCLOCKWIDTH |= 0x01;
- if(!SDpolling(&obSDSTS,SD_DATLINE_BUSY,1))
- {
- gxbSD_Error=ERR_SD_CMD12|ERR_SD_DATLINE_BUSY;
- return FALSE;
- }
- obSDCLOCKWIDTH &= 0xFE;
- if(!SD_RESP_DelayCount(SD_STATE_TRAN))
- {
- gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE;
- return FALSE;
- }
- if(gfR1Err) //Vicky041126#2
- return FALSE; //Vicky041126#2
- return TRUE;
- }
- /*--------------------------------------------------------------------------
- Description:
- Read data from SD. (data Target: USB )
- Arguments:
- Global arguments:
- gdwCBWDataTransferLength: the number of bytes to be transfered.
- gxdwLBA_address: the LBA of Source (in SD/MMC Card)
- gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
- gxwSD_SecCnt: the number of Blocks to be transfered everytime ,when SD_USBRead() is called.
- gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
- gfSplitCommand: TRUE,the number of Blocks to be transfered is more than 255.
- gfR1Err: TRUE,R1 report error.
- gxbSD_Error: error code(the most significant nibble:SD CMD,the least significant nibble:error condition)
- Returns:
- TRUE: all data are transfered to USB.
- FALSE: some error occured.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- API bit SD_USBRead(void) large//Vicky0908 modify
- {
- BYTE SD_SecCnt;
- gxbSD_Error=0;//Vicky0908 add
- if(!SD_Det(SD_DET)) //Nick060808 add SD_DET
- return FALSE;
- if( gbCBWCB[8] == 0 )
- {
- gxwSD_SecCnt = 0x100;//256 Block
- SD_SecCnt=0xff;
- gbCBWCB[7]--;
- }
- else
- {
- gxwSD_SecCnt = (WORD)gbCBWCB[8];
- SD_SecCnt=gbCBWCB[8]-1;
- }
- obSDBLOCKLENH = 0x02;
- obSDBLOCKLENL = 0x00;
- if(!gfSplitCommand)
- {
- obUSBOTGDMACLR = *((BYTE *)&gdwCBWDataTransferLength+3);
- obUSBOTGDMACMR = *((BYTE *)&gdwCBWDataTransferLength+2);
- obUSBOTGDMACHR= *((BYTE *)&gdwCBWDataTransferLength+1);
- obUSBOTGSPEED &= TRANSFER_DISJ; //disable DMA
- obMODSEL3 |= BYPASS_RA; //bypass RA
- obSOURCEPATHCTRL = 0x10; //Source SD
- obTARGETPATHCTRL = 0x13; //Target USB
- obUSBOTGSPEED |= TRANSFER_EN; //Enable DMA
- }
- obSDBLOCKNUM = SD_SecCnt;
- *((BYTE*)&gxdwLBA_address + 0) = gbCBWCB[2];
- *((BYTE*)&gxdwLBA_address + 1) = gbCBWCB[3];
- *((BYTE*)&gxdwLBA_address + 2) = gbCBWCB[4];
- *((BYTE*)&gxdwLBA_address + 3) = gbCBWCB[5];
- if( (gxdwLBA_address>gxdwSD_Blocknum) || //Vicky051221#3
- ((gxdwLBA_address+(DWORD)SD_SecCnt+1) > gxdwSD_Blocknum) ) //Vicky051021#1
- {
- //gfMediumChange=TRUE;
- obUSBOTGSPEED &= TRANSFER_DISJ;
- //SD_POWER_OFF();
- return FALSE;
- }
- if(!(gxbSDMMCState&SD_HIGH_CAPACITY))//Nick061103
- gxdwLBA_address = (gxdwLBA_address<<9);
- CMD18PRE(gxdwLBA_address);
- if(!SDpolling(&obSDCTRL,SD_CMD_START,0))
- {
- gxbSD_Error=ERR_SD_CMD18|ERR_SD_CMD_START;
- return FALSE;
- }
- if(!SDpolling(&obSDSTS,SD_CMD_BUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD18|ERR_SD_CMD_BUSY;
- return FALSE;
- }
- if(!SDpolling(&obSDSTS,SD_DAT_TBUSY,0))
- {
- gxbSD_Error=ERR_SD_CMD18|ERR_SD_DAT_TBUSY;
- return FALSE;
- }
- if(!CMD12(FALSE))
- {
- gxbSD_Error|=ERR_SD_CMD12;
- return FALSE;
- }
- if(!SD_RESP_DelayCount(SD_STATE_TRAN))
- {
- gxbSD_Error=ERR_SD_CMD12|ERR_SD_STATE;
- return FALSE;
- }
- if(gfR1Err) //Vicky041126#2
- return FALSE; //Vicky041126#2
- return TRUE;
- }
- #if 0 //v03210 del
- /*--------------------------------------------------------------------------
- Description:
- ATAPI FunC.
- (Send 20 bytes data to PC,
- including the number of blocks in card(4 bytes),the number of bytes in a block(3bytes).)
- when accepted Read-Format-Capacity CMD(opcode=0x23).
- Global arguments:
- gxbSDCardType: SD_MODE(SD),MMC_MODE(MMC)
- gfSDWP: TRUE,the SD/MMC card is write-protected.
- gxdwSD_Blocknum: the number of blocks in SD/MMC Card.
- gxdwSD_Blocklen: the number of bytes in a block.
- gdwCBWDataTransferLength: the number of bytes that PC requested to transfer.
- 2004/08/11: Edit by Vicky
- --------------------------------------------------------------------------*/
- bit SDFormatCapa(void) large
- {
- BYTE cbtemp;
- if(gfSDinit)
- {
- //.Capacity header
- WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;//(byte 0) reserved
- WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;//(byte 1) reserved
- WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;//(byte 2) reserved
- WaitEPANotFull();obUSBDEVEPAFIFO = 0x10;//(byte 0) length
- /*Capacity descriptor0*/
- //.Number of blocks
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>24);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>16);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>8);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum);
- //.Descriptor type
- WaitEPANotFull();obUSBDEVEPAFIFO = 0x02; //TYPE_FORMATTED
- //.Block Length in Bytes (MSB first)
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>16);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>8);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen);
- /*Formattable capacity descriptor*/
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>24);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>16);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum>>8);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocknum);
- //.format type
- WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;
- //.Block Length in Bytes (MSB first)
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>16);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen>>8);
- WaitEPANotFull();obUSBDEVEPAFIFO = (gxdwSD_Blocklen);
- return TRUE;
- }
- else
- {
- for(cbtemp = 0; cbtemp < gdwCBWDataTransferLength; cbtemp++)
- {WaitEPANotFull();obUSBDEVEPAFIFO = 0x00;}
- return FALSE;
- }
- }
- #endif
- #endif
- #else //Walace060929#1 start
- #if(!(_PM_PLAY_DATA_RTN_RESTORE_|_PM_FM_)) //modify by Rojam 2007-03-29 17:9
- bit SD_Write(void) large
- {
- return FALSE;
- }
- #if(!(_PM_PLAY_MAIN_|_PM_PLAY_PRC_)) //modify by Rojam 2007-04-12 11:24
- void SDReadCapa(void)
- {
- ;
- }
- bit SD_Init_400K(void)
- {
- return FALSE;
- }
- bit SD_USBRead(void) large//Vicky0908 modify
- {
- return FALSE;
- }
- bit SD_USBWrite(void) large//Vicky0908 modify
- {
- return FALSE;
- }
- bit SD_Det(BOOL fForceSDRemove)
- {
- fForceSDRemove=fForceSDRemove; // modify by Rojam 2007-03-29 16:40
- return FALSE;
- }
- void SD_POWER_OFF(void)
- {
- ;
- }
- #endif
- #endif
- #endif //Walace060929#1 end