sd_mem.c
上传用户:hrbsz2007
上传日期:2008-05-11
资源大小:1222k
文件大小:57k
开发平台:

C/C++

  1. /* Copyright 2002, ESS Technology, Inc. */
  2. /* SCCSID @(#)sd_mem.c 1.40 08/10/04 */
  3. #ifdef SD_MEMORY
  4. #include "common.h"
  5. #include "ioport.h"
  6. #include "mvd.h"
  7. #include "buffer.h"
  8. #include "custmem.h"
  9. #include "memmap.h"
  10. #include "smfont.h"
  11. #include "util.h"
  12. #include "constvar.h"
  13. #include "sd_mem.h"
  14. #include "sysinfo.h"
  15. #include "mem_dev.h"
  16. #include "debug.h"
  17. /*------------------------------------------------------------------------
  18.  * Debugging macros
  19.  *------------------------------------------------------------------------*/
  20. #define CPRINTF(a) 
  21. #define PRINTF(a) 
  22. #define JPRINTF(a) 
  23. #define SD_ENABLE_WRITE
  24. #if 0
  25. int bpt;
  26. #define BREAKPOINT(x) {bpt=x;while(bpt) VCX_service();}
  27. #else
  28. #define BREAKPOINT(x)
  29. #endif
  30. /*------------------------------------------------------------------------
  31.  * macros
  32.  *------------------------------------------------------------------------*/
  33. #define USEC(x) (cpuclk*x/10)
  34. #define get_bigend32(pcbuf, off) ((uchar)pcbuf[off]|((uchar)pcbuf[off+1] << 8)| 
  35. ( (uchar)pcbuf[off+2] << 16)|((uchar)pcbuf[off+3] <<24))
  36. /*------------------------------------------------------------------------
  37.  * Public variables
  38.  *------------------------------------------------------------------------*/
  39. SD_CINFO SD_card_info;
  40. SD_XMIT_STATUS SD_xmit_info;
  41. /*------------------------------------------------------------------------
  42.  * Private variables
  43.  *------------------------------------------------------------------------*/
  44. static SD_CARD_STATUS *SD_card_status_ptr; /* R1 reply */
  45. static SD_STATUS *SD_status_ptr;
  46. static SD_OCR *SD_ocr_reg_ptr;
  47. static SD_CID *SD_cid_reg_ptr;
  48. static SD_CSD *SD_csd_reg_ptr;
  49. static ushort SD_rca_reg; /* rel card address..ID for multi cards */
  50. static SD_SCR *SD_scr_reg_ptr;
  51. static uint SD_rdata32;
  52. static int sd_is_mmc;
  53. static int sd_io_status = 0;
  54. static SD_CMD_Q SD_acmdq; /* SD command queue or appcmd */
  55. static unsigned short sd_crc16_look_up_table[256];
  56. static uchar  sd_crc7_look_up_table[256];
  57. static int sdTotalBlockNo, sdPagePerBlock, sdEraseSecSize;
  58. /* NOTE: move LUT's to rom later */
  59. /* LUT for commands with responses: R1, R1b, R2, R3, R6 */
  60. uchar SD_cmd2resp[64] = {
  61.     /* CMD0 - CMD7 */
  62.     SD_NR, SD_R3, SD_R2, SD_R6, SD_NR, SD_NR, SD_NR, SD_R1b,
  63.     /* CMD8 - CMD15 */
  64.     SD_NR, SD_R2, SD_R2, SD_R1_RD, SD_R1b,SD_R1, SD_NR, SD_NR,
  65.     /* CMD16 - CMD23 */
  66.     SD_R1, SD_R1_RD, SD_R1_RD, SD_NR, SD_NR, SD_NR, SD_NR, SD_R1,
  67.     /* CMD24 - CMD31 */
  68.     SD_R1_WR, SD_R1_WR, SD_NR, SD_R1, SD_R1b,SD_R1b,SD_R1, SD_NR,
  69.     /* CMD32 - CMD39 */
  70.     SD_R1, SD_R1, SD_NR, SD_NR, SD_NR, SD_NR, SD_R1b,SD_NR,
  71.     /* CMD40 - CMD47 */
  72.     SD_NR, SD_NR, SD_R1, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR,
  73.     /* CMD48 - CMD55 */
  74.     SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_R1,
  75.     /* CMD56 - CMD63 */
  76.     SD_R1, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR
  77. };
  78. /* LUT for app. commands with responses: R1, R1b, R2, R3, R6 */
  79. uchar SD_acmd2resp[52] = {
  80.     /* ACMD0 - ACMD7 */
  81.     SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_R1, SD_NR,
  82.     /* ACMD8 - ACMD15 */
  83.     SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_R1_RD, SD_NR, SD_NR,
  84.     /* ACMD16 - ACMD23 */
  85.     SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_R1, SD_R1,
  86.     /* ACMD24 - ACMD31 */
  87.     SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR,
  88.     /* ACMD32 - ACMD8 */
  89.     SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR,
  90.     /* ACMD40 - ACMD47 */
  91.     SD_NR, SD_R3, SD_R1, SD_NR, SD_NR, SD_NR, SD_NR, SD_NR,
  92.     /* ACMD48 - ACMD51 */
  93.     SD_NR, SD_NR, SD_NR, SD_R1_RD
  94. };
  95. /* LUT for SD command classes */
  96. uchar SD_cmd2class[64] = {
  97.     /* CMD0 - CMD7 */
  98.     SD_CL0,SD_CL0,SD_CL0,SD_CL0,SD_CL0,SD_CL0,SD_CL0,SD_CL0,
  99.     /* CMD8 - CMD15 */
  100.     SD_CL0,SD_CL0,SD_CL0,SD_CL1,SD_CL0,SD_CL0,SD_CL0,SD_CL0,
  101.     /* CMD16 - CMD23 */
  102.     SD_CL2,SD_CL2,SD_CL2,SD_CL2,SD_CL2,SD_CL2,SD_CL2,SD_CL2,
  103.     /* CMD24 - CMD31 */
  104.     SD_CL4,SD_CL4,SD_CL4,SD_CL4,SD_CL6,SD_CL6,SD_CL6,SD_CL6,
  105.     /* CMD32 - CMD39 */
  106.     SD_CL5,SD_CL5,SD_CL5,SD_CL5,SD_CL5,SD_CL5,SD_CL5,SD_CL5,
  107.     /* CMD40 - CMD47 */
  108.     SD_CL5,SD_CL5,SD_CL7,SD_CL7,SD_CL7,SD_CL7,SD_CL7,SD_CL7,
  109.     /* CMD48 - CMD55 */
  110.     SD_CL7,SD_CL7,SD_CL7,SD_CL7,SD_CL7,SD_CL7,SD_CL7,SD_CL8,
  111.     /* CMD56 - CMD63 */
  112.     SD_CL8,SD_CL8,SD_CL8,SD_CL8,SD_CL8,SD_CL8,SD_CL8,SD_CL8,
  113. };
  114. /* LUT for CSD's TAAC time value */
  115. uchar SD_taac_valx10[16] = {
  116.     00, 10, 12, 13, 15, 20, 25, 30,
  117.     35, 40, 45, 50, 55, 60, 70, 80
  118. };
  119. #ifdef BANK2SPEEDUP
  120. static unsigned old_wait_state;
  121. #endif
  122. /*------------------------------------------------------------------------
  123.  * Private functions
  124.  *------------------------------------------------------------------------*/
  125. static int SD_set_cmd(int, uint);
  126. static void SD_update_card_info(void);
  127. static ushort SD_calc_crc16(uchar *, ushort);
  128. static void SD_calc_crc16_table(ushort *);
  129. static uchar SD_calc_crc7(uchar *, ushort);
  130. static void SD_calc_crc7_table(uchar *);
  131. static int  SD_write_blk(int, int, int, int *, int);
  132. /*------------------------------------------------------------------------
  133.  * Begin SD function listing
  134.  *------------------------------------------------------------------------*/
  135. /* 
  136.   Function: Get partition boot record (PBR) address from master
  137.     boot record area.
  138.   input:
  139.   output: PBR start address as physical lba (physical sector number).
  140.   side-effects:
  141. */
  142. unsigned int SD_boot_setup(void)
  143. {
  144.    uchar *buff;
  145.    uint PBR_start_psn;
  146.    
  147.    SD_enable_io(1); /* enable SD eaux pins */
  148.    buff = (uchar *)dram_cached(SD_DATA_START);
  149.    SD_read_sector_lba((short *)buff, 0, 1, 1); /* 512B per block */
  150.    if (((buff[0x0] == 0xEB) && (buff[0x2] == 0x90))
  151.          || (buff[0x0] == 0xE9)) {
  152.         PBR_start_psn = 0;
  153.    }else
  154.        PBR_start_psn = get_bigend32(buff, 454);
  155.    return(PBR_start_psn);
  156. }
  157. /*********************************************************************
  158.     return:
  159.           1: MMC
  160.           0: SD or else
  161. **********************************************************************/
  162. int SD_is_mmc(void){
  163.     if(SD_card_info.type == SD_MMC)
  164. return 1;
  165.     else
  166. return 0;    
  167. }
  168. /* 
  169.   Function: Reads from specified lba to designated buffer.
  170.   input:
  171. buff: pointer for SD data destination.
  172. lba: physical logical block address.
  173. nblk: number of blocks to read.
  174.   output: number of bytes read.
  175.   side-effects:
  176. */
  177. int SD_read_sector_lba(short *buff, int lba, int nblk, int immed)
  178. {
  179.     int i, start_lba = lba;
  180.     short *pDest = buff;
  181.     set_bank2_wait ();
  182.     if (nblk == 1) {
  183. SD_read_blk(lba<<9, 9, (unsigned int *)buff, immed);
  184.     } else {
  185. PRINTF(("SD_multi_block read: %d-->%x : nblk %d n",
  186.  lba, buff, nblk));
  187. if(SD_card_info.type == SD_MMC){
  188.     for(i= 0; i<nblk; i++){
  189. SD_read_blk(start_lba<<9, 9, (unsigned int *)pDest, immed);
  190. pDest += 0x100;
  191. start_lba++;
  192.     }
  193. }else
  194.     SD_read_nblk(lba<<9, nblk, (unsigned int *)buff, immed);
  195.     }
  196.     restore_bank2_wait ();
  197.     return (nblk*512);
  198. }
  199. static int SD_find_free_block(int start_blk)
  200. {
  201.     int blk_no = start_blk, i, lba, cluster, pcluster;
  202.     while(blk_no++<sdTotalBlockNo){
  203. pcluster = 0;
  204. for(i=0; i<sdPagePerBlock; i++){
  205.     lba = blk_no*sdPagePerBlock +i;
  206.     cluster = HD_lba_to_cluster(lba);
  207.     if(cluster == -1) continue;
  208.     if(cluster == pcluster)
  209. continue;
  210.     
  211.     pcluster = cluster;
  212.     if(!HD_cluster_is_free(cluster))
  213. break;
  214. }
  215. if(i<sdPagePerBlock)
  216.     continue;
  217. else{
  218.     JPRINTF(("found a free block: %dn", blk_no));
  219.     return blk_no;
  220. }
  221.     }
  222.     return -1;
  223. }
  224. static int SD_erase_block(int start_lba, int nblk)
  225. {
  226.     int status, end_lba;
  227.     end_lba = start_lba+nblk-1;
  228.     status = SD_send_cmd(SD_CMD_ERASE_WR_BLK_START, start_lba<<9,1);
  229.     if(status != 1)
  230. return -1;
  231.     status = SD_send_cmd(SD_CMD_ERASE_WR_BLK_END, end_lba<<9,1);
  232.     if(status != 1)
  233. return -1;
  234.     status = SD_send_cmd(SD_CMD_ERASE, 0, 1);
  235.     if(status != 1)
  236. return -1;
  237.     else if(SD_xmit_info.result == 0)
  238. return 0;
  239.     else{
  240. JPRINTF(("card status %xn", *(int*)SD_card_status_ptr));
  241. return -1;
  242.     }
  243. }
  244. int SD_write_sector_lba(short *buff, int lba, int nblk, int immed)
  245. {
  246.     int start_lba= lba,i, status;
  247.     short *pSrc= buff;
  248.     int free_blk;
  249. #ifndef SD_ENABLE_WRITE
  250.     return -1;
  251. #endif
  252.    
  253.     if(SD_card_info.type == SD_MMC){
  254. for(i=0; i<nblk; i++){
  255.     status = SD_write_blk(start_lba<<9, 9, 1, (int *)pSrc, 1);
  256.     if(status){
  257. JPRINTF(("MMC writing error ...n"));
  258. assert(0);
  259. return 0;
  260.     } 
  261.     pSrc += 0x100;
  262.     start_lba++;
  263. }
  264.     }else{
  265. status = SD_write_blk(start_lba<<9, 9, nblk, (int *)pSrc, immed);
  266. if(status) 
  267.     return 0;
  268. if(nblk>1 && immed)
  269.     status = SD_send_cmd(SD_CMD_STOP_TRANSMIT, 0, 1); 
  270.     }
  271.     JPRINTF(("SD_write_sector_lba: data_cnt%d nblk %d, status %xn",
  272.      SD_xmit_info.data_cnt, nblk, status));
  273.     return (512*nblk);
  274. }
  275. /* 
  276.   Function: The faster CRC16 calculation procedure 
  277. uses 256 x 16-bit Look Up Table (8bit at a time)..
  278. more efficient than generating CRC 1bit at a time.
  279. (adapted from memstick.c version)
  280.   input: 
  281. data: pointer to data to be protected by CRC.
  282. count: total bytes of data.
  283.   output: CRC16
  284.   side-effects:
  285. */
  286. static ushort SD_calc_crc16(uchar *data, ushort count)
  287. {
  288.     ushort fcs = 0x0; /* initial FCS value */
  289.     ushort i, t, tl, th;
  290.     for (i=0; i<count; i++)
  291.     {
  292.         t = fcs;
  293.         fcs = sd_crc16_look_up_table[(t>>8) ^ *data++];
  294.         fcs = fcs ^ (t<<8);
  295.     }
  296.     return(fcs);
  297. }
  298. /* in case of 4-bit mode */
  299. static ushort SD_calc_crc16_4_bit(int *data, ushort count, ushort *crc)
  300. {
  301.     ushort fcs0 = 0x0, fcs1=0, fcs2=0, fcs3=0; /* initial FCS value */
  302.     ushort i, j ;
  303.     int tmp, *pInt;
  304.     uint filter;
  305.     ushort d0,d1,d2,d3;
  306.     ushort tt0,tt1,tt2,tt3;
  307.     pInt = data;
  308.     for (i=0; i<count; i++)
  309.     {
  310.         PRINTF(("data is %xn", *pInt));
  311.         tmp = *pInt++;
  312.         d3  = ((tmp & 0x80000000) >> 24); /* 0 */
  313.         d3 |= ((tmp & 0x08000000) >> 21); /* 1 */
  314.         d3 |= ((tmp & 0x00800000) >> 18); /* 2 */
  315.         d3 |= ((tmp & 0x00080000) >> 15); /* 3 */
  316.         d3 |= ((tmp & 0x00008000) >> 12); /* 4 */
  317.         d3 |= ((tmp & 0x00000800) >>  9); /* 5 */
  318.         d3 |= ((tmp & 0x00000080) >>  6); /* 6 */
  319.         d3 |= ((tmp & 0x00000008) >>  3);       /* 7 */
  320.         d2  = ((tmp & 0x40000000) >> 23); /* 0 */
  321.         d2 |= ((tmp & 0x04000000) >> 20); /* 1 */
  322.         d2 |= ((tmp & 0x00400000) >> 17); /* 2 */
  323.         d2 |= ((tmp & 0x00040000) >> 14); /* 3 */
  324.         d2 |= ((tmp & 0x00004000) >> 11); /* 4 */
  325.         d2 |= ((tmp & 0x00000400) >>  8); /* 5 */
  326.         d2 |= ((tmp & 0x00000040) >>  5); /* 6 */
  327.         d2 |= ((tmp & 0x00000004) >>  2); /* 7 */
  328.         d1  = ((tmp & 0x20000000) >> 22); /* 0 */
  329.         d1 |= ((tmp & 0x02000000) >> 19); /* 1 */
  330.         d1 |= ((tmp & 0x00200000) >> 16); /* 2 */
  331.         d1 |= ((tmp & 0x00020000) >> 13); /* 3 */
  332.         d1 |= ((tmp & 0x00002000) >> 10); /* 4 */
  333.         d1 |= ((tmp & 0x00000200) >>  7); /* 5 */
  334.         d1 |= ((tmp & 0x00000020) >>  4); /* 6 */
  335.         d1 |= ((tmp & 0x00000002) >>  1); /* 7 */
  336.         d0  = ((tmp & 0x10000000) >> 21); /* 0 */
  337.         d0 |= ((tmp & 0x01000000) >> 18); /* 1 */
  338.         d0 |= ((tmp & 0x00100000) >> 15); /* 2 */
  339.         d0 |= ((tmp & 0x00010000) >> 12); /* 3 */
  340.         d0 |= ((tmp & 0x00001000) >>  9); /* 4 */
  341.         d0 |= ((tmp & 0x00000100) >>  6); /* 5 */
  342.         d0 |= ((tmp & 0x00000010) >>  3); /* 6 */
  343.         d0 |= ((tmp & 0x00000001) );      /* 7 */
  344. //        PRINTF(("wanted : %x tmp %x, filter %xn",
  345. //                 data_wanted, tmp, filter));
  346.         tt0 = fcs0;
  347.         tt1 = fcs1;
  348.         tt2 = fcs2;
  349.         tt3 = fcs3;
  350.         fcs0 = sd_crc16_look_up_table[(tt0>>8) ^ d0];
  351.         fcs1 = sd_crc16_look_up_table[(tt1>>8) ^ d1];
  352.         fcs2 = sd_crc16_look_up_table[(tt2>>8) ^ d2];
  353.         fcs3 = sd_crc16_look_up_table[(tt3>>8) ^ d3];
  354.         fcs0 = fcs0 ^ (tt0<<8);
  355.         fcs1 = fcs1 ^ (tt1<<8);
  356.         fcs2 = fcs2 ^ (tt2<<8);
  357.         fcs3 = fcs3 ^ (tt3<<8);
  358.     }
  359.     crc[0] = fcs0;
  360.     crc[1] = fcs1;
  361.     crc[2] = fcs2;
  362.     crc[3] = fcs3;
  363.     return(0);
  364. }
  365. static uchar SD_calc_crc7(uchar *data, ushort count)
  366. {
  367.     uchar fcs = 0x0; /* initial FCS value */
  368.     ushort i;
  369.     uchar  g = 0x9;
  370.     uchar t;
  371.     for (i=0; i<count; i++)
  372.     {
  373.         t = sd_crc7_look_up_table[fcs];
  374. t <<= 1;
  375. if(t&0x80) 
  376.     fcs = (t&0x7f)^g;
  377. else
  378.     fcs = t;
  379.         t = sd_crc7_look_up_table[*data++];
  380. fcs ^= t;
  381.     }
  382.     return(fcs);
  383. }
  384. /*********************************************************** 
  385.   Function: Generate look up table for CRC16 calculation. 
  386.             G(x): x16+x12+x5+1
  387. ***********************************************************/
  388. static void SD_calc_crc16_table(ushort *table)
  389. {
  390. int d, i, k;
  391. ushort g = 0x1021; /* x16+ x12 +x5+1 */
  392. for (i=0; i<256; i++)
  393. {
  394. d = i<<8;
  395. for (k=0; k<8; k++)
  396. {
  397. d <<= 1;
  398. if(d&0x10000)
  399. d ^= g;
  400. }
  401. table[i] = d&0xffff;
  402. }
  403. }
  404. /*********************************************************** 
  405.   Function: Generate look up table for CRC7 calculation. 
  406.             G(x): x7+x3+1
  407. ***********************************************************/
  408. static void SD_calc_crc7_table(uchar *table)
  409. {
  410.     int i, k, d;
  411.     uchar g = 0x9; /* x7+ x3 +1 */
  412.     
  413.     PRINTF(("SD_fcs_table_calc_crc7 ...n"));
  414.     for (i=0; i<256; i++){
  415.         d = i;
  416.         for (k=0; k<7; k++){
  417.     if(d&0x80)
  418. d ^= g;
  419.     d <<= 1;
  420.         }
  421.         if(d&0x80)
  422.     d ^= g;
  423.         table[i] = d&0x7f;
  424.     }    
  425. }
  426. /* 
  427.   Function: Update SD_card_info from SD_csd_register..
  428.     calculate some card information.
  429.     (ref. pp.63-71..SD Physical Layer)
  430.   input: (none..but assumes CSD register is updated)
  431.   side-effects:       
  432. SD_card_info members are updated:
  433. 1. card's read access time (n_ac_max)  
  434. 2. card's write access time (n_wr_max)
  435. 3. card's memory capacity.
  436. */
  437. static void SD_update_card_info(void)
  438. {
  439.     int cnt, mmc_ac, sd_ac;
  440.     uint data;
  441.     int nwrmax;
  442.     
  443.     /* calculate access times */
  444.     /* data = taac = ((value*CPUCLK)/4) * 10^cnt */
  445.     data = cpuclk*SD_taac_valx10[SD_csd_reg_ptr->taac_value];
  446.     data >>= 2; /* WS = 4 */
  447.     cnt = SD_csd_reg_ptr->taac_unit - 5; /* n power of 10 */
  448.     if (cnt < 0) {
  449. do {
  450.     data /= 10;
  451.     cnt++;
  452. } while (cnt);
  453.     } else {
  454. while (cnt) {
  455.     data *= 10;
  456.     cnt--;
  457. };
  458.     }
  459.     /* read access time */
  460.     SD_card_info.n_ac_max = SD_NAC_MIN + data +
  461. (100 * SD_csd_reg_ptr->nsac); 
  462.     mmc_ac = 10*(data+100*SD_csd_reg_ptr->nsac);
  463.     if(sd_is_mmc)
  464. SD_card_info.n_ac_max  = mmc_ac;
  465.     JPRINTF(("n_ac_max: sd: %d, mmc %d n",
  466.      SD_card_info.n_ac_max, mmc_ac));
  467.     /* write access time */
  468.     nwrmax = (SD_card_info.n_ac_max)<<(SD_csd_reg_ptr->r2w_factor);
  469.     /*prevent short var n_wr_max overflow*/
  470.     if (nwrmax > 0xffff) nwrmax = 0xffff;
  471.     SD_card_info.n_wr_max = nwrmax;
  472.     /* calculate card capacity = BLOCKNR * BLOCK_LEN */
  473.     data = ((SD_csd_reg_ptr->c_size_11_2<<2) |
  474. SD_csd_reg_ptr->c_size_1_0) + 1;
  475.     cnt = 1 << (SD_csd_reg_ptr->c_size_mult + 2);
  476.     data = data * cnt; /* BLOCKNR */
  477.     sdTotalBlockNo = data;
  478.     cnt = 1 << (SD_csd_reg_ptr->rd_blk_len); /* BLOCK_LEN */
  479.     sdPagePerBlock = cnt/512;
  480.     sdEraseSecSize = SD_csd_reg_ptr->sector_size+1;
  481.     SD_card_info.capacity = data * cnt; /* in Bytes */
  482. }
  483. /* 
  484.   Function: Initialize SD related buffers, structure members and
  485.     and IO pins.
  486.   input:
  487.   output:       
  488.   side-effects:
  489. */
  490. void SD_init(void)
  491. {
  492.     unsigned sclk_high, sclk_low;
  493. dawei(("SD_init()n"));
  494.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  495.     /* initialization */
  496.     SD_card_status_ptr = (SD_CARD_STATUS *)dram_cached(SD_CSTATUS_START);
  497.     SD_status_ptr = (SD_STATUS *)dram_cached(SD_STATUS_START);
  498.     SD_ocr_reg_ptr = (SD_OCR *)dram_cached(SD_OCR_START);
  499.     SD_cid_reg_ptr = (SD_CID *)dram_cached(SD_CID_START);
  500.     SD_csd_reg_ptr = (SD_CSD *)dram_cached(SD_CSD_START);
  501.     SD_scr_reg_ptr = (SD_SCR *)dram_cached(SD_SCR_START);
  502.     /* generate the crc table */ 
  503.     SD_calc_crc16_table(sd_crc16_look_up_table); 
  504.     SD_calc_crc7_table(sd_crc7_look_up_table); 
  505.     SD_rca_reg = 0; /* initially '0' */
  506.     SD_card_info.type = SD_UNKNOWN;
  507.     sd_is_mmc = 0;
  508.     SD_card_info.capacity = 0; /* used to check if CSD received */
  509.     SD_xmit_info.com_state = SD_IDLE;
  510. #if SD_CHECK_RECV_CRC
  511.     SD_xmit_info.crc7_err_cnt = 0;
  512.     SD_xmit_info.crc16_err_cnt = 0;
  513. #endif
  514.     SD_acmdq.cmd = SD_CMD_EMPTY;
  515.     SET_SD_CMD; /* initially high */
  516.     SD_DETECT_INPUT; 
  517. }
  518. /* 
  519.   Function: Enable/disable SD eaux ports shared with ATAPI. This is
  520.     used to prevent ATAPI initialization problems.
  521.   input:
  522. enable: 1 - enable SD IO ports.
  523. 0 - disable SD IO ports.
  524.   output:       
  525.   side-effects:
  526. (refer to sd_mem.h for specific eaux ports affected)
  527. */
  528. void SD_enable_io(int enable)
  529. {
  530. #if defined(SD_MEMORY)
  531.     /* shared with ATAPI..
  532.      * there is known conflict with ATAPI-D7 (Busy pin) that cause
  533.      * ATAPI initialization problem..tread lightly here.
  534.      */
  535.     if (enable){
  536. sd_io_status = 1;
  537. ENABLE_SD_GENERAL;
  538. ENABLE_SD_IO;
  539.     } else if(sd_io_status){
  540. DISABLE_SD_GENERAL;
  541. DISABLE_SD_IO;
  542. sd_io_status = 0;
  543.     }
  544. #endif    
  545. }
  546. /* 
  547.   Function: SD-memory/MMC card detection. Gets relative card  
  548.     address(RCA) from card if detected.
  549.   input: (none)
  550.   output:       
  551. -2: failed to get CSD register
  552. -1: not voltage compatible
  553.  0: no valid SD-mem or MMC card found
  554.  5: if successful
  555. */
  556. int SD_identify_device(void)
  557. {
  558.     int status, status1, cnt=0;    
  559.     SD_enable_io(1);
  560.     
  561.     SD_init();
  562.     SD_card_info.inserted = 1;
  563.     /* Force SD card to idle-state to start initialization */
  564.     SD_clk_restricted_cmd(SD_CMD_GO_IDLE_STATE, 0);
  565.     /* send ACMD41 w/acceptable OCR.. 
  566.      * and wait until SD card is ready.
  567.      */
  568.     SD_ocr_reg_ptr->card_ready = 0;
  569.     do {
  570. status = SD_clk_restricted_cmd(SD_CMD_APP_CMD, 0);
  571. status1 = SD_clk_restricted_cmd(SD_ACMD_SD_SEND_OP_COND, 
  572. SD_ACCEPTABLE_OCR);
  573. if ((status == -1) && (status1 == -1)) { 
  574.     SD_clk_restricted_cmd(SD_CMD_GO_IDLE_STATE, 0);
  575.     cnt++;
  576.     if (cnt > SD_MAX_RETRIES) {
  577. /* timed out..no response */
  578. status = -3;
  579. break;
  580.     }
  581. }
  582.     } while (!SD_ocr_reg_ptr->card_ready);
  583.     sd_is_mmc = 0;
  584.     /*
  585.      * if no response: 1) SD card not voltage compatible
  586.      *        2) could be Multimedia card..verify
  587.      *   by sending CMD1 (MMC's ACMD41)
  588.      */
  589.     if (status == -3){
  590. /* check if MMC? */
  591. SD_clk_restricted_cmd(SD_CMD_GO_IDLE_STATE, 0);
  592. cnt=0;
  593. SD_ocr_reg_ptr->card_ready = 0;
  594. do {
  595.     status = SD_clk_restricted_cmd(SD_CMD_MMC_SEND_OP_COND, 
  596.    SD_ACCEPTABLE_OCR);
  597.     if (status == -1) {
  598. /* no response */
  599. cnt++;
  600. if (cnt > SD_MAX_RETRIES){
  601.     /* card not voltage compatible */
  602.     return (-1);
  603. }
  604.     }
  605. } while (!SD_ocr_reg_ptr->card_ready);
  606. SD_card_info.type = SD_MMC; /* MultiMedia Card */
  607. sd_is_mmc = 1;
  608.     } else {
  609. SD_card_info.type = SD_MEM; /* SD Memory Card */
  610.     }
  611.     if(SD_card_info.type == SD_MMC){
  612. SD_rca_reg = 0x1;
  613.     }
  614.     else{
  615. SD_rca_reg = 0xffff; 
  616.     }
  617.     /* send CMD2 to get CID number */
  618.     status = SD_clk_restricted_cmd(SD_CMD_ALL_SEND_CID, 0);
  619.     /* send CMD3 to get RCA */
  620.     if(SD_card_info.type == SD_MMC){
  621. status = SD_clk_restricted_cmd(SD_CMD_SEND_REL_ADDR, 
  622.        SD_rca_reg<<16);
  623.     }
  624.     else{
  625. status = SD_clk_restricted_cmd(SD_CMD_SEND_REL_ADDR, 0);
  626.     }
  627.     if (status == 1) {
  628. /* send CMD9 to get Card Specific Data (CSD) */
  629. status = SD_send_cmd(SD_CMD_SEND_CSD, SD_rca_reg<<16, 1);
  630. if (status == 1) {
  631.     SD_update_card_info();
  632.     /* send card to tranfer state */
  633.     SD_send_cmd(SD_CMD_SELECT_CARD, SD_rca_reg<<16, 1);    
  634.     if (SD_card_info.type > SD_MMC) {
  635. /* send ACMD51 to get SD configuration register */
  636. SD_scr_reg_ptr->sd_bus_widths = 0x1; /* default 1bit */
  637. SD_send_acmd(SD_ACMD_SEND_SCR, 0, 1);
  638. /* set to 4bit data bus if possible */
  639. SD_set_bus_width(2);
  640. /* send ACMD13 to get SD Status register */
  641. SD_send_acmd(SD_ACMD_SD_STATUS, 0, 1);
  642.     }
  643.     /* we have valid SD/MMC card */
  644.     status = 5;
  645. } else {
  646.     status = -2; /* failed to get CSD */
  647. }   
  648.     } else {
  649. SD_card_info.type = SD_UNKNOWN;
  650. status = 0;
  651.     }    
  652.     SD_enable_io(0);
  653.     
  654.     return (status);
  655. }
  656. /* 
  657.   Function: SD-memory/MMC card reset.
  658.   input:
  659.   output:       
  660.   side-effects:
  661. */
  662. void SD_reset(void)
  663. {
  664.     unsigned sclk_high, sclk_low;
  665.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  666.     SD_send_cmd(SD_CMD_GO_IDLE_STATE, 0, 1);
  667.     SD_xmit_info.data_width = 0; /* initially only D0 used */
  668.     SD_card_info.type = SD_UNKNOWN;
  669.     sd_is_mmc = 0;
  670.     SD_card_info.inserted = 0;
  671.     SD_card_info.capacity = 0; /* used to check if CSD received */
  672.     SD_xmit_info.com_state = SD_IDLE;
  673. #if SD_CHECK_RECV_CRC
  674.     SD_xmit_info.crc7_err_cnt = 0;
  675.     SD_xmit_info.crc16_err_cnt = 0;
  676. #endif
  677.     SD_acmdq.cmd = SD_CMD_EMPTY;
  678.     SET_SD_CMD; /* initially high */
  679. }
  680. /* 
  681.   Function:  Set data bus width, 4bit or 1bit.
  682.   input: 
  683. 0 - 1bit data bus (narrow bus)
  684. 2 - 4bit data bus (wide bus)
  685.   output:       
  686. 1: success
  687. otherwise: failed
  688. */
  689. int SD_set_bus_width(int width)
  690. {
  691.     uint status = 0;
  692.     
  693.     dawei(("SD_set_bus_width( %d )n", width));
  694.     if ((SD_scr_reg_ptr->sd_bus_widths & 0x4)) {
  695. /* 4bit supported by card */
  696. if ((width>>1) != SD_xmit_info.data_width) {
  697.     status = SD_send_acmd(SD_ACMD_SET_BUS_WIDTH, width, 1);
  698.     if (status==1) SD_xmit_info.data_width = (width>>1);
  699. }
  700.     }
  701.     return (status);
  702. }
  703. /* 
  704.   Function: Read single block from SD. The max block size is card
  705.     specific, in the range of 512 to 2048 bytes. The minimum
  706.     block size is 1 byte if card support "partial block read".
  707.     SD memory card always support PBR.
  708.     (NOTE: currently our code is hardwired to 512B block)
  709.   input:
  710. addr: location of SD data (lba).
  711. blk_sz: block size to read. (2^val bytes)
  712. data_ptr: SD data destination.
  713. immed: 1 - complete data read in function.
  714.        0 - initiate data read..let SD_service() finish
  715.            in background.
  716.   output:       
  717. -4: unsupported block size.
  718. -3: timed out (reached retry limit)
  719. -2: communication busy
  720. -1: invalid or unsupported command or no card.
  721.  0: read initiated.."passed" to SD_service(). 
  722.        1: successful
  723.   side-effects:
  724. */
  725. int SD_read_blk(int addr, int blk_sz, uint *data_ptr, int immed)
  726. {
  727.     int status;
  728.     if (blk_sz != SD_xmit_info.cur_blk_size) {
  729. /* check if card allows block size */
  730. if ((blk_sz == SD_csd_reg_ptr->rd_blk_len) ||
  731.     (SD_csd_reg_ptr->rd_blk_len_partial && 
  732.      blk_sz < SD_csd_reg_ptr->rd_blk_len)) {
  733.     SD_send_cmd(SD_CMD_SET_BLOCKLEN, (1<<blk_sz), immed);
  734. } else {
  735.     return (-4); /* invalid block size */
  736. }
  737.     }
  738.     SD_xmit_info.cur_blk_size = blk_sz;
  739.     SD_xmit_info.rd_dest_ptr = data_ptr;
  740.     
  741.     status=SD_send_cmd(SD_CMD_READ_SINGLE_BLOCK, addr, immed);
  742.     return (status);
  743. }
  744. static int SD_write_blk(int addr,int blk_sz,int nblk,int*data_ptr, int immed)
  745. {
  746.     int status = 1;
  747.     int erase_blk_en, sec_size, wr_bl_len, wr_blk_len_partial;
  748.     if (blk_sz != SD_xmit_info.cur_blk_size) {
  749. /* check if card allows block size */
  750. if ((blk_sz == SD_csd_reg_ptr->wr_blk_len) ||
  751.     (SD_csd_reg_ptr->wr_blk_partial && 
  752.      blk_sz < SD_csd_reg_ptr->wr_blk_len)) {
  753.     status = SD_send_cmd(SD_CMD_SET_BLOCKLEN, (1<<blk_sz), immed);
  754. } else {
  755.     return (-4); /* invalid block size */
  756. }
  757.     }
  758.     if(status != 1){
  759. JPRINTF(("SD Set Block_len error. status %dn", status));
  760. return -1;
  761.     }
  762.     SD_xmit_info.cur_blk_size = blk_sz;
  763.     SD_xmit_info.wr_src_ptr = data_ptr;
  764.     SD_xmit_info.data_len = nblk*(1<<blk_sz);
  765.     if(nblk>1)
  766. status=SD_send_cmd(SD_CMD_WRITE_MULTI_BLOCK, addr, immed);
  767.     else
  768. status=SD_send_cmd(SD_CMD_WRITE_BLOCK, addr, immed);
  769.     if(status != 1){
  770. JPRINTF(("SD Set Write Cmd error.n"));
  771. return -1;
  772.     }
  773.     else if(SD_xmit_info.result != 0){
  774. JPRINTF(("SD Writing   error.n"));
  775. return -1;
  776.     }
  777.     return 0;
  778. }
  779. /* 
  780.   Function: Read multiple blocks from SD. The max block size is card
  781.     specific, in the range of 512 to 2048 bytes. 
  782.     (NOTE: currently our code is hardwired to 512B block)
  783.   input:
  784. addr: location of SD data (lba).
  785. nblk: number of blocks to read. 
  786. data_ptr: SD data destination.
  787. immed: 1 - complete data read in function.
  788.        0 - initiate data read..let SD_service() finish
  789.            in background.
  790.   output:       
  791. -3: timed out (reached retry limit)
  792. -2: communication busy
  793. -1: invalid or unsupported command or no card.
  794.  0: read initiated.."passed" to SD_service(). 
  795.        1: successful
  796.   side-effects:
  797. */
  798. int SD_read_nblk(int addr, int nblk, uint *data_ptr, int immed)
  799. {
  800.     int status, limit;
  801.     /* make sure block size is 512B..FAT hardwired */
  802.     if (SD_xmit_info.cur_blk_size != 9) {
  803. SD_send_cmd(SD_CMD_SET_BLOCKLEN, 512, immed);
  804.     }
  805.     SD_xmit_info.cur_blk_size = 9; /* 512..(2^9) */
  806.     SD_xmit_info.rd_dest_ptr = data_ptr;
  807.     limit = nblk*512;
  808. #if 0
  809.     status = SD_send_cmd(MMC_CMD_READ_UNTIL_STOP, addr, 0);
  810. #endif
  811.     status = SD_send_cmd(SD_CMD_READ_MULTI_BLOCK, addr, 0);
  812.     SD_xmit_info.data_len = nblk*512;
  813.     SD_xmit_info.data_cnt = 0;
  814.     /* NOTE: for "non-immediate" case, make sure similar process
  815.      * below is present in background task to complete the read.
  816.      */
  817.     if ((status >= 0) && immed) {
  818. PRINTF(("com_state %dn",SD_xmit_info.com_state));
  819. while (SD_xmit_info.com_state) {
  820.     SD_service();
  821.     if (SD_xmit_info.data_cnt >= limit
  822. && !sd_is_mmc) break;
  823. }
  824. status = SD_send_cmd(SD_CMD_STOP_TRANSMIT, 0, immed);
  825. PRINTF(("xmit bytes %d, required bytes %d, statusn", 
  826.  SD_xmit_info.data_cnt, SD_xmit_info.data_len, status));
  827.     }else{
  828. JPRINTF(("SD_read_nblk... error n"));
  829.     }
  830.     return (status);
  831. }
  832. /* 
  833.   Function: used in SD_service() for post-processing of commands...
  834.     1) command retry for errors (up to SD_MAX_RETRIES).
  835.     2) send app-command if CMD55 was previously sent.
  836.     3) send pending command in queue if any.
  837.   input: no arguments..but app-commands and pending commands are
  838.  stored in "SD_acmdq" structure for processing.
  839.   
  840.   output:
  841.   side-effects:
  842. */
  843. int SD_get_next_cmd(void)
  844. {
  845.     int send=0;
  846.     
  847.     if (SD_xmit_info.response_expected &&
  848. !SD_xmit_info.response_recv) {
  849. if (SD_xmit_info.retry_cnt < SD_MAX_RETRIES) {
  850.     /* failed/aborted commands..retry */
  851.     SD_xmit_info.wait_nclk = SD_NCR_MAX;
  852.     send = 1;     
  853. } else {
  854.     /* reach retry limit */
  855.     SD_xmit_info.retry_cnt = 0xff; 
  856. }
  857.     } else {
  858. /* command specific post-processing */
  859. switch (SD_xmit_info.cmd) {
  860. case SD_CMD_APP_CMD:
  861.     /* send app-command */
  862.     SD_set_cmd(SD_acmdq.cmd, SD_acmdq.arg);
  863.     SD_acmdq.cmd = SD_CMD_EMPTY; /* clear cmd-Q */
  864.     send = 1;
  865.     break;
  866.     
  867. default:
  868.     if (SD_acmdq.cmd != SD_CMD_EMPTY) {
  869. /* cmd pending */
  870. send = SD_set_cmd(SD_acmdq.cmd, SD_acmdq.arg);
  871. SD_acmdq.cmd = SD_CMD_EMPTY; /* clear cmd-Q */
  872.     }
  873.     break;
  874. }
  875.     }
  876.     
  877.     return (send);
  878. }
  879. /* 
  880.   Function: send command to SD card.  
  881.   input:
  882. command: command index (0-63).
  883. arg: command argument.
  884. immed: 1-complete command immediately 
  885. 0-initiate command..let SD_service() finish
  886.   output:       
  887. -3: timed out (reached retry limit)
  888. -2: communication busy
  889. -1: invalid or unsupported command or no card.
  890.  0: pending..command "passed" to SD_service(). 
  891.        1: successful
  892. */
  893. int SD_send_cmd(int command, uint arg, int immed)
  894. {
  895.     int status=0;
  896.     if (!SD_card_info.inserted || command > 63) 
  897. return (-1); /* sanity check */    
  898.     
  899.     /* send command w/ CRC7*/
  900.     if ( (SD_xmit_info.com_state == SD_IDLE) || 
  901.  (command == SD_CMD_STOP_TRANSMIT) ) {
  902. if (!SD_set_cmd(command, arg)) return (-1);
  903. SD_xmit_info.com_state = HOST2SD_START;
  904. if (immed) {
  905.     while (SD_xmit_info.com_state) SD_service();
  906.     status = (SD_xmit_info.retry_cnt == 0xff) ? -3 : 1;
  907. }
  908.     } else {
  909. /* put in cmd-Q..if not app-command */
  910. if (!(command & ACMD_MARKER) && 
  911.     (command != SD_CMD_APP_CMD)) {
  912.     SD_acmdq.cmd = command;
  913.     SD_acmdq.arg = arg;
  914. } else {
  915.     status = -2; /* Bus is busy..lost app-command */
  916. }
  917.     }
  918.     return (status);
  919. }
  920. /* 
  921.   Function: send application specific command to SD card.
  922.     App-commands needs to send pre-command(0x55).
  923.   input:
  924. command: app-command index.
  925. arg: app-command argument.
  926. immed: 1-complete command immediately 
  927. 0-initiate command..let SD_service() finish
  928.   output:       
  929. -2: communication busy
  930. -1: invalid command.
  931.  0: pending..command "passed" to SD_service(). 
  932.        1: successful
  933. */
  934. int SD_send_acmd(int acmd, uint arg, int immed)
  935. {
  936.     int status;
  937.     
  938.     /* set app-command */
  939.     SD_acmdq.cmd = acmd;
  940.     SD_acmdq.arg = arg;
  941.     status = SD_send_cmd(SD_CMD_APP_CMD, SD_rca_reg<<16, immed);
  942.     
  943.     return (status);
  944. }
  945. /* 
  946.   Function: Initializes xmit data structure for new command. 
  947.     Checks card(CSD reg) for command class support.
  948.   input:
  949. command: command index.
  950. arg: command argument.
  951.   output:       
  952.  0: command not supported by card.
  953.        1: successful
  954. */
  955. static int SD_set_cmd(int command, uint arg) 
  956. {
  957.     uint is_acmd, cmd, tmp;
  958.     uchar *sd_resp_ptr;
  959.     
  960.     cmd = command & 0x3f;
  961.     is_acmd = command & ACMD_MARKER;
  962.     if (SD_card_info.capacity) {
  963. /* card has been initialized..check class support */
  964. tmp = (is_acmd) ? SD_CL8 : SD_cmd2class[cmd]; /* class */
  965. if (!(SD_csd_reg_ptr->ccc & (1<<tmp))) {
  966.     return(0); /* card does not support command class */
  967. }
  968.     }
  969.     sd_resp_ptr = (is_acmd) ? SD_acmd2resp : SD_cmd2resp;
  970.     SD_xmit_info.cmd = command;
  971.     SD_xmit_info.arg = arg;
  972.     SD_xmit_info.response_expected = (sd_resp_ptr[cmd] & 0xf);
  973.     SD_xmit_info.response_recv = 0;
  974.     SD_xmit_info.use_data = (sd_resp_ptr[cmd]>>4);
  975.     SD_xmit_info.wait_nclk = SD_NCR_MAX;
  976.     SD_xmit_info.cmd_sent = 0; 
  977.     SD_xmit_info.retry_cnt = 0;    
  978.     if (SD_xmit_info.use_data == 2) { /* data read */
  979. /* data destination */
  980. if (SD_xmit_info.cmd == SD_ACMD_SD_STATUS) {
  981.     SD_xmit_info.cur_blk_size = 6; /* 64Bytes */
  982.     SD_xmit_info.rd_dest_ptr = (uint *)SD_status_ptr;
  983. } else if (SD_xmit_info.cmd == SD_ACMD_SEND_SCR) {
  984.     SD_xmit_info.cur_blk_size = 3; /* 8Bytes */
  985.     SD_xmit_info.rd_dest_ptr = (uint *)SD_scr_reg_ptr;
  986. }
  987.     } else if (!SD_xmit_info.use_data
  988.        || SD_xmit_info.response_expected) { 
  989. /* response data destination */
  990. if (SD_xmit_info.response_expected == SD_R2) {
  991.     SD_xmit_info.rd_dest_ptr = 
  992. (SD_xmit_info.cmd == SD_CMD_SEND_CSD) ?
  993. (uint *)SD_csd_reg_ptr : (uint *)SD_cid_reg_ptr;
  994. } else {
  995.     if (SD_xmit_info.response_expected == SD_R3){
  996. SD_xmit_info.rd_dest_ptr = (uint *)SD_ocr_reg_ptr;
  997.     } else if (SD_xmit_info.response_expected == SD_R6){
  998. /* R6 is special..*/
  999. SD_xmit_info.rd_dest_ptr = &SD_rdata32;
  1000.     } else { /* R1 or R1b */
  1001. SD_xmit_info.rd_dest_ptr = (uint *)SD_card_status_ptr;
  1002.     }
  1003. }
  1004.     }
  1005.     return(1);
  1006. }
  1007. static int SD_slow_clk_data_out(uchar out_data)
  1008. {  
  1009.     int i;
  1010.     unsigned sclk_high, sclk_low;
  1011.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1012.     for(i=0; i<8; i++){
  1013. if (out_data & 0x80) {
  1014.     SET_SD_CMD;
  1015. } else {
  1016.     CLEAR_SD_CMD;
  1017. }
  1018. out_data <<= 1;
  1019. CLEAR_SD_CLK;
  1020. risc_sleep_a_bit(USEC(2));
  1021. SET_SD_CLK;
  1022. risc_sleep_a_bit(USEC(2));
  1023.     }
  1024. }
  1025. /***********************************************
  1026.  up to 1 DWORD
  1027. ************************************************/
  1028. static int SD_slow_clk_data_in(int bit_cnt)
  1029. {
  1030.     int data_in = 0, i;
  1031.     unsigned sclk_high, sclk_low;
  1032.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1033.     for (i=0; i<bit_cnt; i++) {
  1034. CLEAR_SD_CLK;
  1035. risc_sleep_a_bit(USEC(2));
  1036. SET_SD_CLK;
  1037. risc_sleep_a_bit(USEC(1));
  1038. data_in <<= 1;
  1039. data_in |= (SD_CMD_HIGH != 0);
  1040. risc_sleep_a_bit(USEC(1));
  1041.     }
  1042.     return data_in;
  1043. }
  1044. static void SD_slow_clk_pulse_l2h(void)
  1045. {
  1046.     unsigned sclk_high, sclk_low;
  1047.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1048.     CLEAR_SD_CLK;
  1049.     risc_sleep_a_bit(USEC(2));
  1050.     SET_SD_CLK;
  1051.     risc_sleep_a_bit(USEC(2));
  1052. }
  1053. /* 
  1054.   Function: For init commands during SD card initialization,
  1055.     under clock restriction (100KHz < clk < 400KHz).
  1056.     (Also for MMC's CMD1)
  1057.   input:
  1058. command: command index (CMD1,CMD2,CMD3,CMD55,ACMD41).
  1059. arg: command argument.
  1060.   output:       
  1061. -1: timed out (reached retry limit).
  1062.  0: crc error.
  1063.        1: successful
  1064.   side-effects:
  1065. updates SD_card_status for CMD55 if success.
  1066. updates SD_ocr_reg for ACMD41/CMD1 if success. 
  1067. updates SD_cid_reg for CMD2 if success. 
  1068. updates SD_rca_reg for CMD3 if success. 
  1069. */
  1070. int SD_clk_restricted_cmd(int command, uint arg)
  1071. {
  1072.     int i, j,cnt, sd_timeout, rcv_cnt, crc_check;
  1073.     ushort sd_crc;
  1074.     uint sd_mask, tmp, data_in, *sd_rdata_ptr;
  1075.     char cmd_buf[8], rcv_buf[8], *pChar, *rdata_pchar;
  1076.     unsigned sclk_high, sclk_low;
  1077.     PRINTF(("SD_clk_restricted_cmd ...command %x, arg %xn", command, arg));
  1078.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1079.     
  1080.     pChar = cmd_buf;
  1081.     data_in = 0x40|(command & 0x3f);
  1082.     *pChar++ = data_in;
  1083.     *pChar++ = (arg>>24) & 0xff;
  1084.     *pChar++ = (arg>>16)& 0xff;
  1085.     *pChar++ = (arg>>8) &0xff;
  1086.     *pChar++ = arg & 0xff;
  1087.     sd_crc = SD_calc_crc7(cmd_buf, 5);
  1088.     for (i=0; i<5; i++)
  1089. SD_slow_clk_data_out(cmd_buf[i]);
  1090.     tmp = (sd_crc<<1) | 1;
  1091.     /* crc7 + end bit */
  1092.     SD_slow_clk_data_out(tmp);
  1093.     SD_CMD_INPUT; /* get ready for response */
  1094.     if(SD_card_info.type == SD_MMC
  1095.        && command == SD_CMD_SEND_REL_ADDR)
  1096. sd_timeout = SD_NCR_MAX;
  1097.     else
  1098. sd_timeout = SD_NID_MAX;
  1099.     
  1100.     for (i = 0; (i < sd_timeout); i++) {
  1101. SD_slow_clk_pulse_l2h();
  1102. if (SD_CMD_LOW) { /* response start bit */
  1103.     /* xmit bit */
  1104.     SD_slow_clk_pulse_l2h();
  1105.     /* get SD response */
  1106.     sd_crc = 0;
  1107.     break;
  1108. }
  1109.     }
  1110.     if (i >= sd_timeout){
  1111. /* timed out..*/
  1112. JPRINTF(("clk_res: timed outn"));
  1113. return (-1);
  1114.     } else {
  1115. cnt = 0;
  1116. crc_check = 0;
  1117. if (command == SD_CMD_ALL_SEND_CID
  1118.     ||command == SD_CMD_SEND_CID ) {
  1119.     cnt = 3; /* extra data for R2 response */
  1120.     sd_rdata_ptr = (uint *)SD_cid_reg_ptr;
  1121. } else if ((command == SD_ACMD_SD_SEND_OP_COND) ||
  1122.    (command == SD_CMD_MMC_SEND_OP_COND)) {
  1123.     sd_rdata_ptr = (uint *)SD_ocr_reg_ptr;
  1124.     /* R3 */
  1125. } else if (command == SD_CMD_SEND_REL_ADDR
  1126.    && SD_card_info.type == SD_MEM) {
  1127.     sd_rdata_ptr = &SD_rdata32;
  1128.     /* R6 */
  1129.     crc_check = 1;
  1130. } else { /* R1 (SD_CMD_APP_CMD)*/
  1131.     sd_rdata_ptr = (uint *)SD_card_status_ptr;
  1132.     crc_check = 1;
  1133. }
  1134.     }
  1135.     
  1136.     /* clock in cmd and arg (38bits)..save only arg (last 32bits) */
  1137.     pChar = rcv_buf;
  1138.     data_in = SD_slow_clk_data_in(6);
  1139.     *pChar++ = data_in;
  1140.     rcv_cnt = 1;
  1141.     rdata_pchar = (char*)sd_rdata_ptr;
  1142.     for(j=0; j<4; j++){
  1143. data_in = SD_slow_clk_data_in(8);
  1144. *pChar++ = data_in;
  1145. rcv_cnt++;
  1146. *rdata_pchar++ = data_in;
  1147.     }
  1148.     
  1149.     cnt <<= 2;
  1150.     while (cnt){
  1151. *rdata_pchar++ = SD_slow_clk_data_in(8) ;
  1152. cnt--;
  1153. if (!cnt) goto sd_exit;
  1154.     }
  1155.     /* crc7 + end bit */
  1156.     data_in = SD_slow_clk_data_in(8) ;
  1157.     
  1158. #if CHECK_RECV_CRC 
  1159.     if (!crc_check) {
  1160. sd_crc = 0x7f; /* no CRC for R3 response */
  1161.     }else
  1162. sd_crc = SD_calc_crc7(rcv_buf, rcv_cnt);
  1163.     data_in >>= 1; /* remove end bit */
  1164.     PRINTF(("Received crc: %x, Computed crc: %xn", data_in, sd_crc));
  1165.     if (data_in != sd_crc) {
  1166. /* crc error */
  1167. CPRINTF(("CRC error in SD_clk_restricted_cmd()n"));
  1168. CPRINTF(("cmd: %d, arg: %n", command, arg));
  1169. CPRINTF(("xmit crc: 0x%x, gen crc: 0x%xn", data_in, sd_crc));
  1170. BREAKPOINT(0);
  1171. return (0);
  1172.     }
  1173. #endif
  1174.     if (command == SD_CMD_SEND_REL_ADDR
  1175. && SD_card_info.type == SD_MEM) {
  1176. sd_rdata_ptr = (uint *)SD_card_status_ptr;
  1177. *sd_rdata_ptr &= (~0x1fff); /* bit 0-12 */
  1178. *sd_rdata_ptr |= (SD_rdata32 & 0x1fff);
  1179. SD_card_status_ptr->error = 
  1180.     (SD_rdata32>>13) & 1;
  1181. SD_card_status_ptr->illegal_cmd = 
  1182.     (SD_rdata32>>14) & 1;
  1183. SD_card_status_ptr->com_crc_error = 
  1184.     (SD_rdata32>>15) & 1;
  1185. SD_rca_reg = SD_rdata32>>16; /* new RCA */
  1186.     }
  1187. sd_exit:
  1188.     /* extra 8 Clocks for SD card post-processing */
  1189.     for (i = 0; i < 8; i++) {
  1190. SD_slow_clk_pulse_l2h();
  1191.     }
  1192.     return (1); 
  1193. }
  1194. static void SD_cmd_output(uchar out_cmd)
  1195. {
  1196.     int i;
  1197.     unsigned sclk_high, sclk_low;
  1198.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1199.     for (i=0; i<8; i++) {
  1200. if (out_cmd &0x80) {
  1201.     SET_SD_CMD;
  1202. } else {
  1203.     CLEAR_SD_CMD;
  1204. }
  1205. PULSE_SD_CLK_HL;
  1206. out_cmd <<= 1;
  1207.     }
  1208. }
  1209. static void SD_1_bit_data_out(uchar out_data)
  1210. {
  1211.     int i;
  1212.     unsigned sclk_high, sclk_low;
  1213.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1214.     for (i=0; i<8; i++) {
  1215. CLEAR_SD_CLK;
  1216. if (out_data & 0x80) {
  1217.     SET_SD_DAT0;
  1218. } else {
  1219.     CLEAR_SD_DAT0;
  1220. }
  1221. SET_SD_CLK;
  1222. out_data <<= 1;
  1223.     }
  1224. }
  1225. static void SD_4_bit_data_out(char *pOutData, int cnt)
  1226. {
  1227.     int i;
  1228.     char out_data;
  1229.     unsigned sclk_high, sclk_low;
  1230.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1231.     for(i= 0; i<cnt; i++){
  1232. out_data = *pOutData++;
  1233. CLEAR_SD_CLK;
  1234. SET_SD_DAT3_0( ((out_data>>4) & 0xf));
  1235. SET_SD_CLK;
  1236. CLEAR_SD_CLK;
  1237. SET_SD_DAT3_0( (out_data&0xf));
  1238. SET_SD_CLK;
  1239.     }
  1240. }
  1241. /*****************************************************************
  1242.   up to 1 DWORD
  1243. ******************************************************************/
  1244. static int SD_1_bit_data_in(int bit_cnt)
  1245. {
  1246.     int i, data_in;
  1247.     unsigned sclk_high, sclk_low;
  1248.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1249.     data_in = 0;    
  1250.     for (i=0; i<bit_cnt; i++){
  1251. data_in <<= 1;
  1252. CLEAR_SD_CLK;
  1253. if(sd_is_mmc){
  1254.     asm("nop"); asm("nop");asm("nop");
  1255.     data_in |= SD_DAT0;
  1256.     SET_SD_CLK;
  1257. }else{
  1258.     SET_SD_CLK;
  1259.     data_in |= SD_DAT0;
  1260. }
  1261.     }     
  1262.     return data_in;
  1263. }
  1264. /* 
  1265.   Function: The main SD transmission state machine..processes
  1266.     all SD/MMC related commands. 
  1267.     (ref. SD bus protocol, pp.10-83, 
  1268.      SD-mem Physical layer specifications)
  1269.   input: no arguments, but relies on "SD_xmit_info" structure for
  1270.          state transitions and transmission info.
  1271.   output:       
  1272.   side-effects: 
  1273. "SD_xmit_info" members are updated according to 
  1274. transmission progress.
  1275. */
  1276. void SD_service(void) 
  1277. {    
  1278.     static uint sd_mask, sd_cmd_info, *sd_rdata_ptr, sd_cnt;
  1279.     static ushort sd_crc[4];
  1280.     int i,j, sd_cmd_high, sd_dat0_high, arg;
  1281.     uint tmp, data_in;
  1282.     int wr_feedback_crc;
  1283.     char cmd_buf[8], *pChar;
  1284.     unsigned sclk_high, sclk_low;
  1285.     SD_GET_SCLK_VAL(sclk_high, sclk_low);
  1286.     switch (SD_xmit_info.com_state) {
  1287.     case HOST2SD_START:
  1288. SET_SD_CMD;
  1289. CLEAR_SD_CLK;     /* prepare */
  1290. sd_cmd_info = (SD_xmit_info.cmd&0x3f)|0x40;
  1291. sd_cnt = 0;
  1292. pChar = cmd_buf;
  1293. *pChar++ = sd_cmd_info;
  1294. arg = SD_xmit_info.arg;
  1295. *pChar++ =(arg>>24)&0xff;
  1296. *pChar++ =(arg>>16)&0xff;
  1297. *pChar++ =(arg>>8)&0xff;
  1298. *pChar = arg & 0xff;
  1299. sd_crc[0] = SD_calc_crc7(cmd_buf, 5);
  1300. SD_xmit_info.com_state = HOST2SD_CMD;
  1301. SD_xmit_info.result = -1; /* need to set to be 0 when succeed, 
  1302.                                      currently only used in case of Erase */
  1303. /*break; save time..let it drop*/
  1304.     case HOST2SD_CMD:
  1305. sd_cnt++; /* for timeout/mode check */
  1306. /* command index/argument..8bits at a time */
  1307. for(i=0; i<5; i++)
  1308.     SD_cmd_output(cmd_buf[i]);
  1309.  
  1310. SD_xmit_info.com_state = HOST2SD_CRC7;
  1311. break;
  1312.     
  1313.     case HOST2SD_CRC7:
  1314. /* send crc7 */
  1315. tmp = (sd_crc[0]<<1) | 1; /* crc7 + end bit */
  1316. SD_cmd_output(tmp);
  1317. CLEAR_SD_CLK;
  1318. if (SD_xmit_info.response_expected) {     
  1319.     SD_CMD_INPUT; /* tristate cmd */
  1320.     if (SD_xmit_info.use_data == 2) { 
  1321. /* data read */
  1322. if (SD_xmit_info.data_width) {
  1323.     /* all four data lines used */
  1324.     SD_DAT3_0_INPUT;
  1325. } else {
  1326.     SD_DAT0_INPUT;
  1327. }
  1328. sd_cmd_info = 0; /* bytes received */
  1329. SD_xmit_info.wait_nclk = SD_card_info.n_ac_max;
  1330.     } 
  1331.     else if(SD_xmit_info.response_expected == SD_R1b){
  1332. SD_DAT0_INPUT; /* busy check */
  1333.     }
  1334.     sd_rdata_ptr = SD_xmit_info.rd_dest_ptr;
  1335.     SD_xmit_info.com_state = HOST2SD_WAIT;
  1336. } else {
  1337.     SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1338. }
  1339. break;
  1340.     case HOST2SD_WAIT:
  1341. /* check 8 cycles at a time */
  1342.      
  1343. for (i = 0; SD_xmit_info.wait_nclk; i++) {
  1344.     SD_LOCK15;
  1345.     SET_SD_CLK;
  1346.     if(sd_is_mmc){
  1347. CLEAR_SD_CLK;
  1348. sd_cmd_high = SD_CMD_HIGH? 1:0;
  1349. sd_dat0_high = SD_DAT0_HIGH? 1:0;
  1350.     }else{
  1351. sd_cmd_high = SD_CMD_HIGH? 1:0;
  1352. sd_dat0_high = SD_DAT0_HIGH? 1:0;
  1353. CLEAR_SD_CLK;
  1354.     }
  1355.     if (SD_xmit_info.use_data != 2
  1356. && !SD_xmit_info.response_recv
  1357. && !sd_cmd_high){ /* response start bit */
  1358. SD_LOCK15;
  1359. SET_SD_CLK;
  1360. if(sd_is_mmc){
  1361.     CLEAR_SD_CLK;
  1362.     sd_cmd_high = SD_CMD_HIGH? 1:0;
  1363. }else{
  1364.     sd_cmd_high = SD_CMD_HIGH? 1:0;
  1365.     CLEAR_SD_CLK;
  1366. }
  1367. /* get SD response */
  1368. sd_crc[0] = 0;
  1369. sd_mask = 6; /* bit count */
  1370. sd_cmd_info = 0; /* clear received bits */  
  1371. sd_cnt = 0; /* for timeout/mode check */
  1372. SD_xmit_info.com_state = SD2HOST_NODATA;
  1373. break;
  1374.     } else if ((SD_xmit_info.use_data==2) 
  1375.        && !sd_dat0_high) { /* data start bit? */
  1376. sd_crc[0] = 0; /* clear crc */
  1377. /* current block size (bytes) */
  1378.         if(SD_xmit_info.cmd == MMC_CMD_READ_UNTIL_STOP)
  1379.     sd_mask = SD_xmit_info.data_len;
  1380. else
  1381.     sd_mask = 1 << (SD_xmit_info.cur_blk_size);
  1382. if(SD_xmit_info.data_width){
  1383.     SD_xmit_info.com_state = SD2HOST_DATA4;
  1384. }
  1385. else{
  1386.     SD_xmit_info.com_state = SD2HOST_DATA1;
  1387. }
  1388. break;
  1389.     }
  1390.     /* btan: After received response, we actually don't need wait n_wr_max clk. *
  1391.      * 4 clk is ok for my SD. I did not test other SD. If you meet problem in   *
  1392.      * SD writing function, please increase it or let me know. */
  1393.     else if (SD_xmit_info.use_data != 2 && SD_xmit_info.response_recv 
  1394.      && sd_cmd_high && SD_xmit_info.wait_nclk > 4) {
  1395. SD_xmit_info.wait_nclk = 4;
  1396.     }
  1397.     SD_xmit_info.wait_nclk--;
  1398. }
  1399. if (!SD_xmit_info.wait_nclk) {
  1400. #ifdef  SD_ENABLE_WRITE
  1401.     if (SD_xmit_info.use_data == 1
  1402. && SD_xmit_info.response_recv) {
  1403. /* prepare to write.. */
  1404. /* current block size (bytes) */
  1405. sd_cmd_info = 1 << (SD_xmit_info.cur_blk_size);
  1406. if (SD_xmit_info.data_width) {
  1407.     /* write wide bus */
  1408.     CLEAR_SD_DAT3_0;
  1409.     SD_xmit_info.com_state = HOST2SD_DATA4;
  1410. } else {
  1411.     CLEAR_SD_DAT0;
  1412.     SD_xmit_info.com_state = HOST2SD_DATA1;
  1413. }     
  1414. break;
  1415.     } else 
  1416. #endif /* SD_ENABLE_WRITE */
  1417.     {
  1418. /* timed out..send again?? */
  1419.                 JPRINTF(("SD res:time out. xmit_len %d, xmit_cnt %d cmd %dn",
  1420.  SD_xmit_info.data_len, SD_xmit_info.data_cnt,
  1421.  SD_xmit_info.cmd));
  1422. SD_xmit_info.retry_cnt++;
  1423. SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1424.     }
  1425. }
  1426. break;
  1427. #ifdef SD_ENABLE_WRITE
  1428.     case HOST2SD_DATA1:
  1429. /* write data, one byte at a time */
  1430. sd_cmd_info = 1 << (SD_xmit_info.cur_blk_size);
  1431. pChar = (char*)SD_xmit_info.wr_src_ptr + SD_xmit_info.data_cnt;
  1432. /* crc16 calculation for narrow bus */
  1433. sd_crc[0] = SD_calc_crc16((uchar *)pChar,sd_cmd_info);
  1434.         JPRINTF(("Xmit src %x, len %dn", pChar, sd_cmd_info));
  1435. /* send start bit */
  1436.     CLEAR_SD_DAT0;
  1437.     CLEAR_SD_CLK;
  1438.     SET_SD_CLK;
  1439. for(i=0; i<sd_cmd_info; i++)
  1440.     SD_1_bit_data_out(*pChar++);
  1441.    
  1442. SD_xmit_info.data_cnt += sd_cmd_info; /* monitor total bytes */
  1443. /* set wait timeout cycles..in case multi-block */
  1444. SD_xmit_info.wait_nclk = SD_card_info.n_wr_max; 
  1445. /* finished data..send CRC */
  1446. SD_xmit_info.com_state = HOST2SD_CRC16_DATA;
  1447. break;
  1448.     case HOST2SD_DATA4:
  1449. /* wide bus write, 32bits at a time */
  1450. sd_cmd_info = 1 << (SD_xmit_info.cur_blk_size);
  1451. pChar = (char*)SD_xmit_info.wr_src_ptr + SD_xmit_info.data_cnt;
  1452.         PRINTF(("wr_src_ptr %x, data_cnt %x pChar %xn",
  1453.  SD_xmit_info.wr_src_ptr, SD_xmit_info.data_cnt, pChar));
  1454. /* crc16 calculation for 4-bit bus */
  1455. SD_calc_crc16_4_bit((int*)pChar, sd_cmd_info>>2, sd_crc);
  1456. /* send start bit */
  1457.     CLEAR_SD_DAT3_0;
  1458.     CLEAR_SD_CLK;
  1459.     SET_SD_CLK;
  1460. SD_4_bit_data_out(pChar, sd_cmd_info);
  1461. SD_xmit_info.data_cnt += sd_cmd_info; /* monitor total bytes */
  1462. /* set wait timeout cycles..in case multi-block */
  1463. SD_xmit_info.wait_nclk = SD_card_info.n_wr_max; 
  1464. /* finished data "block"..get CRC */
  1465. SD_xmit_info.com_state = HOST2SD_CRC16_DATA;
  1466. break;
  1467.     case HOST2SD_CRC16_DATA:
  1468. /* send crc16 */
  1469. if (SD_xmit_info.data_width){
  1470.     /* wide bus */
  1471.     uint filter = 0x8000;
  1472.     for (i=0; i<16; i++){
  1473. CLEAR_SD_CLK;
  1474. tmp = 0;
  1475.                 for(j=0; j<4; j++){
  1476.     tmp |= ( (sd_crc[j]&filter?1:0)<<j);
  1477. }
  1478. SET_SD_DAT3_0(tmp);
  1479. SET_SD_CLK;
  1480.      filter >>= 1;
  1481.     }
  1482.     /* send end bit */
  1483.     CLEAR_SD_CLK;
  1484.     SET_SD_DAT3_0(0xf); /* set dat[3:0] high */
  1485.     SET_SD_CLK;
  1486.     SD_DAT0_INPUT;    
  1487. } else {
  1488.     /* narrow bus */
  1489.     SD_1_bit_data_out(sd_crc[0]>>8);
  1490.     SD_1_bit_data_out(sd_crc[0]&0xff);
  1491.     /* send end bit */
  1492.     CLEAR_SD_CLK;
  1493.     SET_SD_DAT0;
  1494.     SET_SD_CLK;
  1495.     SD_DAT0_INPUT;    
  1496. }
  1497. PRINTF(("wait to get crc back n"));
  1498. /* 2 clks..then there should be CRC check start bit */
  1499. PULSE_SD_CLK;     
  1500. PULSE_SD_CLK;
  1501. /* crc status: 010: Ok
  1502.                        101: Transimission error
  1503.                        111: Error */
  1504. wr_feedback_crc = SD_1_bit_data_in(5);
  1505. sd_cnt = 0;
  1506.         if(wr_feedback_crc != 0x5){
  1507.     JPRINTF(("crc after xmit CRC16: %xn",wr_feedback_crc));
  1508.     SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1509. }
  1510. else{
  1511.     SD_xmit_info.wait_nclk = 100*SD_card_info.n_wr_max; 
  1512.     SD_xmit_info.com_state = HOST2SD_CHECK_BUSY;
  1513. }
  1514. break;
  1515. #endif /* SD_ENABLE_WRITE */
  1516.     case HOST2SD_CHECK_BUSY:
  1517. #if 0
  1518. /* Reading performance will be impacted */
  1519. RISC_sleep_nsec(3000000);
  1520. #endif
  1521. sd_cnt++; /* for timeout/mode check */
  1522. for (i=0; i<8; i++) {
  1523.     PULSE_SD_CLKZ;
  1524.     if (SD_DAT0_HIGH) { /* Busy bit */
  1525. /* SD not Busy..continue */
  1526. /* set next_state..
  1527.  *  - for single-block write, prepare to go idle 
  1528.  *  - for multi-block write, write another block
  1529.  */
  1530. PRINTF((" Not busy ... xmit_cnt %dn", 
  1531.  SD_xmit_info.data_cnt));
  1532. if(SD_xmit_info.cmd == SD_CMD_WRITE_MULTI_BLOCK
  1533.    && SD_xmit_info.data_cnt < SD_xmit_info.data_len){
  1534.     SD_xmit_info.wait_nclk = SD_card_info.n_wr_max; 
  1535.     SD_xmit_info.com_state = HOST2SD_WAIT;
  1536. }
  1537. else{
  1538.     SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1539.     SD_xmit_info.result = 0;
  1540. }
  1541. /* single block write  or erase*/
  1542. break;
  1543.     }
  1544. }
  1545. /*consider a timeout mechanism for this state */
  1546. if (sd_cnt > SD_xmit_info.wait_nclk){
  1547.     JPRINTF(("Check Bus Busy: Time outn"));
  1548.     SD_xmit_info.com_state = HOST2SD_8CYCLES; 
  1549. }
  1550. break;
  1551.     case SD2HOST_NODATA:
  1552. sd_cnt++; /* for timeout/mode check */
  1553. /* response: command index/arg..8bits at a time */
  1554. data_in = 0;
  1555.        
  1556. for (i=0; (i<8) && sd_mask; i++) {
  1557.     SD_LOCK15;     
  1558.             SET_SD_CLK;
  1559.     if(sd_is_mmc){
  1560. CLEAR_SD_CLK;
  1561. sd_cmd_high = SD_CMD_HIGH? 1:0;
  1562.     }else{
  1563. sd_cmd_high = SD_CMD_HIGH? 1:0;
  1564. CLEAR_SD_CLK;
  1565.     }
  1566.     data_in <<= 1;
  1567.     data_in |= sd_cmd_high;
  1568.     sd_mask--; /* bit count remain */
  1569. }
  1570. if (i==8) { /* one arg byte in..cmd index only has 6 bits */
  1571.     SD_rdata32 <<= 8;
  1572.     SD_rdata32 |= data_in;
  1573.     sd_cmd_info += 8; /* received bits */     
  1574.     if (sd_cmd_info == 32) { /* received 32 bits */
  1575. *sd_rdata_ptr++ = SD_rdata32;
  1576. /* for 32 bit data we won't get anymore */
  1577. sd_cmd_info = 0; /* reset */
  1578.     }
  1579. }
  1580. if (!sd_mask) {
  1581.     if (sd_cnt == 1) {
  1582. /* finished cmd..get arg */
  1583. if (SD_xmit_info.response_expected == SD_R2) {
  1584.     sd_mask = 120; /* CID/CSD bit count */
  1585.     sd_crc[0] = 0; /* CRC7 on arg data only */
  1586. } else {
  1587.     sd_mask = 32; /* bit count */
  1588. }
  1589. sd_cmd_info = 0; /* clear received bits */
  1590. /* no state change..SD_xmit_info.com_state */
  1591.     } else if ((sd_cnt == 16) &&
  1592.        (SD_xmit_info.response_expected == SD_R2)) {
  1593. /* finished CID/CSD register..next CRC7 */
  1594. sd_crc[1] = sd_crc[0]; /* save current crc */
  1595. sd_mask = 8; /* internal CRC7 + end bit */
  1596. /* no state change..SD_xmit_info.com_state */
  1597.     } else {
  1598. /* finished arg.. */
  1599. if (SD_xmit_info.response_expected == SD_R2) {
  1600.     /* internal crc */
  1601. #if SD_CHECK_RECV_CRC
  1602.     data_in = 
  1603. (SD_xmit_info.cmd == SD_CMD_SEND_CSD) ?
  1604. (uint)SD_csd_reg_ptr->crc : 
  1605. (uint)SD_cid_reg_ptr->crc;
  1606.     
  1607.     data_in &= 0x7f; /* 7bit crc */
  1608.     sd_crc[1] &= 0x7f; /* 7bit crc */
  1609.     if (data_in != sd_crc[1]) {
  1610. /* crc error */
  1611. SD_xmit_info.crc7_err_cnt++;
  1612. CPRINTF(("R2 CRC7 error in SD_service()n"));
  1613. CPRINTF(("xmit crc: 0x%x, gen crc: 0x%xn",
  1614.  data_in, sd_crc[1]));
  1615. BREAKPOINT(0);
  1616.     }
  1617. #endif /* SD_CHECK_RECV_CRC */
  1618.     SD_xmit_info.response_recv = 1;
  1619.     SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1620. } else {
  1621.     /* R6 response data */
  1622.     if (SD_xmit_info.response_expected == SD_R6) {
  1623. sd_rdata_ptr = (uint *)SD_card_status_ptr;
  1624. *sd_rdata_ptr &= (~0x1fff);
  1625. *sd_rdata_ptr |= (SD_rdata32 & 0x1fff);
  1626. SD_card_status_ptr->error = 
  1627.     (SD_rdata32>>12) & 1;
  1628. SD_card_status_ptr->illegal_cmd = 
  1629.     (SD_rdata32>>13) & 1;
  1630. SD_card_status_ptr->com_crc_error = 
  1631.     (SD_rdata32>>14) & 1;
  1632. SD_rca_reg = SD_rdata32>>16;
  1633.     }
  1634.     if (SD_xmit_info.response_expected == SD_R3) {
  1635. /* R3 response has no CRC7 */
  1636. sd_crc[0] = 0x7f;
  1637.     }
  1638.     /* finished arg..get CRC */
  1639.     SD_xmit_info.com_state = SD2HOST_CRC7_NODATA;
  1640. }
  1641.     }
  1642. }
  1643. break;
  1644.     case SD2HOST_DATA1:
  1645. /* just get data, 32*sd_maskbits at a time..ignore response */
  1646.          
  1647.  PRINTF(("SD2HOST_DATA1: xmit_len %d, xmit_data %d sd_mask %dn",
  1648.   SD_xmit_info.data_len, SD_xmit_info.data_cnt, sd_mask));
  1649.  
  1650.  sd_cmd_info = sd_mask;
  1651.  j = (sd_mask+3)/4;
  1652.  if(sd_is_mmc){
  1653.      do{
  1654.  data_in = 0;    
  1655.  for (i=0; (i<32); i++){
  1656.      data_in <<= 1;
  1657.      SD_LOCK15;
  1658.      SET_SD_CLK;
  1659.      CLEAR_SD_CLK;
  1660.      asm("nop"); asm("nop");asm("nop");
  1661.      data_in |= SD_DAT0;
  1662.  }     
  1663.  *sd_rdata_ptr++ = data_in;
  1664.      }while(--j>0);
  1665.  
  1666.  }else{
  1667.      do{
  1668.  data_in = 0;    
  1669.  for (i=0; (i<32); i++){
  1670.      data_in <<= 1;
  1671.      SD_LOCK15;
  1672.      SET_SD_CLK;
  1673.      data_in |= SD_DAT0;
  1674.      CLEAR_SD_CLK;
  1675.  }     
  1676.  *sd_rdata_ptr++ = data_in;
  1677.      }while(--j>0);
  1678.  }
  1679.  PRINTF(("SD_xmit_cmd %dn", SD_xmit_info.cmd));
  1680.  if(SD_xmit_info.cmd == SD_CMD_READ_MULTI_BLOCK){
  1681.      SD_xmit_info.data_cnt += sd_cmd_info;
  1682.      PRINTF(("SD_xmit_cmd %dn", SD_xmit_info.cmd));
  1683.  }
  1684.  else{
  1685.      SD_xmit_info.data_cnt = sd_cmd_info;
  1686.  }
  1687.  
  1688.  /* set wait timeout cycles..in case multi-block */
  1689.  SD_xmit_info.wait_nclk = SD_card_info.n_ac_max;
  1690.  
  1691.  /* finished arg..get CRC */
  1692.  if(SD_xmit_info.cmd == MMC_CMD_READ_UNTIL_STOP){
  1693.      SD_xmit_info.com_state = SD_IDLE;
  1694.  }else{
  1695.      SD_xmit_info.com_state = SD2HOST_CRC16_DATA;
  1696.      PRINTF(("go to get CRC16n"));
  1697.  }
  1698.  break;
  1699.     case SD2HOST_DATA4:
  1700. /* just get data, 32bits at a time..ignore response */
  1701. sd_cmd_info += sd_mask;
  1702. sd_mask >>= 2;
  1703. do{
  1704.     data_in = 0;
  1705.     for (i=0; (i<8); i++){
  1706. SD_LOCK15;
  1707. SET_SD_CLK;
  1708. data_in <<= 4;
  1709. data_in |= SD_DAT3_0;
  1710. CLEAR_SD_CLK;
  1711.     }
  1712.     *sd_rdata_ptr++ = data_in;
  1713.     sd_mask--; /* bytes remain */
  1714. }while(sd_mask>0);
  1715. SD_xmit_info.data_cnt = sd_cmd_info; /* monitor total bytes */
  1716. /* set wait timeout cycles..in case multi-block */
  1717. SD_xmit_info.wait_nclk = SD_card_info.n_ac_max; 
  1718. /* finished data block..get CRC */
  1719. SD_xmit_info.com_state = SD2HOST_CRC16_DATA;
  1720. break;
  1721.     case SD2HOST_CRC7_NODATA:
  1722. /* get crc7 */
  1723. data_in = 0;
  1724. /* clock in crc7 + end bit */
  1725.  
  1726. for (i=0; (i < 8); i++) {
  1727.     SD_LOCK15;
  1728.     SET_SD_CLK;
  1729.     if(sd_is_mmc){
  1730. CLEAR_SD_CLK;
  1731. sd_cmd_high = SD_CMD_HIGH ?1:0;
  1732.     }else{
  1733. sd_cmd_high = SD_CMD_HIGH ?1:0;
  1734. CLEAR_SD_CLK;
  1735.     }
  1736. #if SD_CHECK_RECV_CRC
  1737.     data_in <<= 1;
  1738.     data_in |= sd_cmd_high;
  1739. #endif
  1740. }
  1741. SD_xmit_info.response_recv = 1;
  1742. if(SD_xmit_info.response_expected == SD_R1b){
  1743.     if(SD_xmit_info.cmd == SD_CMD_ERASE
  1744.    && (SD_card_status_ptr->erase_seq_error
  1745.        || SD_card_status_ptr->erase_param)
  1746.        ){
  1747. JPRINTF(("Erase error...n"));
  1748. SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1749.     }else{
  1750. SD_xmit_info.wait_nclk = 100*SD_card_info.n_wr_max; 
  1751. SD_xmit_info.com_state = HOST2SD_CHECK_BUSY;
  1752. JPRINTF(("R1b: to check busy state: card_status %x, cmd %d n",
  1753.  *(int*)SD_card_status_ptr, SD_xmit_info.cmd));
  1754.     }
  1755. }else{
  1756. #ifdef SD_ENABLE_WRITE
  1757.     if (SD_xmit_info.cmd == SD_CMD_WRITE_BLOCK
  1758. ||SD_xmit_info.cmd == SD_CMD_WRITE_MULTI_BLOCK ) { 
  1759. /* data write */
  1760. if (SD_xmit_info.data_width) {
  1761.     SET_SD_DAT3_0(0xf); /* set dat[3:0] high */
  1762. } else {
  1763.     SET_SD_DAT0;
  1764. }
  1765. SD_xmit_info.wait_nclk = SD_card_info.n_wr_max;
  1766. SD_xmit_info.com_state = HOST2SD_WAIT;
  1767. SD_xmit_info.data_cnt = 0;
  1768. JPRINTF(("Wait to write data, status %xn",
  1769.  *(int*)SD_card_status_ptr));
  1770.     }else
  1771. #endif /* SD_ENABLE_WRITE */
  1772. SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1773. }
  1774. break;
  1775.     case SD2HOST_CRC16_DATA:
  1776. /* get crc16 */
  1777. data_in = 0;
  1778. /* clock in crc16 + end bit */
  1779.         PRINTF(("SD2HOST_CRC16_DATA:n"));
  1780. for (i=0; (i < 17); i++) {
  1781.     data_in <<= 1;
  1782.     SD_LOCK15;
  1783.     SET_SD_CLK;
  1784.     if(sd_is_mmc){
  1785. CLEAR_SD_CLK;
  1786. data_in |= SD_DAT0;
  1787.     }else{
  1788. data_in |= SD_DAT0;
  1789. CLEAR_SD_CLK;
  1790.     }
  1791. }
  1792. if(data_in &1 == 0)
  1793. JPRINTF(("End bit not found.n"));
  1794. /* 
  1795.  *  - for single-block read, prepare to go idle 
  1796.  *  - for multi-block read, get another block
  1797.  */
  1798. if (SD_xmit_info.cmd == SD_CMD_READ_MULTI_BLOCK) {
  1799.     PRINTF(("end of sector, xmit_cnt %d  xmit_len %dn", 
  1800.      SD_xmit_info.data_cnt,SD_xmit_info.data_len));
  1801.     if(sd_is_mmc 
  1802.        && SD_xmit_info.data_cnt>= SD_xmit_info.data_len){
  1803.    SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1804.    SD_xmit_info.response_recv = 1;
  1805.    PRINTF(("command->HOST2SD_8CYCLES n"));
  1806.        }
  1807.     else{
  1808. SD_xmit_info.com_state = HOST2SD_WAIT;
  1809.     }
  1810. } else {
  1811.     SD_xmit_info.response_recv = 1; /* prevent resend */
  1812.     SD_xmit_info.com_state = HOST2SD_8CYCLES;
  1813. }
  1814. break;
  1815.     case HOST2SD_8CYCLES:
  1816. /* extra 8 Clocks for SD card's post-processing */
  1817. for (i = 0; i < 8; i++){
  1818.     SD_LOCK15;
  1819.     SET_SD_CLK;
  1820.     CLEAR_SD_CLK;
  1821. }
  1822. /* check for next command..or resend */
  1823. if (SD_get_next_cmd()){
  1824.     JPRINTF(("next cmd not emptyn"));
  1825.     SD_xmit_info.com_state = HOST2SD_START;
  1826. } else {
  1827.     SD_xmit_info.cmd_sent = 1; /* cmd completed */
  1828.     SD_xmit_info.com_state = SD_IDLE;
  1829. }
  1830. break;
  1831.     case SD_IDLE:
  1832.     default:
  1833. break;
  1834.     }
  1835.     VCX_service();
  1836. }
  1837. int SD_get_status(void)
  1838. {
  1839.     int status = 0;
  1840.     
  1841.     status = SD_send_cmd(SD_CMD_SEND_STATUS,  SD_rca_reg<<16, 1);
  1842.     if(status != 1)
  1843. return -1;
  1844.     else
  1845. return (*(int*)SD_card_status_ptr);
  1846. }
  1847. #ifdef MD_ASYNC_RW
  1848. void SD_clear_state()
  1849. {
  1850.     SD_xmit_info.com_state = SD_IDLE;
  1851.     SD_xmit_info.cmd = SD_CMD_EMPTY;
  1852.     SD_acmdq.cmd = SD_CMD_EMPTY; /* clear cmd-Q */
  1853.     return;
  1854. }
  1855. /* return: 0: not finish; 1: finish; 2:read single finish; *
  1856.  * 3:write single finish; 4: read multi finish; 5: write multi finish*/
  1857. int SD_cmd_service()
  1858. {
  1859.     int ret = 0, status = 1;
  1860.     if (!SD_card_info.inserted) {
  1861. SD_clear_state();
  1862. return 1;
  1863.     }
  1864.     if (SD_xmit_info.com_state != SD_IDLE) SD_service();
  1865.     if (SD_xmit_info.com_state == SD_IDLE) {
  1866. if (SD_xmit_info.cmd == SD_CMD_READ_SINGLE_BLOCK) {
  1867.     ret = 2;
  1868. }
  1869. else if (SD_xmit_info.cmd == SD_CMD_WRITE_BLOCK) {
  1870.     ret = 3;
  1871. }
  1872. else if (SD_xmit_info.cmd == SD_CMD_READ_MULTI_BLOCK) {
  1873.     ret = 4;
  1874. }
  1875. else if (SD_xmit_info.cmd == SD_CMD_WRITE_MULTI_BLOCK) {
  1876.     ret = 5;
  1877. }
  1878. if (SD_xmit_info.cmd == SD_CMD_WRITE_MULTI_BLOCK || 
  1879.     SD_xmit_info.cmd == SD_CMD_READ_MULTI_BLOCK) {
  1880.     SD_xmit_info.cmd = SD_CMD_EMPTY;
  1881.     status = SD_send_cmd(SD_CMD_STOP_TRANSMIT, 0, 0);
  1882. }
  1883. else {
  1884.     SD_xmit_info.cmd = SD_CMD_EMPTY;
  1885.     if (!SD_get_next_cmd() && !ret) ret = 1;
  1886. }
  1887.     }
  1888.     else if (SD_xmit_info.cmd == SD_CMD_READ_MULTI_BLOCK &&
  1889.      SD_xmit_info.data_cnt >= SD_xmit_info.data_len && !sd_is_mmc) {
  1890. status = SD_send_cmd(SD_CMD_STOP_TRANSMIT, 0, 0);
  1891. ret = 4;
  1892.     }
  1893.     return ret;
  1894. }
  1895. #endif /*MD_ASYNC_RW*/
  1896. #if NOT_USED 
  1897. /* 
  1898.   Function: 
  1899.   input:
  1900.   output:       
  1901.   side-effects:
  1902. */
  1903. int SD_get_status(void)
  1904. {
  1905.     uint status = 0;
  1906.     
  1907.     if (SD_card_info.type > SD_MMC) {
  1908. SD_send_acmd(SD_ACMD_SD_STATUS, 0, 1);
  1909.     }
  1910.     return (status);
  1911. }
  1912. /* 
  1913.   Function: SD lock card (password protect)
  1914.   input:
  1915.   output:       
  1916.   side-effects:
  1917. */
  1918. int SD_lock_card(int action, char *passwd)
  1919. {
  1920.     int status;
  1921.     
  1922.     /*  lock/unlock card */
  1923.     return (status);
  1924. }
  1925. /* 
  1926.   Function: SD set password 
  1927.   input:
  1928.   output:       
  1929.   side-effects:
  1930. */
  1931. int SD_set_password(char *passwd)
  1932. {
  1933.     int status;
  1934.     
  1935.     /* set password */
  1936.     return (status);
  1937. }
  1938. /* 
  1939.   Function: SD reset password 
  1940.   input:
  1941.   output:       
  1942.   side-effects:
  1943. */
  1944. int SD_reset_password(char *passwd)
  1945. {
  1946.     int status;
  1947.     
  1948.     /* reset password  w/ and w/o password */
  1949.     return (status);
  1950. }
  1951. /* 
  1952.   Function: 
  1953.   input:
  1954.   output:       
  1955.   side-effects:
  1956. */
  1957. int SD_write_data(uint data)
  1958. {
  1959.     int status;
  1960.     /* send data w/ CRC16 */
  1961.     return (status);
  1962. }
  1963. #endif
  1964. #endif /* SD_MEMORY */