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

📄 hs1_mmc.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
				
				#endif			

				StartStopwatch();

				if (BlockNum_HSMMC_ch1 == 1)
				{
					SetTransferModeReg_CH1(0, 0, 1, 1, 1);
					SetCommandReg_CH1(24, 0); // CMD24: Single-Write
				}
				else
				{
					SetTransferModeReg_CH1(1, 0, 1, 1, 1);
					SetCommandReg_CH1(25, 0); // CMD25: Multi-Write
				}
				
				if (!WaitForCommandComplete_CH1())
				{
					printf("\nCommand is NOT completed\n");
				}
				ClearCommandCompleteStatus_CH1();		
				
				while(!HS_DMA_END_ch1);

				if(!WaitForTransferComplete_CH1())
					{
					printf(("Transfer is NOT Complete\n"));
					}
				ClearTransferCompleteStatus_CH1();
				
				rHM1_NORINTSTS |= (1<<3);
				
				transtime = EndStopwatch();
				CalculationBPS_HSMMC_CH1(transtime);
				
				printf(("\nDMA Write End\n"));
				
				break;	
				
			default :
				break;					
		}	

	printf("\nPress Any key for Data compare\n");
	Uart_getc();
	DataRead_ForCompare_CH1(StartAddr);
	DataCompare_HSMMC_CH1(uTxBufAddr, uCompareBufAddr, BlockNum_HSMMC_ch1 * 128);
	
	BlockNum_HSMMC_ch1 = 0;
	wt_cnt_HSMMC_ch1 = 0;
	WriteBlockCnt_INT_ch1 = 0;
	HS_DMA_END_ch1 = 0;
	BufferBoundary_INT_Cnt_ch1 = 0;

	CompareCnt_INT_ch1 = 0;
	Compare_buffer_HSMMC_ch1 = 0;
}

unsigned int testNumber = 0;
volatile U32 realStartAddr=0;

void HS_MMC_Write_AgingTest_CH1(void)
{
	U32 i, j, StartAddr;
	U32 TotalWriteByte=0, WriteBlockCnt =0;

	wt_cnt_HSMMC_ch1=0;
	BlockNum_HSMMC_ch1 = 0;
	wt_cnt_HSMMC_ch1 = 0;
	WriteBlockCnt_INT_ch1 = 0;
	HS_DMA_END_ch1 = 0;
	
	printf("\nSD/MMC block write test\n");

	BlockNum_HSMMC_ch1 = 100;
	testNumber =0;
	
	printf("\nPolling mode data write\n");

	for(realStartAddr=0;realStartAddr<BlockNum_HSMMC_ch1*1000;realStartAddr=realStartAddr+BlockNum_HSMMC_ch1 ) 
		{

		StartAddr = realStartAddr * 512;

		printf( "Count : %d/8100 ,,, %x\n", realStartAddr, testNumber );

		SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size
		SetBlockCountReg_CH1(BlockNum_HSMMC_ch1); // Block Numbers to Write
		SetArgumentReg_CH1(StartAddr); // Card Address to Write

		if(BlockNum_HSMMC_ch1 == 1)//single block
			{
				SetTransferModeReg_CH1(0, 0, 1, 1, 0);
				SetCommandReg_CH1(24, 0); 	
			}
		else//multi block
			{
				SetTransferModeReg_CH1(1, 0, 1, 1, 0);
				SetCommandReg_CH1(25, 0); 

			}

		if (!WaitForCommandComplete_CH1())
			{
				printf("\nCommand is NOT completed\n");
			}
		ClearCommandCompleteStatus_CH1();

		if (rHM1_NORINTSTS&0x8000)
			printf("Command = %d, Error Stat = %x\n",(rHM1_CMDREG>>8),rHM1_ERRINTSTS);	

		for(j=0; j<BlockNum_HSMMC_ch1; j++)
			{
				if (!WaitForBufferWriteReady_CH1())
					printf("WriteBuffer NOT Ready\n");
				else
					ClearBufferWriteReadyStatus_CH1();

				for(i=0; i<512/4; i++)//512 byte should be writed.
					{
						rHM1_BDATA = testNumber++;	
		  		 		wt_cnt_HSMMC_ch1++;						
					}
				WriteBlockCnt ++;
			}

		TotalWriteByte = wt_cnt_HSMMC_ch1 *4;
		printf("\nWrite count=%dByte\n",TotalWriteByte);
		if(!WaitForTransferComplete_CH1())
			{
			printf(("Transfer is NOT Complete\n"));
			}
		ClearTransferCompleteStatus_CH1();

		while (!IsCardInProgrammingState_CH1());

		}

}

void HS_MMC_ReadTest_CH1(void)
{
	U32 i, j, StartAddr,  OneBlockSize, Offset, Testmode, Addr_temp;
	U32 TotalReadByte, WriteBlockCnt=0;
	U32 status;
	U32 transtime;
	
	rd_cnt_HSMMC_ch1=0;	
	HS_DMA_END_ch1 = 0;	
	BlockNum_HSMMC_ch1 = 0;
	rd_cnt_HSMMC_ch1 = 0;
	ReadBlockCnt_INT_ch1 = 0;	

	printf("\nSD/MMC block Read test\n");

	printf("\n0:Polling Read   1:Interrupt Read   2:DMA Read");
	printf("\nSelect the test mode : ");
    
       Testmode=GetIntNum();
    	
	printf("\nInput Write Start block number : ");
	StartAddr = GetIntNum();
	Addr_temp = StartAddr;	

	while((BlockNum_HSMMC_ch1 == 0) || (BlockNum_HSMMC_ch1 > 65535))
	{
		printf("Input number of block[1~4095] : ");
		BlockNum_HSMMC_ch1 = GetIntNum();
	}

	if(SectorMode_ch1 == 1)
		StartAddr = StartAddr;
	else
		StartAddr = StartAddr * 512;
	
	OneBlockSize = Card_OneBlockSize_ver1;

	Rx_buffer_HSMMC_ch1 = (U32 *)SDI_Rx_buffer_HSMMC_CH1;
    	for(i=0 ; i<(OneBlockSize*BlockNum_HSMMC_ch1)/4 ; i++)	
		*(Rx_buffer_HSMMC_ch1+i) = 0x0;   	

	switch(Testmode)
		{
			case  POL_Ver1:
				printf("\nPolling mode data read\n");

				while (!IsCardInProgrammingState_CH1());

				SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size
				SetBlockCountReg_CH1(BlockNum_HSMMC_ch1); // Block Numbers to Write
				SetArgumentReg_CH1(StartAddr); // Card Address to Write

				if(BlockNum_HSMMC_ch1 == 1)//single block
					{
						printf("Single block read\n");
						SetTransferModeReg_CH1(0, 1, 0, 1, 0);
						SetCommandReg_CH1(17, 0); // CMD17: Single-Read						
					}
				else//multi block
					{
						printf("Multi block read\n");
						SetTransferModeReg_CH1(1, 1, 1, 1, 0);
						SetCommandReg_CH1(18, 0); // CMD18: Multi-Read
					}

				while (!WaitForCommandComplete_CH1());
				ClearCommandCompleteStatus_CH1();
				
				for(j=0; j<BlockNum_HSMMC_ch1; j++)
					{
						if (!WaitForBufferReadReady_CH1())
							printf("ReadBuffer NOT Ready\n");
						else
							ClearBufferReadReadyStatus_CH1();
						for(i=0; i<512/4; i++)
						{
							*Rx_buffer_HSMMC_ch1++ = rHM1_BDATA;
							rd_cnt_HSMMC_ch1++;
						}
						WriteBlockCnt ++;
						printf("\nWrite block count = %d", WriteBlockCnt);
					}

				TotalReadByte = wt_cnt_HSMMC_ch1 *4;
				printf("\nWrite count=%dByte\n",TotalReadByte);
				
				printf("\nWrite count=%x\n",rd_cnt_HSMMC_ch1);
				if(!WaitForTransferComplete_CH1())
					{
					printf(("Transfer NOT Complete\n"));
					}
				ClearTransferCompleteStatus_CH1();

				break;

			case INT_Ver1:	
				
				printf("\Interrupt mode data Read\n");
				pISR_SDI_1=(unsigned)HS_READ_INT_CH1;
				
				SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size
				SetBlockCountReg_CH1(BlockNum_HSMMC_ch1); // Block Numbers to Write
				SetArgumentReg_CH1(StartAddr); // Card Address to Write

				StartStopwatch();

				if(BlockNum_HSMMC_ch1 == 1)//single block
					{
						SetTransferModeReg_CH1(0, 1, 0, 1, 0);
						SetCommandReg_CH1(17, 0); // CMD17: Single-Read	
					}
				else//multi block
					{
						SetTransferModeReg_CH1(1, 1, 1, 1, 0);
						SetCommandReg_CH1(18, 0); // CMD18: Multi-Read						
					}
				
				if (!WaitForCommandComplete_CH1());
				ClearCommandCompleteStatus_CH1();

				rINTMSK &= ~(BIT_SDI1);
				rHM1_NORINTSIGEN = rHM1_NORINTSIGEN & ~(0xffff) | BUFFER_READREADY_SIG_INT_EN_CH1;	
				
				while(!READINT_DONE_ch1);
				
				if(!WaitForTransferComplete_CH1())
					{
					printf(("Transfer NOT Complete\n"));
					}
				ClearTransferCompleteStatus_CH1();

				transtime = EndStopwatch();
				CalculationBPS_HSMMC_CH1(transtime);

				printf("\nInterupt mode Read End\n");
				
	    			break;
					
			case DMA_Ver1:

				pISR_SDI_1=(unsigned)HS_DMA_INT_CH1;
				rINTMSK &= ~(BIT_SDI1);
				rHM1_NORINTSTSEN &= ~(DMA_STS_INT_EN_CH1|BLOCKGAP_EVENT_STS_INT_EN_CH1);
				rHM1_NORINTSIGEN = rHM1_NORINTSIGEN & ~(0xffff) | TRANSFERCOMPLETE_SIG_INT_EN_CH1;
				
				SetSystemAddressReg_CH1(SDI_Rx_buffer_HSMMC_CH1);// AHB System Address For Write
				SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size				
				SetBlockCountReg_CH1(BlockNum_HSMMC_ch1); // Block Numbers to Write	
				SetArgumentReg_CH1(StartAddr);// Card Start Block Address to Write

				StartStopwatch();

				if (BlockNum_HSMMC_ch1 == 1)
				{
					SetTransferModeReg_CH1(0, 1, 0, 1, 1);
					SetCommandReg_CH1(17, 0); // CMD17: Single-Read
				}
				else
				{
					SetTransferModeReg_CH1(1, 1, 1, 1, 1);
					SetCommandReg_CH1(18, 0); // CMD18: Multi-Read
				}

				if (!WaitForCommandComplete_CH1())
				{
					printf(("Command NOT Complete\n"));
				}
				else
					ClearCommandCompleteStatus_CH1();		
					
				while(!HS_DMA_END_ch1);	

				transtime = EndStopwatch();
				CalculationBPS_HSMMC_CH1(transtime);
				
				printf(("\nDMA Read End\n"));
				
				break;	

			default : break;			
				
		}

	Rx_buffer_HSMMC_ch1 = (U32 *)SDI_Rx_buffer_HSMMC_CH1;
	for(j=0 ; j<(OneBlockSize*BlockNum_HSMMC_ch1)/4 ; j++)
	   	{
		      	if(j%4 == 0)
		   		printf("\n0x%04xh : ",Addr_temp);
		       	printf("0x%08x ",*Rx_buffer_HSMMC_ch1++);
		       	Addr_temp += 4;
		}

	printf("\n");    

	HS_DMA_END_ch1 = 0;	
	BlockNum_HSMMC_ch1 = 0;
	rd_cnt_HSMMC_ch1 = 0;
	ReadBlockCnt_INT_ch1 = 0;
}

void HS_MMC_EraseBlock_CH1(void)
{
	U32 StartAddr, EndAddr;	
	U16 EraseBlockStartNum, EraseBlockEndNum;
	
	printf("\nHigh speed MMC block erase test\n");

	printf("\nInput Erase Start Block Number(ex 0, 1, 2 ...) : ");
	EraseBlockStartNum = GetIntNum();

	printf("Input Erase End Block Number(ex 0, 1, 2 ...) : ");
	EraseBlockEndNum = GetIntNum();
	
	if(ThisIsMmc_ch1 == 0)
		{
		SetArgumentReg_CH1(EraseBlockStartNum*512); 
		SetCommandReg_CH1(32, 0); 	

		while (!WaitForCommandComplete_CH1());
		ClearCommandCompleteStatus_CH1();
		
		SetArgumentReg_CH1(EraseBlockEndNum*512); 
		SetCommandReg_CH1(33, 0); 	

		while (!WaitForCommandComplete_CH1());
		ClearCommandCompleteStatus_CH1();
		}
	else if(ThisIsMmc_ch1 == 1)
		{
		SetArgumentReg_CH1(EraseBlockStartNum*512); 
		SetCommandReg_CH1(35, 0); 

		while (!WaitForCommandComplete_CH1());
		ClearCommandCompleteStatus_CH1();
		
		SetArgumentReg_CH1(EraseBlockEndNum*512);
		SetCommandReg_CH1(36, 0); 

		while (!WaitForCommandComplete_CH1());
		ClearCommandCompleteStatus_CH1();
		}

	SetArgumentReg_CH1(0); 
	SetCommandReg_CH1(38, 0);

	printf("\n[SD/TFlash card Erase Block Test...End]\n");
	

}

void HS_MMC_CardDetect_CH1(void)
{
	//rGPJCON = (rGPJCON & ~(0x3<<28)) | (1<<29); 
	rHM1_CONTROL2 |= (1<<13)|(1<<12);//Card Detect using a DAT[3] signal

	rHM1_NORINTSTSEN |= (1<<7)|(1<<6); 
	rHM1_NORINTSIGEN |= (1<<7)|(1<<6) ;

	if(rHM1_PRNSTS & (1<<16))
		{
		HS_CARD_DETECT_ch1 = 1;
		printf("\nCard is Inserted\n");
		}

	while(!HS_CARD_DETECT_ch1)
		{
			printf("\nInsert a Card\n");
			HS_CARD_DETECT_ch1=0;			
			HS_MMC_Irq_CH1();
		    	do {			
			printf(".");
			Delay(5000);
			} while(HS_CARD_DETECT_ch1==0);
		}	
	
	HS_CARD_DETECT_ch1 = 0;
	rHM1_CONTROL2 &= ~(1<<13);
}


int SetDataTransferWidth_CH1(void)
{
	U8  ucSfr=0;
	U8 uBitMode=0;
	U32 uArg=0;
	U8 m_ucHostCtrlReg = 0;
	U32 BD_BUS_WIDTH, ucBusWidth;

	printf("\nSelect the bus width 8-bit, 4-bit, 1-bit\n");
	printf("\nType a bus width:  ");
	BD_BUS_WIDTH = GetIntNum();

	switch (BD_BUS_WIDTH)
	{
		case 8:
			ucBusWidth = ThisIsMmc_ch1 ? 8 : 4;
			break;
		case 4:
			ucBusWidth = 4;
			break;
		case 1:
			ucBusWidth = 1;
			break;
		default :
			ucBusWidth = 4;
			break;
	}

	SetSdhcCardIntEnable_CH1(0); // Disable sd card interrupt

	if(!ThisIsMmc_ch1)// <------------------------- SD Card Case
	{
		if (!IssueCommand_CH1(55, m_uRca_ch1, 0))
			return 0;
		else
		{
			if (ucBusWidth==1)
			{
				uBitMode = 0;
				if (!IssueCommand_CH1(6, 0, 1)) // 1-bits
					return 0;
			}
			else
			{
				uBitMode = 1;
				if (!IssueCommand_CH1(6, 2, 1)) // 4-bits
					return 0;
			}
		}
	}
	else // <-------------------------------- MMC Card Case
	{
		if (m_ucMMCSpecVer_ch1==4) // It is for a newest MMC Card
		{
			if (ucBusWidth==1)
				uBitMode = 0;
			else if (ucBusWidth==4)
				uBitMode = 1;//4            		// 4-bit bus
			else
				uBitMode = 2;//8-bit bus
			
			uArg=((3<<24)|(183<<16)|(uBitMode<<8));
			while(!IssueCommand_CH1(6, uArg, 0));
		}
		else
			uBitMode = 0;
	}
	
	if (uBitMode==2)
	{
		m_ucHostCtrlReg &= 0xdf;
		m_ucHostCtrlReg |= 1<<5;
	}
	else
	{
		m_ucHostCtrlReg &= 0xfd;
		m_ucHostCtrlReg |= uBitMode<<1;
	}
	
	rHM1_HOSTCTL = m_ucHostCtrlReg;
	SetSdhcCardIntEnable_CH1(1);

	return 1;
}

void SetSdhcCardIntEnable_CH1(U8 ucTemp)
{
    	rHM1_NORINTSTSEN &= 0xFEFF;
	rHM1_NORINTSTSEN |= (ucTemp<<8);
}

int SetSDOCR_CH1(void)
{
	U32 i, OCR;
	
	for(i=0; i<250; i++)
	{
	#if 1
		IssueCommand_CH1(55, 0x0000, 0); // CMD55 (For ACMD)
		IssueCommand_CH1(41, 0x40ff8000, 1); // (Ocr:2.7V~3.6V)
	#else
		IssueCommand_CH1(55, 0x0, 0); // CMD55 (For ACMD)
		IssueCommand_CH1(41, 0x0, 1); // (Ocr:2.7V~3.6V)
		OCR = rHM_RSPREG0 | (1<<30);
		//printf("\nrHM_RSPREG0=%x",rHM_RSPREG0);

		//Delay(1000);

		IssueCommand_CH1(55, 0x0, 0); // CMD55 (For ACMD)
		IssueCommand_CH1(41, OCR, 1); // (Ocr:2.7V~3.6V)
	#endif

⌨️ 快捷键说明

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