sync_mmc.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:7k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.11.00.00 11-04-03 (ddk-b13)" */
  9. /*
  10.  *  ======== mmcsync.c ========
  11.  *  Raw MMC soak test. Write/Readback of sequential MMC media sectors.
  12.  */
  13.  
  14. #include <std.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <log.h>
  18. #include <sys.h>
  19. #include <sem.h>
  20. #include <hwi.h>
  21. #include <gio.h>
  22. #include <tsk.h>
  23. #include <c5509_mmc.h>
  24. /* 
  25.  * The following are test attributes.
  26.  */
  27. #define VERIFYDATA    /* Perform readback data verification */
  28. #undef TESTFOREVER   /* Repeat test forever or until failure */
  29. //#define RUNSILENT     /* Suppress output during test */
  30.  
  31.  
  32. /*  Number of Channels that need to be opened  */
  33. #define CHANCOUNT    2
  34. #define INITIALVALUE 0x0     /* initial buffer value */
  35. #define MAXSECTORNUM 3200   /* Max sector number to test */
  36. /* interrupt mask definitions */
  37. #define C5509_MMC_IER0_MASK_DEFAULT 1
  38. #define C5509_MMC_IER1_MASK_DEFAULT 1
  39. static C5509_MMC_ChanObj chan[CHANCOUNT];
  40. /*  Buffers to be used with requests  */
  41. static MdUns  bufWrite[C5509_MMC_SECLEN]; 
  42. static MdUns  bufRead[C5509_MMC_SECLEN]; 
  43. /*  Globals  */
  44. C5509_MMC_DevObj    C5509_MMC_devObj;
  45. /*  Bind Parameters  */
  46. C5509_MMC_DevParams C5509_MMC_devParams = {
  47.     /* devParams */
  48.     C5509_MMC_VERSION_1, /* Version number */   
  49.     0,    /* Enable/disable DMA for data read/write */
  50.     0,    /* dat3EdgeDetection -- DUMMY */
  51.     0,    /* Determines if MMC goes IDLE during IDLE instr */
  52.     0,    /* enableClkPin -- DUMMY */
  53.     2,    /* CPU CLK to MMC function clk divide down */
  54.     3,    /* MMC function clk to memory clk divide down */
  55.     0,    /* 
  56.            *  No. memory clks to wait before response timeout
  57.            *  Zero indicates no timeout.
  58.            */
  59.     0,    /* 
  60.            *  No. memory clks to wait before data timeout 
  61.            *  Zero indicates no timeout.
  62.            */
  63.     512,   /* Length of DATA block to be read in BYTEs*/     
  64.     /* drvrParams */
  65.     2,     /* RCA - set by the application */
  66.     CHANCOUNT,           /* maximum number of channels required */
  67.     MEDIA_BYTENORMAL,    /* MEDIA_[BYTESWAP|BYTENORMAL] */
  68.     0,     /* DMA channel number used for READ operations */  
  69.     0,     /* DMA channel number used for WRITE operations */
  70.     NULL,  /* Buffer for DMA read */
  71.     NULL,  /* Buffer for DMA write */
  72.     chan,   /* Array of (noChan number of) Channel Objs */
  73.     C5509_MMC_IER0_MASK_DEFAULT,
  74.     C5509_MMC_IER1_MASK_DEFAULT
  75. };
  76.     
  77. /*  Media Read/Write structure.  */
  78. static MEDIA_RdWrObj  mediaObj;
  79. /*  Task helper functions*/
  80. static Int issue_read(GIO_Handle chan,Uns sectornum);
  81. static Int issue_write(GIO_Handle chan,Uns sectornum, MdUns charval);
  82. #ifdef TESTFOREVER
  83. static Uns scanCnt = 0; /* total # of sector sweeps of MAXSECTORNUM sectors */
  84. #endif
  85. /*
  86.  *  ======== main ========
  87.  *  Main function. 
  88.  */
  89. main()
  90. {
  91. }
  92. /*
  93.  *  ======== initTask ========
  94.  *
  95.  *  This is the TASK function.
  96.  */
  97. Void initTask()
  98. {
  99.     Int status = IOM_COMPLETED;
  100.     GIO_Handle chanHandle;
  101.     Int sect;  /* sector */
  102.         
  103.     printf("DATA VERIFICATION : "); 
  104. #ifdef VERIFYDATA
  105.     printf("ENABLEDn"); 
  106. #else
  107.     printf("DISABLEDn"); 
  108. #endif
  109.     
  110.     /*  Create a channel for accessing MMC.  */
  111.     chanHandle = GIO_create("/udevMmc0", IOM_INOUT, &status, NULL, NULL);
  112.         /*
  113.          * Note in the call to GIO_create, the last parameter is NULL
  114.          * This basically means use the default GIO Attrs which are:
  115.          *     npackets = 1, timeout = SYS_FOREVER
  116.          */
  117.     printf("Channel create status %dn", status);
  118. #ifdef TESTFOREVER
  119.     printf("TEST FOREVER ENABLEDn"); 
  120.     for(;;) {   
  121. #endif
  122.         for (sect = 1; sect <= MAXSECTORNUM; sect++) { 
  123.             /*  Issue Write.  */
  124.             status = issue_write(chanHandle, sect, INITIALVALUE);
  125.             if (status != IOM_COMPLETED) {
  126.                 printf("ERROR - write failure, status = %dn", status);
  127.                 break;
  128.             }
  129. #ifndef RUNSILENT
  130.             printf("Wrote to sector %d: buf[0]=%x , buf[1]=%x , buf[255]=%xn",
  131.                     sect, bufWrite[0], bufWrite[1], bufWrite[255]);    
  132. #endif
  133.             /*  Issue Read.  */
  134.             status = issue_read(chanHandle, sect);
  135.             if (status != IOM_COMPLETED) {
  136.                 printf("ERROR - read failure, status = %dn", status);
  137.                 break;
  138.             }
  139. #ifndef RUNSILENT            
  140.             printf("Read from sector %d: buf[0]=%x , buf[1]=%x , buf[255]=%xn",
  141.                     sect, bufRead[0], bufRead[1], bufRead[255]);
  142. #endif
  143.         }
  144. #ifdef TESTFOREVER
  145.         scanCnt++;   /* bump total scan cnt  */
  146.         printf("Scanned %d sectors a total of %d timesn", MAXSECTORNUM, scanCnt);
  147.         if (status != IOM_COMPLETED) {
  148.             printf("FAILED : sector = %dn", sect);
  149.             break;
  150.         }
  151.     }
  152. #endif
  153.     /*  Delete the created channel.  */
  154.     status = GIO_delete(chanHandle);
  155.     printf("Channel delete status %dn", status);
  156. /*
  157.  *  ======== issue_write ========
  158.  *
  159.  *  Issues write command.
  160.  */
  161.  
  162. static Int issue_write(GIO_Handle chan, Uns sectornum, MdUns charval)
  163.     Uns size;
  164.     Int i;
  165.     Int status = IOM_COMPLETED;
  166.     Int index = sectornum;
  167.  
  168.     for (i = 0; i < C5509_MMC_SECLEN; i++, index++) {
  169.         bufWrite[i] = charval + index; /* add index to charval*/
  170.         
  171.     }
  172.     mediaObj.buf = bufWrite;
  173.     mediaObj.address = sectornum;
  174.     mediaObj.subAddress = 0;
  175.     mediaObj.length = C5509_MMC_SECLEN; 
  176.     size = sizeof(mediaObj);
  177.      
  178.     /*  Submit request  */
  179.     if ((status = GIO_write(chan, &mediaObj, &size)) < 0) {
  180.         printf("ERROR in writting data at sector %d, status = %dn", 
  181.                 sectornum, status);
  182.     }
  183.     
  184.     return status;
  185. }
  186. /*
  187.  *  ======== issue_read ========
  188.  *
  189.  *  Issues read command.
  190.  */
  191.  
  192. static Int issue_read(GIO_Handle chan, Uns sectornum)
  193. {
  194.     Uns size;
  195.     Int i;
  196.     Int status = IOM_COMPLETED;
  197.     for (i = 0; i < C5509_MMC_SECLEN; i++) {
  198.         bufRead[i] = 0;     /* zero readback buffer */
  199.     }
  200.     mediaObj.buf = bufRead;
  201.     mediaObj.address = sectornum;
  202.     mediaObj.subAddress = 0;
  203.     mediaObj.length = C5509_MMC_SECLEN;
  204.     size = sizeof(mediaObj);
  205.     
  206.     /* Submit request  */
  207.     status = GIO_read(chan, &mediaObj, &size);
  208.     if (status < 0) {
  209.         printf("ERROR - in reading data at sector %d, status = %dn", 
  210.                 sectornum, status); 
  211.     }
  212.     else if (size != sizeof(mediaObj)) {
  213.         printf("ERROR - Unexpected size returned");
  214.         status = IOM_EBADIO;
  215.     }
  216. #ifdef VERIFYDATA
  217.     if (status == IOM_COMPLETED) {
  218.         /* Verify data written is the same as read */
  219.         for(i=0; i < C5509_MMC_SECLEN; i++ ) {
  220.             if (bufWrite[i] != bufRead[i]) {
  221.                 printf("ERROR - Sector=%d, Wr=%x, Rd=%x, Offset=%dn", 
  222.                      sectornum, bufWrite[i], bufRead[i],  i ); 
  223.                 status = IOM_EBADIO;
  224.                 break;
  225.             }   
  226.         }
  227.     }
  228. #endif
  229.     return status;
  230. }