drv_uart_v2.c 43 KB

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