sdi.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:27k
源码类别:

uCOS

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "def.h"
  4. #include "option.h"
  5. #include "2440addr.h"
  6. #include "2440lib.h"
  7. #include "sdi.h"
  8. //YH 0811#define INICLK 300000
  9. #define INICLK 300000
  10. //#define NORCLK 25000000
  11. #define SDCLK 24000000 //PCLK=49.392MHz
  12. #define MMCCLK 15000000 //PCLK=49.392MHz
  13. #define POL 0
  14. #define INT 1
  15. #define DMA 2
  16. int CMD13(void);    // Send card status
  17. int CMD9(void);
  18. // Global variables
  19. //YH 0728 int *Tx_buffer; //128[word]*16[blk]=8192[byte]
  20. //YH 0728 int *Rx_buffer; //128[word]*16[blk]=8192[byte]
  21. unsigned int *Tx_buffer; //128[word]*16[blk]=8192[byte]
  22. unsigned int *Rx_buffer; //128[word]*16[blk]=8192[byte]
  23. volatile unsigned int rd_cnt;
  24. volatile unsigned int wt_cnt;
  25. volatile unsigned int block;
  26. volatile unsigned int TR_end=0;
  27. int Wide=0; // 0:1bit, 1:4bit
  28. int MMC=0;  // 0:SD  , 1:MMC
  29. int  Maker_ID;
  30. char Product_Name[7]; 
  31. int  Serial_Num;
  32. volatile int RCA;
  33. void Test_SDI(void)
  34. {
  35. U32 save_rGPEUP, save_rGPECON;
  36. int k;
  37.     RCA=0;
  38.     MMC=0;
  39.     block=3072;   //3072Blocks=1.5MByte, ((2Block=1024Byte)*1024Block=1MByte)
  40. //    block=13;
  41. save_rGPEUP=rGPEUP;
  42. save_rGPECON=rGPECON;
  43.     rGPEUP  = 0xf83f;     // SDCMD, SDDAT[3:0] => PU En.
  44.     rGPECON = 0xaaaaaaaa; //SDCMD, SDDAT[3:0]
  45. //    rGPECON = 0xaaa800aa; //SDCMD, SDDAT[3:0] => Input
  46.     Uart_Printf("n[SDI test]n");
  47.     
  48.     if(!SD_card_init())
  49. return;
  50.     
  51.     TR_Buf_new();
  52. /*
  53. INOM:    
  54.     //Uart_Printf("How many blocks to test?(1~16)?");
  55.     block=(U32)Uart_GetIntNum();
  56.     if((block==0)|block>16)
  57. goto INOM;
  58.     //block=1;//tark
  59.     //Uart_Printf("n");
  60. */
  61.     //CMD13();
  62. //YH 040227
  63. // for(k=0;k<4;k++)
  64.     Wt_Block();
  65.     Rd_Block();
  66.     View_Rx_buf();
  67.     if(MMC)
  68. TR_Buf_new();
  69.     
  70.     if(MMC)
  71.     {
  72. rSDICON |=(1<<5);    // YH 0519, MMC Type SDCLK
  73. Wt_Stream();
  74. Rd_Stream();
  75. View_Rx_buf();
  76.     }
  77.     Card_sel_desel(0); // Card deselect
  78.     if(!CMD9())
  79. Uart_Printf("Get CSD fail!!!n");
  80.     rSDIDCON=0;//tark???
  81.     rSDICSTA=0xffff;
  82. rGPEUP=save_rGPEUP;
  83. rGPECON=save_rGPECON;
  84. }
  85. void TR_Buf_new(void)
  86. {
  87.     //-- Tx & Rx Buffer initialize
  88.     int i, j;
  89.     int start = 0x03020100;
  90.     Tx_buffer=(unsigned int *)0x31000000;
  91.     j=0;
  92.     for(i=0;i<2048;i++) //128[word]*16[blk]=8192[byte]
  93. *(Tx_buffer+i)=i+j;
  94. // *(Tx_buffer+i)=0x5555aaaa;
  95.     Flush_Rx_buf();
  96. /*
  97.     for(i=0;i<20;i++){
  98.         for(j=0;j<128;j++){
  99. Tx_buffer[j+i*128]=start;
  100. if(j % 64 == 63) start = 0x0302010;
  101. else start = start + 0x04040404;
  102.         }
  103.         start = 0x03020100;
  104.     }
  105. */
  106. }
  107. void Flush_Rx_buf(void)
  108. {
  109.     //-- Flushing Rx buffer 
  110.     int i;
  111.     Rx_buffer=(unsigned int *)0x31800000;
  112.     for(i=0;i<2048;i++) //128[word]*16[blk]=8192[byte]
  113. *(Rx_buffer+i)=0;
  114.     Uart_Printf("n--End Rx buffer flushn");
  115. }
  116. void View_Rx_buf()
  117. {
  118.     //-- Display Rx buffer 
  119.     int i,error=0;
  120.     Tx_buffer=(unsigned int *)0x31000000;
  121.     Rx_buffer=(unsigned int *)0x31800000;
  122.     Uart_Printf("Check Rx datan");
  123.     for(i=0;i<128*block;i++)
  124.     {
  125.         if(Rx_buffer[i] != Tx_buffer[i])
  126. {
  127.     Uart_Printf("nTx/Rx errorn"); 
  128.     Uart_Printf("%d:Tx-0x%08x, Rx-0x%08xn",i,Tx_buffer[i], Rx_buffer[i]);
  129.     error=1;
  130.     break;
  131.         }
  132. //YH 040227 Uart_Printf(".");
  133.     }
  134.     if(!error)
  135. Uart_Printf(" O.K.n");
  136. }
  137. void View_Tx_buf(void)
  138. {
  139.     //-- Display Tx buffer 
  140.     int i;
  141.     //for(i=0;i<2048;i++)
  142. //Uart_Printf("TB[%02x]=%x,",Tx_buffer[i]);
  143. }
  144. int SD_card_init(void)
  145. {
  146. //-- SD controller & card initialize 
  147.     int i;
  148.     char key;
  149.     /* Important notice for MMC test condition */
  150.     /* Cmd & Data lines must be enabled by pull up resister */
  151. //YH 0816, Org    rSDIPRE=PCLK/(2*INICLK)-1; // 400KHz
  152.     rSDIPRE=PCLK/(INICLK)-1; // 400KHz
  153. Uart_Printf("Init. Frequency is %dHzn",(PCLK/(rSDIPRE+1)));
  154.     
  155. //    rSDICON=(1<<4)|(1<<1)|1; // Type B, FIFO reset, clk enable
  156. rSDICON=(1<<4)|1; // Type B, clk enable
  157. rSDIFSTA=rSDIFSTA|(1<<16); //YH 040223 FIFO reset
  158.     rSDIBSIZE=0x200; // 512byte(128word)
  159.     rSDIDTIMER=0x7fffff; // Set timeout count
  160.     for(i=0;i<0x1000;i++);  // Wait 74SDCLK for MMC card
  161.     //Uart_Printf("rSDIRSP0=0x%xn",rSDIRSP0);
  162.     CMD0();
  163.     Uart_Printf("nIn idlen");
  164.     //-- Check MMC card OCR
  165.     if(Chk_MMC_OCR()) 
  166.     {
  167. Uart_Printf("nIn MMC readyn");
  168. MMC=1;
  169. goto RECMD2;
  170.     }
  171.     Uart_Printf("MMC check end!!n");
  172.     //-- Check SD card OCR
  173.     if(Chk_SD_OCR()) 
  174.         Uart_Printf("nIn SD readyn");
  175.     else
  176.     {
  177. Uart_Printf("nInitialize failnNo Card assertionn");
  178.         return 0;
  179.     }
  180. RECMD2:
  181.     //-- Check attaced cards, it makes card identification state
  182.     rSDICARG=0x0;   // CMD2(stuff bit)
  183.     rSDICCON=(0x1<<10)|(0x1<<9)|(0x1<<8)|0x42; //lng_resp, wait_resp, start, CMD2
  184.     //-- Check end of CMD2
  185.     if(!Chk_CMDend(2, 1)) 
  186. goto RECMD2;
  187.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  188.     Uart_Printf("nEnd idn");
  189. RECMD3:
  190.     //--Send RCA
  191.     rSDICARG=MMC<<16;     // CMD3(MMC:Set RCA, SD:Ask RCA-->SBZ)
  192.     rSDICCON=(0x1<<9)|(0x1<<8)|0x43; // sht_resp, wait_resp, start, CMD3
  193.     //-- Check end of CMD3
  194.     if(!Chk_CMDend(3, 1)) 
  195. goto RECMD3;
  196.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  197.     //--Publish RCA
  198.     if(MMC) {
  199. RCA=1;
  200. //YH 0812        rSDIPRE=(PCLK/(MMCCLK)+1)-1; // YH 0716, Normal clock=20MHz
  201.         rSDIPRE=(PCLK/MMCCLK)-1; // YH 0812, Normal clock=20MHz
  202.         Uart_Printf("MMC Frequency is %dHzn",(PCLK/(rSDIPRE+1)));
  203.      }
  204.     else 
  205.      {
  206. RCA=( rSDIRSP0 & 0xffff0000 )>>16;
  207.     Uart_Printf("RCA=0x%xn",RCA);
  208. rSDIPRE=PCLK/(SDCLK)-1; // Normal clock=25MHz
  209. Uart_Printf("SD Frequency is %dHzn",(PCLK/(rSDIPRE+1)));
  210.      } //YH 0716
  211.     //--State(stand-by) check
  212.     if( rSDIRSP0 & 0x1e00!=0x600 )  // CURRENT_STATE check
  213. goto RECMD3;
  214.     
  215.     Uart_Printf("nIn stand-byn");
  216.     
  217. //    rSDIPRE=PCLK/(2*NORCLK)-1; // Normal clock=25MHz
  218. //YH 0716    rSDIPRE=PCLK/(SDCLK)-1; // Normal clock=25MHz
  219. //YH 0716    //Uart_Printf("SD Frequency is %dMHzn",(PCLK/(rSDIPRE+1)));
  220.     Card_sel_desel(1); // Select
  221.     if(!MMC)
  222. Set_4bit_bus();
  223.     else
  224. Set_1bit_bus();
  225.     return 1;
  226. }
  227. void Card_sel_desel(char sel_desel)
  228. {
  229.     //-- Card select or deselect
  230.     if(sel_desel)
  231.     {
  232. RECMDS7:
  233. rSDICARG=RCA<<16; // CMD7(RCA,stuff bit)
  234. rSDICCON= (0x1<<9)|(0x1<<8)|0x47;   // sht_resp, wait_resp, start, CMD7
  235. //-- Check end of CMD7
  236. if(!Chk_CMDend(7, 1))
  237.     goto RECMDS7;
  238. rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  239. //--State(transfer) check
  240. if( rSDIRSP0 & 0x1e00!=0x800 )
  241.     goto RECMDS7;
  242.     }
  243.     else
  244.     {
  245. RECMDD7:
  246. rSDICARG=0<<16; //CMD7(RCA,stuff bit)
  247. rSDICCON=(0x1<<8)|0x47; //no_resp, start, CMD7
  248. //-- Check end of CMD7
  249. if(!Chk_CMDend(7, 0))
  250.     goto RECMDD7;
  251. rSDICSTA=0x800; // Clear cmd_end(no rsp)
  252.     }
  253. }
  254. void __irq Rd_Int(void)
  255. {
  256.     U32 i,status;
  257.     status=rSDIFSTA;
  258.     if( (status&0x200) == 0x200 ) // Check Last interrupt?
  259.     {
  260. for(i=(status & 0x7f)/4;i>0;i--)
  261. {
  262.     *Rx_buffer++=rSDIDAT;
  263.     rd_cnt++;
  264. }
  265. // Uart_Printf("status1=0x%xn", status);
  266. // status=rSDIFSTA&0x200; //If you do like this, rSDIFSTA register will not be updated., YH 040221
  267. rSDIFSTA=rSDIFSTA&0x200; //Clear Rx FIFO Last data Ready, YH 040221
  268. // Uart_Printf("rSDIFSTA=0x%xn", rSDIFSTA);
  269.     }
  270.     else if( (status&0x80) == 0x80 ) // Check Half interrupt?
  271.     {
  272.         for(i=0;i<8;i++)
  273.         {
  274.          *Rx_buffer++=rSDIDAT;
  275.     rd_cnt++;
  276. }
  277.     }
  278. // Uart_Printf("rSDIFSTA=0x%xn", rSDIFSTA); //YH 040221
  279.     ClearPending(BIT_SDI);
  280. }
  281. void __irq Wt_Int(void)
  282. {
  283.     ClearPending(BIT_SDI);
  284.     rSDIDAT=*Tx_buffer++;
  285.     wt_cnt++;
  286.     if(wt_cnt==128*block)
  287.     {
  288. rINTMSK |= BIT_SDI;
  289. rSDIDAT=*Tx_buffer;
  290. TR_end=1;
  291.     }
  292. }
  293. void __irq DMA_end(void)
  294. {
  295.     ClearPending(BIT_DMA0);
  296.     
  297.     TR_end=1;
  298. }
  299. void Rd_Block(void)
  300. {
  301.     U32 mode;
  302.     int status;
  303.     rd_cnt=0;    
  304.     Uart_Printf("[Block read test]n");
  305. RE0:
  306.     Uart_Printf("0:Polling read   1:Interrupt read   2:DMA readnSelect the test mode?");
  307.     mode=(U32)Uart_GetIntNum();
  308. Uart_Printf("n");
  309.     if(mode>2)
  310. goto RE0;
  311. //    rSDICON = rSDICON|(1<<1); // FIFO reset
  312. rSDIFSTA=rSDIFSTA|(1<<16); // FIFO reset
  313.     if(mode!=2)
  314. rSDIDCON=(2<<22)|(1<<19)|(1<<17)|(Wide<<16)|(1<<14)|(2<<12)|(block<<0); //YH 040220
  315. //Word Rx, Rx after cmd, blk, 4bit bus, Rx start, blk num, data start, data transmit mode
  316.     rSDICARG=0x0; // CMD17/18(addr)
  317. RERDCMD:
  318.     switch(mode)
  319.     {
  320. case POL:
  321.     if(block<2) // SINGLE_READ
  322.     {
  323. rSDICCON=(0x1<<9)|(0x1<<8)|0x51;    // sht_resp, wait_resp, dat, start, CMD17
  324. if(!Chk_CMDend(17, 1)) //-- Check end of CMD17
  325.     goto RERDCMD;     
  326.     }
  327.     else // MULTI_READ
  328.     {
  329. rSDICCON=(0x1<<9)|(0x1<<8)|0x52;    // sht_resp, wait_resp, dat, start, CMD18
  330. if(!Chk_CMDend(18, 1)) //-- Check end of CMD18 
  331.     goto RERDCMD;
  332.     }
  333.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)     
  334.     while(rd_cnt<128*block) // 512*block bytes
  335.     {
  336. if((rSDIDSTA&0x20)==0x20) // Check timeout 
  337. {
  338.     rSDIDSTA=(0x1<<0x5);  // Clear timeout flag
  339.     break;
  340. }
  341. status=rSDIFSTA;
  342. if((status&0x1000)==0x1000) // Is Rx data?
  343. {
  344.     *Rx_buffer++=rSDIDAT;
  345.     rd_cnt++;
  346. }
  347.     }
  348.     break;
  349. case INT:
  350.     pISR_SDI=(unsigned)Rd_Int;
  351.     rINTMSK = ~(BIT_SDI);
  352.     
  353.     rSDIIMSK=5; // Last & Rx FIFO half int.
  354.     if(block<2) // SINGLE_READ
  355.     {
  356. rSDICCON=(0x1<<9)|(0x1<<8)|0x51;    // sht_resp, wait_resp, dat, start, CMD17
  357. if(!Chk_CMDend(17, 1)) //-- Check end of CMD17
  358.     goto RERDCMD;     
  359.     }
  360.     else // MULTI_READ
  361.     {
  362. rSDICCON=(0x1<<9)|(0x1<<8)|0x52;    // sht_resp, wait_resp, dat, start, CMD18
  363. if(!Chk_CMDend(18, 1)) //-- Check end of CMD18 
  364.     goto RERDCMD;
  365.     }
  366.     
  367.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  368.     while(rd_cnt<128*block);
  369.     rINTMSK |= (BIT_SDI);
  370.     rSDIIMSK=0; // All mask
  371.     break;
  372. case DMA:
  373.     pISR_DMA0=(unsigned)DMA_end;
  374.     rINTMSK = ~(BIT_DMA0);
  375. rSDIDCON=rSDIDCON|(1<<24); //YH 040227, Burst4 Enable
  376.     rDISRC0=(int)(SDIDAT); // SDIDAT
  377.     rDISRCC0=(1<<1)+(1<<0); // APB, fix
  378.     rDIDST0=(U32)(Rx_buffer); // Rx_buffer
  379.     rDIDSTC0=(0<<1)+(0<<0); // AHB, inc
  380.     rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;
  381.     //handshake, sync PCLK, TC int, single tx, single service, SDI, H/W request, 
  382.     //auto-reload off, word, 128blk*num
  383.     rDMASKTRIG0=(0<<2)+(1<<1)+0;    //no-stop, DMA2 channel on, no-sw trigger 
  384. //     rSDIDCON=(2<<22)|(1<<19)|(1<<17)|(Wide<<16)|(1<<15)|(2<<12)|(block<<0);
  385.     rSDIDCON=(2<<22)|(1<<19)|(1<<17)|(Wide<<16)|(1<<15)|(1<<14)|(2<<12)|(block<<0);
  386.     // Word Rx, Rx after rsp, blk, 4bit bus, dma enable, Rx start, blk num, Data start, data receive mode, YH 040220
  387.     if(block<2) // SINGLE_READ
  388.     {
  389. rSDICCON=(0x1<<9)|(0x1<<8)|0x51;    // sht_resp, wait_resp, dat, start, CMD17
  390. if(!Chk_CMDend(17, 1)) //-- Check end of CMD17
  391.     goto RERDCMD;     
  392.     }
  393.     else // MULTI_READ
  394.     {
  395. rSDICCON=(0x1<<9)|(0x1<<8)|0x52;    // sht_resp, wait_resp, dat, start, CMD18
  396. if(!Chk_CMDend(18, 1)) //-- Check end of CMD18 
  397.     goto RERDCMD;
  398.     }
  399.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  400.     while(!TR_end);
  401. //Uart_Printf("rSDIFSTA=0x%xn",rSDIFSTA);
  402.     rINTMSK |= (BIT_DMA0);
  403.     TR_end=0;
  404.     rDMASKTRIG0=(1<<2); //DMA0 stop
  405.     break;
  406. default:
  407.     break;
  408.     }
  409.     //-- Check end of DATA
  410.     if(!Chk_DATend()) 
  411. Uart_Printf("dat errorn");
  412. rSDIDCON=rSDIDCON&~(7<<12); //YH 040220, Clear Data Transfer mode => no operation, Cleata Data Transfer start
  413. rSDIFSTA=rSDIFSTA&0x200; //Clear Rx FIFO Last data Ready, YH 040221
  414.     rSDIDSTA=0x10; // Clear data Tx/Rx end detect
  415.     if(block>1)
  416.     {
  417. RERCMD12:    
  418. //--Stop cmd(CMD12)
  419. rSDICARG=0x0;     //CMD12(stuff bit)
  420. rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;//sht_resp, wait_resp, start, CMD12
  421. //-- Check end of CMD12
  422. if(!Chk_CMDend(12, 1)) 
  423.     goto RERCMD12;
  424. rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  425.     }
  426. }
  427. void Rd_Stream(void) // only for MMC, 3blk read
  428. {
  429.     int i;
  430.     int status, rd_cnt=0;
  431.     if(MMC!=1)
  432.     {
  433. Uart_Printf("Stream read command supports only MMC!n");
  434. return;
  435.     }    
  436.     Uart_Printf("n[Stream read test]n");
  437.     
  438. RECMD11:
  439. //    rSDIDCON=(2<<22)|(1<<19)|(0<<17)|(0<<16)|(2<<12);
  440.   rSDIDCON=(2<<22)|(1<<19)|(0<<17)|(0<<16)|(1<<14)|(2<<12);
  441.     rSDICARG=0x0;   // CMD11(addr)
  442.     rSDICCON=(0x1<<9)|(0x1<<8)|0x4b;   //sht_resp, wait_resp, dat, start, CMD11
  443.     while(rd_cnt<128*block)
  444.     {
  445. if( (rSDIDSTA&0x20) == 0x20 )
  446. {
  447.     Uart_Printf("Rread timeout error");
  448.     return ;
  449. }
  450.     
  451. status=rSDIFSTA;
  452. if((status&0x1000)==0x1000)
  453. {
  454.     //*Rx_buffer++=rSDIDAT;
  455.     //rd_cnt++;
  456.     Rx_buffer[rd_cnt++]=rSDIDAT;
  457. }
  458.     }
  459.     //-- Check end of CMD11
  460.     if(!Chk_CMDend(11, 1)) 
  461. goto RECMD11;
  462.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  463.     //-- Check end of DATA
  464. //    rSDIDCON=(2<<22)|(1<<19)|(0<<17)|(0<<16)|(1<<14)|(0<<12);
  465.     rSDIDCON=(2<<22)|(1<<19)|(0<<17)|(0<<16); //YH 040220
  466.     rSDIDCON=rSDIDCON&~(7<<12); //YH 040220, no operation, data ready
  467.     while( rSDIDSTA&0x3 !=0x0 );
  468.     if(rSDIDSTA!=0) 
  469. Uart_Printf("rSDIDSTA=0x%xn", rSDIDSTA);
  470.     rSDIDSTA=0xff; //YH 040221
  471. STRCMD12:    
  472.     //--Stop cmd(CMD12)
  473.     rSDICARG=0x0;     //CMD12(stuff bit)
  474.     rSDICCON=(0x1<<9)|(0x1<<8)|0x4c; //sht_resp, wait_resp, start, CMD12
  475.     //-- Check end of CMD12
  476.     if(!Chk_CMDend(12, 1)) 
  477. goto STRCMD12;
  478.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  479.     rSDIFSTA=rSDIFSTA&0x200; //Clear Rx FIFO Last data Ready, YH 040221
  480. /*
  481.     //-- Display Rx data
  482.     //Uart_Printf("nRx datan");
  483.     for(i=0;i<128*2;i++)
  484.     {
  485.         if(Rx_buffer[i] != Tx_buffer[i])
  486. {
  487.     //Uart_Printf("%08x, %08xn",Tx_buffer[i], Rx_buffer[i]);
  488.     break;
  489.         }
  490.     }
  491. */
  492. Uart_Printf("rSDIFSTA1=0x%xn", rSDIFSTA); //YH 040221
  493.    rSDIFSTA=rSDIFSTA&0x200; //Clear Rx FIFO Last data Ready, YH 040221
  494. Uart_Printf("rSDIFSTA2=0x%xn", rSDIFSTA); //YH 040221
  495.     Uart_Printf("n--End stream read testn");
  496. }
  497. void Wt_Block(void)
  498. {
  499.     U32 mode;
  500.     int i,status;
  501.     wt_cnt=0;    
  502.     Uart_Printf("[Block write test]n");
  503. RE1:
  504. Uart_Printf("0:Polling write   1:Interrupt write   2:DMA writenSelect the test mode?");
  505.     mode=(U32)Uart_GetIntNum();
  506.     if(mode>2)
  507. goto RE1;
  508. //    rSDICON |= rSDICON|(1<<1); // FIFO reset
  509. rSDIFSTA=rSDIFSTA|(1<<16); //YH 040223 FIFO reset
  510.     if(mode!=2)
  511. // rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(3<<12)|(block<<0);
  512. rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<14)|(3<<12)|(block<<0); //YH 040220
  513.     //Word Tx, Tx after rsp, blk, 4bit bus, Tx start, blk num
  514.     rSDICARG=0x0;     // CMD24/25(addr)
  515. REWTCMD:
  516.     switch(mode)
  517.     {
  518. case POL:
  519.     if(block<2) // SINGLE_WRITE
  520.     {
  521. rSDICCON=(0x1<<9)|(0x1<<8)|0x58; //sht_resp, wait_resp, dat, start, CMD24
  522. if(!Chk_CMDend(24, 1)) //-- Check end of CMD24
  523.     goto REWTCMD;
  524.     }
  525.     else // MULTI_WRITE
  526.     {
  527. rSDICCON=(0x1<<9)|(0x1<<8)|0x59; //sht_resp, wait_resp, dat, start, CMD25
  528. if(!Chk_CMDend(25, 1)) //-- Check end of CMD25
  529. goto REWTCMD;
  530.     }
  531.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  532.     
  533.     while(wt_cnt<128*block)
  534.     {
  535. status=rSDIFSTA;
  536. if((status&0x2000)==0x2000) 
  537. {
  538.     rSDIDAT=*Tx_buffer++;
  539.     wt_cnt++;
  540. //Uart_Printf("Block No.=%d, wt_cnt=%dn",block,wt_cnt);
  541. }
  542.     }
  543.     break;
  544. case INT:
  545.     pISR_SDI=(unsigned)Wt_Int;
  546.     rINTMSK = ~(BIT_SDI);
  547.     rSDIIMSK=0x10;  // Tx FIFO half int.
  548.     if(block<2)     // SINGLE_WRITE
  549.     {
  550. rSDICCON=(0x1<<9)|(0x1<<8)|0x58;    //sht_resp, wait_resp, dat, start, CMD24
  551. if(!Chk_CMDend(24, 1)) //-- Check end of CMD24
  552.     goto REWTCMD;
  553.     }
  554.     else     // MULTI_WRITE
  555.     {
  556. rSDICCON=(0x1<<9)|(0x1<<8)|0x59;    //sht_resp, wait_resp, dat, start, CMD25
  557. if(!Chk_CMDend(25, 1)) //-- Check end of CMD25 
  558.     goto REWTCMD;
  559.     }
  560.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  561.     while(!TR_end);
  562.     //while(wt_cnt<128);
  563.     rINTMSK |= (BIT_SDI);
  564.     TR_end=0;
  565.     rSDIIMSK=0; // All mask
  566.     break;
  567. case DMA:
  568.     pISR_DMA0=(unsigned)DMA_end;
  569.     rINTMSK = ~(BIT_DMA0);
  570. rSDIDCON=rSDIDCON|(1<<24); //YH 040227, Burst4 Enable
  571.     rDISRC0=(int)(Tx_buffer); // Tx_buffer
  572.     rDISRCC0=(0<<1)+(0<<0); // AHB, inc
  573.     rDIDST0=(U32)(SDIDAT); // SDIDAT
  574.     rDIDSTC0=(1<<1)+(1<<0); // APB, fix
  575.     rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;
  576.     //handshake, sync PCLK, TC int, single tx, single service, SDI, H/W request, 
  577.     //auto-reload off, word, 128blk*num
  578.     rDMASKTRIG0=(0<<2)+(1<<1)+0;    //no-stop, DMA0 channel on, no-sw trigger
  579.     
  580. //     rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<15)|(3<<12)|(block<<0);
  581. rSDIDCON=(2<<22)|(1<<20)|(1<<17)|(Wide<<16)|(1<<15)|(1<<14)|(3<<12)|(block<<0); //YH 040220
  582.     // Word Tx, Tx after rsp, blk, 4bit bus, dma enable, Tx start, blk num
  583.     if(block<2)     // SINGLE_WRITE
  584.     {
  585. rSDICCON=(0x1<<9)|(0x1<<8)|0x58;    //sht_resp, wait_resp, dat, start, CMD24
  586. if(!Chk_CMDend(24, 1)) //-- Check end of CMD24
  587.     goto REWTCMD;     
  588.     }
  589.     else     // MULTI_WRITE
  590.     {
  591. rSDICCON=(0x1<<9)|(0x1<<8)|0x59;    //sht_resp, wait_resp, dat, start, CMD25
  592. if(!Chk_CMDend(25, 1)) //-- Check end of CMD25 
  593.     goto REWTCMD;     
  594.     }
  595.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  596.     while(!TR_end);
  597.     rINTMSK |= (BIT_DMA0);
  598.     TR_end=0;
  599.     rDMASKTRIG0=(1<<2); //DMA0 stop
  600.     break;
  601. default:
  602.     break;
  603.     }
  604.     
  605.     //-- Check end of DATA
  606.     if(!Chk_DATend()) 
  607. Uart_Printf("dat errorn");
  608. rSDIDCON=rSDIDCON&~(7<<12); //YH 040220, Clear Data Transfer mode => no operation, Cleata Data Transfer start
  609.     rSDIDSTA=0x10; // Clear data Tx/Rx end
  610.     if(block>1)
  611.     {
  612. //--Stop cmd(CMD12)
  613. REWCMD12:    
  614. // rSDIDCON=(1<<18)|(1<<17)|(0<<16)|(1<<12)|(block<<0);
  615. rSDIDCON=(1<<18)|(1<<17)|(0<<16)|(1<<14)|(1<<12)|(block<<0);  //YH  040220
  616. rSDICARG=0x0;     //CMD12(stuff bit)
  617. rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;    //sht_resp, wait_resp, start, CMD12
  618. //-- Check end of CMD12
  619. if(!Chk_CMDend(12, 1)) 
  620.     goto REWCMD12;
  621. rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  622. //-- Check end of DATA(with busy state)
  623. if(!Chk_BUSYend()) 
  624.     Uart_Printf("errorn");
  625. rSDIDSTA=0x08; //! Should be cleared by writing '1'.
  626.     }
  627. }
  628. void Wt_Stream(void) // only for MMC, 3blk write
  629. {
  630.     int status, wt_cnt=0;
  631.     if(MMC!=1)
  632.     {
  633. Uart_Printf("Stream write command supports only MMC!n");
  634. return;
  635.     }
  636.     Uart_Printf("n[Stream write test]n");
  637. RECMD20:
  638. //    rSDIDCON=(2<<22)|(1<<20)|(0<<17)|(0<<16)|(3<<12);  // stream mode
  639.     rSDIDCON=(2<<22)|(1<<20)|(0<<17)|(0<<16)|(1<<14)|(3<<12);  // stream mode
  640.     rSDICARG=0x0; // CMD20(addr)
  641.     rSDICCON=(0x1<<9)|(0x1<<8)|0x54;    //sht_resp, wait_resp, dat, start, CMD20
  642.     //-- Check end of CMD25
  643.     if(!Chk_CMDend(20, 1)) 
  644. goto RECMD20;
  645.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  646.     while(wt_cnt<128*block)
  647.     {
  648. status=rSDIFSTA;
  649. if((status&0x2000)==0x2000) 
  650.     rSDIDAT=Tx_buffer[wt_cnt++];
  651.     }
  652.     //-- Check end of DATA
  653.     while( rSDIFSTA&0x400 );
  654.     Delay(10);    // for the empty of DATA line(Hardware)
  655. //    rSDIDCON=(1<<20)|(0<<17)|(0<<16)|(1<<14)|(0<<12);
  656.     rSDIDCON=(1<<20)|(0<<17)|(0<<16); //YH 040220
  657.     rSDIDCON=rSDIDCON&~(7<<12); //YH 040220, no operation, data ready
  658.     while( (rSDIDSTA&0x3)!=0x0 );
  659.     if(rSDIDSTA!=0x0) 
  660. Uart_Printf("rSDIDSTA=0x%xn", rSDIDSTA);
  661.     rSDIDSTA=0xff; //Clear rSDIDSTA
  662. STWCMD12:    
  663.     //--Stop cmd(CMD12)
  664. //    rSDIDCON=(1<<18)|(1<<17)|(0<<16)|(1<<12);
  665.     rSDIDCON=(1<<18)|(1<<17)|(0<<16)|(1<<14)|(1<<12);
  666.     rSDICARG=0x0;     //CMD12(stuff bit)
  667.     rSDICCON=(0x1<<9)|(0x1<<8)|0x4c;   //sht_resp, wait_resp, start, CMD12
  668.     //-- Check end of CMD12
  669.     if(!Chk_CMDend(12, 1)) 
  670. goto STWCMD12;
  671.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  672.     //-- Check end of DATA(with busy state)
  673.     if(!Chk_BUSYend()) 
  674. Uart_Printf("errorn");
  675.     rSDIDSTA=0x08;
  676.     Uart_Printf("n--End Stream write testn");
  677. }
  678. int Chk_CMDend(int cmd, int be_resp)
  679. //0: Timeout
  680. {
  681.     int finish0;
  682.     if(!be_resp)    // No response
  683.     {
  684.      finish0=rSDICSTA;
  685. while((finish0&0x800)!=0x800) // Check cmd end
  686.     finish0=rSDICSTA;
  687. rSDICSTA=finish0;// Clear cmd end state
  688. return 1;
  689.     }
  690.     else // With response
  691.     {
  692.      finish0=rSDICSTA;
  693. while( !( ((finish0&0x200)==0x200) | ((finish0&0x400)==0x400) ))    // Check cmd/rsp end
  694. // while( !( ((finish0&0x200)==0x200) | ((finish0&0x400)==0x800) )) // Check cmd/rsp end
  695. // while((finish0&0x1800)!=0x1800) //YH 0811 Check cmd end
  696. // Uart_Printf("CMD%d:rSDICSTA=0x%xn", cmd, rSDICSTA); //YH 0811
  697. finish0=rSDICSTA;
  698. //YH 0624 if(cmd==1 | cmd==9 | cmd==41) // CRC no check
  699. if(cmd==1 | cmd==41) // CRC no check, CMD9 is a long Resp. command.
  700. {
  701.     if( (finish0&0xf00) != 0xa00 )  // Check error
  702.     {
  703. rSDICSTA=finish0;   // Clear error state
  704. if(((finish0&0x400)==0x400))
  705.     return 0; // Timeout error
  706.          }
  707.     rSDICSTA=finish0; // Clear cmd & rsp end state
  708. }
  709. else // CRC check
  710. {
  711.     if( (finish0&0x1f00) != 0xa00 ) // Check error
  712.     {
  713. Uart_Printf("CMD%d:rSDICSTA=0x%x, rSDIRSP0=0x%xn",cmd, rSDICSTA, rSDIRSP0);
  714. rSDICSTA=finish0;   // Clear error state
  715. if(((finish0&0x400)==0x400))
  716.     return 0; // Timeout error
  717.          }
  718.     rSDICSTA=finish0;
  719. }
  720. return 1;
  721.     }
  722. }
  723. int Chk_DATend(void)
  724. {
  725.     int finish;
  726.     finish=rSDIDSTA;
  727.     while( !( ((finish&0x10)==0x10) | ((finish&0x20)==0x20) ))
  728. // Chek timeout or data end
  729. finish=rSDIDSTA;
  730.     if( (finish&0xfc) != 0x10 )
  731.     {
  732.         Uart_Printf("DATA:finish=0x%xn", finish);
  733.         rSDIDSTA=0xec;  // Clear error state
  734.         return 0;
  735.     }
  736.     return 1;
  737. }
  738. int Chk_BUSYend(void)
  739. {
  740.     int finish;
  741.     finish=rSDIDSTA;
  742.     while( !( ((finish&0x08)==0x08) | ((finish&0x20)==0x20) ))
  743. finish=rSDIDSTA;
  744.     if( (finish&0xfc) != 0x08 )
  745.     {
  746.         Uart_Printf("DATA:finish=0x%xn", finish);
  747.         rSDIDSTA=0xf4;  //clear error state
  748.         return 0;
  749.     }
  750.     return 1;
  751. }
  752. void CMD0(void)
  753. {
  754.     //-- Make card idle state 
  755.     rSDICARG=0x0;     // CMD0(stuff bit)
  756.     rSDICCON=(1<<8)|0x40;   // No_resp, start, CMD0
  757.     //-- Check end of CMD0
  758.     Chk_CMDend(0, 0);
  759.     rSDICSTA=0x800;     // Clear cmd_end(no rsp)
  760. }
  761. int Chk_MMC_OCR(void)
  762. {
  763.     int i;
  764.     //-- Negotiate operating condition for MMC, it makes card ready state
  765.     for(i=0;i<100;i++) //Negotiation time is dependent on CARD Vendors.
  766.     {
  767. //     rSDICARG=0xffc000;          //CMD1(MMC OCR:2.6V~3.6V)
  768. rSDICARG=0xff8000;          //CMD1(SD OCR:2.7V~3.6V)
  769.      rSDICCON=(0x1<<9)|(0x1<<8)|0x41;    //sht_resp, wait_resp, start, CMD1
  770.      //-- Check end of CMD1
  771. //  if(Chk_CMDend(1, 1) & rSDIRSP0==0x80ffc000) //[31]:Card Power up status bit (busy)
  772. //0xffc000 is Voltage window
  773. if(Chk_CMDend(1, 1) && (rSDIRSP0>>16)==0x80ff) //YH 0903 [31]:Card Power up status bit (busy)
  774. // if(Chk_CMDend(1, 1) & rSDIRSP0==0x80ff8000) 
  775. {
  776.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  777.     return 1; // Success
  778. }
  779.     }
  780.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  781.     return 0; // Fail
  782. }
  783. int Chk_SD_OCR(void)
  784. {
  785.     int i,j=0;
  786.     //-- Negotiate operating condition for SD, it makes card ready state
  787.     for(i=0;i<50;i++) //If this time is short, init. can be fail.
  788.     {
  789.      CMD55();    // Make ACMD
  790.      rSDICARG=0xff8000; //ACMD41(SD OCR:2.7V~3.6V)
  791. //     rSDICARG=0xffc000; //ACMD41(MMC OCR:2.6V~3.6V)
  792.      rSDICCON=(0x1<<9)|(0x1<<8)|0x69;//sht_resp, wait_resp, start, ACMD41
  793. //-- Check end of ACMD41
  794.      if( Chk_CMDend(41, 1) & rSDIRSP0==0x80ff8000 ) 
  795. {
  796.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  797.     return 1; // Success     
  798. }
  799. Delay(200); // Wait Card power up status
  800.     }
  801.     //Uart_Printf("SDIRSP0=0x%xn",rSDIRSP0);
  802.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  803.     return 0; // Fail
  804. }
  805. int CMD55(void)
  806. {
  807.     //--Make ACMD
  808.     rSDICARG=RCA<<16; //CMD7(RCA,stuff bit)
  809.     rSDICCON=(0x1<<9)|(0x1<<8)|0x77; //sht_resp, wait_resp, start, CMD55
  810.     //-- Check end of CMD55
  811.     if(!Chk_CMDend(55, 1)) 
  812. return 0;
  813.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  814.     return 1;
  815. }
  816. int CMD13(void)//SEND_STATUS
  817. {
  818.     int response0;
  819.     rSDICARG=RCA<<16; // CMD13(RCA,stuff bit)
  820.     rSDICCON=(0x1<<9)|(0x1<<8)|0x4d; // sht_resp, wait_resp, start, CMD13
  821.     //-- Check end of CMD13
  822.     if(!Chk_CMDend(13, 1)) 
  823. return 0;
  824.     //Uart_Printf("rSDIRSP0=0x%xn", rSDIRSP0);
  825.     if(rSDIRSP0&0x100)
  826. //Uart_Printf("Ready for Datan");
  827. //    else 
  828. //Uart_Printf("Not Readyn");
  829.     response0=rSDIRSP0;
  830.     response0 &= 0x3c00;
  831.     response0 = response0 >> 9;
  832.     //Uart_Printf("Current Status=%dn", response0);
  833.     if(response0==6)
  834. Test_SDI();
  835.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  836.     return 1;
  837. }
  838. int CMD9(void)//SEND_CSD
  839. {
  840.     rSDICARG=RCA<<16; // CMD9(RCA,stuff bit)
  841.     rSDICCON=(0x1<<10)|(0x1<<9)|(0x1<<8)|0x49; // long_resp, wait_resp, start, CMD9
  842.     Uart_Printf("n****CSD register****n");
  843.     //-- Check end of CMD9
  844.     if(!Chk_CMDend(9, 1)) 
  845. return 0;
  846.     Uart_Printf(" SDIRSP0=0x%xn SDIRSP1=0x%xn SDIRSP2=0x%xn SDIRSP3=0x%xn", rSDIRSP0,rSDIRSP1,rSDIRSP2,rSDIRSP3);
  847.     return 1;
  848. }
  849. void Set_1bit_bus(void)
  850. {
  851.     Wide=0;
  852.     if(!MMC)
  853. SetBus();
  854.     Uart_Printf("n****1bit bus****n");
  855. }
  856. void Set_4bit_bus(void)
  857. {
  858.     Wide=1;
  859.     SetBus();
  860.     Uart_Printf("n****4bit bus****n");
  861. }
  862. void SetBus(void)
  863. {
  864. SET_BUS:
  865.     CMD55(); // Make ACMD
  866.     //-- CMD6 implement
  867.     rSDICARG=Wide<<1;     //Wide 0: 1bit, 1: 4bit
  868.     rSDICCON=(0x1<<9)|(0x1<<8)|0x46; //sht_resp, wait_resp, start, CMD55
  869.     if(!Chk_CMDend(6, 1))   // ACMD6
  870. goto SET_BUS;
  871.     rSDICSTA=0xa00;     // Clear cmd_end(with rsp)
  872. }
  873. void Set_Prt(void)
  874. {
  875.     //-- Set protection addr.0 ~ 262144(32*16*512) 
  876.     Uart_Printf("[Set protection(addr.0 ~ 262144) test]n");
  877. RECMD28:
  878.     //--Make ACMD
  879.     rSDICARG=0;     // CMD28(addr) 
  880.     rSDICCON=(0x1<<9)|(0x1<<8)|0x5c; //sht_resp, wait_resp, start, CMD28
  881.     //-- Check end of CMD28
  882.     if(!Chk_CMDend(28, 1)) 
  883. goto RECMD28;
  884.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  885. }
  886. void Clr_Prt(void)
  887. {
  888.     //-- Clear protection addr.0 ~ 262144(32*16*512) 
  889.     //Uart_Printf("[Clear protection(addr.0 ~ 262144) test]n");
  890. RECMD29:
  891.     //--Make ACMD
  892.     rSDICARG=0;     // CMD29(addr)
  893.     rSDICCON=(0x1<<9)|(0x1<<8)|0x5d; //sht_resp, wait_resp, start, CMD29
  894.     //-- Check end of CMD29
  895.     if(!Chk_CMDend(29, 1)) 
  896. goto RECMD29;
  897.     rSDICSTA=0xa00; // Clear cmd_end(with rsp)
  898. }