📄 xsmmc.c
字号:
}
/*
*******************************************************************************
* 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 + -