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

📄 sdi.c

📁 三星2413芯片的测试代码,对进行驱动开发很有帮助.
💻 C
📖 第 1 页 / 共 4 页
字号:
		StartAddr = (StartAddr * 32 + 17)%4000;
		EndAddr = StartAddr + 1;

		// read and compare.-------------------------------------------------------------
		OneBlockSize = Card_OneBlockSize;

		Rx_buffer = (U32 *)SDI_Rx_buffer;
	    	for(i=0 ; i<(OneBlockSize*BlockNum)/4 ; i++)
			*(Rx_buffer+i) = 0x0;

		//rSDIDSTA |= (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2);
		rSDIDSTA = CRC_STAT_FAIL|RECEIVE_CRC_FAIL|DATA_TOUT|DATA_FINISH|BUSY_FINISH;
		rSDIDCON = 0;

		rSDIFSTA |= (1<<16);	//FIFO reset

		if(Wide==0)
			rSDIDCON &= ~WIDE_BUS_EN;
		else
			rSDIDCON |= WIDE_BUS_EN;	

		rSDIDCON |=WORD_TRANSFER|RCV_AFTER_CMD|BLOCK_TRANSFER|BlockNum;
		rSDIDCON |= DATA_RECEIVE_MODE|DATA_TRANSMIT_START;
		rSDIDCON |=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN;

		pISR_DMA0=(unsigned)DMA_end;
		rINTMSK&=~(BIT_DMA0);
		//rINTSUBMSK&=~(BIT_SUB_DMA0);

		rDISRC0 = (U32)(SDIDAT);
	    	rDISRCC0 = (1<<1) | (1<<0);
		rDIDST0 = (int)(Rx_buffer);
		rDIDSTC0 = (0<<1)|(0<<0);
		rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
		rDMASKTRIG0 = (0<<2)|(1<<1)|0;    //no-stop, DMA0 channel on, no-sw trigger
		rDMAREQSEL0 = (10 <<1) | 1;

		do {// StartAddr * 512
			SDIO_Command(StartAddr<<9, READ_SINGLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
		} while(Check_CMDend(READ_SINGLE_BLOCK_CMD, 1) != 1);

		rSDICSTA = DATA_TIMEOUT|CMD_END|RESP_END;	// Clear cmd_end(with rsp)

		while(!TR_end);

		rINTMSK |= (BIT_DMA0);
		//rINTSUBMSK |= (BIT_SUB_DMA0);
		TR_end=0;
		rDMASKTRIG0=(1<<2);	//DMA0 stop
		
		if(!Check_DATend()) 
			printf("\nData End Error....\n");

		sourceAddr = (unsigned int *)SDI_Tx_buffer;
		Rx_buffer = (U32 *)SDI_Rx_buffer;
/*		for(j=0 ; j<(OneBlockSize*BlockNum)/4 ; j=j+4)
	   	{
			if ( *Rx_buffer != *sourceAddr ) {
				printf ("data error : %x, source : %x \n" , *Rx_buffer, *sourceAddr);
			}
			Rx_buffer++;
			sourceAddr++;
		}
*/
	}
	
	printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
	printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
}

void rwBigSigeIOTestRnd(void) {
	unsigned int time;
	int i,j,k,Offset=0;
	int StartAddr=0;
	int EndAddr=0;	// temp start address is zero.
	int OneBlockSize;
	unsigned int * sourceAddr;
	time = 0;
	BlockNum = 1;

	// 8(block count) * 256(k count) * 512(one block size) = 1Mb
	for (k=0;k<2999999;k++) {		// 100 MB
		StartAddr = (StartAddr * 32 + 17)%4000;
		EndAddr = StartAddr + 1;

	//	StartAddr = k*BlockNum;
		TR_end = 0;
		Tx_buffer = (U32 *)SDI_Tx_buffer;
	    	for(i=0 ; i<(Card_OneBlockSize/4*BlockNum) ; i++)
			*(Tx_buffer+i) = (i+Offset);

		rSDIFSTA |=(1<<16); //FIFO reset
		rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
		rSDIDCON|=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN|BlockNum;
		rSDIDCON|= DATA_TRANSMIT_MODE|DATA_TRANSMIT_START;
		if(Wide!=0)
			rSDIDCON |= WIDE_BUS_EN;
		else
			rSDIDCON &= ~WIDE_BUS_EN;

		pISR_DMA0=(unsigned)DMA_end;
		rINTMSK&=~(BIT_DMA0);
		//rINTSUBMSK&=~(BIT_SUB_DMA0);  

	    	rDISRC0 = (int)(Tx_buffer);	
	    	rDISRCC0 = (0<<1) | (0<<0);	
		rDIDST0 = (U32)(SDIDAT);	
		rDIDSTC0 = (1<<1)|(1<<0);	
		rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
		rDMASKTRIG0 = (0<<2)|(1<<1)|0;    //no-stop, DMA0 channel on, no-sw trigger
		rDMAREQSEL0 = (10 <<1) | 1;
		Timer_Start(3);
		if(BlockNum<2)//single block
		{
			do {	// StartAddr * 512
				SDIO_Command(StartAddr<<9, WRITE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
			} while((Check_CMDend(WRITE_BLOCK_CMD, 1) !=1)); 
		}
		else//multi block
		{
			do {
				SDIO_Command(StartAddr<<9, WRITE_MULTIPLE_BLOCK, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
			} while((Check_CMDend(WRITE_MULTIPLE_BLOCK, 1) !=1));
		}

		while(!TR_end);

		rINTMSK |= (1<<20);
		rINTSUBMSK |= (1<<27);
		TR_end=0;
		rDMASKTRIG0 |=(1<<2);//DMA Stop
		
		while(!Check_DATend2());
			//printf("\nData End Error\n");
		rSDIDCON=rSDIDCON&~(7<<12);		//YH 040220, Clear Data Transfer mode => no operation, Cleata Data Transfer start
		rSDIDSTA |= DATA_FINISH;	// Clear data Tx/Rx end

		if(BlockNum>1)
		{
			rSDIDCON=BUSY_AFTER_CMD|BLOCK_TRANSFER|WIDE_BUS_DIS|DATA_TRANSMIT_START|ONLYBUSY_CHECK|(BlockNum<<0); 	
			do {
				SDIO_Command(0, STOP_TRANSMISSION_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
			} while(Check_CMDend(12, 1) != 1)	;

			rSDICSTA = CMD_END|RESP_END;	// Clear cmd_end(with rsp)

			if(!Check_BUSYend()) 
				printf("error\n");

			rSDIDSTA|= DATA_FINISH;	//! Should be cleared by writing '1'.
		}
		time=time+Timer_Stop();

		Delay(200000);

		// read and compare.-------------------------------------------------------------
		OneBlockSize = Card_OneBlockSize;

		Rx_buffer = (U32 *)SDI_Rx_buffer;
	    	for(i=0 ; i<(OneBlockSize*BlockNum)/4 ; i++)
			*(Rx_buffer+i) = 0x0;

		//rSDIDSTA |= (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2);
		rSDIDSTA = CRC_STAT_FAIL|RECEIVE_CRC_FAIL|DATA_TOUT|DATA_FINISH|BUSY_FINISH;
		rSDIDCON = 0;

		rSDIFSTA |= (1<<16);	//FIFO reset

		if(Wide==0)
			rSDIDCON &= ~WIDE_BUS_EN;
		else
			rSDIDCON |= WIDE_BUS_EN;

		rSDIDCON |=WORD_TRANSFER|RCV_AFTER_CMD|BLOCK_TRANSFER|BlockNum;
		rSDIDCON |= DATA_RECEIVE_MODE|DATA_TRANSMIT_START;
		rSDIDCON |=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN;

		pISR_DMA0=(unsigned)DMA_end;
		rINTMSK&=~(BIT_DMA0);
		//rINTSUBMSK&=~(BIT_SUB_DMA0);

		rDISRC0 = (U32)(SDIDAT);
	    	rDISRCC0 = (1<<1) | (1<<0);
		rDIDST0 = (int)(Rx_buffer);
		rDIDSTC0 = (0<<1)|(0<<0);
		rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
		rDMASKTRIG0 = (0<<2)|(1<<1)|0;    //no-stop, DMA0 channel on, no-sw trigger
		rDMAREQSEL0 = (10 <<1) | 1;

		do {// StartAddr * 512
			SDIO_Command(StartAddr<<9, READ_SINGLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
		} while(Check_CMDend(READ_SINGLE_BLOCK_CMD, 1) != 1);

		rSDICSTA = DATA_TIMEOUT|CMD_END|RESP_END;	// Clear cmd_end(with rsp)

		while(!TR_end);

		rINTMSK |= (BIT_DMA0);
		//rINTSUBMSK |= (BIT_SUB_DMA0);
		TR_end=0;
		rDMASKTRIG0=(1<<2);	//DMA0 stop
		
		if(!Check_DATend()) 
			printf("\nData End Error....\n");

		sourceAddr = (unsigned int *)SDI_Tx_buffer;
		Rx_buffer = (U32 *)SDI_Rx_buffer;
		for(j=0 ; j<(OneBlockSize*BlockNum)/4 ; j=j+4)
	   	{
			if ( *Rx_buffer != *sourceAddr ) {
				printf ("data error : %x, source : %x \n" , *Rx_buffer, *sourceAddr);
			}
			Rx_buffer++;
			sourceAddr++;
		}
	}
	
	printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
	printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
}

void writeBigSizeIOTest(void) {
	unsigned int time;
	int i,k,Offset=0;
	int StartAddr=0,EndAddr=0;	// temp start address is zero.
	time = 0;
	BlockNum = 4095;
	
	// 8(block count) * 256(k count) * 512(one block size) = 1Mb
	for (k=0;k<2;k++) {

		StartAddr = k*BlockNum;
		TR_end = 0;
		Tx_buffer = (U32 *)SDI_Tx_buffer;
	    	for(i=0 ; i<(Card_OneBlockSize/4*BlockNum) ; i++)
			*(Tx_buffer+i) = (i+Offset);

		rSDIFSTA |=(1<<16); //FIFO reset
		rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
		rSDIDCON|=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN|BlockNum;
		rSDIDCON|= DATA_TRANSMIT_MODE|DATA_TRANSMIT_START;
		if(Wide!=0)
			rSDIDCON |= WIDE_BUS_EN;
		else
			rSDIDCON &= ~WIDE_BUS_EN;

		pISR_DMA0=(unsigned)DMA_end;
		rINTMSK&=~(BIT_DMA0);
		//rINTSUBMSK&=~(BIT_SUB_DMA0);  

	    	rDISRC0 = (int)(Tx_buffer);	
	    	rDISRCC0 = (0<<1) | (0<<0);	
		rDIDST0 = (U32)(SDIDAT);	
		rDIDSTC0 = (1<<1)|(1<<0);	
		rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
		rDMASKTRIG0 = (0<<2)|(1<<1)|0;    //no-stop, DMA0 channel on, no-sw trigger
		rDMAREQSEL0 = (10 <<1) | 1;
		Timer_Start(3);
		if(BlockNum<2)//single block
		{
			do {	// StartAddr * 512
				SDIO_Command(StartAddr<<9, WRITE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
			} while((Check_CMDend(WRITE_BLOCK_CMD, 1) !=1)); 
		}
		else//multi block
		{
			do {
				SDIO_Command(StartAddr<<9, WRITE_MULTIPLE_BLOCK, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
			} while((Check_CMDend(WRITE_MULTIPLE_BLOCK, 1) !=1));
		}

		while(!TR_end);

		rINTMSK |= (1<<20);
		rINTSUBMSK |= (1<<27);
		TR_end=0;
		rDMASKTRIG0 |=(1<<2);//DMA Stop
		
		while(!Check_DATend()) ;
			//printf("\nData End Error\n");
		rSDIDCON=rSDIDCON&~(7<<12);		//YH 040220, Clear Data Transfer mode => no operation, Cleata Data Transfer start
		rSDIDSTA |= DATA_FINISH;	// Clear data Tx/Rx end

		if(BlockNum>1)
		{
			rSDIDCON=BUSY_AFTER_CMD|BLOCK_TRANSFER|WIDE_BUS_DIS|DATA_TRANSMIT_START|ONLYBUSY_CHECK|(BlockNum<<0); 	
			do {
				SDIO_Command(0, STOP_TRANSMISSION_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
			} while(Check_CMDend(12, 1) != 1)	;

			rSDICSTA = CMD_END|RESP_END;	// Clear cmd_end(with rsp)

			if(!Check_BUSYend()) 
				printf("error\n");

			rSDIDSTA|= DATA_FINISH;	//! Should be cleared by writing '1'.
		}
		time=time+Timer_Stop();
	}
	
	printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
	printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
}


void readBigSizeIOTest(void) {
	int StartAddr = 0;
	int OneBlockSize;
	int Addr_temp;
	unsigned int * sourceAddr;
	int i,j,k;
	int time;

	BlockNum = 4095;
	time = 0;

	// 8(block count) * 256(k count) * 512(one block size) = 1Mb
	for(k=0;k<2;k++) {
		rd_cnt=0;

		StartAddr = k*BlockNum;
		Addr_temp = StartAddr;
		while((BlockNum == 0) || (BlockNum > 4096))
		{
			printf("Input Read Block Number[1~4096] : ");
			BlockNum = GetIntNum();
		}

		OneBlockSize = Card_OneBlockSize;

		Rx_buffer = (U32 *)SDI_Rx_buffer;
	    	for(i=0 ; i<(OneBlockSize*BlockNum)/4 ; i++)
			*(Rx_buffer+i) = 0x0;

		//rSDIDSTA |= (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2);
		rSDIDSTA = CRC_STAT_FAIL|RECEIVE_CRC_FAIL|DATA_TOUT|DATA_FINISH|BUSY_FINISH;
		rSDIDCON = 0;

		rSDIFSTA |= (1<<16);	//FIFO reset

		if(Wide==0)
			rSDIDCON &= ~WIDE_BUS_EN;
		else
			rSDIDCON |= WIDE_BUS_EN;	

		rSDIDCON |=WORD_TRANSFER|RCV_AFTER_CMD|BLOCK_TRANSFER|BlockNum;
		rSDIDCON |= DATA_RECEIVE_MODE|DATA_TRANSMIT_START;
		rSDIDCON |=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN;

		pISR_DMA0=(unsigned)DMA_end;
		rINTMSK&=~(BIT_DMA0);
		//rINTSUBMSK&=~(BIT_SUB_DMA0);

		rDISRC0 = (U32)(SDIDAT);
	    	rDISRCC0 = (1<<1) | (1<<0);
		rDIDST0 = (int)(Rx_buffer);
		rDIDSTC0 = (0<<1)|(0<<0);
		rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
		rDMASKTRIG0 = (0<<2)|(1<<1)|0;    //no-stop, DMA0 channel on, no-sw trigger
		rDMAREQSEL0 = (10 <<1) | 1;

		Timer_Start(3);
		
		if(BlockNum<2)	
		{
			do {// StartAddr * 512
				SDIO_Command(StartAddr<<9, READ_SINGLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
			} while(Check_CMDend(READ_SINGLE_BLOCK_CMD, 1) != 1);
		}
		else	
		{
			do {
				SDIO_Command(StartAddr<<9, READ_MULTIPLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
			} while(Check_CMDend(READ_MULTIPLE_BLOCK_CMD, 1) != 1);
		}

		rSDICSTA = DATA_TIMEOUT|CMD_END|RESP_END;	// Clear cmd_end(with rsp)

		while(!TR_end);

		rINTMSK |= (BIT_DMA0);
		//rINTSUBMSK |= (BIT_SUB_DMA0);
		TR_end=0;
		rDMASKTRIG0=(1<<2);	//DMA0 stop
		
		if(!Check_DATend()) 
			printf("\nData End Error....\n");

	 	if(BlockNum>1)
		{
			do {
				SDIO_Command(0, STOP_TRANSMISSION_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
			} while(Check_CMDend(STOP_TRANSMISSION_CMD, 1) != 1);
			rSDICSTA = CMD_END|RESP_END;;	// Clear cmd_end(with rsp)
		}
		time = time + Timer_Stop();
		sourceAddr = (unsigned int *)SDI_Tx_buffer;
		Rx_buffer = (U32 *)SDI_Rx_buffer;
		for(j=0 ; j<(OneBlockSize*BlockNum)/4 ; j=j+4)
	   	{
			if ( *Rx_buffer != *sourceAddr ) {
				printf ("data error : %x, source : %x \n" , *Rx_buffer, *sourceAddr);
			}
			Rx_buffer++;
			sourceAddr++;
//		   		printf("\n0x%04xh : ",Addr_temp);
//		       	printf("0x%08x ",*Rx_buffer++);
//		       	Addr_temp += 4;
		}

	}
	printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
	printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
//		printf ("TIME is : %d us\n", time<<7); // time is 1/128 mux
//		printf ( "Transfer Rate is : %f MB per sec \n", ((float)(BlockNum<<9)) / ((float)(time<<7)) );

}


void SDIO_WriteTest(void)
{
	U32 i, StartAddr, Offset, Testmode;
	unsigned int time;
	unsigned int timeout_count;
	U32 status;
	U32 timpcount;
	wt_cnt=0;
	
	printf("\nSD/MMC block write test\n");

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

	while((BlockNum == 0) || (BlockNum > 4096))
	{
		printf("Input Write Block Number[1~4095] : ");
		BlockNum = GetIntNum();
	}
	
	printf("Input Write Data Offset : ");
	Offset = GetIntNum();

	// 葛滴 瘤款促.
//	eraseBlock_beforewrite( StartAddr<<7, (StartAddr+BlockNum)<<7 );

	Tx_buffer = (U32 *)SDI_Tx_buffer;
    	for(i=0 ; i<(Card_OneBlockSize/4*BlockNum) ; i++)	
		*(Tx_buffer+i) = (i+Offset);    

	rSDIFSTA |=(1<<16); //FIFO reset
//	rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
//	timeout_count =0;
	Delay(10);	// wait until FIFO reset.

	switch(Testmode)
	{
		case  POL:
//			printf("\nPolling mode data write\n");
			rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
			Timer_Start(3);
			if(BlockNum<2)//single block
			{
				do {	// StartAddr * 512
					SDIO_Command(StartAddr<<9, WRITE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
				} while((Check_CMDend(WRITE_BLOCK_CMD, 1) !=1)); 
			}
			else//multi block
			{
				do {

⌨️ 快捷键说明

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