drv_usart.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230
  1. /*
  2. * Copyright (c) 2006-2025, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-08-20 BruceOu first implementation
  9. */
  10. #include "drv_usart.h"
  11. #ifdef RT_USING_SERIAL
  12. #if !defined(BSP_USING_UART0) && !defined(BSP_USING_UART1) && \
  13. !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && \
  14. !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && \
  15. !defined(BSP_USING_UART6) && !defined(BSP_USING_UART7)
  16. #error "Please define at least one UARTx"
  17. #endif
  18. #include <rtdevice.h>
  19. #ifdef RT_SERIAL_USING_DMA
  20. static void gd32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag);
  21. static void gd32_dma_tx_config(struct rt_serial_device *serial, rt_ubase_t flag);
  22. static void dma_rx_done_isr(struct rt_serial_device *serial);
  23. extern void Error_Handler(void);
  24. #endif
  25. static void GD32_UART_IRQHandler(struct rt_serial_device *serial);
  26. #if defined(BSP_USING_UART0)
  27. struct rt_serial_device serial0;
  28. #if defined(RT_SERIAL_USING_DMA)
  29. gd32_uart_dma uart0_rxdma = {
  30. DMA0,
  31. DMA_CH0,
  32. #ifdef SOC_SERIES_GD32H7xx
  33. DMA_REQUEST_USART0_RX,
  34. #endif
  35. DMA_INTF_FTFIF,
  36. DMA0_Channel0_IRQn,
  37. 0,
  38. };
  39. gd32_uart_dma uart0_txdma = {
  40. DMA1,
  41. DMA_CH0,
  42. #ifdef SOC_SERIES_GD32H7xx
  43. DMA_REQUEST_USART0_TX,
  44. #endif
  45. DMA_INTF_FTFIF,
  46. DMA1_Channel0_IRQn,
  47. 0,
  48. };
  49. void DMA0_Channel0_IRQHandler(void)
  50. {
  51. /* enter interrupt */
  52. rt_interrupt_enter();
  53. dma_rx_done_isr(&serial0);
  54. /* leave interrupt */
  55. rt_interrupt_leave();
  56. }
  57. void DMA1_Channel0_IRQHandler(void)
  58. {
  59. /* enter interrupt */
  60. rt_interrupt_enter();
  61. dma_flag_clear(DMA1, DMA_CH0, DMA_FLAG_FTF);
  62. dma_flag_clear(DMA1, DMA_CH0, DMA_FLAG_HTF);
  63. dma_flag_clear(DMA1, DMA_CH0, DMA_FLAG_FEE);
  64. dma_flag_clear(DMA1, DMA_CH0, DMA_FLAG_TAE);
  65. /* leave interrupt */
  66. rt_interrupt_leave();
  67. }
  68. #endif /* RT_SERIAL_USING_DMA */
  69. void USART0_IRQHandler(void)
  70. {
  71. /* enter interrupt */
  72. rt_interrupt_enter();
  73. GD32_UART_IRQHandler(&serial0);
  74. /* leave interrupt */
  75. rt_interrupt_leave();
  76. }
  77. #endif /* BSP_USING_UART0 */
  78. #if defined(BSP_USING_UART1)
  79. struct rt_serial_device serial1;
  80. #if defined(RT_SERIAL_USING_DMA)
  81. gd32_uart_dma uart1_rxdma = {
  82. DMA0,
  83. DMA_CH1,
  84. #ifdef SOC_SERIES_GD32H7xx
  85. DMA_REQUEST_USART1_RX,
  86. #endif
  87. DMA_INTF_FTFIF,
  88. DMA0_Channel1_IRQn,
  89. 0,
  90. };
  91. void DMA0_Channel1_IRQHandler(void)
  92. {
  93. /* enter interrupt */
  94. rt_interrupt_enter();
  95. dma_rx_done_isr(&serial1);
  96. /* leave interrupt */
  97. rt_interrupt_leave();
  98. }
  99. #endif /* RT_SERIAL_USING_DMA */
  100. void USART1_IRQHandler(void)
  101. {
  102. /* enter interrupt */
  103. rt_interrupt_enter();
  104. GD32_UART_IRQHandler(&serial1);
  105. /* leave interrupt */
  106. rt_interrupt_leave();
  107. }
  108. #endif /* BSP_USING_UART1 */
  109. #if defined(BSP_USING_UART2)
  110. struct rt_serial_device serial2;
  111. #if defined(RT_SERIAL_USING_DMA)
  112. gd32_uart_dma uart2_rxdma = {
  113. DMA0,
  114. DMA_CH2,
  115. #ifdef SOC_SERIES_GD32H7xx
  116. DMA_REQUEST_USART2_RX,
  117. #endif
  118. DMA_INTF_FTFIF,
  119. DMA0_Channel2_IRQn,
  120. 0,
  121. };
  122. gd32_uart_dma uart2_txdma = {
  123. DMA1,
  124. DMA_CH2,
  125. #ifdef SOC_SERIES_GD32H7xx
  126. DMA_REQUEST_USART2_TX,
  127. #endif
  128. DMA_INTF_FTFIF,
  129. DMA1_Channel2_IRQn,
  130. 0,
  131. };
  132. void DMA0_Channel2_IRQHandler(void)
  133. {
  134. /* enter interrupt */
  135. rt_interrupt_enter();
  136. dma_rx_done_isr(&serial2);
  137. /* leave interrupt */
  138. rt_interrupt_leave();
  139. }
  140. void DMA1_Channel2_IRQHandler(void)
  141. {
  142. /* enter interrupt */
  143. rt_interrupt_enter();
  144. dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_FTF);
  145. dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_HTF);
  146. dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_FEE);
  147. dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_TAE);
  148. /* leave interrupt */
  149. rt_interrupt_leave();
  150. }
  151. #endif /* RT_SERIAL_USING_DMA */
  152. void USART2_IRQHandler(void)
  153. {
  154. /* enter interrupt */
  155. rt_interrupt_enter();
  156. GD32_UART_IRQHandler(&serial2);
  157. /* leave interrupt */
  158. rt_interrupt_leave();
  159. }
  160. #endif /* BSP_USING_UART2 */
  161. #if defined(BSP_USING_UART3)
  162. struct rt_serial_device serial3;
  163. #if defined(RT_SERIAL_USING_DMA)
  164. gd32_uart_dma uart3_rxdma = {
  165. DMA0,
  166. DMA_CH3,
  167. #ifdef SOC_SERIES_GD32H7xx
  168. DMA_REQUEST_UART3_RX,
  169. #endif
  170. DMA_INTF_FTFIF,
  171. DMA0_Channel3_IRQn,
  172. 0,
  173. };
  174. void DMA0_Channel3_IRQHandler(void)
  175. {
  176. /* enter interrupt */
  177. rt_interrupt_enter();
  178. dma_rx_done_isr(&serial3);
  179. /* leave interrupt */
  180. rt_interrupt_leave();
  181. }
  182. #endif /* RT_SERIAL_USING_DMA */
  183. void UART3_IRQHandler(void)
  184. {
  185. /* enter interrupt */
  186. rt_interrupt_enter();
  187. GD32_UART_IRQHandler(&serial3);
  188. /* leave interrupt */
  189. rt_interrupt_leave();
  190. }
  191. #endif /* BSP_USING_UART3 */
  192. #if defined(BSP_USING_UART4)
  193. struct rt_serial_device serial4;
  194. #if defined(RT_SERIAL_USING_DMA)
  195. gd32_uart_dma uart4_rxdma = {
  196. DMA0,
  197. DMA_CH4,
  198. #ifdef SOC_SERIES_GD32H7xx
  199. DMA_REQUEST_UART4_RX,
  200. #endif
  201. DMA_INTF_FTFIF,
  202. DMA0_Channel4_IRQn,
  203. 0,
  204. };
  205. void DMA0_Channel4_IRQHandler(void)
  206. {
  207. /* enter interrupt */
  208. rt_interrupt_enter();
  209. dma_rx_done_isr(&serial4);
  210. /* leave interrupt */
  211. rt_interrupt_leave();
  212. }
  213. #endif /* RT_SERIAL_USING_DMA */
  214. void UART4_IRQHandler(void)
  215. {
  216. /* enter interrupt */
  217. rt_interrupt_enter();
  218. GD32_UART_IRQHandler(&serial4);
  219. /* leave interrupt */
  220. rt_interrupt_leave();
  221. }
  222. #endif /* BSP_USING_UART4 */
  223. #if defined(BSP_USING_UART5)
  224. struct rt_serial_device serial5;
  225. #if defined(RT_SERIAL_USING_DMA)
  226. gd32_uart_dma uart5_rxdma = {
  227. DMA0,
  228. DMA_CH5,
  229. #ifdef SOC_SERIES_GD32H7xx
  230. DMA_REQUEST_USART5_RX,
  231. #endif
  232. DMA_INTF_FTFIF,
  233. DMA0_Channel5_IRQn,
  234. 0,
  235. };
  236. void DMA0_Channel5_IRQHandler(void)
  237. {
  238. /* enter interrupt */
  239. rt_interrupt_enter();
  240. dma_rx_done_isr(&serial5);
  241. /* leave interrupt */
  242. rt_interrupt_leave();
  243. }
  244. #endif /* RT_SERIAL_USING_DMA */
  245. void USART5_IRQHandler(void)
  246. {
  247. /* enter interrupt */
  248. rt_interrupt_enter();
  249. GD32_UART_IRQHandler(&serial5);
  250. /* leave interrupt */
  251. rt_interrupt_leave();
  252. }
  253. #endif /* BSP_USING_UART5 */
  254. #if defined(BSP_USING_UART6)
  255. struct rt_serial_device serial6;
  256. #if defined(RT_SERIAL_USING_DMA)
  257. gd32_uart_dma uart6_rxdma = {
  258. DMA0,
  259. DMA_CH6,
  260. #ifdef SOC_SERIES_GD32H7xx
  261. DMA_REQUEST_UART6_RX,
  262. #endif
  263. DMA_INTF_FTFIF,
  264. DMA0_Channel6_IRQn,
  265. 0,
  266. };
  267. void DMA0_Channel6_IRQHandler(void)
  268. {
  269. /* enter interrupt */
  270. rt_interrupt_enter();
  271. dma_rx_done_isr(&serial6);
  272. /* leave interrupt */
  273. rt_interrupt_leave();
  274. }
  275. #endif /* RT_SERIAL_USING_DMA */
  276. void UART6_IRQHandler(void)
  277. {
  278. /* enter interrupt */
  279. rt_interrupt_enter();
  280. GD32_UART_IRQHandler(&serial6);
  281. /* leave interrupt */
  282. rt_interrupt_leave();
  283. }
  284. #endif /* BSP_USING_UART6 */
  285. #if defined(BSP_USING_UART7)
  286. struct rt_serial_device serial7;
  287. #if defined(RT_SERIAL_USING_DMA)
  288. gd32_uart_dma uart7_rxdma = {
  289. DMA0,
  290. DMA_CH7,
  291. #ifdef SOC_SERIES_GD32H7xx
  292. DMA_REQUEST_UART7_RX,
  293. #endif
  294. DMA_INTF_FTFIF,
  295. DMA0_Channel7_IRQn,
  296. 0,
  297. };
  298. void DMA0_Channel7_IRQHandler(void)
  299. {
  300. /* enter interrupt */
  301. rt_interrupt_enter();
  302. dma_rx_done_isr(&serial7);
  303. /* leave interrupt */
  304. rt_interrupt_leave();
  305. }
  306. #endif /* RT_SERIAL_USING_DMA */
  307. void UART7_IRQHandler(void)
  308. {
  309. /* enter interrupt */
  310. rt_interrupt_enter();
  311. GD32_UART_IRQHandler(&serial7);
  312. /* leave interrupt */
  313. rt_interrupt_leave();
  314. }
  315. #endif /* BSP_USING_UART7 */
  316. static const struct gd32_uart uart_obj[] = {
  317. #ifdef BSP_USING_UART0
  318. {
  319. USART0, /* uart peripheral index */
  320. USART0_IRQn, /* uart iqrn */
  321. RCU_USART0, /* uart periph clock */
  322. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32H7xx
  323. RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */
  324. GPIOA, GPIO_AF_7, GPIO_PIN_9, /* tx port, tx alternate, tx pin */
  325. GPIOA, GPIO_AF_7, GPIO_PIN_10, /* rx port, rx alternate, rx pin */
  326. #elif defined SOC_SERIES_GD32E50x
  327. RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */
  328. GPIOA, 0, GPIO_PIN_9, /* tx port, tx alternate, tx pin */
  329. GPIOA, 0, GPIO_PIN_10, /* rx port, rx alternate, rx pin */
  330. 0, /* afio remap cfg */
  331. #elif defined SOC_SERIES_GD32E23x
  332. RCU_GPIOA, RCU_GPIOA,
  333. GPIOA, GPIO_AF_1, GPIO_PIN_9,
  334. GPIOA, GPIO_AF_1, GPIO_PIN_10,
  335. #else
  336. RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */
  337. GPIOA, GPIO_PIN_9, /* tx port, tx pin */
  338. GPIOA, GPIO_PIN_10, /* rx port, rx pin */
  339. #endif
  340. #ifdef RT_SERIAL_USING_DMA
  341. &uart0_rxdma,
  342. #ifdef RT_SERIAL_USING_TX_DMA
  343. &uart0_txdma,
  344. #endif
  345. #endif
  346. &serial0,
  347. "uart0",
  348. },
  349. #endif
  350. #ifdef BSP_USING_UART1
  351. {
  352. USART1, /* uart peripheral index */
  353. USART1_IRQn, /* uart iqrn */
  354. RCU_USART1, /* uart periph clock */
  355. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx
  356. RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */
  357. GPIOA, GPIO_AF_7, GPIO_PIN_2, /* tx port, tx alternate, tx pin */
  358. GPIOA, GPIO_AF_7, GPIO_PIN_3, /* rx port, rx alternate, rx pin */
  359. #elif defined SOC_SERIES_GD32E50x
  360. RCU_GPIOA, RCU_GPIOA, /* tx gpio clock, rx gpio clock */
  361. GPIOA, 0, GPIO_PIN_2, /* tx port, tx alternate, tx pin */
  362. GPIOA, 0, GPIO_PIN_3, /* rx port, rx alternate, rx pin */
  363. 0, /* afio remap cfg */
  364. #elif defined SOC_SERIES_GD32E23x
  365. RCU_GPIOA, RCU_GPIOA,
  366. GPIOA, GPIO_AF_1, GPIO_PIN_14,
  367. GPIOA, GPIO_AF_1, GPIO_PIN_15,
  368. #else
  369. RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */
  370. GPIOA, GPIO_PIN_2, /* tx port, tx pin */
  371. RCU_GPIOA, RCU_GPIOA, /* periph clock, tx gpio clock, rt gpio clock */
  372. GPIOA, GPIO_PIN_2, /* tx port, tx pin */
  373. GPIOA, GPIO_PIN_3, /* rx port, rx pin */
  374. #endif
  375. #ifdef RT_SERIAL_USING_DMA
  376. &uart1_rxdma,
  377. #endif
  378. &serial1,
  379. "uart1",
  380. },
  381. #endif
  382. #ifdef BSP_USING_UART2
  383. {
  384. USART2, /* uart peripheral index */
  385. USART2_IRQn, /* uart iqrn */
  386. RCU_USART2, /* uart periph clock */
  387. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32H7xx || defined SOC_SERIES_GD32F5xx
  388. RCU_GPIOB, RCU_GPIOB, /* tx gpio clock, rt gpio clock */
  389. GPIOB, GPIO_AF_7, GPIO_PIN_10, /* tx port, tx alternate, tx pin */
  390. GPIOB, GPIO_AF_7, GPIO_PIN_11, /* rx port, rx alternate, rx pin */
  391. #elif defined SOC_SERIES_GD32E50x
  392. RCU_GPIOB, RCU_GPIOB, /* tx gpio clock, rx gpio clock */
  393. GPIOB, 0, GPIO_PIN_10, /* tx port, tx alternate, tx pin */
  394. GPIOB, 0, GPIO_PIN_11, /* rx port, rx alternate, rx pin */
  395. 0, /* afio remap cfg */
  396. #else
  397. RCU_GPIOB, RCU_GPIOB, /* tx gpio clock, rt gpio clock */
  398. GPIOB, GPIO_PIN_10, /* tx port, tx pin */
  399. GPIOB, GPIO_PIN_11, /* rx port, rx pin */
  400. #endif
  401. #ifdef RT_SERIAL_USING_DMA
  402. &uart2_rxdma,
  403. #ifdef RT_SERIAL_USING_TX_DMA
  404. &uart2_txdma,
  405. #endif
  406. #endif
  407. &serial2,
  408. "uart2",
  409. },
  410. #endif
  411. #ifdef BSP_USING_UART3
  412. {
  413. UART3, /* uart peripheral index */
  414. UART3_IRQn, /* uart iqrn */
  415. RCU_UART3, /* uart periph clock */
  416. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32H7xx
  417. RCU_GPIOC, RCU_GPIOC, /* tx gpio clock, rt gpio clock */
  418. GPIOC, GPIO_AF_8, GPIO_PIN_10, /* tx port, tx alternate, tx pin */
  419. GPIOC, GPIO_AF_8, GPIO_PIN_11, /* rx port, rx alternate, rx pin */
  420. #elif defined SOC_SERIES_GD32E50x
  421. RCU_GPIOC, RCU_GPIOC, /* tx gpio clock, rx gpio clock */
  422. GPIOC, 0, GPIO_PIN_10, /* tx port, tx alternate, tx pin */
  423. GPIOC, 0, GPIO_PIN_11, /* rx port, rx alternate, rx pin */
  424. 0, /* afio remap cfg */
  425. #else
  426. RCU_GPIOC, RCU_GPIOC, /* periph clock, tx gpio clock, rt gpio clock */
  427. GPIOC, GPIO_PIN_10, /* tx port, tx pin */
  428. GPIOC, GPIO_PIN_11, /* rx port, rx pin */
  429. #endif
  430. #ifdef RT_SERIAL_USING_DMA
  431. &uart3_rxdma,
  432. #endif
  433. &serial3,
  434. "uart3",
  435. },
  436. #endif
  437. #ifdef BSP_USING_UART4
  438. {
  439. UART4, /* uart peripheral index */
  440. UART4_IRQn, /* uart iqrn */
  441. RCU_UART4, RCU_GPIOC, RCU_GPIOD, /* periph clock, tx gpio clock, rt gpio clock */
  442. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32H7xx
  443. GPIOC, GPIO_AF_8, GPIO_PIN_12, /* tx port, tx alternate, tx pin */
  444. GPIOD, GPIO_AF_8, GPIO_PIN_2, /* rx port, rx alternate, rx pin */
  445. #elif defined SOC_SERIES_GD32E50x
  446. GPIOC, 0, GPIO_PIN_12, /* tx port, tx alternate, tx pin */
  447. GPIOD, 0, GPIO_PIN_2, /* rx port, rx alternate, rx pin */
  448. 0, /* afio remap cfg */
  449. #else
  450. GPIOC, GPIO_PIN_12, /* tx port, tx pin */
  451. GPIOD, GPIO_PIN_2, /* rx port, rx pin */
  452. #endif
  453. &serial4,
  454. "uart4",
  455. },
  456. #endif
  457. #ifdef BSP_USING_UART5
  458. {
  459. USART5, /* uart peripheral index */
  460. USART5_IRQn, /* uart iqrn */
  461. RCU_USART5, RCU_GPIOC, RCU_GPIOC, /* periph clock, tx gpio clock, rt gpio clock */
  462. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx
  463. GPIOC, GPIO_AF_8, GPIO_PIN_6, /* tx port, tx alternate, tx pin */
  464. GPIOC, GPIO_AF_8, GPIO_PIN_7, /* rx port, rx alternate, rx pin */
  465. #elif defined (SOC_SERIES_GD32H7xx)
  466. GPIOC, GPIO_AF_7, GPIO_PIN_6, /* tx port, tx alternate, tx pin */
  467. GPIOC, GPIO_AF_7, GPIO_PIN_7, /* rx port, rx alternate, rx pin */
  468. #elif defined SOC_SERIES_GD32E50x
  469. GPIOC, AFIO_PC6_USART5_CFG, GPIO_PIN_6, /* tx port, tx alternate, tx pin */
  470. GPIOC, AFIO_PC7_USART5_CFG, GPIO_PIN_7, /* rx port, rx alternate, rx pin */
  471. 0, /* afio remap cfg */
  472. #else
  473. GPIOC, GPIO_PIN_6, /* tx port, tx pin */
  474. GPIOC, GPIO_PIN_7, /* rx port, rx pin */
  475. #endif
  476. #ifdef RT_SERIAL_USING_DMA
  477. &uart5_rxdma,
  478. #endif
  479. &serial5,
  480. "uart5",
  481. },
  482. #endif
  483. #ifdef BSP_USING_UART6
  484. {
  485. UART6, /* uart peripheral index */
  486. UART6_IRQn, /* uart iqrn */
  487. RCU_UART6, RCU_GPIOE, RCU_GPIOE, /* periph clock, tx gpio clock, rt gpio clock */
  488. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx
  489. GPIOE, GPIO_AF_8, GPIO_PIN_7, /* tx port, tx alternate, tx pin */
  490. GPIOE, GPIO_AF_8, GPIO_PIN_8, /* rx port, rx alternate, rx pin */
  491. #elif defined (SOC_SERIES_GD32H7xx)
  492. GPIOE, GPIO_AF_7, GPIO_PIN_8, // tx port, tx alternate, tx pin
  493. GPIOE, GPIO_AF_7, GPIO_PIN_7, // rx port, rx alternate, rx pin
  494. #else
  495. GPIOE, GPIO_PIN_7, /* tx port, tx pin */
  496. GPIOE, GPIO_PIN_8, /* rx port, rx pin */
  497. #endif
  498. #ifdef RT_SERIAL_USING_DMA
  499. &uart6_rxdma,
  500. #endif
  501. &serial6,
  502. "uart6",
  503. },
  504. #endif
  505. #ifdef BSP_USING_UART7
  506. {
  507. UART7, /* uart peripheral index */
  508. UART7_IRQn, /* uart iqrn */
  509. RCU_UART7, RCU_GPIOE, RCU_GPIOE, /* periph clock, tx gpio clock, rt gpio clock */
  510. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32H7xx
  511. GPIOE, GPIO_AF_8, GPIO_PIN_1, /* tx port, tx alternate, tx pin */
  512. GPIOE, GPIO_AF_8, GPIO_PIN_0, /* rx port, rx alternate, rx pin */
  513. #else
  514. GPIOE, GPIO_PIN_0, /* tx port, tx pin */
  515. GPIOE, GPIO_PIN_1, /* rx port, rx pin */
  516. #endif
  517. #ifdef RT_SERIAL_USING_DMA
  518. &uart7_rxdma,
  519. #endif
  520. &serial7,
  521. "uart7",
  522. },
  523. #endif
  524. };
  525. /**
  526. * @brief UART MSP Initialization
  527. * This function configures the hardware resources used in this example:
  528. * - Peripheral's clock enable
  529. * - Peripheral's GPIO Configuration
  530. * - NVIC configuration for UART interrupt request enable
  531. * @param huart: UART handle pointer
  532. * @retval None
  533. */
  534. void gd32_uart_gpio_init(struct gd32_uart *uart)
  535. {
  536. /* enable USART clock */
  537. rcu_periph_clock_enable(uart->tx_gpio_clk);
  538. rcu_periph_clock_enable(uart->rx_gpio_clk);
  539. rcu_periph_clock_enable(uart->per_clk);
  540. #if defined SOC_SERIES_GD32F4xx || defined SOC_SERIES_GD32F5xx || defined SOC_SERIES_GD32E23x
  541. /* connect port to USARTx_Tx */
  542. gpio_af_set(uart->tx_port, uart->tx_af, uart->tx_pin);
  543. /* connect port to USARTx_Rx */
  544. gpio_af_set(uart->rx_port, uart->rx_af, uart->rx_pin);
  545. /* configure USART Tx as alternate function push-pull */
  546. gpio_mode_set(uart->tx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, uart->tx_pin);
  547. gpio_output_options_set(uart->tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, uart->tx_pin);
  548. /* configure USART Rx as alternate function push-pull */
  549. gpio_mode_set(uart->rx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, uart->rx_pin);
  550. gpio_output_options_set(uart->rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, uart->rx_pin);
  551. #elif defined SOC_SERIES_GD32H7xx
  552. /* connect port to USARTx_Tx */
  553. gpio_af_set(uart->tx_port, uart->tx_af, uart->tx_pin);
  554. /* connect port to USARTx_Rx */
  555. gpio_af_set(uart->rx_port, uart->rx_af, uart->rx_pin);
  556. /* configure USART Tx as alternate function push-pull */
  557. gpio_mode_set(uart->tx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, uart->tx_pin);
  558. gpio_output_options_set(uart->tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, uart->tx_pin);
  559. /* configure USART Rx as alternate function push-pull */
  560. gpio_mode_set(uart->rx_port, GPIO_MODE_AF, GPIO_PUPD_PULLUP, uart->rx_pin);
  561. gpio_output_options_set(uart->rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, uart->rx_pin);
  562. #elif defined SOC_SERIES_GD32E50x
  563. /* configure remap function */
  564. if (uart->uart_remap != 0 || uart->tx_af != 0 || uart->rx_af != 0)
  565. {
  566. rcu_periph_clock_enable(RCU_AF);
  567. gpio_pin_remap_config(uart->uart_remap, ENABLE);
  568. }
  569. /* connect port to USARTx_Tx */
  570. gpio_init(uart->tx_port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, uart->tx_pin);
  571. /* connect port to USARTx_Rx */
  572. gpio_init(uart->rx_port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, uart->rx_pin);
  573. /* configure alternate1 function */
  574. if (uart->tx_af != 0 || uart->rx_af != 0)
  575. {
  576. rcu_periph_clock_enable(RCU_AF);
  577. gpio_afio_port_config(uart->tx_af, ENABLE);
  578. gpio_afio_port_config(uart->rx_af, ENABLE);
  579. }
  580. #else
  581. /* connect port to USARTx_Tx */
  582. gpio_init(uart->tx_port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, uart->tx_pin);
  583. /* connect port to USARTx_Rx */
  584. gpio_init(uart->rx_port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, uart->rx_pin);
  585. #endif
  586. NVIC_SetPriority(uart->irqn, 0);
  587. NVIC_EnableIRQ(uart->irqn);
  588. }
  589. /**
  590. * @brief uart configure
  591. * @param serial, cfg
  592. * @retval None
  593. */
  594. static rt_err_t gd32_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  595. {
  596. struct gd32_uart *uart;
  597. RT_ASSERT(serial != RT_NULL);
  598. RT_ASSERT(cfg != RT_NULL);
  599. uart = (struct gd32_uart *)serial->parent.user_data;
  600. gd32_uart_gpio_init(uart);
  601. usart_baudrate_set(uart->uart_periph, cfg->baud_rate);
  602. switch (cfg->data_bits)
  603. {
  604. case DATA_BITS_9:
  605. usart_word_length_set(uart->uart_periph, USART_WL_9BIT);
  606. break;
  607. default:
  608. usart_word_length_set(uart->uart_periph, USART_WL_8BIT);
  609. break;
  610. }
  611. switch (cfg->stop_bits)
  612. {
  613. case STOP_BITS_2:
  614. usart_stop_bit_set(uart->uart_periph, USART_STB_2BIT);
  615. break;
  616. default:
  617. usart_stop_bit_set(uart->uart_periph, USART_STB_1BIT);
  618. break;
  619. }
  620. switch (cfg->parity)
  621. {
  622. case PARITY_ODD:
  623. usart_parity_config(uart->uart_periph, USART_PM_ODD);
  624. break;
  625. case PARITY_EVEN:
  626. usart_parity_config(uart->uart_periph, USART_PM_EVEN);
  627. break;
  628. default:
  629. usart_parity_config(uart->uart_periph, USART_PM_NONE);
  630. break;
  631. }
  632. usart_receive_config(uart->uart_periph, USART_RECEIVE_ENABLE);
  633. usart_transmit_config(uart->uart_periph, USART_TRANSMIT_ENABLE);
  634. usart_enable(uart->uart_periph);
  635. return RT_EOK;
  636. }
  637. /**
  638. * @brief uart control
  639. * @param serial, arg
  640. * @retval None
  641. */
  642. static rt_err_t gd32_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
  643. {
  644. struct gd32_uart *uart;
  645. #ifdef RT_SERIAL_USING_DMA
  646. rt_ubase_t ctrl_arg = (rt_ubase_t)arg;
  647. #endif
  648. RT_ASSERT(serial != RT_NULL);
  649. uart = (struct gd32_uart *)serial->parent.user_data;
  650. switch (cmd)
  651. {
  652. case RT_DEVICE_CTRL_CLR_INT:
  653. /* disable rx irq */
  654. NVIC_DisableIRQ(uart->irqn);
  655. /* disable interrupt */
  656. usart_interrupt_disable(uart->uart_periph, USART_INT_RBNE);
  657. #ifdef RT_SERIAL_USING_DMA
  658. /* disable DMA */
  659. if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) {
  660. nvic_irq_disable(uart->uart_dma->rx_irq_ch);
  661. /* disable interrupt */
  662. usart_interrupt_disable(uart->uart_periph, USART_INT_IDLE);
  663. dma_channel_disable(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  664. usart_dma_receive_config(uart->uart_periph, USART_RECEIVE_DMA_DISABLE);
  665. dma_deinit(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  666. uart->uart_dma->last_recv_index = 0;
  667. }
  668. #ifdef RT_SERIAL_USING_TX_DMA
  669. else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) {
  670. nvic_irq_disable(uart->uart_tx_dma->rx_irq_ch);
  671. dma_channel_disable(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch);
  672. usart_dma_transmit_config(uart->uart_periph, USART_TRANSMIT_DMA_DISABLE);
  673. dma_deinit(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch);
  674. }
  675. #endif
  676. #endif
  677. break;
  678. case RT_DEVICE_CTRL_SET_INT:
  679. /* enable rx irq */
  680. NVIC_EnableIRQ(uart->irqn);
  681. usart_flag_clear(uart->uart_periph, USART_FLAG_RBNE);
  682. /* enable interrupt */
  683. usart_interrupt_enable(uart->uart_periph, USART_INT_RBNE);
  684. break;
  685. #ifdef RT_SERIAL_USING_DMA
  686. case RT_DEVICE_CTRL_CONFIG:
  687. if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) {
  688. gd32_dma_config(serial, ctrl_arg);
  689. }
  690. #ifdef RT_SERIAL_USING_TX_DMA
  691. else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) {
  692. gd32_dma_tx_config(serial, ctrl_arg);
  693. }
  694. #endif
  695. break;
  696. #endif
  697. case RT_DEVICE_CTRL_CLOSE:
  698. usart_disable(uart->uart_periph);
  699. break;
  700. }
  701. return RT_EOK;
  702. }
  703. /**
  704. * @brief uart put char
  705. * @param serial, ch
  706. * @retval None
  707. */
  708. static int gd32_uart_putc(struct rt_serial_device *serial, char ch)
  709. {
  710. struct gd32_uart *uart;
  711. RT_ASSERT(serial != RT_NULL);
  712. uart = (struct gd32_uart *)serial->parent.user_data;
  713. usart_data_transmit(uart->uart_periph, ch);
  714. while((usart_flag_get(uart->uart_periph, USART_FLAG_TBE) == RESET));
  715. return RT_EOK;
  716. }
  717. /**
  718. * @brief uart get char
  719. * @param serial
  720. * @retval None
  721. */
  722. static int gd32_uart_getc(struct rt_serial_device *serial)
  723. {
  724. int ch;
  725. struct gd32_uart *uart;
  726. RT_ASSERT(serial != RT_NULL);
  727. uart = (struct gd32_uart *)serial->parent.user_data;
  728. ch = -1;
  729. if (usart_flag_get(uart->uart_periph, USART_FLAG_RBNE) != RESET)
  730. ch = usart_data_receive(uart->uart_periph);
  731. return ch;
  732. }
  733. #ifdef RT_SERIAL_USING_DMA
  734. static void dma_uart_config(struct rt_serial_device *serial, uint32_t setting_recv_len,
  735. void *mem_base_addr)
  736. {
  737. struct gd32_uart *uart = (struct gd32_uart *) serial->parent.user_data;
  738. dma_single_data_parameter_struct dma_init_struct;
  739. /* rx dma config */
  740. uart->uart_dma->setting_recv_len = setting_recv_len;
  741. dma_deinit(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  742. dma_single_data_para_struct_init(&dma_init_struct);
  743. dma_init_struct.request = uart->uart_dma->dma_mux_req_rx;
  744. dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
  745. dma_init_struct.memory0_addr = (uint32_t)mem_base_addr;
  746. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  747. dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
  748. dma_init_struct.number = uart->uart_dma->setting_recv_len;
  749. dma_init_struct.periph_addr = (uint32_t) &(USART_RDATA(uart->uart_periph));
  750. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  751. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  752. dma_single_data_mode_init(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch, &dma_init_struct);
  753. /* configure DMA mode */
  754. dma_circulation_disable(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  755. dma_flag_clear(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch, uart->uart_dma->rx_flag);
  756. dma_interrupt_enable(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch, DMA_CHXCTL_FTFIE);
  757. }
  758. static void gd32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
  759. {
  760. dma_single_data_parameter_struct dma_init_struct;
  761. struct gd32_uart *uart = (struct gd32_uart *) serial->parent.user_data;
  762. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  763. /* wait IDLEF set and clear it */
  764. while(RESET == usart_flag_get(uart->uart_periph, USART_FLAG_IDLE)) {
  765. rt_thread_mdelay(10);
  766. }
  767. usart_flag_clear(uart->uart_periph, USART_FLAG_IDLE);
  768. /* enable transmit idle interrupt */
  769. usart_interrupt_enable(uart->uart_periph, USART_INT_IDLE);
  770. /* DMA clock enable */
  771. if(DMA0 == uart->uart_dma->dma_periph) {
  772. rcu_periph_clock_enable(RCU_DMA0);
  773. } else if(DMA1 == uart->uart_dma->dma_periph) {
  774. rcu_periph_clock_enable(RCU_DMA1);
  775. } else {
  776. Error_Handler();
  777. }
  778. /* enable DMAMUX clock */
  779. rcu_periph_clock_enable(RCU_DMAMUX);
  780. #ifdef RT_USING_CACHE
  781. /* clean d-cache */
  782. rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, rx_fifo->buffer, serial->config.bufsz);
  783. #endif
  784. /* rx dma config */
  785. dma_uart_config(serial, serial->config.bufsz, rx_fifo->buffer);
  786. usart_dma_receive_config(uart->uart_periph, USART_RECEIVE_DMA_ENABLE);
  787. dma_channel_enable(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  788. /* rx dma interrupt config */
  789. nvic_irq_enable(uart->uart_dma->rx_irq_ch, 1, 0);
  790. }
  791. #ifdef RT_SERIAL_USING_TX_DMA
  792. static void gd32_dma_tx_config(struct rt_serial_device *serial, rt_ubase_t flag)
  793. {
  794. dma_single_data_parameter_struct dma_init_struct;
  795. struct gd32_uart *uart = (struct gd32_uart *) serial->parent.user_data;
  796. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  797. /* DMA clock enable */
  798. if(DMA0 == uart->uart_tx_dma->dma_periph) {
  799. rcu_periph_clock_enable(RCU_DMA0);
  800. } else if(DMA1 == uart->uart_tx_dma->dma_periph) {
  801. rcu_periph_clock_enable(RCU_DMA1);
  802. } else {
  803. Error_Handler();
  804. }
  805. /* enable DMAMUX clock */
  806. rcu_periph_clock_enable(RCU_DMAMUX);
  807. #ifdef RT_USING_CACHE
  808. /* clean d-cache */
  809. rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, rx_fifo->buffer, serial->config.bufsz);
  810. #endif
  811. /* tx dma config */
  812. uart->uart_tx_dma->setting_recv_len = 0;
  813. dma_deinit(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch);
  814. dma_single_data_para_struct_init(&dma_init_struct);
  815. dma_init_struct.request = uart->uart_tx_dma->dma_mux_req_rx;
  816. dma_init_struct.direction = DMA_MEMORY_TO_PERIPH;
  817. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  818. dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;
  819. dma_init_struct.periph_addr = (uint32_t) &(USART_TDATA(uart->uart_periph));
  820. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  821. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  822. dma_single_data_mode_init(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch, &dma_init_struct);
  823. /* configure DMA mode */
  824. dma_circulation_disable(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch);
  825. }
  826. #ifdef RT_USING_CACHE
  827. #ifdef BSP_SCB_ENABLE_D_CACHE
  828. static uint8_t dma_buf_cache_pre_bk[32] = {0};
  829. static uint8_t dma_buf_cache_post_bk[32] = {0};
  830. #endif
  831. #endif
  832. static rt_ssize_t gd32_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction)
  833. {
  834. struct gd32_uart *uart;
  835. RT_ASSERT(serial != RT_NULL);
  836. RT_ASSERT(buf != RT_NULL);
  837. uart = (struct gd32_uart *) serial->parent.user_data;
  838. if (size == 0)
  839. {
  840. return 0;
  841. }
  842. if (RT_SERIAL_DMA_TX == direction)
  843. {
  844. #ifdef RT_USING_CACHE
  845. #ifdef BSP_SCB_ENABLE_D_CACHE
  846. uint32_t *dma_cache_pre_ptr = NULL, *dma_cache_post_ptr = NULL;
  847. uint32_t pre_size = (rt_uint32_t)buf & (rt_uint32_t)0x1F;
  848. dma_cache_pre_ptr = (uint32_t *)((uint32_t)buf - pre_size);
  849. rt_memcpy(dma_buf_cache_pre_bk, dma_cache_pre_ptr, pre_size);
  850. dma_cache_post_ptr = (uint32_t *)((uint32_t)buf + size);
  851. rt_memcpy(dma_buf_cache_post_bk, dma_cache_post_ptr, sizeof(dma_buf_cache_post_bk));
  852. /* invalidate d-cache */
  853. rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, buf, size);
  854. rt_memcpy(dma_cache_pre_ptr, dma_buf_cache_pre_bk, pre_size);
  855. rt_memcpy(dma_cache_post_ptr, dma_buf_cache_post_bk, sizeof(dma_buf_cache_post_bk));
  856. #endif
  857. #endif
  858. dma_memory_address_config(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch, DMA_MEMORY_0, (uint32_t)buf);
  859. dma_transfer_number_config(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch, size);
  860. dma_flag_clear(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch, uart->uart_tx_dma->rx_flag);
  861. dma_interrupt_enable(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch, DMA_CHXCTL_FTFIE);
  862. usart_flag_clear(uart->uart_periph, USART_FLAG_TBE);
  863. usart_flag_clear(uart->uart_periph, USART_FLAG_TC);
  864. /* enable transmit idle interrupt */
  865. usart_interrupt_enable(uart->uart_periph, USART_INT_TC);
  866. usart_dma_transmit_config(uart->uart_periph, USART_TRANSMIT_DMA_ENABLE);
  867. /* rx dma interrupt config */
  868. nvic_irq_enable(uart->uart_tx_dma->rx_irq_ch, 1, 0);
  869. dma_channel_enable(uart->uart_tx_dma->dma_periph, uart->uart_tx_dma->dma_ch);
  870. }
  871. return 0;
  872. }
  873. #endif
  874. #ifdef RT_USING_CACHE
  875. static struct rt_serial_rx_fifo rx_fifo_cahce_bk = {0};
  876. static uint8_t rx_fifo_buf_cache_bk[32] = {0};
  877. #endif
  878. /**
  879. * Serial port receive idle process. This need add to uart idle ISR.
  880. *
  881. * @param serial serial device
  882. */
  883. static void dma_uart_rx_idle_isr(struct rt_serial_device *serial)
  884. {
  885. struct gd32_uart *uart = (struct gd32_uart *) serial->parent.user_data;
  886. rt_size_t recv_total_index, recv_len;
  887. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  888. #ifdef RT_USING_CACHE
  889. uint32_t *rx_fifo_end_ptr = NULL;
  890. rx_fifo_end_ptr = (uint32_t *)((uint32_t)rx_fifo->buffer + serial->config.bufsz);
  891. rt_memcpy(&rx_fifo_cahce_bk, rx_fifo, sizeof(rx_fifo_cahce_bk));
  892. rt_memcpy(rx_fifo_buf_cache_bk, rx_fifo_end_ptr, sizeof(rx_fifo_buf_cache_bk));
  893. /* invalidate d-cache */
  894. rt_hw_cpu_dcache_ops(RT_HW_CACHE_INVALIDATE, rx_fifo->buffer, serial->config.bufsz);
  895. rt_memcpy(rx_fifo, &rx_fifo_cahce_bk, sizeof(rx_fifo_cahce_bk));
  896. rt_memcpy(rx_fifo_end_ptr, rx_fifo_buf_cache_bk, sizeof(rx_fifo_buf_cache_bk));
  897. #endif
  898. recv_total_index = uart->uart_dma->setting_recv_len -
  899. dma_transfer_number_get(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  900. if (recv_total_index >= uart->uart_dma->last_recv_index) {
  901. recv_len = recv_total_index - uart->uart_dma->last_recv_index;
  902. } else {
  903. recv_len = uart->uart_dma->setting_recv_len - uart->uart_dma->last_recv_index + recv_total_index;
  904. }
  905. uart->uart_dma->last_recv_index = recv_total_index;
  906. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  907. /* read a data for clear receive idle interrupt flag */
  908. usart_data_receive(uart->uart_periph);
  909. usart_flag_clear(uart->uart_periph, USART_FLAG_IDLE);
  910. }
  911. /**
  912. * DMA receive done process. This need add to DMA receive done ISR.
  913. *
  914. * @param serial serial device
  915. */
  916. static void dma_rx_done_isr(struct rt_serial_device *serial)
  917. {
  918. struct gd32_uart *uart = (struct gd32_uart *) serial->parent.user_data;
  919. rt_size_t recv_total_index, recv_len;
  920. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  921. #ifdef RT_USING_CACHE
  922. uint32_t *rx_fifo_end_ptr = NULL;
  923. rx_fifo_end_ptr = (uint32_t *)((uint32_t)rx_fifo->buffer+serial->config.bufsz);
  924. rt_memcpy(&rx_fifo_cahce_bk, rx_fifo, sizeof(rx_fifo_cahce_bk));
  925. rt_memcpy(rx_fifo_buf_cache_bk, rx_fifo_end_ptr, sizeof(rx_fifo_buf_cache_bk));
  926. /* invalidate d-cache */
  927. rt_hw_cpu_dcache_ops(RT_HW_CACHE_INVALIDATE, rx_fifo->buffer, serial->config.bufsz);
  928. rt_memcpy(rx_fifo, &rx_fifo_cahce_bk, sizeof(rx_fifo_cahce_bk));
  929. rt_memcpy(rx_fifo_end_ptr, rx_fifo_buf_cache_bk, sizeof(rx_fifo_buf_cache_bk));
  930. #endif
  931. if (dma_flag_get(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch, uart->uart_dma->rx_flag) != RESET) {
  932. /* disable dma, stop receive data */
  933. dma_channel_disable(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  934. recv_total_index = uart->uart_dma->setting_recv_len -
  935. dma_transfer_number_get(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  936. if (recv_total_index >= uart->uart_dma->last_recv_index) {
  937. recv_len = recv_total_index - uart->uart_dma->last_recv_index;
  938. } else {
  939. recv_len = uart->uart_dma->setting_recv_len - uart->uart_dma->last_recv_index + recv_total_index;
  940. uart->uart_dma->last_recv_index = recv_total_index;
  941. }
  942. uart->uart_dma->last_recv_index = recv_total_index;
  943. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  944. /* start receive data */
  945. dma_flag_clear(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch, uart->uart_dma->rx_flag);
  946. dma_channel_enable(uart->uart_dma->dma_periph, uart->uart_dma->dma_ch);
  947. }
  948. }
  949. #endif /* RT_SERIAL_USING_DMA */
  950. /**
  951. * Uart common interrupt process. This need add to uart ISR.
  952. *
  953. * @param serial serial device
  954. */
  955. static void GD32_UART_IRQHandler(struct rt_serial_device *serial)
  956. {
  957. struct gd32_uart *uart = (struct gd32_uart *) serial->parent.user_data;
  958. RT_ASSERT(uart != RT_NULL);
  959. /* UART in mode Receiver -------------------------------------------------*/
  960. if ((usart_interrupt_flag_get(uart->uart_periph, USART_INT_FLAG_RBNE) != RESET) &&
  961. (usart_flag_get(uart->uart_periph, USART_FLAG_RBNE) != RESET))
  962. {
  963. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  964. /* Clear RXNE interrupt flag */
  965. usart_flag_clear(uart->uart_periph, USART_FLAG_RBNE);
  966. }
  967. #ifdef RT_SERIAL_USING_DMA
  968. if(usart_interrupt_flag_get(uart->uart_periph, USART_INT_FLAG_IDLE) != RESET)
  969. {
  970. dma_uart_rx_idle_isr(serial);
  971. }
  972. #endif
  973. if (usart_interrupt_flag_get(uart->uart_periph, USART_INT_FLAG_TC) != RESET)
  974. {
  975. /* clear interrupt */
  976. usart_flag_clear(uart->uart_periph, USART_FLAG_TC);
  977. usart_interrupt_disable(uart->uart_periph, USART_INT_TC);
  978. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
  979. }
  980. if (usart_flag_get(uart->uart_periph, USART_FLAG_ORERR) == SET)
  981. {
  982. usart_flag_clear(uart->uart_periph, USART_FLAG_ORERR);
  983. }
  984. }
  985. static const struct rt_uart_ops gd32_uart_ops =
  986. {
  987. .configure = gd32_uart_configure,
  988. .control = gd32_uart_control,
  989. .putc = gd32_uart_putc,
  990. .getc = gd32_uart_getc,
  991. #ifndef RT_SERIAL_USING_TX_DMA
  992. NULL,
  993. #else
  994. .dma_transmit = gd32_dma_transmit,
  995. #endif
  996. };
  997. /**
  998. * @brief uart init
  999. * @param None
  1000. * @retval None
  1001. */
  1002. int rt_hw_usart_init(void)
  1003. {
  1004. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  1005. int i;
  1006. int result;
  1007. rt_uint32_t flag = 0;
  1008. for (i = 0; i < sizeof(uart_obj) / sizeof(uart_obj[0]); i++)
  1009. {
  1010. uart_obj[i].serial->ops = &gd32_uart_ops;
  1011. uart_obj[i].serial->config = config;
  1012. flag = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX;
  1013. #if defined(RT_SERIAL_USING_DMA)
  1014. flag |= RT_DEVICE_FLAG_DMA_RX;
  1015. #if defined(RT_SERIAL_USING_TX_DMA)
  1016. flag |= RT_DEVICE_FLAG_DMA_TX;
  1017. #endif
  1018. #endif
  1019. /* register UART1 device */
  1020. result = rt_hw_serial_register(uart_obj[i].serial,
  1021. uart_obj[i].device_name,
  1022. flag,
  1023. (void *)&uart_obj[i]);
  1024. RT_ASSERT(result == RT_EOK);
  1025. }
  1026. return result;
  1027. }
  1028. #endif