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

📄 xsmmc.c

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

}

/*
*******************************************************************************
*                           LOCAL FUNCTIONS
*******************************************************************************
*/



/*
*******************************************************************************
*                           GLOBAL FUNCTIONS
*******************************************************************************
*/

UINT32 MMCSDStatusGet(MMCSDAttribT *mmcsdAttribT)
{
   STATRES mmcsdStatus;
   mmcStack MMCSTK;
   MMCSTK.FSIZE	= 0;
   MMCSTK.BSIZE	 = 0;
   MMCSTK.RATE = 0;
   MMCSTK.NOB = 0;
   MMCSTK.BUSY= 0;
   MMCSTK.READSCR = 0;
   MMCSTK.ADDR = mmcsdAttribT->rca;
   MMCSTK.DATATRANS=DNONE;
   MMCSTK.CMD = XLLP_MMC_SPICMD13;
   mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
 
   return(mmcsdStatus.sresponse);


}


void SDReadStatus(UINT32 RCA)
{
   		INT y=0;
//   		MmcReg->MMC_STRPCL = XLLP_STRPCL_STPCLK;        // Stop the MMC clock
    	PostDisplayProgress(ERR_L_MMC, 1, 8);
//    	while (MmcReg->MMC_STAT & XLLP_STAT_CLKEN);    // Wait for the clock to stop
    	PostDisplayProgress(ERR_L_MMC, 1, 9);
 //printf("Sending CMD 55\r\n");
    	XllpMmcSdSetupCmd(MmcReg, XLLP_MMC_SPICMD55, RCA, 64,0, XLLP_FALSE);

    // Wait for the command to finish
    	while (!(MmcReg->MMC_STAT & XLLP_STAT_ENDCMDRES))
      	 	if (MmcReg->MMC_STAT & XLLP_STAT_TORSPNS) {
        //    	retVal = ERRORCODEX(ERR_L_MMC, 1, 9, ERR_T_TIMEOUT);
            	break;
       		}

//  		MmcReg->MMC_STRPCL = XLLP_STRPCL_STPCLK;        // Stop the MMC clock
    	PostDisplayProgress(ERR_L_MMC, 1, 8);
//    	while (MmcReg->MMC_STAT & XLLP_STAT_CLKEN);    // Wait for the clock to stop
    	PostDisplayProgress(ERR_L_MMC, 1, 9);
 
        MmcReg->MMC_I_MASK &= ~XLLP_MMC_I_MASK_RXFIFORDREQ;

    	XllpMmcSdSetupCmd(MmcReg, XLLP_SD_ACMD13, 0x0, 64,0, XLLP_FALSE);
		XllpMmcSdSetupXCmd(MmcReg, 0x200, 0x200, 0xffff);
// printf("Sending ACMD 13\r\n");
//   printf("status %x\r\n", MmcReg->MMC_RXFIFO);
        while((MmcReg->MMC_I_REG & XLLP_MMC_I_REG_RXFIFORDREQ)) {
    // Wait for the command to finish
     for (y=7; y>=0; --y) 
       {
      XsSD_STATUS.b[y] = MmcReg->MB_RXFIFO;
//   printf("status %x\r\n", XsSD_STATUS.b[y]);
	   }
	   break;
     }
        while((MmcReg->MMC_I_REG & XLLP_MMC_I_REG_RXFIFORDREQ))
     for (y=32; y>=0; --y) 
       {
 //  printf("status %x\r\n", MmcReg->MMC_RXFIFO);
      XsSD_STATUS.b[y] = MmcReg->MB_RXFIFO;
	   }

//	   printf("SCR -SD_BUS_WIDTH(%x)\r\n", XsSD_STATUS.STATUS.DAT_BUS_WIDTH );
  		while (!(MmcReg->MMC_STAT & XLLP_STAT_DATATRANDONE)) {
       		if (MmcReg->MMC_STAT & XLLP_STAT_TORSPNS) {
 //           	retVal = ERRORCODEX(ERR_L_MMC, 3, 1, ERR_T_TIMEOUT);
            	break;
//  printf("interrupt done\n\r");
        	}
        	if (MmcReg->MMC_STAT & XLLP_STAT_CRCRDERR) {
 //           	retVal = ERRORCODEX(ERR_L_MMC, 3, 1, ERR_T_CRC);
            	break;
        	}
        	if (MmcReg->MMC_STAT & XLLP_STAT_TORD) {
  //          	retVal = ERRORCODEX(ERR_L_MMC, 3, 3, ERR_T_TIMEOUT);
            	break;
        	}
		}

//printf("Done with status\r\n");

}


/*
*******************************************************************************
*
* FUNCTION:         XsMMCHWSetup
*
* DESCRIPTION:      Setup the MMC controller in polled MMC mode.
*
* INPUT PARAMETERS: None.
*
* RETURNS:          ErrorT - Status.
*                   XsMMC_CID - Contents of the MMC CID register.
*                   XsMMC_CSD - Contents of the MMC CSD register.
*                   XsMMC_OCR - Contents of the MMC OCR register.
*
* GLOBAL EFFECTS:   None.
*
* ASSUMPTIONS:      None.
*
* CALLS:            None.
*
* CALLED BY:        System.
*
* PROTOTYPE:        ErrorT XsMMCHWSetup(void)
*
*******************************************************************************
*/

ErrorT XsMMCHWSetup(void)
{
	return(0);
}

/*
*******************************************************************************
*
* FUNCTION:         XsMMCHWShutdown
*
* DESCRIPTION:      Shutdown the MMC controller.
*
* INPUT PARAMETERS: None.
*
* RETURNS:          ErrorT - Status.
*
* GLOBAL EFFECTS:   None.
*
* ASSUMPTIONS:      None.
*
* CALLS:            None.
*
* CALLED BY:        System.
*
* PROTOTYPE:        ErrorT XsMMCHWShutdown(void)
*
*******************************************************************************
*/

ErrorT XsMMCHWShutdown(void)
{
    PostDisplayProgress(ERR_L_MMC, 4, 0);
 //  	printf("Calling XsMMCHWShutdown!");
    XsIcDisableIrqDeviceInt(XSIC_MMC_SGNL);
    XsIcUnRegisterHandler(XSIC_MMC_SGNL);
  	XllpMmcSdHwShutdown(ClckReg, BcrReg);  
	powerUp=XLLP_FALSE;
    return ERR_NONE; 
}

/*
*******************************************************************************
*
* FUNCTION:         XsMMCPut
*
* DESCRIPTION:      Put a 512 byte block to the MMC.
*
* INPUT PARAMETERS: UINT32 block - Block number to put.
*                   BYTE *buffer - Buffer to put.
*
* RETURNS:          ErrorT - Status.
*
* GLOBAL EFFECTS:   None.
*
* ASSUMPTIONS:      None.
*
* CALLS:            None.
*
* CALLED BY:        Anyone.
*
* PROTOTYPE:        ErrorT XsMMCPut(UINT32 block, BYTE *buffer)
*
*******************************************************************************
*/ 

ErrorT XsMMCWrite(MMCSDAttribT *mmcsdAttribT)
{
    mmcStack MMCSTK;
  	mmcStack TempStack;    
    STATRES mmcsdStatus;
    UINT8 count=0;
    txWritten = 0;

	for(txWritten=1; txWritten<mmcsdAttribT->mmc_csd->WRITE_BL_LEN; txWritten++)
		count*=2;

	
	txWritten = 0;

	putBuf = mmcsdAttribT->buffer;
	MMCSTK.ADDR = ((mmcsdAttribT->block)<<7);
	MMCSTK.FSIZE = mmcsdAttribT->size;

	MMCSTK.BSIZE = SO_BLOCK;
  //	MMCSTK.BSIZE = mmcsdStatus;
	MMCSTK.DATATRANS = WRITE;
	MMCSTK.NOB = MMCSTK.FSIZE/MMCSTK.BSIZE;
	if (MMCSTK.NOB == 1)
		MMCSTK.CMD = XLLP_MMC_SPICMD24;
	else
		MMCSTK.CMD = XLLP_MMC_CMD25;

	mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
	
	if (mmcsdStatus.status & 0xffff)
		goto deselectCard;
	else
		goto end;

deselectCard:
		TempStack = MMCSTK;
		MMCSTK.CMD = XLLP_MMC_CMD7;
		MMCSTK.ADDR = 0x0;
		MMCSTK.DATATRANS=DNONE;
		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
		goto selectCard;

selectCard:
		MMCSTK.ADDR = mmcsdAttribT->rca;
		MMCSTK.DATATRANS=DNONE;
 		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
		goto resendCmd;

resendCmd:
		MMCSTK = TempStack;
   		txWritten=0;
 		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);

end: 
// printf("Done writing to the card\r\n");

//	MmcReg->MMC_STRPCL = XLLP_STRPCL_STPCLK;     // Stop the MMC clock.


    return mmcsdStatus.status;
}

/*
*******************************************************************************
*
* FUNCTION:         XsMMCGet
*
* DESCRIPTION:      Get a 512 byte block from the MMC.
*
* INPUT PARAMETERS: UINT32 block - Block number to get.
*                   BYTE *buffer - Buffer to fill.
*
* RETURNS:          ErrorT - Status.
*                   buffer - The contents of the 512 byte block.
*
* GLOBAL EFFECTS:   None.
*
* ASSUMPTIONS:      None.
*
* CALLS:            None.
*
* CALLED BY:        Anyone.
*
* PROTOTYPE:        ErrorT XsMMCGet(UINT32 block, BYTE *buffer)
*
*******************************************************************************
*/

ErrorT XsMMCRead(MMCSDAttribT *mmcsdAttribT)
{
//    mmcStack MMCSTK;
    mmcStack MMCSTK;
  	mmcStack TempStack;    
    STATRES mmcsdStatus;
    UINT8 count=0;
	rxRead=0;

	for(rxRead=1; rxRead<mmcsdAttribT->mmc_csd->READ_BL_LEN; rxRead++)
		count*=2;
	
	rxRead = 0;
	getBuf = mmcsdAttribT->buffer;
	MMCSTK.ADDR = ((mmcsdAttribT->block)<<7);
	MMCSTK.FSIZE = mmcsdAttribT->size;
	MMCSTK.BSIZE = SO_BLOCK;
//	MMCSTK.BSIZE = mmcsdStatus;
	MMCSTK.DATATRANS = READ;
	MMCSTK.NOB = MMCSTK.FSIZE/MMCSTK.BSIZE;
//printf("XsMMCRead\r\n");
	if (MMCSTK.NOB == 1)
		MMCSTK.CMD = XLLP_MMC_SPICMD17;
	else
		MMCSTK.CMD = XLLP_MMC_CMD18;
	mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
//	DM_WaitMs(10);  
	if (mmcsdStatus.status & 0xffff)
		goto deselectCard;
	else
		goto end;

deselectCard:
		TempStack = MMCSTK;
		MMCSTK.CMD = XLLP_MMC_CMD7;
		MMCSTK.ADDR = 0x0;
		MMCSTK.DATATRANS=DNONE;
		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
		goto selectCard;

selectCard:
		MMCSTK.ADDR = mmcsdAttribT->rca;
		MMCSTK.DATATRANS=DNONE;
 		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
		goto resendCmd;

resendCmd:
		MMCSTK = TempStack;
   		rxRead=0;
 		mmcsdStatus = mmcProcessCmd(MmcReg, &MMCSTK);
    
end:

   if (rxRead>(MMCSTK.FSIZE/4))
        mmcsdStatus.status = ERRORCODEX(ERR_L_MMC, 3, 1, ERR_T_DATA_OVERRUN);
  else if (rxRead < (MMCSTK.FSIZE/4))
        mmcsdStatus.status = ERRORCODEX(ERR_L_MMC, 3, 3, ERR_T_DATA_UNDERRUN);

//    MmcReg->MMC_STRPCL = XLLP_STRPCL_STPCLK;     // Stop the MMC clock.

    return mmcsdStatus.status;
}

⌨️ 快捷键说明

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