📄 hs0_mmc.c
字号:
else
{
SetTransferModeReg_CH0(1, 0, 1, 1, 1);
SetCommandReg_CH0(25, 0); // CMD25: Multi-Write
}
if (!WaitForCommandComplete_CH0())
{
printf("\nCommand is NOT completed\n");
}
ClearCommandCompleteStatus_CH0();
while(!HS_DMA_END_ch0);
if(!WaitForTransferComplete_CH0())
{
printf(("Transfer is NOT Complete\n"));
}
ClearTransferCompleteStatus_CH0();
rHM0_NORINTSTS |= (1<<3);
transtime = EndStopwatch();
CalculationBPS_HSMMC_CH0(transtime);
printf(("\nDMA Write End\n"));
break;
default :
break;
}
printf("\nPress Any key for Data compare\n");
Uart_getc();
DataRead_ForCompare_CH0(StartAddr);
DataCompare_HSMMC_CH0(uTxBufAddr, uCompareBufAddr, BlockNum_HSMMC_ch0 * 128);
BlockNum_HSMMC_ch0 = 0;
wt_cnt_HSMMC_ch0 = 0;
WriteBlockCnt_INT_ch0 = 0;
HS_DMA_END_ch0 = 0;
BufferBoundary_INT_Cnt_ch0 = 0;
CompareCnt_INT_ch0 = 0;
Compare_buffer_HSMMC_ch0 = 0;
}
unsigned int testNumber_CH0 = 0;
volatile U32 realStartAddr_CH0=0;
void HS_MMC_Write_AgingTest_CH0(void)
{
U32 i, j, StartAddr;
U32 TotalWriteByte=0, WriteBlockCnt =0;
wt_cnt_HSMMC_ch0=0;
BlockNum_HSMMC_ch0 = 0;
wt_cnt_HSMMC_ch0 = 0;
WriteBlockCnt_INT_ch0 = 0;
HS_DMA_END_ch0 = 0;
printf("\nSD/MMC block write test\n");
BlockNum_HSMMC_ch0 = 100;
testNumber_CH0 =0;
printf("\nPolling mode data write\n");
for(realStartAddr_CH0=0;realStartAddr_CH0<BlockNum_HSMMC_ch0*1000;realStartAddr_CH0=realStartAddr_CH0+BlockNum_HSMMC_ch0 )
{
StartAddr = realStartAddr_CH0 * 512;
printf( "Count : %d/8100 ,,, %x\n", realStartAddr_CH0, testNumber_CH0 );
SetBlockSizeReg_CH0(7, 512); // Maximum DMA Buffer Size, Block Size
SetBlockCountReg_CH0(BlockNum_HSMMC_ch0); // Block Numbers to Write
SetArgumentReg_CH0(StartAddr); // Card Address to Write
if(BlockNum_HSMMC_ch0 == 1)//single block
{
SetTransferModeReg_CH0(0, 0, 1, 1, 0);
SetCommandReg_CH0(24, 0);
}
else//multi block
{
SetTransferModeReg_CH0(1, 0, 1, 1, 0);
SetCommandReg_CH0(25, 0);
}
if (!WaitForCommandComplete_CH0())
{
printf("\nCommand is NOT completed\n");
}
ClearCommandCompleteStatus_CH0();
if (rHM0_NORINTSTS&0x8000)
printf("Command = %d, Error Stat = %x\n",(rHM0_CMDREG>>8),rHM0_ERRINTSTS);
for(j=0; j<BlockNum_HSMMC_ch0; j++)
{
if (!WaitForBufferWriteReady_CH0())
printf("WriteBuffer NOT Ready\n");
else
ClearBufferWriteReadyStatus_CH0();
for(i=0; i<512/4; i++)//512 byte should be writed.
{
rHM0_BDATA = testNumber_CH0++;
wt_cnt_HSMMC_ch0++;
}
WriteBlockCnt ++;
}
TotalWriteByte = wt_cnt_HSMMC_ch0 *4;
printf("\nWrite count=%dByte\n",TotalWriteByte);
if(!WaitForTransferComplete_CH0())
{
printf(("Transfer is NOT Complete\n"));
}
ClearTransferCompleteStatus_CH0();
while (!IsCardInProgrammingState_CH0());
}
}
void HS_MMC_ReadTest_CH0(void)
{
U32 i, j, StartAddr, OneBlockSize, Offset, Testmode, Addr_temp;
U32 TotalReadByte, WriteBlockCnt=0;
U32 status;
U32 transtime;
rd_cnt_HSMMC_ch0=0;
HS_DMA_END_ch0 = 0;
BlockNum_HSMMC_ch0 = 0;
rd_cnt_HSMMC_ch0 = 0;
ReadBlockCnt_INT_ch0 = 0;
printf("\nSD/MMC block Read test\n");
printf("\n0:Polling Read 1:Interrupt Read 2:DMA Read");
printf("\nSelect the test mode : ");
Testmode=GetIntNum();
printf("\nInput Write Start block number : ");
StartAddr = GetIntNum();
Addr_temp = StartAddr;
while((BlockNum_HSMMC_ch0 == 0) || (BlockNum_HSMMC_ch0 > 65535))
{
printf("Input number of block[1~4095] : ");
BlockNum_HSMMC_ch0 = GetIntNum();
}
if(SectorMode_ch0 == 1)
StartAddr = StartAddr;
else
StartAddr = StartAddr * 512;
OneBlockSize = Card_OneBlockSize_ver1;
Rx_buffer_HSMMC_ch0 = (U32 *)SDI_Rx_buffer_HSMMC_CH0;
for(i=0 ; i<(OneBlockSize*BlockNum_HSMMC_ch0)/4 ; i++)
*(Rx_buffer_HSMMC_ch0+i) = 0x0;
switch(Testmode)
{
case POL_Ver1:
printf("\nPolling mode data read\n");
while (!IsCardInProgrammingState_CH0());
SetBlockSizeReg_CH0(7, 512); // Maximum DMA Buffer Size, Block Size
SetBlockCountReg_CH0(BlockNum_HSMMC_ch0); // Block Numbers to Write
SetArgumentReg_CH0(StartAddr); // Card Address to Write
if(BlockNum_HSMMC_ch0 == 1)//single block
{
printf("Single block read\n");
SetTransferModeReg_CH0(0, 1, 0, 1, 0);
SetCommandReg_CH0(17, 0); // CMD17: Single-Read
}
else//multi block
{
printf("Multi block read\n");
SetTransferModeReg_CH0(1, 1, 1, 1, 0);
SetCommandReg_CH0(18, 0); // CMD18: Multi-Read
}
while (!WaitForCommandComplete_CH0());
ClearCommandCompleteStatus_CH0();
for(j=0; j<BlockNum_HSMMC_ch0; j++)
{
if (!WaitForBufferReadReady_CH0())
printf("ReadBuffer NOT Ready\n");
else
ClearBufferReadReadyStatus_CH0();
for(i=0; i<512/4; i++)
{
*Rx_buffer_HSMMC_ch0++ = rHM0_BDATA;
rd_cnt_HSMMC_ch0++;
}
WriteBlockCnt ++;
printf("\nWrite block count = %d", WriteBlockCnt);
}
TotalReadByte = wt_cnt_HSMMC_ch0 *4;
printf("\nWrite count=%dByte\n",TotalReadByte);
printf("\nWrite count=%x\n",rd_cnt_HSMMC_ch0);
if(!WaitForTransferComplete_CH0())
{
printf(("Transfer NOT Complete\n"));
}
ClearTransferCompleteStatus_CH0();
break;
case INT_Ver1:
printf("\Interrupt mode data Read\n");
pISR_SDI_0=(unsigned)HS_READ_INT_CH0;
SetBlockSizeReg_CH0(7, 512); // Maximum DMA Buffer Size, Block Size
SetBlockCountReg_CH0(BlockNum_HSMMC_ch0); // Block Numbers to Write
SetArgumentReg_CH0(StartAddr); // Card Address to Write
StartStopwatch();
if(BlockNum_HSMMC_ch0 == 1)//single block
{
SetTransferModeReg_CH0(0, 1, 0, 1, 0);
SetCommandReg_CH0(17, 0); // CMD17: Single-Read
}
else//multi block
{
SetTransferModeReg_CH0(1, 1, 1, 1, 0);
SetCommandReg_CH0(18, 0); // CMD18: Multi-Read
}
if (!WaitForCommandComplete_CH0());
ClearCommandCompleteStatus_CH0();
rINTMSK &= ~(BIT_SDI0);
rHM0_NORINTSIGEN = rHM0_NORINTSIGEN & ~(0xffff) | BUFFER_READREADY_SIG_INT_EN_CH0;
while(!READINT_DONE_ch0);
if(!WaitForTransferComplete_CH0())
{
printf(("Transfer NOT Complete\n"));
}
ClearTransferCompleteStatus_CH0();
transtime = EndStopwatch();
CalculationBPS_HSMMC_CH0(transtime);
printf("\nInterupt mode Read End\n");
break;
case DMA_Ver1:
pISR_SDI_0=(unsigned)HS_DMA_INT_CH0;
rINTMSK &= ~(BIT_SDI0);
rHM0_NORINTSTSEN &= ~(DMA_STS_INT_EN_CH0|BLOCKGAP_EVENT_STS_INT_EN_CH0);
rHM0_NORINTSIGEN = rHM0_NORINTSIGEN & ~(0xffff) | TRANSFERCOMPLETE_SIG_INT_EN_CH0;
SetSystemAddressReg_CH0(SDI_Rx_buffer_HSMMC_CH0);// AHB System Address For Write
SetBlockSizeReg_CH0(7, 512); // Maximum DMA Buffer Size, Block Size
SetBlockCountReg_CH0(BlockNum_HSMMC_ch0); // Block Numbers to Write
SetArgumentReg_CH0(StartAddr);// Card Start Block Address to Write
StartStopwatch();
if (BlockNum_HSMMC_ch0 == 1)
{
SetTransferModeReg_CH0(0, 1, 0, 1, 1);
SetCommandReg_CH0(17, 0); // CMD17: Single-Read
}
else
{
SetTransferModeReg_CH0(1, 1, 1, 1, 1);
SetCommandReg_CH0(18, 0); // CMD18: Multi-Read
}
if (!WaitForCommandComplete_CH0())
{
printf(("Command NOT Complete\n"));
}
else
ClearCommandCompleteStatus_CH0();
while(!HS_DMA_END_ch0);
transtime = EndStopwatch();
CalculationBPS_HSMMC_CH0(transtime);
printf(("\nDMA Read End\n"));
break;
default : break;
}
Rx_buffer_HSMMC_ch0 = (U32 *)SDI_Rx_buffer_HSMMC_CH0;
for(j=0 ; j<(OneBlockSize*BlockNum_HSMMC_ch0)/4 ; j++)
{
if(j%4 == 0)
printf("\n0x%04xh : ",Addr_temp);
printf("0x%08x ",*Rx_buffer_HSMMC_ch0++);
Addr_temp += 4;
}
printf("\n");
HS_DMA_END_ch0 = 0;
BlockNum_HSMMC_ch0 = 0;
rd_cnt_HSMMC_ch0 = 0;
ReadBlockCnt_INT_ch0 = 0;
}
void HS_MMC_EraseBlock_CH0(void)
{
U32 StartAddr, EndAddr;
U16 EraseBlockStartNum, EraseBlockEndNum;
printf("\nHigh speed MMC block erase test\n");
printf("\nInput Erase Start Block Number(ex 0, 1, 2 ...) : ");
EraseBlockStartNum = GetIntNum();
printf("Input Erase End Block Number(ex 0, 1, 2 ...) : ");
EraseBlockEndNum = GetIntNum();
if(ThisIsMmc_ch0 == 0)
{
SetArgumentReg_CH0(EraseBlockStartNum*512);
SetCommandReg_CH0(32, 0);
while (!WaitForCommandComplete_CH0());
ClearCommandCompleteStatus_CH0();
SetArgumentReg_CH0(EraseBlockEndNum*512);
SetCommandReg_CH0(33, 0);
while (!WaitForCommandComplete_CH0());
ClearCommandCompleteStatus_CH0();
}
else if(ThisIsMmc_ch0 == 1)
{
SetArgumentReg_CH0(EraseBlockStartNum*512);
SetCommandReg_CH0(35, 0);
while (!WaitForCommandComplete_CH0());
ClearCommandCompleteStatus_CH0();
SetArgumentReg_CH0(EraseBlockEndNum*512);
SetCommandReg_CH0(36, 0);
while (!WaitForCommandComplete_CH0());
ClearCommandCompleteStatus_CH0();
}
SetArgumentReg_CH0(0);
SetCommandReg_CH0(38, 0);
printf("\n[SD/TFlash card Erase Block Test...End]\n");
}
void HS_MMC_CardDetect_CH0(void)
{
//rGPJCON = (rGPJCON & ~(0x3<<28)) | (1<<29);
rHM0_CONTROL2 |= (1<<13)|(1<<12);//Card Detect using a DAT[3] signal
rHM0_NORINTSTSEN |= (1<<7)|(1<<6);
rHM0_NORINTSIGEN |= (1<<7)|(1<<6) ;
if(rHM0_PRNSTS & (1<<16))
{
HS_CARD_DETECT_ch0 = 1;
printf("\nCard is Inserted\n");
}
while(!HS_CARD_DETECT_ch0)
{
printf("\nInsert a Card\n");
HS_CARD_DETECT_ch0=0;
HS_MMC_Irq_CH0();
do {
printf(".");
Delay(5000);
} while(HS_CARD_DETECT_ch0==0);
}
HS_CARD_DETECT_ch0 = 0;
rHM0_CONTROL2 &= ~(1<<13);
}
int SetDataTransferWidth_CH0(void)
{
U8 ucSfr=0;
U8 uBitMode=0;
U32 uArg=0;
U8 m_ucHostCtrlReg = 0;
U32 BD_BUS_WIDTH, ucBusWidth;
printf("\nSelect the bus width 4-bit, 1-bit\n");
printf("\nType a bus width: ");
BD_BUS_WIDTH = GetIntNum();
switch (BD_BUS_WIDTH)
{
case 4:
ucBusWidth = 4;
break;
case 1:
ucBusWidth = 1;
break;
default :
ucBusWidth = 4;
break;
}
SetSdhcCardIntEnable_CH0(0); // Disable sd card interrupt
if(!ThisIsMmc_ch0)// <------------------------- SD Card Case
{
if (!IssueCommand_CH0(55, m_uRca_ch0, 0))
return 0;
else
{
if (ucBusWidth==1)
{
uBitMode = 0;
if (!IssueCommand_CH0(6, 0, 1)) // 1-bits
return 0;
}
else
{
uBitMode = 1;
if (!IssueCommand_CH0(6, 2, 1)) // 4-bits
return 0;
}
}
}
else // <-------------------------------- MMC Card Case
{
if (m_ucMMCSpecVer_ch0==4) // It is for a newest MMC Card
{
if (ucBusWidth==1)
uBitMode = 0;
else if (ucBusWidth==4)
uBitMode = 1;//4 // 4-bit bus
else
uBitMode = 2;//8-bit bus
uArg=((3<<24)|(183<<16)|(uBitMode<<8));
while(!IssueCommand_CH0(6, uArg, 0));
}
else
uBitMode = 0;
}
if (uBitMode==2)
{
m_ucHostCtrlReg &= 0xdf;
m_ucHostCtrlReg |= 1<<5;
}
else
{
m_ucHostCtrlReg &= 0xfd;
m_ucHostCtrlReg |= uBitMode<<1;
}
rHM0_HOSTCTL = m_ucHostCtrlReg;
SetSdhcCardIntEnable_CH0(1);
return 1;
}
void SetSdhcCardIntEnable_CH0(U8 ucTemp)
{
rHM0_NORINTSTSEN &= 0xFEFF;
rHM0_NORINTSTSEN |= (ucTemp<<8);
}
int SetSDOCR_CH0(void)
{
U32 i, OCR;
for(i=0; i<250; i++)
{
#if 1
IssueCommand_CH0(55, 0x0000, 0); // CMD55 (For ACMD)
IssueCommand_CH0(41, 0x40ff8000, 1); // (Ocr:2.7V~3.6V)
#else
IssueCommand_CH0(55, 0x0, 0); // CMD55 (For ACMD)
IssueCommand_CH0(41, 0x0, 1); // (Ocr:2.7V~3.6V)
OCR = rHM_RSPREG0 | (1<<30);
//printf("\nrHM_RSPREG0=%x",rHM_RSPREG0);
//Delay(1000);
IssueCommand_CH0(55, 0x0, 0); // CMD55 (For ACMD)
IssueCommand_CH0(41, OCR, 1); // (Ocr:2.7V~3.6V)
#endif
if (rHM0_RSPREG0&(0x1<<31))
{
if(rHM0_RSPREG0 & (1<<7))
printf("\nVoltage range : 1.65V ~ 1.95V");
if(rHM0_RSPREG0 & (1<<21))
printf("\nVoltage range: 2.7V ~ 3.4V\n\n");
else if(rHM0_RSPREG0 & (1<<20))
printf("\nVoltage range: 2.7V ~ 3.3V\n\n");
else if(rHM0_RSPREG0 & (1<<21))
printf("\nVoltage range: 2.7V ~ 3.4V\n\n");
else if(rHM0_RSPREG0 & (1<<23))
printf("\nVoltage range: 2.7V ~ 3.6V\n\n");
if(rHM0_RSPREG0&(0x1<<30))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -