fsl_io.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815
  1. /*
  2. * The Clear BSD License
  3. * Copyright 2017 NXP
  4. * All rights reserved.
  5. *
  6. *
  7. * Redistribution and use in source and binary forms, with or without modification,
  8. * are permitted (subject to the limitations in the disclaimer below) provided
  9. * that the following conditions are met:
  10. *
  11. * o Redistributions of source code must retain the above copyright notice, this list
  12. * of conditions and the following disclaimer.
  13. *
  14. * o Redistributions in binary form must reproduce the above copyright notice, this
  15. * list of conditions and the following disclaimer in the documentation and/or
  16. * other materials provided with the distribution.
  17. *
  18. * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
  19. * contributors may be used to endorse or promote products derived from this
  20. * software without specific prior written permission.
  21. *
  22. * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
  23. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  24. * ANY EPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  25. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  26. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  27. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EEMPLARY, OR CONSEQUENTIAL DAMAGES
  28. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  29. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  30. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  31. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  32. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  33. *
  34. */
  35. #include "fsl_io.h"
  36. #include "fsl_debug_console_conf.h"
  37. /*******************************************************************************
  38. * Definitions
  39. ******************************************************************************/
  40. /* check avaliable device */
  41. #if (defined(FSL_FEATURE_SOC_UART_COUNT) && (FSL_FEATURE_SOC_UART_COUNT != 0))
  42. #define DEBUG_CONSOLE_IO_UART
  43. #endif
  44. #if (defined(FSL_FEATURE_SOC_IUART_COUNT) && (FSL_FEATURE_SOC_IUART_COUNT != 0))
  45. #define DEBUG_CONSOLE_IO_IUART
  46. #endif
  47. #if (defined(FSL_FEATURE_SOC_LPUART_COUNT) && (FSL_FEATURE_SOC_LPUART_COUNT != 0))
  48. #define DEBUG_CONSOLE_IO_LPUART
  49. #endif
  50. #if (defined(FSL_FEATURE_SOC_LPSCI_COUNT) && (FSL_FEATURE_SOC_LPSCI_COUNT != 0))
  51. #define DEBUG_CONSOLE_IO_LPSCI
  52. #endif
  53. #if ((defined(FSL_FEATURE_SOC_USB_COUNT) && (FSL_FEATURE_SOC_USB_COUNT != 0)) && \
  54. (defined(BOARD_USE_VIRTUALCOM) && (BOARD_USE_VIRTUALCOM != 0)))
  55. #define DEBUG_CONSOLE_IO_USBCDC
  56. #endif
  57. #if (defined(FSL_FEATURE_SOC_FLEXCOMM_COUNT) && (FSL_FEATURE_SOC_FLEXCOMM_COUNT != 0))
  58. #define DEBUG_CONSOLE_IO_FLEXCOMM
  59. #endif
  60. #if (defined(FSL_FEATURE_SOC_VFIFO_COUNT) && (FSL_FEATURE_SOC_VFIFO_COUNT != 0))
  61. #define DEBUG_CONSOLE_IO_VUSART
  62. #endif
  63. /* If none of above io is supported, enable the swo for debug console, or swo can be enabled by define
  64. * DEBUG_CONSOLE_IO_SWO directly */
  65. #if (!defined(DEBUG_CONSOLE_IO_SWO) && !defined(DEBUG_CONSOLE_IO_UART) && !defined(DEBUG_CONSOLE_IO_IUART) && \
  66. !defined(DEBUG_CONSOLE_IO_LPUART) && \
  67. !defined(DEBUG_CONSOLE_IO_LPSCI) && !defined(DEBUG_CONSOLE_IO_USBCDC) && \
  68. !defined(DEBUG_CONSOLE_IO_FLEXCOMM) && \
  69. !defined(DEBUG_CONSOLE_IO_VUSART))
  70. #define DEBUG_CONSOLE_IO_SWO
  71. #endif
  72. /* configuration for debug console device */
  73. /* If new device is required as the low level device for debug console,
  74. * Add the #elif branch and add the preprocessor macro to judge whether
  75. * this kind of device exist in this SOC. */
  76. #if (defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART)
  77. #include "fsl_uart.h"
  78. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  79. static uart_handle_t s_ioUartHandler;
  80. #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
  81. #endif /* defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART */
  82. #if defined DEBUG_CONSOLE_IO_LPUART
  83. #include "fsl_lpuart.h"
  84. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  85. static lpuart_handle_t s_ioLpuartHandler;
  86. #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
  87. #endif /* DEBUG_CONSOLE_IO_LPUART */
  88. #if defined DEBUG_CONSOLE_IO_LPSCI
  89. #include "fsl_lpsci.h"
  90. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  91. static lpsci_handle_t s_ioLpsciHandler;
  92. #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
  93. #endif /* DEBUG_CONSOLE_IO_LPSCI */
  94. #if defined DEBUG_CONSOLE_IO_USBCDC
  95. #include "usb_device_config.h"
  96. #include "usb.h"
  97. #include "usb_device_cdc_acm.h"
  98. #include "usb_device_ch9.h"
  99. #include "virtual_com.h"
  100. #endif /* DEBUG_CONSOLE_IO_USBCDC */
  101. #if (defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART)
  102. #include "fsl_usart.h"
  103. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  104. static usart_handle_t s_ioUsartHandler;
  105. #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
  106. #endif /* defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART */
  107. #if defined DEBUG_CONSOLE_IO_SWO
  108. #include "fsl_swo.h"
  109. #endif
  110. /*******************************************************************************
  111. * Variables
  112. ******************************************************************************/
  113. /*! @brief Debug console IO state information. */
  114. static io_state_t s_debugConsoleIO = {
  115. .ioBase = NULL,
  116. .ioType = DEBUG_CONSOLE_DEVICE_TYPE_NONE,
  117. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  118. .callBack = NULL,
  119. #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
  120. };
  121. /*******************************************************************************
  122. * Code
  123. ******************************************************************************/
  124. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  125. #if (defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART)
  126. static void UART_Callback(UART_Type *base, uart_handle_t *handle, status_t status, void *userData)
  127. {
  128. bool tx = false, rx = false;
  129. size_t size = 0U;
  130. if (status == kStatus_UART_RxIdle)
  131. {
  132. rx = true;
  133. size = handle->txDataSizeAll;
  134. }
  135. if (status == kStatus_UART_TxIdle)
  136. {
  137. tx = true;
  138. size = handle->txDataSizeAll;
  139. }
  140. /* inform the buffer layer that transfer is complete */
  141. if (s_debugConsoleIO.callBack != NULL)
  142. {
  143. /* call buffer callback function */
  144. s_debugConsoleIO.callBack(&size, rx, tx);
  145. }
  146. }
  147. #endif /* defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART */
  148. #if defined DEBUG_CONSOLE_IO_LPSCI
  149. static void LPSCI_Callback(UART0_Type *base, lpsci_handle_t *handle, status_t status, void *userData)
  150. {
  151. bool tx = false, rx = false;
  152. size_t size = 0U;
  153. if (status == kStatus_LPSCI_RxIdle)
  154. {
  155. rx = true;
  156. size = handle->txDataSizeAll;
  157. }
  158. if (status == kStatus_LPSCI_TxIdle)
  159. {
  160. tx = true;
  161. size = handle->txDataSizeAll;
  162. }
  163. /* inform the buffer layer that transfer is complete */
  164. if (s_debugConsoleIO.callBack != NULL)
  165. {
  166. /* call buffer callback function */
  167. s_debugConsoleIO.callBack(&size, rx, tx);
  168. }
  169. }
  170. #endif /* DEBUG_CONSOLE_IO_LPSCI */
  171. #if defined DEBUG_CONSOLE_IO_LPUART
  172. static void LPUART_Callback(LPUART_Type *base, lpuart_handle_t *handle, status_t status, void *userData)
  173. {
  174. bool tx = false, rx = false;
  175. size_t size = 0U;
  176. if (status == kStatus_LPUART_RxIdle)
  177. {
  178. rx = true;
  179. size = handle->txDataSizeAll;
  180. }
  181. if (status == kStatus_LPUART_TxIdle)
  182. {
  183. tx = true;
  184. size = handle->txDataSizeAll;
  185. }
  186. /* inform the buffer layer that transfer is complete */
  187. if (s_debugConsoleIO.callBack != NULL)
  188. {
  189. /* call buffer callback function */
  190. s_debugConsoleIO.callBack(&size, rx, tx);
  191. }
  192. }
  193. #endif /* DEBUG_CONSOLE_IO_LPUART */
  194. #if (defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART)
  195. static void USART_Callback(USART_Type *base, usart_handle_t *handle, status_t status, void *userData)
  196. {
  197. bool tx = false, rx = false;
  198. size_t size = 0U;
  199. if (status == kStatus_USART_RxIdle)
  200. {
  201. rx = true;
  202. size = handle->txDataSizeAll;
  203. }
  204. if (status == kStatus_USART_TxIdle)
  205. {
  206. tx = true;
  207. size = handle->txDataSizeAll;
  208. }
  209. /* inform the buffer layer that transfer is complete */
  210. if (s_debugConsoleIO.callBack != NULL)
  211. {
  212. /* call buffer callback function */
  213. s_debugConsoleIO.callBack(&size, rx, tx);
  214. }
  215. }
  216. #endif /* defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART */
  217. #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */
  218. void IO_Init(io_state_t *io, uint32_t baudRate, uint32_t clkSrcFreq, uint8_t *ringBuffer)
  219. {
  220. assert(NULL != io);
  221. /* record device type/base */
  222. s_debugConsoleIO.ioType = io->ioType;
  223. s_debugConsoleIO.ioBase = (void *)(io->ioBase);
  224. switch (s_debugConsoleIO.ioType)
  225. {
  226. #if (defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART)
  227. case DEBUG_CONSOLE_DEVICE_TYPE_UART:
  228. case DEBUG_CONSOLE_DEVICE_TYPE_IUART:
  229. {
  230. uart_config_t uart_config;
  231. UART_GetDefaultConfig(&uart_config);
  232. uart_config.baudRate_Bps = baudRate;
  233. /* Enable clock and initial UART module follow user configure structure. */
  234. UART_Init((UART_Type *)s_debugConsoleIO.ioBase, &uart_config, clkSrcFreq);
  235. UART_EnableTx(s_debugConsoleIO.ioBase, true);
  236. UART_EnableRx(s_debugConsoleIO.ioBase, true);
  237. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  238. s_debugConsoleIO.callBack = io->callBack;
  239. /* create handler for interrupt transfer */
  240. UART_TransferCreateHandle(s_debugConsoleIO.ioBase, &s_ioUartHandler, UART_Callback, NULL);
  241. /* start ring buffer */
  242. UART_TransferStartRingBuffer(s_debugConsoleIO.ioBase, &s_ioUartHandler, ringBuffer,
  243. DEBUG_CONSOLE_RECEIVE_BUFFER_LEN);
  244. #endif
  245. }
  246. break;
  247. #endif
  248. #if defined DEBUG_CONSOLE_IO_LPUART
  249. case DEBUG_CONSOLE_DEVICE_TYPE_LPUART:
  250. {
  251. lpuart_config_t lpuart_config;
  252. LPUART_GetDefaultConfig(&lpuart_config);
  253. lpuart_config.baudRate_Bps = baudRate;
  254. /* Enable clock and initial UART module follow user configure structure. */
  255. LPUART_Init((LPUART_Type *)s_debugConsoleIO.ioBase, &lpuart_config, clkSrcFreq);
  256. LPUART_EnableTx(s_debugConsoleIO.ioBase, true);
  257. LPUART_EnableRx(s_debugConsoleIO.ioBase, true);
  258. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  259. s_debugConsoleIO.callBack = io->callBack;
  260. /* create handler for interrupt transfer */
  261. LPUART_TransferCreateHandle(s_debugConsoleIO.ioBase, &s_ioLpuartHandler, LPUART_Callback, NULL);
  262. /* start ring buffer */
  263. LPUART_TransferStartRingBuffer(s_debugConsoleIO.ioBase, &s_ioLpuartHandler, ringBuffer,
  264. DEBUG_CONSOLE_RECEIVE_BUFFER_LEN);
  265. #endif
  266. }
  267. break;
  268. #endif
  269. #if defined DEBUG_CONSOLE_IO_LPSCI
  270. case DEBUG_CONSOLE_DEVICE_TYPE_LPSCI:
  271. {
  272. lpsci_config_t lpsci_config;
  273. LPSCI_GetDefaultConfig(&lpsci_config);
  274. lpsci_config.baudRate_Bps = baudRate;
  275. /* Enable clock and initial UART module follow user configure structure. */
  276. LPSCI_Init((UART0_Type *)s_debugConsoleIO.ioBase, &lpsci_config, clkSrcFreq);
  277. LPSCI_EnableTx(s_debugConsoleIO.ioBase, true);
  278. LPSCI_EnableRx(s_debugConsoleIO.ioBase, true);
  279. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  280. s_debugConsoleIO.callBack = io->callBack;
  281. /* create handler for interrupt transfer */
  282. LPSCI_TransferCreateHandle(s_debugConsoleIO.ioBase, &s_ioLpsciHandler, LPSCI_Callback, NULL);
  283. /* start ring buffer */
  284. LPSCI_TransferStartRingBuffer(s_debugConsoleIO.ioBase, &s_ioLpsciHandler, ringBuffer,
  285. DEBUG_CONSOLE_RECEIVE_BUFFER_LEN);
  286. #endif
  287. }
  288. break;
  289. #endif
  290. #if defined DEBUG_CONSOLE_IO_USBCDC
  291. case DEBUG_CONSOLE_DEVICE_TYPE_USBCDC:
  292. {
  293. s_debugConsoleIO.ioBase = USB_VcomInit();
  294. }
  295. break;
  296. #endif
  297. #if defined DEBUG_CONSOLE_IO_FLEXCOMM
  298. case DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM:
  299. {
  300. usart_config_t usart_config;
  301. USART_GetDefaultConfig(&usart_config);
  302. usart_config.baudRate_Bps = baudRate;
  303. /* Enable clock and initial UART module follow user configure structure. */
  304. USART_Init((USART_Type *)s_debugConsoleIO.ioBase, &usart_config, clkSrcFreq);
  305. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  306. s_debugConsoleIO.callBack = io->callBack;
  307. /* create handler for interrupt transfer */
  308. USART_TransferCreateHandle(s_debugConsoleIO.ioBase, &s_ioUsartHandler, USART_Callback, NULL);
  309. /* start ring buffer */
  310. USART_TransferStartRingBuffer(s_debugConsoleIO.ioBase, &s_ioUsartHandler, ringBuffer,
  311. DEBUG_CONSOLE_RECEIVE_BUFFER_LEN);
  312. #endif
  313. }
  314. break;
  315. #endif
  316. #if defined DEBUG_CONSOLE_IO_VUSART
  317. case DEBUG_CONSOLE_DEVICE_TYPE_VUSART:
  318. {
  319. usart_config_t usart_config;
  320. USART_GetDefaultConfig(&usart_config);
  321. usart_config.baudRate_Bps = baudRate;
  322. usart_config.enableRx = true;
  323. usart_config.enableTx = true;
  324. /* Enable rx fifo for user's continously input */
  325. usart_config.fifoConfig.enableRxFifo = true;
  326. usart_config.fifoConfig.rxFifoSize = 8;
  327. /* Enable clock and initial UART module follow user configure structure. */
  328. USART_Init((USART_Type *)s_debugConsoleIO.ioBase, &usart_config, clkSrcFreq);
  329. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  330. s_debugConsoleIO.callBack = io->callBack;
  331. /* create handler for interrupt transfer */
  332. USART_TransferCreateHandle(s_debugConsoleIO.ioBase, &s_ioUsartHandler, USART_Callback, NULL);
  333. /* start ring buffer */
  334. USART_TransferStartRingBuffer(s_debugConsoleIO.ioBase, &s_ioUsartHandler, ringBuffer,
  335. DEBUG_CONSOLE_RECEIVE_BUFFER_LEN);
  336. #endif
  337. }
  338. break;
  339. #endif
  340. #if defined DEBUG_CONSOLE_IO_SWO
  341. case DEBUG_CONSOLE_DEVICE_TYPE_SWO:
  342. SWO_Init((uint32_t)s_debugConsoleIO.ioBase, baudRate, clkSrcFreq);
  343. break;
  344. #endif
  345. default:
  346. break;
  347. }
  348. }
  349. status_t IO_Deinit(void)
  350. {
  351. if (s_debugConsoleIO.ioType == DEBUG_CONSOLE_DEVICE_TYPE_NONE)
  352. {
  353. return kStatus_Success;
  354. }
  355. switch (s_debugConsoleIO.ioType)
  356. {
  357. #if (defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART)
  358. case DEBUG_CONSOLE_DEVICE_TYPE_UART:
  359. case DEBUG_CONSOLE_DEVICE_TYPE_IUART:
  360. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  361. /* stop ring buffer */
  362. UART_TransferStopRingBuffer(s_debugConsoleIO.ioBase, &s_ioUartHandler);
  363. #endif
  364. /* Disable UART module. */
  365. UART_Deinit((UART_Type *)s_debugConsoleIO.ioBase);
  366. break;
  367. #endif
  368. #if defined DEBUG_CONSOLE_IO_LPSCI
  369. case DEBUG_CONSOLE_DEVICE_TYPE_LPSCI:
  370. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  371. /* stop ring buffer */
  372. LPSCI_TransferStopRingBuffer(s_debugConsoleIO.ioBase, &s_ioLpsciHandler);
  373. #endif
  374. /* Disable LPSCI module. */
  375. LPSCI_Deinit((UART0_Type *)s_debugConsoleIO.ioBase);
  376. break;
  377. #endif
  378. #if defined DEBUG_CONSOLE_IO_LPUART
  379. case DEBUG_CONSOLE_DEVICE_TYPE_LPUART:
  380. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  381. /* stop ring buffer */
  382. LPUART_TransferStopRingBuffer(s_debugConsoleIO.ioBase, &s_ioLpuartHandler);
  383. #endif
  384. /* Disable LPUART module. */
  385. LPUART_Deinit((LPUART_Type *)s_debugConsoleIO.ioBase);
  386. break;
  387. #endif
  388. #if defined DEBUG_CONSOLE_IO_USBCDC
  389. case DEBUG_CONSOLE_DEVICE_TYPE_USBCDC:
  390. /* Disable USBCDC module. */
  391. USB_VcomDeinit(s_debugConsoleIO.ioBase);
  392. break;
  393. #endif
  394. #if (defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART)
  395. case DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM:
  396. case DEBUG_CONSOLE_DEVICE_TYPE_VUSART:
  397. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  398. /* stop ring buffer */
  399. USART_TransferStopRingBuffer(s_debugConsoleIO.ioBase, &s_ioUsartHandler);
  400. #endif
  401. /* deinit IO */
  402. USART_Deinit((USART_Type *)s_debugConsoleIO.ioBase);
  403. break;
  404. #endif
  405. #if defined DEBUG_CONSOLE_IO_SWO
  406. case DEBUG_CONSOLE_DEVICE_TYPE_SWO:
  407. SWO_Deinit((uint32_t)s_debugConsoleIO.ioBase);
  408. break;
  409. #endif
  410. default:
  411. s_debugConsoleIO.ioType = DEBUG_CONSOLE_DEVICE_TYPE_NONE;
  412. break;
  413. }
  414. s_debugConsoleIO.ioType = DEBUG_CONSOLE_DEVICE_TYPE_NONE;
  415. return kStatus_Success;
  416. }
  417. status_t IO_WaitIdle(void)
  418. {
  419. switch (s_debugConsoleIO.ioType)
  420. {
  421. #if (defined DEBUG_CONSOLE_IO_UART)
  422. case DEBUG_CONSOLE_DEVICE_TYPE_UART:
  423. /* wait transfer complete flag */
  424. while (!(UART_GetStatusFlags(s_debugConsoleIO.ioBase) & kUART_TransmissionCompleteFlag))
  425. {
  426. }
  427. break;
  428. #endif
  429. #if (defined DEBUG_CONSOLE_IO_IUART)
  430. case DEBUG_CONSOLE_DEVICE_TYPE_IUART:
  431. /* wait transfer complete flag */
  432. while (!(UART_GetStatusFlag(s_debugConsoleIO.ioBase, kUART_TxCompleteFlag)))
  433. {
  434. }
  435. break;
  436. #endif
  437. #if defined DEBUG_CONSOLE_IO_LPSCI
  438. case DEBUG_CONSOLE_DEVICE_TYPE_LPSCI:
  439. /* wait transfer complete flag */
  440. while (!(LPSCI_GetStatusFlags(s_debugConsoleIO.ioBase) & kLPSCI_TransmissionCompleteFlag))
  441. {
  442. }
  443. break;
  444. #endif
  445. #if defined DEBUG_CONSOLE_IO_LPUART
  446. case DEBUG_CONSOLE_DEVICE_TYPE_LPUART:
  447. /* wait transfer complete flag */
  448. while (!(LPUART_GetStatusFlags(s_debugConsoleIO.ioBase) & kLPUART_TransmissionCompleteFlag))
  449. {
  450. }
  451. break;
  452. #endif
  453. #if (defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART)
  454. case DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM:
  455. case DEBUG_CONSOLE_DEVICE_TYPE_VUSART:
  456. /* wait transfer complete flag */
  457. while (!(USART_GetStatusFlags(s_debugConsoleIO.ioBase) & kUSART_TxFifoEmptyFlag))
  458. {
  459. }
  460. break;
  461. #endif
  462. default:
  463. break;
  464. }
  465. return kStatus_Success;
  466. }
  467. #ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING
  468. status_t IO_Transfer(uint8_t *ch, size_t size, bool tx)
  469. {
  470. status_t status = kStatus_Fail;
  471. switch (s_debugConsoleIO.ioType)
  472. {
  473. #if (defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART)
  474. case DEBUG_CONSOLE_DEVICE_TYPE_UART:
  475. case DEBUG_CONSOLE_DEVICE_TYPE_IUART:
  476. {
  477. uart_transfer_t transfer = {0U};
  478. transfer.data = ch;
  479. transfer.dataSize = size;
  480. /* transfer data */
  481. if (tx)
  482. {
  483. status = UART_TransferSendNonBlocking(s_debugConsoleIO.ioBase, &s_ioUartHandler, &transfer);
  484. }
  485. else
  486. {
  487. status = UART_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioUartHandler, &transfer, NULL);
  488. }
  489. }
  490. break;
  491. #endif
  492. #if defined DEBUG_CONSOLE_IO_LPSCI
  493. case DEBUG_CONSOLE_DEVICE_TYPE_LPSCI:
  494. {
  495. lpsci_transfer_t transfer = {0U};
  496. transfer.data = ch;
  497. transfer.dataSize = size;
  498. /* transfer data */
  499. if (tx)
  500. {
  501. status = LPSCI_TransferSendNonBlocking(s_debugConsoleIO.ioBase, &s_ioLpsciHandler, &transfer);
  502. }
  503. else
  504. {
  505. status = LPSCI_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioLpsciHandler, &transfer, NULL);
  506. }
  507. }
  508. break;
  509. #endif
  510. #if defined DEBUG_CONSOLE_IO_LPUART
  511. case DEBUG_CONSOLE_DEVICE_TYPE_LPUART:
  512. {
  513. lpuart_transfer_t transfer = {0U};
  514. transfer.data = ch;
  515. transfer.dataSize = size;
  516. /* transfer data */
  517. if (tx)
  518. {
  519. status = LPUART_TransferSendNonBlocking(s_debugConsoleIO.ioBase, &s_ioLpuartHandler, &transfer);
  520. }
  521. else
  522. {
  523. status =
  524. LPUART_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioLpuartHandler, &transfer, NULL);
  525. }
  526. }
  527. break;
  528. #endif
  529. #if defined DEBUG_CONSOLE_IO_USBCDC
  530. case DEBUG_CONSOLE_DEVICE_TYPE_USBCDC:
  531. {
  532. if (tx)
  533. {
  534. USB_VcomWriteBlocking(s_debugConsoleIO.ioBase, ch, size);
  535. }
  536. else
  537. {
  538. USB_VcomReadBlocking(s_debugConsoleIO.ioBase, ch, size);
  539. }
  540. }
  541. break;
  542. #endif
  543. #if (defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART)
  544. case DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM:
  545. case DEBUG_CONSOLE_DEVICE_TYPE_VUSART:
  546. {
  547. usart_transfer_t transfer = {0U};
  548. transfer.data = ch;
  549. transfer.dataSize = size;
  550. /* transfer data */
  551. if (tx)
  552. {
  553. status = USART_TransferSendNonBlocking(s_debugConsoleIO.ioBase, &s_ioUsartHandler, &transfer);
  554. }
  555. else
  556. {
  557. status = USART_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioUsartHandler, &transfer, NULL);
  558. }
  559. }
  560. break;
  561. #endif
  562. #if defined DEBUG_CONSOLE_IO_SWO
  563. case DEBUG_CONSOLE_DEVICE_TYPE_SWO:
  564. status = SWO_SendBlocking((uint32_t)s_debugConsoleIO.ioBase, ch, size);
  565. break;
  566. #endif
  567. default:
  568. break;
  569. }
  570. return status;
  571. }
  572. status_t IO_TryReceiveCharacter(uint8_t *ch)
  573. {
  574. status_t status = kStatus_Fail;
  575. uint32_t size = 1U;
  576. switch (s_debugConsoleIO.ioType)
  577. {
  578. #if (defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART)
  579. case DEBUG_CONSOLE_DEVICE_TYPE_UART:
  580. case DEBUG_CONSOLE_DEVICE_TYPE_IUART:
  581. {
  582. uart_transfer_t transfer = {0U};
  583. transfer.data = ch;
  584. transfer.dataSize = size;
  585. if (UART_TransferGetRxRingBufferLength(&s_ioUartHandler) >= size)
  586. {
  587. /* transfer data */
  588. status = UART_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioUartHandler, &transfer, NULL);
  589. }
  590. }
  591. break;
  592. #endif
  593. #if defined DEBUG_CONSOLE_IO_LPSCI
  594. case DEBUG_CONSOLE_DEVICE_TYPE_LPSCI:
  595. {
  596. lpsci_transfer_t transfer = {0U};
  597. transfer.data = ch;
  598. transfer.dataSize = size;
  599. if (LPSCI_TransferGetRxRingBufferLength(&s_ioLpsciHandler) >= size)
  600. {
  601. /* transfer data */
  602. status = LPSCI_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioLpsciHandler, &transfer, NULL);
  603. }
  604. }
  605. break;
  606. #endif
  607. #if defined DEBUG_CONSOLE_IO_LPUART
  608. case DEBUG_CONSOLE_DEVICE_TYPE_LPUART:
  609. {
  610. lpuart_transfer_t transfer = {0U};
  611. transfer.data = ch;
  612. transfer.dataSize = size;
  613. if (LPUART_TransferGetRxRingBufferLength(s_debugConsoleIO.ioBase, &s_ioLpuartHandler) >= size)
  614. {
  615. /* transfer data */
  616. status =
  617. LPUART_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioLpuartHandler, &transfer, NULL);
  618. }
  619. }
  620. break;
  621. #endif
  622. #if defined DEBUG_CONSOLE_IO_USBCDC
  623. case DEBUG_CONSOLE_DEVICE_TYPE_USBCDC:
  624. break;
  625. #endif
  626. #if (defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART)
  627. case DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM:
  628. case DEBUG_CONSOLE_DEVICE_TYPE_VUSART:
  629. {
  630. usart_transfer_t transfer = {0U};
  631. transfer.data = ch;
  632. transfer.dataSize = size;
  633. if (USART_TransferGetRxRingBufferLength(&s_ioUsartHandler) >= size)
  634. {
  635. /* transfer data */
  636. status = USART_TransferReceiveNonBlocking(s_debugConsoleIO.ioBase, &s_ioUsartHandler, &transfer, NULL);
  637. }
  638. }
  639. break;
  640. #endif
  641. default:
  642. break;
  643. }
  644. return status;
  645. }
  646. #else
  647. status_t IO_Transfer(uint8_t *ch, size_t size, bool tx)
  648. {
  649. status_t status = kStatus_Success;
  650. switch (s_debugConsoleIO.ioType)
  651. {
  652. #if (defined DEBUG_CONSOLE_IO_UART) || (defined DEBUG_CONSOLE_IO_IUART)
  653. case DEBUG_CONSOLE_DEVICE_TYPE_UART:
  654. case DEBUG_CONSOLE_DEVICE_TYPE_IUART:
  655. {
  656. if (tx)
  657. {
  658. UART_WriteBlocking(s_debugConsoleIO.ioBase, ch, size);
  659. }
  660. else
  661. {
  662. status = UART_ReadBlocking(s_debugConsoleIO.ioBase, ch, size);
  663. }
  664. }
  665. break;
  666. #endif
  667. #if defined DEBUG_CONSOLE_IO_LPSCI
  668. case DEBUG_CONSOLE_DEVICE_TYPE_LPSCI:
  669. {
  670. if (tx)
  671. {
  672. LPSCI_WriteBlocking(s_debugConsoleIO.ioBase, ch, size);
  673. }
  674. else
  675. {
  676. status = LPSCI_ReadBlocking(s_debugConsoleIO.ioBase, ch, size);
  677. }
  678. }
  679. break;
  680. #endif
  681. #if defined DEBUG_CONSOLE_IO_LPUART
  682. case DEBUG_CONSOLE_DEVICE_TYPE_LPUART:
  683. {
  684. if (tx)
  685. {
  686. LPUART_WriteBlocking(s_debugConsoleIO.ioBase, ch, size);
  687. }
  688. else
  689. {
  690. status = LPUART_ReadBlocking(s_debugConsoleIO.ioBase, ch, size);
  691. }
  692. }
  693. break;
  694. #endif
  695. #if defined DEBUG_CONSOLE_IO_USBCDC
  696. case DEBUG_CONSOLE_DEVICE_TYPE_USBCDC:
  697. {
  698. if (tx)
  699. {
  700. USB_VcomWriteBlocking(s_debugConsoleIO.ioBase, ch, size);
  701. }
  702. else
  703. {
  704. status = USB_VcomReadBlocking(s_debugConsoleIO.ioBase, ch, size);
  705. }
  706. }
  707. break;
  708. #endif
  709. #if (defined DEBUG_CONSOLE_IO_FLEXCOMM) || (defined DEBUG_CONSOLE_IO_VUSART)
  710. case DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM:
  711. case DEBUG_CONSOLE_DEVICE_TYPE_VUSART:
  712. {
  713. if (tx)
  714. {
  715. USART_WriteBlocking(s_debugConsoleIO.ioBase, ch, size);
  716. }
  717. else
  718. {
  719. status = USART_ReadBlocking(s_debugConsoleIO.ioBase, ch, size);
  720. }
  721. }
  722. break;
  723. #endif
  724. #if defined DEBUG_CONSOLE_IO_SWO
  725. case DEBUG_CONSOLE_DEVICE_TYPE_SWO:
  726. status = SWO_SendBlocking((uint32_t)s_debugConsoleIO.ioBase, ch, size);
  727. break;
  728. #endif
  729. default:
  730. status = kStatus_Fail;
  731. break;
  732. }
  733. return status;
  734. }
  735. #endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */