core_uart.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  1. /*
  2. * Copyright (c) 2022 OpenLuat & AirM2M
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy of
  5. * this software and associated documentation files (the "Software"), to deal in
  6. * the Software without restriction, including without limitation the rights to
  7. * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  8. * the Software, and to permit persons to whom the Software is furnished to do so,
  9. * subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
  16. * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
  17. * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
  18. * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  19. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  20. */
  21. #include "user.h"
  22. //const UART_TypeDef* hwUart[UART_MAX] = {UART0, UART1, UART2, UART3};
  23. //const int IrqUart[UART_MAX] = {UART0_IRQn, UART1_IRQn, UART2_IRQn, UART3_IRQn};
  24. //static CBFuncEx_t UartCB[UART_MAX];
  25. //static Buffer_Struct prvUartTxBuffer[UART_MAX];
  26. #define RX_BUF_LOW (1024)
  27. #define RX_BUF_INIT (2048)
  28. #define RX_BUF_HIGH (4096)
  29. #define RX_BUF_BAND (3)
  30. #define TX_BUF_INIT (2048)
  31. //#define __RX_USE_DMA__
  32. typedef struct
  33. {
  34. const UART_TypeDef *RegBase;
  35. const int IrqLine;
  36. const uint16_t DMATxChannel;
  37. const uint16_t DMARxChannel;
  38. CBFuncEx_t Callback;
  39. Buffer_Struct TxBuf;
  40. #ifdef __BUILD_OS__
  41. Buffer_Struct TxCacheBuf; // 缓存下次发送的数据
  42. #endif
  43. Buffer_Struct RxBuf;
  44. #ifdef __RX_USE_DMA__
  45. Buffer_Struct RxDMABuf[RX_BUF_BAND];
  46. #endif
  47. uint32_t LastError;
  48. #ifdef __RX_USE_DMA__
  49. uint8_t RxDMASn;
  50. #endif
  51. uint8_t RxCacheMode;
  52. uint8_t DMATxStream;
  53. uint8_t DMARxStream;
  54. }Uart_ResourceStruct;
  55. static Uart_ResourceStruct prvUart[UART_MAX] = {
  56. {
  57. UART0,
  58. UART0_IRQn,
  59. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART0_TX,
  60. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART0_RX,
  61. },
  62. {
  63. UART1,
  64. UART1_IRQn,
  65. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART1_TX,
  66. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART1_RX,
  67. },
  68. {
  69. UART2,
  70. UART2_IRQn,
  71. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART2_TX,
  72. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART2_RX,
  73. },
  74. {
  75. UART3,
  76. UART3_IRQn,
  77. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART3_TX,
  78. SYSCTRL_PHER_CTRL_DMA_CHx_IF_UART3_RX,
  79. },
  80. };
  81. static int32_t prvUart_DummyCB(void *pData, void *pParam)
  82. {
  83. return 0;
  84. }
  85. static void prvUart_IrqHandle(int32_t IrqLine, void *pData);
  86. static void prvUart_RxDMADone(uint8_t UartID)
  87. {
  88. #ifdef __BUILD_OS__
  89. #ifdef __RX_USE_DMA__
  90. uint32_t Length, LastRxSn;
  91. LastRxSn = prvUart[UartID].RxDMASn;
  92. DMA_StopStream(prvUart[UartID].DMARxStream);
  93. Length = DMA_GetDataLength(prvUart[UartID].DMARxStream, &prvUart[UartID].RxDMABuf[LastRxSn].Data);
  94. Length += Uart_FifoRead(UartID, &prvUart[UartID].RxDMABuf[LastRxSn].Data[Length]);
  95. prvUart[UartID].RxDMASn = (prvUart[UartID].RxDMASn + 1)%RX_BUF_BAND;
  96. Uart_DMARx(UartID, prvUart[UartID].DMARxStream, prvUart[UartID].RxDMABuf[prvUart[UartID].RxDMASn].Data, RX_BUF_LOW);
  97. if ((prvUart[UartID].RxBuf.Pos + Length) < prvUart[UartID].RxBuf.MaxLen)
  98. {
  99. }
  100. else
  101. {
  102. OS_ReSizeBuffer(&prvUart[UartID].RxBuf, prvUart[UartID].RxBuf.MaxLen * 2);
  103. }
  104. OS_BufferWrite(&prvUart[UartID].RxBuf, prvUart[UartID].RxDMABuf[LastRxSn].Data, Length);
  105. #endif
  106. #endif
  107. }
  108. static int32_t prvUart_DMAIrqCB(void *pData, void *pParam)
  109. {
  110. uint8_t UartID = (uint32_t)pData;
  111. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  112. if (prvUart[UartID].RxCacheMode)
  113. {
  114. prvUart_RxDMADone(UartID);
  115. }
  116. else
  117. {
  118. prvUart[UartID].Callback(pData, pParam);
  119. }
  120. }
  121. static void prvUart_FIFOInit(UART_TypeDef *UARTx, UART_FIFOInitTypeDef *UART_FIFOInitStruct)
  122. {
  123. /************************** FIFO Tx Interrupt Config ******************************/
  124. if (DISABLE != UART_FIFOInitStruct->FIFO_TX_TriggerIntEnable)
  125. {
  126. UARTx->OFFSET_4.IER |= UART_IER_PTIME;
  127. }
  128. else
  129. {
  130. UARTx->OFFSET_4.IER &= ~UART_IER_PTIME;
  131. }
  132. /************************** FIFO Config ******************************/
  133. /* FCR Write Only So Here we Use FCR Shadow Register SDMAM(WR) */
  134. if (UARTx->SFE | UART_SFE_SFE)
  135. {
  136. UARTx->SFE &= ~UART_SFE_SFE;
  137. }
  138. if (UART_FIFO_DMA_Mode_0 == UART_FIFOInitStruct->FIFO_DMA_Mode)
  139. {
  140. UARTx->SDMAM &= ~UART_SDMAM_SDMAM;
  141. }
  142. else if(UART_FIFO_DMA_Mode_1 == UART_FIFOInitStruct->FIFO_DMA_Mode)
  143. {
  144. UARTx->SDMAM |= UART_SDMAM_SDMAM;
  145. }
  146. /* FCR Write Only So Here we Use FCR Shadow Register SRT and STET(WR) */
  147. UARTx->SRT = UART_FIFOInitStruct->FIFO_RX_Trigger;
  148. UARTx->STET = UART_FIFOInitStruct->FIFO_TX_Trigger;
  149. if (DISABLE != UART_FIFOInitStruct->FIFO_Enable)
  150. {
  151. UARTx->SFE |= UART_SFE_SFE;
  152. }
  153. else
  154. {
  155. UARTx->SFE &= ~UART_SFE_SFE;
  156. }
  157. }
  158. void Uart_GlobalInit(void)
  159. {
  160. int i, j;
  161. for(i = 0; i < UART_MAX; i++)
  162. {
  163. memset(&prvUart[i].RxBuf, 0, sizeof(Buffer_Struct));
  164. #ifdef __RX_USE_DMA__
  165. for(j = 0; j < RX_BUF_BAND; j++)
  166. {
  167. memset(&prvUart[i].RxDMABuf[j], 0, sizeof(Buffer_Struct));
  168. }
  169. #endif
  170. prvUart[i].RxCacheMode = 0;
  171. }
  172. }
  173. void Uart_BaseInit(uint8_t UartID, uint32_t BaudRate, uint8_t IsRxCacheEnable, uint8_t DataBits, uint8_t Parity, uint8_t StopBits, CBFuncEx_t CB)
  174. {
  175. uint32_t tmpBaudRateDiv, LCR;
  176. UART_FIFOInitTypeDef UART_FIFOInitStruct;
  177. UART_TypeDef* Uart = prvUart[UartID].RegBase;
  178. SYSCTRL->SOFT_RST1 = (1 << UartID);
  179. while(SYSCTRL->SOFT_RST1 & (1 << UartID)){;}
  180. UART_FIFOInitStruct.FIFO_Enable = ENABLE;
  181. UART_FIFOInitStruct.FIFO_DMA_Mode = UART_FIFO_DMA_Mode_1;
  182. UART_FIFOInitStruct.FIFO_RX_Trigger = UART_FIFO_RX_Trigger_1_2_Full;
  183. UART_FIFOInitStruct.FIFO_TX_Trigger = UART_FIFO_TX_Trigger_1_4_Full;
  184. UART_FIFOInitStruct.FIFO_TX_TriggerIntEnable = ENABLE;
  185. ISR_SetHandler(prvUart[UartID].IrqLine, prvUart_IrqHandle, (void *)UartID);
  186. #ifdef __BUILD_OS__
  187. ISR_SetPriority(prvUart[UartID].IrqLine, IRQ_MAX_PRIORITY + 2);
  188. #else
  189. ISR_SetPriority(prvUart[UartID].IrqLine, 5);
  190. #endif
  191. if (CB)
  192. {
  193. prvUart[UartID].Callback = CB;
  194. }
  195. else
  196. {
  197. prvUart[UartID].Callback = prvUart_DummyCB;
  198. }
  199. // UART_Init(Uart, &UART_InitStruct);
  200. Uart->LCR |= UART_LCR_DLAB;
  201. // baud rate = (serial clock freq) / (16 * divisor).
  202. tmpBaudRateDiv = (SystemCoreClock >> 6) / BaudRate;
  203. Uart->OFFSET_0.DLL = (tmpBaudRateDiv & 0x00FF);
  204. Uart->OFFSET_4.DLH = ((tmpBaudRateDiv >> 8) & 0x00FF);
  205. /* LCR = 0 */
  206. Uart->LCR &= ~UART_LCR_DLAB;
  207. LCR = UART_WordLength_5b + DataBits - UART_DATA_BIT5;
  208. switch(Parity)
  209. {
  210. case UART_STOP_BIT1:
  211. LCR |= UART_StopBits_1;
  212. break;
  213. case UART_STOP_BIT1_5:
  214. LCR |= UART_StopBits_1_5;
  215. break;
  216. case UART_STOP_BIT2:
  217. LCR |= UART_StopBits_2;
  218. break;
  219. }
  220. switch(Parity)
  221. {
  222. case UART_PARITY_NONE:
  223. LCR |= UART_Parity_No;
  224. break;
  225. case UART_PARITY_ODD:
  226. LCR |= UART_Parity_Odd;
  227. break;
  228. case UART_PARITY_EVEN:
  229. LCR |= UART_Parity_Even;
  230. break;
  231. }
  232. Uart->LCR = LCR;
  233. prvUart_FIFOInit(Uart, &UART_FIFOInitStruct);
  234. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  235. Uart->SFE |= UART_SFE_SFE;
  236. Uart->OFFSET_4.IER = UART_IER_ELSI;
  237. prvUart[UartID].RxCacheMode = IsRxCacheEnable;
  238. #ifdef __BUILD_OS__
  239. if (IsRxCacheEnable)
  240. {
  241. OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
  242. #ifdef __RX_USE_DMA__
  243. for(i = 0; i < RX_BUF_BAND; i++)
  244. {
  245. OS_ReInitBuffer(&prvUart[UartID].RxDMABuf[i], RX_BUF_LOW + 32);
  246. }
  247. Uart_DMARxInit(UartID, UART_ID0_RX_DMA_STREAM + UartID, 0);
  248. Uart_DMARx(UartID, UART_ID0_RX_DMA_STREAM + UartID, prvUart[UartID].RxDMABuf[prvUart[UartID].RxDMASn].Data, RX_BUF_LOW);
  249. #endif
  250. }
  251. else
  252. {
  253. OS_DeInitBuffer(&prvUart[UartID].RxBuf);
  254. OS_ReInitBuffer(&prvUart[UartID].TxCacheBuf, TX_BUF_INIT);
  255. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  256. #ifdef __RX_USE_DMA__
  257. for(i = 0; i < RX_BUF_BAND; i++)
  258. {
  259. OS_DeInitBuffer(&prvUart[UartID].RxDMABuf[i]);
  260. }
  261. #endif
  262. }
  263. #endif
  264. if (UartID != DBG_UART_ID)
  265. {
  266. PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, 1);
  267. }
  268. }
  269. void Uart_SetCb(uint8_t UartID, CBFuncEx_t CB)
  270. {
  271. if (CB)
  272. {
  273. prvUart[UartID].Callback = CB;
  274. }
  275. else
  276. {
  277. prvUart[UartID].Callback = prvUart_DummyCB;
  278. }
  279. }
  280. void Uart_DeInit(uint8_t UartID)
  281. {
  282. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  283. Uart->OFFSET_4.IER = 0;
  284. Uart_BufferTxStop(UartID);
  285. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  286. ISR_Clear(prvUart[UartID].IrqLine);
  287. /* LCR = 1 */
  288. Uart->LCR |= UART_LCR_DLAB;
  289. Uart->OFFSET_0.DLL = 0;
  290. Uart->OFFSET_4.DLH = 0;
  291. /* LCR = 0 */
  292. Uart->LCR &= ~UART_LCR_DLAB;
  293. if (UartID != DBG_UART_ID)
  294. {
  295. PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, 0);
  296. }
  297. }
  298. int Uart_DMATxInit(uint8_t UartID, uint8_t Stream, uint32_t Channel)
  299. {
  300. DMA_InitTypeDef DMA_InitStruct;
  301. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  302. DMA_BaseConfig(&DMA_InitStruct);
  303. DMA_InitStruct.DMA_Peripheral = prvUart[UartID].DMATxChannel;
  304. DMA_InitStruct.DMA_PeripheralBurstSize = DMA_BurstSize_8;
  305. DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&Uart->OFFSET_0.THR;
  306. DMA_InitStruct.DMA_Priority = DMA_Priority_1;
  307. DMA_InitStruct.DMA_MemoryBurstSize = DMA_BurstSize_8;
  308. prvUart[UartID].DMATxStream = Stream;
  309. return DMA_ConfigStream(Stream, &DMA_InitStruct);
  310. }
  311. int Uart_DMARxInit(uint8_t UartID, uint8_t Stream, uint32_t Channel)
  312. {
  313. DMA_InitTypeDef DMA_InitStruct;
  314. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  315. DMA_BaseConfig(&DMA_InitStruct);
  316. DMA_InitStruct.DMA_Peripheral = prvUart[UartID].DMARxChannel;
  317. DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&Uart->OFFSET_0.RBR;
  318. DMA_InitStruct.DMA_Priority = DMA_Priority_3;
  319. prvUart[UartID].DMARxStream = Stream;
  320. return DMA_ConfigStream(Stream, &DMA_InitStruct);
  321. }
  322. void Uart_BlockTx(uint8_t UartID, uint8_t *Data, uint32_t Len)
  323. {
  324. uint32_t i = 0;
  325. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  326. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  327. while(i < Len)
  328. {
  329. while (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL)
  330. {
  331. Uart->OFFSET_0.THR = Data[i];
  332. i++;
  333. }
  334. }
  335. }
  336. void Uart_NoBlockTx(uint8_t UartID, uint8_t Data)
  337. {
  338. uint32_t i = 0;
  339. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  340. while (!(Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  341. {
  342. }
  343. Uart->OFFSET_0.THR = Data;
  344. }
  345. void Uart_EnableRxIrq(uint8_t UartID)
  346. {
  347. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  348. Uart->SRT = UART_FIFO_RX_Trigger_1_2_Full;
  349. Uart->OFFSET_4.IER |= UART_IT_RX_RECVD|UART_IER_ELSI;
  350. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  351. }
  352. void Uart_EnableTxDoneIrq(uint8_t UartID)
  353. {
  354. }
  355. void Uart_DMATx(uint8_t UartID, uint8_t Stream, const uint8_t *Data, uint32_t Len)
  356. {
  357. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  358. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  359. DMA_ClearStreamFlag(Stream);
  360. DMA_ForceStartStream(Stream, Data, Len, prvUart_DMAIrqCB, (uint32_t)UartID, 1);
  361. Uart->OFFSET_4.IER |= UART_IER_PTIME|UART_IER_ETBEI;
  362. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  363. }
  364. void Uart_DMARx(uint8_t UartID, uint8_t Stream, uint8_t *Data, uint32_t Len)
  365. {
  366. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  367. Uart->OFFSET_4.IER |= UART_IT_RX_RECVD;
  368. Uart->SRT = UART_FIFO_RX_Trigger_1_4_Full;
  369. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  370. DMA_ClearStreamFlag(Stream);
  371. DMA_ForceStartStream(Stream, Data, Len, prvUart_DMAIrqCB, (uint32_t)UartID, 1);
  372. }
  373. uint8_t Uart_IsTSREmpty(uint8_t UartID)
  374. {
  375. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  376. return (Uart->LSR & UART_LSR_TEMT);
  377. }
  378. int32_t Uart_BufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
  379. {
  380. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  381. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  382. #ifdef __BUILD_OS__
  383. if (Data && Len)
  384. {
  385. OS_BufferWrite(&prvUart[UartID].TxCacheBuf, Data, Len);
  386. }
  387. #endif
  388. if (prvUart[UartID].TxBuf.Data || prvUart[UartID].TxBuf.MaxLen)
  389. {
  390. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  391. return 0;
  392. }
  393. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  394. #ifdef __BUILD_OS__
  395. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  396. Buffer_StaticInit(&prvUart[UartID].TxBuf, prvUart[UartID].TxCacheBuf.Data, prvUart[UartID].TxCacheBuf.Pos);
  397. #else
  398. Buffer_StaticInit(&prvUart[UartID].TxBuf, Data, Len);
  399. #endif
  400. while ((prvUart[UartID].TxBuf.Pos < prvUart[UartID].TxBuf.MaxLen) && (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  401. {
  402. Uart->OFFSET_0.THR = prvUart[UartID].TxBuf.Data[prvUart[UartID].TxBuf.Pos];
  403. prvUart[UartID].TxBuf.Pos++;
  404. }
  405. if (prvUart[UartID].TxBuf.Pos >= prvUart[UartID].TxBuf.MaxLen)
  406. {
  407. // 只有少量数据,只靠FIFO就能填充满,就不需要重新分配内存
  408. memset(&prvUart[UartID].TxBuf, 0, sizeof(prvUart[UartID].TxBuf));
  409. #ifdef __BUILD_OS__
  410. prvUart[UartID].TxCacheBuf.Pos = 0;
  411. #endif
  412. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  413. Uart->OFFSET_4.IER |= UART_IER_ETBEI|UART_IER_ELSI;
  414. return 0;
  415. }
  416. else
  417. {
  418. // 数据多,暂时发不完,就需要为缓存重新分配内存
  419. #ifdef __BUILD_OS__
  420. OS_InitBuffer(&prvUart[UartID].TxCacheBuf, TX_BUF_INIT);
  421. #endif
  422. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  423. Uart->OFFSET_4.IER |= UART_IER_PTIME|UART_IER_ETBEI|UART_IER_ELSI;
  424. return 1;
  425. }
  426. }
  427. #ifdef __BUILD_OS__
  428. void Uart_BufferTxStop(uint8_t UartID)
  429. {
  430. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  431. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  432. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  433. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  434. prvUart[UartID].TxCacheBuf.Pos = 0;
  435. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  436. }
  437. #endif
  438. static uint32_t prvUart_FifoRead(uint8_t UartID, uint8_t *Data, uint8_t Len)
  439. {
  440. uint32_t i = 0;
  441. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  442. while (Uart->USR & UART_STATUS_RX_FIFO_NOT_EMPTY && (--Len))
  443. {
  444. Data[i] = Uart->OFFSET_0.RBR;
  445. i++;
  446. }
  447. return i;
  448. }
  449. uint32_t Uart_FifoRead(uint8_t UartID, uint8_t *Data)
  450. {
  451. uint32_t i = 0;
  452. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  453. while (Uart->USR & UART_STATUS_RX_FIFO_NOT_EMPTY)
  454. {
  455. Data[i] = Uart->OFFSET_0.RBR;
  456. i++;
  457. }
  458. return i;
  459. }
  460. void Uart_RxBufferCB(uint8_t UartID, CBFuncEx_t CB)
  461. {
  462. #ifdef __BUILD_OS__
  463. uint32_t ReadLen;
  464. if (!prvUart[UartID].RxCacheMode)
  465. {
  466. return ;
  467. }
  468. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  469. if (!CB(prvUart[UartID].RxBuf.Data, (void *)prvUart[UartID].RxBuf.Pos))
  470. {
  471. prvUart[UartID].RxBuf.Pos = 0;
  472. if (prvUart[UartID].RxBuf.MaxLen > RX_BUF_HIGH)
  473. {
  474. OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
  475. }
  476. }
  477. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  478. #endif
  479. }
  480. uint32_t Uart_RxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len)
  481. {
  482. #ifdef __BUILD_OS__
  483. uint32_t ReadLen;
  484. if (!prvUart[UartID].RxCacheMode)
  485. {
  486. return 0;
  487. }
  488. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  489. if (!Data || !Len)
  490. {
  491. ReadLen = prvUart[UartID].RxBuf.Pos;
  492. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  493. return ReadLen;
  494. }
  495. ReadLen = (prvUart[UartID].RxBuf.Pos < Len)?prvUart[UartID].RxBuf.Pos:Len;
  496. memcpy(Data, prvUart[UartID].RxBuf.Data, ReadLen);
  497. OS_BufferRemove(&prvUart[UartID].RxBuf, ReadLen);
  498. if (!prvUart[UartID].RxBuf.Pos && prvUart[UartID].RxBuf.MaxLen > RX_BUF_HIGH)
  499. {
  500. OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
  501. }
  502. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  503. return ReadLen;
  504. #else
  505. return 0;
  506. #endif
  507. }
  508. void Uart_RxBufferClear(uint8_t UartID)
  509. {
  510. uint32_t ReadLen;
  511. if (!prvUart[UartID].RxCacheMode)
  512. {
  513. return ;
  514. }
  515. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  516. prvUart[UartID].RxBuf.Pos = 0;
  517. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  518. }
  519. #ifdef __BUILD_OS__
  520. static void prvUart_Tx(uint8_t UartID, UART_TypeDef* Uart)
  521. {
  522. if (prvUart[UartID].TxBuf.Data)
  523. {
  524. while ((prvUart[UartID].TxBuf.Pos < prvUart[UartID].TxBuf.MaxLen) && (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  525. {
  526. Uart->OFFSET_0.THR = prvUart[UartID].TxBuf.Data[prvUart[UartID].TxBuf.Pos];
  527. prvUart[UartID].TxBuf.Pos++;
  528. }
  529. if (prvUart[UartID].TxBuf.Pos >= prvUart[UartID].TxBuf.MaxLen)
  530. {
  531. #ifdef __BUILD_OS__
  532. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  533. Uart_BufferTx(UartID, NULL, 0);
  534. #else
  535. memset(&prvUart[UartID].TxBuf, 0, sizeof(prvUart[UartID].TxBuf));
  536. #endif
  537. }
  538. }
  539. #ifdef __BUILD_OS__
  540. else if (prvUart[UartID].TxCacheBuf.Pos)
  541. {
  542. Uart_BufferTx(UartID, NULL, 0);
  543. }
  544. if (!prvUart[UartID].TxBuf.Data && !prvUart[UartID].TxCacheBuf.Pos)
  545. #else
  546. if (!prvUart[UartID].TxBuf.Data)
  547. #endif
  548. {
  549. if (Uart->OFFSET_4.IER & UART_IER_PTIME)
  550. {
  551. Uart->OFFSET_4.IER &= ~UART_IER_PTIME;
  552. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_TX_BUFFER_DONE);
  553. }
  554. else
  555. {
  556. Uart->OFFSET_4.IER &= ~UART_IER_ETBEI;
  557. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_TX_ALL_DONE);
  558. }
  559. }
  560. }
  561. #endif
  562. static void prvUart_IrqHandle(int32_t IrqLine, void *pData)
  563. {
  564. uint8_t UartID = (uint32_t)pData;
  565. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  566. uint32_t reg_value, read_len;
  567. switch(Uart->OFFSET_8.IIR & 0x0f)
  568. {
  569. case UART_IT_ID_RX_RECVD:
  570. {
  571. // Uart->SRT = UART_FIFO_RX_Trigger_1_2_Full;
  572. #ifdef __BUILD_OS__
  573. if (prvUart[UartID].RxCacheMode)
  574. {
  575. if ((prvUart[UartID].RxBuf.Pos + 32) < prvUart[UartID].RxBuf.MaxLen)
  576. {
  577. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 7);
  578. }
  579. else
  580. {
  581. OS_ReSizeBuffer(&prvUart[UartID].RxBuf, prvUart[UartID].RxBuf.MaxLen * 2);
  582. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 7);
  583. }
  584. break;
  585. }
  586. #endif
  587. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_RX_NEW);
  588. }
  589. break;
  590. case UART_IT_ID_TX_EMPTY:
  591. {
  592. #ifdef __BUILD_OS__
  593. prvUart_Tx(UartID, Uart);
  594. #endif
  595. }
  596. break;
  597. case UART_IT_ID_MODEM_STATUS:
  598. {
  599. reg_value = Uart->MSR;
  600. }
  601. break;
  602. case UART_IT_ID_LINE_STATUS:
  603. {
  604. reg_value = Uart->LSR;
  605. if (reg_value & UART_LSR_TEMT)
  606. {
  607. #ifdef __BUILD_OS__
  608. prvUart_Tx(UartID, Uart);
  609. #endif
  610. }
  611. if (reg_value & (UART_LSR_PFE|UART_LSR_BI|UART_LSR_FE|UART_LSR_PE|UART_LSR_OE))
  612. {
  613. prvUart[UartID].LastError = reg_value;
  614. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_ERROR);
  615. }
  616. }
  617. break;
  618. case UART_IT_ID_BUSY_DETECT:
  619. {
  620. reg_value = Uart->USR;
  621. }
  622. break;
  623. case UART_IT_ID_CHAR_TIMEOUT:
  624. #ifdef __BUILD_OS__
  625. #ifdef __RX_USE_DMA__
  626. if (prvUart[UartID].RxCacheMode)
  627. {
  628. prvUart_RxDMADone(UartID);
  629. }
  630. #else
  631. if (prvUart[UartID].RxCacheMode)
  632. {
  633. if ((prvUart[UartID].RxBuf.Pos + 32) < prvUart[UartID].RxBuf.MaxLen)
  634. {
  635. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 32);
  636. }
  637. else
  638. {
  639. OS_ReSizeBuffer(&prvUart[UartID].RxBuf, prvUart[UartID].RxBuf.MaxLen * 2);
  640. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 32);
  641. }
  642. }
  643. #endif
  644. #endif
  645. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_RX_TIMEOUT);
  646. break;
  647. default:
  648. break;
  649. }
  650. }
  651. void Uart_PrintReg(uint8_t UartID)
  652. {
  653. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  654. DBG("%x, %x, %x", Uart->LCR, Uart->OFFSET_4.IER, Uart->SRT);
  655. }
  656. void Uart_ChangeBR(uint8_t UartID, uint32_t BaudRate)
  657. {
  658. UART_TypeDef* Uart = prvUart[UartID].RegBase;
  659. Uart->LCR |= UART_LCR_DLAB;
  660. // baud rate = (serial clock freq) / (16 * divisor).
  661. uint32_t tmpBaudRateDiv = (SystemCoreClock >> 6) / BaudRate;
  662. Uart->OFFSET_0.DLL = (tmpBaudRateDiv & 0x00FF);
  663. Uart->OFFSET_4.DLH = ((tmpBaudRateDiv >> 8) & 0x00FF);
  664. /* LCR = 0 */
  665. Uart->LCR &= ~UART_LCR_DLAB;
  666. }
  667. uint32_t Uart_GetLastError(uint8_t UartID)
  668. {
  669. return prvUart[UartID].LastError;
  670. }
  671. void Uart_Sleep(uint8_t UartID, uint8_t OnOff)
  672. {
  673. if (UartID != DBG_UART_ID)
  674. {
  675. PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, OnOff);
  676. }
  677. }