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

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.  *  ======== dsk6416_edma_aic23.c ========
  11.  * 
  12.  *  Driver for the aic23 codec on the TMS320C6416 DSK. Requires the
  13.  *  generic TMS320C6x1x McBSP driver.
  14.  */
  15. #include <std.h>
  16. #include <iom.h>
  17. #include <csl.h>
  18. #include <csl_edma.h>
  19. #include <csl_mcbsp.h>
  20. #include <dsk6416_edma_aic23.h>
  21. #include <c6x1x_edma_mcbsp.h>
  22. #define GENERICDEVPARAMS {                                                  
  23.     C6X1X_EDMA_MCBSP_VERSION_1, /* Version number of mcbsp driver  */       
  24.     FALSE, /* True if buffers are in cacheable memory (set in mdBindDev) */ 
  25.     FALSE, /* Driver should not enable the McBSP sample rate generator */   
  26.     FALSE, /* Driver should not enable the McBSP frame sync generator */    
  27.     0,     /* IRQ id to use for the EDMA (set in mdBindDev) */              
  28.     NULL,  /* McBSP configuration for the codec (set in mdBindDev) */       
  29.     DSK6416_EDMA_AIC23_INTR_MASK_DEFAULT /* Interrupt mask */               
  30. }
  31. /* Structure containing port specific variables */
  32. typedef struct {
  33.         Ptr c6x1xPortObj;
  34.         Int edmaPriority;
  35. } PortObj, *PortHandle;
  36. /* Declare the port structures */
  37. /* Only Mcbsp 2 is used */
  38. static PortObj port;
  39. DSK6416_EDMA_AIC23_DevParams DSK6416_EDMA_AIC23_DEVPARAMS =
  40.                                    DSK6416_EDMA_AIC23_DEVPARAMS_DEFAULT;
  41. /*
  42.  * Forward declaration of the IOM interface functions. They are only
  43.  * exposed via the IOM function table to avoid namespace pollution.
  44.  */
  45. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams);
  46. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
  47.                         Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg);
  48. /*
  49.  * The codec driver function table. Notice how we copy most functions
  50.  * from the generic c6x1x edma mcbsp driver.
  51.  */
  52. IOM_Fxns DSK6416_EDMA_AIC23_FXNS = {
  53.     &mdBindDev,
  54.     NULL,
  55.     NULL,
  56.     &mdCreateChan,
  57.     NULL,
  58.     NULL
  59. };
  60. static MCBSP_Config mcbspCfg2 = {
  61.     MCBSP_FMKS(SPCR, FREE, NO)              |
  62.     MCBSP_FMKS(SPCR, SOFT, NO)              |
  63.     MCBSP_FMKS(SPCR, FRST, YES)             |
  64.     MCBSP_FMKS(SPCR, GRST, YES)             |
  65.     MCBSP_FMKS(SPCR, XINTM, XRDY)           |
  66.     MCBSP_FMKS(SPCR, XSYNCERR, NO)          |
  67.     MCBSP_FMKS(SPCR, XRST, YES)             |
  68.     MCBSP_FMKS(SPCR, DLB, OFF)              |
  69.     MCBSP_FMKS(SPCR, RJUST, RZF)            |
  70.     MCBSP_FMKS(SPCR, CLKSTP, DISABLE)       |
  71.     MCBSP_FMKS(SPCR, DXENA, OFF)            |
  72.     MCBSP_FMKS(SPCR, RINTM, RRDY)           |
  73.     MCBSP_FMKS(SPCR, RSYNCERR, NO)          |
  74.     MCBSP_FMKS(SPCR, RRST, YES),
  75.     MCBSP_FMKS(RCR, RPHASE, SINGLE)         |
  76.     MCBSP_FMKS(RCR, RFRLEN2, DEFAULT)       |
  77.     MCBSP_FMKS(RCR, RWDLEN2, DEFAULT)       |
  78.     MCBSP_FMKS(RCR, RCOMPAND, MSB)          |
  79.     MCBSP_FMKS(RCR, RFIG, NO)               |
  80.     MCBSP_FMKS(RCR, RDATDLY, 0BIT)          |
  81.     MCBSP_FMKS(RCR, RFRLEN1, OF(1))         |
  82.     MCBSP_FMKS(RCR, RWDLEN1, 16BIT)         |
  83.     MCBSP_FMKS(RCR, RWDREVRS, DISABLE),
  84.     MCBSP_FMKS(XCR, XPHASE, SINGLE)         |
  85.     MCBSP_FMKS(XCR, XFRLEN2, DEFAULT)       |
  86.     MCBSP_FMKS(XCR, XWDLEN2, DEFAULT)       |
  87.     MCBSP_FMKS(XCR, XCOMPAND, MSB)          |
  88.     MCBSP_FMKS(XCR, XFIG, NO)               |
  89.     MCBSP_FMKS(XCR, XDATDLY, 0BIT)          |
  90.     MCBSP_FMKS(XCR, XFRLEN1, OF(1))         |
  91.     MCBSP_FMKS(XCR, XWDLEN1, 16BIT)         |
  92.     MCBSP_FMKS(XCR, XWDREVRS, DISABLE),
  93.         
  94.     MCBSP_FMKS(SRGR, GSYNC, DEFAULT)        |
  95.     MCBSP_FMKS(SRGR, CLKSP, DEFAULT)        |
  96.     MCBSP_FMKS(SRGR, CLKSM, DEFAULT)        |
  97.     MCBSP_FMKS(SRGR, FSGM, DEFAULT)         |
  98.     MCBSP_FMKS(SRGR, FPER, DEFAULT)         |
  99.     MCBSP_FMKS(SRGR, FWID, DEFAULT)         |
  100.     MCBSP_FMKS(SRGR, CLKGDV, DEFAULT),
  101.     MCBSP_MCR_DEFAULT,
  102.     MCBSP_RCERE0_DEFAULT,
  103.     MCBSP_RCERE1_DEFAULT,
  104.     MCBSP_RCERE2_DEFAULT,
  105.     MCBSP_RCERE3_DEFAULT,
  106.     MCBSP_XCERE0_DEFAULT,
  107.     MCBSP_XCERE1_DEFAULT,
  108.     MCBSP_XCERE2_DEFAULT,
  109.     MCBSP_XCERE3_DEFAULT,
  110.     MCBSP_FMKS(PCR, XIOEN, SP)              |
  111.     MCBSP_FMKS(PCR, RIOEN, SP)              |
  112.     MCBSP_FMKS(PCR, FSXM, EXTERNAL)         |
  113.     MCBSP_FMKS(PCR, FSRM, EXTERNAL)         |
  114.     MCBSP_FMKS(PCR, CLKXM, INPUT)           |
  115.     MCBSP_FMKS(PCR, CLKRM, INPUT)           |
  116.     MCBSP_FMKS(PCR, CLKSSTAT, DEFAULT)      |
  117.     MCBSP_FMKS(PCR, DXSTAT, DEFAULT)        |
  118.     MCBSP_FMKS(PCR, FSXP, ACTIVEHIGH)       |
  119.     MCBSP_FMKS(PCR, FSRP, ACTIVEHIGH)       |
  120.     MCBSP_FMKS(PCR, CLKXP, FALLING)         |
  121.     MCBSP_FMKS(PCR, CLKRP, RISING)
  122. };
  123. /*
  124.  * ======== mdBindDev ========
  125.  * This function allocates and configures the aic23 codec.
  126.  */
  127. static Int mdBindDev(Ptr *devp, Int devid, Ptr devParams)
  128. {
  129.     Int result;
  130.     DSK6416_EDMA_AIC23_DevParams *params =
  131.         (DSK6416_EDMA_AIC23_DevParams *) devParams;
  132.     C6X1X_EDMA_MCBSP_DevParams genericParams = GENERICDEVPARAMS;
  133.     /* If no device parameters are passed, use the defaults. */
  134.     if (params == NULL) {
  135.         params = &DSK6416_EDMA_AIC23_DEVPARAMS;
  136.     }
  137.     /* Check if the version is supported by the driver */
  138.     if (params->versionId != DSK6416_EDMA_AIC23_VERSION_1) {
  139.         /* Unsupported version */
  140.         return(IOM_EBADIO);
  141.     }
  142.     /* Set codec parameters (this will also initialize the codec) */
  143.     if (!AIC23_setParams(&(params->aic23)))
  144.         return IOM_EALLOC;
  145.     /* Set the IRQ id to use for EDMA (default is 8) */
  146.     genericParams.irqId = params->irqId;
  147.     genericParams.cacheCalls = params->cacheCalls;
  148.     genericParams.mcbspCfgPtr = &mcbspCfg2;
  149.     genericParams.intrMask = params->intrMask;
  150.     /* Call the generic mdBindDev to claim mcbsp port 2 */
  151.     result = (C6X1X_EDMA_MCBSP_FXNS.mdBindDev)(&port.c6x1xPortObj, 
  152.                     MCBSP_PORT2, &genericParams);
  153.     /* Store the edma priority in PortObj */
  154.     port.edmaPriority = params->edmaPriority;
  155.     *devp = &port;
  156.     return (result);
  157. }
  158. /*
  159.  * ======== mdCreateChan ========
  160.  * This function creates and configures a device channel.
  161.  */
  162. static Int mdCreateChan(Ptr *chanp, Ptr devp, String name, Int mode,
  163.                         Ptr chanParams, IOM_TiomCallback cbFxn, Ptr cbArg)
  164. {
  165.     Int result;
  166.     C6X1X_EDMA_MCBSP_ChanParams genericParams;
  167.     PortHandle localPort = (PortHandle) devp;
  168.     EDMA_Config edmaCfg = {
  169.         EDMA_FMKS(OPT, ESIZE, 16BIT)          |
  170.         
  171.         EDMA_FMKS(OPT, 2DS, NO)               |
  172.         EDMA_FMKS(OPT, SUM, NONE)             |
  173.         EDMA_FMKS(OPT, 2DD, NO)               |
  174.         EDMA_FMKS(OPT, DUM, NONE)             |
  175.         EDMA_FMKS(OPT, TCINT, YES)            |
  176.         EDMA_FMK (OPT, TCC, NULL)             |
  177.         EDMA_FMKS(OPT, TCCM, DEFAULT)         |
  178.         EDMA_FMKS(OPT, ATCINT, NO)            |
  179.         EDMA_FMKS(OPT, ATCC, DEFAULT)         |
  180.         EDMA_FMKS(OPT, PDTS, DEFAULT)         |
  181.         EDMA_FMKS(OPT, PDTD, DEFAULT)         |
  182.         EDMA_FMKS(OPT, LINK, YES)             |
  183.         EDMA_FMKS(OPT, FS, NO),
  184.         EDMA_FMK (SRC, SRC, NULL),
  185.         EDMA_FMK (CNT, FRMCNT, NULL)          |
  186.         EDMA_FMK (CNT, ELECNT, NULL),
  187.         EDMA_FMK (DST, DST, NULL),
  188.         EDMA_FMKS(IDX, FRMIDX, DEFAULT)       |
  189.         EDMA_FMKS(IDX, ELEIDX, DEFAULT),
  190.         EDMA_FMK (RLD, ELERLD, NULL)          |
  191.         EDMA_FMK (RLD, LINK, NULL)
  192.     };
  193.     
  194.     if (mode == IOM_INPUT) {
  195.         edmaCfg.opt |= EDMA_FMK(OPT, DUM, EDMA_OPT_DUM_INC);
  196.     }
  197.     else {
  198.         edmaCfg.opt |= EDMA_FMK(OPT, SUM, EDMA_OPT_SUM_INC);
  199.     }
  200.     /* set the edma transfer priority */
  201.     edmaCfg.opt |= EDMA_FMK(OPT, PRI, localPort->edmaPriority);
  202.     /* Configure parameters */
  203.     genericParams.tdmChans = DSK6416_EDMA_AIC23_TDMCHANNELS;
  204.     genericParams.edmaCfgPtr = &edmaCfg;
  205.     result = (C6X1X_EDMA_MCBSP_FXNS.mdCreateChan)(chanp, 
  206.                     localPort->c6x1xPortObj, name, mode,
  207.                     &genericParams, cbFxn, cbArg);
  208.     return (result);
  209. }
  210. /*
  211.  * ======== DSK6416_EDMA_AIC23_init ========
  212.  * This function initializes the driver's structures.
  213.  */
  214. Void DSK6416_EDMA_AIC23_init()
  215. {
  216.     /* Pass some IOM fxns straight to the generic driver */
  217.     DSK6416_EDMA_AIC23_FXNS.mdControlChan =
  218.         C6X1X_EDMA_MCBSP_FXNS.mdControlChan;
  219.     DSK6416_EDMA_AIC23_FXNS.mdDeleteChan =
  220.         C6X1X_EDMA_MCBSP_FXNS.mdDeleteChan;
  221.     DSK6416_EDMA_AIC23_FXNS.mdSubmitChan =
  222.         C6X1X_EDMA_MCBSP_FXNS.mdSubmitChan;
  223.     DSK6416_EDMA_AIC23_FXNS.mdUnBindDev =
  224.         C6X1X_EDMA_MCBSP_FXNS.mdUnBindDev;
  225.     C6X1X_EDMA_MCBSP_init();
  226. }