drv_uart.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. /*
  2. * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-10-23 yuzrain the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include "board.h"
  14. #include "drv_uart.h"
  15. #include "md_gpio.h"
  16. #include "md_uart.h"
  17. #ifdef RT_USING_SERIAL
  18. /* es32 uart driver */
  19. struct es32_uart
  20. {
  21. UART_TypeDef *huart;
  22. IRQn_Type irq;
  23. };
  24. static rt_err_t es32f0x_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  25. {
  26. struct es32_uart *uart;
  27. RT_ASSERT(serial != RT_NULL);
  28. RT_ASSERT(cfg != RT_NULL);
  29. uart = (struct es32_uart *)serial->parent.user_data;
  30. /* Close TX/RX temporarily */
  31. md_uart_disable_lcon_txen(uart->huart);
  32. md_uart_disable_lcon_rxen(uart->huart);
  33. #ifdef BSP_USING_UART1
  34. /* Open UART1 clock */
  35. SET_BIT(RCU->APB2EN, RCU_APB2EN_UART1EN_MSK);
  36. /* Config UART1 GPIO pin */
  37. md_gpio_set_pull (GPIOB, MD_GPIO_PIN_7, MD_GPIO_PULL_UP);
  38. md_gpio_set_mode (GPIOB, MD_GPIO_PIN_6, MD_GPIO_MODE_FUNCTION);
  39. md_gpio_set_mode (GPIOB, MD_GPIO_PIN_7, MD_GPIO_MODE_FUNCTION);
  40. md_gpio_set_function0_7 (GPIOB, MD_GPIO_PIN_6, MD_GPIO_AF2);
  41. md_gpio_set_function0_7 (GPIOB, MD_GPIO_PIN_7, MD_GPIO_AF2);
  42. #endif /* uart2 gpio init */
  43. #ifdef BSP_USING_UART2
  44. /* Open UART2 clock */
  45. SET_BIT(RCU->APB1EN, RCU_APB1EN_UART2EN_MSK);
  46. /* Config UART2 GPIO pin */
  47. md_gpio_set_pull (GPIOA, MD_GPIO_PIN_3, MD_GPIO_PULL_UP);
  48. md_gpio_set_mode (GPIOA, MD_GPIO_PIN_2, MD_GPIO_MODE_FUNCTION);
  49. md_gpio_set_mode (GPIOA, MD_GPIO_PIN_3, MD_GPIO_MODE_FUNCTION);
  50. md_gpio_set_function0_7 (GPIOA, MD_GPIO_PIN_2, MD_GPIO_AF2);
  51. md_gpio_set_function0_7 (GPIOA, MD_GPIO_PIN_3, MD_GPIO_AF2);
  52. #endif /* uart1 gpio init */
  53. #ifdef BSP_USING_UART3
  54. /* Open UART3 clock */
  55. SET_BIT(RCU->APB1EN, RCU_APB1EN_UART3EN_MSK);
  56. /* Config UART3 GPIO pin */
  57. md_gpio_set_pull (GPIOC, MD_GPIO_PIN_7, MD_GPIO_PULL_UP);
  58. md_gpio_set_mode (GPIOC, MD_GPIO_PIN_6, MD_GPIO_MODE_FUNCTION);
  59. md_gpio_set_mode (GPIOC, MD_GPIO_PIN_7, MD_GPIO_MODE_FUNCTION);
  60. md_gpio_set_function0_7 (GPIOC, MD_GPIO_PIN_6, MD_GPIO_AF2);
  61. md_gpio_set_function0_7 (GPIOC, MD_GPIO_PIN_7, MD_GPIO_AF2);
  62. #endif /* uart3 gpio init */
  63. if (cfg->bit_order == BIT_ORDER_MSB)
  64. {
  65. md_uart_set_lcon_msb(uart->huart, MD_UART_LCON_MSB_FIRST);
  66. }
  67. else
  68. {
  69. md_uart_set_lcon_msb(uart->huart, MD_UART_LCON_LSB_FIRST);
  70. }
  71. if (cfg->invert == NRZ_INVERTED)
  72. {
  73. md_uart_enable_lcon_datainv(uart->huart);
  74. }
  75. else
  76. {
  77. md_uart_disable_lcon_datainv(uart->huart);
  78. }
  79. /* Config buadrate */
  80. md_uart_set_brr(uart->huart, SystemCoreClock/cfg->baud_rate);
  81. /* Config data width */
  82. md_uart_set_lcon_dls(uart->huart, 8-cfg->data_bits);
  83. /* Config stop bits */
  84. md_uart_set_lcon_stop(uart->huart, cfg->stop_bits);
  85. /* Config parity */
  86. if (cfg->parity > PARITY_NONE)
  87. {
  88. md_uart_set_lcon_ps(uart->huart, cfg->parity-1);
  89. md_uart_enable_lcon_pe(uart->huart);
  90. }
  91. else
  92. md_uart_disable_lcon_pe(uart->huart);
  93. /* enable rx int */
  94. md_uart_set_fcon_rxth(uart->huart, MD_UART_FCON_RXTH_1);
  95. md_uart_enable_ier_rfth(uart->huart);
  96. md_uart_enable_lcon_txen(uart->huart);
  97. md_uart_enable_lcon_rxen(uart->huart);
  98. return RT_EOK;
  99. }
  100. static rt_err_t es32f0x_control(struct rt_serial_device *serial, int cmd, void *arg)
  101. {
  102. struct es32_uart *uart;
  103. RT_ASSERT(serial != RT_NULL);
  104. uart = (struct es32_uart *)serial->parent.user_data;
  105. switch (cmd)
  106. {
  107. case RT_DEVICE_CTRL_CLR_INT:
  108. /* disable rx irq */
  109. NVIC_DisableIRQ(uart->irq);
  110. /* disable interrupt */
  111. md_uart_disable_idr_rfth(uart->huart);
  112. break;
  113. case RT_DEVICE_CTRL_SET_INT:
  114. /* enable rx irq */
  115. NVIC_EnableIRQ(uart->irq);
  116. /* enable interrupt */
  117. md_uart_enable_ier_rfth(uart->huart);
  118. break;
  119. }
  120. return RT_EOK;
  121. }
  122. static int es32f0x_putc(struct rt_serial_device *serial, char c)
  123. {
  124. struct es32_uart *uart;
  125. RT_ASSERT(serial != RT_NULL);
  126. uart = (struct es32_uart *)serial->parent.user_data;
  127. while (uart->huart->STAT & UART_STAT_TSBUSY_MSK);
  128. WRITE_REG(uart->huart->TXBUF, c);
  129. return 1;
  130. }
  131. static int es32f0x_getc(struct rt_serial_device *serial)
  132. {
  133. int ch = -1;
  134. struct es32_uart *uart;
  135. RT_ASSERT(serial != RT_NULL);
  136. uart = (struct es32_uart *)serial->parent.user_data;
  137. if (uart->huart->STAT & UART_STAT_RFTH_MSK)
  138. {
  139. ch = (uint8_t)(uart->huart->RXBUF & 0xFF);
  140. }
  141. return ch;
  142. }
  143. static const struct rt_uart_ops es32f0x_uart_ops =
  144. {
  145. es32f0x_configure,
  146. es32f0x_control,
  147. es32f0x_putc,
  148. es32f0x_getc,
  149. };
  150. #ifdef BSP_USING_UART1
  151. /* UART1 device driver structure */
  152. struct es32_uart uart1 =
  153. {
  154. UART1,
  155. UART1_IRQn
  156. };
  157. struct rt_serial_device serial1;
  158. void UART1_IRQHandler(void)
  159. {
  160. /* enter interrupt */
  161. rt_interrupt_enter();
  162. if (md_uart_is_active_flag_rif_rfth(UART1) == 1)
  163. {
  164. rt_hw_serial_isr(&serial1, RT_SERIAL_EVENT_RX_IND);
  165. md_uart_clear_flag_rfth(UART1);
  166. }
  167. /* leave interrupt */
  168. rt_interrupt_leave();
  169. }
  170. #endif /* BSP_USING_UART1 */
  171. #ifdef BSP_USING_UART2
  172. /* UART2 device driver structure */
  173. struct es32_uart uart2 =
  174. {
  175. UART2,
  176. UART2_IRQn
  177. };
  178. struct rt_serial_device serial2;
  179. void UART2_IRQHandler(void)
  180. {
  181. /* enter interrupt */
  182. rt_interrupt_enter();
  183. if (md_uart_is_active_flag_rif_rfth(UART2) == 1)
  184. {
  185. rt_hw_serial_isr(&serial2, RT_SERIAL_EVENT_RX_IND);
  186. md_uart_clear_flag_rfth(UART2);
  187. }
  188. /* leave interrupt */
  189. rt_interrupt_leave();
  190. }
  191. #endif /* BSP_USING_UART2 */
  192. #ifdef BSP_USING_UART3
  193. /* UART3 device driver structure */
  194. struct es32_uart uart3 =
  195. {
  196. UART3,
  197. UART3_IRQn
  198. };
  199. struct rt_serial_device serial3;
  200. void UART3_AES_IRQHandler(void)
  201. {
  202. /* enter interrupt */
  203. rt_interrupt_enter();
  204. if (md_uart_is_active_flag_rif_rfth(UART3) == 1)
  205. {
  206. rt_hw_serial_isr(&serial3, RT_SERIAL_EVENT_RX_IND);
  207. md_uart_clear_flag_rfth(UART3);
  208. }
  209. /* leave interrupt */
  210. rt_interrupt_leave();
  211. }
  212. #endif /* BSP_USING_UART3 */
  213. int rt_hw_uart_init(void)
  214. {
  215. struct es32_uart *uart;
  216. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  217. #ifdef BSP_USING_UART1
  218. uart = &uart1;
  219. serial1.ops = &es32f0x_uart_ops;
  220. serial1.config = config;
  221. /* register UART1 device */
  222. rt_hw_serial_register(&serial1, "uart1",
  223. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  224. uart);
  225. #endif /* BSP_USING_UART1 */
  226. #ifdef BSP_USING_UART2
  227. uart = &uart2;
  228. serial2.ops = &es32f0x_uart_ops;
  229. serial2.config = config;
  230. /* register UART2 device */
  231. rt_hw_serial_register(&serial2, "uart2",
  232. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  233. uart);
  234. #endif /* BSP_USING_UART2 */
  235. #ifdef BSP_USING_UART3
  236. uart = &uart3;
  237. serial3.ops = &es32f0x_uart_ops;
  238. serial3.config = config;
  239. /* register UART3 device */
  240. rt_hw_serial_register(&serial3, "uart3",
  241. RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
  242. uart);
  243. #endif /* BSP_USING_UART3 */
  244. return 0;
  245. }
  246. INIT_BOARD_EXPORT(rt_hw_uart_init);
  247. #endif