⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmccmd.c

📁 How to control MMC interface under SZ platform
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -