stm32-usart.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * Copyright (C) Maxime Coquelin 2015
  3. * Authors: Maxime Coquelin <mcoquelin.stm32@gmail.com>
  4. * Gerald Baeza <gerald_baeza@yahoo.fr>
  5. * License terms: GNU General Public License (GPL), version 2
  6. */
  7. #define DRIVER_NAME "stm32-usart"
  8. struct stm32_usart_offsets {
  9. u8 cr1;
  10. u8 cr2;
  11. u8 cr3;
  12. u8 brr;
  13. u8 gtpr;
  14. u8 rtor;
  15. u8 rqr;
  16. u8 isr;
  17. u8 icr;
  18. u8 rdr;
  19. u8 tdr;
  20. };
  21. struct stm32_usart_config {
  22. u8 uart_enable_bit; /* USART_CR1_UE */
  23. bool has_7bits_data;
  24. };
  25. struct stm32_usart_info {
  26. struct stm32_usart_offsets ofs;
  27. struct stm32_usart_config cfg;
  28. };
  29. #define UNDEF_REG 0xff
  30. /* Register offsets */
  31. struct stm32_usart_info stm32f4_info = {
  32. .ofs = {
  33. .isr = 0x00,
  34. .rdr = 0x04,
  35. .tdr = 0x04,
  36. .brr = 0x08,
  37. .cr1 = 0x0c,
  38. .cr2 = 0x10,
  39. .cr3 = 0x14,
  40. .gtpr = 0x18,
  41. .rtor = UNDEF_REG,
  42. .rqr = UNDEF_REG,
  43. .icr = UNDEF_REG,
  44. },
  45. .cfg = {
  46. .uart_enable_bit = 13,
  47. .has_7bits_data = false,
  48. }
  49. };
  50. struct stm32_usart_info stm32f7_info = {
  51. .ofs = {
  52. .cr1 = 0x00,
  53. .cr2 = 0x04,
  54. .cr3 = 0x08,
  55. .brr = 0x0c,
  56. .gtpr = 0x10,
  57. .rtor = 0x14,
  58. .rqr = 0x18,
  59. .isr = 0x1c,
  60. .icr = 0x20,
  61. .rdr = 0x24,
  62. .tdr = 0x28,
  63. },
  64. .cfg = {
  65. .uart_enable_bit = 0,
  66. .has_7bits_data = true,
  67. }
  68. };
  69. /* USART_SR (F4) / USART_ISR (F7) */
  70. #define USART_SR_PE BIT(0)
  71. #define USART_SR_FE BIT(1)
  72. #define USART_SR_NF BIT(2)
  73. #define USART_SR_ORE BIT(3)
  74. #define USART_SR_IDLE BIT(4)
  75. #define USART_SR_RXNE BIT(5)
  76. #define USART_SR_TC BIT(6)
  77. #define USART_SR_TXE BIT(7)
  78. #define USART_SR_LBD BIT(8)
  79. #define USART_SR_CTSIF BIT(9)
  80. #define USART_SR_CTS BIT(10) /* F7 */
  81. #define USART_SR_RTOF BIT(11) /* F7 */
  82. #define USART_SR_EOBF BIT(12) /* F7 */
  83. #define USART_SR_ABRE BIT(14) /* F7 */
  84. #define USART_SR_ABRF BIT(15) /* F7 */
  85. #define USART_SR_BUSY BIT(16) /* F7 */
  86. #define USART_SR_CMF BIT(17) /* F7 */
  87. #define USART_SR_SBKF BIT(18) /* F7 */
  88. #define USART_SR_TEACK BIT(21) /* F7 */
  89. #define USART_SR_ERR_MASK (USART_SR_LBD | USART_SR_ORE | \
  90. USART_SR_FE | USART_SR_PE)
  91. /* Dummy bits */
  92. #define USART_SR_DUMMY_RX BIT(16)
  93. /* USART_ICR (F7) */
  94. #define USART_CR_TC BIT(6)
  95. /* USART_DR */
  96. #define USART_DR_MASK GENMASK(8, 0)
  97. /* USART_BRR */
  98. #define USART_BRR_DIV_F_MASK GENMASK(3, 0)
  99. #define USART_BRR_DIV_M_MASK GENMASK(15, 4)
  100. #define USART_BRR_DIV_M_SHIFT 4
  101. /* USART_CR1 */
  102. #define USART_CR1_SBK BIT(0)
  103. #define USART_CR1_RWU BIT(1) /* F4 */
  104. #define USART_CR1_RE BIT(2)
  105. #define USART_CR1_TE BIT(3)
  106. #define USART_CR1_IDLEIE BIT(4)
  107. #define USART_CR1_RXNEIE BIT(5)
  108. #define USART_CR1_TCIE BIT(6)
  109. #define USART_CR1_TXEIE BIT(7)
  110. #define USART_CR1_PEIE BIT(8)
  111. #define USART_CR1_PS BIT(9)
  112. #define USART_CR1_PCE BIT(10)
  113. #define USART_CR1_WAKE BIT(11)
  114. #define USART_CR1_M BIT(12)
  115. #define USART_CR1_M0 BIT(12) /* F7 */
  116. #define USART_CR1_MME BIT(13) /* F7 */
  117. #define USART_CR1_CMIE BIT(14) /* F7 */
  118. #define USART_CR1_OVER8 BIT(15)
  119. #define USART_CR1_DEDT_MASK GENMASK(20, 16) /* F7 */
  120. #define USART_CR1_DEAT_MASK GENMASK(25, 21) /* F7 */
  121. #define USART_CR1_RTOIE BIT(26) /* F7 */
  122. #define USART_CR1_EOBIE BIT(27) /* F7 */
  123. #define USART_CR1_M1 BIT(28) /* F7 */
  124. #define USART_CR1_IE_MASK (GENMASK(8, 4) | BIT(14) | BIT(26) | BIT(27))
  125. /* USART_CR2 */
  126. #define USART_CR2_ADD_MASK GENMASK(3, 0) /* F4 */
  127. #define USART_CR2_ADDM7 BIT(4) /* F7 */
  128. #define USART_CR2_LBDL BIT(5)
  129. #define USART_CR2_LBDIE BIT(6)
  130. #define USART_CR2_LBCL BIT(8)
  131. #define USART_CR2_CPHA BIT(9)
  132. #define USART_CR2_CPOL BIT(10)
  133. #define USART_CR2_CLKEN BIT(11)
  134. #define USART_CR2_STOP_2B BIT(13)
  135. #define USART_CR2_STOP_MASK GENMASK(13, 12)
  136. #define USART_CR2_LINEN BIT(14)
  137. #define USART_CR2_SWAP BIT(15) /* F7 */
  138. #define USART_CR2_RXINV BIT(16) /* F7 */
  139. #define USART_CR2_TXINV BIT(17) /* F7 */
  140. #define USART_CR2_DATAINV BIT(18) /* F7 */
  141. #define USART_CR2_MSBFIRST BIT(19) /* F7 */
  142. #define USART_CR2_ABREN BIT(20) /* F7 */
  143. #define USART_CR2_ABRMOD_MASK GENMASK(22, 21) /* F7 */
  144. #define USART_CR2_RTOEN BIT(23) /* F7 */
  145. #define USART_CR2_ADD_F7_MASK GENMASK(31, 24) /* F7 */
  146. /* USART_CR3 */
  147. #define USART_CR3_EIE BIT(0)
  148. #define USART_CR3_IREN BIT(1)
  149. #define USART_CR3_IRLP BIT(2)
  150. #define USART_CR3_HDSEL BIT(3)
  151. #define USART_CR3_NACK BIT(4)
  152. #define USART_CR3_SCEN BIT(5)
  153. #define USART_CR3_DMAR BIT(6)
  154. #define USART_CR3_DMAT BIT(7)
  155. #define USART_CR3_RTSE BIT(8)
  156. #define USART_CR3_CTSE BIT(9)
  157. #define USART_CR3_CTSIE BIT(10)
  158. #define USART_CR3_ONEBIT BIT(11)
  159. #define USART_CR3_OVRDIS BIT(12) /* F7 */
  160. #define USART_CR3_DDRE BIT(13) /* F7 */
  161. #define USART_CR3_DEM BIT(14) /* F7 */
  162. #define USART_CR3_DEP BIT(15) /* F7 */
  163. #define USART_CR3_SCARCNT_MASK GENMASK(19, 17) /* F7 */
  164. /* USART_GTPR */
  165. #define USART_GTPR_PSC_MASK GENMASK(7, 0)
  166. #define USART_GTPR_GT_MASK GENMASK(15, 8)
  167. /* USART_RTOR */
  168. #define USART_RTOR_RTO_MASK GENMASK(23, 0) /* F7 */
  169. #define USART_RTOR_BLEN_MASK GENMASK(31, 24) /* F7 */
  170. /* USART_RQR */
  171. #define USART_RQR_ABRRQ BIT(0) /* F7 */
  172. #define USART_RQR_SBKRQ BIT(1) /* F7 */
  173. #define USART_RQR_MMRQ BIT(2) /* F7 */
  174. #define USART_RQR_RXFRQ BIT(3) /* F7 */
  175. #define USART_RQR_TXFRQ BIT(4) /* F7 */
  176. /* USART_ICR */
  177. #define USART_ICR_PECF BIT(0) /* F7 */
  178. #define USART_ICR_FFECF BIT(1) /* F7 */
  179. #define USART_ICR_NCF BIT(2) /* F7 */
  180. #define USART_ICR_ORECF BIT(3) /* F7 */
  181. #define USART_ICR_IDLECF BIT(4) /* F7 */
  182. #define USART_ICR_TCCF BIT(6) /* F7 */
  183. #define USART_ICR_LBDCF BIT(8) /* F7 */
  184. #define USART_ICR_CTSCF BIT(9) /* F7 */
  185. #define USART_ICR_RTOCF BIT(11) /* F7 */
  186. #define USART_ICR_EOBCF BIT(12) /* F7 */
  187. #define USART_ICR_CMCF BIT(17) /* F7 */
  188. #define STM32_SERIAL_NAME "ttyS"
  189. #define STM32_MAX_PORTS 6
  190. #define RX_BUF_L 200 /* dma rx buffer length */
  191. #define RX_BUF_P RX_BUF_L /* dma rx buffer period */
  192. #define TX_BUF_L 200 /* dma tx buffer length */
  193. struct stm32_port {
  194. struct uart_port port;
  195. struct clk *clk;
  196. struct stm32_usart_info *info;
  197. struct dma_chan *rx_ch; /* dma rx channel */
  198. dma_addr_t rx_dma_buf; /* dma rx buffer bus address */
  199. unsigned char *rx_buf; /* dma rx buffer cpu address */
  200. struct dma_chan *tx_ch; /* dma tx channel */
  201. dma_addr_t tx_dma_buf; /* dma tx buffer bus address */
  202. unsigned char *tx_buf; /* dma tx buffer cpu address */
  203. bool tx_dma_busy; /* dma tx busy */
  204. bool hw_flow_control;
  205. };
  206. static struct stm32_port stm32_ports[STM32_MAX_PORTS];
  207. static struct uart_driver stm32_usart_driver;