core_uart.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  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. OS_ReInitBuffer(&prvUart[UartID].TxCacheBuf, TX_BUF_INIT);
  243. #ifdef __RX_USE_DMA__
  244. for(i = 0; i < RX_BUF_BAND; i++)
  245. {
  246. OS_ReInitBuffer(&prvUart[UartID].RxDMABuf[i], RX_BUF_LOW + 32);
  247. }
  248. Uart_DMARxInit(UartID, UART_ID0_RX_DMA_STREAM + UartID, 0);
  249. Uart_DMARx(UartID, UART_ID0_RX_DMA_STREAM + UartID, prvUart[UartID].RxDMABuf[prvUart[UartID].RxDMASn].Data, RX_BUF_LOW);
  250. #endif
  251. }
  252. else
  253. {
  254. OS_DeInitBuffer(&prvUart[UartID].RxBuf);
  255. OS_ReInitBuffer(&prvUart[UartID].TxCacheBuf, TX_BUF_INIT);
  256. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  257. #ifdef __RX_USE_DMA__
  258. for(i = 0; i < RX_BUF_BAND; i++)
  259. {
  260. OS_DeInitBuffer(&prvUart[UartID].RxDMABuf[i]);
  261. }
  262. #endif
  263. }
  264. #endif
  265. if (UartID != DBG_UART_ID)
  266. {
  267. PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, 1);
  268. }
  269. }
  270. void Uart_SetCb(uint8_t UartID, CBFuncEx_t CB)
  271. {
  272. if (CB)
  273. {
  274. prvUart[UartID].Callback = CB;
  275. }
  276. else
  277. {
  278. prvUart[UartID].Callback = prvUart_DummyCB;
  279. }
  280. }
  281. void Uart_DeInit(uint8_t UartID)
  282. {
  283. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  284. Uart->OFFSET_4.IER = 0;
  285. Uart_BufferTxStop(UartID);
  286. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  287. ISR_Clear(prvUart[UartID].IrqLine);
  288. /* LCR = 1 */
  289. Uart->LCR |= UART_LCR_DLAB;
  290. Uart->OFFSET_0.DLL = 0;
  291. Uart->OFFSET_4.DLH = 0;
  292. /* LCR = 0 */
  293. Uart->LCR &= ~UART_LCR_DLAB;
  294. if (UartID != DBG_UART_ID)
  295. {
  296. PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, 0);
  297. }
  298. #ifdef __BUILD_OS__
  299. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  300. OS_DeInitBuffer(&prvUart[UartID].TxCacheBuf);
  301. OS_DeInitBuffer(&prvUart[UartID].RxBuf);
  302. #endif
  303. }
  304. int Uart_DMATxInit(uint8_t UartID, uint8_t Stream, uint32_t Channel)
  305. {
  306. DMA_InitTypeDef DMA_InitStruct;
  307. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  308. DMA_BaseConfig(&DMA_InitStruct);
  309. DMA_InitStruct.DMA_Peripheral = prvUart[UartID].DMATxChannel;
  310. DMA_InitStruct.DMA_PeripheralBurstSize = DMA_BurstSize_8;
  311. DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&Uart->OFFSET_0.THR;
  312. DMA_InitStruct.DMA_Priority = DMA_Priority_1;
  313. DMA_InitStruct.DMA_MemoryBurstSize = DMA_BurstSize_8;
  314. prvUart[UartID].DMATxStream = Stream;
  315. return DMA_ConfigStream(Stream, &DMA_InitStruct);
  316. }
  317. int Uart_DMARxInit(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].DMARxChannel;
  323. DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&Uart->OFFSET_0.RBR;
  324. DMA_InitStruct.DMA_Priority = DMA_Priority_3;
  325. prvUart[UartID].DMARxStream = Stream;
  326. return DMA_ConfigStream(Stream, &DMA_InitStruct);
  327. }
  328. void Uart_BlockTx(uint8_t UartID, uint8_t *Data, uint32_t Len)
  329. {
  330. uint32_t i = 0;
  331. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  332. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  333. while(i < Len)
  334. {
  335. while (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL)
  336. {
  337. Uart->OFFSET_0.THR = Data[i];
  338. i++;
  339. }
  340. }
  341. }
  342. void Uart_NoBlockTx(uint8_t UartID, uint8_t Data)
  343. {
  344. uint32_t i = 0;
  345. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  346. while (!(Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  347. {
  348. }
  349. Uart->OFFSET_0.THR = Data;
  350. }
  351. void Uart_EnableRxIrq(uint8_t UartID)
  352. {
  353. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  354. Uart->SRT = UART_FIFO_RX_Trigger_1_2_Full;
  355. Uart->OFFSET_4.IER |= UART_IT_RX_RECVD|UART_IER_ELSI;
  356. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  357. }
  358. void Uart_EnableTxDoneIrq(uint8_t UartID)
  359. {
  360. }
  361. void Uart_DMATx(uint8_t UartID, uint8_t Stream, const uint8_t *Data, uint32_t Len)
  362. {
  363. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  364. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  365. DMA_ClearStreamFlag(Stream);
  366. DMA_ForceStartStream(Stream, Data, Len, prvUart_DMAIrqCB, (uint32_t)UartID, 1);
  367. Uart->OFFSET_4.IER |= UART_IER_PTIME|UART_IER_ETBEI;
  368. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  369. }
  370. void Uart_DMARx(uint8_t UartID, uint8_t Stream, uint8_t *Data, uint32_t Len)
  371. {
  372. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  373. Uart->OFFSET_4.IER |= UART_IT_RX_RECVD;
  374. Uart->SRT = UART_FIFO_RX_Trigger_1_4_Full;
  375. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  376. DMA_ClearStreamFlag(Stream);
  377. DMA_ForceStartStream(Stream, Data, Len, prvUart_DMAIrqCB, (uint32_t)UartID, 1);
  378. }
  379. uint8_t Uart_IsTSREmpty(uint8_t UartID)
  380. {
  381. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  382. return (Uart->LSR & UART_LSR_TEMT);
  383. }
  384. int32_t Uart_BufferTx(uint8_t UartID, const uint8_t *Data, uint32_t Len)
  385. {
  386. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  387. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  388. #ifdef __BUILD_OS__
  389. if (Data && Len)
  390. {
  391. OS_BufferWrite(&prvUart[UartID].TxCacheBuf, Data, Len);
  392. }
  393. #endif
  394. if (prvUart[UartID].TxBuf.Data || prvUart[UartID].TxBuf.MaxLen)
  395. {
  396. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  397. return 0;
  398. }
  399. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  400. #ifdef __BUILD_OS__
  401. // 把缓存的Tx指针交给发送的Tx指针,缓存的Tx指针重新建立一个
  402. Buffer_StaticInit(&prvUart[UartID].TxBuf, prvUart[UartID].TxCacheBuf.Data, prvUart[UartID].TxCacheBuf.Pos);
  403. #else
  404. Buffer_StaticInit(&prvUart[UartID].TxBuf, Data, Len);
  405. #endif
  406. while ((prvUart[UartID].TxBuf.Pos < prvUart[UartID].TxBuf.MaxLen) && (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  407. {
  408. Uart->OFFSET_0.THR = prvUart[UartID].TxBuf.Data[prvUart[UartID].TxBuf.Pos];
  409. prvUart[UartID].TxBuf.Pos++;
  410. }
  411. if (prvUart[UartID].TxBuf.Pos >= prvUart[UartID].TxBuf.MaxLen)
  412. {
  413. // 只有少量数据,只靠FIFO就能填充满,就不需要重新分配内存
  414. memset(&prvUart[UartID].TxBuf, 0, sizeof(prvUart[UartID].TxBuf));
  415. #ifdef __BUILD_OS__
  416. prvUart[UartID].TxCacheBuf.Pos = 0;
  417. #endif
  418. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  419. Uart->OFFSET_4.IER |= UART_IER_ETBEI|UART_IER_ELSI;
  420. return 0;
  421. }
  422. else
  423. {
  424. // 数据多,暂时发不完,就需要为缓存重新分配内存
  425. #ifdef __BUILD_OS__
  426. OS_InitBuffer(&prvUart[UartID].TxCacheBuf, TX_BUF_INIT);
  427. #endif
  428. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  429. Uart->OFFSET_4.IER |= UART_IER_PTIME|UART_IER_ETBEI|UART_IER_ELSI;
  430. return 1;
  431. }
  432. }
  433. #ifdef __BUILD_OS__
  434. void Uart_BufferTxStop(uint8_t UartID)
  435. {
  436. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  437. Uart->OFFSET_4.IER &= ~(UART_IER_PTIME|UART_IER_ETBEI);
  438. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  439. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  440. prvUart[UartID].TxCacheBuf.Pos = 0;
  441. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  442. }
  443. #endif
  444. static uint32_t prvUart_FifoRead(uint8_t UartID, uint8_t *Data, uint8_t Len)
  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 && (--Len))
  449. {
  450. Data[i] = Uart->OFFSET_0.RBR;
  451. i++;
  452. }
  453. return i;
  454. }
  455. uint32_t Uart_FifoRead(uint8_t UartID, uint8_t *Data)
  456. {
  457. uint32_t i = 0;
  458. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  459. while (Uart->USR & UART_STATUS_RX_FIFO_NOT_EMPTY)
  460. {
  461. Data[i] = Uart->OFFSET_0.RBR;
  462. i++;
  463. }
  464. return i;
  465. }
  466. void Uart_RxBufferCB(uint8_t UartID, CBFuncEx_t CB)
  467. {
  468. #ifdef __BUILD_OS__
  469. uint32_t ReadLen;
  470. if (!prvUart[UartID].RxCacheMode)
  471. {
  472. return ;
  473. }
  474. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  475. if (!CB(prvUart[UartID].RxBuf.Data, (void *)prvUart[UartID].RxBuf.Pos))
  476. {
  477. prvUart[UartID].RxBuf.Pos = 0;
  478. if (prvUart[UartID].RxBuf.MaxLen > RX_BUF_HIGH)
  479. {
  480. OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
  481. }
  482. }
  483. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  484. #endif
  485. }
  486. uint32_t Uart_RxBufferRead(uint8_t UartID, uint8_t *Data, uint32_t Len)
  487. {
  488. #ifdef __BUILD_OS__
  489. uint32_t ReadLen;
  490. if (!prvUart[UartID].RxCacheMode)
  491. {
  492. return 0;
  493. }
  494. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  495. if (!Data || !Len)
  496. {
  497. ReadLen = prvUart[UartID].RxBuf.Pos;
  498. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  499. return ReadLen;
  500. }
  501. ReadLen = (prvUart[UartID].RxBuf.Pos < Len)?prvUart[UartID].RxBuf.Pos:Len;
  502. memcpy(Data, prvUart[UartID].RxBuf.Data, ReadLen);
  503. OS_BufferRemove(&prvUart[UartID].RxBuf, ReadLen);
  504. if (!prvUart[UartID].RxBuf.Pos && prvUart[UartID].RxBuf.MaxLen > RX_BUF_HIGH)
  505. {
  506. OS_ReInitBuffer(&prvUart[UartID].RxBuf, RX_BUF_INIT);
  507. }
  508. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  509. return ReadLen;
  510. #else
  511. return 0;
  512. #endif
  513. }
  514. void Uart_RxBufferClear(uint8_t UartID)
  515. {
  516. uint32_t ReadLen;
  517. if (!prvUart[UartID].RxCacheMode)
  518. {
  519. return ;
  520. }
  521. ISR_OnOff(prvUart[UartID].IrqLine, 0);
  522. prvUart[UartID].RxBuf.Pos = 0;
  523. ISR_OnOff(prvUart[UartID].IrqLine, 1);
  524. }
  525. #ifdef __BUILD_OS__
  526. static void prvUart_Tx(uint8_t UartID, UART_TypeDef* Uart)
  527. {
  528. if (prvUart[UartID].TxBuf.Data)
  529. {
  530. while ((prvUart[UartID].TxBuf.Pos < prvUart[UartID].TxBuf.MaxLen) && (Uart->USR & UART_STATUS_TX_FIFO_NOT_FULL))
  531. {
  532. Uart->OFFSET_0.THR = prvUart[UartID].TxBuf.Data[prvUart[UartID].TxBuf.Pos];
  533. prvUart[UartID].TxBuf.Pos++;
  534. }
  535. if (prvUart[UartID].TxBuf.Pos >= prvUart[UartID].TxBuf.MaxLen)
  536. {
  537. #ifdef __BUILD_OS__
  538. OS_DeInitBuffer(&prvUart[UartID].TxBuf);
  539. Uart_BufferTx(UartID, NULL, 0);
  540. #else
  541. memset(&prvUart[UartID].TxBuf, 0, sizeof(prvUart[UartID].TxBuf));
  542. #endif
  543. }
  544. }
  545. #ifdef __BUILD_OS__
  546. else if (prvUart[UartID].TxCacheBuf.Pos)
  547. {
  548. Uart_BufferTx(UartID, NULL, 0);
  549. }
  550. if (!prvUart[UartID].TxBuf.Data && !prvUart[UartID].TxCacheBuf.Pos)
  551. #else
  552. if (!prvUart[UartID].TxBuf.Data)
  553. #endif
  554. {
  555. if (Uart->OFFSET_4.IER & UART_IER_PTIME)
  556. {
  557. Uart->OFFSET_4.IER &= ~UART_IER_PTIME;
  558. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_TX_BUFFER_DONE);
  559. }
  560. else
  561. {
  562. Uart->OFFSET_4.IER &= ~UART_IER_ETBEI;
  563. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_TX_ALL_DONE);
  564. }
  565. }
  566. }
  567. #endif
  568. static void prvUart_IrqHandle(int32_t IrqLine, void *pData)
  569. {
  570. uint8_t UartID = (uint32_t)pData;
  571. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  572. uint32_t reg_value, read_len;
  573. switch(Uart->OFFSET_8.IIR & 0x0f)
  574. {
  575. case UART_IT_ID_RX_RECVD:
  576. {
  577. // Uart->SRT = UART_FIFO_RX_Trigger_1_2_Full;
  578. #ifdef __BUILD_OS__
  579. if (prvUart[UartID].RxCacheMode)
  580. {
  581. if ((prvUart[UartID].RxBuf.Pos + 32) < prvUart[UartID].RxBuf.MaxLen)
  582. {
  583. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 7);
  584. }
  585. else
  586. {
  587. OS_ReSizeBuffer(&prvUart[UartID].RxBuf, prvUart[UartID].RxBuf.MaxLen * 2);
  588. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 7);
  589. }
  590. break;
  591. }
  592. #endif
  593. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_RX_NEW);
  594. }
  595. break;
  596. case UART_IT_ID_TX_EMPTY:
  597. {
  598. #ifdef __BUILD_OS__
  599. prvUart_Tx(UartID, Uart);
  600. #endif
  601. }
  602. break;
  603. case UART_IT_ID_MODEM_STATUS:
  604. {
  605. reg_value = Uart->MSR;
  606. }
  607. break;
  608. case UART_IT_ID_LINE_STATUS:
  609. {
  610. reg_value = Uart->LSR;
  611. if (reg_value & UART_LSR_TEMT)
  612. {
  613. #ifdef __BUILD_OS__
  614. prvUart_Tx(UartID, Uart);
  615. #endif
  616. }
  617. if (reg_value & (UART_LSR_PFE|UART_LSR_BI|UART_LSR_FE|UART_LSR_PE|UART_LSR_OE))
  618. {
  619. prvUart[UartID].LastError = reg_value;
  620. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_ERROR);
  621. }
  622. }
  623. break;
  624. case UART_IT_ID_BUSY_DETECT:
  625. {
  626. reg_value = Uart->USR;
  627. }
  628. break;
  629. case UART_IT_ID_CHAR_TIMEOUT:
  630. #ifdef __BUILD_OS__
  631. #ifdef __RX_USE_DMA__
  632. if (prvUart[UartID].RxCacheMode)
  633. {
  634. prvUart_RxDMADone(UartID);
  635. }
  636. #else
  637. if (prvUart[UartID].RxCacheMode)
  638. {
  639. if ((prvUart[UartID].RxBuf.Pos + 32) < prvUart[UartID].RxBuf.MaxLen)
  640. {
  641. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 32);
  642. }
  643. else
  644. {
  645. OS_ReSizeBuffer(&prvUart[UartID].RxBuf, prvUart[UartID].RxBuf.MaxLen * 2);
  646. prvUart[UartID].RxBuf.Pos += prvUart_FifoRead(UartID, &prvUart[UartID].RxBuf.Data[prvUart[UartID].RxBuf.Pos], 32);
  647. }
  648. }
  649. #endif
  650. #endif
  651. prvUart[UartID].Callback((uint32_t)UartID, (void *)UART_CB_RX_TIMEOUT);
  652. break;
  653. default:
  654. break;
  655. }
  656. }
  657. void Uart_PrintReg(uint8_t UartID)
  658. {
  659. UART_TypeDef* Uart = (UART_TypeDef*)prvUart[UartID].RegBase;
  660. DBG("%x, %x, %x", Uart->LCR, Uart->OFFSET_4.IER, Uart->SRT);
  661. }
  662. void Uart_ChangeBR(uint8_t UartID, uint32_t BaudRate)
  663. {
  664. UART_TypeDef* Uart = prvUart[UartID].RegBase;
  665. Uart->LCR |= UART_LCR_DLAB;
  666. // baud rate = (serial clock freq) / (16 * divisor).
  667. uint32_t tmpBaudRateDiv = (SystemCoreClock >> 6) / BaudRate;
  668. Uart->OFFSET_0.DLL = (tmpBaudRateDiv & 0x00FF);
  669. Uart->OFFSET_4.DLH = ((tmpBaudRateDiv >> 8) & 0x00FF);
  670. /* LCR = 0 */
  671. Uart->LCR &= ~UART_LCR_DLAB;
  672. }
  673. uint32_t Uart_GetLastError(uint8_t UartID)
  674. {
  675. return prvUart[UartID].LastError;
  676. }
  677. void Uart_Sleep(uint8_t UartID, uint8_t OnOff)
  678. {
  679. if (UartID != DBG_UART_ID)
  680. {
  681. PM_SetHardwareRunFlag(PM_HW_UART_0 + UartID, OnOff);
  682. }
  683. }