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

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.10.00.23 07-02-03 (ddk-b12)" */
  9. /* 
  10.  *  ======== dsk5416_dma_pcm3002.c ========
  11.  * 
  12.  *  DMA interrupt-driven low-level streaming device driver for TI
  13.  *  5416 DSK. Uses the C54x Chip Support Library. 
  14.  *
  15.  *  DSP/BIOS configuration:
  16.  *     DMA channel 4 RX ISR plugged to DSK5416_DMA_PCM3002_isr with arg = 0
  17.  *     DMA channel 5 TX ISR plugged to DSK5416_DMA_PCM3002_isr with arg = 1
  18.  */
  19. #include <std.h>
  20. #include <csl.h>
  21. #include <csl_dma.h>
  22. #include <csl_mcbsp.h>
  23. #include <iom.h>
  24. #include <c54xx_dma_mcbsp.h>
  25. #include <dsk5416_dma_pcm3002.h>
  26. #include <dsk5416_pcm3002.h>
  27. #include <dsk5416.h>
  28. /*
  29.  * Forward declaration of IOM interface functions.
  30.  */
  31. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams);
  32. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
  33.         Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg);
  34. /*
  35.  * Public IOM interface table.
  36.  */
  37. IOM_Fxns DSK5416_DMA_PCM3002_FXNS;
  38. /* CSL config structure for McBSP */
  39. static MCBSP_Config mcbspCfg = {
  40.     0x2000,        /*  Serial Port Control Register 1   */
  41.     0x0200,        /*  Serial Port Control Register 2   */
  42.     0x0340,        /*  Receive Control Register 1   */
  43.     0x0340,        /*  Receive Control Register 2   */
  44.     0x0340,        /*  Transmit Control Register 1   */
  45.     0x0340,        /*  Transmit Control Register 2   */
  46.     0x1f00,        /*  Sample Rate Generator Register 1   */
  47.     0x003f,        /*  Sample Rate Generator Register 2   */
  48.     0x0001,        /*  Multichannel Control Register 1   */
  49.     0x0001,        /*  Multichannel Control Register 2   */
  50.     0x0083,        /*  Pin Control Register   */
  51.     0x0005,        /*  Receive Channel Enable Register Partition A   */
  52.     0x0000,        /*  Receive Channel Enable Register Partition B   */
  53.     0x0000,        /*  Receive Channel Enable Register Partition C   */ 
  54.     0x0000,        /*  Receive Channel Enable Register Partition D   */ 
  55.     0x0000,        /*  Receive Channel Enable Register Partition E   */
  56.     0x0000,        /*  Receive Channel Enable Register Partition F   */
  57.     0x0000,        /*  Receive Channel Enable Register Partition G   */  
  58.     0x0000,        /*  Receive Channel Enable Register Partition H   */
  59.     0x000a,        /*  Transmit Channel Enable Register Partition A   */  
  60.     0x0000,        /*  Transmit Channel Enable Register Partition B   */
  61.     0x0000,        /*  Transmit Channel Enable Register Partition C   */ 
  62.     0x0000,        /*  Transmit Channel Enable Register Partition D   */ 
  63.     0x0000,        /*  Transmit Channel Enable Register Partition E   */
  64.     0x0000,        /*  Transmit Channel Enable Register Partition F   */ 
  65.     0x0000,        /*  Transmit Channel Enable Register Partition G   */ 
  66.     0x0000         /*  Transmit Channel Enable Register Partition H   */
  67. };
  68. /*  CSL config structure for DMAs */
  69. static DMA_Config dmaRxCfg = {
  70.     0x0000,     /*  Channel Priority (0x0000 or 0x0001)  */
  71.     0x0000,     /*  Global Reload Register Usage */
  72.     0x4045,     /*  Transfer Mode Control Register (DMMCR)  */
  73.     0x3000,     /*  Sync Event and Frame Count Register (DMSFC)  */
  74.     (DMA_AdrPtr)0x0031, /*  Source Address Register (DMSRC) - Numeric  */
  75.     (DMA_AdrPtr)0x0000, /*  Destination Address Register (DMDST) - Numeric  */
  76.     0x0000,     /*  Element Count Register (DMCTR)  */
  77.     (DMA_AdrPtr)0x0000, /*  Global Source Address Reload Register (DMGSA) */
  78.     (DMA_AdrPtr)0x0000, /*  Global Destination Address Reload Reg (DMGDA)*/
  79.     0x0000,     /*  Global Element Count Reload Register (DMGCR)  */
  80.     0x0000      /*  Global Frame Count Reload Register (DMGFR)  */
  81. };
  82. static DMA_Config dmaTxCfg = {
  83.     0x0000,     /*  Channel Priority (0x0000 or 0x0001)  */
  84.     0x0000,     /*  Global Reload Register Usage */
  85.     0x4141,     /*  Transfer Mode Control Register (DMMCR)  */
  86.     0x4000,     /*  Sync Event and Frame Count Register (DMSFC)  */
  87.     (DMA_AdrPtr)0x0000, /*  Source Address Register (DMSRC) - Numeric  */
  88.     (DMA_AdrPtr)0x0033, /*  Destination Address Register (DMDST) */
  89.     0x0000,     /*  Element Count Register (DMCTR)  */
  90.     (DMA_AdrPtr)0x0000, /*  Global Source Address Reload Register (DMGSA) */
  91.     (DMA_AdrPtr)0x0000, /*  Global Destination Address Reload Reg (DMGDA) */
  92.     0x0000,     /*  Global Element Count Reload Register (DMGCR)  */
  93.     0x0000      /*  Global Frame Count Reload Register (DMGFR)  */
  94. };
  95. /* declare global MCBSP handle for use with BSL */ 
  96. MCBSP_Handle        C54XX_DMA_MCBSP_hMcbsp;
  97. /*
  98.  *  ======== mdBindDev ========
  99.  */
  100. #pragma CODE_SECTION(mdBindDev, ".text:init")
  101. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
  102. {
  103.     DSK5416_DMA_PCM3002_DevParams *params =
  104.         (DSK5416_DMA_PCM3002_DevParams *)devParams;
  105.     C54XX_DMA_MCBSP_DevParams genericDevParams;
  106.     DSK5416_PCM3002_CodecHandle codec;
  107.     DSK5416_DMA_PCM3002_DevParams defaultParams = 
  108.                         DSK5416_DMA_PCM3002_DEVPARAMS_DEFAULT;
  109.     /* use default parameters if none are given */
  110.     if (params == NULL) {
  111.         params = &defaultParams;
  112.     }
  113.     /* Check the version number */
  114.     if (params->versionId != DSK5416_DMA_PCM3002_VERSION_1){
  115.         /* Unsupported version */
  116.         return(IOM_EBADARGS);
  117.     }
  118.     /* open and configure the McBSP to call BSL open and close the codec */
  119.     C54XX_DMA_MCBSP_hMcbsp = MCBSP_open(MCBSP_PORT2, MCBSP_OPEN_RESET);
  120.     if (C54XX_DMA_MCBSP_hMcbsp == INV) {
  121.         return (IOM_EBADIO);
  122.     }
  123.     MCBSP_config(C54XX_DMA_MCBSP_hMcbsp, &mcbspCfg);
  124.     /* set codec parameters (this will also initialize the codec) */
  125.     codec = DSK5416_PCM3002_openCodec(0, &(params->pcm3002));
  126.     /* this closes the mcbsp */
  127.     DSK5416_PCM3002_closeCodec(codec);
  128.     
  129.     genericDevParams.versionId = C54XX_DMA_MCBSP_VERSION_1;
  130.     genericDevParams.rxDmaId = params->rxDmaId;
  131.     genericDevParams.txDmaId = params->txDmaId;
  132.     genericDevParams.mcbspCfg = &mcbspCfg;
  133.     genericDevParams.rxIntrMask = params->rxIntrMask;
  134.     genericDevParams.txIntrMask = params->txIntrMask;
  135.     return (C54XX_DMA_MCBSP_FXNS.mdBindDev(devp, MCBSP_PORT2,
  136.             &genericDevParams));
  137. }
  138. /*
  139.  *  ======== mdCreateChan ========
  140.  */
  141. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
  142.                 Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
  143. {
  144.     C54XX_DMA_MCBSP_ChanParams genericChanParams;
  145.     if (mode == IOM_INPUT) {
  146.         genericChanParams.dmaCfg = &dmaRxCfg;
  147.     }
  148.     else if (mode == IOM_OUTPUT) {
  149.         genericChanParams.dmaCfg = &dmaTxCfg;
  150.     }
  151.     else {
  152.         return (IOM_EBADMODE);
  153.     }
  154.     return (C54XX_DMA_MCBSP_FXNS.mdCreateChan(chanp, devp, name, mode,
  155.         &genericChanParams, cbFxn, cbArg));
  156. }
  157. /*
  158.  *  ======== DSK5416_DMA_PCM3002_init ========
  159.  *
  160.  *  Controller initialization function
  161.  */
  162. #pragma CODE_SECTION(DSK5416_DMA_PCM3002_init, ".text:init")
  163. Void DSK5416_DMA_PCM3002_init(Void)
  164. {
  165.     /* initialize the board */
  166.     DSK5416_init();
  167.     /*
  168.      * Use C54XX_DMA_MCBSP_FXNS functions for the heart of the 
  169.      * controller.  This is common DMA/MCBSP code that works for
  170.      * many DMA/MCBSP/codec combinations.
  171.      */
  172.     C54XX_DMA_MCBSP_init();
  173.     DSK5416_DMA_PCM3002_FXNS = C54XX_DMA_MCBSP_FXNS;
  174.     DSK5416_DMA_PCM3002_FXNS.mdBindDev = mdBindDev;
  175.     DSK5416_DMA_PCM3002_FXNS.mdCreateChan = mdCreateChan;
  176. }