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

📄 mmconecard.c

📁 How to control MMC interface under SZ platform
💻 C
📖 第 1 页 / 共 2 页
字号:

 Post Condition   : VOID

******************************************************************************/
int MMCRawWrite( DEVICE *devp, int cylinder, int head, int sector,
                   int nsects, void *bufp )
{
    return( SYS_ERR );/* raw_write SHALL NOT BE CALLED BECAUSE THIS IS HDD FORMAT */
}

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

 Function Name    : MMCTimeStamp( U16 *time )
	                  
 Input Parameters : U16 *time  Buffer to store data,time
 
 Output Parameters: VOID

 Value returned   : VOID

 Description      : Interface functions between USFiles and MMC driver. 
 					Time Stamp

 Cautions         : Public function.
 
 Prev Condition   : VOID

 Post Condition   : VOID

******************************************************************************/
void MMCTimeStamp( U16 *time )
{
    _MMCTimeSet( time );
    
}

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

 Function Name    : MMCDiskChange( DEVICE *devp )
	                  
 Input Parameters : DEVICE *devp                Device Table
 
 Output Parameters: VOID

 Value returned   : int            0: NO,  1: YES

 Description      : Interface functions between USFiles and MMC driver. 
 					Media Change Yes/NO

 Cautions         : 
 
 Prev Condition   : VOID

 Post Condition   : VOID

******************************************************************************/
int MMCDiskChange( DEVICE *devp )
{
    U8    card_no;
    MMC_STATUS  ret;

    card_no = 0;
    ret = 0;
    /*----------------------------------------------------------------------*/
    /*  ACQUIRE THE CARD NUMBER                                             */
    /*----------------------------------------------------------------------*/
    card_no = (devp->unit_no & ~MMC_UNIT_NO);
    /*----------------------------------------------------------------------*/
    /*  CONFIRM THE CARD STATUS                                             */
    /*----------------------------------------------------------------------*/
    if ( ret = _MMCGetStatus( card_no, &_gCardInfo ) )
    {
        TRACE("ERR_MEDIA_DSKCHG\n");
        return(ERR_MEDIA_DSKCHG );/* MEDIA CHANGE; YES */
    }
    else
    {
        return( 0 );/* MEDIA CHANGE; NO */
    }
}

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

 Function Name    : MMCIoctl(U16 Key,P_VOID pAgu,P_U32 pSize)
	                  
 Input Parameters : U16 	key       key value
 					P_VOID pAgu       
 					P_U32  pSize
 
 Output Parameters: VOID

 Value returned   : SYS_OK      operation success 
 					SYS_ERR     meet error

 Description      : Interface functions between DM and MMC driver. 

 Cautions         : 
 
 Prev Condition   : VOID

 Post Condition   : VOID

******************************************************************************/
STATUS MMCIoctl(U16 Key,P_VOID pAgu,P_U32 pSize)
{
	switch(Key)
	{
		//case KEY_SYS_MSG:
			 return SYS_OK;
	}
	return SYS_ERR;
}

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

 Function Name    : _MMCErrorConvert(MMC_STATUS status)
	                  
 Input Parameters :	MMC_STATUS status
 
 Output Parameters: VOID

 Value returned   : See FlsMmcInterface.h
 
 Description      : Interface functions between DM and MMC driver. 

 Cautions         : Only use MMCRead and MMCWrite  
 
 Prev Condition   : VOID

 Post Condition   : VOID

******************************************************************************/
int _MMCErrorConvert(MMC_STATUS status)
{
	if(status&MMC_READ_TIMEOUT)
	{	TRACE("Error: ERR_MEDIA_READTIMEOUT\n");
		return ERR_MEDIA_READTIMEOUT;
	}	
	
	if(status&(MMC_CMD_TIMEOUT|MMC_ILLEGAL_ERROR_MASK))
	{	
		TRACE("Error: ERR_MEDIA_DSKCHG\n");
		return ERR_MEDIA_DSKCHG;
	}
	if(status&0x80000000)
	{	TRACE("Error: ERR_MEDIA_OUTOFRANGE\n");
		return ERR_MEDIA_OUTOFRANGE;
	}
	if(status&MMC_INVALID_CARD_NO)
	{	TRACE("Error: ERR_MEDIA_OUTOFRANGE\n");
		return ERR_MEDIA_OUTOFRANGE;
	}	
	if(status&0x400000000)
	{	TRACE("Error: ERR_MEDIA_ADDRESS\n");
		return ERR_MEDIA_ADDRESS;
	}
	if(status&0x040000000)
	{	
		TRACE("Error: ERR_MEDIA_WRTPRT\n");
		return ERR_MEDIA_WRTPRT;
	}
	if(status!=0)
	{	TRACE("Error: ERR_MEDIA_GENEALERROR\n");
		return ERR_MEDIA_GENEALERROR;
	}
}

#define BLOCK_NUM 400	
int MMCLargerDataTest()
{
	DEVICE dev;
	int i;
	PCFM_BUFFER pcfm;
	U8 *pbuff;	
	U8 x;
	
	pbuff=_MemMalloc(MMC_BLOCK_SIZE*BLOCK_NUM);
	
	pcfm.nsects=1;
	pcfm.userbuf=pbuff;
	pcfm.devp=&dev;
	dev.unit_no=MMC_UNIT_NO;
	printf("Wait for two minutes\n");

	if(MMCInit(&dev))
		printf("Init Failed\n");

	srand(9876);
	for(i=0;i<MMC_BLOCK_SIZE*BLOCK_NUM;i++)
	{
		pbuff[i]=rand();
	}
		
	
	printf("Test lareg data single block read\write\n");
	printf("Wait for 2 mins\n");


	for(i=0;i<BLOCK_NUM;i++)
	{
		if(MMCWrite(i,&pcfm))
		{	printf("Write failed %d\n",i);
			return 2;
		}
		pcfm.userbuf+=MMC_BLOCK_SIZE;
	}
	printf("Write Finished\n");
	pcfm.userbuf=pbuff;
	
	for(i=0;i<BLOCK_NUM;i++)
	{
		if(MMCRead(i,&pcfm))
		{	
			printf("Read Failed %d\n",i);
			return 3;
		}
		pcfm.userbuf+=MMC_BLOCK_SIZE;
	}
	printf("Read Finished\n");
	srand(9876);
	for(i=0;i<BLOCK_NUM*MMC_BLOCK_SIZE;i++)
	{
		x=rand();
		if(x!=pbuff[i])
		{
			printf("Data Varify failed %d\n Error 0x%X,correct 0x%X\n",i,pbuff[i],x);
			return 4;
		}
	}
	if(i==BLOCK_NUM*MMC_BLOCK_SIZE)
		printf("Data Varify success\n");
		
	printf("Large data single block read\write finised\n");
	
	printf("Test Large Data Multi Block Read\Write\n");
	printf("Wait for 2 mins\n");
	
	pcfm.nsects=BLOCK_NUM;
	pcfm.userbuf=pbuff;
	
	srand(76);
	for(i=0;i<MMC_BLOCK_SIZE*BLOCK_NUM;i++)
	{
		pbuff[i]=rand();
	}
	
	if(MMCWrite(0,&pcfm))
		printf("Write Multi block Error\n");
		
	for(i=0;i<MMC_BLOCK_SIZE*BLOCK_NUM;i++)
		pbuff[i]=0;
		
	if(MMCRead(0,&pcfm))
		printf("Finish Multi Read Error\n");
		
	srand(76);
	for(i=0;i<MMC_BLOCK_SIZE*BLOCK_NUM;i++)	
	{
		x=rand();
		if(pbuff[i]!=x)
		{
			printf("Data Varified failed\n");
			break;
		}
	}
	if(i==MMC_BLOCK_SIZE*BLOCK_NUM)
		printf("Data Varified successed\n");	
		
	printf("Finish Large Data Multi Block Read\Write\n");
	return 0;
}
//MMC General Tesk. Must have enough stack. 
int MMCGeneralTest()
{
	
	DEVICE dev;
	U8 buff1[1024];
	U8 x;
	int i;
	PCFM_BUFFER pcfm;
	pcfm.nsects=1;
	pcfm.userbuf=buff1;
	pcfm.devp=&dev;
	dev.unit_no=MMC_UNIT_NO;
	
	if(MMCInit(&dev))
		printf("Init failed");
	else
		printf("Init Succes\n");

	srand(1234); //set  starting point for generating a series of pseudorandom integers.
	
	for(i=0;i<1024;i++)
		buff1[i]=rand(); //set rand data
		
	printf("Test Sing Read and Write\n"); //test single read and write command
	
	if(MMCWrite(0,&pcfm))
		printf("Write Error\n");
	else
		printf("Write Success\n");
		
	pcfm.userbuf=buff1+512;
	
	if(MMCWrite(1,&pcfm))
		printf("Write Error\n");
	else
		printf("Write Success\n");
		
	for(i=0;i<1024;i++)
		buff1[i]=0;
		
	pcfm.userbuf=buff1;
	pcfm.nsects=1;
	if(MMCRead(0,&pcfm))
		printf("Read Error\n");
	else
		printf("Read Success\n");

	pcfm.userbuf=buff1+512;
	pcfm.nsects=1;
	if(MMCRead(1,&pcfm))
		printf("Read Error\n");
	else
		printf("Read Success\n");


	srand(1234);
	for(i=0;i<1024;i++)
	{	x=rand();
		if(buff1[i]!=x)
		{
			printf("Data varify error %d\n",i);
			break;
		}
	}
	if(i==1024)
		printf("Data varify success\n");

	printf("Test Multi Block Read/Write\n");
	
	srand(5678);
	for(i=0;i<1024;i++)
		buff1[i]=rand();
	
	pcfm.userbuf=buff1;
	pcfm.nsects=2;
	if(MMCWrite(10,&pcfm))
		printf("Write Failed\n");
	else
		printf("Write Success\n");
	
	for(i=0;i<1024;i++)
		buff1[i]=0;
		
	pcfm.userbuf=buff1;	
	pcfm.nsects=2;
	if(MMCRead(10,&pcfm))
		printf("Read Failed\n");
	else
		printf("Read Success\n");
		
	srand(5678);
	for(i=0;i<1024;i++)
	{
		x=rand();
		if(buff1[i]!=x)
		{
			printf("Data varify failed %d\n",i);
			break;
		}
	}
	if(i==1024)
		printf("Data verify success\n");
	
	printf("Finish General test\n");	
	return 0;
}

⌨️ 快捷键说明

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