uart_hw.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. #ifndef _UART_HW_H_
  2. #define _UART_HW_H_
  3. #include <stdint.h>
  4. /** @name Register Map
  5. *
  6. * Registers of the UART.
  7. * @{
  8. */
  9. typedef struct
  10. {
  11. volatile uint32_t CR; /**< Control Register */
  12. volatile uint32_t MR; /**< Mode Register */
  13. volatile uint32_t IER; /**< Interrupt Enable */
  14. volatile uint32_t IDR; /**< Interrupt Disable */
  15. volatile uint32_t IMR; /**< Interrupt Mask */
  16. volatile uint32_t ISR; /**< Interrupt Status */
  17. volatile uint32_t BAUDGEN; /**< Baud Rate Generator */
  18. volatile uint32_t RXTOUT; /**< RX Timeout */
  19. volatile uint32_t RXWM; /**< RX FIFO Trigger Level */
  20. volatile uint32_t MODEMCR; /**< Modem Control */
  21. volatile uint32_t MODEMSR; /**< Modem Status */
  22. volatile uint32_t SR; /**< Channel Status */
  23. volatile uint32_t FIFO; /**< FIFO */
  24. volatile uint32_t BAUDDIV; /**< Baud Rate Divider */
  25. volatile uint32_t FLOWDEL; /**< Flow Delay */
  26. volatile uint32_t RESERVED1;
  27. volatile uint32_t RESERVED2;
  28. volatile uint32_t TXWM; /* TX FIFO Trigger Level */
  29. } UART_Registers;
  30. /* @} */
  31. /** @name Control Register
  32. *
  33. * The Control register (CR) controls the major functions of the device.
  34. *
  35. * Control Register Bit Definition
  36. */
  37. #define UART_CR_STOPBRK 0x00000100 /**< Stop transmission of break */
  38. #define UART_CR_STARTBRK 0x00000080 /**< Set break */
  39. #define UART_CR_TORST 0x00000040 /**< RX timeout counter restart */
  40. #define UART_CR_TX_DIS 0x00000020 /**< TX disabled. */
  41. #define UART_CR_TX_EN 0x00000010 /**< TX enabled */
  42. #define UART_CR_RX_DIS 0x00000008 /**< RX disabled. */
  43. #define UART_CR_RX_EN 0x00000004 /**< RX enabled */
  44. #define UART_CR_EN_DIS_MASK 0x0000003C /**< Enable/disable Mask */
  45. #define UART_CR_TXRST 0x00000002 /**< TX logic reset */
  46. #define UART_CR_RXRST 0x00000001 /**< RX logic reset */
  47. /* @}*/
  48. /** @name Mode Register
  49. *
  50. * The mode register (MR) defines the mode of transfer as well as the data
  51. * format. If this register is modified during transmission or reception,
  52. * data validity cannot be guaranteed.
  53. *
  54. * Mode Register Bit Definition
  55. * @{
  56. */
  57. #define UART_MR_CCLK 0x00000400 /**< Input clock selection */
  58. #define UART_MR_CHMODE_R_LOOP 0x00000300 /**< Remote loopback mode */
  59. #define UART_MR_CHMODE_L_LOOP 0x00000200 /**< Local loopback mode */
  60. #define UART_MR_CHMODE_ECHO 0x00000100 /**< Auto echo mode */
  61. #define UART_MR_CHMODE_NORM 0x00000000 /**< Normal mode */
  62. #define UART_MR_CHMODE_SHIFT 8 /**< Mode shift */
  63. #define UART_MR_CHMODE_MASK 0x00000300 /**< Mode mask */
  64. #define UART_MR_STOPMODE_2_BIT 0x00000080 /**< 2 stop bits */
  65. #define UART_MR_STOPMODE_1_5_BIT 0x00000040 /**< 1.5 stop bits */
  66. #define UART_MR_STOPMODE_1_BIT 0x00000000 /**< 1 stop bit */
  67. #define UART_MR_STOPMODE_SHIFT 6 /**< Stop bits shift */
  68. #define UART_MR_STOPMODE_MASK 0x000000A0 /**< Stop bits mask */
  69. #define UART_MR_PARITY_NONE 0x00000020 /**< No parity mode */
  70. #define UART_MR_PARITY_MARK 0x00000018 /**< Mark parity mode */
  71. #define UART_MR_PARITY_SPACE 0x00000010 /**< Space parity mode */
  72. #define UART_MR_PARITY_ODD 0x00000008 /**< Odd parity mode */
  73. #define UART_MR_PARITY_EVEN 0x00000000 /**< Even parity mode */
  74. #define UART_MR_PARITY_SHIFT 3 /**< Parity setting shift */
  75. #define UART_MR_PARITY_MASK 0x00000038 /**< Parity mask */
  76. #define UART_MR_CHARLEN_6_BIT 0x00000006 /**< 6 bits data */
  77. #define UART_MR_CHARLEN_7_BIT 0x00000004 /**< 7 bits data */
  78. #define UART_MR_CHARLEN_8_BIT 0x00000000 /**< 8 bits data */
  79. #define UART_MR_CHARLEN_SHIFT 1 /**< Data Length shift */
  80. #define UART_MR_CHARLEN_MASK 0x00000006 /**< Data length mask */
  81. #define UART_MR_CLKSEL 0x00000001 /**< Input clock selection */
  82. /* @} */
  83. /** @name Interrupt Registers
  84. *
  85. * Interrupt control logic uses the interrupt enable register (IER) and the
  86. * interrupt disable register (IDR) to set the value of the bits in the
  87. * interrupt mask register (IMR). The IMR determines whether to pass an
  88. * interrupt to the interrupt status register (ISR).
  89. * Writing a 1 to IER Enbables an interrupt, writing a 1 to IDR disables an
  90. * interrupt. IMR and ISR are read only, and IER and IDR are write only.
  91. * Reading either IER or IDR returns 0x00.
  92. *
  93. * All four registers have the same bit definitions.
  94. *
  95. * @{
  96. */
  97. #define UART_IXR_DMS 0x00000200 /**< Modem status change interrupt */
  98. #define UART_IXR_TOUT 0x00000100 /**< Timeout error interrupt */
  99. #define UART_IXR_PARITY 0x00000080 /**< Parity error interrupt */
  100. #define UART_IXR_FRAMING 0x00000040 /**< Framing error interrupt */
  101. #define UART_IXR_OVER 0x00000020 /**< Overrun error interrupt */
  102. #define UART_IXR_TXFULL 0x00000010 /**< TX FIFO full interrupt. */
  103. #define UART_IXR_TXEMPTY 0x00000008 /**< TX FIFO empty interrupt. */
  104. #define UART_IXR_RXFULL 0x00000004 /**< RX FIFO full interrupt. */
  105. #define UART_IXR_RXEMPTY 0x00000002 /**< RX FIFO empty interrupt. */
  106. #define UART_IXR_RXOVR 0x00000001 /**< RX FIFO trigger interrupt. */
  107. #define UART_IXR_MASK 0x000003FF /**< Valid bit mask */
  108. /* @} */
  109. /** @name Baud Rate Generator Register
  110. *
  111. * The baud rate generator control register (BRGR) is a 16 bit register that
  112. * controls the receiver bit sample clock and baud rate.
  113. * Valid values are 1 - 65535.
  114. *
  115. * Bit Sample Rate = CCLK / BRGR, where the CCLK is selected by the MR_CCLK bit
  116. * in the MR register.
  117. * @{
  118. */
  119. #define UART_BAUDGEN_DISABLE 0x00000000 /**< Disable clock */
  120. #define UART_BAUDGEN_MASK 0x0000FFFF /**< Valid bits mask */
  121. /* @} */
  122. /** @name Baud Divisor Rate register
  123. *
  124. * The baud rate divider register (BDIV) controls how much the bit sample
  125. * rate is divided by. It sets the baud rate.
  126. * Valid values are 0x04 to 0xFF. Writing a value less than 4 will be ignored.
  127. *
  128. * Baud rate = CCLK / ((BAUDDIV + 1) x BRGR), where the CCLK is selected by
  129. * the MR_CCLK bit in the MR register.
  130. * @{
  131. */
  132. #define UART_BAUDDIV_MASK 0x000000FF /**< 8 bit baud divider mask */
  133. /* @} */
  134. /*
  135. Page 496
  136. Simplifyed Table 19-1 UART Parameter Value Examples
  137. Parameter Value Examples
  138. Clock Baud BRGR-CD BDIV-CD Actual Baud Rate
  139. UART Ref clock 600 10417 7
  140. UART Ref clock 9,600 651 7
  141. UART Ref clock 28,800 347 4
  142. UART Ref clock 115,200 62 6
  143. UART Ref clock 230,400 31 6
  144. */
  145. /*Baudrates assuming input clock speed is 3125000L */
  146. /*Baud_rate_gen_reg0*/
  147. #define UART_BAUDGEN_115200 62 /*Baud Rate Clock Divisor*/
  148. /*Register Baud_rate_divider_reg0 Details*/
  149. #define UART_BAUDDIV_115200 6 /*Baud Rate Clock Divisor*/
  150. /** @name Receiver Timeout Register
  151. *
  152. * Use the receiver timeout register (RTR) to detect an idle condition on
  153. * the receiver data line.
  154. *
  155. * @{
  156. */
  157. #define UART_RXTOUT_DISABLE 0x00000000 /**< Disable time out */
  158. #define UART_RXTOUT_MASK 0x000000FF /**< Valid bits mask */
  159. /* @} */
  160. /** @name Receiver FIFO Trigger Level Register
  161. *
  162. * Use the Receiver FIFO Trigger Level Register (RTRIG) to set the value at
  163. * which the RX FIFO triggers an interrupt event.
  164. * @{
  165. */
  166. #define UART_RXWM_DISABLE 0x00000000 /**< Disable RX trigger interrupt */
  167. #define UART_RXWM_MASK 0x0000003F /**< Valid bits mask */
  168. /* @} */
  169. /** @name Modem Control Register
  170. *
  171. * This register (MODEMCR) controls the interface with the modem or data set,
  172. * or a peripheral device emulating a modem.
  173. *
  174. * @{
  175. */
  176. #define UART_MODEMCR_FCM 0x00000010 /**< Flow control mode */
  177. #define UART_MODEMCR_RTS 0x00000002 /**< Request to send */
  178. #define UART_MODEMCR_DTR 0x00000001 /**< Data terminal ready */
  179. /* @} */
  180. /** @name Modem Status Register
  181. *
  182. * This register (MODEMSR) indicates the current state of the control lines
  183. * from a modem, or another peripheral device, to the CPU. In addition, four
  184. * bits of the modem status register provide change information. These bits
  185. * are set to a logic 1 whenever a control input from the modem changes state.
  186. *
  187. * Note: Whenever the DCTS, DDSR, TERI, or DDCD bit is set to logic 1, a modem
  188. * status interrupt is generated and this is reflected in the modem status
  189. * register.
  190. *
  191. * @{
  192. */
  193. #define UART_MODEMSR_FCMS 0x00000100 /**< Flow control mode (FCMS) */
  194. #define UART_MODEMSR_DCD 0x00000080 /**< Complement of DCD input */
  195. #define UART_MODEMSR_RI 0x00000040 /**< Complement of RI input */
  196. #define UART_MODEMSR_DSR 0x00000020 /**< Complement of DSR input */
  197. #define UART_MODEMSR_CTS 0x00000010 /**< Complement of CTS input */
  198. #define UART_MEDEMSR_DCDX 0x00000008 /**< Delta DCD indicator */
  199. #define UART_MEDEMSR_RIX 0x00000004 /**< Change of RI */
  200. #define UART_MEDEMSR_DSRX 0x00000002 /**< Change of DSR */
  201. #define UART_MEDEMSR_CTSX 0x00000001 /**< Change of CTS */
  202. /* @} */
  203. /** @name Channel Status Register
  204. *
  205. * The channel status register (CSR) is provided to enable the control logic
  206. * to monitor the status of bits in the channel interrupt status register,
  207. * even if these are masked out by the interrupt mask register.
  208. *
  209. * @{
  210. */
  211. #define UART_SR_FLOWDEL 0x00001000 /**< RX FIFO fill over flow delay */
  212. #define UART_SR_TACTIVE 0x00000800 /**< TX active */
  213. #define UART_SR_RACTIVE 0x00000400 /**< RX active */
  214. #define UART_SR_DMS 0x00000200 /**< Delta modem status change */
  215. #define UART_SR_TOUT 0x00000100 /**< RX timeout */
  216. #define UART_SR_PARITY 0x00000080 /**< RX parity error */
  217. #define UART_SR_FRAME 0x00000040 /**< RX frame error */
  218. #define UART_SR_OVER 0x00000020 /**< RX overflow error */
  219. #define UART_SR_TXFULL 0x00000010 /**< TX FIFO full */
  220. #define UART_SR_TXEMPTY 0x00000008 /**< TX FIFO empty */
  221. #define UART_SR_RXFULL 0x00000004 /**< RX FIFO full */
  222. #define UART_SR_RXEMPTY 0x00000002 /**< RX FIFO empty */
  223. #define UART_SR_RXOVR 0x00000001 /**< RX FIFO fill over trigger */
  224. /* @} */
  225. /** @name Flow Delay Register
  226. *
  227. * Operation of the flow delay register (FLOWDEL) is very similar to the
  228. * receive FIFO trigger register. An internal trigger signal activates when the
  229. * FIFO is filled to the level set by this register. This trigger will not
  230. * cause an interrupt, although it can be read through the channel status
  231. * register. In hardware flow control mode, RTS is deactivated when the trigger
  232. * becomes active. RTS only resets when the FIFO level is four less than the
  233. * level of the flow delay trigger and the flow delay trigger is not activated.
  234. * A value less than 4 disables the flow delay.
  235. * @{
  236. */
  237. #define UART_FLOWDEL_MASK UART_RXWM_MASK /**< Valid bit mask */
  238. /* @} */
  239. /** @name Base Address of UART0
  240. *
  241. * The base address of UART0
  242. */
  243. #define UART0_BASE 0xE0000000
  244. /** @name Base Address of UART1
  245. *
  246. * The base address of UART1
  247. */
  248. #define UART1_BASE 0xE0001000
  249. #define UART0 ((UART_Registers*)UART0_BASE)
  250. #define UART1 ((UART_Registers*)UART1_BASE)
  251. /****************************************************************************/
  252. /**
  253. * Determine if there is receive data in the receiver and/or FIFO.
  254. *
  255. * @param BaseAddress contains the base address of the device.
  256. *
  257. * @return TRUE if there is receive data, FALSE otherwise.
  258. *
  259. * @note C-Style signature:
  260. * uint32_t UartDataReceived(uint32_t BaseAddress)
  261. *
  262. ******************************************************************************/
  263. #define UartDataReceived(BaseAddress) \
  264. !((io_in32((BaseAddress) + UART_SR_OFFSET) & \
  265. UART_SR_RXEMPTY) == UART_SR_RXEMPTY)
  266. /****************************************************************************/
  267. /**
  268. * Determine if a byte of data can be sent with the transmitter.
  269. *
  270. * @param BaseAddress contains the base address of the device.
  271. *
  272. * @return TRUE if the TX FIFO is full, FALSE if a byte can be put in the
  273. * FIFO.
  274. *
  275. * @note C-Style signature:
  276. * uint32_t UartTXFIFOFull(uint32_t BaseAddress)
  277. *
  278. ******************************************************************************/
  279. #define UartTXFIFOFull(BaseAddress) \
  280. ((io_in32((BaseAddress) + UART_SR_OFFSET) & \
  281. UART_SR_TXFULL) == UART_SR_TXFULL)
  282. #endif