core_uart.c 19 KB

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