uarthw_dsk5402.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.  *  ======== uarthw_dsk5402.c ========
  11.  */
  12.  
  13. #define CHIP_5402 1
  14. #include <std.h>
  15. #include <hwi.h>
  16. #include <iom.h>
  17. #include <csl.h>
  18. #include <csl_irq.h>
  19. #include <uarthw.h>
  20. #include <uarthw_dsk5402.h>
  21. /* uart register definitions */
  22. #define RBRREG port4000
  23. #define THRREG port4000
  24. #define DLLREG port4000
  25. #define DLMREG port4001
  26. #define IERREG port4001
  27. #define IIRREG port4002
  28. #define FCRREG port4002
  29. #define LCRREG port4003
  30. #define MCRREG port4004
  31. #define LSRREG port4005
  32. #define MSRREG port4006
  33. #define SCRREG port4007
  34. #define getLineStatus()        (LSRREG & 0xff)
  35. #define getModemControlReg()   (MCRREG & 0xff)
  36. #define setModemControlReg(c)   MCRREG =(c)
  37. #define getLineControlReg()    (LCRREG & 0xff)
  38. #define setLineControlReg(c)    LCRREG =(c)
  39. #define disableRx()            (IERREG = IERREG & 0xFe)
  40. #define disableTx()            (IERREG = IERREG & 0xFd)
  41. #define enableRx()             (IERREG = IERREG | 0x01)
  42. #define enableTx()             (IERREG = IERREG | 0x02)
  43. #define getInt()               (IIRREG & 0xf)
  44. #define NOINTPENDING       0x01
  45. #define IDENTIFYINT(id)    ((id>>1)&0x03)
  46. #define MCRDTRMASK        0xFE
  47. #define MCRRTSMASK        0xFD
  48. #define LCRBRKMASK        0xBF
  49. #define AFERTSCTSMASK     0xDD
  50. #define AFERTSCTSFLW      0x22
  51. #define AFECTSFLW         0x20
  52. #define AFEDISFLW         0x00
  53. #define LCRBREAKPOS       6
  54. #define MCRRTSPOS         1
  55. #define UARTINTERRUPT  IRQ_EVT_INT1
  56. #define UARTHW_DSK5402_INTR_MASK_DEFAULT  1
  57. /* uart register addresses */
  58. extern volatile ioport unsigned int port4000;
  59. extern volatile ioport unsigned int port4001;
  60. extern volatile ioport unsigned int port4002;
  61. extern volatile ioport unsigned int port4003;
  62. extern volatile ioport unsigned int port4004;
  63. extern volatile ioport unsigned int port4005;
  64. extern volatile ioport unsigned int port4006;
  65. extern volatile ioport unsigned int port4007;
  66. static void setupFlowParams(Uns flowParam);
  67. static void uartIsr(Ptr cbArg);
  68. static Int uartRxFull();
  69. static UARTHW_DSK5402_Params defaultParams = {          
  70.     UARTHW_DSK5402_FLOW_AFE_RTSCTS,                             
  71.     UARTHW_DSK5402_DISABLE_PARITY,                      
  72.     UARTHW_DSK5402_WORD8,                               
  73.     UARTHW_DSK5402_STOP1,                               
  74.     UARTHW_DSK5402_BAUD_115200,                         
  75.     UARTHW_DSK5402_INTR_MASK_DEFAULT                    
  76. };
  77. static UARTHW_Tcallback *callbacks;
  78. /*
  79.  *  ======== UARTHW_open ========
  80.  *
  81.  *  This function is used to attach to the UART 16550.
  82.  *  Typically this function plugs the UART interrupt vector with
  83.  *  the internal driver supplied isr routine.
  84.  *  Initializes the UART, UART flow parameters and UART communication parameters
  85.  *
  86.  */
  87. UARTHW_Handle UARTHW_open(Int uartId, Ptr params, Ptr cbArg, UARTHW_Tcallback *cbFxns)
  88. {
  89.     HWI_Attrs   hwattr;
  90.     volatile Char c;
  91.     UARTHW_DSK5402_Params *uartParams = (UARTHW_DSK5402_Params *)params;
  92.     if (uartId > 0) {
  93.         return (NULL);          /* only supports one UART */
  94.     }
  95.     /* 
  96.      * Initialize the isrhandler to the one given by
  97.      * generic uart.
  98.      */
  99.     callbacks = cbFxns;
  100.        
  101.     hwattr.intrMask = uartParams->intrMask;
  102.     hwattr.arg = (Arg)cbArg;
  103.  
  104.     HWI_dispatchPlug(UARTINTERRUPT, (Fxn)uartIsr, &hwattr);
  105.     /* 
  106.      * Use the default attributes if one is not given
  107.      */
  108.     if (uartParams == NULL) {
  109.         uartParams = &defaultParams;
  110.     }
  111.     
  112.     /* 
  113.      * Setup the baud and other communication parameters
  114.      */ 
  115.     LCRREG = 0x80;      
  116.     DLLREG = uartParams->baud;
  117.     DLMREG = uartParams->baud >> 8;
  118.     /* deselect divisor latch register */
  119.     LCRREG = uartParams->wordSize | (uartParams->stopBits << 2) |
  120.         (uartParams->parity << 3);
  121.     /* 
  122.      * Initialize the rest of the UART
  123.      */
  124.     
  125.     FCRREG = 0x87;      /* FIFO control register */
  126.     IERREG = 0xff;      /* enable all interrupts */
  127.     LSRREG = 0x00;      /* to clear the previous line status */
  128.     MSRREG = 0x00;      /* modem status register */
  129.     MCRREG = 0x00;
  130.     
  131.     /* read the UART receive buffer to clear it */
  132.     while (uartRxFull()) {
  133.         c = (RBRREG & 0xFF);
  134.     }
  135.       
  136.     setupFlowParams((uartParams->flowControl) & UARTHW_DSK5402_HW_FLOW_MASK);
  137.     
  138.     enableRx();
  139.     enableTx();
  140.   
  141.     IRQ_enable(UARTINTERRUPT);
  142.     
  143.     return ((UARTHW_Handle)1);          /* non-zero means success */
  144. }
  145. /*
  146.  *  ======== UARTHW_getModemStatus ========
  147.  *
  148.  *  This function is used to get the modem status for the UART 16550 
  149.  */
  150.  
  151. Int UARTHW_getModemStatus(UARTHW_Handle hUart, char *pmodemStatus)
  152. {
  153.     *pmodemStatus = (char)(MSRREG & 0xff);
  154.    
  155.     return (IOM_COMPLETED);
  156. }
  157. /*
  158.  *  ======== UARTHW_resetDevice ========
  159.  *
  160.  *  This function is used to reset the UART 16550.
  161.  *  Ideally this function should clear the transmit and 
  162.  *  receive fifos if the fifos are being used.
  163.  */
  164. void UARTHW_resetDevice(UARTHW_Handle hUart)
  165. {
  166.     FCRREG |= 0x06;
  167. }
  168. /*
  169.  *  ======== UARTHW_setBreak ========
  170.  *
  171.  *  This function is used to set the break on/off for the UART 16550 
  172.  */
  173. Int UARTHW_setBreak(UARTHW_Handle hUart, Int bBreak)
  174. {
  175.     char lcrVal;
  176.     lcrVal = getLineControlReg();
  177.     lcrVal = (lcrVal& LCRBRKMASK)|(bBreak<<LCRBREAKPOS);
  178.     setLineControlReg(lcrVal);
  179.    
  180.     return (IOM_COMPLETED);
  181. }
  182. /*
  183.  *  ======== UARTHW_setDTR ========
  184.  *
  185.  *  This function is used to set the DTR signal for the UART 16550 
  186.  */
  187. Int UARTHW_setDTR(UARTHW_Handle hUart, int dtrval)
  188. {
  189.     char mcrVal;
  190.   
  191.     mcrVal = getModemControlReg();
  192.     mcrVal = (mcrVal& MCRDTRMASK)|dtrval;
  193.     setModemControlReg(mcrVal); 
  194.     return (IOM_COMPLETED);
  195. }
  196. /*
  197.  *  ======== UARTHW_setRTS ========
  198.  *
  199.  *  This function is used to set the RTS signal for the UART 16550 
  200.  */
  201. Int UARTHW_setRTS(UARTHW_Handle hUart, int rtsval)
  202. {
  203.     char mcrVal;
  204.     mcrVal = getModemControlReg();
  205.     mcrVal = (mcrVal& MCRRTSMASK)|(rtsval<<MCRRTSPOS);
  206.     setModemControlReg(mcrVal);
  207.     
  208.     return (IOM_COMPLETED);
  209. }
  210. /*
  211.  *  ======== UARTHW_txEmpty ========
  212.  *
  213.  *  This function is used to get the transmit buffer empty condition 
  214.  */
  215. Int UARTHW_txEmpty(UARTHW_Handle hUart)
  216. {
  217.     return (LSRREG & 0x20);
  218. }
  219. /*
  220.  *  ======== UARTHW_writeChar ========
  221.  *
  222.  *  This function is used to write a character to the transmit register 
  223.  */
  224. void UARTHW_writeChar(UARTHW_Handle hUart, char c)
  225. {
  226.     THRREG = c;
  227. }
  228. /*
  229.  *  ======== UARTHW_enableRx ========
  230.  *
  231.  *  This function is used to enable the Rx interrupt Handler 
  232.  */
  233. void UARTHW_enableRx(UARTHW_Handle hUart)
  234. {
  235.     enableRx();
  236. }
  237. /*
  238.  *  ======== UARTHW_disableRx ========
  239.  *
  240.  *  This function is used to disable the Rx interrupt Handler 
  241.  */
  242. void UARTHW_disableRx(UARTHW_Handle hUart)
  243. {
  244.     disableRx();
  245. }
  246. /*
  247.  *  ======== setupFlowParams ========
  248.  *
  249.  *  This function is used to setup the UART 16550 flow paramaters
  250.  */
  251. static void setupFlowParams(Uns flowParam)
  252. {
  253.     char mcrVal;
  254.  
  255.     mcrVal = getModemControlReg();
  256.  
  257.     if (flowParam & UARTHW_DSK5402_FLOW_AFE_RTSCTS) {
  258.         mcrVal=(mcrVal & AFERTSCTSMASK)|AFERTSCTSFLW;
  259.     }
  260.     else if (flowParam & UARTHW_DSK5402_FLOW_AFE_CTS) {
  261.         mcrVal=(mcrVal & AFERTSCTSMASK)|AFECTSFLW;
  262.     } 
  263.     else {
  264.         mcrVal=(mcrVal & AFERTSCTSMASK)|AFEDISFLW;  
  265.     } 
  266.     setModemControlReg(mcrVal);                
  267. }
  268. /* 
  269.  *  ======== uartIsr ========
  270.  *
  271.  *  This is the interrupt service handler used by the DSK 5402
  272.  *  UART driver.
  273.  */
  274. static void uartIsr(Ptr cbArg)
  275. {
  276.     Int         id;
  277.     Int         argval;
  278.     
  279.     /*
  280.      * While loop here since 16550 holds interrupt line high until
  281.      * all interrupt conditions are handled (2 or more may be pending
  282.      * at same time).  'C54x uses edge-triggered interrupts and would
  283.      * miss interrupts otherwise.
  284.      */
  285.     while ((id = getInt()) != NOINTPENDING) {
  286.         id = IDENTIFYINT(id);
  287.     
  288.         if (id == UARTHW_RXFULL_STATUSHANDLER) {
  289.             if (uartRxFull()) { 
  290.                 argval=(RBRREG & 0xff); 
  291.                 (*callbacks[id])(cbArg, argval); 
  292.             }
  293.         } 
  294.         else if (id == UARTHW_TXEMPTY_STATUSHANDLER) {
  295.             (*callbacks[id])(cbArg, 0);
  296.         } 
  297.         else if (id == UARTHW_LINE_STATUSHANDLER) {
  298.             argval = (LSRREG & 0xff);
  299.         
  300.             while ((argval & 0x0E) && (argval & 0x01)) {
  301.                 (RBRREG & 0xff);
  302.                 argval = (LSRREG & 0xff);
  303.             }
  304.             (*callbacks[id])(cbArg, argval); 
  305.         }
  306.         else if (id == UARTHW_MODEM_STATUSHANDLER) {
  307.             argval = (MSRREG & 0xff);
  308.             (*callbacks[id])(cbArg, argval); 
  309.         }
  310.     }
  311. }
  312. /*
  313.  *  ======== uartRxFull ========
  314.  *
  315.  *  This function is used to get the Receive Buffer Full condition 
  316.  */
  317. static Int uartRxFull()
  318. {
  319.     return (LSRREG & 0x01);
  320. }