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

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.  *  ======== uarthw_c6x1x_mcbsp.c ========
  11.  */
  12.  
  13. #include <std.h>
  14. #include <hwi.h>
  15. #include <iom.h>
  16. #undef _INLINE          /* for debug so CSL functions are not inline'd */
  17. #if defined(_62_)
  18. #define CHIP_6711
  19. #elif defined(_64_)
  20. #define CHIP_6416
  21. #endif
  22. #include <csl.h>
  23. #include <csl_irq.h>
  24. #include <csl_edma.h>
  25. #include <csl_mcbsp.h>
  26. #include <uarthw_mcbsp.h>
  27. #if defined(_62_)
  28. #define MCBSPID         MCBSP_DEV1      // dsk6711 - DEV1
  29. #define MCBSPCLKIN      75000000        // dsk6711 - 75MHz
  30. #elif defined (_64_)
  31. #define MCBSPID         MCBSP_DEV2      // teb6416 - DEV2
  32. #define MCBSPCLKIN      125000000       // teb6416 - 125MHz
  33. #endif
  34. static UARTHW_MCBSP_Params defaultParams = {
  35.     MCBSPID,            /* mcbspId */
  36.     0,                  /* dmaRxId (ignored for 6x) */
  37.     0,                  /* dmaTxId (ignored for 6x) */
  38.     MCBSPCLKIN,         /* mcbspClkIn (in MHz) */
  39.     115200,             /* baud rate */
  40.     UARTHW_MCBSP_INTR_MASK_DEFAULT
  41. };
  42. static EDMA_Handle hEdmaTx;
  43. static EDMA_Handle hEdmaRx;
  44. static MCBSP_Handle hMcbsp;
  45. static void enable(void);
  46. /*
  47.  *  ======== UARTHW_MCBSP_start ========
  48.  */
  49. Int UARTHW_MCBSP_start(MdUns *rxBuf, MdUns *txBuf,
  50.                         UARTHW_MCBSP_Params *params)
  51. {
  52.     Uns         clkdv;
  53.     EDMA_Handle edmaRxPing;     /* Handles */
  54.     EDMA_Handle edmaRxPong;
  55.     EDMA_Handle edmaTxPing;
  56.     EDMA_Handle edmaTxPong;
  57.     MCBSP_Config mcbspCfg;      /* Config Structures */
  58.     EDMA_Config edmaRxCfg;
  59.     EDMA_Config edmaTxCfg;
  60.     Int rxTcc, txTcc;           /* TCC ids */ 
  61.     HWI_Attrs hwiAttrs;
  62.     if (params == NULL) {
  63.         params = &defaultParams;
  64.     }
  65.     hMcbsp  = MCBSP_open(params->mcbspId, MCBSP_OPEN_RESET);
  66.     if (hMcbsp == INV) {
  67.         return (IOM_EBADIO);
  68.     }
  69.     hEdmaRx = EDMA_open(MCBSP_getRcvEventId(hMcbsp), EDMA_OPEN_RESET);
  70.     hEdmaTx = EDMA_open(MCBSP_getXmtEventId(hMcbsp), EDMA_OPEN_RESET);
  71.     if (hEdmaRx == EDMA_HINV || hEdmaTx == EDMA_HINV) {
  72.         /* no attempt to close McBSP since we will SYS_abort() anyway */
  73.         return (IOM_EBADIO);
  74.     }
  75.     // Memory Space Allocation
  76.     edmaRxPing = EDMA_allocTable(-1);
  77.     edmaRxPong = EDMA_allocTable(-1);
  78.     edmaTxPing = EDMA_allocTable(-1);
  79.     edmaTxPong = EDMA_allocTable(-1);
  80.     // EDMA Transfert Complete Code Allocation
  81.     rxTcc = EDMA_intAlloc(-1);
  82.     txTcc = EDMA_intAlloc(-1);
  83.     EDMA_getConfig(hEdmaRx, &edmaRxCfg);
  84.     EDMA_getConfig(hEdmaTx, &edmaTxCfg);
  85.         
  86.     // Rx Side EDMA specific configuration
  87.     edmaRxCfg.opt |= 
  88.         EDMA_FMK(OPT,PRI,EDMA_OPT_PRI_HIGH) |
  89.         EDMA_FMK(OPT,ESIZE,EDMA_OPT_ESIZE_16BIT) |
  90.         EDMA_FMK(OPT,2DS,EDMA_OPT_2DS_NO) |
  91.         EDMA_FMK(OPT,SUM,EDMA_OPT_SUM_NONE) |
  92.         EDMA_FMK(OPT,2DD,EDMA_OPT_2DD_NO) |
  93.         EDMA_FMK(OPT,DUM,EDMA_OPT_DUM_INC) |
  94.         EDMA_FMK(OPT,TCINT,EDMA_OPT_TCINT_YES) |
  95.         EDMA_FMK(OPT,LINK,EDMA_OPT_LINK_YES) |
  96.         EDMA_FMK(OPT,FS,EDMA_OPT_FS_NO);
  97.         
  98.     // Tx Side EDMA specific configuration
  99.     edmaTxCfg.opt |=
  100.         EDMA_FMK(OPT,PRI,EDMA_OPT_PRI_HIGH) |                   
  101.         EDMA_FMK(OPT,ESIZE,EDMA_OPT_ESIZE_16BIT) |
  102.         EDMA_FMK(OPT,2DS,EDMA_OPT_2DS_NO) |             
  103.         EDMA_FMK(OPT,SUM,EDMA_OPT_SUM_INC) |
  104.         EDMA_FMK(OPT,2DD,EDMA_OPT_2DD_NO) |                     
  105.         EDMA_FMK(OPT,DUM,EDMA_OPT_DUM_NONE) |
  106.         EDMA_FMK(OPT,TCINT,EDMA_OPT_TCINT_YES) |                
  107.         EDMA_FMK(OPT,LINK,EDMA_OPT_LINK_YES) |
  108.         EDMA_FMK(OPT,FS,EDMA_OPT_FS_NO);
  109.     MCBSP_getConfig(hMcbsp, &mcbspCfg);
  110.     // McBSP Config 
  111.     mcbspCfg.pcr |=
  112.         MCBSP_FMK(PCR,XIOEN,MCBSP_PCR_XIOEN_SP) |
  113.         MCBSP_FMK(PCR,RIOEN,MCBSP_PCR_RIOEN_SP) |
  114.         MCBSP_FMK(PCR,FSXM,MCBSP_PCR_FSXM_INTERNAL) |
  115.         MCBSP_FMK(PCR,FSRM,MCBSP_PCR_FSRM_EXTERNAL) |
  116.         MCBSP_FMK(PCR,CLKXM,MCBSP_PCR_CLKXM_OUTPUT) |
  117.         MCBSP_FMK(PCR,CLKRM,MCBSP_PCR_CLKRM_OUTPUT) |
  118.         MCBSP_FMK(PCR,CLKSSTAT,MCBSP_PCR_CLKSSTAT_0) |
  119.         MCBSP_FMK(PCR,DXSTAT,MCBSP_PCR_DXSTAT_0) |
  120.         MCBSP_FMK(PCR,FSXP,MCBSP_PCR_FSXP_ACTIVELOW) |
  121.         MCBSP_FMK(PCR,FSRP,MCBSP_PCR_FSRP_ACTIVELOW) |
  122.         MCBSP_FMK(PCR,CLKXP,MCBSP_PCR_CLKXP_RISING) |
  123.         MCBSP_FMK(PCR,CLKRP,MCBSP_PCR_CLKRP_FALLING);
  124.     /*
  125.      * Here we compute the bit rate of the McBSP.  Each UART bit is
  126.      * represented by 16 McBSP bits.
  127.      */
  128.     clkdv = (Uns)(params->mcbspClkIn / (params->baud * 16));
  129.     /* clkdv is max 8-bits long, so make sure we didn't overflow ... */
  130.     if (clkdv > 0xff) {
  131.         return (IOM_EBADARGS);
  132.     }
  133.     mcbspCfg.srgr |= 
  134.         MCBSP_FMK(SRGR,GSYNC,MCBSP_SRGR_GSYNC_FREE) |
  135.         MCBSP_FMK(SRGR,CLKSP,MCBSP_SRGR_CLKSP_RISING) |
  136.         MCBSP_FMK(SRGR,CLKSM,MCBSP_SRGR_CLKSM_INTERNAL) |
  137.         MCBSP_FMK(SRGR,FSGM,MCBSP_SRGR_FSGM_DXR2XSR) |
  138.         MCBSP_FMK(SRGR,CLKGDV,MCBSP_SRGR_CLKGDV_OF(clkdv));
  139.     mcbspCfg.xcr |=
  140.         MCBSP_FMK(XCR,XPHASE,MCBSP_XCR_XPHASE_DUAL) |
  141.         MCBSP_FMK(XCR,XFRLEN2,MCBSP_XCR_XFRLEN2_OF(
  142.                 UARTHW_MCBSP_TxHSTOPBITS - 1)) |
  143.         MCBSP_FMK(XCR,XWDLEN2,MCBSP_XCR_XWDLEN2_8BIT) |
  144.         MCBSP_FMK(XCR,XCOMPAND,MCBSP_XCR_XCOMPAND_MSB) |
  145.         MCBSP_FMK(XCR,XFIG,MCBSP_XCR_XFIG_YES) |
  146.         MCBSP_FMK(XCR,XDATDLY,MCBSP_XCR_XDATDLY_0BIT) |
  147.         MCBSP_FMK(XCR,XFRLEN1,MCBSP_XCR_XFRLEN1_OF(
  148.                 UARTHW_MCBSP_DATABITS + UARTHW_MCBSP_PARITYBITS)) |
  149.         MCBSP_FMK(XCR,XWDLEN1,MCBSP_XCR_XWDLEN1_16BIT) |
  150.         MCBSP_FMK(XCR,XWDREVRS,MCBSP_XCR_XWDREVRS_DISABLE);
  151.     mcbspCfg.rcr |=
  152.         MCBSP_FMK(RCR,RPHASE,MCBSP_RCR_RPHASE_DUAL) |
  153.         MCBSP_FMK(RCR,RFRLEN2,MCBSP_RCR_RFRLEN2_OF(
  154.                 UARTHW_MCBSP_RxHSTOPBITS - 1)) |
  155.         MCBSP_FMK(RCR,RWDLEN2,MCBSP_RCR_RWDLEN2_8BIT) |
  156.         MCBSP_FMK(RCR,RCOMPAND,MCBSP_RCR_RCOMPAND_MSB) |
  157.         MCBSP_FMK(RCR,RFIG,MCBSP_RCR_RFIG_YES) |
  158.         MCBSP_FMK(RCR,RDATDLY,MCBSP_RCR_RDATDLY_1BIT) |
  159.         MCBSP_FMK(RCR,RFRLEN1,MCBSP_RCR_RFRLEN1_OF(
  160.                 UARTHW_MCBSP_DATABITS + UARTHW_MCBSP_PARITYBITS)) |
  161.         MCBSP_FMK(RCR,RWDLEN1,MCBSP_RCR_RWDLEN1_16BIT) |
  162.         MCBSP_FMK(RCR,RWDREVRS,MCBSP_RCR_RWDREVRS_DISABLE);
  163.     mcbspCfg.spcr |=
  164.         MCBSP_FMK(SPCR,FREE,MCBSP_SPCR_FREE_NO) |
  165.         MCBSP_FMK(SPCR,SOFT,MCBSP_SPCR_SOFT_YES) |
  166.         MCBSP_FMK(SPCR,FRST,MCBSP_SPCR_FRST_YES) |
  167.         MCBSP_FMK(SPCR,GRST,MCBSP_SPCR_GRST_YES) |
  168.         MCBSP_FMK(SPCR,XINTM,MCBSP_SPCR_XINTM_XRDY) |
  169.         MCBSP_FMK(SPCR,XSYNCERR,MCBSP_SPCR_XSYNCERR_NO) |
  170.         MCBSP_FMK(SPCR,DLB,MCBSP_SPCR_DLB_OFF) |
  171.         MCBSP_FMK(SPCR,RJUST,MCBSP_SPCR_RJUST_RZF) |
  172.         MCBSP_FMK(SPCR,CLKSTP,MCBSP_SPCR_CLKSTP_DISABLE) |
  173.         MCBSP_FMK(SPCR,DXENA,MCBSP_SPCR_DXENA_OFF) | 
  174.         MCBSP_FMK(SPCR,RINTM,MCBSP_SPCR_RINTM_EOS);     
  175.     MCBSP_config(hMcbsp, &mcbspCfg);
  176.     // RX Side
  177.     edmaRxCfg.src = MCBSP_getRcvAddr(hMcbsp);
  178.     edmaRxCfg.idx = 0x00000000; // IDX reset / CSL bug
  179.     edmaRxCfg.cnt = UARTHW_MCBSP_RxPKTBITS;
  180.     edmaRxCfg.opt = edmaRxCfg.opt | EDMA_FMK(OPT, TCC, rxTcc);
  181.         
  182.     // - Ping Buffer
  183.     edmaRxCfg.dst = (Uint32)rxBuf;
  184.     edmaRxCfg.rld = (edmaRxCfg.rld & 0xFFFF0000) | (EDMA_RLD_RMK(0,edmaRxPong));
  185.     EDMA_config(hEdmaRx, &edmaRxCfg);
  186.     EDMA_config(edmaRxPing, &edmaRxCfg);
  187.     
  188.     // - Pong Buffer
  189.     edmaRxCfg.dst = (Uint32)(rxBuf + UARTHW_MCBSP_RxPKTBITS);
  190.     edmaRxCfg.rld = (edmaRxCfg.rld & 0xFFFF0000) | (EDMA_RLD_RMK(0,edmaRxPing));
  191.     EDMA_config(edmaRxPong, &edmaRxCfg);
  192.     // TX Side
  193.     edmaTxCfg.dst = MCBSP_getXmtAddr(hMcbsp);
  194.     edmaTxCfg.idx = 0x00000000; // IDX reset / CSL bug
  195.     edmaTxCfg.cnt = UARTHW_MCBSP_TxPKTBITS;
  196.     edmaTxCfg.opt = edmaTxCfg.opt | EDMA_FMK(OPT, TCC, txTcc);  
  197.     // - Ping Buffer
  198.     edmaTxCfg.src = (Uint32)txBuf ;
  199.     edmaTxCfg.rld = (edmaTxCfg.rld & 0xFFFF0000) | (EDMA_RLD_RMK(0,edmaTxPong));
  200.     EDMA_config(hEdmaTx, &edmaTxCfg);
  201.     EDMA_config(edmaTxPing, &edmaTxCfg);
  202.     
  203.     // - Pong Buffer
  204.     edmaTxCfg.src = (Uint32)(txBuf + UARTHW_MCBSP_TxPKTBITS);
  205.     edmaTxCfg.rld = (edmaTxCfg.rld & 0xFFFF0000) | (EDMA_RLD_RMK(0,edmaTxPing));
  206.     EDMA_config(edmaTxPong, &edmaTxCfg);        
  207.         
  208.     // Disable any previous machine state
  209.     // - McBSP disable
  210.     MCBSP_FSETSH(hMcbsp,SPCR,RRST,YES);
  211.     MCBSP_FSETSH(hMcbsp,SPCR,XRST,YES);
  212.     // - EDMA disable
  213.     EDMA_disableChannel(hEdmaTx);
  214.     EDMA_disableChannel(hEdmaRx);
  215.     EDMA_clearChannel(hEdmaTx);
  216.     EDMA_clearChannel(hEdmaRx);
  217.         
  218.     // Enable EDMA channel interrupt to CPU (CIER)
  219.     EDMA_intClear(rxTcc);
  220.     EDMA_intClear(txTcc);
  221.     EDMA_intEnable(rxTcc);
  222.     EDMA_intEnable(txTcc);
  223.                                 
  224.     // Start Sample Rate Generator: set /GRST = 1 
  225.     MCBSP_enableSrgr(hMcbsp);
  226.                 
  227.     // Enable Frame Sync Generator for McBSP: set /FRST = 1
  228.     MCBSP_enableFsync(hMcbsp);
  229.     /*
  230.      * The EDMA interrupt dispatcher will be called by the
  231.      * BIOS HWI interrupt dispatcher.
  232.      */
  233.     hwiAttrs.intrMask = params->intrMask;
  234.     hwiAttrs.ccMask   = IRQ_CCMASK_NONE;
  235.     hwiAttrs.arg      = NULL;
  236.     HWI_dispatchPlug(IRQ_EVT_EDMAINT, (Fxn)EDMA_intDispatcher, -1, &hwiAttrs);
  237.     EDMA_intHook(rxTcc, (EDMA_IntHandler)UARTHW_MCBSP_dmaRxIsr);
  238.     EDMA_intHook(txTcc, (EDMA_IntHandler)UARTHW_MCBSP_dmaTxIsr);
  239.     // Enable EDMA-CPU interrupt (+clear any previous)
  240.     IRQ_clear(IRQ_EVT_EDMAINT);
  241.     IRQ_enable(IRQ_EVT_EDMAINT);
  242.     enable();
  243.     return (IOM_COMPLETED);
  244. }
  245. /*
  246.  *  ======== enable ========
  247.  */
  248. static Void enable(Void)
  249. {
  250.     // Enable Rx Event EDMA channel
  251.     EDMA_enableChannel(hEdmaRx);
  252.     // Enable Tx Event EDMA channel
  253.     EDMA_enableChannel(hEdmaTx);
  254.     // Enable MCBSP
  255.     MCBSP_enableRcv(hMcbsp);
  256.     // Enable MCBSP
  257.     MCBSP_enableXmt(hMcbsp);
  258. }