core_uart.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  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_3;
  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. int32_t Uart_BufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
  374. {
  375. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  376. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  377. #ifdef __BUILD_OS__
  378. if (Data && Len)
  379. {
  380. OS_BufferWrite(&prvUart[UartID].TxCacheBuf, Data, Len);
  381. }
  382. #endif
  383. if (prvUart[UartID].TxBuf.Data || prvUart[UartID].TxBuf.MaxLen)
  384. {
  385. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  386. return 0;
  387. }
  388. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  389. #ifdef __BUILD_OS__
  390. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  391. Buffer_StaticInit(&prvUart[UartID].TxBuf, prvUart[UartID].TxCacheBuf.Data, prvUart[UartID].TxCacheBuf.Pos);
  392. #else
  393. Buffer_StaticInit(&prvUart[UartID].TxBuf, Data, Len);
  394. #endif
  395. while ((prvUart[UartID].TxBuf.Pos < prvUart[UartID].TxBuf.MaxLen) && (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  396. {
  397. Uart->OFFSET_0.THR = prvUart[UartID].TxBuf.Data[prvUart[UartID].TxBuf.Pos];
  398. prvUart[UartID].TxBuf.Pos++;
  399. }
  400. if (prvUart[UartID].TxBuf.Pos >= prvUart[UartID].TxBuf.MaxLen)
  401. {
  402. // 只有少量数据,只靠FIFO就能填充满,就不需要重新分配内存
  403. memset(&prvUart[UartID].TxBuf, 0, sizeof(prvUart[UartID].TxBuf));
  404. #ifdef __BUILD_OS__
  405. prvUart[UartID].TxCacheBuf.Pos = 0;
  406. #endif
  407. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  408. Uart->OFFSET_4.IER |= UART_IER_ETBEI|UART_IER_ELSI;
  409. return 0;
  410. }
  411. else
  412. {
  413. // 数据多,暂时发不完,就需要为缓存重新分配内存
  414. #ifdef __BUILD_OS__
  415. OS_InitBuffer(&prvUart[UartID].TxCacheBuf, TX_BUF_INIT);
  416. #endif
  417. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  418. Uart->OFFSET_4.IER |= UART_IER_PTIME|UART_IER_ETBEI|UART_IER_ELSI;
  419. return 1;
  420. }
  421. }
  422. #ifdef __BUILD_OS__
  423. void Uart_BufferTxStop(uint8_t UartID)
  424. {
  425. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  426. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  427. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  428. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  429. prvUart[UartID].TxCacheBuf.Pos = 0;
  430. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  431. }
  432. #endif
  433. static uint32_t prvUart_FifoRead(uint8_t UartID, uint8_t *Data, uint8_t Len)
  434. {
  435. uint32_t i = 0;
  436. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  437. while (Uart->USR & UART_STATUS_RX_FIFO_NOT_EMPTY && (--Len))
  438. {
  439. Data[i] = Uart->OFFSET_0.RBR;
  440. i++;
  441. }
  442. return i;
  443. }
  444. uint32_t Uart_FifoRead(uint8_t UartID, uint8_t *Data)
  445. {
  446. uint32_t i = 0;
  447. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  448. while (Uart->USR & UART_STATUS_RX_FIFO_NOT_EMPTY)
  449. {
  450. Data[i] = Uart->OFFSET_0.RBR;
  451. i++;
  452. }
  453. return i;
  454. }
  455. void Uart_RxBufferCB(uint8_t UartID, CBFuncEx_t CB)
  456. {
  457. #ifdef __BUILD_OS__
  458. uint32_t ReadLen;
  459. if (!prvUart[UartID].RxCacheMode)
  460. {
  461. return ;
  462. }
  463. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  464. if (!CB(prvUart[UartID].RxBuf.Data, (void *)prvUart[UartID].RxBuf.Pos))
  465. {
  466. prvUart[UartID].RxBuf.Pos = 0;
  467. if (prvUart[UartID].RxBuf.MaxLen > RX_BUF_HIGH)
  468. {
  469. OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
  470. }
  471. }
  472. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  473. #endif
  474. }
  475. uint32_t Uart_RxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len)
  476. {
  477. #ifdef __BUILD_OS__
  478. uint32_t ReadLen;
  479. if (!prvUart[UartID].RxCacheMode)
  480. {
  481. return 0;
  482. }
  483. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  484. if (!Len)
  485. {
  486. ReadLen = prvUart[UartID].RxBuf.Pos;
  487. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  488. return ReadLen;
  489. }
  490. ReadLen = (prvUart[UartID].RxBuf.Pos < Len)?prvUart[UartID].RxBuf.Pos:Len;
  491. memcpy(Data, prvUart[UartID].RxBuf.Data, ReadLen);
  492. OS_BufferRemove(&prvUart[UartID].RxBuf, ReadLen);
  493. if (!prvUart[UartID].RxBuf.Pos && prvUart[UartID].RxBuf.MaxLen > RX_BUF_HIGH)
  494. {
  495. OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
  496. }
  497. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  498. return ReadLen;
  499. #else
  500. return 0;
  501. #endif
  502. }
  503. void Uart_RxBufferClear(uint8_t UartID)
  504. {
  505. uint32_t ReadLen;
  506. if (!prvUart[UartID].RxCacheMode)
  507. {
  508. return ;
  509. }
  510. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  511. prvUart[UartID].RxBuf.Pos = 0;
  512. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  513. }
  514. #ifdef __BUILD_OS__
  515. static void prvUart_Tx(uint8_t UartID, UART_TypeDef* Uart)
  516. {
  517. if (prvUart[UartID].TxBuf.Data)
  518. {
  519. while ((prvUart[UartID].TxBuf.Pos < prvUart[UartID].TxBuf.MaxLen) && (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  520. {
  521. Uart->OFFSET_0.THR = prvUart[UartID].TxBuf.Data[prvUart[UartID].TxBuf.Pos];
  522. prvUart[UartID].TxBuf.Pos++;
  523. }
  524. if (prvUart[UartID].TxBuf.Pos >= prvUart[UartID].TxBuf.MaxLen)
  525. {
  526. #ifdef __BUILD_OS__
  527. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  528. Uart_BufferTx(UartID, NULL, 0);
  529. #else
  530. memset(&prvUart[UartID].TxBuf, 0, sizeof(prvUart[UartID].TxBuf));
  531. #endif
  532. }
  533. }
  534. #ifdef __BUILD_OS__
  535. else if (prvUart[UartID].TxCacheBuf.Pos)
  536. {
  537. Uart_BufferTx(UartID, NULL, 0);
  538. }
  539. if (!prvUart[UartID].TxBuf.Data && !prvUart[UartID].TxCacheBuf.Pos)
  540. #else
  541. if (!prvUart[UartID].TxBuf.Data)
  542. #endif
  543. {
  544. if (Uart->OFFSET_4.IER & UART_IER_PTIME)
  545. {
  546. Uart->OFFSET_4.IER &= ~UART_IER_PTIME;
  547. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_TX_BUFFER_DONE);
  548. }
  549. else
  550. {
  551. Uart->OFFSET_4.IER &= ~UART_IER_ETBEI;
  552. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_TX_ALL_DONE);
  553. }
  554. }
  555. }
  556. #endif
  557. static void prvUart_IrqHandle(int32_t IrqLine, void *pData)
  558. {
  559. uint8_t UartID = (uint32_t)pData;
  560. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  561. uint32_t reg_value, read_len;
  562. switch(Uart->OFFSET_8.IIR & 0x0f)
  563. {
  564. case UART_IT_ID_RX_RECVD:
  565. {
  566. // Uart->SRT = UART_FIFO_RX_Trigger_1_2_Full;
  567. #ifdef __BUILD_OS__
  568. if (prvUart[UartID].RxCacheMode)
  569. {
  570. if ((prvUart[UartID].RxBuf.Pos + 32) < prvUart[UartID].RxBuf.MaxLen)
  571. {
  572. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 7);
  573. }
  574. else
  575. {
  576. OS_ReSizeBuffer(&prvUart[UartID].RxBuf, prvUart[UartID].RxBuf.MaxLen * 2);
  577. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 7);
  578. }
  579. break;
  580. }
  581. #endif
  582. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_RX_NEW);
  583. }
  584. break;
  585. case UART_IT_ID_TX_EMPTY:
  586. {
  587. #ifdef __BUILD_OS__
  588. prvUart_Tx(UartID, Uart);
  589. #endif
  590. }
  591. break;
  592. case UART_IT_ID_MODEM_STATUS:
  593. {
  594. reg_value = Uart->MSR;
  595. }
  596. break;
  597. case UART_IT_ID_LINE_STATUS:
  598. {
  599. reg_value = Uart->LSR;
  600. if (reg_value & UART_LSR_TEMT)
  601. {
  602. #ifdef __BUILD_OS__
  603. prvUart_Tx(UartID, Uart);
  604. #endif
  605. }
  606. if (reg_value & (UART_LSR_PFE|UART_LSR_BI|UART_LSR_FE|UART_LSR_PE|UART_LSR_OE))
  607. {
  608. prvUart[UartID].LastError = reg_value;
  609. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_ERROR);
  610. }
  611. }
  612. break;
  613. case UART_IT_ID_BUSY_DETECT:
  614. {
  615. reg_value = Uart->USR;
  616. }
  617. break;
  618. case UART_IT_ID_CHAR_TIMEOUT:
  619. #ifdef __BUILD_OS__
  620. #ifdef __RX_USE_DMA__
  621. if (prvUart[UartID].RxCacheMode)
  622. {
  623. prvUart_RxDMADone(UartID);
  624. }
  625. #else
  626. if (prvUart[UartID].RxCacheMode)
  627. {
  628. if ((prvUart[UartID].RxBuf.Pos + 32) < prvUart[UartID].RxBuf.MaxLen)
  629. {
  630. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 32);
  631. }
  632. else
  633. {
  634. OS_ReSizeBuffer(&prvUart[UartID].RxBuf, prvUart[UartID].RxBuf.MaxLen * 2);
  635. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 32);
  636. }
  637. }
  638. #endif
  639. #endif
  640. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_RX_TIMEOUT);
  641. break;
  642. default:
  643. break;
  644. }
  645. }
  646. void Uart_PrintReg(uint8_t UartID)
  647. {
  648. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  649. DBG("%x, %x, %x", Uart->LCR, Uart->OFFSET_4.IER, Uart->SRT);
  650. }
  651. void Uart_ChangeBR(uint8_t UartID, uint32_t BaudRate)
  652. {
  653. UART_TypeDef* Uart = prvUart[UartID].RegBase;
  654. Uart->LCR |= UART_LCR_DLAB;
  655. // baud rate = (serial clock freq) / (16 * divisor).
  656. uint32_t tmpBaudRateDiv = (SystemCoreClock >> 6) / BaudRate;
  657. Uart->OFFSET_0.DLL = (tmpBaudRateDiv & 0x00FF);
  658. Uart->OFFSET_4.DLH = ((tmpBaudRateDiv >> 8) & 0x00FF);
  659. /* LCR = 0 */
  660. Uart->LCR &= ~UART_LCR_DLAB;
  661. }
  662. uint32_t Uart_GetLastError(uint8_t UartID)
  663. {
  664. return prvUart[UartID].LastError;
  665. }
  666. void Uart_Sleep(uint8_t UartID, uint8_t OnOff)
  667. {
  668. if (UartID != DBG_UART_ID)
  669. {
  670. PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, OnOff);
  671. }
  672. }