⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sync_mmc.c

📁 DSP/BIOS Driver Developer Kit 1.11 The DSP/BIOS Driver Developer Kit (DDK) provides a selection of
💻 C
字号:
/*
 *  Copyright 2003 by Texas Instruments Incorporated.
 *  All rights reserved. Property of Texas Instruments Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  
 */
/* "@(#) DDK 1.11.00.00 11-04-03 (ddk-b13)" */
/*
 *  ======== mmcsync.c ========
 *  Raw MMC soak test. Write/Readback of sequential MMC media sectors.
 */
 
#include <std.h>
#include <stdio.h>
#include <stdlib.h>
#include <log.h>
#include <sys.h>
#include <sem.h>
#include <hwi.h>
#include <gio.h>
#include <tsk.h>
#include <c5509_mmc.h>

/* 
 * The following are test attributes.
 */
#define VERIFYDATA    /* Perform readback data verification */
#undef TESTFOREVER   /* Repeat test forever or until failure */
//#define RUNSILENT     /* Suppress output during test */
 
 
/*  Number of Channels that need to be opened  */
#define CHANCOUNT    2

#define INITIALVALUE 0x0     /* initial buffer value */

#define MAXSECTORNUM 3200   /* Max sector number to test */

/* interrupt mask definitions */
#define C5509_MMC_IER0_MASK_DEFAULT 1
#define C5509_MMC_IER1_MASK_DEFAULT 1

static C5509_MMC_ChanObj chan[CHANCOUNT];

/*  Buffers to be used with requests  */
static MdUns  bufWrite[C5509_MMC_SECLEN]; 
static MdUns  bufRead[C5509_MMC_SECLEN]; 

/*  Globals  */
C5509_MMC_DevObj    C5509_MMC_devObj;

/*  Bind Parameters  */
C5509_MMC_DevParams C5509_MMC_devParams = {
    /* devParams */
    C5509_MMC_VERSION_1, /* Version number */   
    0,    /* Enable/disable DMA for data read/write */
    0,    /* dat3EdgeDetection -- DUMMY */
    0,    /* Determines if MMC goes IDLE during IDLE instr */
    0,    /* enableClkPin -- DUMMY */
    2,    /* CPU CLK to MMC function clk divide down */
    3,    /* MMC function clk to memory clk divide down */
    0,    /* 
           *  No. memory clks to wait before response timeout
           *  Zero indicates no timeout.
           */
    0,    /* 
           *  No. memory clks to wait before data timeout 
           *  Zero indicates no timeout.
           */
    512,   /* Length of DATA block to be read in BYTEs*/     

    /* drvrParams */
    2,     /* RCA - set by the application */
    CHANCOUNT,           /* maximum number of channels required */
    MEDIA_BYTENORMAL,    /* MEDIA_[BYTESWAP|BYTENORMAL] */
    0,     /* DMA channel number used for READ operations */  
    0,     /* DMA channel number used for WRITE operations */
    NULL,  /* Buffer for DMA read */
    NULL,  /* Buffer for DMA write */
    chan,   /* Array of (noChan number of) Channel Objs */
    C5509_MMC_IER0_MASK_DEFAULT,
    C5509_MMC_IER1_MASK_DEFAULT
};
    

/*  Media Read/Write structure.  */
static MEDIA_RdWrObj  mediaObj;

/*  Task helper functions*/
static Int issue_read(GIO_Handle chan,Uns sectornum);
static Int issue_write(GIO_Handle chan,Uns sectornum, MdUns charval);
#ifdef TESTFOREVER
static Uns scanCnt = 0; /* total # of sector sweeps of MAXSECTORNUM sectors */
#endif

/*
 *  ======== main ========
 *  Main function. 
 */
main()
{
}

/*
 *  ======== initTask ========
 *
 *  This is the TASK function.
 */

Void initTask()
{
    Int status = IOM_COMPLETED;
    GIO_Handle chanHandle;
    Int sect;  /* sector */
        
    printf("DATA VERIFICATION : "); 
#ifdef VERIFYDATA
    printf("ENABLED\n"); 
#else
    printf("DISABLED\n"); 
#endif

    
    /*  Create a channel for accessing MMC.  */
    chanHandle = GIO_create("/udevMmc0", IOM_INOUT, &status, NULL, NULL);
        /*
         * Note in the call to GIO_create, the last parameter is NULL
         * This basically means use the default GIO Attrs which are:
         *     npackets = 1, timeout = SYS_FOREVER
         */
    printf("Channel create status %d\n", status);
#ifdef TESTFOREVER
    printf("TEST FOREVER ENABLED\n"); 
    for(;;) {   
#endif
        for (sect = 1; sect <= MAXSECTORNUM; sect++) { 

            /*  Issue Write.  */
            status = issue_write(chanHandle, sect, INITIALVALUE);
            if (status != IOM_COMPLETED) {
                printf("ERROR - write failure, status = %d\n", status);
                break;
            }
#ifndef RUNSILENT
            printf("Wrote to sector %d: buf[0]=%x , buf[1]=%x , buf[255]=%x\n",
                    sect, bufWrite[0], bufWrite[1], bufWrite[255]);    
#endif

            /*  Issue Read.  */
            status = issue_read(chanHandle, sect);
            if (status != IOM_COMPLETED) {
                printf("ERROR - read failure, status = %d\n", status);
                break;
            }
#ifndef RUNSILENT            
            printf("Read from sector %d: buf[0]=%x , buf[1]=%x , buf[255]=%x\n",
                    sect, bufRead[0], bufRead[1], bufRead[255]);
#endif

        }
#ifdef TESTFOREVER
        scanCnt++;   /* bump total scan cnt  */
        printf("Scanned %d sectors a total of %d times\n", MAXSECTORNUM, scanCnt);
        if (status != IOM_COMPLETED) {
            printf("FAILED : sector = %d\n", sect);
            break;
        }
    }
#endif

    /*  Delete the created channel.  */
    status = GIO_delete(chanHandle);
    printf("Channel delete status %d\n", status);
} 

/*
 *  ======== issue_write ========
 *
 *  Issues write command.
 */
 
static Int issue_write(GIO_Handle chan, Uns sectornum, MdUns charval)
{ 
    Uns size;
    Int i;
    Int status = IOM_COMPLETED;
    Int index = sectornum;
 
    for (i = 0; i < C5509_MMC_SECLEN; i++, index++) {
        bufWrite[i] = charval + index; /* add index to charval*/
        
    }

    mediaObj.buf = bufWrite;
    mediaObj.address = sectornum;
    mediaObj.subAddress = 0;
    mediaObj.length = C5509_MMC_SECLEN; 

    size = sizeof(mediaObj);
     
    /*  Submit request  */
    if ((status = GIO_write(chan, &mediaObj, &size)) < 0) {

        printf("ERROR in writting data at sector %d, status = %d\n", 
                sectornum, status);
    }
    
    return status;
}

/*
 *  ======== issue_read ========
 *
 *  Issues read command.
 */
 
static Int issue_read(GIO_Handle chan, Uns sectornum)
{
    Uns size;
    Int i;
    Int status = IOM_COMPLETED;

    for (i = 0; i < C5509_MMC_SECLEN; i++) {
        bufRead[i] = 0;     /* zero readback buffer */
    }

    mediaObj.buf = bufRead;
    mediaObj.address = sectornum;
    mediaObj.subAddress = 0;
    mediaObj.length = C5509_MMC_SECLEN;

    size = sizeof(mediaObj);
    
    /* Submit request  */
    status = GIO_read(chan, &mediaObj, &size);
    if (status < 0) {
        printf("ERROR - in reading data at sector %d, status = %d\n", 
                sectornum, status); 
    }
    else if (size != sizeof(mediaObj)) {
        printf("ERROR - Unexpected size returned");
        status = IOM_EBADIO;
    }

#ifdef VERIFYDATA
    if (status == IOM_COMPLETED) {
        /* Verify data written is the same as read */
        for(i=0; i < C5509_MMC_SECLEN; i++ ) {
            if (bufWrite[i] != bufRead[i]) {
                printf("ERROR - Sector=%d, Wr=%x, Rd=%x, Offset=%d\n", 
                     sectornum, bufWrite[i], bufRead[i],  i ); 
                status = IOM_EBADIO;
                break;
            }   
        }
    }
#endif

    return status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -