drv_uart_v2.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594
  1. /*
  2. * Copyright (c) 2022-2024 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. * 2023-03-07 HPMicro Fix the issue that the data_width was not initialized before setup dma handshake
  12. * 2024-06-10 HPMicro Fix memory leakage issue
  13. *
  14. */
  15. #include <rtthread.h>
  16. #include <rtdevice.h>
  17. #include "board.h"
  18. #include "drv_uart_v2.h"
  19. #include "hpm_uart_drv.h"
  20. #include "hpm_sysctl_drv.h"
  21. #include "hpm_l1c_drv.h"
  22. #include "hpm_dma_mgr.h"
  23. #include "hpm_soc.h"
  24. #include "hpm_clock_drv.h"
  25. #ifdef RT_USING_SERIAL_V2
  26. #ifdef RT_SERIAL_USING_DMA
  27. #define BOARD_UART_DMAMUX HPM_DMAMUX
  28. #define UART_DMA_TRIGGER_LEVEL (1U)
  29. typedef struct dma_channel {
  30. struct rt_serial_device *serial;
  31. dma_resource_t resource;
  32. void (*tranfer_done)(struct rt_serial_device *serial);
  33. void (*tranfer_abort)(struct rt_serial_device *serial);
  34. void (*tranfer_error)(struct rt_serial_device *serial);
  35. void *ringbuf_ptr;
  36. } hpm_dma_channel_handle_t;
  37. //static struct dma_channel dma_channels[DMA_SOC_CHANNEL_NUM];
  38. static int hpm_uart_dma_config(struct rt_serial_device *serial, void *arg);
  39. static void hpm_uart_receive_dma_next(struct rt_serial_device *serial);
  40. #endif
  41. #define UART_ROOT_CLK_FREQ BOARD_APP_UART_SRC_FREQ
  42. struct hpm_uart {
  43. UART_Type *uart_base;
  44. rt_uint32_t irq_num;
  45. rt_uint8_t irq_priority;
  46. clock_name_t clk_name;
  47. struct rt_serial_device *serial;
  48. char *device_name;
  49. #ifdef RT_SERIAL_USING_DMA
  50. uint32_t tx_dma_mux;
  51. uint32_t rx_dma_mux;
  52. uint32_t dma_flags;
  53. hpm_dma_channel_handle_t tx_chn_ctx;
  54. hpm_dma_channel_handle_t rx_chn_ctx;
  55. bool tx_resource_allocated;
  56. bool rx_resource_allocated;
  57. #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
  58. ATTR_ALIGN(HPM_L1C_CACHELINE_SIZE) uint8_t rx_idle_tmp_buffer[1024];
  59. #endif
  60. #endif
  61. };
  62. extern void init_uart_pins(UART_Type *ptr);
  63. static void hpm_uart_isr(struct rt_serial_device *serial);
  64. static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg);
  65. static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void *arg);
  66. static int hpm_uart_putc(struct rt_serial_device *serial, char ch);
  67. static int hpm_uart_getc(struct rt_serial_device *serial);
  68. #ifdef RT_SERIAL_USING_DMA
  69. int hpm_uart_dma_register_channel(struct rt_serial_device *serial,
  70. bool is_tx,
  71. void (*done)(struct rt_serial_device *serial),
  72. void (*abort)(struct rt_serial_device *serial),
  73. void (*error)(struct rt_serial_device *serial))
  74. {
  75. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  76. if (is_tx) {
  77. uart->tx_chn_ctx.serial = serial;
  78. uart->tx_chn_ctx.tranfer_done = done;
  79. uart->tx_chn_ctx.tranfer_abort = abort;
  80. uart->tx_chn_ctx.tranfer_error = error;
  81. } else {
  82. uart->rx_chn_ctx.serial = serial;
  83. uart->rx_chn_ctx.tranfer_done = done;
  84. uart->rx_chn_ctx.tranfer_abort = abort;
  85. uart->rx_chn_ctx.tranfer_error = error;
  86. }
  87. return RT_EOK;
  88. }
  89. #endif /* RT_SERIAL_USING_DMA */
  90. #if defined(BSP_USING_UART0)
  91. struct rt_serial_device serial0;
  92. SDK_DECLARE_EXT_ISR_M(IRQn_UART0,uart0_isr)
  93. void uart0_isr(void)
  94. {
  95. hpm_uart_isr(&serial0);
  96. }
  97. #endif
  98. #if defined(BSP_USING_UART1)
  99. struct rt_serial_device serial1;
  100. SDK_DECLARE_EXT_ISR_M(IRQn_UART1,uart1_isr)
  101. void uart1_isr(void)
  102. {
  103. hpm_uart_isr(&serial1);
  104. }
  105. #endif
  106. #if defined(BSP_USING_UART2)
  107. struct rt_serial_device serial2;
  108. SDK_DECLARE_EXT_ISR_M(IRQn_UART2,uart2_isr)
  109. void uart2_isr(void)
  110. {
  111. hpm_uart_isr(&serial2);
  112. }
  113. #endif
  114. #if defined(BSP_USING_UART3)
  115. struct rt_serial_device serial3;
  116. SDK_DECLARE_EXT_ISR_M(IRQn_UART3,uart3_isr)
  117. void uart3_isr(void)
  118. {
  119. hpm_uart_isr(&serial3);
  120. }
  121. #endif
  122. #if defined(BSP_USING_UART4)
  123. struct rt_serial_device serial4;
  124. SDK_DECLARE_EXT_ISR_M(IRQn_UART4,uart4_isr)
  125. void uart4_isr(void)
  126. {
  127. hpm_uart_isr(&serial4);
  128. }
  129. #endif
  130. #if defined(BSP_USING_UART5)
  131. struct rt_serial_device serial5;
  132. SDK_DECLARE_EXT_ISR_M(IRQn_UART5,uart5_isr)
  133. void uart5_isr(void)
  134. {
  135. hpm_uart_isr(&serial5);
  136. }
  137. #endif
  138. #if defined(BSP_USING_UART6)
  139. struct rt_serial_device serial6;
  140. SDK_DECLARE_EXT_ISR_M(IRQn_UART6,uart6_isr)
  141. void uart6_isr(void)
  142. {
  143. hpm_uart_isr(&serial6);
  144. }
  145. #endif
  146. #if defined(BSP_USING_UART7)
  147. struct rt_serial_device serial7;
  148. SDK_DECLARE_EXT_ISR_M(IRQn_UART7,uart7_isr)
  149. void uart7_isr(void)
  150. {
  151. hpm_uart_isr(&serial7);
  152. }
  153. #endif
  154. #if defined(BSP_USING_UART8)
  155. struct rt_serial_device serial8;
  156. SDK_DECLARE_EXT_ISR_M(IRQn_UART8,uart8_isr)
  157. void uart8_isr(void)
  158. {
  159. hpm_uart_isr(&serial8);
  160. }
  161. #endif
  162. #if defined(BSP_USING_UART9)
  163. struct rt_serial_device serial9;
  164. SDK_DECLARE_EXT_ISR_M(IRQn_UART9,uart9_isr)
  165. void uart9_isr(void)
  166. {
  167. hpm_uart_isr(&serial9);
  168. }
  169. #endif
  170. #if defined(BSP_USING_UART10)
  171. struct rt_serial_device serial10;
  172. SDK_DECLARE_EXT_ISR_M(IRQn_UART10,uart10_isr)
  173. void uart10_isr(void)
  174. {
  175. hpm_uart_isr(&serial10);
  176. }
  177. #endif
  178. #if defined(BSP_USING_UART11)
  179. struct rt_serial_device serial11;
  180. SDK_DECLARE_EXT_ISR_M(IRQn_UART11,uart11_isr)
  181. void uart11_isr(void)
  182. {
  183. hpm_uart_isr(&serial11);
  184. }
  185. #endif
  186. #if defined(BSP_USING_UART12)
  187. struct rt_serial_device serial12;
  188. SDK_DECLARE_EXT_ISR_M(IRQn_UART12,uart12_isr)
  189. void uart12_isr(void)
  190. {
  191. hpm_uart_isr(&serial12);
  192. }
  193. #endif
  194. #if defined(BSP_USING_UART13)
  195. struct rt_serial_device serial13;
  196. SDK_DECLARE_EXT_ISR_M(IRQn_UART13,uart13_isr)
  197. void uart13_isr(void)
  198. {
  199. hpm_uart_isr(&serial13);
  200. }
  201. #endif
  202. #if defined(BSP_USING_UART14)
  203. struct rt_serial_device serial14;
  204. SDK_DECLARE_EXT_ISR_M(IRQn_UART14,uart14_isr)
  205. void uart14_isr(void)
  206. {
  207. hpm_uart_isr(&serial14);
  208. }
  209. #endif
  210. #if defined(BSP_USING_UART15)
  211. struct rt_serial_device serial15;
  212. SDK_DECLARE_EXT_ISR_M(IRQn_UART15,uart15_isr)
  213. void uart15_isr(void)
  214. {
  215. hpm_uart_isr(&serial15);
  216. }
  217. #endif
  218. static struct hpm_uart uarts[] =
  219. {
  220. #if defined(BSP_USING_UART0)
  221. {
  222. HPM_UART0,
  223. IRQn_UART0,
  224. #if defined(BSP_UART0_IRQ_PRIORITY)
  225. .irq_priority = BSP_UART0_IRQ_PRIORITY,
  226. #else
  227. .irq_priority = 1,
  228. #endif
  229. clock_uart0,
  230. &serial0,
  231. "uart0",
  232. #ifdef RT_SERIAL_USING_DMA
  233. HPM_DMA_SRC_UART0_TX,
  234. HPM_DMA_SRC_UART0_RX,
  235. 0,
  236. #endif
  237. },
  238. #endif
  239. #if defined(BSP_USING_UART1)
  240. {
  241. HPM_UART1,
  242. IRQn_UART1,
  243. #if defined(BSP_UART1_IRQ_PRIORITY)
  244. .irq_priority = BSP_UART1_IRQ_PRIORITY,
  245. #else
  246. .irq_priority = 1,
  247. #endif
  248. clock_uart1,
  249. &serial1,
  250. "uart1",
  251. #ifdef RT_SERIAL_USING_DMA
  252. HPM_DMA_SRC_UART1_TX,
  253. HPM_DMA_SRC_UART1_RX,
  254. 0,
  255. #endif
  256. },
  257. #endif
  258. #if defined(BSP_USING_UART2)
  259. {
  260. HPM_UART2,
  261. IRQn_UART2,
  262. #if defined(BSP_UART2_IRQ_PRIORITY)
  263. .irq_priority = BSP_UART2_IRQ_PRIORITY,
  264. #else
  265. .irq_priority = 1,
  266. #endif
  267. clock_uart2,
  268. &serial2,
  269. "uart2",
  270. #ifdef RT_SERIAL_USING_DMA
  271. HPM_DMA_SRC_UART2_TX,
  272. HPM_DMA_SRC_UART2_RX,
  273. 0,
  274. #endif
  275. },
  276. #endif
  277. #if defined(BSP_USING_UART3)
  278. {
  279. HPM_UART3,
  280. IRQn_UART3,
  281. #if defined(BSP_UART3_IRQ_PRIORITY)
  282. .irq_priority = BSP_UART3_IRQ_PRIORITY,
  283. #else
  284. .irq_priority = 1,
  285. #endif
  286. clock_uart3,
  287. &serial3,
  288. "uart3",
  289. #ifdef RT_SERIAL_USING_DMA
  290. HPM_DMA_SRC_UART3_TX,
  291. HPM_DMA_SRC_UART3_RX,
  292. 0,
  293. #endif
  294. },
  295. #endif
  296. #if defined(BSP_USING_UART4)
  297. {
  298. HPM_UART4,
  299. IRQn_UART4,
  300. #if defined(BSP_UART4_IRQ_PRIORITY)
  301. .irq_priority = BSP_UART4_IRQ_PRIORITY,
  302. #else
  303. .irq_priority = 1,
  304. #endif
  305. clock_uart4,
  306. &serial4,
  307. "uart4",
  308. #ifdef RT_SERIAL_USING_DMA
  309. HPM_DMA_SRC_UART4_TX,
  310. HPM_DMA_SRC_UART4_RX,
  311. 0,
  312. #endif
  313. },
  314. #endif
  315. #if defined(BSP_USING_UART5)
  316. {
  317. HPM_UART5,
  318. IRQn_UART5,
  319. #if defined(BSP_UART5_IRQ_PRIORITY)
  320. .irq_priority = BSP_UART5_IRQ_PRIORITY,
  321. #else
  322. .irq_priority = 1,
  323. #endif
  324. clock_uart5,
  325. &serial5,
  326. "uart5",
  327. #ifdef RT_SERIAL_USING_DMA
  328. HPM_DMA_SRC_UART5_TX,
  329. HPM_DMA_SRC_UART5_RX,
  330. 0,
  331. #endif
  332. },
  333. #endif
  334. #if defined(BSP_USING_UART6)
  335. {
  336. HPM_UART6,
  337. IRQn_UART6,
  338. #if defined(BSP_UART6_IRQ_PRIORITY)
  339. .irq_priority = BSP_UART6_IRQ_PRIORITY,
  340. #else
  341. .irq_priority = 1,
  342. #endif
  343. clock_uart6,
  344. &serial6,
  345. "uart6",
  346. #ifdef RT_SERIAL_USING_DMA
  347. HPM_DMA_SRC_UART6_TX,
  348. HPM_DMA_SRC_UART6_RX,
  349. 0,
  350. #endif
  351. },
  352. #endif
  353. #if defined(BSP_USING_UART7)
  354. {
  355. HPM_UART7,
  356. IRQn_UART7,
  357. #if defined(BSP_UART7_IRQ_PRIORITY)
  358. .irq_priority = BSP_UART7_IRQ_PRIORITY,
  359. #else
  360. .irq_priority = 1,
  361. #endif
  362. clock_uart7,
  363. &serial7,
  364. "uart7",
  365. #ifdef RT_SERIAL_USING_DMA
  366. HPM_DMA_SRC_UART7_TX,
  367. HPM_DMA_SRC_UART7_RX,
  368. 0,
  369. #endif
  370. },
  371. #endif
  372. #if defined(BSP_USING_UART8)
  373. {
  374. HPM_UART8,
  375. IRQn_UART8,
  376. #if defined(BSP_UART8_IRQ_PRIORITY)
  377. .irq_priority = BSP_UART8_IRQ_PRIORITY,
  378. #else
  379. .irq_priority = 1,
  380. #endif
  381. clock_uart8,
  382. &serial8,
  383. "uart8",
  384. #ifdef RT_SERIAL_USING_DMA
  385. HPM_DMA_SRC_UART8_TX,
  386. HPM_DMA_SRC_UART8_RX,
  387. 0,
  388. #endif
  389. },
  390. #endif
  391. #if defined(BSP_USING_UART9)
  392. {
  393. HPM_UART9,
  394. IRQn_UART9,
  395. #if defined(BSP_UART9_IRQ_PRIORITY)
  396. .irq_priority = BSP_UART9_IRQ_PRIORITY,
  397. #else
  398. .irq_priority = 1,
  399. #endif
  400. clock_uart9,
  401. &serial9,
  402. "uart9",
  403. #ifdef RT_SERIAL_USING_DMA
  404. HPM_DMA_SRC_UART9_TX,
  405. HPM_DMA_SRC_UART9_RX,
  406. 0,
  407. #endif
  408. },
  409. #endif
  410. #if defined(BSP_USING_UART10)
  411. {
  412. HPM_UART10,
  413. IRQn_UART10,
  414. #if defined(BSP_UART10_IRQ_PRIORITY)
  415. .irq_priority = BSP_UART10_IRQ_PRIORITY,
  416. #else
  417. .irq_priority = 1,
  418. #endif
  419. clock_uart10,
  420. &serial10,
  421. "uart10",
  422. #ifdef RT_SERIAL_USING_DMA
  423. HPM_DMA_SRC_UART10_TX,
  424. HPM_DMA_SRC_UART10_RX,
  425. 0,
  426. #endif
  427. },
  428. #endif
  429. #if defined(BSP_USING_UART11)
  430. {
  431. HPM_UART11,
  432. IRQn_UART11,
  433. #if defined(BSP_UART11_IRQ_PRIORITY)
  434. .irq_priority = BSP_UART11_IRQ_PRIORITY,
  435. #else
  436. .irq_priority = 1,
  437. #endif
  438. clock_uart11,
  439. &serial11,
  440. "uart11",
  441. #ifdef RT_SERIAL_USING_DMA
  442. HPM_DMA_SRC_UART11_TX,
  443. HPM_DMA_SRC_UART11_RX,
  444. 0,
  445. #endif
  446. },
  447. #endif
  448. #if defined(BSP_USING_UART12)
  449. {
  450. HPM_UART12,
  451. IRQn_UART12,
  452. #if defined(BSP_UART12_IRQ_PRIORITY)
  453. .irq_priority = BSP_UART12_IRQ_PRIORITY,
  454. #else
  455. .irq_priority = 1,
  456. #endif
  457. clock_uart12,
  458. &serial12,
  459. "uart12",
  460. #ifdef RT_SERIAL_USING_DMA
  461. HPM_DMA_SRC_UART12_TX,
  462. HPM_DMA_SRC_UART12_RX,
  463. 0,
  464. #endif
  465. },
  466. #endif
  467. #if defined(BSP_USING_UART13)
  468. {
  469. HPM_UART13,
  470. IRQn_UART13,
  471. #if defined(BSP_UART13_IRQ_PRIORITY)
  472. .irq_priority = BSP_UART13_IRQ_PRIORITY,
  473. #else
  474. .irq_priority = 1,
  475. #endif
  476. clock_uart13,
  477. &serial13,
  478. "uart13",
  479. #ifdef RT_SERIAL_USING_DMA
  480. HPM_DMA_SRC_UART13_TX,
  481. HPM_DMA_SRC_UART13_RX,
  482. 0,
  483. #endif
  484. },
  485. #endif
  486. #if defined(BSP_USING_UART14)
  487. {
  488. HPM_UART14,
  489. IRQn_UART14,
  490. #if defined(BSP_UART14_IRQ_PRIORITY)
  491. .irq_priority = BSP_UART14_IRQ_PRIORITY,
  492. #else
  493. .irq_priority = 1,
  494. #endif
  495. clock_uart14,
  496. &serial14,
  497. "uart14",
  498. #ifdef RT_SERIAL_USING_DMA
  499. HPM_DMA_SRC_UART14_TX,
  500. HPM_DMA_SRC_UART14_RX,
  501. 0,
  502. #endif
  503. },
  504. #endif
  505. #if defined(BSP_USING_UART15)
  506. {
  507. HPM_UART15,
  508. IRQn_UART15,
  509. #if defined(BSP_UART15_IRQ_PRIORITY)
  510. .irq_priority = BSP_UART15_IRQ_PRIORITY,
  511. #else
  512. .irq_priority = 1,
  513. #endif
  514. clock_uart15,
  515. &serial15,
  516. "uart15",
  517. #ifdef RT_SERIAL_USING_DMA
  518. HPM_DMA_SRC_UART15_TX,
  519. HPM_DMA_SRC_UART15_RX,
  520. 0,
  521. #endif
  522. },
  523. #endif
  524. };
  525. enum
  526. {
  527. #if defined(BSP_USING_UART0)
  528. HPM_UART0_INDEX,
  529. #endif
  530. #if defined(BSP_USING_UART1)
  531. HPM_UART1_INDEX,
  532. #endif
  533. #if defined(BSP_USING_UART2)
  534. HPM_UART2_INDEX,
  535. #endif
  536. #if defined(BSP_USING_UART3)
  537. HPM_UART3_INDEX,
  538. #endif
  539. #if defined(BSP_USING_UART4)
  540. HPM_UART4_INDEX,
  541. #endif
  542. #if defined(BSP_USING_UART5)
  543. HPM_UART5_INDEX,
  544. #endif
  545. #if defined(BSP_USING_UART6)
  546. HPM_UART6_INDEX,
  547. #endif
  548. #if defined(BSP_USING_UART7)
  549. HPM_UART7_INDEX,
  550. #endif
  551. #if defined(BSP_USING_UART8)
  552. HPM_UART8_INDEX,
  553. #endif
  554. #if defined(BSP_USING_UART9)
  555. HPM_UART9_INDEX,
  556. #endif
  557. #if defined(BSP_USING_UART10)
  558. HPM_UART10_INDEX,
  559. #endif
  560. #if defined(BSP_USING_UART11)
  561. HPM_UART11_INDEX,
  562. #endif
  563. #if defined(BSP_USING_UART12)
  564. HPM_UART12_INDEX,
  565. #endif
  566. #if defined(BSP_USING_UART13)
  567. HPM_UART13_INDEX,
  568. #endif
  569. #if defined(BSP_USING_UART14)
  570. HPM_UART14_INDEX,
  571. #endif
  572. #if defined(BSP_USING_UART15)
  573. HPM_UART15_INDEX,
  574. #endif
  575. };
  576. #if defined(RT_SERIAL_USING_DMA)
  577. static void uart_dma_tc_callback(DMA_Type *base, uint32_t channel, void *user_data)
  578. {
  579. hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
  580. if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
  581. {
  582. return;
  583. }
  584. dma_handle->tranfer_done(dma_handle->serial);
  585. }
  586. static void uart_dma_abort_callback(DMA_Type *base, uint32_t channel, void *user_data)
  587. {
  588. hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
  589. if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
  590. {
  591. return;
  592. }
  593. dma_handle->tranfer_abort(dma_handle->serial);
  594. }
  595. static void uart_dma_error_callback(DMA_Type *base, uint32_t channel, void *user_data)
  596. {
  597. hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
  598. if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
  599. {
  600. return;
  601. }
  602. dma_handle->tranfer_error(dma_handle->serial);
  603. }
  604. static void uart_tx_done(struct rt_serial_device *serial)
  605. {
  606. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
  607. }
  608. static void uart_rx_done(struct rt_serial_device *serial)
  609. {
  610. struct rt_serial_rx_fifo *rx_fifo;
  611. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  612. #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
  613. uint32_t uart_recv_data_count = 0;
  614. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  615. uint32_t rx_idle_tmp_buffer_size = sizeof(uart->rx_idle_tmp_buffer);
  616. uart_recv_data_count = rx_idle_tmp_buffer_size - dma_get_remaining_transfer_size(uart->rx_chn_ctx.resource.base, uart->rx_chn_ctx.resource.channel);
  617. if (l1c_dc_is_enabled()) {
  618. uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)uart->rx_idle_tmp_buffer);
  619. uint32_t aligned_end = HPM_L1C_CACHELINE_ALIGN_UP((uint32_t)uart->rx_idle_tmp_buffer + rx_idle_tmp_buffer_size);
  620. uint32_t aligned_size = aligned_end - aligned_start;
  621. l1c_dc_invalidate(aligned_start, aligned_size);
  622. }
  623. /* if open uart again after closing uart, an idle interrupt may be triggered, but uart initialization is not performed at this time, and the program exits if the rxfifo is empty. */
  624. if (rx_fifo == RT_NULL) {
  625. return;
  626. }
  627. rt_ringbuffer_put(&(rx_fifo->rb), uart->rx_idle_tmp_buffer, uart_recv_data_count);
  628. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE);
  629. #else
  630. if (l1c_dc_is_enabled()) {
  631. uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)rx_fifo->rb.buffer_ptr);
  632. uint32_t aligned_end = HPM_L1C_CACHELINE_ALIGN_UP((uint32_t)rx_fifo->rb.buffer_ptr + serial->config.rx_bufsz);
  633. uint32_t aligned_size = aligned_end - aligned_start;
  634. l1c_dc_invalidate(aligned_start, aligned_size);
  635. }
  636. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (serial->config.rx_bufsz << 8));
  637. #endif
  638. /* prepare for next read */
  639. hpm_uart_receive_dma_next(serial);
  640. }
  641. #endif /* RT_SERIAL_USING_DMA */
  642. /**
  643. * @brief UART common interrupt process. This
  644. *
  645. * @param serial Serial device
  646. */
  647. static void hpm_uart_isr(struct rt_serial_device *serial)
  648. {
  649. struct hpm_uart *uart;
  650. rt_uint32_t stat, enabled_irq;
  651. rt_uint8_t irq_id;
  652. rt_uint8_t count = 0;
  653. rt_uint8_t put_char = 0;
  654. RT_ASSERT(serial != RT_NULL);
  655. uart = (struct hpm_uart *)serial->parent.user_data;
  656. RT_ASSERT(uart != RT_NULL);
  657. struct rt_serial_rx_fifo *rx_fifo;
  658. rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
  659. stat = uart_get_status(uart->uart_base);
  660. irq_id = uart_get_irq_id(uart->uart_base);
  661. if (irq_id == uart_intr_id_rx_data_avail) {
  662. while (uart_check_status(uart->uart_base, uart_stat_data_ready)) {
  663. count++;
  664. put_char = uart_read_byte(uart->uart_base);
  665. rt_ringbuffer_putchar(&(rx_fifo->rb), put_char);
  666. /*in order to ensure rx fifo there are remaining bytes*/
  667. if (count > 12) {
  668. break;
  669. }
  670. }
  671. }
  672. if (irq_id == uart_intr_id_rx_timeout) {
  673. while ((uart_check_status(uart->uart_base, uart_stat_data_ready)) || (uart_check_status(uart->uart_base, uart_stat_overrun_error))) {
  674. put_char= uart_read_byte(uart->uart_base);
  675. rt_ringbuffer_putchar(&(rx_fifo->rb), put_char);
  676. }
  677. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
  678. }
  679. if ((irq_id & uart_intr_tx_slot_avail) && (stat & uart_stat_tx_slot_avail)) {
  680. /* UART in mode Transmitter */
  681. struct rt_serial_tx_fifo *tx_fifo;
  682. tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
  683. RT_ASSERT(tx_fifo != RT_NULL);
  684. rt_uint8_t put_char = 0;
  685. uint32_t fifo_size = 0, ringbuffer_data_len = 0, tx_size = 0;
  686. uart_disable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  687. fifo_size = uart_get_fifo_size(uart->uart_base);
  688. ringbuffer_data_len = rt_ringbuffer_data_len(&tx_fifo->rb);
  689. if (ringbuffer_data_len <= 0) {
  690. rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
  691. } else {
  692. tx_size = (ringbuffer_data_len > fifo_size) ? fifo_size : ringbuffer_data_len;
  693. for (uint32_t i = 0; i < tx_size; i++) {
  694. rt_ringbuffer_getchar(&tx_fifo->rb, &put_char);
  695. uart_write_byte(uart->uart_base, put_char);
  696. }
  697. uart_enable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  698. }
  699. }
  700. #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
  701. if (uart_is_rxline_idle(uart->uart_base)) {
  702. if ((uart->rx_chn_ctx.resource.base != RT_NULL) && (dma_get_remaining_transfer_size(uart->rx_chn_ctx.resource.base, uart->rx_chn_ctx.resource.channel) > 0)) {
  703. /* if the rxline is idle, but the dma transfer is not finished, it means that the rxline idle interrupt is triggered before the dma transfer is finished */
  704. uart_rx_done(serial);
  705. }
  706. uart_clear_rxline_idle_flag(uart->uart_base);
  707. uart_flush(uart->uart_base);
  708. }
  709. #endif
  710. }
  711. static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
  712. {
  713. RT_ASSERT(serial != RT_NULL);
  714. RT_ASSERT(cfg != RT_NULL);
  715. uart_config_t uart_config;
  716. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  717. init_uart_pins(uart->uart_base);
  718. uart_default_config(uart->uart_base, &uart_config);
  719. clock_add_to_group(uart->clk_name, BOARD_RUNNING_CORE & 0x1);
  720. uart_config.src_freq_in_hz = clock_get_frequency(uart->clk_name);
  721. uart_config.baudrate = cfg->baud_rate;
  722. uart_config.num_of_stop_bits = cfg->stop_bits;
  723. uart_config.parity = cfg->parity;
  724. uart_config.rx_fifo_level = uart_rx_fifo_trg_gt_three_quarters;
  725. #ifdef RT_SERIAL_USING_DMA
  726. if (uart->dma_flags & (RT_DEVICE_FLAG_DMA_TX | RT_DEVICE_FLAG_DMA_RX)) {
  727. uart_config.fifo_enable = true;
  728. uart_config.dma_enable = true;
  729. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_TX) {
  730. uart_config.tx_fifo_level = uart_tx_fifo_trg_not_full;
  731. }
  732. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_RX) {
  733. uart_config.rx_fifo_level = uart_rx_fifo_trg_not_empty;
  734. }
  735. #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1)
  736. uart_config.rxidle_config.detect_enable = true;
  737. uart_config.rxidle_config.detect_irq_enable = true;
  738. uart_config.rxidle_config.idle_cond = uart_rxline_idle_cond_rxline_logic_one;
  739. uart_config.rxidle_config.threshold = 16U; /* 10bit */
  740. #endif
  741. }
  742. #endif
  743. uart_config.word_length = cfg->data_bits - DATA_BITS_5;
  744. hpm_stat_t status = uart_init(uart->uart_base, &uart_config);
  745. return (status != status_success) ? -RT_ERROR : RT_EOK;
  746. }
  747. #ifdef RT_SERIAL_USING_DMA
  748. hpm_stat_t hpm_uart_dma_rx_init(struct hpm_uart *uart_ctx)
  749. {
  750. hpm_stat_t status = status_fail;
  751. if (!uart_ctx->rx_resource_allocated)
  752. {
  753. status = dma_mgr_request_resource(&uart_ctx->rx_chn_ctx.resource);
  754. if (status == status_success)
  755. {
  756. uart_ctx->dma_flags |= RT_DEVICE_FLAG_DMA_RX;
  757. uart_ctx->rx_resource_allocated = true;
  758. dma_mgr_install_chn_tc_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_tc_callback, &uart_ctx->rx_chn_ctx);
  759. dma_mgr_install_chn_abort_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_abort_callback, &uart_ctx->rx_chn_ctx);
  760. dma_mgr_install_chn_error_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_error_callback, &uart_ctx->rx_chn_ctx);
  761. }
  762. }
  763. return status;
  764. }
  765. hpm_stat_t hpm_uart_dma_tx_init(struct hpm_uart *uart_ctx)
  766. {
  767. hpm_stat_t status = status_fail;
  768. if (!uart_ctx->tx_resource_allocated)
  769. {
  770. status = dma_mgr_request_resource(&uart_ctx->tx_chn_ctx.resource);
  771. if (status == status_success)
  772. {
  773. uart_ctx->dma_flags |= RT_DEVICE_FLAG_DMA_TX;
  774. uart_ctx->tx_resource_allocated = true;
  775. dma_mgr_install_chn_tc_callback(&uart_ctx->tx_chn_ctx.resource, uart_dma_tc_callback, &uart_ctx->tx_chn_ctx);
  776. dma_mgr_install_chn_abort_callback(&uart_ctx->tx_chn_ctx.resource, uart_dma_abort_callback, &uart_ctx->tx_chn_ctx);
  777. dma_mgr_install_chn_error_callback(&uart_ctx->tx_chn_ctx.resource, uart_dma_error_callback, &uart_ctx->tx_chn_ctx);
  778. }
  779. }
  780. return status;
  781. }
  782. static int hpm_uart_dma_config(struct rt_serial_device *serial, void *arg)
  783. {
  784. rt_ubase_t ctrl_arg = (rt_ubase_t) arg;
  785. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  786. struct rt_serial_rx_fifo *rx_fifo;
  787. dma_mgr_chn_conf_t chg_config;
  788. dma_mgr_get_default_chn_config(&chg_config);
  789. if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) {
  790. rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  791. chg_config.dst_addr_ctrl = DMA_MGR_ADDRESS_CONTROL_INCREMENT;
  792. chg_config.dst_mode = DMA_MGR_HANDSHAKE_MODE_NORMAL;
  793. chg_config.dst_width = DMA_TRANSFER_WIDTH_BYTE;
  794. chg_config.en_dmamux = true;
  795. chg_config.dmamux_src = uart->rx_dma_mux;
  796. chg_config.src_addr = (uint32_t)&(uart->uart_base->RBR);
  797. chg_config.src_addr_ctrl = DMA_MGR_ADDRESS_CONTROL_FIXED;
  798. chg_config.src_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;
  799. chg_config.src_width = DMA_TRANSFER_WIDTH_BYTE;
  800. #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1)
  801. chg_config.dst_addr = (uint32_t)uart->rx_idle_tmp_buffer;
  802. chg_config.size_in_byte = sizeof(uart->rx_idle_tmp_buffer);
  803. #else
  804. chg_config.dst_addr = (uint32_t)rx_fifo->rb.buffer_ptr;
  805. chg_config.size_in_byte = serial->config.rx_bufsz;
  806. #endif
  807. if (status_success != dma_mgr_setup_channel(&uart->rx_chn_ctx.resource, &chg_config)) {
  808. return -RT_ERROR;
  809. }
  810. dma_mgr_enable_channel(&uart->rx_chn_ctx.resource);
  811. dma_mgr_enable_chn_irq(&uart->rx_chn_ctx.resource, DMA_MGR_INTERRUPT_MASK_TC);
  812. dma_mgr_enable_dma_irq_with_priority(&uart->rx_chn_ctx.resource, 1);
  813. hpm_uart_dma_register_channel(serial, false, uart_rx_done, RT_NULL, RT_NULL);
  814. #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1)
  815. intc_m_enable_irq_with_priority(uart->irq_num, uart->irq_priority);
  816. #endif
  817. } else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) {
  818. chg_config.src_addr_ctrl = DMA_MGR_ADDRESS_CONTROL_INCREMENT;
  819. chg_config.src_mode = DMA_MGR_HANDSHAKE_MODE_NORMAL;
  820. chg_config.src_width = DMA_TRANSFER_WIDTH_BYTE;
  821. chg_config.dst_addr = (uint32_t)&uart->uart_base->THR;
  822. chg_config.dst_addr_ctrl = DMA_MGR_ADDRESS_CONTROL_FIXED;
  823. chg_config.dst_mode = DMA_MGR_HANDSHAKE_MODE_HANDSHAKE;
  824. chg_config.dst_width = DMA_TRANSFER_WIDTH_BYTE;
  825. chg_config.en_dmamux = true;
  826. chg_config.dmamux_src = uart->tx_dma_mux;
  827. if (status_success != dma_mgr_setup_channel(&uart->tx_chn_ctx.resource, &chg_config)) {
  828. return -RT_ERROR;
  829. }
  830. dma_mgr_enable_chn_irq(&uart->tx_chn_ctx.resource, DMA_MGR_INTERRUPT_MASK_TC);
  831. dma_mgr_enable_dma_irq_with_priority(&uart->tx_chn_ctx.resource, 1);
  832. }
  833. return RT_EOK;
  834. }
  835. static void hpm_uart_receive_dma_next(struct rt_serial_device *serial)
  836. {
  837. uint32_t buf_addr;
  838. uint32_t buf_size;
  839. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  840. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
  841. #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1)
  842. buf_addr = (uint32_t)uart->rx_idle_tmp_buffer;
  843. buf_size = sizeof(uart->rx_idle_tmp_buffer);
  844. #else
  845. buf_addr = (uint32_t)rx_fifo->rb.buffer_ptr;
  846. buf_size = serial->config.rx_bufsz;
  847. #endif
  848. dma_mgr_set_chn_dst_addr(&uart->rx_chn_ctx.resource, buf_addr);
  849. dma_mgr_set_chn_transize(&uart->rx_chn_ctx.resource, buf_size);
  850. dma_mgr_enable_channel(&uart->rx_chn_ctx.resource);
  851. }
  852. static void hpm_uart_transmit_dma(struct rt_serial_device *serial, uint8_t *src, uint32_t size)
  853. {
  854. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  855. dma_mgr_set_chn_src_addr(&uart->tx_chn_ctx.resource, (uint32_t)src);
  856. dma_mgr_set_chn_transize(&uart->tx_chn_ctx.resource, size);
  857. dma_mgr_enable_channel(&uart->tx_chn_ctx.resource);
  858. }
  859. #endif /* RT_SERIAL_USING_DMA */
  860. static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
  861. {
  862. RT_ASSERT(serial != RT_NULL);
  863. rt_ubase_t ctrl_arg = (rt_ubase_t) arg;
  864. uint8_t *tmp_buffer = NULL;
  865. struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx;
  866. struct rt_serial_tx_fifo *tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx;
  867. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  868. if(ctrl_arg & (RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING))
  869. {
  870. #ifdef RT_SERIAL_USING_DMA
  871. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_RX)
  872. {
  873. ctrl_arg = RT_DEVICE_FLAG_DMA_RX;
  874. }
  875. else
  876. #endif
  877. {
  878. ctrl_arg = RT_DEVICE_FLAG_INT_RX;
  879. }
  880. }
  881. else if(ctrl_arg & (RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING))
  882. {
  883. #ifdef RT_SERIAL_USING_DMA
  884. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_TX)
  885. {
  886. ctrl_arg = RT_DEVICE_FLAG_DMA_TX;
  887. }
  888. else
  889. #endif
  890. {
  891. ctrl_arg = RT_DEVICE_FLAG_INT_TX;
  892. }
  893. }
  894. switch (cmd) {
  895. case RT_DEVICE_CTRL_CLR_INT:
  896. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) {
  897. /* disable rx irq */
  898. uart_disable_irq(uart->uart_base, uart_intr_rx_data_avail_or_timeout);
  899. intc_m_disable_irq(uart->irq_num);
  900. }
  901. else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX) {
  902. /* disable tx irq */
  903. uart_disable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  904. intc_m_disable_irq(uart->irq_num);
  905. }
  906. #ifdef RT_SERIAL_USING_DMA
  907. else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) {
  908. dma_mgr_disable_chn_irq(&uart->tx_chn_ctx.resource, DMA_INTERRUPT_MASK_ALL);
  909. dma_abort_channel(uart->tx_chn_ctx.resource.base, uart->tx_chn_ctx.resource.channel);
  910. if (uart->tx_chn_ctx.ringbuf_ptr != RT_NULL) {
  911. rt_free(uart->tx_chn_ctx.ringbuf_ptr);
  912. uart->tx_chn_ctx.ringbuf_ptr = RT_NULL;
  913. }
  914. } else if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) {
  915. dma_mgr_disable_chn_irq(&uart->rx_chn_ctx.resource, DMA_INTERRUPT_MASK_ALL);
  916. dma_abort_channel(uart->rx_chn_ctx.resource.base, uart->rx_chn_ctx.resource.channel);
  917. if (uart->rx_chn_ctx.ringbuf_ptr != RT_NULL) {
  918. rt_free(uart->rx_chn_ctx.ringbuf_ptr);
  919. uart->rx_chn_ctx.ringbuf_ptr = RT_NULL;
  920. }
  921. }
  922. #endif
  923. break;
  924. case RT_DEVICE_CTRL_SET_INT:
  925. if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) {
  926. /* enable rx irq */
  927. uart_enable_irq(uart->uart_base, uart_intr_rx_data_avail_or_timeout);
  928. intc_m_enable_irq_with_priority(uart->irq_num, uart->irq_priority);
  929. } else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX) {
  930. /* enable tx irq */
  931. uart_enable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  932. intc_m_enable_irq_with_priority(uart->irq_num, uart->irq_priority);
  933. }
  934. break;
  935. case RT_DEVICE_CTRL_CONFIG:
  936. #ifdef RT_SERIAL_USING_DMA
  937. if ((ctrl_arg == RT_DEVICE_FLAG_DMA_RX) || (ctrl_arg == RT_DEVICE_FLAG_INT_RX)) {
  938. if ((rx_fifo) && (((rt_uint32_t)rx_fifo->rb.buffer_ptr % HPM_L1C_CACHELINE_SIZE) || (rx_fifo->rb.buffer_size % HPM_L1C_CACHELINE_SIZE))) {
  939. rt_free(rx_fifo);
  940. rx_fifo = RT_NULL;
  941. rx_fifo = (struct rt_serial_rx_fifo *) rt_malloc(sizeof(struct rt_serial_rx_fifo));
  942. RT_ASSERT(rx_fifo != RT_NULL);
  943. tmp_buffer = rt_malloc(serial->config.rx_bufsz + HPM_L1C_CACHELINE_SIZE);
  944. RT_ASSERT(tmp_buffer != RT_NULL);
  945. if (uart->rx_chn_ctx.ringbuf_ptr != RT_NULL) {
  946. rt_free(uart->rx_chn_ctx.ringbuf_ptr);
  947. }
  948. uart->rx_chn_ctx.ringbuf_ptr = (void *)tmp_buffer;
  949. tmp_buffer += (HPM_L1C_CACHELINE_SIZE - ((rt_ubase_t) tmp_buffer % HPM_L1C_CACHELINE_SIZE));
  950. rt_ringbuffer_init(&rx_fifo->rb, tmp_buffer, serial->config.rx_bufsz);
  951. rt_ringbuffer_reset(&rx_fifo->rb);
  952. serial->serial_rx = rx_fifo;
  953. }
  954. }
  955. if ((ctrl_arg == RT_DEVICE_FLAG_DMA_TX) || (ctrl_arg == RT_DEVICE_FLAG_INT_TX)) {
  956. if ((tx_fifo) && (((rt_uint32_t)tx_fifo->rb.buffer_ptr % HPM_L1C_CACHELINE_SIZE) || (tx_fifo->rb.buffer_size % HPM_L1C_CACHELINE_SIZE))) {
  957. rt_free(tx_fifo);
  958. tx_fifo = RT_NULL;
  959. tx_fifo = (struct rt_serial_tx_fifo *) rt_malloc(sizeof(struct rt_serial_tx_fifo));
  960. RT_ASSERT(tx_fifo != RT_NULL);
  961. tmp_buffer = rt_malloc(serial->config.tx_bufsz + HPM_L1C_CACHELINE_SIZE);
  962. RT_ASSERT(tmp_buffer != RT_NULL);
  963. if (uart->tx_chn_ctx.ringbuf_ptr != RT_NULL) {
  964. rt_free(uart->tx_chn_ctx.ringbuf_ptr);
  965. }
  966. uart->tx_chn_ctx.ringbuf_ptr = (void *)tmp_buffer;
  967. tmp_buffer += (HPM_L1C_CACHELINE_SIZE - ((rt_ubase_t) tmp_buffer % HPM_L1C_CACHELINE_SIZE));
  968. rt_ringbuffer_init(&tx_fifo->rb, tmp_buffer, serial->config.tx_bufsz);
  969. rt_ringbuffer_reset(&tx_fifo->rb);
  970. tx_fifo->activated = RT_FALSE;
  971. tx_fifo->put_size = 0;
  972. serial->serial_tx = tx_fifo;
  973. }
  974. }
  975. if (ctrl_arg & (RT_DEVICE_FLAG_DMA_RX | RT_DEVICE_FLAG_DMA_TX)) {
  976. hpm_uart_dma_config(serial, (void *)ctrl_arg);
  977. } else
  978. #endif
  979. {
  980. hpm_uart_control(serial, RT_DEVICE_CTRL_SET_INT, (void *)ctrl_arg);
  981. }
  982. break;
  983. case RT_DEVICE_CHECK_OPTMODE:
  984. #ifdef RT_SERIAL_USING_DMA
  985. if ((ctrl_arg & RT_DEVICE_FLAG_DMA_TX)) {
  986. return RT_SERIAL_TX_BLOCKING_NO_BUFFER;
  987. } else
  988. #endif
  989. {
  990. return RT_SERIAL_TX_BLOCKING_BUFFER;
  991. }
  992. }
  993. return RT_EOK;
  994. }
  995. static int hpm_uart_putc(struct rt_serial_device *serial, char ch)
  996. {
  997. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  998. uart_send_byte(uart->uart_base, ch);
  999. uart_flush(uart->uart_base);
  1000. return ch;
  1001. }
  1002. static int hpm_uart_getc(struct rt_serial_device *serial)
  1003. {
  1004. int result = -1;
  1005. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  1006. if (uart_check_status(uart->uart_base, uart_stat_data_ready)) {
  1007. uart_receive_byte(uart->uart_base, (uint8_t*)&result);
  1008. }
  1009. return result;
  1010. }
  1011. static rt_ssize_t hpm_uart_transmit(struct rt_serial_device *serial,
  1012. rt_uint8_t *buf,
  1013. rt_size_t size,
  1014. rt_uint32_t tx_flag)
  1015. {
  1016. RT_ASSERT(serial != RT_NULL);
  1017. RT_ASSERT(buf != RT_NULL);
  1018. RT_ASSERT(size);
  1019. uint32_t fifo_size = 0, tx_size = 0;
  1020. uint32_t ringbuffer_data_len = 0;
  1021. struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
  1022. struct rt_serial_tx_fifo *tx_fifo;
  1023. tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
  1024. uint8_t ch = 0;
  1025. RT_ASSERT(tx_fifo != RT_NULL);
  1026. #ifdef RT_SERIAL_USING_DMA
  1027. if (uart->dma_flags & RT_DEVICE_FLAG_DMA_TX) {
  1028. hpm_uart_dma_register_channel(serial, true, uart_tx_done, RT_NULL, RT_NULL);
  1029. intc_m_enable_irq(uart->tx_chn_ctx.resource.irq_num);
  1030. if (l1c_dc_is_enabled()) {
  1031. uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)buf);
  1032. uint32_t aligned_end = HPM_L1C_CACHELINE_ALIGN_UP((uint32_t)buf + size);
  1033. uint32_t aligned_size = aligned_end - aligned_start;
  1034. l1c_dc_flush(aligned_start, aligned_size);
  1035. }
  1036. hpm_uart_transmit_dma(serial, buf, size);
  1037. return size;
  1038. } else {
  1039. #else
  1040. {
  1041. #endif
  1042. if (size > 0) {
  1043. if (uart_check_status(uart->uart_base, uart_stat_tx_slot_avail)) {
  1044. uart_disable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  1045. fifo_size = uart_get_fifo_size(uart->uart_base);
  1046. ringbuffer_data_len = rt_ringbuffer_data_len(&tx_fifo->rb);
  1047. tx_size = (ringbuffer_data_len > fifo_size) ? fifo_size : ringbuffer_data_len;
  1048. for (uint32_t i = 0; i < tx_size; i++) {
  1049. rt_ringbuffer_getchar(&tx_fifo->rb, &ch);
  1050. uart_write_byte(uart->uart_base, ch);
  1051. }
  1052. uart_enable_irq(uart->uart_base, uart_intr_tx_slot_avail);
  1053. }
  1054. }
  1055. }
  1056. return size;
  1057. }
  1058. static const struct rt_uart_ops hpm_uart_ops = {
  1059. hpm_uart_configure,
  1060. hpm_uart_control,
  1061. hpm_uart_putc,
  1062. hpm_uart_getc,
  1063. hpm_uart_transmit,
  1064. };
  1065. static int hpm_uart_config(void)
  1066. {
  1067. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  1068. hpm_stat_t status = status_success;
  1069. #ifdef BSP_USING_UART0
  1070. uarts[HPM_UART0_INDEX].serial->config = config;
  1071. uarts[HPM_UART0_INDEX].serial->config.rx_bufsz = BSP_UART0_RX_BUFSIZE;
  1072. uarts[HPM_UART0_INDEX].serial->config.tx_bufsz = BSP_UART0_TX_BUFSIZE;
  1073. #ifdef RT_SERIAL_USING_DMA
  1074. uarts[HPM_UART0_INDEX].dma_flags = 0;
  1075. #ifdef BSP_UART0_RX_USING_DMA
  1076. status = hpm_uart_dma_rx_init(&uarts[HPM_UART0_INDEX]);
  1077. if (status != status_success)
  1078. {
  1079. return -RT_ERROR;
  1080. }
  1081. #endif //BSP_UART0_RX_USING_DMA
  1082. #ifdef BSP_UART0_TX_USING_DMA
  1083. status = hpm_uart_dma_tx_init(&uarts[HPM_UART0_INDEX]);
  1084. if (status != status_success)
  1085. {
  1086. return -RT_ERROR;
  1087. }
  1088. #endif //BSP_UART0_TX_USING_DMA
  1089. #endif // RT_SERIAL_USING_DMA
  1090. #endif //BSP_USING_UART0
  1091. #ifdef BSP_USING_UART1
  1092. uarts[HPM_UART1_INDEX].serial->config = config;
  1093. uarts[HPM_UART1_INDEX].serial->config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
  1094. uarts[HPM_UART1_INDEX].serial->config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
  1095. #ifdef RT_SERIAL_USING_DMA
  1096. uarts[HPM_UART1_INDEX].dma_flags = 0;
  1097. #ifdef BSP_UART1_RX_USING_DMA
  1098. status = hpm_uart_dma_rx_init(&uarts[HPM_UART1_INDEX]);
  1099. if (status != status_success)
  1100. {
  1101. return -RT_ERROR;
  1102. }
  1103. #endif //BSP_UART1_RX_USING_DMA
  1104. #ifdef BSP_UART1_TX_USING_DMA
  1105. status = hpm_uart_dma_tx_init(&uarts[HPM_UART1_INDEX]);
  1106. if (status != status_success)
  1107. {
  1108. return -RT_ERROR;
  1109. }
  1110. #endif //BSP_UART1_TX_USING_DMA
  1111. #endif // RT_SERIAL_USING_DMA
  1112. #endif //BSP_USING_UART1
  1113. #ifdef BSP_USING_UART2
  1114. uarts[HPM_UART2_INDEX].serial->config = config;
  1115. uarts[HPM_UART2_INDEX].serial->config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
  1116. uarts[HPM_UART2_INDEX].serial->config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
  1117. #ifdef RT_SERIAL_USING_DMA
  1118. uarts[HPM_UART2_INDEX].dma_flags = 0;
  1119. #ifdef BSP_UART2_RX_USING_DMA
  1120. status = hpm_uart_dma_rx_init(&uarts[HPM_UART2_INDEX]);
  1121. if (status != status_success)
  1122. {
  1123. return -RT_ERROR;
  1124. }
  1125. #endif //BSP_UART2_RX_USING_DMA
  1126. #ifdef BSP_UART2_TX_USING_DMA
  1127. status = hpm_uart_dma_tx_init(&uarts[HPM_UART2_INDEX]);
  1128. if (status != status_success)
  1129. {
  1130. return -RT_ERROR;
  1131. }
  1132. #endif //BSP_UART2_TX_USING_DMA
  1133. #endif // RT_SERIAL_USING_DMA
  1134. #endif //BSP_USING_UART2
  1135. #ifdef BSP_USING_UART3
  1136. uarts[HPM_UART3_INDEX].serial->config = config;
  1137. uarts[HPM_UART3_INDEX].serial->config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
  1138. uarts[HPM_UART3_INDEX].serial->config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
  1139. #ifdef RT_SERIAL_USING_DMA
  1140. uarts[HPM_UART3_INDEX].dma_flags = 0;
  1141. #ifdef BSP_UART3_RX_USING_DMA
  1142. status = hpm_uart_dma_rx_init(&uarts[HPM_UART3_INDEX]);
  1143. if (status != status_success)
  1144. {
  1145. return -RT_ERROR;
  1146. }
  1147. #endif //BSP_UART3_RX_USING_DMA
  1148. #ifdef BSP_UART3_TX_USING_DMA
  1149. status = hpm_uart_dma_tx_init(&uarts[HPM_UART3_INDEX]);
  1150. if (status != status_success)
  1151. {
  1152. return -RT_ERROR;
  1153. }
  1154. #endif //BSP_UART3_TX_USING_DMA
  1155. #endif // RT_SERIAL_USING_DMA
  1156. #endif //BSP_USING_UART3
  1157. #ifdef BSP_USING_UART4
  1158. uarts[HPM_UART4_INDEX].serial->config = config;
  1159. uarts[HPM_UART4_INDEX].serial->config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
  1160. uarts[HPM_UART4_INDEX].serial->config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
  1161. #ifdef RT_SERIAL_USING_DMA
  1162. uarts[HPM_UART4_INDEX].dma_flags = 0;
  1163. #ifdef BSP_UART4_RX_USING_DMA
  1164. status = hpm_uart_dma_rx_init(&uarts[HPM_UART4_INDEX]);
  1165. if (status != status_success)
  1166. {
  1167. return -RT_ERROR;
  1168. }
  1169. #endif //BSP_UART4_RX_USING_DMA
  1170. #ifdef BSP_UART4_TX_USING_DMA
  1171. status = hpm_uart_dma_tx_init(&uarts[HPM_UART4_INDEX]);
  1172. if (status != status_success)
  1173. {
  1174. return -RT_ERROR;
  1175. }
  1176. #endif //BSP_UART4_TX_USING_DMA
  1177. #endif // RT_SERIAL_USING_DMA
  1178. #endif //BSP_USING_UART4
  1179. #ifdef BSP_USING_UART5
  1180. uarts[HPM_UART5_INDEX].serial->config = config;
  1181. uarts[HPM_UART5_INDEX].serial->config.rx_bufsz = BSP_UART5_RX_BUFSIZE;
  1182. uarts[HPM_UART5_INDEX].serial->config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
  1183. #ifdef RT_SERIAL_USING_DMA
  1184. uarts[HPM_UART5_INDEX].dma_flags = 0;
  1185. #ifdef BSP_UART5_RX_USING_DMA
  1186. status = hpm_uart_dma_rx_init(&uarts[HPM_UART5_INDEX]);
  1187. if (status != status_success)
  1188. {
  1189. return -RT_ERROR;
  1190. }
  1191. #endif //BSP_UART5_RX_USING_DMA
  1192. #ifdef BSP_UART5_TX_USING_DMA
  1193. status = hpm_uart_dma_tx_init(&uarts[HPM_UART5_INDEX]);
  1194. if (status != status_success)
  1195. {
  1196. return -RT_ERROR;
  1197. }
  1198. #endif //BSP_UART5_TX_USING_DMA
  1199. #endif // RT_SERIAL_USING_DMA
  1200. #endif //BSP_USING_UART5
  1201. #ifdef BSP_USING_UART6
  1202. uarts[HPM_UART6_INDEX].serial->config = config;
  1203. uarts[HPM_UART6_INDEX].serial->config.rx_bufsz = BSP_UART6_RX_BUFSIZE;
  1204. uarts[HPM_UART6_INDEX].serial->config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
  1205. #ifdef RT_SERIAL_USING_DMA
  1206. uarts[HPM_UART6_INDEX].dma_flags = 0;
  1207. #ifdef BSP_UART6_RX_USING_DMA
  1208. status = hpm_uart_dma_rx_init(&uarts[HPM_UART6_INDEX]);
  1209. if (status != status_success)
  1210. {
  1211. return -RT_ERROR;
  1212. }
  1213. #endif //BSP_UART6_RX_USING_DMA
  1214. #ifdef BSP_UART6_TX_USING_DMA
  1215. status = hpm_uart_dma_tx_init(&uarts[HPM_UART6_INDEX]);
  1216. if (status != status_success)
  1217. {
  1218. return -RT_ERROR;
  1219. }
  1220. #endif //BSP_UART6_TX_USING_DMA
  1221. #endif // RT_SERIAL_USING_DMA
  1222. #endif //BSP_USING_UART6
  1223. #ifdef BSP_USING_UART7
  1224. uarts[HPM_UART7_INDEX].serial->config = config;
  1225. uarts[HPM_UART7_INDEX].serial->config.rx_bufsz = BSP_UART7_RX_BUFSIZE;
  1226. uarts[HPM_UART7_INDEX].serial->config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
  1227. #ifdef RT_SERIAL_USING_DMA
  1228. uarts[HPM_UART7_INDEX].dma_flags = 0;
  1229. #ifdef BSP_UART7_RX_USING_DMA
  1230. status = hpm_uart_dma_rx_init(&uarts[HPM_UART7_INDEX]);
  1231. if (status != status_success)
  1232. {
  1233. return -RT_ERROR;
  1234. }
  1235. #endif //BSP_UART7_RX_USING_DMA
  1236. #ifdef BSP_UART7_TX_USING_DMA
  1237. status = hpm_uart_dma_tx_init(&uarts[HPM_UART7_INDEX]);
  1238. if (status != status_success)
  1239. {
  1240. return -RT_ERROR;
  1241. }
  1242. #endif //BSP_UART7_TX_USING_DMA
  1243. #endif // RT_SERIAL_USING_DMA
  1244. #endif //BSP_USING_UART7
  1245. #ifdef BSP_USING_UART8
  1246. uarts[HPM_UART8_INDEX].serial->config = config;
  1247. uarts[HPM_UART8_INDEX].serial->config.rx_bufsz = BSP_UART8_RX_BUFSIZE;
  1248. uarts[HPM_UART8_INDEX].serial->config.tx_bufsz = BSP_UART8_TX_BUFSIZE;
  1249. #ifdef RT_SERIAL_USING_DMA
  1250. uarts[HPM_UART8_INDEX].dma_flags = 0;
  1251. #ifdef BSP_UART8_RX_USING_DMA
  1252. status = hpm_uart_dma_rx_init(&uarts[HPM_UART8_INDEX]);
  1253. if (status != status_success)
  1254. {
  1255. return -RT_ERROR;
  1256. }
  1257. #endif //BSP_UART8_RX_USING_DMA
  1258. #ifdef BSP_UART8_TX_USING_DMA
  1259. status = hpm_uart_dma_tx_init(&uarts[HPM_UART8_INDEX]);
  1260. if (status != status_success)
  1261. {
  1262. return -RT_ERROR;
  1263. }
  1264. #endif //BSP_UART8_TX_USING_DMA
  1265. #endif // RT_SERIAL_USING_DMA
  1266. #endif //BSP_USING_UART8
  1267. #ifdef BSP_USING_UART9
  1268. uarts[HPM_UART9_INDEX].serial->config = config;
  1269. uarts[HPM_UART9_INDEX].serial->config.rx_bufsz = BSP_UART9_RX_BUFSIZE;
  1270. uarts[HPM_UART9_INDEX].serial->config.tx_bufsz = BSP_UART9_TX_BUFSIZE;
  1271. #ifdef RT_SERIAL_USING_DMA
  1272. uarts[HPM_UART9_INDEX].dma_flags = 0;
  1273. #ifdef BSP_UART9_RX_USING_DMA
  1274. status = hpm_uart_dma_rx_init(&uarts[HPM_UART9_INDEX]);
  1275. if (status != status_success)
  1276. {
  1277. return -RT_ERROR;
  1278. }
  1279. #endif //BSP_UART9_RX_USING_DMA
  1280. #ifdef BSP_UART9_TX_USING_DMA
  1281. status = hpm_uart_dma_tx_init(&uarts[HPM_UART9_INDEX]);
  1282. if (status != status_success)
  1283. {
  1284. return -RT_ERROR;
  1285. }
  1286. #endif //BSP_UART9_TX_USING_DMA
  1287. #endif // RT_SERIAL_USING_DMA
  1288. #endif //BSP_USING_UART9
  1289. #ifdef BSP_USING_UART10
  1290. uarts[HPM_UART10_INDEX].serial->config = config;
  1291. uarts[HPM_UART10_INDEX].serial->config.rx_bufsz = BSP_UART10_RX_BUFSIZE;
  1292. uarts[HPM_UART10_INDEX].serial->config.tx_bufsz = BSP_UART10_TX_BUFSIZE;
  1293. #ifdef RT_SERIAL_USING_DMA
  1294. uarts[HPM_UART10_INDEX].dma_flags = 0;
  1295. #ifdef BSP_UART10_RX_USING_DMA
  1296. status = hpm_uart_dma_rx_init(&uarts[HPM_UART10_INDEX]);
  1297. if (status != status_success)
  1298. {
  1299. return -RT_ERROR;
  1300. }
  1301. #endif //BSP_UART10_RX_USING_DMA
  1302. #ifdef BSP_UART10_TX_USING_DMA
  1303. status = hpm_uart_dma_tx_init(&uarts[HPM_UART10_INDEX]);
  1304. if (status != status_success)
  1305. {
  1306. return -RT_ERROR;
  1307. }
  1308. #endif //BSP_UART10_TX_USING_DMA
  1309. #endif // RT_SERIAL_USING_DMA
  1310. #endif //BSP_USING_UART10
  1311. #ifdef BSP_USING_UART11
  1312. uarts[HPM_UART11_INDEX].serial->config = config;
  1313. uarts[HPM_UART11_INDEX].serial->config.rx_bufsz = BSP_UART11_RX_BUFSIZE;
  1314. uarts[HPM_UART11_INDEX].serial->config.tx_bufsz = BSP_UART11_TX_BUFSIZE;
  1315. #ifdef RT_SERIAL_USING_DMA
  1316. uarts[HPM_UART11_INDEX].dma_flags = 0;
  1317. #ifdef BSP_UART11_RX_USING_DMA
  1318. status = hpm_uart_dma_rx_init(&uarts[HPM_UART11_INDEX]);
  1319. if (status != status_success)
  1320. {
  1321. return -RT_ERROR;
  1322. }
  1323. #endif //BSP_UART11_RX_USING_DMA
  1324. #ifdef BSP_UART11_TX_USING_DMA
  1325. status = hpm_uart_dma_tx_init(&uarts[HPM_UART11_INDEX]);
  1326. if (status != status_success)
  1327. {
  1328. return -RT_ERROR;
  1329. }
  1330. #endif //BSP_UART11_TX_USING_DMA
  1331. #endif // RT_SERIAL_USING_DMA
  1332. #endif //BSP_USING_UART11
  1333. #ifdef BSP_USING_UART12
  1334. uarts[HPM_UART12_INDEX].serial->config = config;
  1335. uarts[HPM_UART12_INDEX].serial->config.rx_bufsz = BSP_UART12_RX_BUFSIZE;
  1336. uarts[HPM_UART12_INDEX].serial->config.tx_bufsz = BSP_UART12_TX_BUFSIZE;
  1337. #ifdef RT_SERIAL_USING_DMA
  1338. uarts[HPM_UART12_INDEX].dma_flags = 0;
  1339. #ifdef BSP_UART12_RX_USING_DMA
  1340. status = hpm_uart_dma_rx_init(&uarts[HPM_UART12_INDEX]);
  1341. if (status != status_success)
  1342. {
  1343. return -RT_ERROR;
  1344. }
  1345. #endif //BSP_UART12_RX_USING_DMA
  1346. #ifdef BSP_UART12_TX_USING_DMA
  1347. status = hpm_uart_dma_tx_init(&uarts[HPM_UART12_INDEX]);
  1348. if (status != status_success)
  1349. {
  1350. return -RT_ERROR;
  1351. }
  1352. #endif //BSP_UART12_TX_USING_DMA
  1353. #endif // RT_SERIAL_USING_DMA
  1354. #endif //BSP_USING_UART12
  1355. #ifdef BSP_USING_UART13
  1356. uarts[HPM_UART13_INDEX].serial->config = config;
  1357. uarts[HPM_UART13_INDEX].serial->config.rx_bufsz = BSP_UART13_RX_BUFSIZE;
  1358. uarts[HPM_UART13_INDEX].serial->config.tx_bufsz = BSP_UART13_TX_BUFSIZE;
  1359. #ifdef RT_SERIAL_USING_DMA
  1360. uarts[HPM_UART13_INDEX].dma_flags = 0;
  1361. #ifdef BSP_UART13_RX_USING_DMA
  1362. status = hpm_uart_dma_rx_init(&uarts[HPM_UART13_INDEX]);
  1363. if (status != status_success)
  1364. {
  1365. return -RT_ERROR;
  1366. }
  1367. #endif //BSP_UART13_RX_USING_DMA
  1368. #ifdef BSP_UART13_TX_USING_DMA
  1369. status = hpm_uart_dma_tx_init(&uarts[HPM_UART13_INDEX]);
  1370. if (status != status_success)
  1371. {
  1372. return -RT_ERROR;
  1373. }
  1374. #endif //BSP_UART13_TX_USING_DMA
  1375. #endif // RT_SERIAL_USING_DMA
  1376. #endif //BSP_USING_UART13
  1377. #ifdef BSP_USING_UART14
  1378. uarts[HPM_UART14_INDEX].serial->config = config;
  1379. uarts[HPM_UART14_INDEX].serial->config.rx_bufsz = BSP_UART14_RX_BUFSIZE;
  1380. uarts[HPM_UART14_INDEX].serial->config.tx_bufsz = BSP_UART14_TX_BUFSIZE;
  1381. #ifdef RT_SERIAL_USING_DMA
  1382. uarts[HPM_UART14_INDEX].dma_flags = 0;
  1383. #ifdef BSP_UART14_RX_USING_DMA
  1384. status = hpm_uart_dma_rx_init(&uarts[HPM_UART14_INDEX]);
  1385. if (status != status_success)
  1386. {
  1387. return -RT_ERROR;
  1388. }
  1389. #endif //BSP_UART14_RX_USING_DMA
  1390. #ifdef BSP_UART14_TX_USING_DMA
  1391. status = hpm_uart_dma_tx_init(&uarts[HPM_UART14_INDEX]);
  1392. if (status != status_success)
  1393. {
  1394. return -RT_ERROR;
  1395. }
  1396. #endif //BSP_UART14_TX_USING_DMA
  1397. #endif // RT_SERIAL_USING_DMA
  1398. #endif //BSP_USING_UART14
  1399. #ifdef BSP_USING_UART15
  1400. uarts[HPM_UART15_INDEX].serial->config = config;
  1401. uarts[HPM_UART15_INDEX].serial->config.rx_bufsz = BSP_UART15_RX_BUFSIZE;
  1402. uarts[HPM_UART15_INDEX].serial->config.tx_bufsz = BSP_UART15_TX_BUFSIZE;
  1403. #ifdef RT_SERIAL_USING_DMA
  1404. uarts[HPM_UART15_INDEX].dma_flags = 0;
  1405. #ifdef BSP_UART15_RX_USING_DMA
  1406. status = hpm_uart_dma_rx_init(&uarts[HPM_UART15_INDEX]);
  1407. if (status != status_success)
  1408. {
  1409. return -RT_ERROR;
  1410. }
  1411. #endif //BSP_UART15_RX_USING_DMA
  1412. #ifdef BSP_UART15_TX_USING_DMA
  1413. status = hpm_uart_dma_tx_init(&uarts[HPM_UART15_INDEX]);
  1414. if (status != status_success)
  1415. {
  1416. return -RT_ERROR;
  1417. }
  1418. #endif //BSP_UART15_TX_USING_DMA
  1419. #endif // RT_SERIAL_USING_DMA
  1420. #endif //BSP_USING_UART15
  1421. return RT_EOK;
  1422. }
  1423. int rt_hw_uart_init(void)
  1424. {
  1425. /* Added bypass logic here since the rt_hw_uart_init function will be initialized twice, the 2nd initialization should be bypassed */
  1426. static bool initialized;
  1427. rt_err_t err = RT_EOK;
  1428. if (initialized)
  1429. {
  1430. return err;
  1431. }
  1432. else
  1433. {
  1434. initialized = true;
  1435. }
  1436. if (RT_EOK != hpm_uart_config()) {
  1437. return -RT_ERROR;
  1438. }
  1439. for (uint32_t i = 0; i < sizeof(uarts) / sizeof(uarts[0]); i++) {
  1440. uarts[i].serial->ops = &hpm_uart_ops;
  1441. /* register UART device */
  1442. err = rt_hw_serial_register(uarts[i].serial,
  1443. uarts[i].device_name,
  1444. RT_DEVICE_FLAG_RDWR,
  1445. (void*)&uarts[i]);
  1446. }
  1447. return err;
  1448. }
  1449. INIT_BOARD_EXPORT(rt_hw_uart_init);
  1450. #endif /* RT_USING_SERIAL */