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

📄 xsmmc.c

📁 优龙YLP270开发板 光盘自带的BIOS和实验例程源码 强烈推荐
💻 C
📖 第 1 页 / 共 3 页
字号:
				

ExpectedDataTrans:
//printf("+ExpectedDataTrans %x\r\n", MMC->DATATRANS);
	    XllpMmcSdSetupXCmd(MmcReg, MMC->FSIZE, MMC->BSIZE , 0xffff);
	   	XllpMmcSdSetupCmd(MmcReg, MMC->CMD, MMC->ADDR, 64,0, XLLP_FALSE); 
		if (MMC->DATATRANS == WRITE)
	   	{
	     	XllpMmcSdInts(mmcReg, XLLP_MMC_I_MASK_TXFIFOWRREQ);
//printf("+ExpectedDataTransW %x\r\n", MmcReg->MMC_I_MASK);
		}
		else
		{
	   		XllpMmcSdInts(mmcReg, XLLP_MMC_I_MASK_RXFIFORDREQ);

//printf("+ExpectedDataTransR %x\r\n", MmcReg->MMC_I_MASK);
	  	}  
   // 	while (!(MmcReg->MMC_STAT & XLLP_STAT_ENDCMDRES))
  //  	 	printf("MmcReg->MMC_STAT %x\r\n", MmcReg->MMC_STAT);
// 		printf("MmcReg->MMC_I_MASK %x\r\n", MmcReg->MMC_I_MASK);
//     	osStatus = OSAFlagWait(_keypadFlagRef, KEYPAD_FLAG_MASK, OSA_FLAG_OR_CLEAR, &keypadFlags, OSA_SUSPEND);
//    	ASSERT(osStatus == OS_SUCCESS);
    	while (!(MmcReg->MMC_STAT & XLLP_STAT_DATATRANDONE));
//    	 	printf("MmcReg->MMC_STAT_A %x MmcReg->IMASK %x\r\n", MmcReg->MMC_STAT, MmcReg->MMC_I_MASK);

	 	goto DataTrans;


DataTrans:
//printf("+DataTrans\r\n");
	   	XllpMmcSdInts(mmcReg,XLLP_MMC_I_MASK_DATATRANSDONE);
//   	osStatus = OSAFlagWait(_keypadFlagRef, KEYPAD_FLAG_MASK, OSA_FLAG_OR_CLEAR, &keypadFlags, OSA_SUSPEND);
//    	ASSERT(osStatus == OS_SUCCESS);
    	while (!(MmcReg->MMC_STAT & XLLP_STAT_DATATRANDONE));
		if (MMC->DATATRANS == WRITE)
	   		{
		    	goto ProgDone;
			}
			else
			{
		   	 	goto DataTransDone;
			}


ProgDone:
//printf("+ProgDone\r\n");
   		XllpMmcSdInts(mmcReg,XLLP_MMC_I_MASK_PRGDONE);
//   	osStatus = OSAFlagWait(_keypadFlagRef, KEYPAD_FLAG_MASK, OSA_FLAG_OR_CLEAR, &keypadFlags, OSA_SUSPEND);
//    	ASSERT(osStatus == OS_SUCCESS);
    	while (!(MmcReg->MMC_STAT & XLLP_STAT_PRGDONE));
	    goto DataTransDone;


DataTransDone:
//printf("+DataTransDone\r\n");
		if (MMC->NOB > 1)
		{
			goto MBStopClock;
	    }
		else
		{
			goto ExtractResponse;
		 }	


MBStopClock:
//printf("+MBStopClock\r\n");
	    XllpMmcSdInts(mmcReg,XLLP_MMC_I_MASK_CLKISOFF);
//	    mmcReg->MMC_STRPCL = XLLP_STRPCL_STPCLK;        // Stop the MMC clock
//   	osStatus = OSAFlagWait(_keypadFlagRef, KEYPAD_FLAG_MASK, OSA_FLAG_OR_CLEAR, &keypadFlags, OSA_SUSPEND);
//    	ASSERT(osStatus == OS_SUCCESS);
//   		while (MmcReg->MMC_STAT & XLLP_STAT_CLKEN);    // Wait for the clock to stop
		goto SendCMD12;


SendCMD12:
//printf("+SendCMD12\r\n");
		MMC->CMD = XLLP_MMC_CMD12;
		MMC->ADDR = 0;
	   	XllpMmcSdInts(mmcReg,XLLP_MMC_I_MASK_ENDCMDRES);
	    XllpMmcSdSetupCmd(MmcReg, MMC->CMD, MMC->ADDR, 64,0, XLLP_FALSE); 
//    	osStatus = OSAFlagWait(_keypadFlagRef, KEYPAD_FLAG_MASK, OSA_FLAG_OR_CLEAR, &keypadFlags, OSA_SUSPEND);
//    	ASSERT(osStatus == OS_SUCCESS);
    	while (!(MmcReg->MMC_STAT & XLLP_STAT_ENDCMDRES));
		goto MBProgDone;


MBProgDone:
//printf("+MBProgDone\r\n");
   		XllpMmcSdInts(mmcReg,XLLP_MMC_I_MASK_PRGDONE);
//    	osStatus = OSAFlagWait(_keypadFlagRef, KEYPAD_FLAG_MASK, OSA_FLAG_OR_CLEAR, &keypadFlags, OSA_SUSPEND);
//    	ASSERT(osStatus == OS_SUCCESS);
    	while (!(MmcReg->MMC_STAT & XLLP_STAT_PRGDONE));
		goto ExtractResponse;


ExtractResponse:
//printf("+ExtractResponse\r\n");
  		if((mmcReg->MMC_CMDAT & 0x3) == XLLP_MMC_MMCSPIR2)
  		{
			XllpMmcXtractResp(MmcReg, res, XLLP_MMC_MMCSPIR2);
			statusRes.lresponse[3] = parseResponse(&res[5], 1);
			statusRes.lresponse[2] = parseResponse(&res[3], 1);
			statusRes.lresponse[1] = parseResponse(&res[1], 1);
	  		statusRes.lresponse[0] = parseResponse(&res[0], 0);
 		}
		else
		{
	 	 	XllpMmcXtractResp(MmcReg, res, XLLP_MMC_MMCSPIR1);
			statusRes.sresponse = parseResponse(&res[0], 1);
		}

         
        
end:
  //  need to put the response into the format to return to application the specified 
  //  errors in the LLD

		statusRes.status = checkStatus(MmcReg,statusRes.sresponse);
//printf("-mmcProcessCmd\r\n");

	return(statusRes);
}



UINT MMCSDAttribGet(MMCSDAttribT *mmcsdAttribT)
{
   
   mmcStack MMCSTK;
   STATRES mmcsdStatus;
   INT size=0;
 //  UINT32 cardRca	= RCA_MMC_CARD;
   MMCSTK.NOB 		= 1;
   MMCSTK.FSIZE 	= SO_BLOCK;
   MMCSTK.RATE 		= XLLP_MMC_304KHz;
   MMCSTK.BSIZE 	= SO_BLOCK;
   MMCSTK.BUSY 		= XLLP_TRUE;
   MMCSTK.READSCR 	= XLLP_FALSE;
   MMCSTK.DATATRANS = DNONE;

   mmcsdAttribT->rca = RCA_MMC_CARD;
   
   XsIcRegisterHandler(
    XSIC_MMC_SGNL, 
    (XsIcL1IntHandlerFnPT)mmcInterruptServiceRoutine,
    0
    );

    XsIcEnableIrqDeviceInt(XSIC_MMC_SGNL);
    XllpMmcSdHWInit(GpioReg, ClckReg, BcrReg); 
	DM_WaitMs(2);    // Wait 2ms per MMC specification

//printf("+MMCSDAttribGet\r\n");

	XllpMmcSetUpClock(MmcReg, XLLP_MMC_304KHz, 0);
    MmcReg->MMC_STRPCL = XLLP_STRPCL_STRTCLK;

//SendCMD0:
//printf("+SendCMD0\r\n");
		MMCSTK.DATATRANS=DNONE;
 		MMCSTK.CMD = XLLP_MMC_SPICMD0;
		MMCSTK.ADDR = 0x0;	
		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
		goto ISendCMD1;


ISendCMD1:	
//printf("+ISendCMD1\r\n");
   	   	MMCSTK.CMD = XLLP_MMC_SPICMD1;
	   	MMCSTK.ADDR = CMD1_ADDR;
	   	MMCSTK.DATATRANS=DNONE;
		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
		mmcsdAttribT->OCR = 0x0;
		if( (mmcsdStatus.status & MMCSD_STAT_TORSPN) == MMCSD_STAT_TORSPN) 
    	{
   	   		mmcsdAttribT->mmc = XLLP_FALSE;
   			goto SendAppCMD;
		}
   		
   		if (!(mmcsdStatus.sresponse & MMCSD_CARD_OCR_nBUSY))	// Card power up status bit (!busy)
   		{
   		 		goto SendCMD1;
   		}
   		else
   		{
   			MMCSTK.BUSY = XLLP_FALSE;
   		   	goto SendCMD2;
   		}

SendCMD1:
//printf("+SendCMD1\r\n");
   	   	MMCSTK.CMD = XLLP_MMC_SPICMD1;
	   	MMCSTK.ADDR = CMD1_ADDR;
	   	MMCSTK.DATATRANS=DNONE;
		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
		mmcsdAttribT->OCR  = mmcsdStatus.sresponse;
		if (mmcsdAttribT->OCR & MMCSD_CARD_OCR_nBUSY)	// Card power up status bit (!busy)
   		{
   	   		mmcsdAttribT->mmc = XLLP_TRUE;
   			MMCSTK.BUSY = XLLP_FALSE;
   		   	goto SendCMD2;
   		}
   		else
   		{
   		   	goto SendCMD1;			  
   		}

SendAppCMD:
       //	printf("+SendAppCMD\r\n");
 			MMCSTK.CMD = XLLP_MMC_SPICMD55;
   			if (mmcsdAttribT->OCR & MMCSD_CARD_OCR_nBUSY)	// Card power up status bit (!busy)
				MMCSTK.ADDR = mmcsdAttribT->rca;
			else 
   			  	MMCSTK.ADDR = 0x0;
			
			MMCSTK.DATATRANS=DNONE;
			mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
   			if (mmcsdAttribT->OCR & MMCSD_CARD_OCR_nBUSY)	// Card power up status bit (!busy)
		   		goto SendACMD51;
		   	else
				goto SendCMD41;
			
SendCMD41:    	
//printf("+SendCMD41\r\n");
			MMCSTK.ADDR = 0x200000;
			MMCSTK.BSIZE = SO_SCR;
			MMCSTK.CMD = XLLP_SD_ACMD41;
			MMCSTK.DATATRANS = DNONE;
	   		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
			mmcsdAttribT->OCR  = mmcsdStatus.sresponse;
   			if (mmcsdAttribT->OCR & MMCSD_CARD_OCR_nBUSY)	// Card power up status bit (!busy)
   			{
   				MMCSTK.BUSY = XLLP_FALSE;
   			   	goto SendCMD2;
   			}
   			else
   			{
	  	 		goto SendAppCMD;
   			}


SendCMD2:
//printf("+SendCMD2\r\n");
		  	MMCSTK.CMD = XLLP_MMC_CMD2;
			MMCSTK.ADDR = 0x000;
			MMCSTK.DATATRANS=DNONE;
			mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
	   	    for(size=0; size<4; size++)
	   	    {
  		  		XsSD_CID.qb[size] = mmcsdStatus.lresponse[size];
 		  	}
//			displayCIDinfo((SDCID*)&XsSD_CID.sd_cid);
 	
   	   		mmcsdAttribT->mmc_cid = &XsMMC_CID.mmc_cid;
   	   		goto SendCMD3;


SendCMD3:
//printf("+SendCMD3\r\n");
			MMCSTK.DATATRANS=DNONE;
			MMCSTK.CMD = XLLP_MMC_CMD3;
			MMCSTK.ADDR = mmcsdAttribT->rca;
			mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
	 		if(!mmcsdAttribT->mmc)
			{
	 		   	mmcsdAttribT->rca = (mmcsdStatus.sresponse & 0xffff0000) ;
			}

    		goto EndInitClock;
    		
EndInitClock:    
//printf("+EndInitClock\r\n");
//   	    	XllpMmcSdInts(MmcReg,XLLP_MMC_I_MASK_CLKISOFF);
//        	MmcReg->MMC_STRPCL = XLLP_STRPCL_STPCLK;        // Stop the MMC clock
 //  			osStatus = OSAFlagWait(_keypadFlagRef, KEYPAD_FLAG_MASK, OSA_FLAG_OR_CLEAR, &keypadFlags, OSA_SUSPEND);
//    		ASSERT(osStatus == OS_SUCCESS);
//   			while (MmcReg->MMC_STAT & XLLP_STAT_CLKEN);    // Wait for the clock to stop
//			XllpMmcSetUpClock(MmcReg, XLLP_MMC_19_5MHz, 1);
    		goto SendCMD9;



SendCMD7:
//printf("+SendCMD7\r\n");
			MMCSTK.CMD = XLLP_MMC_CMD7;
			MMCSTK.ADDR = mmcsdAttribT->rca;
			MMCSTK.DATATRANS=DNONE;
			mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
    		goto SendCMD16;

SendCMD9:
//printf("+SendCMD9\r\n");
 			MMCSTK.CMD = XLLP_MMC_SPICMD9;
			MMCSTK.ADDR = mmcsdAttribT->rca;
			MMCSTK.DATATRANS=DNONE;
			mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
    		
    		for(size=0; size<4; size++ )
  		  	{
  			  	XsMMC_CSD.qb[size] = mmcsdStatus.lresponse[size];
   	   		}
   	   		
   	   		mmcsdAttribT->mmc_csd = &XsMMC_CSD.mmc_csd;
   	//   		displayCSDInfo((SDCSD*)mmcsdAttribT->mmc_csd);

    		goto SendCMD7;

SendCMD16:
//printf("+SendCMD16\r\n" );
			MMCSTK.CMD = XLLP_MMC_SPICMD16;
			if(!MMCSTK.READSCR  &&  !mmcsdAttribT->mmc)
			{
				MMCSTK.BSIZE = SO_SCR;
			}
			else
			{
				MMCSTK.BSIZE = SO_BLOCK;
			}
			MMCSTK.ADDR = MMCSTK.BSIZE;
			MMCSTK.DATATRANS=DNONE;
			mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
			if((mmcsdAttribT->mmc) || (MMCSTK.READSCR))
    			goto end;
			else
				goto SendAppCMD;

SendACMD51:
//printf("+SendACMD51\r\n");
			MMCSTK.CMD = XLLP_SD_ACMD51;
			MMCSTK.ADDR = mmcsdAttribT->rca;
			MMCSTK.FSIZE = SO_SCR;
			MMCSTK.BSIZE = SO_SCR;
			MMCSTK.DATATRANS = READ;
			MMCSTK.READSCR = XLLP_TRUE;
			MMCSTK.NOB = 1;

			rxRead = 0;
			getBuf = (UINT32*)&mmcsdAttribT->sd_scr; 
			mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
    		goto SendCMD16;

end:

    
   mmcsdStatus.sresponse = MMCSDStatusGet(mmcsdAttribT);

//printf("-MMCSDAttribGet %x\r\n", mmcsdStatus.sresponse);
 return(mmcsdStatus.status);			

⌨️ 快捷键说明

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