?? mmccmd.c
字號:
while(!((*(P_U16)MMCR_STATUS)&0x1000))i++;// wait until access operation done
/*if(i>0&&((i&0xFF)==0)) //if(i>0 && i%256==0)
_MMCStartClk();
*/
/* for(i=0;i<100000;i++)
{
_MMCStartClk();
if(((*(P_U16)MMCR_STATUS)&0x40)!=0) //wait for FIFO empty
break;
}
*/
TRACE(" Wait for last time FIFO empty. Time: %d\n",i);
ret|= (*(P_U16)MMCR_STATUS)&0x4;
_MMCStopClk();
return ret;
}
/******************************************************************************
Function Name : _MMCTagSectorEnd(U32 addr)
Input Parameters : U32 addr address
Output Parameters: VOID
Value returned : int 0: Sucessful operation, others: meet Error
Description : CMD33 Sets the address of the first sector of the erase group
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCTagSectorEnd(U32 addr)
{
MMC_RESPONSES rp;
MMC_STATUS ret;
ret=_MMCNoDataCommand(MMC_CMD33,addr,MMCB_R1);
if(ret)
return ret;
_MMCGetResponses(&rp,MMCB_R1);
return rp.status&MMC_STATUS_NOERROR;
}
/******************************************************************************
Function Name : _MMCErase()
Input Parameters : U32 addr address
Output Parameters: VOID
Value returned : int 0: Sucessful operation, others: meet Error
Description : CMD38 erase all previously selected sectors
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCErase()
{
MMC_RESPONSES rp;
MMC_STATUS ret;
ret=_MMCNoDataCommand(MMC_CMD38,0,MMCB_R1);
if(ret)
return ret;
_MMCGetResponses(&rp,MMCB_R1);
return rp.status&MMC_STATUS_NOERROR;
}
/******************************************************************************
Function Name : _SDSendOpCond(U32 voltage)
Input Parameters : U32 voltage
Output Parameters: VOID
Value returned : int 0: Sucessful operation, others: meet Error
Description : ACMD41: Ask all SD cards in idle state to send their operation
coditions register content in response on the CMD line.
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _SDSendOpCond(U32 voltage)
{
MMC_RESPONSES rp;
MMC_STATUS ret;
ret=_MMCNoDataCommand(MMC_CMD41,voltage,MMCB_R3);
if(ret)
return ret; //meet some error
_MMCGetResponses(&rp,MMCB_R3);
if( !(rp.OCR&0x80000000))
return MMC_CARD_BUSY;
else
return 0;
}
/******************************************************************************
Function Name : _MMCSendSCR()
Input Parameters : VOID
Output Parameters: VOID
Value returned : int 0: Sucessful operation, others: meet Error
Description : ACMD51 Read the SD Configuration Register(SCR)
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _SDSendSCR(P_U8 pSCR)
{
MMC_RESPONSES rp;
MMC_STATUS ret;
int i=0,length;
U16 status;
P_U16 pbuff;
pbuff=(P_U16)pSCR;
while(_MMCIsRun())
_MMCStopClk();
_MMCSetCmd(MMC_CMD51,0,MMCB_DATEN|MMCB_R1);
//*(P_U16)MMCR_INT_MASK=(~MMC_CMD_DONE)&0xF;
*(P_U16)MMCR_INT_MASK=0xF;
_gMMCIsIrpt=1;
*(P_U16)MMCR_STR_STP_CLK=0x06; //start clk
//while(_gMMCIsIrpt)i++; //wait for CMD_DONE interrupt
while(!((*(P_U16)MMCR_STATUS)&0x2000))i++;
TRACE(" CMD Result: 0x%04X,wait time %d\n",(*(P_U16)MMCR_STATUS),i); //TEST omit response CRC Error
ret=(*(P_U16)MMCR_STATUS)&MMC_CMD_TIMEOUT; //Time Out Error
if(ret)
{ _MMCStopClk();
return ret;
}
length=SD_SCR_SIZE/sizeof(U16);
for(i=0;i<length;i++)
{
if((*((P_U16)MMCR_STATUS)&0x40)!=0)//If Fifo is empty
while((*((P_U16)MMCR_STATUS)&0x80)==0) //wait for buff full
{
ret=(*((P_U16)MMCR_STATUS))&0x1;
if( ret )
break;
}
//If MMC meet Time-Out of Response or CRC Read Error.
if( ret )
{
TRACE(" Read Data Time Out\n");
break;
}
*pbuff=*((P_U16)(MMCR_BUFFER_ACCESS)); //data tranferring
pbuff++;
}
i=0;
while(!((*(P_U16)MMCR_STATUS)&0x800))i++; //wait data transfer done
_MMCStopClk();
return ret;
}
/******************************************************************************
Function Name : _MMCAppCmd(U32 rca)
Input Parameters : U32 rca :Card relative address to the card
Output Parameters: VOID
Value returned : int 0: Sucessful operation, others: meet Error
Description : CMD55 Indicate to the card that the next command is an application
specific command rather than a standard command
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCAppCmd(U32 addr)
{
MMC_RESPONSES rp;
MMC_STATUS ret;
ret=_MMCNoDataCommand(MMC_CMD55,addr<<16,MMCB_R1);
if(ret)
return ret;
_MMCGetResponses(&rp,MMCB_R1);
return rp.status&MMC_STATUS_NOERROR;
}
/******************************************************************************
Function Name : _MMCNoDataCommand(U8 cmd, U32 arg,U32 ctrl,U32 EndCondition)
Input Parameters : U8 cmd Command Number
U32 arg Command argument
U32 ctrl Command control value inculding response type
and so on. See SZ menu
Output Parameters: VOID
Value returned : int 0: Sucessful operation, others: meet Error
Description : Send commend to MMC card and wait for response
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCNoDataCommand(U8 cmd, U32 arg,U32 ctrl)
{
MMC_STATUS ret;
int i=0;
_gMMCIsTransferDone=1; //no data tranferring
while(_MMCIsRun())
_MMCStopClk();
_MMCSetCmd(cmd,arg,ctrl);
// *(P_U16)MMCR_INT_MASK=(~MMC_CMD_DONE)&0xF;
*(P_U16)MMCR_INT_MASK=0xF;
_gMMCIsIrpt=1;
_MMCStartClk();
// while(_gMMCIsIrpt)i++;
while(!((*(P_U16)MMCR_STATUS)&0x2000))i++;
TRACE(" CMD Result: 0x%04X,wait time %d\n",(*(P_U16)MMCR_STATUS),i); //TEST omit response CRC Error
ret=(*(P_U16)MMCR_STATUS)&MMC_CMD_TIMEOUT; //Time Out Error
_MMCStopClk();
return ret;
}
/******************************************************************************
Function Name : U32 _MMCWaitDataTransDone()
Input Parameters : void
Output Parameters: VOID
Value returned : int 0: Sucessful operation, others: meet Error
Description : Wait until Command done or Data tranferring done
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
MMC_STATUS _MMCWaitDataTransDone()
{
int i=0;
while(_gMMCIsTransferDone==0)
{
i++;
}
TRACE("Wait DMA Data Tran Time: %d\n",i);
return _gMMCTransferStatus;
}
/******************************************************************************
Function Name : U32 _MMCTransferEnd(U16 state)
Input Parameters : U16 status of DMA tranferring end
Output Parameters: VOID
Value returned : VOID
Description : Callback function. It is called in DMA irpt.
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCTransferEnd(U16 state)
{
if(_gMMCIsTransferDone!=0) //No any task wait for DMA over or MMC meet Error
{ TRACE("MMC or DMA meet ERROR \n");
return ;
}
_gMMCIsTransferDone=1;
if(state==DMA_TRANSFER_COMPLETE) //If Dma Transfer successful
{ _gMMCTransferStatus=0; //Success
TRACE("MMC DMA Data Transfer OK\n");
}
else
{ _gMMCTransferStatus=MMC_DMA_TRANS_ERR; //DMA meet Error;
}
}
/******************************************************************************
Function Name : U32 _MMCTransferEnd(U32 arg)
Input Parameters : U32 arg :no used
Output Parameters: VOID
Value returned : VOID
Description : interrrupt handler of MMC
Cautions :
Prev Condition : VOID
Post Condition : VOID
******************************************************************************/
void _MMCIrptHandle()
{
U16 mask;
_gMMCIsIrpt=0;
mask=*(P_U16)MMCR_INT_MASK;
*(P_U16)MMCR_INT_MASK=mask; //clear interrupt source
if(_gMMCIsTransferDone!=0) //No any task wait for DMA over or MMC meet Error
return ;
_gMMCIsTransferDone=1; //for test
if((*(P_U16)MMCR_STATUS)&0xD) // If MMC meet Error
{
_gMMCIsTransferDone=1;
_gMMCTransferStatus=1; //MMC meet Error;
if(_gMMCDMAChannel!=0xFF)
_DmaCancelTransfer(_gMMCDMAChannel);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -