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

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.  *  ======== uarthw_c54xx_mcbsp.c ========
  11.  */
  12.  
  13. #include <std.h>
  14. #include <hwi.h>
  15. #include <iom.h>
  16. #include <csl.h>
  17. #include <csl_mcbsp.h>
  18. #include <csl_irq.h>
  19. #include <csl_dma.h>
  20. #include <uarthw_mcbsp.h>
  21. static Int setupDma(MdUns *rxBuf, MdUns *txBuf, UARTHW_MCBSP_Params *params);
  22. static Int setupMcbsp(UARTHW_MCBSP_Params *params);
  23. static void enable(MdUns *txBuf);
  24. static MCBSP_Handle hMcbsp;
  25. static DMA_Handle hDmaRx;
  26. static DMA_Handle hDmaTx;
  27. static UARTHW_MCBSP_Params defaultParams = {
  28.     MCBSP_PORT1,        /* mcbspId */
  29.     DMA_CHA4,           /* dmaRxId */
  30.     DMA_CHA5,           /* dmaTxId */
  31.     100000000,          /* mcbspClkIn (100MHz) */
  32.     115200,             /* baud rate */
  33.     UARTHW_MCBSP_INTR_MASK_DEFAULT
  34. };
  35. /*
  36.  *  ======== UARTHW_MCBSP_start ========
  37.  */
  38. Int UARTHW_MCBSP_start(MdUns *rxBuf, MdUns *txBuf,
  39.                         UARTHW_MCBSP_Params *params)
  40. {
  41.     Int status;
  42.     Int rxId, txId;
  43.     HWI_Attrs hwiAttrs;
  44.     if (params == NULL) {
  45.         params = &defaultParams;
  46.     }
  47.     status = setupMcbsp(params);
  48.     if (status < 0) {
  49.        return (status);
  50.     }
  51.     status = setupDma(rxBuf, txBuf, params);
  52.     if (status < 0) {
  53.        return (status);
  54.     }
  55.     rxId = DMA_getEventId(hDmaRx);
  56.     txId = DMA_getEventId(hDmaTx);
  57.     
  58.     hwiAttrs.intrMask = params->intrMask.rxIntrMask;
  59.     hwiAttrs.arg = NULL;
  60.     HWI_dispatchPlug(rxId, (Fxn)UARTHW_MCBSP_dmaRxIsr, &hwiAttrs);
  61.     hwiAttrs.intrMask = params->intrMask.txIntrMask;
  62.     HWI_dispatchPlug(txId, (Fxn)UARTHW_MCBSP_dmaTxIsr, &hwiAttrs);
  63.     IRQ_enable(rxId);
  64.     IRQ_enable(txId);
  65.     enable(txBuf);
  66.     return (IOM_COMPLETED);
  67. }
  68. /*
  69.  *  ======== setupDma =======
  70.  */
  71. static Int setupDma(MdUns *rxBuf, MdUns *txBuf, UARTHW_MCBSP_Params *params)
  72. {
  73.     /*
  74.      * I am using the stack extensively during initialization as I dont 
  75.      * require these structures after initialization.
  76.      */
  77.     Uns dmaTxSynEvt, dmaRxSynEvt;
  78.     DMA_AdrPtr dmaTxDest, dmaRxSrc;
  79.    
  80.     DMA_GblConfig dmaGblCfg = {
  81.         0x00,   /*  Breakpoint Emulation Behavior (FREE)  */
  82.         NULL,   /* Source Program Page Address Register(DMSRCP)-Symbolic */
  83.         NULL,   /* Destination Program Page Address Register(DMDSTP)-Symbolic */
  84.         0x0000, /*  Element Address Index Register 0 (DMIDX0)  */
  85.         0x0000, /*  Frame Address Index Register 0 (DMFRI0)  */
  86.         0x0000, /*  Element Address Index Register 1 (DMIDX1)  */
  87.         0x0000, /*  Frame Address Index Register 1 (DMFRI1)  */
  88.         NULL,   /*  Global Source Address Reload Register (DMGSA)-Symbolic  */
  89.         NULL,   /* Global Destination Address Reload Register(DMGDA)-Symbolic */
  90.         0x0000, /*  Global Element Count Reload Register (DMGCR)  */
  91.         0x0000  /*  Global Frame Count Reload Register (DMGFR)  */
  92.     };
  93.          
  94.     DMA_Config dmaTxCfg = {
  95.         0x0001,         /*  Channel Priority (0x0000 or 0x0001)  */
  96.         DMA_DMMCR_RMK(
  97.             DMA_DMMCR_AUTOINIT_OFF,
  98.             DMA_DMMCR_DINM_ON,
  99.             DMA_DMMCR_IMOD_HALF_AND_FULL,
  100.             DMA_DMMCR_CTMOD_ABU,
  101.             DMA_DMMCR_SIND_POSTINC,
  102.             DMA_DMMCR_DMS_DATA,
  103.             DMA_DMMCR_DIND_NOMOD,
  104.             DMA_DMMCR_DMD_DATA
  105.         ),              /* Transfer Mode Control Register (DMMCR) */
  106.         DMA_DMSFC_RMK(
  107.             0,
  108.             DMA_DMSFC_DBLW_OFF,
  109.             DMA_DMSFC_FRAMECNT_OF(0)
  110.         ),              /* Sync Event and Frame Count Register (DMSFC) */
  111.         (DMA_AdrPtr)0,  /* Source Address Register (DMSRC) - Symbolic */
  112.         (DMA_AdrPtr)0,  /* Destination Address Register (DMDST) - Symbolic */
  113.         2 * UARTHW_MCBSP_TxPKTBITS     /* Element Count Register (DMCTR) */
  114.     };
  115.         
  116.     DMA_Config dmaRxCfg = {
  117.         0x0001,         /* Channel Priority (0x0000 or 0x0001) */
  118.         DMA_DMMCR_RMK(
  119.             DMA_DMMCR_AUTOINIT_OFF,
  120.             DMA_DMMCR_DINM_ON,
  121.             DMA_DMMCR_IMOD_HALF_AND_FULL,
  122.             DMA_DMMCR_CTMOD_ABU,
  123.             DMA_DMMCR_SIND_NOMOD,
  124.             DMA_DMMCR_DMS_DATA,
  125.             DMA_DMMCR_DIND_POSTINC,
  126.             DMA_DMMCR_DMD_DATA
  127.         ),              /* Transfer Mode Control Register (DMMCR) */
  128.         DMA_DMSFC_RMK(
  129.              0,
  130.              DMA_DMSFC_DBLW_OFF,
  131.              DMA_DMSFC_FRAMECNT_OF(0)
  132.         ),              /* Sync Event and Frame Count Register (DMSFC) */
  133.         (DMA_AdrPtr)0,  /* Source Address Register (DMSRC) - Symbolic */
  134.         (DMA_AdrPtr)0,  /* Destination Address Register (DMDST) - Symbolic */
  135.         2 * UARTHW_MCBSP_RxPKTBITS     /*  Element Count Register (DMCTR) */
  136.     };
  137.     if (params->mcbspId == MCBSP_PORT1) {
  138.         dmaRxSynEvt = DMA_DMSFC_DSYN_REVT1;
  139.         dmaTxSynEvt = DMA_DMSFC_DSYN_XEVT1;
  140.         dmaTxDest = (DMA_AdrPtr)MCBSP_ADDR(DXR11); 
  141.         dmaRxSrc  = (DMA_AdrPtr)MCBSP_ADDR(DRR11);
  142.     }
  143.     else {
  144.         dmaRxSynEvt = DMA_DMSFC_DSYN_REVT0;
  145.         dmaTxSynEvt = DMA_DMSFC_DSYN_XEVT0;
  146.         dmaTxDest = (DMA_AdrPtr)MCBSP_ADDR(DXR10); 
  147.         dmaRxSrc  = (DMA_AdrPtr)MCBSP_ADDR(DRR10);
  148.     }
  149.      
  150.     hDmaRx = DMA_open(params->dmaRxId, DMA_OPEN_RESET);
  151.     hDmaTx = DMA_open(params->dmaTxId, DMA_OPEN_RESET);
  152.     if (hDmaTx == INV || hDmaRx == INV) {
  153.         return (IOM_EBADIO);
  154.     }
  155.     dmaTxCfg.dmsrc = (DMA_AdrPtr)(&txBuf[1]);
  156.     dmaTxCfg.dmdst = dmaTxDest;
  157.     dmaTxCfg.dmsfc = _DMA_DMSFC_DSYN_MK(dmaTxSynEvt);
  158.          
  159.     DMA_config(hDmaTx, &dmaTxCfg);
  160.          
  161.     dmaRxCfg.dmdst = (DMA_AdrPtr)(&rxBuf[0]);
  162.     dmaRxCfg.dmsrc = dmaRxSrc;
  163.     dmaRxCfg.dmsfc = _DMA_DMSFC_DSYN_MK(dmaRxSynEvt);
  164.     DMA_config(hDmaRx, &dmaRxCfg);
  165.     DMA_globalConfig(0x0FFFF, &dmaGblCfg);
  166.     /* Set value of Global Index Register, DMIDX0 */
  167.     DMA_RSET(DMIDX0, 0);
  168.     DMA_RSET(DMIDX1, 0);
  169.     /* Set FREE bit in DMPREC to enable free run on DMA */
  170.     DMA_FSET(DMPREC, FREE, 1);
  171.     return (IOM_COMPLETED);
  172. }
  173. /*
  174.  *  ======== setupMcbsp ========
  175.  *  This function is used to setup the McBSP port chosen with the initial
  176.  *  settings based on parity, stopbits, databits,baudrates chosen.
  177.  */
  178. static Int setupMcbsp(UARTHW_MCBSP_Params *params)
  179. {
  180.     /*
  181.      * I am using the stack extensively during initialization as I dont 
  182.      * require these structures after initialization.
  183.      */
  184.     Uns clkdv;
  185.     MCBSP_Config mcbspCfg = {
  186.         MCBSP_SPCR1_RMK(
  187.             MCBSP_SPCR1_DLB_OFF,
  188.             MCBSP_SPCR1_RJUST_DEFAULT,
  189.             MCBSP_SPCR1_CLKSTP_DISABLE,
  190.             MCBSP_SPCR1_DXENA_DEFAULT,
  191.             MCBSP_SPCR1_RINTM_RRDY,
  192.             MCBSP_SPCR1_RRST_DISABLE
  193.         ),                                       /* SPCR1 */ 
  194.         MCBSP_SPCR2_RMK(
  195.             MCBSP_SPCR2_FREE_NO,
  196.             MCBSP_SPCR2_SOFT_YES,
  197.             MCBSP_SPCR2_FRST_DEFAULT,
  198.             MCBSP_SPCR2_GRST_DEFAULT,
  199.             MCBSP_SPCR2_XINTM_XRDY,
  200.             MCBSP_SPCR2_XSYNCERR_NO
  201.         ),                                     /* SPCR2 */ 
  202.         MCBSP_RCR1_RMK(
  203.             MCBSP_RCR1_RFRLEN1_OF(
  204.                 UARTHW_MCBSP_DATABITS + UARTHW_MCBSP_PARITYBITS),
  205.             MCBSP_RCR1_RWDLEN1_16BIT
  206.         ),                                     /* RCR1 */
  207.         MCBSP_RCR2_RMK(
  208.             MCBSP_RCR2_RPHASE_DUAL,
  209.             MCBSP_RCR2_RFRLEN2_OF(UARTHW_MCBSP_RxHSTOPBITS - 1),
  210.             MCBSP_RCR2_RWDLEN2_8BIT,
  211.             MCBSP_RCR2_RCOMPAND_MSB,
  212.             MCBSP_RCR2_RFIG_NO,
  213.             MCBSP_RCR2_RDATDLY_1BIT
  214.         ),                                     /* RCR2 */
  215.         MCBSP_XCR1_RMK(
  216.             MCBSP_XCR1_XFRLEN1_OF(
  217.                 UARTHW_MCBSP_DATABITS + UARTHW_MCBSP_PARITYBITS),
  218.             MCBSP_XCR1_XWDLEN1_16BIT
  219.         ),                                     /* XCR1 */
  220.         MCBSP_XCR2_RMK(
  221.             MCBSP_XCR2_XPHASE_DUAL,
  222.             MCBSP_XCR2_XFRLEN2_OF(UARTHW_MCBSP_TxHSTOPBITS - 1),
  223.             MCBSP_XCR2_XWDLEN2_8BIT,
  224.             MCBSP_XCR2_XCOMPAND_MSB,
  225.             MCBSP_XCR2_XFIG_YES,
  226.             MCBSP_XCR2_XDATDLY_0BIT
  227.         ),                                     /* XCR2 */
  228.         MCBSP_SRGR1_RMK(
  229.             MCBSP_SRGR1_FWID_OF(0),
  230.             MCBSP_SRGR1_CLKGDV_OF(1)
  231.         ),                                     /* SRGR1 */
  232.         MCBSP_SRGR2_RMK( 
  233.             MCBSP_SRGR2_GSYNC_FREE,
  234.             MCBSP_SRGR2_CLKSP_RISING,
  235.             MCBSP_SRGR2_CLKSM_INTERNAL,
  236.             MCBSP_SRGR2_FSGM_DXR2XSR,
  237.             0
  238.         ),                          
  239.         0x0000u,                               /* MCR1 */
  240.         0x0000u,                               /* MCR2 */
  241.         MCBSP_PCR_RMK(
  242.             MCBSP_PCR_XIOEN_SP,
  243.             MCBSP_PCR_RIOEN_SP,
  244.             MCBSP_PCR_FSXM_INTERNAL,
  245.             MCBSP_PCR_FSRM_EXTERNAL,
  246.             MCBSP_PCR_CLKXM_OUTPUT,
  247.             MCBSP_PCR_CLKRM_OUTPUT,
  248.             MCBSP_PCR_FSXP_ACTIVELOW,
  249.             MCBSP_PCR_FSRP_ACTIVELOW,
  250.             MCBSP_PCR_CLKXP_RISING,
  251.             MCBSP_PCR_CLKRP_FALLING
  252.         ),                                     /* PCR   */
  253.         0x0000u,                               /* RCERA */
  254.         0x0000u,                               /* RCERB */
  255.         0x0000u,                               /* XCERA */
  256.         0x0000u,                               /* XCERB */
  257.     };
  258.     hMcbsp = MCBSP_open(params->mcbspId, MCBSP_OPEN_RESET);
  259.     if (hMcbsp == INV) {
  260.         return (IOM_EBADIO);
  261.     }
  262.     /*
  263.      * Here we compute the bit rate of the McBSP.  Each UART bit is 
  264.      * represented by 16 McBSP bits.
  265.      */
  266.     clkdv = (Uns)(params->mcbspClkIn / (params->baud * 16));
  267.   
  268.     /* clkdv is max 8-bits long, so make sure we didn't overflow ... */
  269.     if (clkdv > 0xff) {
  270.         return (IOM_EBADARGS);
  271.     }
  272.     mcbspCfg.srgr1 = clkdv;
  273.     
  274.     MCBSP_config(hMcbsp, &mcbspCfg);
  275.     return (IOM_COMPLETED);
  276. }
  277. /*
  278.  *  ======== enable ========
  279.  *  This function is used to enable the McBSP and start DMA
  280.  */
  281. static void enable(MdUns *txBuf)
  282. {
  283.     /* Take MCBSP receive and transmit out of reset */
  284.     MCBSP_start(hMcbsp, MCBSP_RCV_START | MCBSP_XMIT_START, 0xFFFF);
  285.     /* Prime MCBSP DXR */
  286.     while (!MCBSP_xrdy(hMcbsp)) {
  287.         ;
  288.     }
  289.     MCBSP_write(hMcbsp, txBuf[0]);
  290.   
  291.     DMA_start(hDmaTx);
  292.     DMA_start(hDmaRx);
  293.   
  294.     /* Start the MCBSP and Sample Rate Generator */
  295.     MCBSP_start(hMcbsp, MCBSP_SRGR_START, 0xFFFF);
  296. }