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

📄 dsk5416_dma_pcm3002.c

📁 用DSP5410实现对音乐文件音量的限制性调节
💻 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)" */
/* 
 *  ======== dsk5416_dma_pcm3002.c ========
 * 
 *  DMA interrupt-driven low-level streaming device driver for TI
 *  5416 DSK. Uses the C54x Chip Support Library. 
 *
 *  DSP/BIOS configuration:
 *     DMA channel 4 RX ISR plugged to DSK5416_DMA_PCM3002_isr with arg = 0
 *     DMA channel 5 TX ISR plugged to DSK5416_DMA_PCM3002_isr with arg = 1
 */

#include <std.h>

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

#include <iom.h>

#include <c54xx_dma_mcbsp.h>
#include <dsk5416_dma_pcm3002.h>
#include <dsk5416_pcm3002.h>
#include <dsk5416.h>

/*
 * Forward declaration of IOM interface functions.
 */
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams);
static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
        Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg);

/*
 * Public IOM interface table.
 */
IOM_Fxns DSK5416_DMA_PCM3002_FXNS;

/* CSL config structure for McBSP */
static MCBSP_Config mcbspCfg = {
    0x2000,        /*  Serial Port Control Register 1   */
    0x0200,        /*  Serial Port Control Register 2   */
    0x0340,        /*  Receive Control Register 1   */
    0x0340,        /*  Receive Control Register 2   */
    0x0340,        /*  Transmit Control Register 1   */
    0x0340,        /*  Transmit Control Register 2   */
    0x1f00,        /*  Sample Rate Generator Register 1   */
    0x003f,        /*  Sample Rate Generator Register 2   */
    0x0001,        /*  Multichannel Control Register 1   */
    0x0001,        /*  Multichannel Control Register 2   */
    0x0083,        /*  Pin Control Register   */
    0x0005,        /*  Receive Channel Enable Register Partition A   */
    0x0000,        /*  Receive Channel Enable Register Partition B   */
    0x0000,        /*  Receive Channel Enable Register Partition C   */ 
    0x0000,        /*  Receive Channel Enable Register Partition D   */ 
    0x0000,        /*  Receive Channel Enable Register Partition E   */
    0x0000,        /*  Receive Channel Enable Register Partition F   */
    0x0000,        /*  Receive Channel Enable Register Partition G   */  
    0x0000,        /*  Receive Channel Enable Register Partition H   */
    0x000a,        /*  Transmit Channel Enable Register Partition A   */  
    0x0000,        /*  Transmit Channel Enable Register Partition B   */
    0x0000,        /*  Transmit Channel Enable Register Partition C   */ 
    0x0000,        /*  Transmit Channel Enable Register Partition D   */ 
    0x0000,        /*  Transmit Channel Enable Register Partition E   */
    0x0000,        /*  Transmit Channel Enable Register Partition F   */ 
    0x0000,        /*  Transmit Channel Enable Register Partition G   */ 
    0x0000         /*  Transmit Channel Enable Register Partition H   */
};

/*  CSL config structure for DMAs */
static DMA_Config dmaRxCfg = {
    0x0000,     /*  Channel Priority (0x0000 or 0x0001)  */
    0x0000,     /*  Global Reload Register Usage */
    0x4045,     /*  Transfer Mode Control Register (DMMCR)  */
    0x3000,     /*  Sync Event and Frame Count Register (DMSFC)  */
    (DMA_AdrPtr)0x0031, /*  Source Address Register (DMSRC) - Numeric  */
    (DMA_AdrPtr)0x0000, /*  Destination Address Register (DMDST) - Numeric  */
    0x0000,     /*  Element Count Register (DMCTR)  */
    (DMA_AdrPtr)0x0000, /*  Global Source Address Reload Register (DMGSA) */
    (DMA_AdrPtr)0x0000, /*  Global Destination Address Reload Reg (DMGDA)*/
    0x0000,     /*  Global Element Count Reload Register (DMGCR)  */
    0x0000      /*  Global Frame Count Reload Register (DMGFR)  */
};

static DMA_Config dmaTxCfg = {
    0x0000,     /*  Channel Priority (0x0000 or 0x0001)  */
    0x0000,     /*  Global Reload Register Usage */
    0x4141,     /*  Transfer Mode Control Register (DMMCR)  */
    0x4000,     /*  Sync Event and Frame Count Register (DMSFC)  */
    (DMA_AdrPtr)0x0000, /*  Source Address Register (DMSRC) - Numeric  */
    (DMA_AdrPtr)0x0033, /*  Destination Address Register (DMDST) */
    0x0000,     /*  Element Count Register (DMCTR)  */
    (DMA_AdrPtr)0x0000, /*  Global Source Address Reload Register (DMGSA) */
    (DMA_AdrPtr)0x0000, /*  Global Destination Address Reload Reg (DMGDA) */
    0x0000,     /*  Global Element Count Reload Register (DMGCR)  */
    0x0000      /*  Global Frame Count Reload Register (DMGFR)  */
};

/* declare global MCBSP handle for use with BSL */ 
MCBSP_Handle        C54XX_DMA_MCBSP_hMcbsp;

/*
 *  ======== mdBindDev ========
 */
#pragma CODE_SECTION(mdBindDev, ".text:init")
static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
{
    DSK5416_DMA_PCM3002_DevParams *params =
        (DSK5416_DMA_PCM3002_DevParams *)devParams;
    C54XX_DMA_MCBSP_DevParams genericDevParams;
    DSK5416_PCM3002_CodecHandle codec;
    DSK5416_DMA_PCM3002_DevParams defaultParams = 
                        DSK5416_DMA_PCM3002_DEVPARAMS_DEFAULT;

    /* use default parameters if none are given */
    if (params == NULL) {
        params = &defaultParams;
    }

    /* Check the version number */
    if (params->versionId != DSK5416_DMA_PCM3002_VERSION_1){
        /* Unsupported version */
        return(IOM_EBADARGS);
    }

    /* open and configure the McBSP to call BSL open and close the codec */
    C54XX_DMA_MCBSP_hMcbsp = MCBSP_open(MCBSP_PORT2, MCBSP_OPEN_RESET);

    if (C54XX_DMA_MCBSP_hMcbsp == INV) {
        return (IOM_EBADIO);
    }

    MCBSP_config(C54XX_DMA_MCBSP_hMcbsp, &mcbspCfg);

    /* set codec parameters (this will also initialize the codec) */
    codec = DSK5416_PCM3002_openCodec(0, &(params->pcm3002));

    /* this closes the mcbsp */
    DSK5416_PCM3002_closeCodec(codec);
    
    genericDevParams.versionId = C54XX_DMA_MCBSP_VERSION_1;
    genericDevParams.rxDmaId = params->rxDmaId;
    genericDevParams.txDmaId = params->txDmaId;
    genericDevParams.mcbspCfg = &mcbspCfg;
    genericDevParams.rxIntrMask = params->rxIntrMask;
    genericDevParams.txIntrMask = params->txIntrMask;

    return (C54XX_DMA_MCBSP_FXNS.mdBindDev(devp, MCBSP_PORT2,
            &genericDevParams));
}

/*
 *  ======== mdCreateChan ========
 */
static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
                Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
{
    C54XX_DMA_MCBSP_ChanParams genericChanParams;

    if (mode == IOM_INPUT) {
        genericChanParams.dmaCfg = &dmaRxCfg;
    }
    else if (mode == IOM_OUTPUT) {
        genericChanParams.dmaCfg = &dmaTxCfg;
    }
    else {
        return (IOM_EBADMODE);
    }

    return (C54XX_DMA_MCBSP_FXNS.mdCreateChan(chanp, devp, name, mode,
        &genericChanParams, cbFxn, cbArg));
}

/*
 *  ======== DSK5416_DMA_PCM3002_init ========
 *
 *  Controller initialization function
 */
#pragma CODE_SECTION(DSK5416_DMA_PCM3002_init, ".text:init")
Void DSK5416_DMA_PCM3002_init(Void)
{
    /* initialize the board */
    DSK5416_init();

    /*
     * Use C54XX_DMA_MCBSP_FXNS functions for the heart of the 
     * controller.  This is common DMA/MCBSP code that works for
     * many DMA/MCBSP/codec combinations.
     */
    C54XX_DMA_MCBSP_init();

    DSK5416_DMA_PCM3002_FXNS = C54XX_DMA_MCBSP_FXNS;
    DSK5416_DMA_PCM3002_FXNS.mdBindDev = mdBindDev;
    DSK5416_DMA_PCM3002_FXNS.mdCreateChan = mdCreateChan;
}

⌨️ 快捷键说明

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