drv_usart_v2.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-02-23 Jonas first version
  9. * 2023-04-16 shelton update for perfection of drv_usart_v2
  10. * 2023-11-16 shelton add support at32f402/405 series
  11. * 2024-04-12 shelton add support a403a and a423
  12. * 2024-08-30 shelton add support m412 and m416
  13. */
  14. #include "drv_common.h"
  15. #include "drv_usart_v2.h"
  16. #include "drv_config.h"
  17. #ifdef RT_USING_SERIAL_V2
  18. #if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && \
  19. !defined(BSP_USING_UART3) && !defined(BSP_USING_UART4) && \
  20. !defined(BSP_USING_UART5) && !defined(BSP_USING_UART6) && \
  21. !defined(BSP_USING_UART7) && !defined(BSP_USING_UART8)
  22. #error "Please define at least one BSP_USING_UARTx"
  23. #endif
  24. enum {
  25. #ifdef BSP_USING_UART1
  26. UART1_INDEX,
  27. #endif
  28. #ifdef BSP_USING_UART2
  29. UART2_INDEX,
  30. #endif
  31. #ifdef BSP_USING_UART3
  32. UART3_INDEX,
  33. #endif
  34. #ifdef BSP_USING_UART4
  35. UART4_INDEX,
  36. #endif
  37. #ifdef BSP_USING_UART5
  38. UART5_INDEX,
  39. #endif
  40. #ifdef BSP_USING_UART6
  41. UART6_INDEX,
  42. #endif
  43. #ifdef BSP_USING_UART7
  44. UART7_INDEX,
  45. #endif
  46. #ifdef BSP_USING_UART8
  47. UART8_INDEX,
  48. #endif
  49. };
  50. static struct at32_uart uart_config[] = {
  51. #ifdef BSP_USING_UART1
  52. UART1_CONFIG,
  53. #endif
  54. #ifdef BSP_USING_UART2
  55. UART2_CONFIG,
  56. #endif
  57. #ifdef BSP_USING_UART3
  58. UART3_CONFIG,
  59. #endif
  60. #ifdef BSP_USING_UART4
  61. UART4_CONFIG,
  62. #endif
  63. #ifdef BSP_USING_UART5
  64. UART5_CONFIG,
  65. #endif
  66. #ifdef BSP_USING_UART6
  67. UART6_CONFIG,
  68. #endif
  69. #ifdef BSP_USING_UART7
  70. UART7_CONFIG,
  71. #endif
  72. #ifdef BSP_USING_UART8
  73. UART8_CONFIG,
  74. #endif
  75. };
  76. #ifdef RT_SERIAL_USING_DMA
  77. static void at32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag);
  78. #endif
  79. static rt_err_t at32_configure(struct rt_serial_device *serial,
  80. struct serial_configure *cfg) {
  81. usart_data_bit_num_type data_bit;
  82. usart_stop_bit_num_type stop_bit;
  83. usart_parity_selection_type parity_mode;
  84. usart_hardware_flow_control_type flow_control;
  85. RT_ASSERT(serial != RT_NULL);
  86. RT_ASSERT(cfg != RT_NULL);
  87. struct at32_uart *instance = rt_container_of(serial, struct at32_uart, serial);
  88. RT_ASSERT(instance != RT_NULL);
  89. at32_msp_usart_init((void *)instance->uart_x);
  90. usart_receiver_enable(instance->uart_x, TRUE);
  91. usart_transmitter_enable(instance->uart_x, TRUE);
  92. switch (cfg->data_bits) {
  93. case DATA_BITS_8:
  94. data_bit = USART_DATA_8BITS;
  95. break;
  96. case DATA_BITS_9:
  97. data_bit = USART_DATA_9BITS;
  98. break;
  99. default:
  100. data_bit = USART_DATA_8BITS;
  101. break;
  102. }
  103. switch (cfg->stop_bits) {
  104. case STOP_BITS_1:
  105. stop_bit = USART_STOP_1_BIT;
  106. break;
  107. case STOP_BITS_2:
  108. stop_bit = USART_STOP_2_BIT;
  109. break;
  110. default:
  111. stop_bit = USART_STOP_1_BIT;
  112. break;
  113. }
  114. switch (cfg->parity) {
  115. case PARITY_NONE:
  116. parity_mode = USART_PARITY_NONE;
  117. break;
  118. case PARITY_ODD:
  119. parity_mode = USART_PARITY_ODD;
  120. break;
  121. case PARITY_EVEN:
  122. parity_mode = USART_PARITY_EVEN;
  123. break;
  124. default:
  125. parity_mode = USART_PARITY_NONE;
  126. break;
  127. }
  128. switch (cfg->flowcontrol) {
  129. case RT_SERIAL_FLOWCONTROL_NONE:
  130. flow_control = USART_HARDWARE_FLOW_NONE;
  131. break;
  132. case RT_SERIAL_FLOWCONTROL_CTSRTS:
  133. flow_control = USART_HARDWARE_FLOW_RTS_CTS;
  134. break;
  135. default:
  136. flow_control = USART_HARDWARE_FLOW_NONE;
  137. break;
  138. }
  139. #ifdef RT_SERIAL_USING_DMA
  140. if (!(serial->parent.open_flag & RT_DEVICE_OFLAG_OPEN)) {
  141. instance->last_index = serial->config.rx_bufsz;
  142. }
  143. #endif
  144. usart_hardware_flow_control_set(instance->uart_x, flow_control);
  145. usart_parity_selection_config(instance->uart_x, parity_mode);
  146. usart_init(instance->uart_x, cfg->baud_rate, data_bit, stop_bit);
  147. usart_enable(instance->uart_x, TRUE);
  148. return RT_EOK;
  149. }
  150. static rt_err_t at32_control(struct rt_serial_device *serial, int cmd, void *arg) {
  151. struct at32_uart *instance;
  152. rt_ubase_t ctrl_arg = (rt_ubase_t)arg;
  153. RT_ASSERT(serial != RT_NULL);
  154. instance = rt_container_of(serial, struct at32_uart, serial);
  155. RT_ASSERT(instance != RT_NULL);
  156. if (ctrl_arg & (RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING))
  157. {
  158. if (instance->uart_dma_flag & RT_DEVICE_FLAG_DMA_RX)
  159. ctrl_arg = RT_DEVICE_FLAG_DMA_RX;
  160. else
  161. ctrl_arg = RT_DEVICE_FLAG_INT_RX;
  162. }
  163. else if (ctrl_arg & (RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING))
  164. {
  165. if (instance->uart_dma_flag & RT_DEVICE_FLAG_DMA_TX)
  166. ctrl_arg = RT_DEVICE_FLAG_DMA_TX;
  167. else
  168. ctrl_arg = RT_DEVICE_FLAG_INT_TX;
  169. }
  170. switch (cmd) {
  171. case RT_DEVICE_CTRL_CLR_INT:
  172. nvic_irq_disable(instance->irqn);
  173. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX)
  174. usart_interrupt_enable(instance->uart_x, USART_RDBF_INT, FALSE);
  175. else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX)
  176. usart_interrupt_enable(instance->uart_x, USART_TDBE_INT, FALSE);
  177. #ifdef RT_SERIAL_USING_DMA
  178. else if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX)
  179. {
  180. usart_interrupt_enable(instance->uart_x, USART_RDBF_INT, FALSE);
  181. nvic_irq_disable(instance->dma_rx->dma_irqn);
  182. dma_reset(instance->dma_rx->dma_channel);
  183. }
  184. else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX)
  185. {
  186. usart_interrupt_enable(instance->uart_x, USART_TDBE_INT, FALSE);
  187. nvic_irq_disable(instance->dma_tx->dma_irqn);
  188. dma_reset(instance->dma_tx->dma_channel);
  189. }
  190. #endif
  191. break;
  192. case RT_DEVICE_CTRL_SET_INT:
  193. nvic_irq_enable(instance->irqn, 1, 0);
  194. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX)
  195. usart_interrupt_enable(instance->uart_x, USART_RDBF_INT, TRUE);
  196. else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX)
  197. usart_interrupt_enable(instance->uart_x, USART_TDBE_INT, TRUE);
  198. break;
  199. case RT_DEVICE_CTRL_CONFIG:
  200. if(ctrl_arg & (RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX))
  201. {
  202. #ifdef RT_SERIAL_USING_DMA
  203. at32_dma_config(serial, ctrl_arg);
  204. #endif
  205. }
  206. else
  207. at32_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)ctrl_arg);
  208. break;
  209. case RT_DEVICE_CHECK_OPTMODE:
  210. {
  211. if(ctrl_arg & RT_DEVICE_FLAG_DMA_TX)
  212. return RT_SERIAL_TX_BLOCKING_NO_BUFFER;
  213. else
  214. return RT_SERIAL_TX_BLOCKING_BUFFER;
  215. }
  216. case RT_DEVICE_CTRL_CLOSE:
  217. usart_reset(instance->uart_x);
  218. break;
  219. }
  220. return RT_EOK;
  221. }
  222. static int at32_putc(struct rt_serial_device *serial, char ch) {
  223. struct at32_uart *instance;
  224. RT_ASSERT(serial != RT_NULL);
  225. instance = rt_container_of(serial, struct at32_uart, serial);
  226. RT_ASSERT(instance != RT_NULL);
  227. usart_data_transmit(instance->uart_x, (uint8_t)ch);
  228. while (usart_flag_get(instance->uart_x, USART_TDC_FLAG) == RESET);
  229. return 1;
  230. }
  231. static int at32_getc(struct rt_serial_device *serial) {
  232. int ch;
  233. struct at32_uart *instance;
  234. RT_ASSERT(serial != RT_NULL);
  235. instance = rt_container_of(serial, struct at32_uart, serial);
  236. RT_ASSERT(instance != RT_NULL);
  237. ch = -1;
  238. if (usart_flag_get(instance->uart_x, USART_RDBF_FLAG) != RESET) {
  239. ch = usart_data_receive(instance->uart_x) & 0xff;
  240. }
  241. return ch;
  242. }
  243. #ifdef RT_SERIAL_USING_DMA
  244. static void _uart_dma_receive(struct at32_uart *instance, rt_uint8_t *buffer, rt_uint32_t size)
  245. {
  246. dma_channel_type* dma_channel = instance->dma_rx->dma_channel;
  247. dma_channel->dtcnt = size;
  248. dma_channel->paddr = (rt_uint32_t)&(instance->uart_x->dt);
  249. dma_channel->maddr = (rt_uint32_t)buffer;
  250. /* enable usart interrupt */
  251. usart_interrupt_enable(instance->uart_x, USART_PERR_INT, TRUE);
  252. usart_interrupt_enable(instance->uart_x, USART_IDLE_INT, TRUE);
  253. /* enable transmit complete interrupt */
  254. dma_interrupt_enable(dma_channel, DMA_FDT_INT, TRUE);
  255. /* enable dma receive */
  256. usart_dma_receiver_enable(instance->uart_x, TRUE);
  257. /* enable dma channel */
  258. dma_channel_enable(dma_channel, TRUE);
  259. }
  260. static void _uart_dma_transmit(struct at32_uart *instance, rt_uint8_t *buffer, rt_uint32_t size)
  261. {
  262. /* wait before transfer complete */
  263. while(instance->dma_tx->dma_done == RT_FALSE);
  264. dma_channel_type *dma_channel = instance->dma_tx->dma_channel;
  265. dma_channel->dtcnt = size;
  266. dma_channel->paddr = (rt_uint32_t)&(instance->uart_x->dt);
  267. dma_channel->maddr = (rt_uint32_t)buffer;
  268. /* enable transmit complete interrupt */
  269. dma_interrupt_enable(dma_channel, DMA_FDT_INT, TRUE);
  270. /* enable dma transmit */
  271. usart_dma_transmitter_enable(instance->uart_x, TRUE);
  272. /* mark dma flag */
  273. instance->dma_tx->dma_done = RT_FALSE;
  274. /* enable dma channel */
  275. dma_channel_enable(dma_channel, TRUE);
  276. }
  277. static void at32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
  278. {
  279. dma_init_type dma_init_struct;
  280. dma_channel_type *dma_channel = NULL;
  281. struct rt_serial_rx_fifo *rx_fifo;
  282. struct at32_uart *instance;
  283. struct dma_config *dma_config;
  284. RT_ASSERT(serial != RT_NULL);
  285. instance = rt_container_of(serial, struct at32_uart, serial);
  286. RT_ASSERT(instance != RT_NULL);
  287. RT_ASSERT(flag == RT_DEVICE_FLAG_DMA_TX || flag == RT_DEVICE_FLAG_DMA_RX);
  288. if (RT_DEVICE_FLAG_DMA_RX == flag)
  289. {
  290. dma_channel = instance->dma_rx->dma_channel;
  291. dma_config = instance->dma_rx;
  292. }
  293. else /* RT_DEVICE_FLAG_DMA_TX == flag */
  294. {
  295. dma_channel = instance->dma_tx->dma_channel;
  296. dma_config = instance->dma_tx;
  297. }
  298. crm_periph_clock_enable(dma_config->dma_clock, TRUE);
  299. dma_default_para_init(&dma_init_struct);
  300. dma_init_struct.peripheral_inc_enable = FALSE;
  301. dma_init_struct.memory_inc_enable = TRUE;
  302. dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
  303. dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
  304. dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  305. if (RT_DEVICE_FLAG_DMA_RX == flag)
  306. {
  307. dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  308. dma_init_struct.loop_mode_enable = TRUE;
  309. }
  310. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  311. {
  312. dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
  313. dma_init_struct.loop_mode_enable = FALSE;
  314. }
  315. dma_reset(dma_channel);
  316. dma_init(dma_channel, &dma_init_struct);
  317. #if defined (SOC_SERIES_AT32F425)
  318. dma_flexible_config(dma_config->dma_x, dma_config->flex_channel, \
  319. (dma_flexible_request_type)dma_config->request_id);
  320. #endif
  321. #if defined (SOC_SERIES_AT32F435) || defined (SOC_SERIES_AT32F437) || \
  322. defined (SOC_SERIES_AT32F423) || defined (SOC_SERIES_AT32F402) || \
  323. defined (SOC_SERIES_AT32F405) || defined (SOC_SERIES_AT32A423) || \
  324. defined (SOC_SERIES_AT32M412) || defined (SOC_SERIES_AT32M416)
  325. dmamux_enable(dma_config->dma_x, TRUE);
  326. dmamux_init(dma_config->dmamux_channel, (dmamux_requst_id_sel_type)dma_config->request_id);
  327. #endif
  328. /* enable interrupt */
  329. if (flag == RT_DEVICE_FLAG_DMA_RX)
  330. {
  331. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  332. /* start dma transfer */
  333. _uart_dma_receive(instance, rx_fifo->buffer, serial->config.rx_bufsz);
  334. }
  335. /* dma irq should set in dma tx mode */
  336. nvic_irq_enable(dma_config->dma_irqn, 0, 0);
  337. nvic_irq_enable(instance->irqn, 1, 0);
  338. }
  339. #endif
  340. static rt_ssize_t at32_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, rt_uint32_t tx_flag)
  341. {
  342. struct at32_uart *instance;
  343. RT_ASSERT(serial != RT_NULL);
  344. RT_ASSERT(buf != RT_NULL);
  345. instance = rt_container_of(serial, struct at32_uart, serial);
  346. RT_ASSERT(instance != RT_NULL);
  347. if(instance->uart_dma_flag & RT_DEVICE_FLAG_DMA_TX)
  348. {
  349. #ifdef RT_SERIAL_USING_DMA
  350. _uart_dma_transmit(instance, buf, size);
  351. #endif
  352. return size;
  353. }
  354. at32_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)tx_flag);
  355. return size;
  356. }
  357. static const struct rt_uart_ops at32_uart_ops = {
  358. at32_configure,
  359. at32_control,
  360. at32_putc,
  361. at32_getc,
  362. at32_transmit
  363. };
  364. #ifdef RT_SERIAL_USING_DMA
  365. void dma_rx_isr(struct rt_serial_device *serial)
  366. {
  367. volatile rt_uint32_t reg_sts = 0, index = 0;
  368. rt_size_t recv_len = 0, counter = 0;
  369. struct at32_uart *instance;
  370. RT_ASSERT(serial != RT_NULL);
  371. instance = rt_container_of(serial, struct at32_uart, serial);
  372. RT_ASSERT(instance != RT_NULL);
  373. index = instance->dma_rx->channel_index;
  374. /* clear dma flag */
  375. instance->dma_rx->dma_x->clr |= (rt_uint32_t)(DMA_FDT_FLAG << (4 * (index - 1))) | (DMA_HDT_FLAG << (4 * (index - 1)));
  376. counter = dma_data_number_get(instance->dma_rx->dma_channel);
  377. if (counter <= instance->last_index)
  378. recv_len = instance->last_index - counter;
  379. else
  380. recv_len = serial->config.rx_bufsz + instance->last_index - counter;
  381. if (recv_len)
  382. {
  383. instance->last_index = counter;
  384. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  385. }
  386. }
  387. void dma_tx_isr(struct rt_serial_device *serial)
  388. {
  389. volatile rt_uint32_t reg_sts = 0, index = 0;
  390. rt_size_t trans_total_index;
  391. struct at32_uart *instance;
  392. RT_ASSERT(serial != RT_NULL);
  393. instance = rt_container_of(serial, struct at32_uart, serial);
  394. RT_ASSERT(instance != RT_NULL);
  395. reg_sts = instance->dma_tx->dma_x->sts;
  396. index = instance->dma_tx->channel_index;
  397. if ((reg_sts & (DMA_FDT_FLAG << (4 * (index - 1)))) != RESET)
  398. {
  399. /* mark dma flag */
  400. instance->dma_tx->dma_done = RT_TRUE;
  401. /* clear dma flag */
  402. instance->dma_tx->dma_x->clr |= (rt_uint32_t)(DMA_FDT_FLAG << (4 * (index - 1)));
  403. /* disable dma tx channel */
  404. dma_channel_enable(instance->dma_tx->dma_channel, FALSE);
  405. trans_total_index = dma_data_number_get(instance->dma_tx->dma_channel);
  406. if (trans_total_index == 0)
  407. {
  408. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
  409. }
  410. }
  411. }
  412. #endif
  413. static void usart_isr(struct rt_serial_device *serial)
  414. {
  415. struct at32_uart *instance;
  416. RT_ASSERT(serial != RT_NULL);
  417. instance = rt_container_of(serial, struct at32_uart, serial);
  418. RT_ASSERT(instance != RT_NULL);
  419. if (usart_flag_get(instance->uart_x, USART_RDBF_FLAG) != RESET)
  420. {
  421. struct rt_serial_rx_fifo *rx_fifo;
  422. rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
  423. RT_ASSERT(rx_fifo != RT_NULL);
  424. rt_ringbuffer_putchar(&(rx_fifo->rb), usart_data_receive(instance->uart_x));
  425. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  426. }
  427. else if ((usart_flag_get(instance->uart_x, USART_TDBE_FLAG) != RESET) && (instance->uart_x->ctrl1_bit.tdbeien))
  428. {
  429. struct rt_serial_tx_fifo *tx_fifo;
  430. tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
  431. RT_ASSERT(tx_fifo != RT_NULL);
  432. rt_uint8_t put_char = 0;
  433. if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char))
  434. {
  435. usart_data_transmit(instance->uart_x, put_char);
  436. }
  437. else
  438. {
  439. usart_interrupt_enable(instance->uart_x, USART_TDBE_INT, FALSE);
  440. usart_interrupt_enable(instance->uart_x, USART_TDC_INT, TRUE);
  441. }
  442. usart_flag_clear(instance->uart_x, USART_TDBE_FLAG);
  443. }
  444. else if ((usart_flag_get(instance->uart_x, USART_TDC_FLAG) != RESET) && (instance->uart_x->ctrl1_bit.tdcien))
  445. {
  446. usart_interrupt_enable(instance->uart_x, USART_TDC_INT, FALSE);
  447. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
  448. usart_flag_clear(instance->uart_x, USART_TDC_FLAG);
  449. }
  450. #ifdef RT_SERIAL_USING_DMA
  451. else if ((usart_flag_get(instance->uart_x, USART_IDLEF_FLAG) != RESET) && (instance->uart_dma_flag) && \
  452. (instance->uart_x->ctrl1_bit.idleien))
  453. {
  454. dma_rx_isr(serial);
  455. /* clear idle flag */
  456. usart_data_receive(instance->uart_x);
  457. }
  458. #endif
  459. else
  460. {
  461. if (usart_flag_get(instance->uart_x, USART_ROERR_FLAG) != RESET)
  462. {
  463. usart_flag_clear(instance->uart_x, USART_ROERR_FLAG);
  464. }
  465. if (usart_flag_get(instance->uart_x, USART_NERR_FLAG) != RESET)
  466. {
  467. usart_flag_clear(instance->uart_x, USART_NERR_FLAG);
  468. }
  469. if (usart_flag_get(instance->uart_x, USART_FERR_FLAG) != RESET)
  470. {
  471. usart_flag_clear(instance->uart_x, USART_FERR_FLAG);
  472. }
  473. if (usart_flag_get(instance->uart_x, USART_PERR_FLAG) != RESET)
  474. {
  475. usart_flag_clear(instance->uart_x, USART_PERR_FLAG);
  476. }
  477. if (usart_flag_get(instance->uart_x, USART_CTSCF_FLAG) != RESET)
  478. {
  479. usart_flag_clear(instance->uart_x, USART_CTSCF_FLAG);
  480. }
  481. if (usart_flag_get(instance->uart_x, USART_BFF_FLAG) != RESET)
  482. {
  483. usart_flag_clear(instance->uart_x, USART_BFF_FLAG);
  484. }
  485. }
  486. }
  487. #ifdef BSP_USING_UART1
  488. void UART1_IRQHandler(void) {
  489. rt_interrupt_enter();
  490. usart_isr(&uart_config[UART1_INDEX].serial);
  491. rt_interrupt_leave();
  492. }
  493. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA)
  494. void UART1_RX_DMA_IRQHandler(void)
  495. {
  496. /* enter interrupt */
  497. rt_interrupt_enter();
  498. dma_rx_isr(&uart_config[UART1_INDEX].serial);
  499. /* leave interrupt */
  500. rt_interrupt_leave();
  501. }
  502. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA) */
  503. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA)
  504. void UART1_TX_DMA_IRQHandler(void)
  505. {
  506. /* enter interrupt */
  507. rt_interrupt_enter();
  508. dma_tx_isr(&uart_config[UART1_INDEX].serial);
  509. /* leave interrupt */
  510. rt_interrupt_leave();
  511. }
  512. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA) */
  513. #endif
  514. #ifdef BSP_USING_UART2
  515. void UART2_IRQHandler(void) {
  516. rt_interrupt_enter();
  517. usart_isr(&uart_config[UART2_INDEX].serial);
  518. rt_interrupt_leave();
  519. }
  520. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA)
  521. void UART2_RX_DMA_IRQHandler(void)
  522. {
  523. /* enter interrupt */
  524. rt_interrupt_enter();
  525. dma_rx_isr(&uart_config[UART2_INDEX].serial);
  526. /* leave interrupt */
  527. rt_interrupt_leave();
  528. }
  529. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA) */
  530. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA)
  531. void UART2_TX_DMA_IRQHandler(void)
  532. {
  533. /* enter interrupt */
  534. rt_interrupt_enter();
  535. dma_tx_isr(&uart_config[UART2_INDEX].serial);
  536. /* leave interrupt */
  537. rt_interrupt_leave();
  538. }
  539. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA) */
  540. #endif
  541. #ifdef BSP_USING_UART3
  542. void UART3_IRQHandler(void) {
  543. rt_interrupt_enter();
  544. usart_isr(&uart_config[UART3_INDEX].serial);
  545. rt_interrupt_leave();
  546. }
  547. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA)
  548. void UART3_RX_DMA_IRQHandler(void)
  549. {
  550. /* enter interrupt */
  551. rt_interrupt_enter();
  552. dma_rx_isr(&uart_config[UART3_INDEX].serial);
  553. /* leave interrupt */
  554. rt_interrupt_leave();
  555. }
  556. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA) */
  557. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_TX_USING_DMA)
  558. void UART3_TX_DMA_IRQHandler(void)
  559. {
  560. /* enter interrupt */
  561. rt_interrupt_enter();
  562. dma_tx_isr(&uart_config[UART3_INDEX].serial);
  563. /* leave interrupt */
  564. rt_interrupt_leave();
  565. }
  566. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_TX_USING_DMA) */
  567. #endif
  568. #ifdef BSP_USING_UART4
  569. void UART4_IRQHandler(void) {
  570. rt_interrupt_enter();
  571. usart_isr(&uart_config[UART4_INDEX].serial);
  572. rt_interrupt_leave();
  573. }
  574. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_RX_USING_DMA)
  575. void UART4_RX_DMA_IRQHandler(void)
  576. {
  577. /* enter interrupt */
  578. rt_interrupt_enter();
  579. dma_rx_isr(&uart_config[UART4_INDEX].serial);
  580. /* leave interrupt */
  581. rt_interrupt_leave();
  582. }
  583. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_RX_USING_DMA) */
  584. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_TX_USING_DMA)
  585. void UART4_TX_DMA_IRQHandler(void)
  586. {
  587. /* enter interrupt */
  588. rt_interrupt_enter();
  589. dma_tx_isr(&uart_config[UART4_INDEX].serial);
  590. /* leave interrupt */
  591. rt_interrupt_leave();
  592. }
  593. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART14_TX_USING_DMA) */
  594. #endif
  595. #ifdef BSP_USING_UART5
  596. void UART5_IRQHandler(void) {
  597. rt_interrupt_enter();
  598. usart_isr(&uart_config[UART5_INDEX].serial);
  599. rt_interrupt_leave();
  600. }
  601. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA)
  602. void UART5_RX_DMA_IRQHandler(void)
  603. {
  604. /* enter interrupt */
  605. rt_interrupt_enter();
  606. dma_rx_isr(&uart_config[UART5_INDEX].serial);
  607. /* leave interrupt */
  608. rt_interrupt_leave();
  609. }
  610. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) */
  611. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA)
  612. void UART5_TX_DMA_IRQHandler(void)
  613. {
  614. /* enter interrupt */
  615. rt_interrupt_enter();
  616. dma_tx_isr(&uart_config[UART5_INDEX].serial);
  617. /* leave interrupt */
  618. rt_interrupt_leave();
  619. }
  620. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_TX_USING_DMA) */
  621. #endif
  622. #ifdef BSP_USING_UART6
  623. void UART6_IRQHandler(void) {
  624. rt_interrupt_enter();
  625. usart_isr(&uart_config[UART6_INDEX].serial);
  626. rt_interrupt_leave();
  627. }
  628. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA)
  629. void UART6_RX_DMA_IRQHandler(void)
  630. {
  631. /* enter interrupt */
  632. rt_interrupt_enter();
  633. dma_rx_isr(&uart_config[UART6_INDEX].serial);
  634. /* leave interrupt */
  635. rt_interrupt_leave();
  636. }
  637. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_RX_USING_DMA) */
  638. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA)
  639. void UART6_TX_DMA_IRQHandler(void)
  640. {
  641. /* enter interrupt */
  642. rt_interrupt_enter();
  643. dma_tx_isr(&uart_config[UART6_INDEX].serial);
  644. /* leave interrupt */
  645. rt_interrupt_leave();
  646. }
  647. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART6_TX_USING_DMA) */
  648. #endif
  649. #ifdef BSP_USING_UART7
  650. void UART7_IRQHandler(void) {
  651. rt_interrupt_enter();
  652. usart_isr(&uart_config[UART7_INDEX].serial);
  653. rt_interrupt_leave();
  654. }
  655. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA)
  656. void UART7_RX_DMA_IRQHandler(void)
  657. {
  658. /* enter interrupt */
  659. rt_interrupt_enter();
  660. dma_rx_isr(&uart_config[UART7_INDEX].serial);
  661. /* leave interrupt */
  662. rt_interrupt_leave();
  663. }
  664. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_RX_USING_DMA) */
  665. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA)
  666. void UART7_TX_DMA_IRQHandler(void)
  667. {
  668. /* enter interrupt */
  669. rt_interrupt_enter();
  670. dma_tx_isr(&uart_config[UART7_INDEX].serial);
  671. /* leave interrupt */
  672. rt_interrupt_leave();
  673. }
  674. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART7_TX_USING_DMA) */
  675. #endif
  676. #ifdef BSP_USING_UART8
  677. void UART8_IRQHandler(void) {
  678. rt_interrupt_enter();
  679. usart_isr(&uart_config[UART8_INDEX].serial);
  680. rt_interrupt_leave();
  681. }
  682. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA)
  683. void UART8_RX_DMA_IRQHandler(void)
  684. {
  685. /* enter interrupt */
  686. rt_interrupt_enter();
  687. dma_rx_isr(&uart_config[UART8_INDEX].serial);
  688. /* leave interrupt */
  689. rt_interrupt_leave();
  690. }
  691. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_RX_USING_DMA) */
  692. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA)
  693. void UART8_TX_DMA_IRQHandler(void)
  694. {
  695. /* enter interrupt */
  696. rt_interrupt_enter();
  697. dma_tx_isr(&uart_config[UART8_INDEX].serial);
  698. /* leave interrupt */
  699. rt_interrupt_leave();
  700. }
  701. #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART8_TX_USING_DMA) */
  702. #endif
  703. #if defined (SOC_SERIES_AT32F421)
  704. void UART1_TX_RX_DMA_IRQHandler(void)
  705. {
  706. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA)
  707. UART1_TX_DMA_IRQHandler();
  708. #endif
  709. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA)
  710. UART1_RX_DMA_IRQHandler();
  711. #endif
  712. }
  713. void UART2_TX_RX_DMA_IRQHandler(void)
  714. {
  715. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA)
  716. UART2_TX_DMA_IRQHandler();
  717. #endif
  718. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA)
  719. UART2_RX_DMA_IRQHandler();
  720. #endif
  721. }
  722. #endif
  723. #if defined (SOC_SERIES_AT32F425)
  724. #if defined(BSP_USING_UART3) || defined(BSP_USING_UART4)
  725. void USART4_3_IRQHandler(void)
  726. {
  727. #if defined(BSP_USING_UART3)
  728. UART3_IRQHandler();
  729. #endif
  730. #if defined(BSP_USING_UART4)
  731. UART4_IRQHandler();
  732. #endif
  733. }
  734. #endif
  735. void UART1_TX_RX_DMA_IRQHandler(void)
  736. {
  737. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_TX_USING_DMA)
  738. UART1_TX_DMA_IRQHandler();
  739. #endif
  740. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA)
  741. UART1_RX_DMA_IRQHandler();
  742. #endif
  743. }
  744. void UART3_2_TX_RX_DMA_IRQHandler(void)
  745. {
  746. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_TX_USING_DMA)
  747. UART2_TX_DMA_IRQHandler();
  748. #endif
  749. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA)
  750. UART2_RX_DMA_IRQHandler();
  751. #endif
  752. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_TX_USING_DMA)
  753. UART3_TX_DMA_IRQHandler();
  754. #endif
  755. #if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA)
  756. UART3_RX_DMA_IRQHandler();
  757. #endif
  758. }
  759. #endif
  760. #if defined (RT_SERIAL_USING_DMA)
  761. static void _dma_base_channel_check(struct at32_uart *instance)
  762. {
  763. dma_channel_type *rx_channel = instance->dma_rx->dma_channel;
  764. dma_channel_type *tx_channel = instance->dma_tx->dma_channel;
  765. instance->dma_rx->dma_done = RT_TRUE;
  766. instance->dma_rx->dma_x = (dma_type *)((rt_uint32_t)rx_channel & ~0xFF);
  767. instance->dma_rx->channel_index = ((((rt_uint32_t)rx_channel & 0xFF) - 8) / 0x14) + 1;
  768. instance->dma_tx->dma_done = RT_TRUE;
  769. instance->dma_tx->dma_x = (dma_type *)((rt_uint32_t)tx_channel & ~0xFF);
  770. instance->dma_tx->channel_index = ((((rt_uint32_t)tx_channel & 0xFF) - 8) / 0x14) + 1;
  771. }
  772. #endif
  773. static void at32_uart_get_config(void)
  774. {
  775. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  776. #ifdef BSP_USING_UART1
  777. uart_config[UART1_INDEX].uart_dma_flag = 0;
  778. uart_config[UART1_INDEX].serial.config = config;
  779. uart_config[UART1_INDEX].serial.config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
  780. uart_config[UART1_INDEX].serial.config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
  781. #ifdef BSP_UART1_RX_USING_DMA
  782. uart_config[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  783. static struct dma_config uart1_dma_rx = UART1_RX_DMA_CONFIG;
  784. uart_config[UART1_INDEX].dma_rx = &uart1_dma_rx;
  785. #endif
  786. #ifdef BSP_UART1_TX_USING_DMA
  787. uart_config[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  788. static struct dma_config uart1_dma_tx = UART1_TX_DMA_CONFIG;
  789. uart_config[UART1_INDEX].dma_tx = &uart1_dma_tx;
  790. #endif
  791. #endif
  792. #ifdef BSP_USING_UART2
  793. uart_config[UART2_INDEX].uart_dma_flag = 0;
  794. uart_config[UART2_INDEX].serial.config = config;
  795. uart_config[UART2_INDEX].serial.config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
  796. uart_config[UART2_INDEX].serial.config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
  797. #ifdef BSP_UART2_RX_USING_DMA
  798. uart_config[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  799. static struct dma_config uart2_dma_rx = UART2_RX_DMA_CONFIG;
  800. uart_config[UART2_INDEX].dma_rx = &uart2_dma_rx;
  801. #endif
  802. #ifdef BSP_UART2_TX_USING_DMA
  803. uart_config[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  804. static struct dma_config uart2_dma_tx = UART2_TX_DMA_CONFIG;
  805. uart_config[UART2_INDEX].dma_tx = &uart2_dma_tx;
  806. #endif
  807. #endif
  808. #ifdef BSP_USING_UART3
  809. uart_config[UART3_INDEX].uart_dma_flag = 0;
  810. uart_config[UART3_INDEX].serial.config = config;
  811. uart_config[UART3_INDEX].serial.config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
  812. uart_config[UART3_INDEX].serial.config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
  813. #ifdef BSP_UART3_RX_USING_DMA
  814. uart_config[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  815. static struct dma_config uart3_dma_rx = UART3_RX_DMA_CONFIG;
  816. uart_config[UART3_INDEX].dma_rx = &uart3_dma_rx;
  817. #endif
  818. #ifdef BSP_UART3_TX_USING_DMA
  819. uart_config[UART3_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  820. static struct dma_config uart3_dma_tx = UART3_TX_DMA_CONFIG;
  821. uart_config[UART3_INDEX].dma_tx = &uart3_dma_tx;
  822. #endif
  823. #endif
  824. #ifdef BSP_USING_UART4
  825. uart_config[UART4_INDEX].uart_dma_flag = 0;
  826. uart_config[UART4_INDEX].serial.config = config;
  827. uart_config[UART4_INDEX].serial.config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
  828. uart_config[UART4_INDEX].serial.config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
  829. #ifdef BSP_UART4_RX_USING_DMA
  830. uart_config[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  831. static struct dma_config uart4_dma_rx = UART4_RX_DMA_CONFIG;
  832. uart_config[UART4_INDEX].dma_rx = &uart4_dma_rx;
  833. #endif
  834. #ifdef BSP_UART4_TX_USING_DMA
  835. uart_config[UART4_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  836. static struct dma_config uart4_dma_tx = UART4_TX_DMA_CONFIG;
  837. uart_config[UART4_INDEX].dma_tx = &uart4_dma_tx;
  838. #endif
  839. #endif
  840. #ifdef BSP_USING_UART5
  841. uart_config[UART5_INDEX].uart_dma_flag = 0;
  842. uart_config[UART5_INDEX].serial.config = config;
  843. uart_config[UART5_INDEX].serial.config.rx_bufsz = BSP_UART5_RX_BUFSIZE;
  844. uart_config[UART5_INDEX].serial.config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
  845. #ifdef BSP_UART5_RX_USING_DMA
  846. uart_config[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  847. static struct dma_config uart5_dma_rx = UART5_RX_DMA_CONFIG;
  848. uart_config[UART5_INDEX].dma_rx = &uart5_dma_rx;
  849. #endif
  850. #ifdef BSP_UART5_TX_USING_DMA
  851. uart_config[UART5_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  852. static struct dma_config uart5_dma_tx = UART5_TX_DMA_CONFIG;
  853. uart_config[UART5_INDEX].dma_tx = &uart5_dma_tx;
  854. #endif
  855. #endif
  856. #ifdef BSP_USING_UART6
  857. uart_config[UART6_INDEX].uart_dma_flag = 0;
  858. uart_config[UART6_INDEX].serial.config = config;
  859. uart_config[UART6_INDEX].serial.config.rx_bufsz = BSP_UART6_RX_BUFSIZE;
  860. uart_config[UART6_INDEX].serial.config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
  861. #ifdef BSP_UART6_RX_USING_DMA
  862. uart_config[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  863. static struct dma_config uart6_dma_rx = UART6_RX_DMA_CONFIG;
  864. uart_config[UART6_INDEX].dma_rx = &uart6_dma_rx;
  865. #endif
  866. #ifdef BSP_UART6_TX_USING_DMA
  867. uart_config[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  868. static struct dma_config uart6_dma_tx = UART6_TX_DMA_CONFIG;
  869. uart_config[UART6_INDEX].dma_tx = &uart6_dma_tx;
  870. #endif
  871. #endif
  872. #ifdef BSP_USING_UART7
  873. uart_config[UART7_INDEX].uart_dma_flag = 0;
  874. uart_config[UART7_INDEX].serial.config = config;
  875. uart_config[UART7_INDEX].serial.config.rx_bufsz = BSP_UART7_RX_BUFSIZE;
  876. uart_config[UART7_INDEX].serial.config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
  877. #ifdef BSP_UART7_RX_USING_DMA
  878. uart_config[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  879. static struct dma_config uart7_dma_rx = UART7_RX_DMA_CONFIG;
  880. uart_config[UART7_INDEX].dma_rx = &uart7_dma_rx;
  881. #endif
  882. #ifdef BSP_UART7_TX_USING_DMA
  883. uart_config[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  884. static struct dma_config uart7_dma_tx = UART7_TX_DMA_CONFIG;
  885. uart_config[UART7_INDEX].dma_tx = &uart7_dma_tx;
  886. #endif
  887. #endif
  888. #ifdef BSP_USING_UART8
  889. uart_config[UART8_INDEX].uart_dma_flag = 0;
  890. uart_config[UART8_INDEX].serial.config = config;
  891. uart_config[UART8_INDEX].serial.config.rx_bufsz = BSP_UART8_RX_BUFSIZE;
  892. uart_config[UART8_INDEX].serial.config.tx_bufsz = BSP_UART8_TX_BUFSIZE;
  893. #ifdef BSP_UART8_RX_USING_DMA
  894. uart_config[UART8_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  895. static struct dma_config uart8_dma_rx = UART8_RX_DMA_CONFIG;
  896. uart_config[UART8_INDEX].dma_rx = &uart8_dma_rx;
  897. #endif
  898. #ifdef BSP_UART8_TX_USING_DMA
  899. uart_config[UART8_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  900. static struct dma_config uart8_dma_tx = UART8_TX_DMA_CONFIG;
  901. uart_config[UART8_INDEX].dma_tx = &uart8_dma_tx;
  902. #endif
  903. #endif
  904. }
  905. int rt_hw_usart_init(void) {
  906. rt_size_t obj_num;
  907. int index;
  908. rt_err_t result = 0;
  909. obj_num = sizeof(uart_config) / sizeof(struct at32_uart);
  910. at32_uart_get_config();
  911. for (index = 0; index < obj_num; index++) {
  912. uart_config[index].serial.ops = &at32_uart_ops;
  913. #if defined (RT_SERIAL_USING_DMA)
  914. /* search dma base and channel index */
  915. _dma_base_channel_check(&uart_config[index]);
  916. #endif
  917. /* register uart device */
  918. result = rt_hw_serial_register(&uart_config[index].serial,
  919. uart_config[index].name,
  920. RT_DEVICE_FLAG_RDWR,
  921. &uart_config[index]);
  922. RT_ASSERT(result == RT_EOK);
  923. }
  924. return result;
  925. }
  926. #endif /* BSP_USING_SERIAL_V2 */