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

📄 sdi.c

📁 Samsung S3C2443 Test program source code
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	Wide=1;
       SET_BUSWIDTH();
       printf("\n****4bit bus****\n");
}

void Set_4bit_bus_MoviNand(void)
{
	Wide=1;
       SET_BUSWIDTH_MoviNand();
       printf("\n****4bit bus****\n");
}

void SET_BUSWIDTH(void)
{

	SDIO_Command((RCA<<16), 55, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);//befoe using ACMD
	while((Check_CMDend(55, 1) !=1))
		{
			SDIO_Command((RCA<<16), 55, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);//befoe using ACMD
		}

	SDIO_Command((Wide<<1), 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width
	while((Check_CMDend(6, 1) !=1))
		SDIO_Command((Wide<<1), 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width

	rSDICSTA |= CMD_END|RESP_END;	
}

void SET_BUSWIDTH_MoviNand(void)
{
	int uArg;

	uArg=((3<<24)|(183<<16)|(1<<8));
	
	SDIO_Command(uArg, 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width
	while((Check_CMDend(6, 1) !=1))
		SDIO_Command(uArg, 6, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);//ACMD6 select bus width

	rSDICSTA |= CMD_END|RESP_END;	
}

void CARD_SEL_DESEL(U8 sel_desel)
{
	printf("\nCMD7 : Command toggles a card between the stand-by and transfer state\n");
	if(sel_desel)
		{
			printf("\nCMD7 : Select\n");
			SDIO_Command((RCA<<16), 7, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
			if((Check_CMDend(7, 1) !=1)||(rSDIRSP0 != 0x800))//entering the standby mode
				SDIO_Command((RCA<<16), 7, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);

			rSDICSTA |=CMD_END|RESP_END;
			printf("\nEntered to the Transfer state\n");			
		}
	else
		{
			printf("\nCMD7 : Deselect\n");
			SDIO_Command((RCA<<16), 7, SDIO_NO_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
			if((Check_CMDend(7, 0) !=1))
				SDIO_Command((RCA<<16), 7, SDIO_NO_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);

			rSDICSTA |= CMD_END;
			printf("\nEntered to the Stand-by State\n");			
		}
	

}


void SDIO_PrescalerSetting(U32 BaudRate)
{
	rSDIPRE = (PCLK/BaudRate) - 1;
}

void SDIO_Command(U32 CmdArg, U32 Command, U32 WaitResp, U32 LongResp, U32 WithData)
{
	U32 CmdIndex;
	
	rSDICARG = rSDICARG & ~(0xffffffff) | CmdArg;
	
	CmdIndex = Command | 0x40;
	rSDICCON = (WithData<<11)|(LongResp<<10)|(WaitResp<<9)|(CmdIndex);
	
	//Command Start
	rSDICCON |= (1<<8);
}

void SDIO_BlockSizeSetting(U32 Size)
{
	rSDIBSIZE = (Size & 0xFFF);
}


void SDIO_TypeSetting(U32 ClkType, U32 ByteType)
{
	if(ClkType == SDIO_SD_TYPE)
		rSDICON &= ~CLOCK_TYPE;
	else if(ClkType == SDIO_MMC_TYPE)
		rSDICON |= CLOCK_TYPE;

	if(ByteType == SDIO_TYPE_A)
		rSDICON &= ~BYTE_ORDER;
	else if(ByteType == SDIO_TYPE_B)
		rSDICON |= BYTE_ORDER;		
}

#if 1
int Check_CMDend(int cmd, int be_resp)
//0: Timeout
{
    int finish0;

    if(!be_resp)    // No response
    {
    	finish0=rSDICSTA;
		while((finish0&CMD_END)!=CMD_END)	// Check cmd end
	    finish0=rSDICSTA;

	rSDICSTA=finish0;// Clear cmd end state

	return 1;
    }
    else	// With response
    {
    	finish0=rSDICSTA;
	while( !( ((finish0&RESP_END)==RESP_END) | ((finish0&CMD_TOUT)==CMD_TOUT) ))    // Check cmd/rsp end
	finish0=rSDICSTA;
	if(cmd==1 | cmd==41)	// CRC no check, CMD9 is a long Resp. command.

	{
	    if( (finish0&0xf00) != CMD_END|RESP_END )  // Check error
	    {
		rSDICSTA=finish0;   // Clear error state
		if(((finish0&CMD_TOUT)==CMD_TOUT))
		    return 0;	// Timeout error
    	    }
	    rSDICSTA=finish0;	// Clear cmd & rsp end state
	}
	else	// CRC check
	{
	    if( (finish0&0x1f00) != CMD_END|RESP_END)	// Check error
	    {
		//printf("CMD%d:rSDICSTA=0x%x, rSDIRSP0=0x%x\n",cmd, rSDICSTA, rSDIRSP0);
		rSDICSTA=finish0;   // Clear error state

		if(((finish0&CMD_TOUT)==CMD_TOUT))
		    return 0;	// Timeout error
    	    }
	    rSDICSTA=finish0;
	}
	return 1;
    }
}
#else
int Check_CMDend(int cmd, int be_resp)
//0: Timeout
{
    int finish0;

    if(!be_resp)    // No response
    {
    	finish0=rSDICSTA;
		while((finish0&0x800)!=0x800)	// Check cmd end
	    finish0=rSDICSTA;

	rSDICSTA=finish0;// Clear cmd end state

	return 1;
    }
    else	// With response
    {
    	finish0=rSDICSTA;
	while( !( ((finish0&0x200)==0x200) | ((finish0&0x400)==0x400) ))    // Check cmd/rsp end
	finish0=rSDICSTA;
	if(cmd==1 | cmd==41)	// CRC no check, CMD9 is a long Resp. command.

	{
	    if( (finish0&0xf00) != 0xa00 )  // Check error
	    {
		rSDICSTA=finish0;   // Clear error state

		if(((finish0&0x400)==0x400))
		    return 0;	// Timeout error
    	    }
	    rSDICSTA=finish0;	// Clear cmd & rsp end state
	}
	else	// CRC check
	{
	    if( (finish0&0x1f00) != 0xa00 )	// Check error
	    {
		printf("CMD%d:rSDICSTA=0x%x, rSDIRSP0=0x%x\n",cmd, rSDICSTA, rSDIRSP0);
		rSDICSTA=finish0;   // Clear error state

		if(((finish0&0x400)==0x400))
		    return 0;	// Timeout error
    	    }
	    rSDICSTA=finish0;
	}
	return 1;
    }
}
#endif

int Check_BUSYend(void)
{
    int finish;

    finish=rSDIDSTA;
    //printf("\nBusy end =%x",finish);
    while( !( ((finish&0x08)==0x08) | ((finish&0x20)==0x20) ))
	finish=rSDIDSTA;

    while( (finish&(0x1<<3)) != 0x8 )
    {
       // printf("\nDATA:finish=0x%x\n", finish);
        finish=rSDIDSTA;
        //return 0;
    }
   rSDIDSTA=0xf4;  //clear error state	
    return 1;
}


int Check_MMC_OCR(void)
{
    int i;


    //-- Negotiate operating condition for MMC, it makes card ready state
    for(i=0;i<200;i++)	//Negotiation time is dependent on CARD Vendors.
    {
    	SDIO_Command(0xff8000, 1, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);

	if(Check_CMDend(1, 1) && (rSDIRSP0>>16)==0x80ff) //[31]:Card Power up status bit (busy)
	{
	    //rSDICSTA=0xa00;	// Clear cmd_end(with rsp)
	    rSDICSTA |= CMD_END|RESP_END;
	    return 1;	// Success
	}
    }
    //rSDICSTA=0xa00;	// Clear cmd_end(with rsp)
    rSDICSTA |= CMD_END|RESP_END;
    return 0;		// Fail
}

#if 0
int Check_DATend(void)
{
    int finish;

	finish=rSDIDSTA;
	
    while( !( ((finish&0x10)==0x10) || ((finish&0x20)==0x20) ))// Chek timeout or data end
    	{
    		//printf("\nData End Check =%x",finish);
		finish=rSDIDSTA;
    	}

    if( (finish &0x10) != 0x10 )
    {
        //printf("\nDATA:finish=0x%x\n", finish);
        rSDIDSTA=finish;  // Clear error state
        return 0;
    }
    return 1;
}

#else
int Check_DATend(void)
{
    int finish;

    finish=rSDIDSTA;
	//printf("DATA:finish=0x%x\n", finish);
	//printf("DATA end check\n");
    while( !((finish&DATA_FINISH)==DATA_FINISH))// Chek timeout or data end
    	{
    		//printf("\nData End Check =%x",finish);
		finish=rSDIDSTA;
    	}

    if( (finish&0xfc) != DATA_FINISH )
    {
        //printf("DATA:finish=0x%x\n", finish);
        rSDIDSTA=0xec;  // Clear error state
        return 0;
    }
    return 1;
}
#endif

int Check_SD_OCR(void)
{
    int i,j=0;

    //-- Negotiate operating condition for SD, it makes card ready state
    for(i=0;i<200;i++)	//If this time is short, init. can be fail.
    {
    	SDIO_Command((RCA<<16), 55, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
	while(Check_CMDend(55, 1) != 1)
		{
			printf("\nCommand55 Fail...");
			return 0;
		}	
	
	SDIO_Command(0xff8000, 41, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
    	if( Check_CMDend(41, 1) & rSDIRSP0==0x80ff8000 ) 
	{
	    rSDICSTA=0xa00;	// Clear cmd_end(with rsp)
	    return 1;	// Success	    
	}
	Delay(200); // Wait Card power up status
    }
    rSDICSTA=0xa00;	// Clear cmd_end(with rsp)
    return 0;		// Fail
}


void __irq DMA_end(void)
{
	//printf("\nDMA ISR\n");
	rSUBSRCPND |= BIT_SUB_DMA0;
	ClearPending(BIT_DMA);    
    	TR_end=1;
}

void __irq Rd_Int(void)
{
    	U32 i,status;

	ClearPending(BIT_SDI0);
	rINTMSK |= (BIT_SDI0);
	
	status=rSDIFSTA;
	if( (status&0x200) == 0x200 )	// Check Last interrupt?
	{
	for(i=(status & 0x7f)/4;i>0;i--)
	{
	    *Rx_buffer++=rSDIDAT;
	    rd_cnt++;
	}
	rSDIFSTA=rSDIFSTA&0x200;	//Clear Rx FIFO Last data Ready, YH 040221
	}
	else if( (status&0x80) == 0x80 )	// Check Half interrupt?
	{
	    for(i=0;i<8;i++)
	    	{
			*Rx_buffer++=rSDIDAT;
			rd_cnt++;
		}
	}
		
	rINTMSK &= ~(BIT_SDI0);
}

void __irq Wt_Int(void)
{
    ClearPending(BIT_SDI0);
	rINTMSK |= (BIT_SDI0);

    rSDIDAT=*Tx_buffer++;
    wt_cnt++;

    if(wt_cnt==128*BlockNum)
    {
	rINTMSK |= BIT_SDI0;
	rSDIDAT=*Tx_buffer;
	TR_end=1;
    }
	
	rINTMSK &= ~(BIT_SDI0);
}

void CalculationBPS_NORMALSD_MMC(int Time)
{
	float x=0;
	int y=0;
	float bps=0;

	x = (float)((float)1000000/(float)Time); //Unit is usec

	y = (BlockNum+1) * 512 * 8;
	
	bps = x*(float)y;
	
	printf("\n\n\nTransfer Time = %dusec",Time);
	printf("\nTransferSize = %dKByte",y/(8*1024));
	printf("\nBPS = %fMByte/sec\n\n",bps/(1000000*8));
}

⌨️ 快捷键说明

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