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