drv_uart_v2.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309
  1. /*
  2. * Copyright (c) 2022 hpmicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-03-08 hpmicro First version
  9. * 2022-07-28 hpmicro Fix compiling warning if RT_SERIAL_USING_DMA was not defined
  10. * 2022-08-08 hpmicro Integrate DMA Manager and support dynamic DMA resource assignment
  11. *
  12. */
  13. #include <rtthread.h>
  14. #include <rtdevice.h>
  15. #include "board.h"
  16. #include "drv_uart_v2.h"
  17. #include "hpm_uart_drv.h"
  18. #include "hpm_sysctl_drv.h"
  19. #include "hpm_l1c_drv.h"
  20. #include "hpm_dma_drv.h"
  21. #include "hpm_dmamux_drv.h"
  22. #include "hpm_dma_manager.h"
  23. #include "hpm_soc.h"
  24. #ifdef RT_USING_SERIAL_V2
  25. #ifdef RT_SERIAL_USING_DMA
  26. #define BOARD_UART_DMAMUX HPM_DMAMUX
  27. #define UART_DMA_TRIGGER_LEVEL (1U)
  28. typedef struct dma_channel {
  29. struct rt_serial_device *serial;
  30. hpm_dma_resource_t resource;
  31. void (*tranfer_done)(struct rt_serial_device *serial);
  32. void (*tranfer_abort)(struct rt_serial_device *serial);
  33. void (*tranfer_error)(struct rt_serial_device *serial);
  34. } hpm_dma_channel_handle_t;
  35. //static struct dma_channel dma_channels[DMA_SOC_CHANNEL_NUM];
  36. static int hpm_uart_dma_config(struct rt_serial_device *serial, void *arg);
  37. #endif
  38. #define UART_ROOT_CLK_FREQ BOARD_APP_UART_SRC_FREQ
  39. struct hpm_uart {
  40. UART_Type *uart_base;
  41. uint32_t irq_num;
  42. struct rt_serial_device *serial;
  43. char *device_name;
  44. #ifdef RT_SERIAL_USING_DMA
  45. uint32_t tx_dma_mux;
  46. uint32_t rx_dma_mux;
  47. uint32_t dma_flags;
  48. hpm_dma_channel_handle_t tx_chn_ctx;
  49. hpm_dma_channel_handle_t rx_chn_ctx;
  50. bool tx_resource_allocated;
  51. bool rx_resource_allocated;
  52. #endif
  53. };
  54. extern void init_uart_pins(UART_Type *ptr);
  55. static void hpm_uart_isr(struct rt_serial_device *serial);
  56. static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg);
  57. static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void *arg);
  58. static int hpm_uart_putc(struct rt_serial_device *serial, char ch);
  59. static int hpm_uart_getc(struct rt_serial_device *serial);
  60. #ifdef RT_SERIAL_USING_DMA
  61. int hpm_uart_dma_register_channel(struct rt_serial_device *serial,
  62. bool is_tx,
  63. void (*done)(struct rt_serial_device *serial),
  64. void (*abort)(struct rt_serial_device *serial),
  65. void (*error)(struct rt_serial_device *serial))
  66. {
  67. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  68. if (is_tx) {
  69. uart->tx_chn_ctx.serial = serial;
  70. uart->tx_chn_ctx.tranfer_done = done;
  71. uart->tx_chn_ctx.tranfer_abort = abort;
  72. uart->tx_chn_ctx.tranfer_error = error;
  73. } else {
  74. uart->rx_chn_ctx.serial = serial;
  75. uart->rx_chn_ctx.tranfer_done = done;
  76. uart->rx_chn_ctx.tranfer_abort = abort;
  77. uart->rx_chn_ctx.tranfer_error = error;
  78. }
  79. return RT_EOK;
  80. }
  81. #endif /* RT_SERIAL_USING_DMA */
  82. #if defined(BSP_USING_UART0)
  83. struct rt_serial_device serial0;
  84. void uart0_isr(void)
  85. {
  86. hpm_uart_isr(&serial0);
  87. }
  88. SDK_DECLARE_EXT_ISR_M(IRQn_UART0,uart0_isr)
  89. #endif
  90. #if defined(BSP_USING_UART1)
  91. struct rt_serial_device serial1;
  92. void uart1_isr(void)
  93. {
  94. hpm_uart_isr(&serial1);
  95. }
  96. SDK_DECLARE_EXT_ISR_M(IRQn_UART1,uart1_isr)
  97. #endif
  98. #if defined(BSP_USING_UART2)
  99. struct rt_serial_device serial2;
  100. void uart2_isr(void)
  101. {
  102. hpm_uart_isr(&serial2);
  103. }
  104. SDK_DECLARE_EXT_ISR_M(IRQn_UART2,uart2_isr)
  105. #endif
  106. #if defined(BSP_USING_UART3)
  107. struct rt_serial_device serial3;
  108. void uart3_isr(void)
  109. {
  110. hpm_uart_isr(&serial3);
  111. }
  112. SDK_DECLARE_EXT_ISR_M(IRQn_UART3,uart3_isr)
  113. #endif
  114. #if defined(BSP_USING_UART4)
  115. struct rt_serial_device serial4;
  116. void uart4_isr(void)
  117. {
  118. hpm_uart_isr(&serial4);
  119. }
  120. SDK_DECLARE_EXT_ISR_M(IRQn_UART4,uart4_isr)
  121. #endif
  122. #if defined(BSP_USING_UART5)
  123. struct rt_serial_device serial5;
  124. void uart5_isr(void)
  125. {
  126. hpm_uart_isr(&serial5);
  127. }
  128. SDK_DECLARE_EXT_ISR_M(IRQn_UART5,uart5_isr)
  129. #endif
  130. #if defined(BSP_USING_UART6)
  131. struct rt_serial_device serial6;
  132. void uart6_isr(void)
  133. {
  134. hpm_uart_isr(&serial6);
  135. }
  136. SDK_DECLARE_EXT_ISR_M(IRQn_UART6,uart6_isr)
  137. #endif
  138. #if defined(BSP_USING_UART7)
  139. struct rt_serial_device serial7;
  140. void uart7_isr(void)
  141. {
  142. hpm_uart_isr(&serial7);
  143. }
  144. SDK_DECLARE_EXT_ISR_M(IRQn_UART7,uart7_isr)
  145. #endif
  146. #if defined(BSP_USING_UART8)
  147. struct rt_serial_device serial8;
  148. void uart8_isr(void)
  149. {
  150. hpm_uart_isr(&serial8);
  151. }
  152. SDK_DECLARE_EXT_ISR_M(IRQn_UART8,uart8_isr)
  153. #endif
  154. #if defined(BSP_USING_UART9)
  155. struct rt_serial_device serial9;
  156. void uart9_isr(void)
  157. {
  158. hpm_uart_isr(&serial9);
  159. }
  160. SDK_DECLARE_EXT_ISR_M(IRQn_UART9,uart9_isr)
  161. #endif
  162. #if defined(BSP_USING_UART10)
  163. struct rt_serial_device serial10;
  164. void uart10_isr(void)
  165. {
  166. hpm_uart_isr(&serial10);
  167. }
  168. SDK_DECLARE_EXT_ISR_M(IRQn_UART10,uart10_isr)
  169. #endif
  170. #if defined(BSP_USING_UART11)
  171. struct rt_serial_device serial11;
  172. void uart11_isr(void)
  173. {
  174. hpm_uart_isr(&serial11);
  175. }
  176. SDK_DECLARE_EXT_ISR_M(IRQn_UART11,uart11_isr)
  177. #endif
  178. #if defined(BSP_USING_UART12)
  179. struct rt_serial_device serial12;
  180. void uart12_isr(void)
  181. {
  182. hpm_uart_isr(&serial12);
  183. }
  184. SDK_DECLARE_EXT_ISR_M(IRQn_UART12,uart12_isr)
  185. #endif
  186. #if defined(BSP_USING_UART13)
  187. struct rt_serial_device serial13;
  188. void uart13_isr(void)
  189. {
  190. hpm_uart_isr(&serial13);
  191. }
  192. SDK_DECLARE_EXT_ISR_M(IRQn_UART13,uart13_isr)
  193. #endif
  194. #if defined(BSP_USING_UART14)
  195. struct rt_serial_device serial14;
  196. void uart14_isr(void)
  197. {
  198. hpm_uart_isr(&serial14);
  199. }
  200. SDK_DECLARE_EXT_ISR_M(IRQn_UART14,uart14_isr)
  201. #endif
  202. #if defined(BSP_USING_UART15)
  203. struct rt_serial_device serial15;
  204. void uart15_isr(void)
  205. {
  206. hpm_uart_isr(&serial15);
  207. }
  208. SDK_DECLARE_EXT_ISR_M(IRQn_UART15,uart15_isr)
  209. #endif
  210. static struct hpm_uart uarts[] =
  211. {
  212. #if defined(BSP_USING_UART0)
  213. {
  214. HPM_UART0,
  215. IRQn_UART0,
  216. &serial0,
  217. "uart0",
  218. #ifdef RT_SERIAL_USING_DMA
  219. HPM_DMA_SRC_UART0_TX,
  220. HPM_DMA_SRC_UART0_RX,
  221. 0,
  222. #endif
  223. },
  224. #endif
  225. #if defined(BSP_USING_UART1)
  226. {
  227. HPM_UART1,
  228. IRQn_UART1,
  229. &serial1,
  230. "uart1",
  231. #ifdef RT_SERIAL_USING_DMA
  232. HPM_DMA_SRC_UART1_TX,
  233. HPM_DMA_SRC_UART1_RX,
  234. 0,
  235. #endif
  236. },
  237. #endif
  238. #if defined(BSP_USING_UART2)
  239. {
  240. HPM_UART2,
  241. IRQn_UART2,
  242. &serial2,
  243. "uart2",
  244. #ifdef RT_SERIAL_USING_DMA
  245. HPM_DMA_SRC_UART2_TX,
  246. HPM_DMA_SRC_UART2_RX,
  247. 0,
  248. #endif
  249. },
  250. #endif
  251. #if defined(BSP_USING_UART3)
  252. {
  253. HPM_UART3,
  254. IRQn_UART3,
  255. &serial3,
  256. "uart3",
  257. #ifdef RT_SERIAL_USING_DMA
  258. HPM_DMA_SRC_UART3_TX,
  259. HPM_DMA_SRC_UART3_RX,
  260. 0,
  261. #endif
  262. },
  263. #endif
  264. #if defined(BSP_USING_UART4)
  265. {
  266. HPM_UART4,
  267. IRQn_UART4,
  268. &serial4,
  269. "uart4",
  270. #ifdef RT_SERIAL_USING_DMA
  271. HPM_DMA_SRC_UART4_TX,
  272. HPM_DMA_SRC_UART4_RX,
  273. 0,
  274. #endif
  275. },
  276. #endif
  277. #if defined(BSP_USING_UART5)
  278. {
  279. HPM_UART5,
  280. IRQn_UART5,
  281. &serial5,
  282. "uart5",
  283. #ifdef RT_SERIAL_USING_DMA
  284. HPM_DMA_SRC_UART5_TX,
  285. HPM_DMA_SRC_UART5_RX,
  286. 0,
  287. #endif
  288. },
  289. #endif
  290. #if defined(BSP_USING_UART6)
  291. {
  292. HPM_UART6,
  293. IRQn_UART6,
  294. &serial6,
  295. "uart6",
  296. #ifdef RT_SERIAL_USING_DMA
  297. HPM_DMA_SRC_UART6_TX,
  298. HPM_DMA_SRC_UART6_RX,
  299. 0,
  300. #endif
  301. },
  302. #endif
  303. #if defined(BSP_USING_UART7)
  304. {
  305. HPM_UART7,
  306. IRQn_UART7,
  307. &serial7,
  308. "uart7",
  309. #ifdef RT_SERIAL_USING_DMA
  310. HPM_DMA_SRC_UART7_TX,
  311. HPM_DMA_SRC_UART7_RX,
  312. 0,
  313. #endif
  314. },
  315. #endif
  316. #if defined(BSP_USING_UART8)
  317. {
  318. HPM_UART8,
  319. IRQn_UART8,
  320. &serial8,
  321. "uart8",
  322. #ifdef RT_SERIAL_USING_DMA
  323. HPM_DMA_SRC_UART8_TX,
  324. HPM_DMA_SRC_UART8_RX,
  325. 0,
  326. #endif
  327. },
  328. #endif
  329. #if defined(BSP_USING_UART9)
  330. {
  331. HPM_UART9,
  332. IRQn_UART9,
  333. &serial9,
  334. "uart9",
  335. #ifdef RT_SERIAL_USING_DMA
  336. HPM_DMA_SRC_UART9_TX,
  337. HPM_DMA_SRC_UART9_RX,
  338. 0,
  339. #endif
  340. },
  341. #endif
  342. #if defined(BSP_USING_UART10)
  343. {
  344. HPM_UART10,
  345. IRQn_UART10,
  346. &serial10,
  347. "uart10",
  348. #ifdef RT_SERIAL_USING_DMA
  349. HPM_DMA_SRC_UART10_TX,
  350. HPM_DMA_SRC_UART10_RX,
  351. 0,
  352. #endif
  353. },
  354. #endif
  355. #if defined(BSP_USING_UART11)
  356. {
  357. HPM_UART11,
  358. IRQn_UART11,
  359. &serial11,
  360. "uart11",
  361. #ifdef RT_SERIAL_USING_DMA
  362. HPM_DMA_SRC_UART11_TX,
  363. HPM_DMA_SRC_UART11_RX,
  364. 0,
  365. #endif
  366. },
  367. #endif
  368. #if defined(BSP_USING_UART12)
  369. {
  370. HPM_UART12,
  371. IRQn_UART12,
  372. &serial12,
  373. "uart12",
  374. #ifdef RT_SERIAL_USING_DMA
  375. HPM_DMA_SRC_UART12_TX,
  376. HPM_DMA_SRC_UART12_RX,
  377. 0,
  378. #endif
  379. },
  380. #endif
  381. #if defined(BSP_USING_UART13)
  382. {
  383. HPM_UART13,
  384. IRQn_UART13,
  385. &serial13,
  386. "uart13",
  387. #ifdef RT_SERIAL_USING_DMA
  388. HPM_DMA_SRC_UART13_TX,
  389. HPM_DMA_SRC_UART13_RX,
  390. 0,
  391. #endif
  392. },
  393. #endif
  394. #if defined(BSP_USING_UART14)
  395. {
  396. HPM_UART14,
  397. IRQn_UART14,
  398. &serial14,
  399. "uart14",
  400. #ifdef RT_SERIAL_USING_DMA
  401. HPM_DMA_SRC_UART14_TX,
  402. HPM_DMA_SRC_UART14_RX,
  403. 0,
  404. #endif
  405. },
  406. #endif
  407. #if defined(BSP_USING_UART15)
  408. {
  409. HPM_UART15,
  410. IRQn_UART15,
  411. &serial15,
  412. "uart15",
  413. #ifdef RT_SERIAL_USING_DMA
  414. HPM_DMA_SRC_UART15_TX,
  415. HPM_DMA_SRC_UART15_RX,
  416. 0,
  417. #endif
  418. },
  419. #endif
  420. };
  421. enum
  422. {
  423. #if defined(BSP_USING_UART0)
  424. HPM_UART0_INDEX,
  425. #endif
  426. #if defined(BSP_USING_UART1)
  427. HPM_UART1_INDEX,
  428. #endif
  429. #if defined(BSP_USING_UART2)
  430. HPM_UART2_INDEX,
  431. #endif
  432. #if defined(BSP_USING_UART3)
  433. HPM_UART3_INDEX,
  434. #endif
  435. #if defined(BSP_USING_UART4)
  436. HPM_UART4_INDEX,
  437. #endif
  438. #if defined(BSP_USING_UART5)
  439. HPM_UART15_INDEX,
  440. #endif
  441. #if defined(BSP_USING_UART6)
  442. HPM_UART6_INDEX,
  443. #endif
  444. #if defined(BSP_USING_UART7)
  445. HPM_UART7_INDEX,
  446. #endif
  447. #if defined(BSP_USING_UART8)
  448. HPM_UART8_INDEX,
  449. #endif
  450. #if defined(BSP_USING_UART9)
  451. HPM_UART10_INDEX,
  452. #endif
  453. #if defined(BSP_USING_UART10)
  454. HPM_UART10_INDEX,
  455. #endif
  456. #if defined(BSP_USING_UART11)
  457. HPM_UART11_INDEX,
  458. #endif
  459. #if defined(BSP_USING_UART12)
  460. HPM_UART12_INDEX,
  461. #endif
  462. #if defined(BSP_USING_UART13)
  463. HPM_UART13_INDEX,
  464. #endif
  465. #if defined(BSP_USING_UART14)
  466. HPM_UART14_INDEX,
  467. #endif
  468. #if defined(BSP_USING_UART15)
  469. HPM_UART15_INDEX,
  470. #endif
  471. };
  472. #if defined(RT_SERIAL_USING_DMA)
  473. static void uart_dma_callback(DMA_Type *base, uint32_t channel, void *user_data, uint32_t int_stat)
  474. {
  475. hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
  476. if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
  477. {
  478. return;
  479. }
  480. if (IS_HPM_BITMASK_SET(int_stat, DMA_CHANNEL_STATUS_TC) && (dma_handle->tranfer_done != NULL))
  481. {
  482. dma_handle->tranfer_done(dma_handle->serial);
  483. }
  484. if (IS_HPM_BITMASK_SET(int_stat, DMA_CHANNEL_STATUS_ABORT) && (dma_handle->tranfer_abort != NULL))
  485. {
  486. dma_handle->tranfer_abort(dma_handle->serial);
  487. }
  488. if (IS_HPM_BITMASK_SET(int_stat, DMA_CHANNEL_STATUS_ERROR) && (dma_handle->tranfer_error != NULL))
  489. {
  490. dma_handle->tranfer_error(dma_handle->serial);
  491. }
  492. }
  493. static void uart_tx_done(struct rt_serial_device *serial)
  494. {
  495. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
  496. }
  497. static void uart_rx_done(struct rt_serial_device *serial)
  498. {
  499. struct rt_serial_rx_fifo *rx_fifo;
  500. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  501. if (l1c_dc_is_enabled()) {
  502. l1c_dc_invalidate((uint32_t)rx_fifo->buffer, serial->config.rx_bufsz);
  503. }
  504. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (serial->config.rx_bufsz << 8));
  505. /* prepare for next read */
  506. hpm_uart_dma_config(serial, (void *)RT_DEVICE_FLAG_DMA_RX);
  507. }
  508. #endif /* RT_SERIAL_USING_DMA */
  509. /**
  510. * @brief UART common interrupt process. This
  511. *
  512. * @param serial Serial device
  513. */
  514. static void hpm_uart_isr(struct rt_serial_device *serial)
  515. {
  516. struct hpm_uart *uart;
  517. rt_uint32_t stat, enabled_irq;
  518. RT_ASSERT(serial != RT_NULL);
  519. uart = (struct hpm_uart *)serial->parent.user_data;
  520. RT_ASSERT(uart != RT_NULL);
  521. /* enter interrupt */
  522. rt_interrupt_enter();
  523. stat = uart_get_status(uart->uart_base);
  524. enabled_irq = uart_get_enabled_irq(uart->uart_base);
  525. if ((enabled_irq & uart_intr_rx_data_avail_or_timeout) && (stat & uart_stat_data_ready)) {
  526. struct rt_serial_rx_fifo *rx_fifo;
  527. rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
  528. rt_uint8_t put_char = 0;
  529. uart_receive_byte(uart->uart_base, &put_char);
  530. rt_ringbuffer_putchar(&(rx_fifo->rb), put_char);
  531. /* UART in mode Receiver */
  532. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  533. }
  534. if ((enabled_irq & uart_intr_tx_slot_avail) && (stat & uart_stat_tx_slot_avail)) {
  535. /* UART in mode Transmitter */
  536. struct rt_serial_tx_fifo *tx_fifo;
  537. tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
  538. RT_ASSERT(tx_fifo != RT_NULL);
  539. rt_uint8_t put_char = 0;
  540. for (;;) {
  541. if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char)) {
  542. uart_send_byte(uart->uart_base, put_char);
  543. } else {
  544. uart_disable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  545. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
  546. break;
  547. }
  548. }
  549. }
  550. /* leave interrupt */
  551. rt_interrupt_leave();
  552. }
  553. static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  554. {
  555. RT_ASSERT(serial != RT_NULL);
  556. RT_ASSERT(cfg != RT_NULL);
  557. uart_config_t uart_config;
  558. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  559. init_uart_pins(uart->uart_base);
  560. uart_default_config(uart->uart_base, &uart_config);
  561. uart_config.src_freq_in_hz = board_init_uart_clock(uart->uart_base);
  562. uart_config.baudrate = cfg->baud_rate;
  563. uart_config.num_of_stop_bits = cfg->stop_bits;
  564. uart_config.parity = cfg->parity;
  565. #ifdef RT_SERIAL_USING_DMA
  566. if (uart->dma_flags & (RT_DEVICE_FLAG_DMA_TX | RT_DEVICE_FLAG_DMA_RX)) {
  567. uart_config.fifo_enable = true;
  568. uart_config.dma_enable = true;
  569. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_TX) {
  570. uart_config.tx_fifo_level = uart_tx_fifo_trg_not_full;
  571. }
  572. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_RX) {
  573. uart_config.rx_fifo_level = uart_rx_fifo_trg_not_empty;
  574. }
  575. }
  576. #endif
  577. uart_config.word_length = cfg->data_bits - DATA_BITS_5;
  578. hpm_stat_t status = uart_init(uart->uart_base, &uart_config);
  579. return (status != status_success) ? -RT_ERROR : RT_EOK;
  580. }
  581. #ifdef RT_SERIAL_USING_DMA
  582. hpm_stat_t hpm_uart_dma_rx_init(struct hpm_uart *uart_ctx)
  583. {
  584. hpm_stat_t status = status_fail;
  585. if (!uart_ctx->rx_resource_allocated)
  586. {
  587. status = dma_manager_request_resource(&uart_ctx->rx_chn_ctx.resource);
  588. if (status == status_success)
  589. {
  590. uart_ctx->dma_flags |= RT_DEVICE_FLAG_DMA_RX;
  591. uart_ctx->rx_resource_allocated = true;
  592. dma_manager_install_interrupt_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_callback, &uart_ctx->rx_chn_ctx);
  593. }
  594. }
  595. return status;
  596. }
  597. hpm_stat_t hpm_uart_dma_tx_init(struct hpm_uart *uart_ctx)
  598. {
  599. hpm_stat_t status = status_fail;
  600. if (!uart_ctx->tx_resource_allocated)
  601. {
  602. status = dma_manager_request_resource(&uart_ctx->tx_chn_ctx.resource);
  603. if (status == status_success)
  604. {
  605. uart_ctx->dma_flags |= RT_DEVICE_FLAG_DMA_TX;
  606. uart_ctx->tx_resource_allocated = true;
  607. dma_manager_install_interrupt_callback(&uart_ctx->tx_chn_ctx.resource, uart_dma_callback, &uart_ctx->tx_chn_ctx);
  608. }
  609. }
  610. return status;
  611. }
  612. static rt_err_t hpm_uart_dma_config(struct rt_serial_device *serial, void *arg)
  613. {
  614. rt_ubase_t ctrl_arg = (rt_ubase_t) arg;
  615. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  616. dma_handshake_config_t config;
  617. struct rt_serial_rx_fifo *rx_fifo;
  618. if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) {
  619. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  620. config.ch_index = uart->rx_chn_ctx.resource.channel;
  621. config.dst = (uint32_t) rx_fifo->buffer;
  622. config.dst_fixed = false;
  623. config.src = (uint32_t)&(uart->uart_base->RBR);
  624. config.src_fixed = true;
  625. config.size_in_byte = serial->config.rx_bufsz;
  626. if (status_success != dma_setup_handshake(uart->rx_chn_ctx.resource.base, &config)) {
  627. return -RT_ERROR;
  628. }
  629. uint32_t mux = DMA_SOC_CHN_TO_DMAMUX_CHN(uart->rx_chn_ctx.resource.base, uart->rx_dma_mux);
  630. dmamux_config(BOARD_UART_DMAMUX, uart->rx_chn_ctx.resource.channel, mux, true);
  631. hpm_uart_dma_register_channel(serial, false, uart_rx_done, RT_NULL, RT_NULL);
  632. intc_m_enable_irq(uart->rx_chn_ctx.resource.irq_num);
  633. } else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) {
  634. uint32_t mux = DMA_SOC_CHN_TO_DMAMUX_CHN(uart->tx_chn_ctx.resource.base, uart->tx_dma_mux);
  635. dmamux_config(BOARD_UART_DMAMUX, uart->tx_chn_ctx.resource.channel, mux, true);
  636. intc_m_enable_irq(uart->tx_chn_ctx.resource.irq_num);
  637. }
  638. return RT_EOK;
  639. }
  640. static void hpm_uart_transmit_dma(DMA_Type *dma, uint32_t ch_num, UART_Type *uart, uint8_t *src, uint32_t size)
  641. {
  642. rt_base_t align = 0;
  643. dma_handshake_config_t config;
  644. config.ch_index = ch_num;
  645. config.dst = (uint32_t)&uart->THR;
  646. config.dst_fixed = true;
  647. config.src = (uint32_t) src;
  648. config.src_fixed = false;
  649. config.size_in_byte = size;
  650. dma_setup_handshake(dma, &config);
  651. }
  652. #endif /* RT_SERIAL_USING_DMA */
  653. static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
  654. {
  655. RT_ASSERT(serial != RT_NULL);
  656. rt_ubase_t ctrl_arg = (rt_ubase_t) arg;
  657. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  658. if(ctrl_arg & (RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING))
  659. {
  660. #ifdef RT_SERIAL_USING_DMA
  661. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_RX)
  662. {
  663. ctrl_arg = RT_DEVICE_FLAG_DMA_RX;
  664. }
  665. else
  666. #endif
  667. {
  668. ctrl_arg = RT_DEVICE_FLAG_INT_RX;
  669. }
  670. }
  671. else if(ctrl_arg & (RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING))
  672. {
  673. #ifdef RT_SERIAL_USING_DMA
  674. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_TX)
  675. {
  676. ctrl_arg = RT_DEVICE_FLAG_DMA_TX;
  677. }
  678. else
  679. #endif
  680. {
  681. ctrl_arg = RT_DEVICE_FLAG_INT_TX;
  682. }
  683. }
  684. switch (cmd) {
  685. case RT_DEVICE_CTRL_CLR_INT:
  686. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) {
  687. /* disable rx irq */
  688. uart_disable_irq(uart->uart_base, uart_intr_rx_data_avail_or_timeout);
  689. intc_m_disable_irq(uart->irq_num);
  690. }
  691. else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX) {
  692. /* disable tx irq */
  693. uart_disable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  694. intc_m_disable_irq(uart->irq_num);
  695. }
  696. #ifdef RT_SERIAL_USING_DMA
  697. else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) {
  698. dma_manager_disable_channel_interrupt(&uart->tx_chn_ctx.resource, DMA_INTERRUPT_MASK_ALL);
  699. dma_abort_channel(uart->tx_chn_ctx.resource.base, uart->tx_chn_ctx.resource.channel);
  700. } else if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) {
  701. dma_manager_disable_channel_interrupt(&uart->rx_chn_ctx.resource, DMA_INTERRUPT_MASK_ALL);
  702. dma_abort_channel(uart->rx_chn_ctx.resource.base, uart->rx_chn_ctx.resource.channel);
  703. }
  704. #endif
  705. break;
  706. case RT_DEVICE_CTRL_SET_INT:
  707. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) {
  708. /* enable rx irq */
  709. uart_enable_irq(uart->uart_base, uart_intr_rx_data_avail_or_timeout);
  710. intc_m_enable_irq_with_priority(uart->irq_num, 1);
  711. } else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX) {
  712. /* enable tx irq */
  713. uart_enable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  714. intc_m_enable_irq_with_priority(uart->irq_num, 1);
  715. }
  716. break;
  717. case RT_DEVICE_CTRL_CONFIG:
  718. #ifdef RT_SERIAL_USING_DMA
  719. if (ctrl_arg & (RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX)) {
  720. hpm_uart_dma_config(serial, (void *)ctrl_arg);
  721. } else
  722. #endif
  723. {
  724. hpm_uart_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)ctrl_arg);
  725. }
  726. break;
  727. case RT_DEVICE_CHECK_OPTMODE:
  728. #ifdef RT_SERIAL_USING_DMA
  729. if ((ctrl_arg & RT_DEVICE_FLAG_DMA_TX)) {
  730. return RT_SERIAL_TX_BLOCKING_NO_BUFFER;
  731. } else
  732. #endif
  733. {
  734. return RT_SERIAL_TX_BLOCKING_BUFFER;
  735. }
  736. }
  737. return RT_EOK;
  738. }
  739. static int hpm_uart_putc(struct rt_serial_device *serial, char ch)
  740. {
  741. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  742. uart_send_byte(uart->uart_base, ch);
  743. uart_flush(uart->uart_base);
  744. return ch;
  745. }
  746. static int hpm_uart_getc(struct rt_serial_device *serial)
  747. {
  748. int result = -1;
  749. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  750. if (uart_check_status(uart->uart_base, uart_stat_data_ready)) {
  751. uart_receive_byte(uart->uart_base, (uint8_t*)&result);
  752. }
  753. return result;
  754. }
  755. static rt_ssize_t hpm_uart_transmit(struct rt_serial_device *serial,
  756. rt_uint8_t *buf,
  757. rt_size_t size,
  758. rt_uint32_t tx_flag)
  759. {
  760. RT_ASSERT(serial != RT_NULL);
  761. RT_ASSERT(buf != RT_NULL);
  762. RT_ASSERT(size);
  763. #ifdef RT_SERIAL_USING_DMA
  764. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  765. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_TX) {
  766. hpm_uart_dma_register_channel(serial, true, uart_tx_done, RT_NULL, RT_NULL);
  767. intc_m_enable_irq(uart->tx_chn_ctx.resource.irq_num);
  768. hpm_uart_transmit_dma(uart->tx_chn_ctx.resource.base, uart->tx_chn_ctx.resource.channel, uart->uart_base, buf, size);
  769. return size;
  770. }
  771. #endif
  772. hpm_uart_control(serial, RT_DEVICE_CTRL_CONFIG, (void *)tx_flag);
  773. return size;
  774. }
  775. static const struct rt_uart_ops hpm_uart_ops = {
  776. hpm_uart_configure,
  777. hpm_uart_control,
  778. hpm_uart_putc,
  779. hpm_uart_getc,
  780. hpm_uart_transmit,
  781. };
  782. static int hpm_uart_config(void)
  783. {
  784. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  785. hpm_stat_t status = status_success;
  786. #ifdef BSP_USING_UART0
  787. uarts[HPM_UART0_INDEX].serial->config = config;
  788. uarts[HPM_UART0_INDEX].serial->config.rx_bufsz = BSP_UART0_RX_BUFSIZE;
  789. uarts[HPM_UART0_INDEX].serial->config.tx_bufsz = BSP_UART0_TX_BUFSIZE;
  790. #ifdef RT_SERIAL_USING_DMA
  791. uarts[HPM_UART0_INDEX].dma_flags = 0;
  792. #ifdef BSP_UART0_RX_USING_DMA
  793. status = hpm_uart_dma_rx_init(&uarts[HPM_UART0_INDEX]);
  794. if (status != status_success)
  795. {
  796. return -RT_ERROR;
  797. }
  798. #endif //BSP_UART0_RX_USING_DMA
  799. #ifdef BSP_UART0_TX_USING_DMA
  800. status = hpm_uart_dma_tx_init(&uarts[HPM_UART0_INDEX]);
  801. if (status != status_success)
  802. {
  803. return -RT_ERROR;
  804. }
  805. #endif //BSP_UART0_TX_USING_DMA
  806. #endif // RT_SERIAL_USING_DMA
  807. #endif //BSP_USING_UART0
  808. #ifdef BSP_USING_UART1
  809. uarts[HPM_UART1_INDEX].serial->config = config;
  810. uarts[HPM_UART1_INDEX].serial->config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
  811. uarts[HPM_UART1_INDEX].serial->config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
  812. #ifdef RT_SERIAL_USING_DMA
  813. uarts[HPM_UART1_INDEX].dma_flags = 0;
  814. #ifdef BSP_UART1_RX_USING_DMA
  815. status = hpm_uart_dma_rx_init(&uarts[HPM_UART1_INDEX]);
  816. if (status != status_success)
  817. {
  818. return -RT_ERROR;
  819. }
  820. #endif //BSP_UART1_RX_USING_DMA
  821. #ifdef BSP_UART1_TX_USING_DMA
  822. status = hpm_uart_dma_tx_init(&uarts[HPM_UART1_INDEX]);
  823. if (status != status_success)
  824. {
  825. return -RT_ERROR;
  826. }
  827. #endif //BSP_UART1_TX_USING_DMA
  828. #endif // RT_SERIAL_USING_DMA
  829. #endif //BSP_USING_UART1
  830. #ifdef BSP_USING_UART2
  831. uarts[HPM_UART2_INDEX].serial->config = config;
  832. uarts[HPM_UART2_INDEX].serial->config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
  833. uarts[HPM_UART2_INDEX].serial->config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
  834. #ifdef RT_SERIAL_USING_DMA
  835. uarts[HPM_UART2_INDEX].dma_flags = 0;
  836. #ifdef BSP_UART2_RX_USING_DMA
  837. status = hpm_uart_dma_rx_init(&uarts[HPM_UART2_INDEX]);
  838. if (status != status_success)
  839. {
  840. return -RT_ERROR;
  841. }
  842. #endif //BSP_UART2_RX_USING_DMA
  843. #ifdef BSP_UART2_TX_USING_DMA
  844. status = hpm_uart_dma_tx_init(&uarts[HPM_UART2_INDEX]);
  845. if (status != status_success)
  846. {
  847. return -RT_ERROR;
  848. }
  849. #endif //BSP_UART2_TX_USING_DMA
  850. #endif // RT_SERIAL_USING_DMA
  851. #endif //BSP_USING_UART2
  852. #ifdef BSP_USING_UART3
  853. uarts[HPM_UART3_INDEX].serial->config = config;
  854. uarts[HPM_UART3_INDEX].serial->config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
  855. uarts[HPM_UART3_INDEX].serial->config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
  856. #ifdef RT_SERIAL_USING_DMA
  857. uarts[HPM_UART3_INDEX].dma_flags = 0;
  858. #ifdef BSP_UART3_RX_USING_DMA
  859. status = hpm_uart_dma_rx_init(&uarts[HPM_UART3_INDEX]);
  860. if (status != status_success)
  861. {
  862. return -RT_ERROR;
  863. }
  864. #endif //BSP_UART3_RX_USING_DMA
  865. #ifdef BSP_UART3_TX_USING_DMA
  866. status = hpm_uart_dma_tx_init(&uarts[HPM_UART3_INDEX]);
  867. if (status != status_success)
  868. {
  869. return -RT_ERROR;
  870. }
  871. #endif //BSP_UART3_TX_USING_DMA
  872. #endif // RT_SERIAL_USING_DMA
  873. #endif //BSP_USING_UART3
  874. #ifdef BSP_USING_UART4
  875. uarts[HPM_UART4_INDEX].serial->config = config;
  876. uarts[HPM_UART4_INDEX].serial->config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
  877. uarts[HPM_UART4_INDEX].serial->config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
  878. #ifdef RT_SERIAL_USING_DMA
  879. uarts[HPM_UART4_INDEX].dma_flags = 0;
  880. #ifdef BSP_UART4_RX_USING_DMA
  881. status = hpm_uart_dma_rx_init(&uarts[HPM_UART4_INDEX]);
  882. if (status != status_success)
  883. {
  884. return -RT_ERROR;
  885. }
  886. #endif //BSP_UART4_RX_USING_DMA
  887. #ifdef BSP_UART4_TX_USING_DMA
  888. status = hpm_uart_dma_tx_init(&uarts[HPM_UART4_INDEX]);
  889. if (status != status_success)
  890. {
  891. return -RT_ERROR;
  892. }
  893. #endif //BSP_UART4_TX_USING_DMA
  894. #endif // RT_SERIAL_USING_DMA
  895. #endif //BSP_USING_UART4
  896. #ifdef BSP_USING_UART5
  897. uarts[HPM_UART5_INDEX].serial->config = config;
  898. uarts[HPM_UART5_INDEX].serial->config.rx_bufsz = BSP_UART5_RX_BUFSIZE;
  899. uarts[HPM_UART5_INDEX].serial->config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
  900. #ifdef RT_SERIAL_USING_DMA
  901. uarts[HPM_UART5_INDEX].dma_flags = 0;
  902. #ifdef BSP_UART5_RX_USING_DMA
  903. status = hpm_uart_dma_rx_init(&uarts[HPM_UART5_INDEX]);
  904. if (status != status_success)
  905. {
  906. return -RT_ERROR;
  907. }
  908. #endif //BSP_UART5_RX_USING_DMA
  909. #ifdef BSP_UART5_TX_USING_DMA
  910. status = hpm_uart_dma_tx_init(&uarts[HPM_UART5_INDEX]);
  911. if (status != status_success)
  912. {
  913. return -RT_ERROR;
  914. }
  915. #endif //BSP_UART5_TX_USING_DMA
  916. #endif // RT_SERIAL_USING_DMA
  917. #endif //BSP_USING_UART5
  918. #ifdef BSP_USING_UART6
  919. uarts[HPM_UART6_INDEX].serial->config = config;
  920. uarts[HPM_UART6_INDEX].serial->config.rx_bufsz = BSP_UART6_RX_BUFSIZE;
  921. uarts[HPM_UART6_INDEX].serial->config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
  922. #ifdef RT_SERIAL_USING_DMA
  923. uarts[HPM_UART6_INDEX].dma_flags = 0;
  924. #ifdef BSP_UART6_RX_USING_DMA
  925. status = hpm_uart_dma_rx_init(&uarts[HPM_UART6_INDEX]);
  926. if (status != status_success)
  927. {
  928. return -RT_ERROR;
  929. }
  930. #endif //BSP_UART6_RX_USING_DMA
  931. #ifdef BSP_UART6_TX_USING_DMA
  932. status = hpm_uart_dma_tx_init(&uarts[HPM_UART6_INDEX]);
  933. if (status != status_success)
  934. {
  935. return -RT_ERROR;
  936. }
  937. #endif //BSP_UART6_TX_USING_DMA
  938. #endif // RT_SERIAL_USING_DMA
  939. #endif //BSP_USING_UART6
  940. #ifdef BSP_USING_UART7
  941. uarts[HPM_UART7_INDEX].serial->config = config;
  942. uarts[HPM_UART7_INDEX].serial->config.rx_bufsz = BSP_UART7_RX_BUFSIZE;
  943. uarts[HPM_UART7_INDEX].serial->config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
  944. #ifdef RT_SERIAL_USING_DMA
  945. uarts[HPM_UART7_INDEX].dma_flags = 0;
  946. #ifdef BSP_UART7_RX_USING_DMA
  947. status = hpm_uart_dma_rx_init(&uarts[HPM_UART7_INDEX]);
  948. if (status != status_success)
  949. {
  950. return -RT_ERROR;
  951. }
  952. #endif //BSP_UART7_RX_USING_DMA
  953. #ifdef BSP_UART0_TX_USING_DMA
  954. status = hpm_uart_dma_tx_init(&uarts[HPM_UART7_INDEX]);
  955. if (status != status_success)
  956. {
  957. return -RT_ERROR;
  958. }
  959. #endif //BSP_UART7_TX_USING_DMA
  960. #endif // RT_SERIAL_USING_DMA
  961. #endif //BSP_USING_UART7
  962. #ifdef BSP_USING_UART8
  963. uarts[HPM_UART8_INDEX].serial->config = config;
  964. uarts[HPM_UART8_INDEX].serial->config.rx_bufsz = BSP_UART8_RX_BUFSIZE;
  965. uarts[HPM_UART8_INDEX].serial->config.tx_bufsz = BSP_UART8_TX_BUFSIZE;
  966. #ifdef RT_SERIAL_USING_DMA
  967. uarts[HPM_UART8_INDEX].dma_flags = 0;
  968. #ifdef BSP_UART8_RX_USING_DMA
  969. status = hpm_uart_dma_rx_init(&uarts[HPM_UART8_INDEX]);
  970. if (status != status_success)
  971. {
  972. return -RT_ERROR;
  973. }
  974. #endif //BSP_UART8_RX_USING_DMA
  975. #ifdef BSP_UART0_TX_USING_DMA
  976. status = hpm_uart_dma_tx_init(&uarts[HPM_UART8_INDEX]);
  977. if (status != status_success)
  978. {
  979. return -RT_ERROR;
  980. }
  981. #endif //BSP_UART8_TX_USING_DMA
  982. #endif // RT_SERIAL_USING_DMA
  983. #endif //BSP_USING_UART8
  984. #ifdef BSP_USING_UART9
  985. uarts[HPM_UART9_INDEX].serial->config = config;
  986. uarts[HPM_UART9_INDEX].serial->config.rx_bufsz = BSP_UART9_RX_BUFSIZE;
  987. uarts[HPM_UART9_INDEX].serial->config.tx_bufsz = BSP_UART9_TX_BUFSIZE;
  988. #ifdef RT_SERIAL_USING_DMA
  989. uarts[HPM_UART9_INDEX].dma_flags = 0;
  990. #ifdef BSP_UART9_RX_USING_DMA
  991. status = hpm_uart_dma_rx_init(&uarts[HPM_UART9_INDEX]);
  992. if (status != status_success)
  993. {
  994. return -RT_ERROR;
  995. }
  996. #endif //BSP_UART9_RX_USING_DMA
  997. #ifdef BSP_UART9_TX_USING_DMA
  998. status = hpm_uart_dma_tx_init(&uarts[HPM_UART9_INDEX]);
  999. if (status != status_success)
  1000. {
  1001. return -RT_ERROR;
  1002. }
  1003. #endif //BSP_UART9_TX_USING_DMA
  1004. #endif // RT_SERIAL_USING_DMA
  1005. #endif //BSP_USING_UART9
  1006. #ifdef BSP_USING_UART10
  1007. uarts[HPM_UART10_INDEX].serial->config = config;
  1008. uarts[HPM_UART10_INDEX].serial->config.rx_bufsz = BSP_UART10_RX_BUFSIZE;
  1009. uarts[HPM_UART10_INDEX].serial->config.tx_bufsz = BSP_UART10_TX_BUFSIZE;
  1010. #ifdef RT_SERIAL_USING_DMA
  1011. uarts[HPM_UART10_INDEX].dma_flags = 0;
  1012. #ifdef BSP_UART10_RX_USING_DMA
  1013. status = hpm_uart_dma_rx_init(&uarts[HPM_UART10_INDEX]);
  1014. if (status != status_success)
  1015. {
  1016. return -RT_ERROR;
  1017. }
  1018. #endif //BSP_UART10_RX_USING_DMA
  1019. #ifdef BSP_UART10_TX_USING_DMA
  1020. status = hpm_uart_dma_tx_init(&uarts[HPM_UART10_INDEX]);
  1021. if (status != status_success)
  1022. {
  1023. return -RT_ERROR;
  1024. }
  1025. #endif //BSP_UART10_TX_USING_DMA
  1026. #endif // RT_SERIAL_USING_DMA
  1027. #endif //BSP_USING_UART10
  1028. #ifdef BSP_USING_UART11
  1029. uarts[HPM_UART11_INDEX].serial->config = config;
  1030. uarts[HPM_UART11_INDEX].serial->config.rx_bufsz = BSP_UART11_RX_BUFSIZE;
  1031. uarts[HPM_UART11_INDEX].serial->config.tx_bufsz = BSP_UART11_TX_BUFSIZE;
  1032. #ifdef RT_SERIAL_USING_DMA
  1033. uarts[HPM_UART11_INDEX].dma_flags = 0;
  1034. #ifdef BSP_UART11_RX_USING_DMA
  1035. status = hpm_uart_dma_rx_init(&uarts[HPM_UART11_INDEX]);
  1036. if (status != status_success)
  1037. {
  1038. return -RT_ERROR;
  1039. }
  1040. #endif //BSP_UART11_RX_USING_DMA
  1041. #ifdef BSP_UART11_TX_USING_DMA
  1042. status = hpm_uart_dma_tx_init(&uarts[HPM_UART11_INDEX]);
  1043. if (status != status_success)
  1044. {
  1045. return -RT_ERROR;
  1046. }
  1047. #endif //BSP_UART11_TX_USING_DMA
  1048. #endif // RT_SERIAL_USING_DMA
  1049. #endif //BSP_USING_UART11
  1050. #ifdef BSP_USING_UART12
  1051. uarts[HPM_UART12_INDEX].serial->config = config;
  1052. uarts[HPM_UART12_INDEX].serial->config.rx_bufsz = BSP_UART12_RX_BUFSIZE;
  1053. uarts[HPM_UART12_INDEX].serial->config.tx_bufsz = BSP_UART12_TX_BUFSIZE;
  1054. #ifdef RT_SERIAL_USING_DMA
  1055. uarts[HPM_UART12_INDEX].dma_flags = 0;
  1056. #ifdef BSP_UART12_RX_USING_DMA
  1057. status = hpm_uart_dma_rx_init(&uarts[HPM_UART12_INDEX]);
  1058. if (status != status_success)
  1059. {
  1060. return -RT_ERROR;
  1061. }
  1062. #endif //BSP_UART12_RX_USING_DMA
  1063. #ifdef BSP_UART12_TX_USING_DMA
  1064. status = hpm_uart_dma_tx_init(&uarts[HPM_UART12_INDEX]);
  1065. if (status != status_success)
  1066. {
  1067. return -RT_ERROR;
  1068. }
  1069. #endif //BSP_UART12_TX_USING_DMA
  1070. #endif // RT_SERIAL_USING_DMA
  1071. #endif //BSP_USING_UART12
  1072. #ifdef BSP_USING_UART13
  1073. uarts[HPM_UART13_INDEX].serial->config = config;
  1074. uarts[HPM_UART13_INDEX].serial->config.rx_bufsz = BSP_UART13_RX_BUFSIZE;
  1075. uarts[HPM_UART13_INDEX].serial->config.tx_bufsz = BSP_UART13_TX_BUFSIZE;
  1076. #ifdef RT_SERIAL_USING_DMA
  1077. uarts[HPM_UART13_INDEX].dma_flags = 0;
  1078. #ifdef BSP_UART13_RX_USING_DMA
  1079. status = hpm_uart_dma_rx_init(&uarts[HPM_UART13_INDEX]);
  1080. if (status != status_success)
  1081. {
  1082. return -RT_ERROR;
  1083. }
  1084. #endif //BSP_UART13_RX_USING_DMA
  1085. #ifdef BSP_UART13_TX_USING_DMA
  1086. status = hpm_uart_dma_tx_init(&uarts[HPM_UART13_INDEX]);
  1087. if (status != status_success)
  1088. {
  1089. return -RT_ERROR;
  1090. }
  1091. #endif //BSP_UART13_TX_USING_DMA
  1092. #endif // RT_SERIAL_USING_DMA
  1093. #endif //BSP_USING_UART13
  1094. #ifdef BSP_USING_UART14
  1095. uarts[HPM_UART14_INDEX].serial->config = config;
  1096. uarts[HPM_UART14_INDEX].serial->config.rx_bufsz = BSP_UART14_RX_BUFSIZE;
  1097. uarts[HPM_UART14_INDEX].serial->config.tx_bufsz = BSP_UART14_TX_BUFSIZE;
  1098. #ifdef RT_SERIAL_USING_DMA
  1099. uarts[HPM_UART14_INDEX].dma_flags = 0;
  1100. #ifdef BSP_UART14_RX_USING_DMA
  1101. status = hpm_uart_dma_rx_init(&uarts[HPM_UART14_INDEX]);
  1102. if (status != status_success)
  1103. {
  1104. return -RT_ERROR;
  1105. }
  1106. #endif //BSP_UART14_RX_USING_DMA
  1107. #ifdef BSP_UART14_TX_USING_DMA
  1108. status = hpm_uart_dma_tx_init(&uarts[HPM_UART14_INDEX]);
  1109. if (status != status_success)
  1110. {
  1111. return -RT_ERROR;
  1112. }
  1113. #endif //BSP_UART14_TX_USING_DMA
  1114. #endif // RT_SERIAL_USING_DMA
  1115. #endif //BSP_USING_UART14
  1116. #ifdef BSP_USING_UART15
  1117. uarts[HPM_UART15_INDEX].serial->config = config;
  1118. uarts[HPM_UART15_INDEX].serial->config.rx_bufsz = BSP_UART15_RX_BUFSIZE;
  1119. uarts[HPM_UART15_INDEX].serial->config.tx_bufsz = BSP_UART15_TX_BUFSIZE;
  1120. #ifdef RT_SERIAL_USING_DMA
  1121. uarts[HPM_UART15_INDEX].dma_flags = 0;
  1122. #ifdef BSP_UART15_RX_USING_DMA
  1123. status = hpm_uart_dma_rx_init(&uarts[HPM_UART15_INDEX]);
  1124. if (status != status_success)
  1125. {
  1126. return -RT_ERROR;
  1127. }
  1128. #endif //BSP_UART15_RX_USING_DMA
  1129. #ifdef BSP_UART15_TX_USING_DMA
  1130. status = hpm_uart_dma_tx_init(&uarts[HPM_UART15_INDEX]);
  1131. if (status != status_success)
  1132. {
  1133. return -RT_ERROR;
  1134. }
  1135. #endif //BSP_UART15_TX_USING_DMA
  1136. #endif // RT_SERIAL_USING_DMA
  1137. #endif //BSP_USING_UART15
  1138. return RT_EOK;
  1139. }
  1140. int rt_hw_uart_init(void)
  1141. {
  1142. /* Added bypass logic here since the rt_hw_uart_init function will be initialized twice, the 2nd initialization should be bypassed */
  1143. static bool initialized;
  1144. rt_err_t err = RT_EOK;
  1145. if (initialized)
  1146. {
  1147. return err;
  1148. }
  1149. else
  1150. {
  1151. initialized = true;
  1152. }
  1153. if (RT_EOK != hpm_uart_config()) {
  1154. return -RT_ERROR;
  1155. }
  1156. for (uint32_t i = 0; i < sizeof(uarts) / sizeof(uarts[0]); i++) {
  1157. uarts[i].serial->ops = &hpm_uart_ops;
  1158. /* register UART device */
  1159. err = rt_hw_serial_register(uarts[i].serial,
  1160. uarts[i].device_name,
  1161. RT_DEVICE_FLAG_RDWR,
  1162. (void*)&uarts[i]);
  1163. }
  1164. return err;
  1165. }
  1166. INIT_BOARD_EXPORT(rt_hw_uart_init);
  1167. #endif /* RT_USING_SERIAL */