diff options
Diffstat (limited to 'platform/utilities/src/debug_console.c')
-rw-r--r-- | platform/utilities/src/debug_console.c | 312 |
1 files changed, 312 insertions, 0 deletions
diff --git a/platform/utilities/src/debug_console.c b/platform/utilities/src/debug_console.c new file mode 100644 index 0000000..6a0366a --- /dev/null +++ b/platform/utilities/src/debug_console.c @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of Freescale Semiconductor, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include "debug_console.h" +#include "print_scan.h" + +#if __ICCARM__ +#include <yfuns.h> +#endif + +static int debug_putc(int ch, void* stream); + +/******************************************************************************* + * Variables + ******************************************************************************/ +/*! @brief Debug UART state information.*/ +static debug_console_state_t s_debugConsole; + +/******************************************************************************* + * Code + ******************************************************************************/ +debug_console_status_t DbgConsole_Init(debug_console_state_t *prv_debugConsole) +{ + if (s_debugConsole.inited) + { + return status_DEBUGCONSOLE_Failed; + } + + s_debugConsole.base = prv_debugConsole->base; + /* Set the function pointer for send and receive for this kind of device. */ + s_debugConsole.ops.Send = prv_debugConsole->ops.Send; + s_debugConsole.ops.Receive = prv_debugConsole->ops.Receive; + + s_debugConsole.inited = true; + return status_DEBUGCONSOLE_Success; +} + +#if __ICCARM__ +#pragma weak __write +size_t __write(int handle, const unsigned char * buffer, size_t size) +{ + if (buffer == 0) + { + /* This means that we should flush internal buffers. Since we*/ + /* don't we just return. (Remember, "handle" == -1 means that all*/ + /* handles should be flushed.)*/ + return 0; + } + + /* This function only writes to "standard out" and "standard err",*/ + /* for all other file handles it returns failure.*/ + if ((handle != _LLIO_STDOUT) && (handle != _LLIO_STDERR)) + { + return _LLIO_ERROR; + } + + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return _LLIO_ERROR; + } + + /* Send data.*/ + s_debugConsole.ops.Send(s_debugConsole.base, (uint8_t const *)buffer, size); + return size; +} + +#pragma weak __read +size_t __read(int handle, unsigned char * buffer, size_t size) +{ + /* This function only reads from "standard in", for all other file*/ + /* handles it returns failure.*/ + if (handle != _LLIO_STDIN) + { + return _LLIO_ERROR; + } + + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return _LLIO_ERROR; + } + + /* Receive data.*/ + s_debugConsole.ops.Receive(s_debugConsole.base, buffer, size); + + return size; +} + +#elif (defined(__GNUC__)) +#pragma weak _write +int _write (int handle, char *buffer, int size) +{ + if (buffer == 0) + { + /* return -1 if error */ + return -1; + } + + /* This function only writes to "standard out" and "standard err",*/ + /* for all other file handles it returns failure.*/ + if ((handle != 1) && (handle != 2)) + { + return -1; + } + + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + + /* Send data.*/ + s_debugConsole.ops.Send(s_debugConsole.base, (uint8_t *)buffer, size); + return size; +} + +#pragma weak _read +int _read(int handle, char *buffer, int size) +{ + /* This function only reads from "standard in", for all other file*/ + /* handles it returns failure.*/ + if (handle != 0) + { + return -1; + } + + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + + /* Receive data.*/ + s_debugConsole.ops.Receive(s_debugConsole.base, (uint8_t *)buffer, size); + return size; +} +#elif defined(__CC_ARM) +struct __FILE +{ + int handle; + /* Whatever you require here. If the only file you are using is */ + /* standard output using printf() for debugging, no file handling */ + /* is required. */ +}; + +/* FILE is typedef in stdio.h. */ +#pragma weak __stdout +FILE __stdout; +FILE __stdin; + +#pragma weak fputc +int fputc(int ch, FILE *f) +{ + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + + /* Send data.*/ + s_debugConsole.ops.Send(s_debugConsole.base, (const uint8_t*)&ch, 1); + return 1; +} + +#pragma weak fgetc +int fgetc(FILE *f) +{ + uint8_t temp; + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + + /* Receive data.*/ + s_debugConsole.ops.Receive(s_debugConsole.base, &temp, 1); + return temp; +} +#endif + +/*************Code for debug_printf/scanf/assert*******************************/ +int debug_printf(const char *fmt_s, ...) +{ + va_list ap; + int result; + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + + va_start(ap, fmt_s); + result = _doprint(NULL, debug_putc, -1, (char *)fmt_s, ap); + va_end(ap); + + return result; +} + +static int debug_putc(int ch, void* stream) +{ + const unsigned char c = (unsigned char) ch; + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + s_debugConsole.ops.Send(s_debugConsole.base, &c, 1); + + return 0; +} + +int debug_putchar(int ch) +{ + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + debug_putc(ch, NULL); + + return 1; +} + +int debug_scanf(const char *fmt_ptr, ...) +{ + char temp_buf[IO_MAXLINE]; + va_list ap; + uint32_t i; + char result; + + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + va_start(ap, fmt_ptr); + temp_buf[0] = '\0'; + + for (i = 0; i < IO_MAXLINE; i++) + { + temp_buf[i] = result = debug_getchar(); + + if ((result == '\r') || (result == '\n')) + { + /* End of Line */ + if (i == 0) + { + i = (uint32_t)-1; + } + else + { + break; + } + } + + temp_buf[i + 1] = '\0'; + } + + result = scan_prv(temp_buf, (char *)fmt_ptr, ap); + va_end(ap); + + return result; +} + +int debug_getchar(void) +{ + unsigned char c; + + /* Do nothing if the debug uart is not initialized.*/ + if (!s_debugConsole.inited) + { + return -1; + } + s_debugConsole.ops.Receive(s_debugConsole.base, &c, 1); + + return c; +} + +/******************************************************************************* + * EOF + ******************************************************************************/ |