core_uart.c 20 KB

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