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

📄 hs1_mmc.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
	else
	{
	StartAddr = StartAddr * 512;
	printf("\nByte Mode Addressing");
	}

	// 1. Make a descriptor table

	GenerateDescriptor_CH1(&WrDscrpt[0], uSrcAddr, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTEn_CH1);
	GenerateLinkerDescriptor_CH1(&WrLinkDscrpt, &WrDscrpt[1]);
	GenerateDescriptor_CH1(&WrDscrpt[1], uSrcAddr1, uDataSize, ADMA_END_CH1, ADMA_INTEn_CH1);
	
	GenerateDescriptor_CH1(&RdDscrpt[0], uDstAddr, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTEn_CH1);
	GenerateDescriptor_CH1(&RdDscrpt[1], uDstAddr1, uDataSize, ADMA_END_CH1, ADMA_INTEn_CH1);

	// 2. Make source data and initialize destination
	
	for ( i=0; i<BlockNum_HSMMC_ch1*128; i++ )
	{
		((U32 *)uSrcAddr)[i] = rand(); // rand();
		((U32 *)uSrcAddr1)[i] = rand(); // rand();
		((U32 *)uDstAddr)[i] = 0;
		((U32 *)uDstAddr1)[i] = 0;
	}

	// 5. Writing ADMA mode

	pISR_SDI_1 = (unsigned)HS_ADMA_INT_CH1;
	
	rINTMSK &= ~(BIT_SDI1);				
	rHM1_NORINTSTSEN = (rHM1_NORINTSTSEN & ~(0xffff)) |
						BUFFER_READREADY_STS_INT_EN_CH1 | 
						DMA_STS_INT_EN_CH1 |
						TRANSFERCOMPLETE_STS_INT_EN_CH1 |
						COMMANDCOMPLETE_STS_INT_EN_CH1;
	rHM1_NORINTSIGEN = (rHM1_NORINTSIGEN & ~(0xffff)) | DMA_SIG_INT_EN_CH1 | TRANSFERCOMPLETE_SIG_INT_EN_CH1;				
	
	SetADMASystemAddressReg_CH1((U32*)&WrDscrpt[0]);
	
	SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size				
	SetBlockCountReg_CH1(BlockNum_HSMMC_ch1*2); // Block Numbers to Write	
	SetArgumentReg_CH1(StartAddr);// Card Start Block Address to Write				
	
	if (uNumOfBlocks == 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_ADMA_END_ch1);
	//while(!HS_DESCRIPTOR_INT_ch1);

	if(!WaitForTransferComplete_CH1())
		{
		printf(("Transfer is NOT Complete\n"));
		}
	ClearTransferCompleteStatus_CH1();
	
	//rHM1_NORINTSTS |= (1<<3);
	printf("\nDMA interrupt cnt = %x",HS_DESCRIPTOR_INT_ch1);
	printf("\nTransfer Done interrupt cnt = %x",HS_ADMA_END_ch1);
	
	printf(("\nDMA Write End\n"));
	printf("Press Any key for Data compare\n");

	HS_ADMA_END_ch1=0;
	HS_DESCRIPTOR_INT_ch1=0;	

	Uart_getc();
	/*
	DataRead_ForCompare_CH1(StartAddr);	
	DataCompare_HSMMC_CH1(uSrcAddr, uDstAddr, BlockNum_HSMMC_ch1 * 128);
	*/	
	pISR_SDI_1=(unsigned)HS_ADMA_INT_CH1;
	rINTMSK &= ~(BIT_SDI1);
	rHM1_NORINTSTSEN = (rHM1_NORINTSTSEN & ~(0xffff)) |
						BUFFER_READREADY_STS_INT_EN_CH1 | 
						DMA_STS_INT_EN_CH1 |
						TRANSFERCOMPLETE_STS_INT_EN_CH1 |
						COMMANDCOMPLETE_STS_INT_EN_CH1;
	rHM1_NORINTSIGEN = (rHM1_NORINTSIGEN & ~(0xffff)) | DMA_SIG_INT_EN_CH1 | TRANSFERCOMPLETE_SIG_INT_EN_CH1;
	
	//SetSystemAddressReg_CH1(SDI_Rx_buffer_HSMMC_CH1);// AHB System Address For Write

	SetADMASystemAddressReg_CH1((U32*)&RdDscrpt[0]);
	SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size				
	SetBlockCountReg_CH1(BlockNum_HSMMC_ch1*2); // Block Numbers to Write	
	SetArgumentReg_CH1(StartAddr);// Card Start Block Address to Write

	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_ADMA_END_ch1);
	//while(!HS_DESCRIPTOR_INT_ch1);	

	printf(("\nDMA Read End\n"));

	printf("\nDMA interrupt cnt = %x",HS_DESCRIPTOR_INT_ch1);
	printf("\nTransfer Done interrupt cnt = %x",HS_ADMA_END_ch1);

	DataCompare_HSMMC_CH1(uSrcAddr, uDstAddr, (BlockNum_HSMMC_ch1 * 128));
	DataCompare_HSMMC_CH1(uSrcAddr1,uDstAddr1, (BlockNum_HSMMC_ch1 * 128));

	HS_ADMA_END_ch1=0;
	HS_DESCRIPTOR_INT_ch1=0;	
	BlockNum_HSMMC_ch1=0;
	
}

void HS_MMC_ADMA_WriteTest_CH1(void)
{

	U32 uSrcAddr;
	U32 uDataSize;
	U32 uNumOfBlocks;
	U32 uSrcAddr1, uSrcAddr2, uSrcAddr3;
	U32 StartAddr;
	U32 i,j;

	U32 uTxBufAddr = SDI_Tx_buffer_HSMMC_CH1;
	U32 uCompareBufAddr = SDI_Compare_buffer_HSMMC_CH1;

	ADMA_DESC_CH1 WrDscrpt[4];

	printf("\nInput Write Start block number : ");
	StartAddr = GetIntNum();
	
	printf("Input number of Block [1~65535] : ");
	BlockNum_HSMMC_ch1 = GetIntNum();

	uDataSize = BlockNum_HSMMC_ch1*512;

	uSrcAddr = SDI_Tx_buffer_HSMMC_CH1;
	uSrcAddr1 = uSrcAddr + uDataSize;
	uSrcAddr2 = uSrcAddr1 + uDataSize;
	uSrcAddr3 = uSrcAddr2 + uDataSize;

	printf("\nSrcAddr = 0x%x",uSrcAddr);
	printf("\nSrcAddr1 = 0x%x",uSrcAddr1);
	printf("\nSrcAddr2 = 0x%x",uSrcAddr2);
	printf("\nSrcAddr3 = 0x%x",uSrcAddr3);

	printf("\n&WrDscrpt[0] = 0x%x",&WrDscrpt[0]);
	printf("\n&WrDscrpt[1] = 0x%x",&WrDscrpt[1]);
	printf("\n&WrDscrpt[2] = 0x%x",&WrDscrpt[2]);
	printf("\n&WrDscrpt[3] = 0x%x",&WrDscrpt[3]);
	
	if(SectorMode_ch1 == 1)
	{
	StartAddr = StartAddr;
	printf("\nSector Mode Addressing");
	}
	else
	{
	StartAddr = StartAddr * 512;
	printf("\nByte Mode Addressing");
	}

	// 1. Make a descriptor table

	GenerateDescriptor_CH1(&WrDscrpt[0], uSrcAddr, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTDis_CH1);
	GenerateDescriptor_CH1(&WrDscrpt[1], uSrcAddr1, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTDis_CH1);
	GenerateDescriptor_CH1(&WrDscrpt[2], uSrcAddr2, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTDis_CH1);
	GenerateDescriptor_CH1(&WrDscrpt[3], uSrcAddr3, uDataSize, ADMA_END_CH1, ADMA_INTEn_CH1);
	
	// 2. Make source data and initialize destination
	
	for ( i=0; i<BlockNum_HSMMC_ch1*128; i++ )
	{
		((U32 *)uSrcAddr)[i] = rand();
		((U32 *)uSrcAddr1)[i] =rand();
		((U32 *)uSrcAddr2)[i] =rand();
		((U32 *)uSrcAddr3)[i] =rand();
	}

	// 5. Writing ADMA mode

	pISR_SDI_1 = (unsigned)HS_ADMA_INT_CH1;
	
	rINTMSK &= ~(BIT_SDI1);				
	rHM1_NORINTSTSEN = (rHM1_NORINTSTSEN & ~(0xffff)) |
						DMA_STS_INT_EN_CH1 |
						TRANSFERCOMPLETE_STS_INT_EN_CH1 |
						COMMANDCOMPLETE_STS_INT_EN_CH1;
	rHM1_NORINTSIGEN = (rHM1_NORINTSIGEN & ~(0xffff)) | DMA_SIG_INT_EN_CH1 | TRANSFERCOMPLETE_SIG_INT_EN_CH1;
	
	SetADMASystemAddressReg_CH1((U32*)&WrDscrpt[0]);
	
	SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size				
	SetBlockCountReg_CH1(BlockNum_HSMMC_ch1*4); // Block Numbers to Write	
	SetArgumentReg_CH1(StartAddr);// Card Start Block Address to Write				
	
	if (uNumOfBlocks == 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_ADMA_END_ch1);
	//while(!HS_DESCRIPTOR_INT_ch1);

	if(!WaitForTransferComplete_CH1())
		{
		printf(("Transfer is NOT Complete\n"));
		}
	ClearTransferCompleteStatus_CH1();
	
	//rHM1_NORINTSTS |= (1<<3);

	printf("\nDMA interrupt cnt = %x",HS_DESCRIPTOR_INT_ch1);
	printf("\nTransfer Done interrupt cnt = %x",HS_ADMA_END_ch1);
	printf(("\nDMA Write End\n"));

	printf("\nPress Any key for Data compare\n");
	Uart_getc();
	
	DataRead_ForCompare_ADMA_CH1(StartAddr);	
	DataCompare_HSMMC_CH1(uTxBufAddr, uCompareBufAddr, (BlockNum_HSMMC_ch1 * 128)*4);
	
	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;
	HS_ADMA_END_ch1=0;
	HS_DESCRIPTOR_INT_ch1=0;	
	
}


void HS_MMC_ADMA_ReadTest_CH1(void)
{

	U32 uSrcAddr;
	U32 uDataSize;
	U32 uNumOfBlocks;
	U32 uSrcAddr1;
	U32 uDstAddr;
	U32 uDstAddr1,uDstAddr2,uDstAddr3;
	U32 StartAddr;
	U32 i,j,Addr_temp=0;

	U32 uTxBufAddr = SDI_Tx_buffer_HSMMC_CH1;
	U32 uCompareBufAddr = SDI_Compare_buffer_HSMMC_CH1;

	ADMA_DESC_CH1 RdDscrpt[4];

	printf("\nInput Read Start block number : ");
	StartAddr = GetIntNum();
	
	printf("Input number of Block [1~65535] : ");
	BlockNum_HSMMC_ch1 = GetIntNum();

	uDataSize = BlockNum_HSMMC_ch1*512;

	uDstAddr = SDI_Rx_buffer_HSMMC_CH1;
	uDstAddr1 = uDstAddr + uDataSize;
	uDstAddr2 = uDstAddr1 + uDataSize;
	uDstAddr3 = uDstAddr2 + uDataSize;
/*
	printf("\uDstAddr = 0x%x",uDstAddr);
	printf("\uDstAddr1 = 0x%x",uDstAddr1);
	printf("\uDstAddr2 = 0x%x",uDstAddr2);
	printf("\uDstAddr3 = 0x%x",uDstAddr3);
*/	
	if(SectorMode_ch1 == 1)
	{
	StartAddr = StartAddr;
	printf("\nSector Mode Addressing");
	}
	else
	{
	StartAddr = StartAddr * 512;
	printf("\nByte Mode Addressing");
	}

	// 1. Make a descriptor table

	GenerateDescriptor_CH1(&RdDscrpt[0], uDstAddr, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTDis_CH1);
	GenerateDescriptor_CH1(&RdDscrpt[1], uDstAddr1, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTEn_CH1);
	GenerateDescriptor_CH1(&RdDscrpt[2], uDstAddr2, uDataSize, ADMA_CONTINUE_CH1, ADMA_INTDis_CH1);
	GenerateDescriptor_CH1(&RdDscrpt[3], uDstAddr3, uDataSize, ADMA_END_CH1, ADMA_INTEn_CH1);

	// 2. Make source data and initialize destination
	
	for ( i=0; i<BlockNum_HSMMC_ch1*128; i++ )
	{
		((U32 *)uDstAddr)[i] = 0;
		((U32 *)uDstAddr1)[i] = 0;
		((U32 *)uDstAddr2)[i] = 0;
		((U32 *)uDstAddr3)[i] = 0;
	}

	/*
	DataRead_ForCompare_CH1(StartAddr);	
	DataCompare_HSMMC_CH1(uSrcAddr, uDstAddr, BlockNum_HSMMC_ch1 * 128);
	*/	
	#if 0
	pISR_SDI_1=(unsigned)HS_ADMA_INT_CH1;
	rINTMSK &= ~(BIT_SDI1);
	rHM1_NORINTSTSEN = (rHM1_NORINTSTSEN & ~(0xffff)) |
						BUFFER_READREADY_STS_INT_EN_CH1 | 
						DMA_STS_INT_EN_CH1 |
						TRANSFERCOMPLETE_STS_INT_EN_CH1 |
						COMMANDCOMPLETE_STS_INT_EN_CH1;
	rHM1_NORINTSIGEN = (rHM1_NORINTSIGEN & ~(0xffff)) | DMA_SIG_INT_EN_CH1 | TRANSFERCOMPLETE_SIG_INT_EN_CH1;
	#else
	pISR_SDI_1=(unsigned)HS_ADMA_INT_CH1;
	rINTMSK &= ~(BIT_SDI1);				
	rHM1_NORINTSTSEN = (rHM1_NORINTSTSEN & ~(0xffff)) |
						DMA_STS_INT_EN_CH1 |
						TRANSFERCOMPLETE_STS_INT_EN_CH1 |
						COMMANDCOMPLETE_STS_INT_EN_CH1;
	rHM1_NORINTSIGEN = (rHM1_NORINTSIGEN & ~(0xffff)) | DMA_SIG_INT_EN_CH1 | TRANSFERCOMPLETE_SIG_INT_EN_CH1;
	#endif
	//SetSystemAddressReg_CH1(SDI_Rx_buffer_HSMMC_CH1);// AHB System Address For Write

	SetADMASystemAddressReg_CH1((U32*)&RdDscrpt[0]);
	SetBlockSizeReg_CH1(7, 512); // Maximum DMA Buffer Size, Block Size				
	SetBlockCountReg_CH1(BlockNum_HSMMC_ch1*4); // Block Numbers to Read	
	SetArgumentReg_CH1(StartAddr);// Card Start Block Address to read

	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_ADMA_END_ch1);
	//while(!HS_DESCRIPTOR_INT_ch1);	

	printf("\nDMA Read interrupt cnt = %x",HS_DESCRIPTOR_INT_ch1);
	printf("\nTransfer Done interrupt cnt = %x",HS_ADMA_END_ch1);

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

	HS_ADMA_END_ch1=0;
	HS_DESCRIPTOR_INT_ch1=0;	
	BlockNum_HSMMC_ch1=0;
	
}



void MoviNand_BootWrite_CH1_Auto(void)
{
	U32 i, j, StartAddr,  OneBlockSize, Offset, Testmode;
	U32 TotalWriteByte, WriteBlockCnt =0;
	U32 transtime=0;

	U32 uTxBufAddr = SDI_Tx_buffer_HSMMC_CH1;
	U32 uCompareBufAddr = SDI_Compare_buffer_HSMMC_CH1;
	
	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");

	printf("\nCard Total block count = %d\n", TotalCardBlock_number_ch1);

       Testmode=0;

	StartAddr = TotalCardBlock_number_ch1-2048-18;

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

	if(SectorMode_ch1 == 1)
		{
		StartAddr = StartAddr;
		printf("\nSector Mode Addressing");
		}
	else
		{
		StartAddr = StartAddr * 512;
		printf("\nByte Mode Addressing");
		}
	
	OneBlockSize = Card_OneBlockSize_ver1;
	
	Tx_buffer_HSMMC_ch1 = (U32 *)SDI_Tx_buffer_HSMMC_CH1;
/*
    	for(i=0 ; i<(OneBlockSize*BlockNum_HSMMC_ch1)/4 ; i++)
    		{
    		*(Tx_buffer_HSMMC_ch1+i) = (i+Offset);   	
   		}				
*/	
	switch(Testmode)
		{
			case  POL_Ver1:
				printf("\nPolling mode data write\n");

				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();

				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 = *Tx_buffer_HSMMC_ch1++;	
				  		 		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();
				
				break;

			case INT_Ver1:

				printf("Interrupt mode data write\n");
				pISR_SDI_1=(unsigned)HS_WRITE_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, 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 i

⌨️ 快捷键说明

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