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

📄 mmcdrvonecard.c

📁 How to control MMC interface under SZ platform
💻 C
字号:
#include "mmclocal.h"
#include "mem_pptt.h"
#include "HAL_pptt.h"
MMC_STATUS _MMCInitOneCard(MMC_CARD_INFO *cardinfo)
{ 	
	U16  i, j, count;
    MMC_STATUS  ret;
	U8   Cidbuff[20];
	
//------------------------------------------------------
	ret=_MMCChectHardwareRevision();
	if(ret)
		return ret;
		
	ret=_MMCSoftReset();
	if(ret)
		return ret;
	
    cardinfo->card_adr = 1 ;
    cardinfo->type=MMC_TYPE_UNKNOW;
    cardinfo->buswidth=1;
	
	ret =_MMCGoIdleState();           
    if ( ret != 0 )
    {
        return ret;
    }
//--------------------------------------------------------    
    ret=_MMCAppCmd(0);
//--------------------------------------------------------    
    if(ret==0)
    	cardinfo->type=MMC_TYPE_SD;
    else
    	cardinfo->type=MMC_TYPE_MMC;

	ret =_MMCGoIdleState();           
    	
    for ( j = 0 ; j < MMC_ADP_REPEATNUM ; j++ )
    {	/*CMD1 ask all cards in idle state to send their operation condition
          register contents in the response on CMD line
         */
        if(cardinfo->type==MMC_TYPE_SD)
        {
        	ret=_MMCAppCmd(0);
        	if(ret)
        		break;
        }
        if(cardinfo->type==MMC_TYPE_SD)
	    	ret = _SDSendOpCond(SD_CARD_VOLTAGE);        
		else
			ret = _MMCSendOpCond(MMC_CARD_VOLTAGE);        
        if ( ret == 0 )
        {/*--------- WHEN NO ERROR OCCURS (= FINISH INIT)*/
            break;
        }
               
        if(ret!=MMC_CARD_BUSY)
        	break; 		//CMD send ERROR
        
    }   
	    
	if(ret)
		return ret;	
//-----------------------------------------------------------
	
	ret=_MMCAllSendCID(Cidbuff);
	
	if(ret)
		return ret;
	
	if(cardinfo->type==MMC_TYPE_SD)
		ret = _SDGetRelativeAddr(&(cardinfo->card_adr )); //CMD3
	else
		ret	= _MMCSetRelativeAddr(cardinfo->card_adr);
	
	ret=_MMCSelectDeselectCard(cardinfo->card_adr);
	if(ret)
		return ret;
			
	ret=_MMCSetBlockLen(MMC_BLOCK_SIZE);
	if(ret)
		return ret;
		
	ret=_MMCSetBusWidth(cardinfo);
	if(ret)
		return ret;
		
	TRACE("Init Success\n");
	return ret;
}

MMC_STATUS _MMCSetBusWidth(MMC_CARD_INFO *cardinfo)
{
	U8 *pbuff;
	MMC_STATUS ret;
	
	if(cardinfo->type==MMC_TYPE_MMC)
		return 0;
	pbuff=_MemMalloc(MMC_BLOCK_SIZE);
	
		
	
/*	_MMCSetBlockLenReg(SD_SCR_SIZE);
	ret=_MMCSetBlockLen(SD_SCR_SIZE);
	if(ret)
		return;
		
	ret=_MMCAppCmd(cardinfo->card_adr);
	if(ret)
		return ret;	
	ret=_SDSendSCR(pbuff);
	if(ret)
		return ret;
*/	
	pbuff[1]=0x4;
	if(pbuff[1]&0x4)
	{
		ret=_MMCAppCmd(cardinfo->card_adr);
		if(ret==0)
			ret=_SDSetBusWidth(0x2);
		if(ret)
			return ret;
		cardinfo->buswidth=pbuff[1]&0xF;
	}
	
	_MMCSetBlockLenReg(MMC_BLOCK_SIZE);
	
	ret=_MMCSetBlockLen(MMC_BLOCK_SIZE);
	if(ret)
		return ret;
	
/*	ret=_MMCAppCmd(cardinfo->card_adr);
	if(ret)
		return ret;
	
	ret=_SDSendStatus(pbuff);
	if(ret)
		return ret;
	
	cardinfo->buswidth=(pbuff[511]&0xC0)>>4;
*/	
	_MemFree(pbuff);

	return ret;
}

MMC_STATUS _MMCReadSectOneCard(U32 log_sect, U16 nsects,U8 *buff) 
{
	MMC_STATUS ret;
	_MMCClockSet(0xFF); //set hight speed
	_MMCWaitUntilCardReady(&_gCardInfo);
	
	ret = _MMCReadBlock(&_gCardInfo,log_sect*MMC_BLOCK_SIZE, nsects, &buff[0] );
	if(ret)
		return ret;
	
	if(nsects!=1)
		ret=_MMCStopTransmission();
	if(ret)
		return ret;
		
	_MMCWaitUntilCardReady(&_gCardInfo);
	
	return ret;
}

MMC_STATUS _MMCWriteSectOneCard(U32 log_sect, U16 nsects,U8 *buff) 
{
	MMC_STATUS ret;
	_MMCClockSet(0xFF); //set hight speed
	_MMCWaitUntilCardReady(&_gCardInfo);
	
	ret = _MMCWriteBlock(&_gCardInfo,log_sect*MMC_BLOCK_SIZE, nsects, &buff[0] );
	if(ret)
		return ret;
	
	if(nsects!=1)
		ret=_MMCStopTransmission();
	if(ret)
		return ret;
		
	_MMCWaitUntilCardReady(&_gCardInfo);
	
	return ret;
}


/******************************************************************************

 Function Name    : MMC_STATUS _MMCWaitUntilCardRead()

 Input Parameters : void
            		
 Output Parameters: VOID

 Value returned   : U32    0: Sucessful operation, others: meet Error

 Description      : Wait till card read

 Cautions         : 
 
 Prev Condition   : VOID

 Post Condition   : VOID

******************************************************************************/

MMC_STATUS _MMCWaitUntilCardReady(P_MMC_CARD_INFO pCurrentCardInfo)
{
	U32 status=0;
	MMC_STATUS ret;
	
   	while(!(status&0x100)) ///wait card ready
    {
      	ret=_MMCSendStatus(pCurrentCardInfo->card_adr,&status);
       	if(ret!=0)
       		return ret;
    }
    return 0;
}
/******************************************************************************

 Function Name    : _MMCTimeSet( U16 *time )
 
 Input Parameters : U16 *time  Data/Time buffer 
          			
 Output Parameters: VOID

 Value returned   : VOID

 Description      : Set up time stamp. Dummy  data of year/month/date, 
 					hour/minute second.

 Cautions         : 
 
 Prev Condition   : VOID

 Post Condition   : VOID

******************************************************************************/
void _MMCTimeSet( U16 *time )
{
    U8  yr, mon, mday, hour, min, sec;
    /*----------------------------------------------------------------------*/
    /* THIS IS SET AS A FIXED VALUE FOR DEBUGGING NOW.                      */
    /* TIMESTAMP IS A HARDWARE DEPENDENT PART.  THIS SHALL BE MODIFIED IN   */
    /* ACCORDANCE WITH SPECIFIC HARDWARE.                                   */
    /*----------------------------------------------------------------------*/

    /*----------------------------------------------------------------------*/
    /*  SET 2079/12/31/  23:59:58                                           */
    /*----------------------------------------------------------------------*/
    yr   = 79;	/* LOWER 2 DIGITS OF YEAR  */
    mon  = 12;	/* MONTH:1-12              */
    mday = 31;	/* DATE:1-31               */
    hour = 23;	/* HOUR:0-23               */
    min  = 59;	/* MINUTE:0-59             */
    sec  = 58;	/* SECOND:0-59             */

    /* CHANGED TO DOS YEAR */
    if ( yr >= 80 ) 
    {
          /* 1980-1999 */
          yr -= 80;
    } else {
          /* 2000-2079 */
          yr += 20;
    }

    sec = sec >> 1;/* 2 SECONDS UNIT */
    *time++ = ( hour << 11 ) | ( min <<  5 ) | ( sec );
    *time   = ( yr << 9 ) | ( mon << 5 ) | ( mday );
}
/******************************************************************************

 Function Name    : _MMCGetStatus( U8 card_no, MMC_CARD *cardinfo )
 
 Input Parameters : U8 card_no      	Card Number
 					MMC_CARD *cardinfo	Card Structure
          			
 Output Parameters: VOID

 Value returned   : U32           card change(0:NONE, NO_RESPONSE:YES)

 Description      : Acquire the card state

 Cautions         : 
 
 Prev Condition   : VOID

 Post Condition   : VOID

******************************************************************************/

U32 _MMCGetStatus( U8 card_no, MMC_CARD_INFO *cardinfo )
{
	U32 state;
	MMC_STATUS ret=_MMCSendStatus(cardinfo->card_adr,&state);
    
	ret&=MMC_STATUS_NOERROR|0xFFFF;
	    
   
    return( ret );
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -