drv_uart_v2.c 44 KB

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