drv_usart.c 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597
  1. /*
  2. * Copyright (C) 2020, Huada Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-10-30 CDT first version
  9. * 2021-10-05 lizhengyang fix set uart clk bug
  10. */
  11. /*******************************************************************************
  12. * Include files
  13. ******************************************************************************/
  14. #include <rtdevice.h>
  15. #include <rthw.h>
  16. #include "drv_usart.h"
  17. #include "board_config.h"
  18. #ifdef RT_USING_SERIAL
  19. #if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && \
  20. !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && !defined(BSP_USING_UART6) && \
  21. !defined(BSP_USING_UART7) && !defined(BSP_USING_UART8) && !defined(BSP_USING_UART9) && \
  22. !defined(BSP_USING_UART10)
  23. #error "Please define at least one BSP_USING_UARTx"
  24. /* UART instance can be selected at menuconfig -> Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable UART */
  25. #endif
  26. /*******************************************************************************
  27. * Local type definitions ('typedef')
  28. ******************************************************************************/
  29. /* HC32 config Rx timeout */
  30. struct hc32_uart_rxto
  31. {
  32. M4_TMR0_TypeDef *TMR0_Instance;
  33. rt_uint32_t channel;
  34. rt_size_t timeout_bits;
  35. struct hc32_irq_config irq_config;
  36. };
  37. /* HC32 config uart class */
  38. struct hc32_uart_config
  39. {
  40. struct hc32_irq_config rxerr_irq_config;
  41. struct hc32_irq_config rx_irq_config;
  42. struct hc32_irq_config tx_irq_config;
  43. #ifdef RT_SERIAL_USING_DMA
  44. struct hc32_uart_rxto *rx_timeout;
  45. struct dma_config *dma_rx;
  46. struct dma_config *dma_tx;
  47. #endif
  48. };
  49. /* HC32 UART index */
  50. struct uart_index
  51. {
  52. rt_uint32_t index;
  53. M4_USART_TypeDef *Instance;
  54. };
  55. /* HC32 UART irq handler */
  56. struct uart_irq_handler
  57. {
  58. void (*rxerr_irq_handler)(void);
  59. void (*rx_irq_handler)(void);
  60. void (*tx_irq_handler)(void);
  61. void (*tc_irq_handler)(void);
  62. void (*rxto_irq_handler)(void);
  63. void (*dma_rx_irq_handler)(void);
  64. };
  65. /* HC32 uart dirver class */
  66. struct hc32_uart
  67. {
  68. struct rt_serial_device serial;
  69. const char *name;
  70. M4_USART_TypeDef *Instance;
  71. struct hc32_uart_config config;
  72. #ifdef RT_SERIAL_USING_DMA
  73. rt_size_t dma_rx_last_index;
  74. #endif
  75. rt_uint16_t uart_dma_flag;
  76. };
  77. /*******************************************************************************
  78. * Local pre-processor symbols/macros ('#define')
  79. ******************************************************************************/
  80. #ifndef UART_CONFIG
  81. #define UART_CONFIG(uart_name, USART) \
  82. { \
  83. .name = uart_name, \
  84. .Instance = M4_##USART, \
  85. .config = { \
  86. .rxerr_irq_config = { \
  87. .irq = USART##_RXERR_INT_IRQn, \
  88. .irq_prio = USART##_RXERR_INT_PRIO, \
  89. .int_src = INT_##USART##_EI, \
  90. }, \
  91. .rx_irq_config = { \
  92. .irq = USART##_RX_INT_IRQn, \
  93. .irq_prio = USART##_RX_INT_PRIO, \
  94. .int_src = INT_##USART##_RI, \
  95. }, \
  96. .tx_irq_config = { \
  97. .irq = USART##_TX_INT_IRQn, \
  98. .irq_prio = USART##_TX_INT_PRIO, \
  99. .int_src = INT_##USART##_TI, \
  100. }, \
  101. }, \
  102. }
  103. #endif /* UART_CONFIG */
  104. #ifndef UART_RXTO_CONFIG
  105. #define UART_RXTO_CONFIG(USART) \
  106. { \
  107. .TMR0_Instance = USART##_RXTO_TMR0_UNIT, \
  108. .channel = USART##_RXTO_TMR0_CH, \
  109. .timeout_bits = 20UL, \
  110. .irq_config = { \
  111. .irq = USART##_RXTO_INT_IRQn, \
  112. .irq_prio = USART##_RXTO_INT_PRIO, \
  113. .int_src = INT_##USART##_RTO, \
  114. } \
  115. }
  116. #endif /* UART_RXTO_CONFIG */
  117. #ifndef UART_DMA_RX_CONFIG
  118. #define UART_DMA_RX_CONFIG(USART) \
  119. { \
  120. .Instance = USART##_RX_DMA_UNIT, \
  121. .channel = USART##_RX_DMA_CH, \
  122. .trigger_evt_src = EVT_##USART##_RI, \
  123. .irq_config = { \
  124. .irq = USART##_RX_DMA_INT_IRQn, \
  125. .irq_prio = USART##_RX_DMA_INT_PRIO, \
  126. .int_src = USART##_RX_DMA_INT_SRC, \
  127. } \
  128. }
  129. #endif /* UART_DMA_RX_CONFIG */
  130. #ifndef UART_DMA_TX_CONFIG
  131. #define UART_DMA_TX_CONFIG(USART) \
  132. { \
  133. .Instance = USART##_TX_DMA_UNIT, \
  134. .channel = USART##_TX_DMA_CH, \
  135. .trigger_evt_src = EVT_##USART##_TI, \
  136. .irq_config = { \
  137. .irq = USART##_TC_INT_IRQn, \
  138. .irq_prio = USART##_TC_INT_PRIO, \
  139. .int_src = INT_##USART##_TCI, \
  140. } \
  141. }
  142. #endif /* UART_DMA_TX_CONFIG */
  143. #define DMA_CH_REG(reg_base, ch) \
  144. (*(uint32_t *)((uint32_t)(&(reg_base)) + ((ch) * 0x40UL)))
  145. #define DMA_TRANS_CNT(unit, ch) \
  146. (READ_REG32(DMA_CH_REG((unit)->MONDTCTL0, (ch))) >> DMA_DTCTL_CNT_POS)
  147. #define USART_TCI_ENABLE(unit) \
  148. SET_REG32_BIT(unit->CR1, USART_INT_TC)
  149. /*******************************************************************************
  150. * Global variable definitions (declared in header file with 'extern')
  151. ******************************************************************************/
  152. /*******************************************************************************
  153. * Local function prototypes ('static')
  154. ******************************************************************************/
  155. #ifdef RT_SERIAL_USING_DMA
  156. static void hc32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag);
  157. #endif
  158. /*******************************************************************************
  159. * Local variable definitions ('static')
  160. ******************************************************************************/
  161. enum
  162. {
  163. #ifdef BSP_USING_UART1
  164. UART1_INDEX,
  165. #endif
  166. #ifdef BSP_USING_UART2
  167. UART2_INDEX,
  168. #endif
  169. #ifdef BSP_USING_UART3
  170. UART3_INDEX,
  171. #endif
  172. #ifdef BSP_USING_UART4
  173. UART4_INDEX,
  174. #endif
  175. #ifdef BSP_USING_UART5
  176. UART5_INDEX,
  177. #endif
  178. #ifdef BSP_USING_UART6
  179. UART6_INDEX,
  180. #endif
  181. #ifdef BSP_USING_UART7
  182. UART7_INDEX,
  183. #endif
  184. #ifdef BSP_USING_UART8
  185. UART8_INDEX,
  186. #endif
  187. #ifdef BSP_USING_UART9
  188. UART9_INDEX,
  189. #endif
  190. #ifdef BSP_USING_UART10
  191. UART10_INDEX,
  192. #endif
  193. UART_INDEX_MAX,
  194. };
  195. static const struct uart_index uart_map[] =
  196. {
  197. #ifdef BSP_USING_UART1
  198. {UART1_INDEX, M4_USART1},
  199. #endif
  200. #ifdef BSP_USING_UART2
  201. {UART2_INDEX, M4_USART2},
  202. #endif
  203. #ifdef BSP_USING_UART3
  204. {UART3_INDEX, M4_USART3},
  205. #endif
  206. #ifdef BSP_USING_UART4
  207. {UART4_INDEX, M4_USART4},
  208. #endif
  209. #ifdef BSP_USING_UART5
  210. {UART5_INDEX, M4_USART5},
  211. #endif
  212. #ifdef BSP_USING_UART6
  213. {UART6_INDEX, M4_USART6},
  214. #endif
  215. #ifdef BSP_USING_UART7
  216. {UART7_INDEX, M4_USART7},
  217. #endif
  218. #ifdef BSP_USING_UART8
  219. {UART8_INDEX, M4_USART8},
  220. #endif
  221. #ifdef BSP_USING_UART9
  222. {UART9_INDEX, M4_USART9},
  223. #endif
  224. #ifdef BSP_USING_UART10
  225. {UART10_INDEX, M4_USART10},
  226. #endif
  227. };
  228. static struct hc32_uart uart_obj[] =
  229. {
  230. #ifdef BSP_USING_UART1
  231. UART_CONFIG("uart1", USART1),
  232. #endif
  233. #ifdef BSP_USING_UART2
  234. UART_CONFIG("uart2", USART2),
  235. #endif
  236. #ifdef BSP_USING_UART3
  237. UART_CONFIG("uart3", USART3),
  238. #endif
  239. #ifdef BSP_USING_UART4
  240. UART_CONFIG("uart4", USART4),
  241. #endif
  242. #ifdef BSP_USING_UART5
  243. UART_CONFIG("uart5", USART5),
  244. #endif
  245. #ifdef BSP_USING_UART6
  246. UART_CONFIG("uart6", USART6),
  247. #endif
  248. #ifdef BSP_USING_UART7
  249. UART_CONFIG("uart7", USART7),
  250. #endif
  251. #ifdef BSP_USING_UART8
  252. UART_CONFIG("uart8", USART8),
  253. #endif
  254. #ifdef BSP_USING_UART9
  255. UART_CONFIG("uart9", USART9),
  256. #endif
  257. #ifdef BSP_USING_UART10
  258. UART_CONFIG("uart10", USART10),
  259. #endif
  260. };
  261. static const struct uart_index uart_clock_map[] =
  262. {
  263. #ifdef BSP_USING_UART1
  264. {0, M4_USART1},
  265. #endif
  266. #ifdef BSP_USING_UART2
  267. {1, M4_USART2},
  268. #endif
  269. #ifdef BSP_USING_UART3
  270. {2, M4_USART3},
  271. #endif
  272. #ifdef BSP_USING_UART4
  273. {3, M4_USART4},
  274. #endif
  275. #ifdef BSP_USING_UART5
  276. {4, M4_USART5},
  277. #endif
  278. #ifdef BSP_USING_UART6
  279. {5, M4_USART6},
  280. #endif
  281. #ifdef BSP_USING_UART7
  282. {6, M4_USART7},
  283. #endif
  284. #ifdef BSP_USING_UART8
  285. {7, M4_USART8},
  286. #endif
  287. #ifdef BSP_USING_UART9
  288. {8, M4_USART9},
  289. #endif
  290. #ifdef BSP_USING_UART10
  291. {9, M4_USART10},
  292. #endif
  293. };
  294. static const struct uart_irq_handler uart_irq_handlers[sizeof(uart_obj) / sizeof(uart_obj[0])];
  295. /*******************************************************************************
  296. * Function implementation - global ('extern') and local ('static')
  297. ******************************************************************************/
  298. static uint32_t hc32_get_uart_index(M4_USART_TypeDef *Instance)
  299. {
  300. uint32_t index = UART_INDEX_MAX;
  301. for (uint8_t i = 0U; i < ARRAY_SZ(uart_map); i++)
  302. {
  303. if (uart_map[i].Instance == Instance)
  304. {
  305. index = uart_map[i].index;
  306. RT_ASSERT(index < UART_INDEX_MAX)
  307. break;
  308. }
  309. }
  310. return index;
  311. }
  312. static uint32_t hc32_get_uart_clock_index(M4_USART_TypeDef *Instance)
  313. {
  314. uint32_t index = 10;
  315. for (uint8_t i = 0U; i < ARRAY_SZ(uart_clock_map); i++)
  316. {
  317. if (uart_clock_map[i].Instance == Instance)
  318. {
  319. index = uart_clock_map[i].index;
  320. RT_ASSERT(index < 10)
  321. break;
  322. }
  323. }
  324. return index;
  325. }
  326. static uint32_t hc32_get_usart_fcg(M4_USART_TypeDef *Instance)
  327. {
  328. return (PWC_FCG3_USART1 << hc32_get_uart_clock_index(Instance));
  329. }
  330. static rt_err_t hc32_configure(struct rt_serial_device *serial,
  331. struct serial_configure *cfg)
  332. {
  333. struct hc32_uart *uart;
  334. stc_usart_uart_init_t uart_init;
  335. RT_ASSERT(RT_NULL != cfg);
  336. RT_ASSERT(RT_NULL != serial);
  337. uart = rt_container_of(serial, struct hc32_uart, serial);
  338. RT_ASSERT(RT_NULL != uart->Instance);
  339. /* Configure USART initialization structure */
  340. USART_UartStructInit(&uart_init);
  341. uart_init.u32OversamplingBits = USART_OVERSAMPLING_8BIT;
  342. uart_init.u32Baudrate = cfg->baud_rate;
  343. if ((M4_USART1 == uart->Instance) || \
  344. (M4_USART2 == uart->Instance) || \
  345. (M4_USART6 == uart->Instance) || \
  346. (M4_USART7 == uart->Instance))
  347. {
  348. uart_init.u32ClkMode = USART_INTERNCLK_OUTPUT;
  349. }
  350. if(BIT_ORDER_LSB == cfg->bit_order)
  351. {
  352. uart_init.u32BitDirection = USART_LSB;
  353. }
  354. else
  355. {
  356. uart_init.u32BitDirection = USART_MSB;
  357. }
  358. switch(cfg->stop_bits)
  359. {
  360. case STOP_BITS_1:
  361. uart_init.u32StopBit = USART_STOPBIT_1BIT;
  362. break;
  363. case STOP_BITS_2:
  364. uart_init.u32StopBit = USART_STOPBIT_2BIT;
  365. break;
  366. default:
  367. uart_init.u32StopBit = USART_STOPBIT_1BIT;
  368. break;
  369. }
  370. switch(cfg->parity)
  371. {
  372. case PARITY_NONE:
  373. uart_init.u32Parity = USART_PARITY_NONE;
  374. break;
  375. case PARITY_EVEN:
  376. uart_init.u32Parity = USART_PARITY_EVEN;
  377. break;
  378. case PARITY_ODD:
  379. uart_init.u32Parity = USART_PARITY_ODD;
  380. break;
  381. default:
  382. uart_init.u32Parity = USART_PARITY_NONE;
  383. break;
  384. }
  385. switch(cfg->data_bits)
  386. {
  387. case DATA_BITS_8:
  388. uart_init.u32DataWidth = USART_DATA_LENGTH_8BIT;
  389. break;
  390. default:
  391. return -RT_ERROR;
  392. }
  393. /* Enable USART clock */
  394. PWC_Fcg3PeriphClockCmd(hc32_get_usart_fcg(uart->Instance), Enable);
  395. rt_err_t rt_hw_board_uart_init(M4_USART_TypeDef *USARTx);
  396. if (RT_EOK != rt_hw_board_uart_init(uart->Instance))
  397. {
  398. return -RT_ERROR;
  399. }
  400. USART_DeInit(uart->Instance);
  401. if (Error == USART_UartInit(uart->Instance, &uart_init))
  402. {
  403. return -RT_ERROR;
  404. }
  405. /* Register RX error interrupt */
  406. hc32_install_irq_handler(&uart->config.rxerr_irq_config,
  407. uart_irq_handlers[hc32_get_uart_index(uart->Instance)].rxerr_irq_handler,
  408. RT_TRUE);
  409. USART_FuncCmd(uart->Instance, USART_INT_RX, Enable);
  410. if ((serial->parent.flag & RT_DEVICE_FLAG_RDWR) || \
  411. (serial->parent.flag & RT_DEVICE_FLAG_RDONLY))
  412. {
  413. USART_FuncCmd(uart->Instance, USART_RX, Enable);
  414. }
  415. if ((serial->parent.flag & RT_DEVICE_FLAG_RDWR) || \
  416. (serial->parent.flag & RT_DEVICE_FLAG_WRONLY))
  417. {
  418. USART_FuncCmd(uart->Instance, USART_TX, Enable);
  419. }
  420. return RT_EOK;
  421. }
  422. static rt_err_t hc32_control(struct rt_serial_device *serial, int cmd, void *arg)
  423. {
  424. struct hc32_uart *uart;
  425. uint32_t uart_index;
  426. #ifdef RT_SERIAL_USING_DMA
  427. rt_ubase_t ctrl_arg = (rt_ubase_t)arg;
  428. #endif
  429. RT_ASSERT(RT_NULL != serial);
  430. uart = rt_container_of(serial, struct hc32_uart, serial);
  431. RT_ASSERT(RT_NULL != uart->Instance);
  432. switch (cmd)
  433. {
  434. /* Disable interrupt */
  435. case RT_DEVICE_CTRL_CLR_INT:
  436. if(RT_DEVICE_FLAG_INT_RX == ctrl_arg)
  437. {
  438. /* Disable RX irq */
  439. NVIC_DisableIRQ(uart->config.rx_irq_config.irq);
  440. INTC_IrqSignOut(uart->config.rx_irq_config.irq);
  441. }
  442. else
  443. {
  444. /* Disable TX irq */
  445. NVIC_DisableIRQ(uart->config.tx_irq_config.irq);
  446. USART_FuncCmd(uart->Instance, USART_INT_TC, Disable);
  447. INTC_IrqSignOut(uart->config.tx_irq_config.irq);
  448. }
  449. break;
  450. /* Enable interrupt */
  451. case RT_DEVICE_CTRL_SET_INT:
  452. uart_index = hc32_get_uart_index(uart->Instance);
  453. if(RT_DEVICE_FLAG_INT_RX == ctrl_arg)
  454. {
  455. /* Install RX irq handler */
  456. hc32_install_irq_handler(&uart->config.rx_irq_config,
  457. uart_irq_handlers[uart_index].rx_irq_handler,
  458. RT_TRUE);
  459. }
  460. else
  461. {
  462. /* Enable TX interrupt */
  463. USART_FuncCmd(uart->Instance, USART_INT_TXE, Enable);
  464. /* Install TX irq handler */
  465. hc32_install_irq_handler(&uart->config.tx_irq_config,
  466. uart_irq_handlers[uart_index].tx_irq_handler,
  467. RT_TRUE);
  468. }
  469. break;
  470. #ifdef RT_SERIAL_USING_DMA
  471. case RT_DEVICE_CTRL_CONFIG:
  472. hc32_dma_config(serial, ctrl_arg);
  473. if (RT_DEVICE_FLAG_DMA_TX == ctrl_arg)
  474. {
  475. USART_FuncCmd(uart->Instance, (USART_TX | USART_INT_TC), Disable);
  476. /* Install TC irq handler */
  477. uart_index = hc32_get_uart_index(uart->Instance);
  478. hc32_install_irq_handler(&uart->config.dma_tx->irq_config,
  479. uart_irq_handlers[uart_index].tc_irq_handler,
  480. RT_TRUE);
  481. }
  482. break;
  483. #endif
  484. case RT_DEVICE_CTRL_CLOSE:
  485. USART_DeInit(uart->Instance);
  486. break;
  487. }
  488. return RT_EOK;
  489. }
  490. static int hc32_putc(struct rt_serial_device *serial, char c)
  491. {
  492. struct hc32_uart *uart;
  493. RT_ASSERT(RT_NULL != serial);
  494. uart = rt_container_of(serial, struct hc32_uart, serial);
  495. RT_ASSERT(RT_NULL != uart->Instance);
  496. if(serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX)
  497. {
  498. if (USART_GetStatus(uart->Instance, USART_FLAG_TXE) != Set)
  499. {
  500. return -1;
  501. }
  502. }
  503. else
  504. {
  505. /* Polling mode. */
  506. while (USART_GetStatus(uart->Instance, USART_FLAG_TXE) != Set);
  507. }
  508. USART_SendData(uart->Instance, c);
  509. return 1;
  510. }
  511. static int hc32_getc(struct rt_serial_device *serial)
  512. {
  513. int ch= -1;
  514. struct hc32_uart *uart;
  515. RT_ASSERT(RT_NULL != serial);
  516. uart = rt_container_of(serial, struct hc32_uart, serial);
  517. RT_ASSERT(RT_NULL != uart->Instance);
  518. if(Set == USART_GetStatus(uart->Instance, USART_FLAG_RXNE))
  519. {
  520. ch = (rt_uint8_t)USART_RecData(uart->Instance);
  521. }
  522. return ch;
  523. }
  524. static rt_size_t hc32_dma_transmit(struct rt_serial_device *serial,
  525. rt_uint8_t *buf,
  526. rt_size_t size,
  527. int direction)
  528. {
  529. struct hc32_uart *uart;
  530. M4_DMA_TypeDef *DMA_Instance;
  531. uint8_t ch;
  532. RT_ASSERT(RT_NULL != serial);
  533. RT_ASSERT(RT_NULL != buf);
  534. if (size == 0)
  535. {
  536. return 0;
  537. }
  538. uart = rt_container_of(serial, struct hc32_uart, serial);
  539. if (RT_SERIAL_DMA_TX == direction)
  540. {
  541. DMA_Instance = uart->config.dma_tx->Instance;
  542. ch = uart->config.dma_tx->channel;
  543. if (Reset == USART_GetStatus(uart->Instance, USART_FLAG_TC))
  544. {
  545. RT_ASSERT(0);
  546. }
  547. DMA_SetSrcAddr(DMA_Instance, ch, (uint32_t)buf);
  548. DMA_SetTransCnt(DMA_Instance, ch, size);
  549. DMA_ChannelCmd(DMA_Instance, ch, Enable);
  550. USART_FuncCmd(uart->Instance, USART_TX, Enable);
  551. USART_TCI_ENABLE(uart->Instance);
  552. return size;
  553. }
  554. return 0;
  555. }
  556. static void hc32_uart_rx_irq_handler(struct hc32_uart *uart)
  557. {
  558. RT_ASSERT(RT_NULL != uart);
  559. rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_RX_IND);
  560. }
  561. static void hc32_uart_tx_irq_handler(struct hc32_uart *uart)
  562. {
  563. RT_ASSERT(RT_NULL != uart);
  564. if (uart->serial.parent.open_flag & RT_DEVICE_FLAG_INT_TX)
  565. {
  566. rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_TX_DONE);
  567. }
  568. }
  569. static void hc32_uart_rxerr_irq_handler(struct hc32_uart *uart)
  570. {
  571. RT_ASSERT(RT_NULL != uart);
  572. RT_ASSERT(RT_NULL != uart->Instance);
  573. if (Set == USART_GetStatus(uart->Instance, (USART_FLAG_PE | USART_FLAG_FE)))
  574. {
  575. USART_RecData(uart->Instance);
  576. }
  577. USART_ClearStatus(uart->Instance, (USART_CLEAR_FLAG_PE | \
  578. USART_CLEAR_FLAG_FE | \
  579. USART_CLEAR_FLAG_ORE));
  580. }
  581. #ifdef RT_SERIAL_USING_DMA
  582. static void hc32_uart_rx_timeout(struct rt_serial_device *serial)
  583. {
  584. struct hc32_uart *uart;
  585. uint32_t cmp_val;
  586. uint32_t timeout_bits;
  587. M4_TMR0_TypeDef* TMR0_Instance;
  588. uint8_t ch;
  589. stc_tmr0_init_t stcTmr0Init;
  590. RT_ASSERT(RT_NULL != serial);
  591. uart = rt_container_of(serial, struct hc32_uart, serial);
  592. RT_ASSERT(RT_NULL != uart->Instance);
  593. TMR0_Instance = uart->config.rx_timeout->TMR0_Instance;
  594. ch = uart->config.rx_timeout->channel;
  595. timeout_bits = uart->config.rx_timeout->timeout_bits;
  596. if ((M4_USART1 == uart->Instance) || (M4_USART6 == uart->Instance))
  597. {
  598. RT_ASSERT(TMR0_CH_A == ch);
  599. }
  600. else if ((M4_USART2 == uart->Instance) || (M4_USART7 == uart->Instance))
  601. {
  602. RT_ASSERT(TMR0_CH_B == ch);
  603. }
  604. if ((M4_USART1 == uart->Instance) || (M4_USART2 == uart->Instance))
  605. {
  606. RT_ASSERT(M4_TMR0_1 == TMR0_Instance);
  607. PWC_Fcg2PeriphClockCmd(PWC_FCG2_TMR0_1, Enable);
  608. }
  609. else if ((M4_USART6 == uart->Instance) || (M4_USART7 == uart->Instance))
  610. {
  611. RT_ASSERT(M4_TMR0_2 == TMR0_Instance);
  612. PWC_Fcg2PeriphClockCmd(PWC_FCG2_TMR0_2, Enable);
  613. }
  614. /* De-initialize TMR0 */
  615. TMR0_DeInit(TMR0_Instance);
  616. /* Clear CNTAR register */
  617. TMR0_SetCntVal(TMR0_Instance, ch, 0U);
  618. /* TIMER0 basetimer function initialize */
  619. TMR0_StructInit(&stcTmr0Init);
  620. stcTmr0Init.u32ClockDivision = TMR0_CLK_DIV1;
  621. stcTmr0Init.u32ClockSource = TMR0_CLK_SRC_XTAL32;
  622. stcTmr0Init.u32HwTrigFunc = (TMR0_BT_HWTRG_FUNC_START | TMR0_BT_HWTRG_FUNC_CLEAR);
  623. if (TMR0_CLK_DIV1 == stcTmr0Init.u32ClockDivision)
  624. {
  625. cmp_val = (timeout_bits - 4UL);
  626. }
  627. else if (TMR0_CLK_DIV2 == stcTmr0Init.u32ClockDivision)
  628. {
  629. cmp_val = (timeout_bits/2UL - 2UL);
  630. }
  631. else
  632. {
  633. cmp_val = (timeout_bits / (1UL << (stcTmr0Init.u32ClockDivision >> TMR0_BCONR_CKDIVA_POS)) - 1UL);
  634. }
  635. DDL_ASSERT(cmp_val <= 0xFFFFUL);
  636. stcTmr0Init.u16CmpValue = (uint16_t)(cmp_val);
  637. TMR0_Init(TMR0_Instance, ch, &stcTmr0Init);
  638. /* Clear compare flag */
  639. TMR0_ClearStatus(TMR0_Instance, ch);
  640. /* Register RTO interrupt */
  641. hc32_install_irq_handler(&uart->config.rx_timeout->irq_config,
  642. uart_irq_handlers[hc32_get_uart_index(uart->Instance)].rxto_irq_handler,
  643. RT_TRUE);
  644. USART_ClearStatus(uart->Instance, USART_CLEAR_FLAG_RTOF);
  645. USART_FuncCmd(uart->Instance, (USART_RTO | USART_INT_RTO), Enable);
  646. }
  647. static void hc32_dma_config(struct rt_serial_device *serial, rt_ubase_t flag)
  648. {
  649. struct hc32_uart *uart;
  650. stc_dma_init_t dma_init;
  651. M4_DMA_TypeDef *DMA_Instance;
  652. uint32_t DMA_ch;
  653. uint32_t u32Fcg0Periph = PWC_FCG0_AOS;
  654. RT_ASSERT(RT_NULL != serial);
  655. uart = rt_container_of(serial, struct hc32_uart, serial);
  656. RT_ASSERT(RT_NULL != uart->Instance);
  657. if (RT_DEVICE_FLAG_DMA_RX == flag)
  658. {
  659. stc_dma_llp_init_t llp_init;
  660. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  661. RT_ASSERT(RT_NULL != uart->config.rx_timeout->TMR0_Instance);
  662. RT_ASSERT(RT_NULL != uart->config.dma_rx->Instance);
  663. /* Initialization uart rx timeout for DMA */
  664. hc32_uart_rx_timeout(serial);
  665. uart->dma_rx_last_index = 0UL;
  666. /* Get DMA unit&channel */
  667. DMA_Instance = uart->config.dma_rx->Instance;
  668. DMA_ch = uart->config.dma_rx->channel;
  669. /* Enable DMA clock */
  670. u32Fcg0Periph |= (M4_DMA1 == DMA_Instance) ? PWC_FCG0_DMA1:PWC_FCG0_DMA2;
  671. PWC_Fcg0PeriphClockCmd(u32Fcg0Periph, Enable);
  672. /* Disable DMA */
  673. DMA_ChannelCmd(DMA_Instance, DMA_ch, Disable);
  674. /* Initialize DMA */
  675. DMA_StructInit(&dma_init);
  676. dma_init.u32IntEn = DMA_INT_ENABLE;
  677. dma_init.u32SrcAddr = ((uint32_t)(&uart->Instance->DR) + 2UL);
  678. dma_init.u32DestAddr = (uint32_t)rx_fifo->buffer;
  679. dma_init.u32DataWidth = DMA_DATAWIDTH_8BIT;
  680. dma_init.u32BlockSize = 1UL;
  681. dma_init.u32TransCnt = serial->config.bufsz;
  682. dma_init.u32SrcInc = DMA_SRC_ADDR_FIX;
  683. dma_init.u32DestInc = DMA_DEST_ADDR_INC;
  684. DMA_Init(DMA_Instance, DMA_ch, &dma_init);
  685. /* Initialize LLP */
  686. static stc_dma_llp_descriptor_t llp_desc;
  687. llp_init.u32LlpEn = DMA_LLP_ENABLE;
  688. llp_init.u32LlpRun = DMA_LLP_WAIT;
  689. llp_init.u32LlpAddr= (uint32_t)&llp_desc;
  690. DMA_LlpInit(DMA_Instance, DMA_ch, &llp_init);
  691. /* Configure LLP descriptor */
  692. llp_desc.SARx = dma_init.u32SrcAddr;
  693. llp_desc.DARx = dma_init.u32DestAddr;
  694. llp_desc.DTCTLx= (dma_init.u32TransCnt << DMA_DTCTL_CNT_POS) | (dma_init.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);
  695. llp_desc.LLPx = (uint32_t)&llp_desc;
  696. llp_desc.CHCTLx= (dma_init.u32SrcInc | dma_init.u32DestInc | dma_init.u32DataWidth | \
  697. llp_init.u32LlpEn | llp_init.u32LlpRun | dma_init.u32IntEn);
  698. /* Register DMA interrupt */
  699. hc32_install_irq_handler(&uart->config.dma_rx->irq_config,
  700. uart_irq_handlers[hc32_get_uart_index(uart->Instance)].dma_rx_irq_handler,
  701. RT_TRUE);
  702. /* Enable DMA module */
  703. DMA_Cmd(DMA_Instance, Enable);
  704. DMA_TransIntCmd(DMA_Instance, (DMA_TC_INT_CH0 << DMA_ch), Enable);
  705. DMA_SetTriggerSrc(DMA_Instance, DMA_ch, uart->config.dma_rx->trigger_evt_src);
  706. DMA_ChannelCmd(DMA_Instance, DMA_ch, Enable);
  707. }
  708. else if (RT_DEVICE_FLAG_DMA_TX == flag)
  709. {
  710. RT_ASSERT(RT_NULL != uart->config.dma_tx->Instance);
  711. DMA_Instance = uart->config.dma_tx->Instance;
  712. DMA_ch = uart->config.dma_tx->channel;
  713. /* Enable DMA clock */
  714. u32Fcg0Periph |= (M4_DMA1 == DMA_Instance) ? PWC_FCG0_DMA1:PWC_FCG0_DMA2;
  715. PWC_Fcg0PeriphClockCmd(u32Fcg0Periph, Enable);
  716. /* Disable DMA */
  717. DMA_ChannelCmd(DMA_Instance, DMA_ch, Disable);
  718. /* Initialize DMA */
  719. DMA_StructInit(&dma_init);
  720. dma_init.u32IntEn = DMA_INT_DISABLE;
  721. dma_init.u32SrcAddr = 0UL;
  722. dma_init.u32DestAddr = (uint32_t)(&uart->Instance->DR);
  723. dma_init.u32DataWidth = DMA_DATAWIDTH_8BIT;
  724. dma_init.u32BlockSize = 1UL;
  725. dma_init.u32TransCnt = 0UL;
  726. dma_init.u32SrcInc = DMA_SRC_ADDR_INC;
  727. dma_init.u32DestInc = DMA_DEST_ADDR_FIX;
  728. DMA_Init(DMA_Instance, DMA_ch, &dma_init);
  729. /* Enable DMA module */
  730. DMA_Cmd(DMA_Instance, Enable);
  731. DMA_SetTriggerSrc(DMA_Instance, DMA_ch, uart->config.dma_tx->trigger_evt_src);
  732. }
  733. }
  734. static void hc32_uart_tc_irq_handler(struct hc32_uart *uart)
  735. {
  736. RT_ASSERT(uart != RT_NULL);
  737. USART_FuncCmd(uart->Instance, (USART_TX|USART_INT_TC), Disable);
  738. if (uart->serial.parent.open_flag & RT_DEVICE_FLAG_DMA_TX)
  739. {
  740. rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_TX_DMADONE);
  741. }
  742. }
  743. static void hc32_uart_dma_rx_irq_handler(struct hc32_uart *uart)
  744. {
  745. struct rt_serial_device *serial;
  746. rt_size_t recv_len;
  747. rt_base_t level;
  748. RT_ASSERT(RT_NULL != uart);
  749. RT_ASSERT(RT_NULL != uart->Instance);
  750. serial = &uart->serial;
  751. level = rt_hw_interrupt_disable();
  752. recv_len = serial->config.bufsz - uart->dma_rx_last_index;
  753. uart->dma_rx_last_index = 0UL;
  754. rt_hw_interrupt_enable(level);
  755. if (recv_len)
  756. {
  757. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  758. }
  759. }
  760. static void hc32_uart_rxto_irq_handler(struct hc32_uart *uart)
  761. {
  762. rt_base_t level;
  763. rt_size_t cnt;
  764. rt_size_t recv_len;
  765. rt_size_t recv_total_index;
  766. cnt = DMA_TRANS_CNT(uart->config.dma_rx->Instance , uart->config.dma_rx->channel);
  767. recv_total_index = uart->serial.config.bufsz - cnt;
  768. if (0UL != recv_total_index)
  769. {
  770. level = rt_hw_interrupt_disable();
  771. recv_len = recv_total_index - uart->dma_rx_last_index;
  772. uart->dma_rx_last_index = recv_total_index;
  773. rt_hw_interrupt_enable(level);
  774. if (recv_len)
  775. {
  776. rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
  777. }
  778. }
  779. TMR0_Cmd(uart->config.rx_timeout->TMR0_Instance, uart->config.rx_timeout->channel, Disable);
  780. USART_ClearStatus(uart->Instance, USART_CLEAR_FLAG_RTOF);
  781. }
  782. #endif
  783. #if defined(BSP_USING_UART1)
  784. static void hc32_uart1_rx_irq_handler(void)
  785. {
  786. /* enter interrupt */
  787. rt_interrupt_enter();
  788. hc32_uart_rx_irq_handler(&uart_obj[UART1_INDEX]);
  789. /* leave interrupt */
  790. rt_interrupt_leave();
  791. }
  792. static void hc32_uart1_tx_irq_handler(void)
  793. {
  794. /* enter interrupt */
  795. rt_interrupt_enter();
  796. hc32_uart_tx_irq_handler(&uart_obj[UART1_INDEX]);
  797. /* leave interrupt */
  798. rt_interrupt_leave();
  799. }
  800. static void hc32_uart1_rxerr_irq_handler(void)
  801. {
  802. /* enter interrupt */
  803. rt_interrupt_enter();
  804. hc32_uart_rxerr_irq_handler(&uart_obj[UART1_INDEX]);
  805. /* leave interrupt */
  806. rt_interrupt_leave();
  807. }
  808. #if defined(RT_SERIAL_USING_DMA)
  809. static void hc32_uart1_tc_irq_handler(void)
  810. {
  811. #if defined(BSP_UART1_TX_USING_DMA)
  812. /* enter interrupt */
  813. rt_interrupt_enter();
  814. hc32_uart_tc_irq_handler(&uart_obj[UART1_INDEX]);
  815. /* leave interrupt */
  816. rt_interrupt_leave();
  817. #endif
  818. }
  819. static void hc32_uart1_rxto_irq_handler(void)
  820. {
  821. #if defined(BSP_UART1_RX_USING_DMA)
  822. /* enter interrupt */
  823. rt_interrupt_enter();
  824. hc32_uart_rxto_irq_handler(&uart_obj[UART1_INDEX]);
  825. /* leave interrupt */
  826. rt_interrupt_leave();
  827. #endif
  828. }
  829. static void hc32_uart1_dma_rx_irq_handler(void)
  830. {
  831. #if defined(BSP_UART1_RX_USING_DMA)
  832. /* enter interrupt */
  833. rt_interrupt_enter();
  834. hc32_uart_dma_rx_irq_handler(&uart_obj[UART1_INDEX]);
  835. /* leave interrupt */
  836. rt_interrupt_leave();
  837. #endif
  838. }
  839. #endif /* RT_SERIAL_USING_DMA */
  840. #endif /* BSP_USING_UART1 */
  841. #if defined(BSP_USING_UART2)
  842. static void hc32_uart2_rx_irq_handler(void)
  843. {
  844. /* enter interrupt */
  845. rt_interrupt_enter();
  846. hc32_uart_rx_irq_handler(&uart_obj[UART2_INDEX]);
  847. /* leave interrupt */
  848. rt_interrupt_leave();
  849. }
  850. static void hc32_uart2_tx_irq_handler(void)
  851. {
  852. /* enter interrupt */
  853. rt_interrupt_enter();
  854. hc32_uart_tx_irq_handler(&uart_obj[UART2_INDEX]);
  855. /* leave interrupt */
  856. rt_interrupt_leave();
  857. }
  858. static void hc32_uart2_rxerr_irq_handler(void)
  859. {
  860. /* enter interrupt */
  861. rt_interrupt_enter();
  862. hc32_uart_rxerr_irq_handler(&uart_obj[UART2_INDEX]);
  863. /* leave interrupt */
  864. rt_interrupt_leave();
  865. }
  866. #if defined(RT_SERIAL_USING_DMA)
  867. static void hc32_uart2_tc_irq_handler(void)
  868. {
  869. #if defined(BSP_UART2_TX_USING_DMA)
  870. /* enter interrupt */
  871. rt_interrupt_enter();
  872. hc32_uart_tc_irq_handler(&uart_obj[UART2_INDEX]);
  873. /* leave interrupt */
  874. rt_interrupt_leave();
  875. #endif
  876. }
  877. static void hc32_uart2_rxto_irq_handler(void)
  878. {
  879. #if defined(BSP_UART2_RX_USING_DMA)
  880. /* enter interrupt */
  881. rt_interrupt_enter();
  882. hc32_uart_rxto_irq_handler(&uart_obj[UART2_INDEX]);
  883. /* leave interrupt */
  884. rt_interrupt_leave();
  885. #endif
  886. }
  887. static void hc32_uart2_dma_rx_irq_handler(void)
  888. {
  889. #if defined(BSP_UART2_RX_USING_DMA)
  890. /* enter interrupt */
  891. rt_interrupt_enter();
  892. hc32_uart_dma_rx_irq_handler(&uart_obj[UART2_INDEX]);
  893. /* leave interrupt */
  894. rt_interrupt_leave();
  895. #endif
  896. }
  897. #endif /* RT_SERIAL_USING_DMA */
  898. #endif /* BSP_USING_UART2 */
  899. #if defined(BSP_USING_UART3)
  900. static void hc32_uart3_rx_irq_handler(void)
  901. {
  902. /* enter interrupt */
  903. rt_interrupt_enter();
  904. hc32_uart_rx_irq_handler(&uart_obj[UART3_INDEX]);
  905. /* leave interrupt */
  906. rt_interrupt_leave();
  907. }
  908. static void hc32_uart3_tx_irq_handler(void)
  909. {
  910. /* enter interrupt */
  911. rt_interrupt_enter();
  912. hc32_uart_tx_irq_handler(&uart_obj[UART3_INDEX]);
  913. /* leave interrupt */
  914. rt_interrupt_leave();
  915. }
  916. static void hc32_uart3_rxerr_irq_handler(void)
  917. {
  918. /* enter interrupt */
  919. rt_interrupt_enter();
  920. hc32_uart_rxerr_irq_handler(&uart_obj[UART3_INDEX]);
  921. /* leave interrupt */
  922. rt_interrupt_leave();
  923. }
  924. #endif /* BSP_USING_UART3 */
  925. #if defined(BSP_USING_UART4)
  926. static void hc32_uart4_rx_irq_handler(void)
  927. {
  928. /* enter interrupt */
  929. rt_interrupt_enter();
  930. hc32_uart_rx_irq_handler(&uart_obj[UART4_INDEX]);
  931. /* leave interrupt */
  932. rt_interrupt_leave();
  933. }
  934. static void hc32_uart4_tx_irq_handler(void)
  935. {
  936. /* enter interrupt */
  937. rt_interrupt_enter();
  938. hc32_uart_tx_irq_handler(&uart_obj[UART4_INDEX]);
  939. /* leave interrupt */
  940. rt_interrupt_leave();
  941. }
  942. static void hc32_uart4_rxerr_irq_handler(void)
  943. {
  944. /* enter interrupt */
  945. rt_interrupt_enter();
  946. hc32_uart_rxerr_irq_handler(&uart_obj[UART4_INDEX]);
  947. /* leave interrupt */
  948. rt_interrupt_leave();
  949. }
  950. #endif /* BSP_USING_UART4 */
  951. #if defined(BSP_USING_UART5)
  952. static void hc32_uart5_rx_irq_handler(void)
  953. {
  954. /* enter interrupt */
  955. rt_interrupt_enter();
  956. hc32_uart_rx_irq_handler(&uart_obj[UART5_INDEX]);
  957. /* leave interrupt */
  958. rt_interrupt_leave();
  959. }
  960. static void hc32_uart5_tx_irq_handler(void)
  961. {
  962. /* enter interrupt */
  963. rt_interrupt_enter();
  964. hc32_uart_tx_irq_handler(&uart_obj[UART5_INDEX]);
  965. /* leave interrupt */
  966. rt_interrupt_leave();
  967. }
  968. static void hc32_uart5_rxerr_irq_handler(void)
  969. {
  970. /* enter interrupt */
  971. rt_interrupt_enter();
  972. hc32_uart_rxerr_irq_handler(&uart_obj[UART5_INDEX]);
  973. /* leave interrupt */
  974. rt_interrupt_leave();
  975. }
  976. #endif /* BSP_USING_UART5 */
  977. #if defined(BSP_USING_UART6)
  978. static void hc32_uart6_rx_irq_handler(void)
  979. {
  980. /* enter interrupt */
  981. rt_interrupt_enter();
  982. hc32_uart_rx_irq_handler(&uart_obj[UART6_INDEX]);
  983. /* leave interrupt */
  984. rt_interrupt_leave();
  985. }
  986. static void hc32_uart6_tx_irq_handler(void)
  987. {
  988. /* enter interrupt */
  989. rt_interrupt_enter();
  990. hc32_uart_tx_irq_handler(&uart_obj[UART6_INDEX]);
  991. /* leave interrupt */
  992. rt_interrupt_leave();
  993. }
  994. static void hc32_uart6_rxerr_irq_handler(void)
  995. {
  996. /* enter interrupt */
  997. rt_interrupt_enter();
  998. hc32_uart_rxerr_irq_handler(&uart_obj[UART6_INDEX]);
  999. /* leave interrupt */
  1000. rt_interrupt_leave();
  1001. }
  1002. #if defined(RT_SERIAL_USING_DMA)
  1003. static void hc32_uart6_tc_irq_handler(void)
  1004. {
  1005. #if defined(BSP_UART6_TX_USING_DMA)
  1006. /* enter interrupt */
  1007. rt_interrupt_enter();
  1008. hc32_uart_tc_irq_handler(&uart_obj[UART6_INDEX]);
  1009. /* leave interrupt */
  1010. rt_interrupt_leave();
  1011. #endif
  1012. }
  1013. static void hc32_uart6_rxto_irq_handler(void)
  1014. {
  1015. #if defined(BSP_UART6_RX_USING_DMA)
  1016. /* enter interrupt */
  1017. rt_interrupt_enter();
  1018. hc32_uart_rxto_irq_handler(&uart_obj[UART6_INDEX]);
  1019. /* leave interrupt */
  1020. rt_interrupt_leave();
  1021. #endif
  1022. }
  1023. static void hc32_uart6_dma_rx_irq_handler(void)
  1024. {
  1025. #if defined(BSP_UART6_RX_USING_DMA)
  1026. /* enter interrupt */
  1027. rt_interrupt_enter();
  1028. hc32_uart_dma_rx_irq_handler(&uart_obj[UART6_INDEX]);
  1029. /* leave interrupt */
  1030. rt_interrupt_leave();
  1031. #endif
  1032. }
  1033. #endif /* RT_SERIAL_USING_DMA */
  1034. #endif /* BSP_USING_UART6 */
  1035. #if defined(BSP_USING_UART7)
  1036. static void hc32_uart7_rx_irq_handler(void)
  1037. {
  1038. /* enter interrupt */
  1039. rt_interrupt_enter();
  1040. hc32_uart_rx_irq_handler(&uart_obj[UART7_INDEX]);
  1041. /* leave interrupt */
  1042. rt_interrupt_leave();
  1043. }
  1044. static void hc32_uart7_tx_irq_handler(void)
  1045. {
  1046. /* enter interrupt */
  1047. rt_interrupt_enter();
  1048. hc32_uart_tx_irq_handler(&uart_obj[UART7_INDEX]);
  1049. /* leave interrupt */
  1050. rt_interrupt_leave();
  1051. }
  1052. static void hc32_uart7_rxerr_irq_handler(void)
  1053. {
  1054. /* enter interrupt */
  1055. rt_interrupt_enter();
  1056. hc32_uart_rxerr_irq_handler(&uart_obj[UART7_INDEX]);
  1057. /* leave interrupt */
  1058. rt_interrupt_leave();
  1059. }
  1060. #if defined(RT_SERIAL_USING_DMA)
  1061. static void hc32_uart7_tc_irq_handler(void)
  1062. {
  1063. #if defined(BSP_UART7_TX_USING_DMA)
  1064. /* enter interrupt */
  1065. rt_interrupt_enter();
  1066. hc32_uart_tc_irq_handler(&uart_obj[UART7_INDEX]);
  1067. /* leave interrupt */
  1068. rt_interrupt_leave();
  1069. #endif
  1070. }
  1071. static void hc32_uart7_rxto_irq_handler(void)
  1072. {
  1073. #if defined(BSP_UART7_RX_USING_DMA)
  1074. /* enter interrupt */
  1075. rt_interrupt_enter();
  1076. hc32_uart_rxto_irq_handler(&uart_obj[UART7_INDEX]);
  1077. /* leave interrupt */
  1078. rt_interrupt_leave();
  1079. #endif
  1080. }
  1081. static void hc32_uart7_dma_rx_irq_handler(void)
  1082. {
  1083. #if defined(BSP_UART7_RX_USING_DMA)
  1084. /* enter interrupt */
  1085. rt_interrupt_enter();
  1086. hc32_uart_dma_rx_irq_handler(&uart_obj[UART7_INDEX]);
  1087. /* leave interrupt */
  1088. rt_interrupt_leave();
  1089. #endif
  1090. }
  1091. #endif /* RT_SERIAL_USING_DMA */
  1092. #endif /* BSP_USING_UART7 */
  1093. #if defined(BSP_USING_UART8)
  1094. static void hc32_uart8_rx_irq_handler(void)
  1095. {
  1096. /* enter interrupt */
  1097. rt_interrupt_enter();
  1098. hc32_uart_rx_irq_handler(&uart_obj[UART8_INDEX]);
  1099. /* leave interrupt */
  1100. rt_interrupt_leave();
  1101. }
  1102. static void hc32_uart8_tx_irq_handler(void)
  1103. {
  1104. /* enter interrupt */
  1105. rt_interrupt_enter();
  1106. hc32_uart_tx_irq_handler(&uart_obj[UART8_INDEX]);
  1107. /* leave interrupt */
  1108. rt_interrupt_leave();
  1109. }
  1110. static void hc32_uart8_rxerr_irq_handler(void)
  1111. {
  1112. /* enter interrupt */
  1113. rt_interrupt_enter();
  1114. hc32_uart_rxerr_irq_handler(&uart_obj[UART8_INDEX]);
  1115. /* leave interrupt */
  1116. rt_interrupt_leave();
  1117. }
  1118. #endif /* BSP_USING_UART8 */
  1119. #if defined(BSP_USING_UART9)
  1120. static void hc32_uart9_rx_irq_handler(void)
  1121. {
  1122. /* enter interrupt */
  1123. rt_interrupt_enter();
  1124. hc32_uart_rx_irq_handler(&uart_obj[UART9_INDEX]);
  1125. /* leave interrupt */
  1126. rt_interrupt_leave();
  1127. }
  1128. static void hc32_uart9_tx_irq_handler(void)
  1129. {
  1130. /* enter interrupt */
  1131. rt_interrupt_enter();
  1132. hc32_uart_tx_irq_handler(&uart_obj[UART9_INDEX]);
  1133. /* leave interrupt */
  1134. rt_interrupt_leave();
  1135. }
  1136. static void hc32_uart9_rxerr_irq_handler(void)
  1137. {
  1138. /* enter interrupt */
  1139. rt_interrupt_enter();
  1140. hc32_uart_rxerr_irq_handler(&uart_obj[UART9_INDEX]);
  1141. /* leave interrupt */
  1142. rt_interrupt_leave();
  1143. }
  1144. #endif /* BSP_USING_UART9 */
  1145. #if defined(BSP_USING_UART10)
  1146. static void hc32_uart10_rx_irq_handler(void)
  1147. {
  1148. /* enter interrupt */
  1149. rt_interrupt_enter();
  1150. hc32_uart_rx_irq_handler(&uart_obj[UART10_INDEX]);
  1151. /* leave interrupt */
  1152. rt_interrupt_leave();
  1153. }
  1154. static void hc32_uart10_tx_irq_handler(void)
  1155. {
  1156. /* enter interrupt */
  1157. rt_interrupt_enter();
  1158. hc32_uart_tx_irq_handler(&uart_obj[UART10_INDEX]);
  1159. /* leave interrupt */
  1160. rt_interrupt_leave();
  1161. }
  1162. static void hc32_uart10_rxerr_irq_handler(void)
  1163. {
  1164. /* enter interrupt */
  1165. rt_interrupt_enter();
  1166. hc32_uart_rxerr_irq_handler(&uart_obj[UART10_INDEX]);
  1167. /* leave interrupt */
  1168. rt_interrupt_leave();
  1169. }
  1170. #endif /* BSP_USING_UART10 */
  1171. static const struct uart_irq_handler uart_irq_handlers[] =
  1172. {
  1173. #ifdef BSP_USING_UART1
  1174. {hc32_uart1_rxerr_irq_handler, hc32_uart1_rx_irq_handler, hc32_uart1_tx_irq_handler,
  1175. hc32_uart1_tc_irq_handler, hc32_uart1_rxto_irq_handler, hc32_uart1_dma_rx_irq_handler},
  1176. #endif
  1177. #ifdef BSP_USING_UART2
  1178. {hc32_uart2_rxerr_irq_handler, hc32_uart2_rx_irq_handler, hc32_uart2_tx_irq_handler,
  1179. hc32_uart2_tc_irq_handler, hc32_uart2_rxto_irq_handler, hc32_uart2_dma_rx_irq_handler},
  1180. #endif
  1181. #ifdef BSP_USING_UART3
  1182. {hc32_uart3_rxerr_irq_handler, hc32_uart3_rx_irq_handler, hc32_uart3_tx_irq_handler},
  1183. #endif
  1184. #ifdef BSP_USING_UART4
  1185. {hc32_uart4_rxerr_irq_handler, hc32_uart4_rx_irq_handler, hc32_uart4_tx_irq_handler},
  1186. #endif
  1187. #ifdef BSP_USING_UART5
  1188. {hc32_uart5_rxerr_irq_handler, hc32_uart5_rx_irq_handler, hc32_uart5_tx_irq_handler},
  1189. #endif
  1190. #ifdef BSP_USING_UART6
  1191. {hc32_uart6_rxerr_irq_handler, hc32_uart6_rx_irq_handler, hc32_uart6_tx_irq_handler,
  1192. hc32_uart6_tc_irq_handler, hc32_uart6_rxto_irq_handler, hc32_uart6_dma_rx_irq_handler},
  1193. #endif
  1194. #ifdef BSP_USING_UART7
  1195. {hc32_uart7_rxerr_irq_handler, hc32_uart7_rx_irq_handler, hc32_uart7_tx_irq_handler,
  1196. hc32_uart7_tc_irq_handler, hc32_uart7_rxto_irq_handler, hc32_uart7_dma_rx_irq_handler},
  1197. #endif
  1198. #ifdef BSP_USING_UART8
  1199. {hc32_uart8_rxerr_irq_handler, hc32_uart8_rx_irq_handler, hc32_uart8_tx_irq_handler},
  1200. #endif
  1201. #ifdef BSP_USING_UART9
  1202. {hc32_uart9_rxerr_irq_handler, hc32_uart9_rx_irq_handler, hc32_uart9_tx_irq_handler},
  1203. #endif
  1204. #ifdef BSP_USING_UART10
  1205. {hc32_uart10_rxerr_irq_handler, hc32_uart10_rx_irq_handler, hc32_uart10_tx_irq_handler},
  1206. #endif
  1207. };
  1208. static void hc32_uart_get_dma_config(void)
  1209. {
  1210. #ifdef BSP_USING_UART1
  1211. uart_obj[UART1_INDEX].uart_dma_flag = 0;
  1212. #ifdef BSP_UART1_RX_USING_DMA
  1213. uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1214. static struct hc32_uart_rxto uart1_rx_timeout = UART_RXTO_CONFIG(USART1);
  1215. uart_obj[UART1_INDEX].config.rx_timeout = &uart1_rx_timeout;
  1216. static struct dma_config uart1_dma_rx = UART_DMA_RX_CONFIG(USART1);
  1217. uart_obj[UART1_INDEX].config.dma_rx = &uart1_dma_rx;
  1218. #endif
  1219. #ifdef BSP_UART1_TX_USING_DMA
  1220. uart_obj[UART1_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1221. static struct dma_config uart1_dma_tx = UART_DMA_TX_CONFIG(USART1);
  1222. uart_obj[UART1_INDEX].config.dma_tx = &uart1_dma_tx;
  1223. #endif
  1224. #endif
  1225. #ifdef BSP_USING_UART2
  1226. uart_obj[UART2_INDEX].uart_dma_flag = 0;
  1227. #ifdef BSP_UART2_RX_USING_DMA
  1228. uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1229. static struct hc32_uart_rxto uart2_rx_timeout = UART_RXTO_CONFIG(USART2);
  1230. uart_obj[UART2_INDEX].config.rx_timeout = &uart2_rx_timeout;
  1231. static struct dma_config uart2_dma_rx = UART_DMA_RX_CONFIG(USART2);
  1232. uart_obj[UART2_INDEX].config.dma_rx = &uart2_dma_rx;
  1233. #endif
  1234. #ifdef BSP_UART2_TX_USING_DMA
  1235. uart_obj[UART2_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1236. static struct dma_config uart2_dma_tx = UART_DMA_TX_CONFIG(USART2);
  1237. uart_obj[UART2_INDEX].config.dma_tx = &uart2_dma_tx;
  1238. #endif
  1239. #endif
  1240. #ifdef BSP_USING_UART6
  1241. uart_obj[UART6_INDEX].uart_dma_flag = 0;
  1242. #ifdef BSP_UART6_RX_USING_DMA
  1243. uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1244. static struct hc32_uart_rxto uart6_rx_timeout = UART_RXTO_CONFIG(USART6);
  1245. uart_obj[UART6_INDEX].config.rx_timeout = &uart6_rx_timeout;
  1246. static struct dma_config uart6_dma_rx = UART_DMA_RX_CONFIG(USART6);
  1247. uart_obj[UART6_INDEX].config.dma_rx = &uart6_dma_rx;
  1248. #endif
  1249. #ifdef BSP_UART6_TX_USING_DMA
  1250. uart_obj[UART6_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1251. static struct dma_config uart6_dma_tx = UART_DMA_TX_CONFIG(USART6);
  1252. uart_obj[UART6_INDEX].config.dma_tx = &uart6_dma_tx;
  1253. #endif
  1254. #endif
  1255. #ifdef BSP_USING_UART7
  1256. uart_obj[UART7_INDEX].uart_dma_flag = 0;
  1257. #ifdef BSP_UART7_RX_USING_DMA
  1258. uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_RX;
  1259. static struct hc32_uart_rxto uart7_rx_timeout = UART_RXTO_CONFIG(USART7);
  1260. uart_obj[UART7_INDEX].config.rx_timeout = &uart7_rx_timeout;
  1261. static struct dma_config uart7_dma_rx = UART_DMA_RX_CONFIG(USART7);
  1262. uart_obj[UART7_INDEX].config.dma_rx = &uart7_dma_rx;
  1263. #endif
  1264. #ifdef BSP_UART7_TX_USING_DMA
  1265. uart_obj[UART7_INDEX].uart_dma_flag |= RT_DEVICE_FLAG_DMA_TX;
  1266. static struct dma_config uart7_dma_tx = UART_DMA_TX_CONFIG(USART7);
  1267. uart_obj[UART7_INDEX].config.dma_tx = &uart7_dma_tx;
  1268. #endif
  1269. #endif
  1270. }
  1271. static const struct rt_uart_ops hc32_uart_ops =
  1272. {
  1273. .configure = hc32_configure,
  1274. .control = hc32_control,
  1275. .putc = hc32_putc,
  1276. .getc = hc32_getc,
  1277. .dma_transmit = hc32_dma_transmit
  1278. };
  1279. int hc32_hw_uart_init(void)
  1280. {
  1281. rt_err_t result = RT_EOK;
  1282. rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct hc32_uart);
  1283. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  1284. hc32_uart_get_dma_config();
  1285. for (int i = 0; i < obj_num; i++)
  1286. {
  1287. /* init UART object */
  1288. uart_obj[i].serial.ops = &hc32_uart_ops;
  1289. uart_obj[i].serial.config = config;
  1290. /* register UART device */
  1291. result = rt_hw_serial_register(&uart_obj[i].serial,
  1292. uart_obj[i].name,
  1293. (RT_DEVICE_FLAG_RDWR |
  1294. RT_DEVICE_FLAG_INT_RX |
  1295. RT_DEVICE_FLAG_INT_TX |
  1296. uart_obj[i].uart_dma_flag),
  1297. &uart_obj[i]);
  1298. RT_ASSERT(result == RT_EOK);
  1299. }
  1300. return result;
  1301. }
  1302. INIT_BOARD_EXPORT(hc32_hw_uart_init);
  1303. #endif /* RT_USING_SERIAL */
  1304. /*******************************************************************************
  1305. * EOF (not truncated)
  1306. ******************************************************************************/