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

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.11.00.00 11-04-03 (ddk-b13)" */
  9. /* 
  10.  *  ======== evm5509_dma_aic23.c ========
  11.  * 
  12.  *  DMA interrupt-driven low-level streaming device driver for TI
  13.  *  5509 EVM. Uses the C55x Chip Support Library. 
  14.  */
  15. #include <std.h>
  16. #include <csl.h>
  17. #include <csl_dma.h>
  18. #include <csl_mcbsp.h>
  19. #include <iom.h>
  20. #include <c55xx_dma_mcbsp.h>
  21. #include <evm5509_dma_aic23.h>
  22. #include <aic23.h>
  23. /* Forward declaration of IOM interface functions */
  24. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams);
  25. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
  26.                 Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg);
  27. /* Public IOM interface table */
  28. IOM_Fxns EVM5509_DMA_AIC23_FXNS;
  29. /* CSL config structure for MCBSP 0 */
  30. static MCBSP_Config mcbspCfg0 = {
  31.     MCBSP_SPCR1_RMK(
  32.         MCBSP_SPCR1_DLB_OFF,                   /* DLB      = 0 */
  33.         MCBSP_SPCR1_RJUST_RZF,                 /* RJUST    = 0 */
  34.         MCBSP_SPCR1_CLKSTP_DISABLE,            /* CLKSTP   = 0 */
  35.         MCBSP_SPCR1_DXENA_NA,                  /* DXENA    = 0 */
  36.         MCBSP_SPCR1_ABIS_DISABLE,              /* ABIS     = 0 */
  37.         MCBSP_SPCR1_RINTM_RRDY,                /* RINTM    = 0 */
  38.         0,                                     /* RSYNCER  = 0 */
  39.         0,                                     /* RFULL    = 0 */
  40.         0,                                     /* RRDY     = 0 */
  41.         MCBSP_SPCR1_RRST_DISABLE               /* RRST     = 0 */
  42.     ),
  43.     MCBSP_SPCR2_RMK(
  44.         MCBSP_SPCR2_FREE_YES,                  /* FREE     = 1 */
  45.         MCBSP_SPCR2_SOFT_NO,                   /* SOFT     = 0 */
  46.         MCBSP_SPCR2_FRST_FSG,                  /* FRST     = 0 */
  47.         MCBSP_SPCR2_GRST_CLKG,                 /* GRST     = 0 */
  48.         MCBSP_SPCR2_XINTM_XRDY,                /* XINTM    = 0 */
  49.         0,                                     /* XSYNCER  = 0 */
  50.         0,                                     /* XEMPTY   = 0 */
  51.         0,                                     /* XRDY     = 0 */
  52.         MCBSP_SPCR2_XRST_DISABLE               /* XRST     = 0 */
  53.     ),
  54.     MCBSP_RCR1_RMK( 
  55.         MCBSP_RCR1_RFRLEN1_OF(1),              /* RFRLEN1  = 1 */
  56.         MCBSP_RCR1_RWDLEN1_16BIT               /* RWDLEN1  = 2 */
  57.     ),
  58.     MCBSP_RCR2_RMK(    
  59.         MCBSP_RCR2_RPHASE_SINGLE,              /* RPHASE   = 0 */
  60.         MCBSP_RCR2_RFRLEN2_OF(0),              /* RFRLEN2  = 0 */
  61.         MCBSP_RCR2_RWDLEN2_8BIT,               /* RWDLEN2  = 0 */
  62.         MCBSP_RCR2_RCOMPAND_MSB,               /* RCOMPAND = 0 */
  63.         MCBSP_RCR2_RFIG_YES,                   /* RFIG     = 0 */
  64.         MCBSP_RCR2_RDATDLY_0BIT                /* RDATDLY  = 0 */
  65.     ),  
  66.     MCBSP_XCR1_RMK(    
  67.         MCBSP_XCR1_XFRLEN1_OF(1),              /* XFRLEN1  = 1 */ 
  68.         MCBSP_XCR1_XWDLEN1_16BIT               /* XWDLEN1  = 2 */
  69.     ),   
  70.     MCBSP_XCR2_RMK(   
  71.         MCBSP_XCR2_XPHASE_SINGLE,              /* XPHASE   = 0 */
  72.         MCBSP_XCR2_XFRLEN2_OF(0),              /* XFRLEN2  = 0 */
  73.         MCBSP_XCR2_XWDLEN2_8BIT,               /* XWDLEN2  = 0 */
  74.         MCBSP_XCR2_XCOMPAND_MSB,               /* XCOMPAND = 0 */
  75.         MCBSP_XCR2_XFIG_YES,                   /* XFIG     = 0 */
  76.         MCBSP_XCR2_XDATDLY_0BIT                /* XDATDLY  = 0 */
  77.     ),            
  78.     MCBSP_SRGR1_RMK( 
  79.         MCBSP_SRGR1_FWID_OF(0),                /* FWID     = 0 */
  80.         MCBSP_SRGR1_CLKGDV_OF(0)               /* CLKGDV   = 0 */
  81.     ),   
  82.     MCBSP_SRGR2_RMK(  
  83.         MCBSP_SRGR2_GSYNC_FREE,                /* FREE     = 0 */
  84.         MCBSP_SRGR2_CLKSP_RISING,              /* CLKSP    = 0 */
  85.         MCBSP_SRGR2_CLKSM_CLKS,                /* CLKSM    = 0 */
  86.         MCBSP_SRGR2_FSGM_DXR2XSR,              /* FSGM     = 0 */
  87.         MCBSP_SRGR2_FPER_OF(0)                 /* FPER     = 0 */
  88.     ),  
  89.     MCBSP_MCR1_DEFAULT,
  90.     MCBSP_MCR2_DEFAULT, 
  91.     MCBSP_PCR_RMK(
  92.         MCBSP_PCR_IDLEEN_RESET,                /* IDLEEN   = 0 */
  93.         MCBSP_PCR_XIOEN_SP,                    /* XIOEN    = 0 */
  94.         MCBSP_PCR_RIOEN_SP,                    /* RIOEN    = 0 */
  95.         MCBSP_PCR_FSXM_EXTERNAL,               /* FSXM     = 0 */
  96.         MCBSP_PCR_FSRM_EXTERNAL,               /* FSRM     = 0 */
  97.         MCBSP_PCR_SCLKME_NO,                   /* SCLKME   = 0 */
  98.         0,                                     /* CLKSSTAT = 0 */
  99.         0,                                     /* DXSTAT   = 0 */
  100.         0,                                     /* DRSTAT   = 0 */
  101.         MCBSP_PCR_CLKXM_INPUT,                 /* CLKXM    = 0 */
  102.         MCBSP_PCR_CLKRM_INPUT,                 /* CLKRM    = 0 */
  103.         MCBSP_PCR_FSXP_ACTIVEHIGH,             /* FSXP     = 0 */
  104.         MCBSP_PCR_FSRP_ACTIVEHIGH,             /* FSRP     = 0 */
  105.         MCBSP_PCR_CLKXP_FALLING,               /* CLKXP    = 1 */
  106.         MCBSP_PCR_CLKRP_RISING                 /* CLKRP    = 1 */
  107.     ),
  108.     MCBSP_RCERA_DEFAULT, 
  109.     MCBSP_RCERB_DEFAULT, 
  110.     MCBSP_RCERC_DEFAULT, 
  111.     MCBSP_RCERD_DEFAULT, 
  112.     MCBSP_RCERE_DEFAULT, 
  113.     MCBSP_RCERF_DEFAULT, 
  114.     MCBSP_RCERG_DEFAULT, 
  115.     MCBSP_RCERH_DEFAULT, 
  116.     MCBSP_XCERA_DEFAULT,
  117.     MCBSP_XCERB_DEFAULT,
  118.     MCBSP_XCERC_DEFAULT,
  119.     MCBSP_XCERD_DEFAULT,  
  120.     MCBSP_XCERE_DEFAULT,
  121.     MCBSP_XCERF_DEFAULT,  
  122.     MCBSP_XCERG_DEFAULT,
  123.     MCBSP_XCERH_DEFAULT
  124. };
  125. /* CSL config structure for DMAs */
  126. static DMA_Config dmaRxCfg = {
  127.     0,               /* DMACSDP which will be initialized by mdBindDev */
  128.     DMA_DMACCR_RMK(
  129.         DMA_DMACCR_DSTAMODE_POSTINC,
  130.         DMA_DMACCR_SRCAMODE_CONST,
  131.         DMA_DMACCR_ENDPROG_OFF,
  132.         DMA_DMACCR_REPEAT_OFF,
  133.         DMA_DMACCR_AUTOINIT_OFF,
  134.         DMA_DMACCR_EN_STOP,
  135.         DMA_DMACCR_PRIO_HI,
  136.         DMA_DMACCR_FS_DISABLE,
  137.         DMA_DMACCR_SYNC_REVT0
  138.     ),                    /* DMACCR */         
  139.     DMA_DMACICR_RMK(
  140.         DMA_DMACICR_BLOCKIE_OFF,
  141.         DMA_DMACICR_LASTIE_OFF,
  142.         DMA_DMACICR_FRAMEIE_ON,
  143.         DMA_DMACICR_FIRSTHALFIE_OFF,
  144.         DMA_DMACICR_DROPIE_OFF,
  145.         DMA_DMACICR_TIMEOUTIE_OFF
  146.     ),                   /* DMACICR */     
  147.     (DMA_AdrPtr)((Uint32)(_MCBSP_DRR10_ADDR<<1)), /* DMACSSAL */
  148.     0,                   /* DMACSSAU                      */
  149.     NULL,                    /* DMACDSAL, to be loaded by submit  */
  150.     0,                   /* DMACDSAU                      */
  151.     0,                   /* DMACEN                        */
  152.     1,                   /* DMACFN                        */
  153.     0,                   /* DMACFI                        */
  154.     0                    /* DMACEI                        */
  155. };
  156. static DMA_Config dmaTxCfg = {
  157.     0,               /* DMACSDP which will be initialized by mdBindDev */       
  158.     DMA_DMACCR_RMK(
  159.         DMA_DMACCR_DSTAMODE_CONST,
  160.         DMA_DMACCR_SRCAMODE_POSTINC,
  161.         DMA_DMACCR_ENDPROG_OFF,
  162.         DMA_DMACCR_REPEAT_OFF,
  163.         DMA_DMACCR_AUTOINIT_OFF,
  164.         DMA_DMACCR_EN_STOP,
  165.         DMA_DMACCR_PRIO_HI,
  166.         DMA_DMACCR_FS_DISABLE,
  167.         DMA_DMACCR_SYNC_XEVT0
  168.     ),                   /* DMACCR */
  169.     DMA_DMACICR_RMK(
  170.         DMA_DMACICR_BLOCKIE_OFF,
  171.         DMA_DMACICR_LASTIE_OFF,
  172.         DMA_DMACICR_FRAMEIE_ON,
  173.         DMA_DMACICR_FIRSTHALFIE_OFF,
  174.         DMA_DMACICR_DROPIE_OFF,
  175.         DMA_DMACICR_TIMEOUTIE_OFF
  176.     ),                   /* DMACICR */
  177.     NULL,                /* DMACSSAL, to be loaded by submit */
  178.     0,                   /* DMACSSAU                     */
  179.     (DMA_AdrPtr)((Uint32)(_MCBSP_DXR10_ADDR<<1)),/* DMACDSAL */
  180.     0,                   /* DMACDSAU                     */
  181.     0,                   /* DMACEN                       */
  182.     1,                   /* DMACFN                       */
  183.     0,                   /* DMACFI                       */
  184.     0                    /* DMACEI                       */
  185. };
  186. /* 
  187.  * These arrays are used to initialized csdp value for different DMA port 
  188.  * type. This is done by mdBindDev using params->dmaPortType 
  189.  */
  190. static Uns rxCsdpValue[3] = {
  191.     DMA_DMACSDP_RMK(    /* EVM5509_DMA_AIC23_PORTTYPE_DARAM */
  192.         DMA_DMACSDP_DSTBEN_NOBURST,
  193.         DMA_DMACSDP_DSTPACK_OFF,
  194.         DMA_DMACSDP_DST_DARAM,
  195.         DMA_DMACSDP_SRCBEN_NOBURST,
  196.         DMA_DMACSDP_SRCPACK_OFF,
  197.         DMA_DMACSDP_SRC_PERIPH,
  198.         DMA_DMACSDP_DATATYPE_16BIT
  199.     ),               
  200.     DMA_DMACSDP_RMK(    /* EVM5509_DMA_AIC23_PORTTYPE_SARAM */
  201.         DMA_DMACSDP_DSTBEN_NOBURST,
  202.         DMA_DMACSDP_DSTPACK_OFF,
  203.         DMA_DMACSDP_DST_SARAM,
  204.         DMA_DMACSDP_SRCBEN_NOBURST,
  205.         DMA_DMACSDP_SRCPACK_OFF,
  206.         DMA_DMACSDP_SRC_PERIPH,
  207.         DMA_DMACSDP_DATATYPE_16BIT
  208.     ),               
  209.     DMA_DMACSDP_RMK(    /* EVM5509_DMA_AIC23_PORTTYPE_EMIF */
  210.         DMA_DMACSDP_DSTBEN_NOBURST,
  211.         DMA_DMACSDP_DSTPACK_OFF,
  212.         DMA_DMACSDP_DST_EMIF,
  213.         DMA_DMACSDP_SRCBEN_NOBURST,
  214.         DMA_DMACSDP_SRCPACK_OFF,
  215.         DMA_DMACSDP_SRC_PERIPH,
  216.         DMA_DMACSDP_DATATYPE_16BIT
  217.     )
  218. };
  219. static Uns txCsdpValue[3] = {
  220.     DMA_DMACSDP_RMK(    /* EVM5509_DMA_AIC23_PORTTYPE_DARAM */
  221.         DMA_DMACSDP_DSTBEN_NOBURST,
  222.         DMA_DMACSDP_DSTPACK_OFF,
  223.         DMA_DMACSDP_DST_PERIPH, 
  224.         DMA_DMACSDP_SRCBEN_NOBURST,
  225.         DMA_DMACSDP_SRCPACK_OFF,
  226.         DMA_DMACSDP_SRC_DARAM,
  227.         DMA_DMACSDP_DATATYPE_16BIT
  228.     ),                  
  229.     DMA_DMACSDP_RMK(    /* EVM5509_DMA_AIC23_PORTTYPE_SARAM */
  230.         DMA_DMACSDP_DSTBEN_NOBURST,
  231.         DMA_DMACSDP_DSTPACK_OFF,
  232.         DMA_DMACSDP_DST_PERIPH, 
  233.         DMA_DMACSDP_SRCBEN_NOBURST,
  234.         DMA_DMACSDP_SRCPACK_OFF,
  235.         DMA_DMACSDP_SRC_SARAM,
  236.         DMA_DMACSDP_DATATYPE_16BIT
  237.     ),            
  238.     DMA_DMACSDP_RMK(    /* EVM5509_DMA_AIC23_PORTTYPE_EMIF */
  239.         DMA_DMACSDP_DSTBEN_NOBURST,
  240.         DMA_DMACSDP_DSTPACK_OFF,
  241.         DMA_DMACSDP_DST_PERIPH, 
  242.         DMA_DMACSDP_SRCBEN_NOBURST,
  243.         DMA_DMACSDP_SRCPACK_OFF,
  244.         DMA_DMACSDP_SRC_EMIF,
  245.         DMA_DMACSDP_DATATYPE_16BIT
  246.     )
  247. };
  248.     
  249. /*
  250.  * ======== mdBindDev ========
  251.  */
  252. #pragma CODE_SECTION(mdBindDev, ".text:init")
  253. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
  254. {
  255.     EVM5509_DMA_AIC23_DevParams *params = 
  256.         (EVM5509_DMA_AIC23_DevParams *)devParams;
  257.     C55XX_DMA_MCBSP_DevParams genericDevParams;
  258.     EVM5509_DMA_AIC23_DevParams defaultParams = 
  259.                         EVM5509_DMA_AIC23_DEVPARAMS_DEFAULT;
  260.     /* use default parameter if none is given */
  261.     if (params == NULL) {
  262.         params = &defaultParams;
  263.     }
  264.     /* Check the version number */
  265.     if (params->versionId != EVM5509_DMA_AIC23_VERSION_1){
  266.         /* Unsupported version */
  267.         return(IOM_EBADARGS);
  268.     }
  269.     /* set codec parameters (this will be also initialize the codec) */
  270.     AIC23_setParams(&(params->aic23));
  271.     
  272.     /* set dmacsdp register to the right dma port type */
  273.     dmaRxCfg.dmacsdp = rxCsdpValue[params->dmaPortType];
  274.     dmaTxCfg.dmacsdp = txCsdpValue[params->dmaPortType];
  275.     /* pass the structure fields down the generic lower level */
  276.     genericDevParams.versionId = C55XX_DMA_MCBSP_VERSION_1;
  277.     genericDevParams.rxDmaId = params->rxDmaId;
  278.     genericDevParams.txDmaId = params->txDmaId;
  279.     genericDevParams.mcbspCfg = &mcbspCfg0;
  280.     genericDevParams.rxIerMask[0] = params->rxIerMask[0];
  281.     genericDevParams.rxIerMask[1] = params->rxIerMask[1];
  282.     genericDevParams.txIerMask[0] = params->txIerMask[0];
  283.     genericDevParams.txIerMask[1] = params->txIerMask[1];
  284.     
  285.     return (C55XX_DMA_MCBSP_FXNS.mdBindDev(devp, MCBSP_PORT0,
  286.             &genericDevParams));
  287. }
  288. /* 
  289.  * ======== mdCreateChan ========
  290.  */
  291. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode, 
  292.                 Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
  293. {
  294.     C55XX_DMA_MCBSP_ChanParams genericChanParams;
  295.     if (mode == IOM_INPUT) {
  296.         genericChanParams.dmaCfg = &dmaRxCfg;
  297.     }
  298.     else if (mode == IOM_OUTPUT) {
  299.         genericChanParams.dmaCfg = &dmaTxCfg;
  300.     }
  301.     else {
  302.         return (IOM_EBADMODE);
  303.     }
  304.     return (C55XX_DMA_MCBSP_FXNS.mdCreateChan(chanp, devp, name, mode, 
  305.                 &genericChanParams, cbFxn, cbArg));
  306. }
  307. /*
  308.  * ======== EVM5509_DMA_AIC23_init ========
  309.  */
  310. #pragma CODE_SECTION(EVM5509_DMA_AIC23_init, ".text:init")
  311. Void EVM5509_DMA_AIC23_init(Void)
  312. {
  313.     C55XX_DMA_MCBSP_init();
  314.     EVM5509_DMA_AIC23_FXNS = C55XX_DMA_MCBSP_FXNS;
  315.     EVM5509_DMA_AIC23_FXNS.mdBindDev = mdBindDev;
  316.     EVM5509_DMA_AIC23_FXNS.mdCreateChan = mdCreateChan;
  317. }