uart16550.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id$
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * Copyright (C) 1992 - 1997, 2000 Silicon Graphics, Inc.
  8.  * Copyright (C) 2000 by Colin Ngam
  9.  */
  10. #ifndef _ASM_SN_SN1_UART16550_H
  11. #define _ASM_SN_SN1_UART16550_H
  12. /*
  13.  * Definitions for 16550  chip
  14.  */
  15. /* defined as offsets from the data register */
  16. #define REG_DAT     0   /* receive/transmit data */
  17. #define REG_ICR     1   /* interrupt control register */
  18. #define REG_ISR     2   /* interrupt status register */
  19. #define REG_FCR     2   /* fifo control register */
  20. #define REG_LCR     3   /* line control register */
  21. #define REG_MCR     4   /* modem control register */
  22. #define REG_LSR     5   /* line status register */
  23. #define REG_MSR     6   /* modem status register */
  24. #define REG_SCR     7   /* Scratch register      */
  25. #define REG_DLL     0   /* divisor latch (lsb) */
  26. #define REG_DLH     1   /* divisor latch (msb) */
  27. #define REG_EFR 2 /* 16650 enhanced feature register */
  28. /*
  29.  * 16450/16550 Registers Structure.
  30.  */
  31. /* Line Control Register */
  32. #define LCR_WLS0 0x01 /*word length select bit 0 */
  33. #define LCR_WLS1 0x02 /*word length select bit 2 */
  34. #define LCR_STB 0x04 /* number of stop bits */
  35. #define LCR_PEN 0x08 /* parity enable */
  36. #define LCR_EPS 0x10 /* even parity select */
  37. #define LCR_SETBREAK 0x40 /* break key */
  38. #define LCR_DLAB 0x80 /* divisor latch access bit */
  39. #define  LCR_RXLEN   0x03    /* # of data bits per received/xmitted char */
  40. #define  LCR_STOP1   0x00
  41. #define  LCR_STOP2   0x04
  42. #define  LCR_PAREN   0x08
  43. #define  LCR_PAREVN  0x10
  44. #define  LCR_PARMARK 0x20
  45. #define  LCR_SNDBRK  0x40
  46. #define  LCR_DLAB    0x80
  47. #define LCR_BITS5 0x00 /* 5 bits per char */
  48. #define LCR_BITS6 0x01 /* 6 bits per char */
  49. #define LCR_BITS7 0x02 /* 7 bits per char */
  50. #define LCR_BITS8 0x03 /* 8 bits per char */
  51. #define LCR_MASK_BITS_CHAR  0x03
  52. #define  LCR_MASK_STOP_BITS 0x04
  53. #define LCR_MASK_PARITY_BITS 0x18
  54. /* Line Status Register */
  55. #define LSR_RCA 0x01 /* data ready */
  56. #define LSR_OVRRUN 0x02 /* overrun error */
  57. #define LSR_PARERR 0x04 /* parity error */
  58. #define LSR_FRMERR 0x08 /* framing error */
  59. #define LSR_BRKDET  0x10 /* a break has arrived */
  60. #define LSR_XHRE 0x20 /* tx hold reg is now empty */
  61. #define LSR_XSRE 0x40 /* tx shift reg is now empty */
  62. #define LSR_RFBE 0x80 /* rx FIFO Buffer error */
  63. /* Interrupt Status Regisger */
  64. #define ISR_MSTATUS 0x00
  65. #define ISR_TxRDY 0x02
  66. #define ISR_RxRDY 0x04
  67. #define ISR_ERROR_INTR 0x08
  68. #define ISR_FFTMOUT 0x0c /* FIFO Timeout */
  69. #define ISR_RSTATUS 0x06 /* Receiver Line status */
  70. /* Interrupt Enable Register */
  71. #define ICR_RIEN 0x01 /* Received Data Ready */
  72. #define ICR_TIEN 0x02 /* Tx Hold Register Empty */
  73. #define ICR_SIEN 0x04 /* Receiver Line Status */
  74. #define ICR_MIEN 0x08 /* Modem Status */
  75. /* Modem Control Register */
  76. #define MCR_DTR 0x01 /* Data Terminal Ready */
  77. #define MCR_RTS 0x02 /* Request To Send */
  78. #define MCR_OUT1 0x04 /* Aux output - not used */
  79. #define MCR_OUT2 0x08 /* turns intr to 386 on/off */
  80. #define MCR_LOOP 0x10 /* loopback for diagnostics */
  81. #define MCR_AFE  0x20 /* Auto flow control enable */
  82. /* Modem Status Register */
  83. #define MSR_DCTS 0x01 /* Delta Clear To Send */
  84. #define MSR_DDSR 0x02 /* Delta Data Set Ready */
  85. #define MSR_DRI 0x04 /* Trail Edge Ring Indicator */
  86. #define MSR_DDCD 0x08 /* Delta Data Carrier Detect */
  87. #define MSR_CTS 0x10 /* Clear To Send */
  88. #define MSR_DSR 0x20 /* Data Set Ready */
  89. #define MSR_RI 0x40 /* Ring Indicator */
  90. #define MSR_DCD 0x80 /* Data Carrier Detect */
  91. #define  DELTAS(x)  ((x)&(MSR_DCTS|MSR_DDSR|MSR_DRI|MSR_DDCD))
  92. #define  STATES(x)  ((x)(MSR_CTS|MSR_DSR|MSR_RI|MSR_DCD))
  93. #define FCR_FIFOEN 0x01 /* enable receive/transmit fifo */
  94. #define FCR_RxFIFO 0x02 /* enable receive fifo */
  95. #define FCR_TxFIFO 0x04 /* enable transmit fifo */
  96. #define  FCR_MODE1 0x08 /* change to mode 1 */
  97. #define RxLVL0 0x00 /* Rx fifo level at 1 */
  98. #define RxLVL1 0x40 /* Rx fifo level at 4 */
  99. #define RxLVL2 0x80 /* Rx fifo level at 8 */
  100. #define RxLVL3 0xc0 /* Rx fifo level at 14 */
  101. #define  FIFOEN (FCR_FIFOEN | FCR_RxFIFO | FCR_TxFIFO | RxLVL3 | FCR_MODE1) 
  102. #define FCT_TxMASK 0x30 /* mask for Tx trigger */
  103. #define FCT_RxMASK 0xc0 /* mask for Rx trigger */
  104. /* enhanced festures register */
  105. #define EFR_SFLOW 0x0f /* various S/w Flow Controls */
  106. #define  EFR_EIC 0x10 /* Enhanced Interrupt Control bit */
  107. #define  EFR_SCD 0x20 /* Special Character Detect */
  108. #define  EFR_RTS 0x40 /* RTS flow control */
  109. #define  EFR_CTS 0x80 /* CTS flow control */
  110. /* Rx Tx software flow controls in 16650 enhanced mode */
  111. #define SFLOW_Tx0 0x00 /* no Xmit flow control */
  112. #define SFLOW_Tx1 0x08 /* Transmit Xon1, Xoff1 */
  113. #define SFLOW_Tx2 0x04 /* Transmit Xon2, Xoff2 */
  114. #define SFLOW_Tx3 0x0c /* Transmit Xon1,Xon2, Xoff1,Xoff2 */
  115. #define SFLOW_Rx0 0x00 /* no Rcv flow control */
  116. #define SFLOW_Rx1 0x02 /* Receiver compares Xon1, Xoff1 */
  117. #define SFLOW_Rx2 0x01 /* Receiver compares Xon2, Xoff2 */
  118. #define ASSERT_DTR(x) (x |= MCR_DTR)
  119. #define ASSERT_RTS(x) (x |= MCR_RTS)
  120. #define DU_RTS_ASSERTED(x)  (((x) & MCR_RTS) != 0)
  121. #define DU_RTS_ASSERT(x)    ((x) |= MCR_RTS)
  122. #define DU_RTS_DEASSERT(x)  ((x) &= ~MCR_RTS)
  123. /*
  124.  * ioctl(fd, I_STR, arg)
  125.  * use the SIOC_RS422 and SIOC_EXTCLK combination to support MIDI
  126.  */
  127. #define SIOC        ('z' << 8)  /* z for z85130 */
  128. #define SIOC_EXTCLK (SIOC | 1)  /* select/de-select external clock */
  129. #define SIOC_RS422  (SIOC | 2)  /* select/de-select RS422 protocol */
  130. #define SIOC_ITIMER (SIOC | 3)  /* upstream timer adjustment */
  131. #define SIOC_LOOPBACK   (SIOC | 4)  /* diagnostic loopback test mode */
  132. /* channel control register */
  133. #define DMA_INT_MASK 0xe0 /* ring intr mask */
  134. #define DMA_INT_TH25 0x20 /* 25% threshold */
  135. #define DMA_INT_TH50 0x40 /* 50% threshold */
  136. #define DMA_INT_TH75 0x60 /* 75% threshold */
  137. #define DMA_INT_EMPTY 0x80 /* ring buffer empty */
  138. #define DMA_INT_NEMPTY 0xa0 /* ring buffer not empty */
  139. #define DMA_INT_FULL 0xc0 /* ring buffer full */
  140. #define DMA_INT_NFULL 0xe0 /* ring buffer not full */
  141. #define DMA_CHANNEL_RESET 0x400 /* reset dma channel */
  142. #define DMA_ENABLE 0x200 /* enable DMA */
  143. /* peripheral controller intr status bits applicable to serial ports */
  144. #define ISA_SERIAL0_MASK  0x03f00000 /* mask for port #1 intrs */
  145. #define ISA_SERIAL0_DIR 0x00100000 /* device intr request */
  146. #define ISA_SERIAL0_Tx_THIR 0x00200000 /* Transmit DMA threshold */
  147. #define ISA_SERIAL0_Tx_PREQ 0x00400000 /* Transmit DMA pair req */
  148. #define ISA_SERIAL0_Tx_MEMERR 0x00800000 /* Transmit DMA memory err */
  149. #define ISA_SERIAL0_Rx_THIR 0x01000000 /* Receive DMA threshold  */
  150. #define ISA_SERIAL0_Rx_OVERRUN 0x02000000 /* Receive DMA over-run  */
  151. #define ISA_SERIAL1_MASK  0xfc000000 /* mask for port #1 intrs */
  152. #define ISA_SERIAL1_DIR 0x04000000 /* device intr request */
  153. #define ISA_SERIAL1_Tx_THIR 0x08000000 /* Transmit DMA threshold */
  154. #define ISA_SERIAL1_Tx_PREQ 0x10000000 /* Transmit DMA pair req */
  155. #define ISA_SERIAL1_Tx_MEMERR 0x20000000 /* Transmit DMA memory err */
  156. #define ISA_SERIAL1_Rx_THIR 0x40000000 /* Receive DMA threshold  */
  157. #define ISA_SERIAL1_Rx_OVERRUN 0x80000000 /* Receive DMA over-run  */
  158. #define MAX_RING_BLOCKS 128 /* 4096/32 */
  159. #define MAX_RING_SIZE 4096
  160. /* DMA Input Control Byte */
  161. #define DMA_IC_OVRRUN 0x01 /* overrun error */
  162. #define DMA_IC_PARERR 0x02 /* parity error */
  163. #define DMA_IC_FRMERR 0x04 /* framing error */
  164. #define DMA_IC_BRKDET  0x08 /* a break has arrived */
  165. #define DMA_IC_VALID 0x80 /* pair is valid */
  166. /* DMA Output Control Byte */
  167. #define DMA_OC_TxINTR 0x20 /* set Tx intr after processing byte */
  168. #define DMA_OC_INVALID 0x00 /* invalid pair */
  169. #define DMA_OC_WTHR 0x40 /* Write byte to THR */
  170. #define DMA_OC_WMCR 0x80 /* Write byte to MCR */
  171. #define DMA_OC_DELAY 0xc0 /* time delay before next xmit */
  172. /* ring id's */
  173. #define RID_SERIAL0_TX 0x4 /* serial port 0, transmit ring buffer */
  174. #define RID_SERIAL0_RX 0x5 /* serial port 0, receive ring buffer */
  175. #define RID_SERIAL1_TX 0x6 /* serial port 1, transmit ring buffer */
  176. #define RID_SERIAL1_RX 0x7 /* serial port 1, receive ring buffer */
  177. #define CLOCK_XIN 22
  178. #define PRESCALER_DIVISOR 3
  179. #define CLOCK_ACE 7333333
  180. /*
  181.  * increment the ring offset. One way to do this would be to add b'100000.
  182.  * this would let the offset value roll over automatically when it reaches
  183.  * its maximum value (127). However when we use the offset, we must use
  184.  * the appropriate bits only by masking with 0xfe0.
  185.  * The other option is to shift the offset right by 5 bits and look at its
  186.  * value. Then increment if required and shift back
  187.  * note: 127 * 2^5 = 4064
  188.  */
  189. #define INC_RING_POINTER(x) 
  190. ( ((x & 0xffe0) < 4064) ? (x += 32) : 0 )
  191. #endif /* _ASM_SN_SN1_UART16550_H */