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

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.  *  ======== dsk5402_dma_ad50.c ========
  11.  */
  12. #include <std.h>
  13. #include <atm.h>
  14. #include <hwi.h>
  15. #include <que.h>
  16. #include <csl.h>
  17. #include <csl_dma.h>
  18. #include <csl_mcbsp.h>
  19. #include <iom.h>
  20. #include <c54xx_dma_mcbsp.h>
  21. #include <dsk5402_dma_ad50.h>
  22. #include <ad50.h>
  23. /*
  24.  * Forward declaration of IOM interface functions.
  25.  */
  26. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams);
  27. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
  28.         Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg);
  29. static Int mdSubmitChan(Ptr chanp, IOM_Packet *packet);
  30. /*
  31.  * Public IOM interface table.
  32.  */
  33. IOM_Fxns DSK5402_DMA_AD50_FXNS;
  34. /* CSL config structure for McBsp */
  35. static MCBSP_Config mcbspCfg = {
  36.     0x0021,        /*  Serial Port Control Register 1   */
  37.     0x0201,        /*  Serial Port Control Register 2   */
  38.     0x0040,        /*  Receive Control Register 1   */
  39.     0x0000,        /*  Receive Control Register 2   */
  40.     0x0040,        /*  Transmit Control Register 1   */
  41.     0x0000,        /*  Transmit Control Register 2   */
  42.     0x0000,        /*  Sample Rate Generator Register 1   */
  43.     0x0000,        /*  Sample Rate Generator Register 2   */
  44.     0x0000,        /*  Multichannel Control Register 1   */
  45.     0x0000,        /*  Multichannel Control Register 2   */
  46.     0x000c,        /*  Pin Control Register   */
  47.     0x0000,        /*  Receive Channel Enable Register Partition A   */
  48.     0x0000,        /*  Receive Channel Enable Register Partition B   */
  49.     0x0000,        /*  Transmit Channel Enable Register Partition A   */
  50.     0x0000         /*  Transmit Channel Enable Register Partition B   */
  51. };
  52. /*  CSL config structure for DMAs */
  53. static DMA_Config dmaRxCfg = {
  54.     0x0000,         /*  Channel Priority (0x0000 or 0x0001)  */
  55.     0x6045,     /*  Transfer Mode Control Register (DMMCR)  */
  56.     0x5000,     /*  Sync Event and Frame Count Register (DMSFC)  */
  57.     (DMA_AdrPtr)0x0041,/*  Source Address Register (DMSRC) - Numeric  */
  58.     NULL,       /*  Destination Address Register (DMDST) - Symbolic  */
  59.     0x0000      /*  Element Count Register (DMCTR)  */
  60. };
  61. static DMA_Config dmaTxCfg = {
  62.     0x0000,     /*  Channel Priority (0x0000 or 0x0001)  */
  63.     0x6141,     /*  Transfer Mode Control Register (DMMCR)  */
  64.     0x6000,     /*  Sync Event and Frame Count Register (DMSFC)  */
  65.     NULL,       /*  Source Address Register (DMSRC) - Symbolic  */
  66.     (DMA_AdrPtr)0x0043, /*  Destination Address Register (DMDST) */
  67.     0x0000      /*  Element Count Register (DMCTR)  */
  68. };
  69. /*
  70.  *  ======== mdBindDev ========
  71.  */
  72. #pragma CODE_SECTION(mdBindDev, ".text:init")
  73. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
  74. {
  75.     DSK5402_DMA_AD50_DevParams *params = 
  76.         (DSK5402_DMA_AD50_DevParams *)devParams;
  77.     C54XX_DMA_MCBSP_DevParams genericDevParams;
  78.     MCBSP_Handle        hMcbsp;
  79.     DSK5402_DMA_AD50_DevParams defaultParams = 
  80.                                         DSK5402_DMA_AD50_DEVPARAMS_DEFAULT;
  81.     static volatile ioport unsigned port04;     /* for CPLD CTRL 2 */
  82.     /* use default parameters if none are given */
  83.     if (params == NULL) {
  84.         params = &defaultParams;
  85.     }
  86.     /* Check the version number */
  87.     if (params->versionId != DSK5402_DMA_AD50_VERSION_1){
  88.         /* Unsupported version number */
  89.         return(IOM_EBADARGS);
  90.     }
  91.     /* open the McBSP */
  92.     hMcbsp = MCBSP_open(MCBSP_PORT1, MCBSP_OPEN_RESET);
  93.     if (hMcbsp == INV) {
  94.         return (IOM_EBADIO);
  95.     }
  96.     MCBSP_config(hMcbsp, &mcbspCfg);
  97.     /*
  98.      * DSK5402 board setup ...
  99.      * Select McBSP1 mapped to Audio Codec (CPLD Register)
  100.      * and FC bit = 0 (secondary control off)
  101.      */
  102.     port04 &= 0xf5;
  103.     /* start the McBSP */
  104.     MCBSP_start(hMcbsp, MCBSP_XMIT_START | MCBSP_RCV_START, 0x0);
  105.     /* set codec parameters (this will also initialize the codec) */
  106.     AD50_setParams(hMcbsp, &(params->ad50) );
  107.     MCBSP_close(hMcbsp);
  108.     genericDevParams.versionId = C54XX_DMA_MCBSP_VERSION_1;
  109.     genericDevParams.rxDmaId = params->rxDmaId;
  110.     genericDevParams.txDmaId = params->txDmaId;
  111.     genericDevParams.mcbspCfg = &mcbspCfg;
  112.     genericDevParams.rxIntrMask = params->rxIntrMask;
  113.     genericDevParams.txIntrMask = params->txIntrMask;
  114.     return (C54XX_DMA_MCBSP_FXNS.mdBindDev(devp, 1, &genericDevParams));
  115. }
  116. /*
  117.  *  ======== mdCreateChan ========
  118.  */
  119. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
  120.                 Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
  121. {
  122.     C54XX_DMA_MCBSP_ChanParams genericChanParams;
  123.     if (mode == IOM_INPUT) {
  124.         genericChanParams.dmaCfg = &dmaRxCfg;
  125.     }
  126.     else if (mode == IOM_OUTPUT) {
  127.         genericChanParams.dmaCfg = &dmaTxCfg;
  128.     }
  129.     else {
  130.         return (IOM_EBADMODE);
  131.     }
  132.     return (C54XX_DMA_MCBSP_FXNS.mdCreateChan(chanp, devp, name, mode,
  133.         &genericChanParams, cbFxn, cbArg));
  134. }
  135. static Int mdSubmitChan(Ptr chanp, IOM_Packet *packet)
  136. {
  137.     Int i;
  138.     Int result;
  139.     MdUns *localBuf;
  140.     
  141.     if (packet->cmd == IOM_WRITE) {
  142.         /* Mask off the LSB */
  143.         localBuf = packet->addr;
  144.         for (i = 0; i < (packet->size / sizeof(MdUns)); i++) {
  145.             localBuf[i] = localBuf[i] & 0xFFFE;
  146.         }
  147.     }
  148.     result = (C54XX_DMA_MCBSP_FXNS.mdSubmitChan)(chanp, packet);
  149.     return (result);
  150. }
  151. /*
  152.  *  ======== DSK5402_DMA_AD50_init ========
  153.  */
  154. #pragma CODE_SECTION(DSK5402_DMA_AD50_init, ".text:init")
  155. Void DSK5402_DMA_AD50_init(Void)
  156. {
  157.     C54XX_DMA_MCBSP_init();
  158.     DSK5402_DMA_AD50_FXNS = C54XX_DMA_MCBSP_FXNS;
  159.     DSK5402_DMA_AD50_FXNS.mdBindDev = mdBindDev;
  160.     DSK5402_DMA_AD50_FXNS.mdCreateChan = mdCreateChan;
  161.     DSK5402_DMA_AD50_FXNS.mdSubmitChan = mdSubmitChan;
  162. }