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

📄 evm5509_srom.c

📁 dsp 5509a MMC 卡 ID号读取 12Mhzx16=192M
💻 C
字号:
/*
 *  Copyright 2004 by Spectrum Digital Incorporated.
 *  All rights reserved. Property of Spectrum Digital Incorporated.
 */

/*
 *  ======== evm5509_srom.c ========
 *  EVM5509 SROM module implementation
 */

#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_gpio.h>

#include "evm5509.h"
#include "evm5509_srom.h"

static MCBSP_Config mcbspCfgSPI = {
    MCBSP_SPCR1_RMK(
        MCBSP_SPCR1_DLB_OFF,                   /* DLB      = 0 */
        MCBSP_SPCR1_RJUST_RZF,                 /* RJUST    = 0 */
        MCBSP_SPCR1_CLKSTP_DELAY,              /* CLKSTP   = 3 */
        MCBSP_SPCR1_DXENA_NA,                  /* DXENA    = 0 */
        MCBSP_SPCR1_ABIS_DISABLE,              /* ABIS     = 0 */
        MCBSP_SPCR1_RINTM_RRDY,                /* RINTM    = 0 */
        0,                                     /* RSYNCER  = 0 */
        0,                                     /* RFULL    = 0 */
        0,                                     /* RRDY     = 0 */
        MCBSP_SPCR1_RRST_DISABLE               /* RRST     = 0 */
    ),
    MCBSP_SPCR2_RMK(
        MCBSP_SPCR2_FREE_YES,                  /* FREE     = 1 */
        MCBSP_SPCR2_SOFT_NO,                   /* SOFT     = 0 */
        MCBSP_SPCR2_FRST_RESET,                /* FRST     = 0 */
        MCBSP_SPCR2_GRST_RESET,                /* GRST     = 0 */
        MCBSP_SPCR2_XINTM_XRDY,                /* XINTM    = 0 */
        0,                                     /* XSYNCER  = 0 */
        0,                                     /* XEMPTY   = 0 */
        0,                                     /* XRDY     = 0 */
        MCBSP_SPCR2_XRST_DISABLE               /* XRST     = 0 */
    ),
    MCBSP_RCR1_RMK(
        MCBSP_RCR1_RFRLEN1_OF(0),              /* RFRLEN1  = 0 */
        MCBSP_RCR1_RWDLEN1_8BIT                /* RWDLEN1  = 0 */
    ),
    MCBSP_RCR2_RMK(
        MCBSP_RCR2_RPHASE_SINGLE,              /* RPHASE   = 0 */
        MCBSP_RCR2_RFRLEN2_OF(0),              /* RFRLEN2  = 0 */
        MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2  = 0 */
        MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 */
        MCBSP_RCR2_RFIG_YES,                   /* RFIG     = 0 */
        MCBSP_RCR2_RDATDLY_1BIT                /* RDATDLY  = 1 */
    ),
    MCBSP_XCR1_RMK(
        MCBSP_XCR1_XFRLEN1_OF(0),              /* XFRLEN1  = 0 */
        MCBSP_XCR1_XWDLEN1_8BIT                /* XWDLEN1  = 0 */
    ),
    MCBSP_XCR2_RMK(
        MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE   = 0 */
        MCBSP_XCR2_XFRLEN2_OF(0),              /* XFRLEN2  = 0 */
        MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2  = 0 */
        MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 */
        MCBSP_XCR2_XFIG_YES,                   /* XFIG     = 0 */
        MCBSP_XCR2_XDATDLY_1BIT                /* XDATDLY  = 1 */
    ),
    MCBSP_SRGR1_RMK(
        MCBSP_SRGR1_FWID_OF(0),                /* FWID     = 0 */
        MCBSP_SRGR1_CLKGDV_OF(63)              /* CLKGDV   = 63 */
    ),
    MCBSP_SRGR2_RMK(
        MCBSP_SRGR2_GSYNC_FREE,                /* FREE     = 0 */
        MCBSP_SRGR2_CLKSP_RISING,              /* CLKSP    = 0 */
        MCBSP_SRGR2_CLKSM_INTERNAL,            /* CLKSM    = 1 */
        MCBSP_SRGR2_FSGM_DXR2XSR,              /* FSGM     = 0 */
        MCBSP_SRGR2_FPER_OF(0)                 /* FPER     = 0 */
    ),
    MCBSP_MCR1_DEFAULT,
    MCBSP_MCR2_DEFAULT,
    MCBSP_PCR_RMK(
        MCBSP_PCR_IDLEEN_RESET,                /* IDLEEN   = 0 */
        MCBSP_PCR_XIOEN_SP,                    /* XIOEN    = 0 */
        MCBSP_PCR_RIOEN_SP,                    /* RIOEN    = 0 */
        MCBSP_PCR_FSXM_INTERNAL,               /* FSXM     = 1 */
        MCBSP_PCR_FSRM_EXTERNAL,               /* FSRM     = 0 */
        MCBSP_PCR_SCLKME_NO,                   /* SCLKME   = 0 */
        0,                                     /* CLKSSTAT = 0 */
        0,                                     /* DXSTAT   = 0 */
        0,                                     /* DRSTAT   = 0 */
        MCBSP_PCR_CLKXM_OUTPUT,                /* CLKXM    = 1 */
        MCBSP_PCR_CLKRM_INPUT,                 /* CLKRM    = 0 */
        MCBSP_PCR_FSXP_ACTIVELOW,              /* FSXP     = 1 */
        MCBSP_PCR_FSRP_ACTIVELOW,              /* FSRP     = 1 */
        MCBSP_PCR_CLKXP_RISING,                /* CLKXP    = 0 */
        MCBSP_PCR_CLKRP_RISING                 /* CLKRP    = 1 */
    ),
    MCBSP_RCERA_DEFAULT,
    MCBSP_RCERB_DEFAULT,
    MCBSP_RCERC_DEFAULT,
    MCBSP_RCERD_DEFAULT,
    MCBSP_RCERE_DEFAULT,
    MCBSP_RCERF_DEFAULT,
    MCBSP_RCERG_DEFAULT,
    MCBSP_RCERH_DEFAULT,
    MCBSP_XCERA_DEFAULT,
    MCBSP_XCERB_DEFAULT,
    MCBSP_XCERC_DEFAULT,
    MCBSP_XCERD_DEFAULT,
    MCBSP_XCERE_DEFAULT,
    MCBSP_XCERF_DEFAULT,
    MCBSP_XCERG_DEFAULT,
    MCBSP_XCERH_DEFAULT
};

MCBSP_Handle EVM5509_SROM_hMcbsp;

static Uint16 srombuf[EVM5509_SROM_BLOCKSIZE + 4], statusbuf[4];

static sromenable()
{
    GPIO_pinWrite(GPIO_PIN4, 0);
}

static sromdisable()
{
    GPIO_pinWrite(GPIO_PIN4, 1);
}

static void sromcycle(Uint16 *buf, Int16 len)
{
    Int16 i;
    Uint16 sdata;
    
    /* Clear out any garbage read data */
    if (MCBSP_rrdy(EVM5509_SROM_hMcbsp))
        MCBSP_read16(EVM5509_SROM_hMcbsp);
    
    for (i = 0; i < len; i++)
    {
        /* Wait until transmitter free */
        while (!MCBSP_xrdy(EVM5509_SROM_hMcbsp));
        MCBSP_write16(EVM5509_SROM_hMcbsp, buf[i]);

        /* Wait for receive data */
        while (!MCBSP_rrdy(EVM5509_SROM_hMcbsp));
        sdata = MCBSP_read16(EVM5509_SROM_hMcbsp);
        if ( i> 0)
            buf[i - 1] = sdata;
    }
}

static Uint16 readstatus()
{
    /* Issue read status command */
    statusbuf[0] = EVM5509_SROM_RDSR;
    sromenable();
    sromcycle(statusbuf, 2);
    sromdisable();
    
    return statusbuf[0];
}

static void writestatus(Uint16 value)
{
    /* Issue read status command */
    statusbuf[0] = EVM5509_SROM_WRSR;
    statusbuf[1] = value;
    sromenable();
    sromcycle(statusbuf, 2);
    sromdisable();
}

void EVM5509_SROM_open()
{
    /* Enable the SROM data path */
    EVM5509_rset(EVM5509_MISC, EVM5509_rget(EVM5509_MISC) & 0xfe);

    /* Enable GPIO 4 (chip select) as output, high */
    GPIO_pinWrite(GPIO_PIN4, 1);
    GPIO_pinDirection(GPIO_PIN4, GPIO_OUTPUT);
    GPIO_pinEnable(GPIO_PIN4);

    /* Open McBSP handle */
    EVM5509_SROM_hMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET);

    /* Configure McBSP in clock stop SPI mode */
    MCBSP_config(EVM5509_SROM_hMcbsp, &mcbspCfgSPI);
    
    /* Start the McBSP */
    MCBSP_start(EVM5509_SROM_hMcbsp, MCBSP_XMIT_START | MCBSP_RCV_START |
        MCBSP_SRGR_START, 500);

    /* Disable write protection */
    writestatus(0);
}

void EVM5509_SROM_close()
{
    /* Close the McBSP */
    MCBSP_close(EVM5509_SROM_hMcbsp);
}

/*
 *  ======== EVM5509_SROM_read ========
 *  Read data from SROM
 */
void EVM5509_SROM_read(Uint32 src, Uint32 dst, Uint32 length)
{
    Uint16 *psrc, *pdst;
    Uint32 i;
    
    /* Establish destination */
    pdst = (Uint16 *)dst; 
    
    /* Create command block for program operation */
    srombuf[0] = EVM5509_SROM_READ;
    srombuf[1] = (src >> 8) & 0xff;
    srombuf[2] = src & 0xff;
    
    /* Execute read command */
    sromenable();
    sromcycle(srombuf, 3 + length);
    sromdisable();

    psrc = srombuf + 2;
    for (i = 0; i < length; i++)
        *pdst++ = *psrc++;
}

/*
 *  ======== EVM5509_SROM_write ========
 *  Write data to SROM
 */
void EVM5509_SROM_write(Uint32 src, Uint32 dst, Uint32 length)
{
    Uint16 *psrc;
    Uint32 i, bytesleft, bytestoprogram;
    
    /* Establish source */
    psrc = (Uint16 *)src;

    bytesleft = length;
    while (bytesleft > 0)
    {
        bytestoprogram = bytesleft;
        
        /* Most to program is EVM5509_SROM_BLOCKSIZE */
        if (bytestoprogram > EVM5509_SROM_BLOCKSIZE)
            bytestoprogram = EVM5509_SROM_BLOCKSIZE;
            
        /* Make sure you don't run off the end of a block */
        if ((dst & EVM5509_SROM_BLOCKMASK) != ((dst + bytestoprogram) & EVM5509_SROM_BLOCKMASK))
            bytestoprogram -= (dst + bytestoprogram) - ((dst + bytestoprogram) & EVM5509_SROM_BLOCKMASK);

        /* Issue WPEN */
        srombuf[0] = EVM5509_SROM_WREN;
        sromenable();
        sromcycle(srombuf, 1);

        /* Create command block for program operation */
        srombuf[0] = EVM5509_SROM_PROGRAM;
        srombuf[1] = (dst >> 8) & 0xff;
        srombuf[2] = dst & 0xff;
        for (i = 0; i < bytestoprogram; i++)
            srombuf[3 + i] = *psrc++;
    
        /* Execute write command */
        sromenable();
        sromcycle(srombuf, 3 + bytestoprogram);
        sromdisable();

        /* Wait while busy */
        while((readstatus() & 1) != 0);

        /* Get ready for next iteration */
        bytesleft -= bytestoprogram;
        dst += bytestoprogram;
    }
}

/*
 *  ======== EVM5509_SROM_erase ========
 *  Erase a block of the SROM
 */
void EVM5509_SROM_erase(Uint32 start, Uint32 length)
{
}

⌨️ 快捷键说明

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