📄 sdi.c
字号:
StartAddr = (StartAddr * 32 + 17)%4000;
EndAddr = StartAddr + 1;
// read and compare.-------------------------------------------------------------
OneBlockSize = Card_OneBlockSize;
Rx_buffer = (U32 *)SDI_Rx_buffer;
for(i=0 ; i<(OneBlockSize*BlockNum)/4 ; i++)
*(Rx_buffer+i) = 0x0;
//rSDIDSTA |= (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2);
rSDIDSTA = CRC_STAT_FAIL|RECEIVE_CRC_FAIL|DATA_TOUT|DATA_FINISH|BUSY_FINISH;
rSDIDCON = 0;
rSDIFSTA |= (1<<16); //FIFO reset
if(Wide==0)
rSDIDCON &= ~WIDE_BUS_EN;
else
rSDIDCON |= WIDE_BUS_EN;
rSDIDCON |=WORD_TRANSFER|RCV_AFTER_CMD|BLOCK_TRANSFER|BlockNum;
rSDIDCON |= DATA_RECEIVE_MODE|DATA_TRANSMIT_START;
rSDIDCON |=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN;
pISR_DMA0=(unsigned)DMA_end;
rINTMSK&=~(BIT_DMA0);
//rINTSUBMSK&=~(BIT_SUB_DMA0);
rDISRC0 = (U32)(SDIDAT);
rDISRCC0 = (1<<1) | (1<<0);
rDIDST0 = (int)(Rx_buffer);
rDIDSTC0 = (0<<1)|(0<<0);
rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
rDMASKTRIG0 = (0<<2)|(1<<1)|0; //no-stop, DMA0 channel on, no-sw trigger
rDMAREQSEL0 = (10 <<1) | 1;
do {// StartAddr * 512
SDIO_Command(StartAddr<<9, READ_SINGLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while(Check_CMDend(READ_SINGLE_BLOCK_CMD, 1) != 1);
rSDICSTA = DATA_TIMEOUT|CMD_END|RESP_END; // Clear cmd_end(with rsp)
while(!TR_end);
rINTMSK |= (BIT_DMA0);
//rINTSUBMSK |= (BIT_SUB_DMA0);
TR_end=0;
rDMASKTRIG0=(1<<2); //DMA0 stop
if(!Check_DATend())
printf("\nData End Error....\n");
sourceAddr = (unsigned int *)SDI_Tx_buffer;
Rx_buffer = (U32 *)SDI_Rx_buffer;
/* for(j=0 ; j<(OneBlockSize*BlockNum)/4 ; j=j+4)
{
if ( *Rx_buffer != *sourceAddr ) {
printf ("data error : %x, source : %x \n" , *Rx_buffer, *sourceAddr);
}
Rx_buffer++;
sourceAddr++;
}
*/
}
printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
}
void rwBigSigeIOTestRnd(void) {
unsigned int time;
int i,j,k,Offset=0;
int StartAddr=0;
int EndAddr=0; // temp start address is zero.
int OneBlockSize;
unsigned int * sourceAddr;
time = 0;
BlockNum = 1;
// 8(block count) * 256(k count) * 512(one block size) = 1Mb
for (k=0;k<2999999;k++) { // 100 MB
StartAddr = (StartAddr * 32 + 17)%4000;
EndAddr = StartAddr + 1;
// StartAddr = k*BlockNum;
TR_end = 0;
Tx_buffer = (U32 *)SDI_Tx_buffer;
for(i=0 ; i<(Card_OneBlockSize/4*BlockNum) ; i++)
*(Tx_buffer+i) = (i+Offset);
rSDIFSTA |=(1<<16); //FIFO reset
rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
rSDIDCON|=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN|BlockNum;
rSDIDCON|= DATA_TRANSMIT_MODE|DATA_TRANSMIT_START;
if(Wide!=0)
rSDIDCON |= WIDE_BUS_EN;
else
rSDIDCON &= ~WIDE_BUS_EN;
pISR_DMA0=(unsigned)DMA_end;
rINTMSK&=~(BIT_DMA0);
//rINTSUBMSK&=~(BIT_SUB_DMA0);
rDISRC0 = (int)(Tx_buffer);
rDISRCC0 = (0<<1) | (0<<0);
rDIDST0 = (U32)(SDIDAT);
rDIDSTC0 = (1<<1)|(1<<0);
rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
rDMASKTRIG0 = (0<<2)|(1<<1)|0; //no-stop, DMA0 channel on, no-sw trigger
rDMAREQSEL0 = (10 <<1) | 1;
Timer_Start(3);
if(BlockNum<2)//single block
{
do { // StartAddr * 512
SDIO_Command(StartAddr<<9, WRITE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while((Check_CMDend(WRITE_BLOCK_CMD, 1) !=1));
}
else//multi block
{
do {
SDIO_Command(StartAddr<<9, WRITE_MULTIPLE_BLOCK, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while((Check_CMDend(WRITE_MULTIPLE_BLOCK, 1) !=1));
}
while(!TR_end);
rINTMSK |= (1<<20);
rINTSUBMSK |= (1<<27);
TR_end=0;
rDMASKTRIG0 |=(1<<2);//DMA Stop
while(!Check_DATend2());
//printf("\nData End Error\n");
rSDIDCON=rSDIDCON&~(7<<12); //YH 040220, Clear Data Transfer mode => no operation, Cleata Data Transfer start
rSDIDSTA |= DATA_FINISH; // Clear data Tx/Rx end
if(BlockNum>1)
{
rSDIDCON=BUSY_AFTER_CMD|BLOCK_TRANSFER|WIDE_BUS_DIS|DATA_TRANSMIT_START|ONLYBUSY_CHECK|(BlockNum<<0);
do {
SDIO_Command(0, STOP_TRANSMISSION_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
} while(Check_CMDend(12, 1) != 1) ;
rSDICSTA = CMD_END|RESP_END; // Clear cmd_end(with rsp)
if(!Check_BUSYend())
printf("error\n");
rSDIDSTA|= DATA_FINISH; //! Should be cleared by writing '1'.
}
time=time+Timer_Stop();
Delay(200000);
// read and compare.-------------------------------------------------------------
OneBlockSize = Card_OneBlockSize;
Rx_buffer = (U32 *)SDI_Rx_buffer;
for(i=0 ; i<(OneBlockSize*BlockNum)/4 ; i++)
*(Rx_buffer+i) = 0x0;
//rSDIDSTA |= (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2);
rSDIDSTA = CRC_STAT_FAIL|RECEIVE_CRC_FAIL|DATA_TOUT|DATA_FINISH|BUSY_FINISH;
rSDIDCON = 0;
rSDIFSTA |= (1<<16); //FIFO reset
if(Wide==0)
rSDIDCON &= ~WIDE_BUS_EN;
else
rSDIDCON |= WIDE_BUS_EN;
rSDIDCON |=WORD_TRANSFER|RCV_AFTER_CMD|BLOCK_TRANSFER|BlockNum;
rSDIDCON |= DATA_RECEIVE_MODE|DATA_TRANSMIT_START;
rSDIDCON |=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN;
pISR_DMA0=(unsigned)DMA_end;
rINTMSK&=~(BIT_DMA0);
//rINTSUBMSK&=~(BIT_SUB_DMA0);
rDISRC0 = (U32)(SDIDAT);
rDISRCC0 = (1<<1) | (1<<0);
rDIDST0 = (int)(Rx_buffer);
rDIDSTC0 = (0<<1)|(0<<0);
rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
rDMASKTRIG0 = (0<<2)|(1<<1)|0; //no-stop, DMA0 channel on, no-sw trigger
rDMAREQSEL0 = (10 <<1) | 1;
do {// StartAddr * 512
SDIO_Command(StartAddr<<9, READ_SINGLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while(Check_CMDend(READ_SINGLE_BLOCK_CMD, 1) != 1);
rSDICSTA = DATA_TIMEOUT|CMD_END|RESP_END; // Clear cmd_end(with rsp)
while(!TR_end);
rINTMSK |= (BIT_DMA0);
//rINTSUBMSK |= (BIT_SUB_DMA0);
TR_end=0;
rDMASKTRIG0=(1<<2); //DMA0 stop
if(!Check_DATend())
printf("\nData End Error....\n");
sourceAddr = (unsigned int *)SDI_Tx_buffer;
Rx_buffer = (U32 *)SDI_Rx_buffer;
for(j=0 ; j<(OneBlockSize*BlockNum)/4 ; j=j+4)
{
if ( *Rx_buffer != *sourceAddr ) {
printf ("data error : %x, source : %x \n" , *Rx_buffer, *sourceAddr);
}
Rx_buffer++;
sourceAddr++;
}
}
printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
}
void writeBigSizeIOTest(void) {
unsigned int time;
int i,k,Offset=0;
int StartAddr=0,EndAddr=0; // temp start address is zero.
time = 0;
BlockNum = 4095;
// 8(block count) * 256(k count) * 512(one block size) = 1Mb
for (k=0;k<2;k++) {
StartAddr = k*BlockNum;
TR_end = 0;
Tx_buffer = (U32 *)SDI_Tx_buffer;
for(i=0 ; i<(Card_OneBlockSize/4*BlockNum) ; i++)
*(Tx_buffer+i) = (i+Offset);
rSDIFSTA |=(1<<16); //FIFO reset
rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
rSDIDCON|=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN|BlockNum;
rSDIDCON|= DATA_TRANSMIT_MODE|DATA_TRANSMIT_START;
if(Wide!=0)
rSDIDCON |= WIDE_BUS_EN;
else
rSDIDCON &= ~WIDE_BUS_EN;
pISR_DMA0=(unsigned)DMA_end;
rINTMSK&=~(BIT_DMA0);
//rINTSUBMSK&=~(BIT_SUB_DMA0);
rDISRC0 = (int)(Tx_buffer);
rDISRCC0 = (0<<1) | (0<<0);
rDIDST0 = (U32)(SDIDAT);
rDIDSTC0 = (1<<1)|(1<<0);
rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
rDMASKTRIG0 = (0<<2)|(1<<1)|0; //no-stop, DMA0 channel on, no-sw trigger
rDMAREQSEL0 = (10 <<1) | 1;
Timer_Start(3);
if(BlockNum<2)//single block
{
do { // StartAddr * 512
SDIO_Command(StartAddr<<9, WRITE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while((Check_CMDend(WRITE_BLOCK_CMD, 1) !=1));
}
else//multi block
{
do {
SDIO_Command(StartAddr<<9, WRITE_MULTIPLE_BLOCK, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while((Check_CMDend(WRITE_MULTIPLE_BLOCK, 1) !=1));
}
while(!TR_end);
rINTMSK |= (1<<20);
rINTSUBMSK |= (1<<27);
TR_end=0;
rDMASKTRIG0 |=(1<<2);//DMA Stop
while(!Check_DATend()) ;
//printf("\nData End Error\n");
rSDIDCON=rSDIDCON&~(7<<12); //YH 040220, Clear Data Transfer mode => no operation, Cleata Data Transfer start
rSDIDSTA |= DATA_FINISH; // Clear data Tx/Rx end
if(BlockNum>1)
{
rSDIDCON=BUSY_AFTER_CMD|BLOCK_TRANSFER|WIDE_BUS_DIS|DATA_TRANSMIT_START|ONLYBUSY_CHECK|(BlockNum<<0);
do {
SDIO_Command(0, STOP_TRANSMISSION_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITHOUT_DATA);
} while(Check_CMDend(12, 1) != 1) ;
rSDICSTA = CMD_END|RESP_END; // Clear cmd_end(with rsp)
if(!Check_BUSYend())
printf("error\n");
rSDIDSTA|= DATA_FINISH; //! Should be cleared by writing '1'.
}
time=time+Timer_Stop();
}
printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
}
void readBigSizeIOTest(void) {
int StartAddr = 0;
int OneBlockSize;
int Addr_temp;
unsigned int * sourceAddr;
int i,j,k;
int time;
BlockNum = 4095;
time = 0;
// 8(block count) * 256(k count) * 512(one block size) = 1Mb
for(k=0;k<2;k++) {
rd_cnt=0;
StartAddr = k*BlockNum;
Addr_temp = StartAddr;
while((BlockNum == 0) || (BlockNum > 4096))
{
printf("Input Read Block Number[1~4096] : ");
BlockNum = GetIntNum();
}
OneBlockSize = Card_OneBlockSize;
Rx_buffer = (U32 *)SDI_Rx_buffer;
for(i=0 ; i<(OneBlockSize*BlockNum)/4 ; i++)
*(Rx_buffer+i) = 0x0;
//rSDIDSTA |= (1<<7)|(1<<6)|(1<<5)|(1<<4)|(1<<3)|(1<<2);
rSDIDSTA = CRC_STAT_FAIL|RECEIVE_CRC_FAIL|DATA_TOUT|DATA_FINISH|BUSY_FINISH;
rSDIDCON = 0;
rSDIFSTA |= (1<<16); //FIFO reset
if(Wide==0)
rSDIDCON &= ~WIDE_BUS_EN;
else
rSDIDCON |= WIDE_BUS_EN;
rSDIDCON |=WORD_TRANSFER|RCV_AFTER_CMD|BLOCK_TRANSFER|BlockNum;
rSDIDCON |= DATA_RECEIVE_MODE|DATA_TRANSMIT_START;
rSDIDCON |=BURST4_EN|WORD_TRANSFER|TRANS_AFTER_RESP|BLOCK_TRANSFER|DMA_EN;
pISR_DMA0=(unsigned)DMA_end;
rINTMSK&=~(BIT_DMA0);
//rINTSUBMSK&=~(BIT_SUB_DMA0);
rDISRC0 = (U32)(SDIDAT);
rDISRCC0 = (1<<1) | (1<<0);
rDIDST0 = (int)(Rx_buffer);
rDIDSTC0 = (0<<1)|(0<<0);
rDCON0 = (1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(2<<20) | (128*BlockNum)/4;
rDMASKTRIG0 = (0<<2)|(1<<1)|0; //no-stop, DMA0 channel on, no-sw trigger
rDMAREQSEL0 = (10 <<1) | 1;
Timer_Start(3);
if(BlockNum<2)
{
do {// StartAddr * 512
SDIO_Command(StartAddr<<9, READ_SINGLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while(Check_CMDend(READ_SINGLE_BLOCK_CMD, 1) != 1);
}
else
{
do {
SDIO_Command(StartAddr<<9, READ_MULTIPLE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while(Check_CMDend(READ_MULTIPLE_BLOCK_CMD, 1) != 1);
}
rSDICSTA = DATA_TIMEOUT|CMD_END|RESP_END; // Clear cmd_end(with rsp)
while(!TR_end);
rINTMSK |= (BIT_DMA0);
//rINTSUBMSK |= (BIT_SUB_DMA0);
TR_end=0;
rDMASKTRIG0=(1<<2); //DMA0 stop
if(!Check_DATend())
printf("\nData End Error....\n");
if(BlockNum>1)
{
do {
SDIO_Command(0, STOP_TRANSMISSION_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while(Check_CMDend(STOP_TRANSMISSION_CMD, 1) != 1);
rSDICSTA = CMD_END|RESP_END;; // Clear cmd_end(with rsp)
}
time = time + Timer_Stop();
sourceAddr = (unsigned int *)SDI_Tx_buffer;
Rx_buffer = (U32 *)SDI_Rx_buffer;
for(j=0 ; j<(OneBlockSize*BlockNum)/4 ; j=j+4)
{
if ( *Rx_buffer != *sourceAddr ) {
printf ("data error : %x, source : %x \n" , *Rx_buffer, *sourceAddr);
}
Rx_buffer++;
sourceAddr++;
// printf("\n0x%04xh : ",Addr_temp);
// printf("0x%08x ",*Rx_buffer++);
// Addr_temp += 4;
}
}
printf ("TIME is : %d us, Block Count:%d\n", time<<7, BlockNum);
printf ( "Transfer Rate is : %f MB per sec \n", ((float)((BlockNum*k)<<9)) / ((float)(time<<7)) );
// printf ("TIME is : %d us\n", time<<7); // time is 1/128 mux
// printf ( "Transfer Rate is : %f MB per sec \n", ((float)(BlockNum<<9)) / ((float)(time<<7)) );
}
void SDIO_WriteTest(void)
{
U32 i, StartAddr, Offset, Testmode;
unsigned int time;
unsigned int timeout_count;
U32 status;
U32 timpcount;
wt_cnt=0;
printf("\nSD/MMC block write test\n");
printf("\n0:Polling write 1:Interrupt write 2:DMA write");
printf("\nSelect the test mode : ");
Testmode=GetIntNum();
printf("\nInput Write Start Address : ");
StartAddr = GetIntNum();
while((BlockNum == 0) || (BlockNum > 4096))
{
printf("Input Write Block Number[1~4095] : ");
BlockNum = GetIntNum();
}
printf("Input Write Data Offset : ");
Offset = GetIntNum();
// 葛滴 瘤款促.
// eraseBlock_beforewrite( StartAddr<<7, (StartAddr+BlockNum)<<7 );
Tx_buffer = (U32 *)SDI_Tx_buffer;
for(i=0 ; i<(Card_OneBlockSize/4*BlockNum) ; i++)
*(Tx_buffer+i) = (i+Offset);
rSDIFSTA |=(1<<16); //FIFO reset
// rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
// timeout_count =0;
Delay(10); // wait until FIFO reset.
switch(Testmode)
{
case POL:
// printf("\nPolling mode data write\n");
rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(BlockNum<<0);
Timer_Start(3);
if(BlockNum<2)//single block
{
do { // StartAddr * 512
SDIO_Command(StartAddr<<9, WRITE_BLOCK_CMD, SDIO_WAIT_RESP, SDIO_SHORT_RESP, SDIO_WITH_DATA);
} while((Check_CMDend(WRITE_BLOCK_CMD, 1) !=1));
}
else//multi block
{
do {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -