drv_uart.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. /*
  2. * Copyright (c) 2020-2022, CQ 100ask Development Team
  3. *
  4. * Change Logs:
  5. * Date Author Notes
  6. * 2022-05-29 Alen first version
  7. */
  8. #include "board.h"
  9. #include "drv_uart.h"
  10. #include "drv_config.h"
  11. #ifdef RT_USING_SERIAL
  12. //#define DRV_DEBUG
  13. #define LOG_TAG "drv.usart"
  14. #if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && \
  15. !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && !defined(BSP_USING_UART6) && \
  16. !defined(BSP_USING_UART7) && !defined(BSP_USING_UART8)
  17. #error "Please define at least one BSP_USING_UARTx"
  18. /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
  19. #endif
  20. #define __HAL_UART_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->CSR & (__FLAG__)) == (__FLAG__))
  21. #define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->CSR = ~(__FLAG__))
  22. #define __HAL_UART_GET_INT_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->ISR & (__FLAG__)) == (__FLAG__))
  23. #define __HAL_UART_CLEAR_INT_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->ICR &= (__FLAG__))
  24. enum
  25. {
  26. #ifdef BSP_USING_UART1
  27. UART1_INDEX,
  28. #endif
  29. #ifdef BSP_USING_UART2
  30. UART2_INDEX,
  31. #endif
  32. #ifdef BSP_USING_UART3
  33. UART3_INDEX,
  34. #endif
  35. #ifdef BSP_USING_UART4
  36. UART4_INDEX,
  37. #endif
  38. #ifdef BSP_USING_UART5
  39. UART5_INDEX,
  40. #endif
  41. #ifdef BSP_USING_UART6
  42. UART6_INDEX,
  43. #endif
  44. #ifdef BSP_USING_UART7
  45. UART7_INDEX,
  46. #endif
  47. #ifdef BSP_USING_UART8
  48. UART8_INDEX,
  49. #endif
  50. #ifdef BSP_USING_LPUART1
  51. LPUART1_INDEX,
  52. #endif
  53. };
  54. static struct mm32_uart_config uart_config[] =
  55. {
  56. #ifdef BSP_USING_UART1
  57. UART1_CONFIG,
  58. #endif
  59. #ifdef BSP_USING_UART2
  60. UART2_CONFIG,
  61. #endif
  62. #ifdef BSP_USING_UART3
  63. UART3_CONFIG,
  64. #endif
  65. #ifdef BSP_USING_UART4
  66. UART4_CONFIG,
  67. #endif
  68. #ifdef BSP_USING_UART5
  69. UART5_CONFIG,
  70. #endif
  71. #ifdef BSP_USING_UART6
  72. UART6_CONFIG,
  73. #endif
  74. #ifdef BSP_USING_UART7
  75. UART7_CONFIG,
  76. #endif
  77. #ifdef BSP_USING_UART8
  78. UART8_CONFIG,
  79. #endif
  80. #ifdef BSP_USING_LPUART1
  81. LPUART1_CONFIG,
  82. #endif
  83. };
  84. static struct mm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0};
  85. static rt_err_t mm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  86. {
  87. struct mm32_uart *uart;
  88. RT_ASSERT(serial != RT_NULL);
  89. RT_ASSERT(cfg != RT_NULL);
  90. uart = rt_container_of(serial, struct mm32_uart, serial);
  91. uart->handle.ClockFreqHz = HAL_Get_APB2_Clock();
  92. uart->handle.BaudRate = cfg->baud_rate;
  93. uart->handle.XferMode = UART_XferMode_RxTx;
  94. switch (cfg->flowcontrol)
  95. {
  96. case RT_SERIAL_FLOWCONTROL_NONE:
  97. uart->handle.HwFlowControl = UART_HwFlowControl_None;
  98. break;
  99. case RT_SERIAL_FLOWCONTROL_CTSRTS:
  100. uart->handle.HwFlowControl = UART_HwFlowControl_RTS_CTS;
  101. break;
  102. default:
  103. uart->handle.HwFlowControl = UART_HwFlowControl_None;
  104. break;
  105. }
  106. switch (cfg->data_bits)
  107. {
  108. case DATA_BITS_5:
  109. uart->handle.WordLength = UART_WordLength_5b;
  110. break;
  111. case DATA_BITS_6:
  112. uart->handle.WordLength = UART_WordLength_6b;
  113. break;
  114. case DATA_BITS_7:
  115. uart->handle.WordLength = UART_WordLength_7b;
  116. break;
  117. case DATA_BITS_8:
  118. uart->handle.WordLength = UART_WordLength_8b;
  119. break;
  120. default:
  121. uart->handle.WordLength = UART_WordLength_8b;
  122. break;
  123. }
  124. switch (cfg->stop_bits)
  125. {
  126. case STOP_BITS_1:
  127. uart->handle.StopBits = UART_StopBits_1;
  128. break;
  129. case STOP_BITS_2:
  130. uart->handle.StopBits = UART_StopBits_2;
  131. break;
  132. default:
  133. uart->handle.StopBits = UART_StopBits_1;
  134. break;
  135. }
  136. switch (cfg->parity)
  137. {
  138. case PARITY_NONE:
  139. uart->handle.Parity = UART_Parity_None;
  140. break;
  141. case PARITY_ODD:
  142. uart->handle.Parity = UART_Parity_Odd;
  143. break;
  144. case PARITY_EVEN:
  145. uart->handle.Parity = UART_Parity_Even;
  146. break;
  147. default:
  148. uart->handle.Parity = UART_Parity_None;
  149. break;
  150. }
  151. #ifdef RT_SERIAL_USING_DMA
  152. if (!(serial->parent.open_flag & RT_DEVICE_OFLAG_OPEN)) {
  153. uart->dma_rx.last_index = 0;
  154. }
  155. #endif
  156. extern void UART_MspInit(UART_Type *muart);
  157. UART_MspInit(uart->config->Instance);
  158. UART_Init(uart->config->Instance, &uart->handle);
  159. UART_Enable(uart->config->Instance, true);
  160. return RT_EOK;
  161. }
  162. static rt_err_t mm32_control(struct rt_serial_device *serial, int cmd, void *arg)
  163. {
  164. struct mm32_uart *uart;
  165. rt_uint32_t prioritygroup = 0x00U;
  166. #ifdef RT_SERIAL_USING_DMA
  167. rt_ubase_t ctrl_arg = (rt_ubase_t)arg;
  168. #endif
  169. RT_ASSERT(serial != RT_NULL);
  170. uart = rt_container_of(serial, struct mm32_uart, serial);
  171. switch (cmd)
  172. {
  173. /* disable interrupt */
  174. case RT_DEVICE_CTRL_CLR_INT:
  175. /* disable rx irq */
  176. NVIC_DisableIRQ(uart->config->irq_type);
  177. #ifdef RT_SERIAL_USING_DMA
  178. /* disable DMA */
  179. if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX)
  180. {
  181. }
  182. else if(ctrl_arg == RT_DEVICE_FLAG_DMA_TX)
  183. {
  184. }
  185. #endif
  186. break;
  187. /* enable interrupt */
  188. case RT_DEVICE_CTRL_SET_INT:
  189. /* enable rx irq */
  190. UART_EnableInterrupts(uart->config->Instance, UART_INT_RX_DONE, true);
  191. prioritygroup = NVIC_GetPriorityGrouping();
  192. NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(prioritygroup, 1, 0));
  193. NVIC_EnableIRQ(uart->config->irq_type);
  194. break;
  195. #ifdef RT_SERIAL_USING_DMA
  196. case RT_DEVICE_CTRL_CONFIG:
  197. break;
  198. #endif
  199. case RT_DEVICE_CTRL_CLOSE:
  200. break;
  201. }
  202. return RT_EOK;
  203. }
  204. rt_uint32_t mm32_uart_get_mask(rt_uint32_t word_length, rt_uint32_t parity)
  205. {
  206. rt_uint32_t mask;
  207. if (word_length == UART_WordLength_8b)
  208. {
  209. if (parity == UART_Parity_None)
  210. {
  211. mask = 0x00FFU ;
  212. }
  213. else
  214. {
  215. mask = 0x007FU ;
  216. }
  217. }
  218. #ifdef UART_WORDLENGTH_7B
  219. else if (word_length == UART_WordLength_7b)
  220. {
  221. if (parity == UART_Parity_None)
  222. {
  223. mask = 0x007FU ;
  224. }
  225. else
  226. {
  227. mask = 0x003FU ;
  228. }
  229. }
  230. else
  231. {
  232. mask = 0x0000U;
  233. }
  234. #endif
  235. return mask;
  236. }
  237. static int mm32_putc(struct rt_serial_device *serial, char c)
  238. {
  239. struct mm32_uart *uart;
  240. RT_ASSERT(serial != RT_NULL);
  241. uart = rt_container_of(serial, struct mm32_uart, serial);
  242. uart->config->Instance->TDR = c;
  243. while ( 0u == (UART_STATUS_TX_EMPTY & UART_GetStatus(uart->config->Instance)) )
  244. {}
  245. return 1;
  246. }
  247. static int mm32_getc(struct rt_serial_device *serial)
  248. {
  249. int ch;
  250. struct mm32_uart *uart;
  251. RT_ASSERT(serial != RT_NULL);
  252. uart = rt_container_of(serial, struct mm32_uart, serial);
  253. ch = -1;
  254. if ((UART_STATUS_RX_DONE & UART_GetStatus(uart->config->Instance)) != 0)
  255. {
  256. ch = uart->config->Instance->RDR & mm32_uart_get_mask(uart->handle.WordLength, uart->handle.Parity);
  257. }
  258. return ch;
  259. }
  260. /**
  261. * Uart common interrupt process. This need add to uart ISR.
  262. *
  263. * @param serial serial device
  264. */
  265. static void uart_isr(struct rt_serial_device *serial)
  266. {
  267. struct mm32_uart *uart;
  268. #ifdef RT_SERIAL_USING_DMA
  269. rt_size_t recv_total_index, recv_len;
  270. rt_base_t level;
  271. #endif
  272. RT_ASSERT(serial != RT_NULL);
  273. uart = rt_container_of(serial, struct mm32_uart, serial);
  274. /* UART in mode Receiver -------------------------------------------------*/
  275. if ( (0u != __HAL_UART_GET_INT_FLAG(uart->config->Instance, UART_INT_RX_DONE))
  276. && (0u != __HAL_UART_GET_FLAG(uart->config->Instance, UART_STATUS_RX_DONE)) )
  277. {
  278. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  279. }
  280. #ifdef RT_SERIAL_USING_DMA
  281. #endif
  282. else
  283. {
  284. if (__HAL_UART_GET_FLAG(uart->config->Instance, UART_STATUS_RX_DONE) != 0)
  285. {
  286. __HAL_UART_CLEAR_FLAG(uart->config->Instance, UART_STATUS_RX_DONE);
  287. }
  288. if (__HAL_UART_GET_FLAG(uart->config->Instance, UART_STATUS_TX_DONE) != 0)
  289. {
  290. __HAL_UART_CLEAR_FLAG(uart->config->Instance, UART_STATUS_TX_DONE);
  291. }
  292. if (__HAL_UART_GET_FLAG(uart->config->Instance, UART_STATUS_TX_FULL) != 0)
  293. {
  294. __HAL_UART_CLEAR_FLAG(uart->config->Instance, UART_STATUS_TX_FULL);
  295. }
  296. if (__HAL_UART_GET_FLAG(uart->config->Instance, UART_STATUS_TX_EMPTY) != 0)
  297. {
  298. __HAL_UART_CLEAR_FLAG(uart->config->Instance, UART_STATUS_TX_EMPTY);
  299. }
  300. if (__HAL_UART_GET_INT_FLAG(uart->config->Instance, UART_INT_RX_DONE) != 0)
  301. {
  302. __HAL_UART_CLEAR_INT_FLAG(uart->config->Instance, UART_INT_RX_DONE);
  303. }
  304. if (__HAL_UART_GET_INT_FLAG(uart->config->Instance, UART_INT_TX_DONE) != 0)
  305. {
  306. __HAL_UART_CLEAR_INT_FLAG(uart->config->Instance, UART_INT_TX_DONE);
  307. }
  308. if (__HAL_UART_GET_INT_FLAG(uart->config->Instance, UART_INT_TX_EMPTY) != 0)
  309. {
  310. __HAL_UART_CLEAR_INT_FLAG(uart->config->Instance, UART_INT_TX_EMPTY);
  311. }
  312. }
  313. }
  314. #if defined(BSP_USING_UART1)
  315. void UART1_IRQHandler(void)
  316. {
  317. /* enter interrupt */
  318. rt_interrupt_enter();
  319. uart_isr(&(uart_obj[UART1_INDEX].serial));
  320. /* leave interrupt */
  321. rt_interrupt_leave();
  322. }
  323. #endif
  324. #if defined(BSP_USING_UART2)
  325. void UART2_IRQHandler(void)
  326. {
  327. /* enter interrupt */
  328. rt_interrupt_enter();
  329. uart_isr(&(uart_obj[UART2_INDEX].serial));
  330. /* leave interrupt */
  331. rt_interrupt_leave();
  332. }
  333. #endif
  334. #if defined(BSP_USING_UART3)
  335. void UART3_IRQHandler(void)
  336. {
  337. /* enter interrupt */
  338. rt_interrupt_enter();
  339. uart_isr(&(uart_obj[UART3_INDEX].serial));
  340. /* leave interrupt */
  341. rt_interrupt_leave();
  342. }
  343. #endif
  344. static const struct rt_uart_ops mm32_uart_ops =
  345. {
  346. .configure = mm32_configure,
  347. .control = mm32_control,
  348. .putc = mm32_putc,
  349. .getc = mm32_getc,
  350. .dma_transmit = RT_NULL
  351. };
  352. int rt_hw_uart_init(void)
  353. {
  354. rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct mm32_uart);
  355. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  356. rt_err_t result = 0;
  357. for (int i = 0; i < obj_num; i++)
  358. {
  359. /* init UART object */
  360. uart_obj[i].config = &uart_config[i];
  361. uart_obj[i].serial.ops = &mm32_uart_ops;
  362. uart_obj[i].serial.config = config;
  363. /* register UART device */
  364. result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
  365. RT_DEVICE_FLAG_RDWR
  366. | RT_DEVICE_FLAG_INT_RX
  367. | RT_DEVICE_FLAG_INT_TX
  368. | uart_obj[i].uart_dma_flag
  369. , NULL);
  370. RT_ASSERT(result == RT_EOK);
  371. }
  372. return result;
  373. }
  374. #endif /* RT_USING_SERIAL */