summaryrefslogtreecommitdiffstats
path: root/tinyusb/lib/SEGGER_RTT/Syscalls
diff options
context:
space:
mode:
Diffstat (limited to 'tinyusb/lib/SEGGER_RTT/Syscalls')
-rwxr-xr-xtinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_GCC.c120
-rwxr-xr-xtinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_IAR.c115
-rwxr-xr-xtinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_KEIL.c386
-rwxr-xr-xtinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_SES.c247
4 files changed, 868 insertions, 0 deletions
diff --git a/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_GCC.c b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_GCC.c
new file mode 100755
index 00000000..da4a4b5f
--- /dev/null
+++ b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_GCC.c
@@ -0,0 +1,120 @@
+/*********************************************************************
+* SEGGER Microcontroller GmbH *
+* The Embedded Experts *
+**********************************************************************
+* *
+* (c) 1995 - 2019 SEGGER Microcontroller GmbH *
+* *
+* www.segger.com Support: support@segger.com *
+* *
+**********************************************************************
+* *
+* SEGGER RTT * Real Time Transfer for embedded targets *
+* *
+**********************************************************************
+* *
+* All rights reserved. *
+* *
+* SEGGER strongly recommends to not make any changes *
+* to or modify the source code of this software in order to stay *
+* compatible with the RTT protocol and J-Link. *
+* *
+* Redistribution and use in source and binary forms, with or *
+* without modification, are permitted provided that the following *
+* condition is met: *
+* *
+* o Redistributions of source code must retain the above copyright *
+* notice, this condition and the following disclaimer. *
+* *
+* 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 SEGGER Microcontroller 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. *
+* *
+**********************************************************************
+---------------------------END-OF-HEADER------------------------------
+File : SEGGER_RTT_Syscalls_GCC.c
+Purpose : Low-level functions for using printf() via RTT in GCC.
+ To use RTT for printf output, include this file in your
+ application.
+Revision: $Rev: 17697 $
+----------------------------------------------------------------------
+*/
+#if (defined __GNUC__) && !(defined __SES_ARM) && !(defined __CROSSWORKS_ARM)
+
+#include <reent.h> // required for _write_r
+#include "SEGGER_RTT.h"
+
+
+/*********************************************************************
+*
+* Types
+*
+**********************************************************************
+*/
+//
+// If necessary define the _reent struct
+// to match the one passed by the used standard library.
+//
+struct _reent;
+
+/*********************************************************************
+*
+* Function prototypes
+*
+**********************************************************************
+*/
+int _write(int file, char *ptr, int len);
+int _write_r(struct _reent *r, int file, const void *ptr, int len);
+
+/*********************************************************************
+*
+* Global functions
+*
+**********************************************************************
+*/
+
+/*********************************************************************
+*
+* _write()
+*
+* Function description
+* Low-level write function.
+* libc subroutines will use this system routine for output to all files,
+* including stdout.
+* Write data via RTT.
+*/
+int _write(int file, char *ptr, int len) {
+ (void) file; /* Not used, avoid warning */
+ SEGGER_RTT_Write(0, ptr, len);
+ return len;
+}
+
+/*********************************************************************
+*
+* _write_r()
+*
+* Function description
+* Low-level reentrant write function.
+* libc subroutines will use this system routine for output to all files,
+* including stdout.
+* Write data via RTT.
+*/
+int _write_r(struct _reent *r, int file, const void *ptr, int len) {
+ (void) file; /* Not used, avoid warning */
+ (void) r; /* Not used, avoid warning */
+ SEGGER_RTT_Write(0, ptr, len);
+ return len;
+}
+
+#endif
+/****** End Of File *************************************************/
diff --git a/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_IAR.c b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_IAR.c
new file mode 100755
index 00000000..4c76752b
--- /dev/null
+++ b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_IAR.c
@@ -0,0 +1,115 @@
+/*********************************************************************
+* SEGGER Microcontroller GmbH *
+* The Embedded Experts *
+**********************************************************************
+* *
+* (c) 1995 - 2019 SEGGER Microcontroller GmbH *
+* *
+* www.segger.com Support: support@segger.com *
+* *
+**********************************************************************
+* *
+* SEGGER RTT * Real Time Transfer for embedded targets *
+* *
+**********************************************************************
+* *
+* All rights reserved. *
+* *
+* SEGGER strongly recommends to not make any changes *
+* to or modify the source code of this software in order to stay *
+* compatible with the RTT protocol and J-Link. *
+* *
+* Redistribution and use in source and binary forms, with or *
+* without modification, are permitted provided that the following *
+* condition is met: *
+* *
+* o Redistributions of source code must retain the above copyright *
+* notice, this condition and the following disclaimer. *
+* *
+* 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 SEGGER Microcontroller 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. *
+* *
+**********************************************************************
+---------------------------END-OF-HEADER------------------------------
+File : SEGGER_RTT_Syscalls_IAR.c
+Purpose : Low-level functions for using printf() via RTT in IAR.
+ To use RTT for printf output, include this file in your
+ application and set the Library Configuration to Normal.
+Revision: $Rev: 17697 $
+----------------------------------------------------------------------
+*/
+#ifdef __IAR_SYSTEMS_ICC__
+
+//
+// Since IAR EWARM V8 and EWRX V4, yfuns.h is considered as deprecated and LowLevelIOInterface.h
+// shall be used instead. To not break any compatibility with older compiler versions, we have a
+// version check in here.
+//
+#if ((defined __ICCARM__) && (__VER__ >= 8000000)) || ((defined __ICCRX__) && (__VER__ >= 400))
+ #include <LowLevelIOInterface.h>
+#else
+ #include <yfuns.h>
+#endif
+
+#include "SEGGER_RTT.h"
+#pragma module_name = "?__write"
+
+/*********************************************************************
+*
+* Function prototypes
+*
+**********************************************************************
+*/
+size_t __write(int handle, const unsigned char * buffer, size_t size);
+
+/*********************************************************************
+*
+* Global functions
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* __write()
+*
+* Function description
+* Low-level write function.
+* Standard library subroutines will use this system routine
+* for output to all files, including stdout.
+* Write data via RTT.
+*/
+size_t __write(int handle, const unsigned char * buffer, size_t size) {
+ (void) handle; /* Not used, avoid warning */
+ SEGGER_RTT_Write(0, (const char*)buffer, size);
+ return size;
+}
+
+/*********************************************************************
+*
+* __write_buffered()
+*
+* Function description
+* Low-level write function.
+* Standard library subroutines will use this system routine
+* for output to all files, including stdout.
+* Write data via RTT.
+*/
+size_t __write_buffered(int handle, const unsigned char * buffer, size_t size) {
+ (void) handle; /* Not used, avoid warning */
+ SEGGER_RTT_Write(0, (const char*)buffer, size);
+ return size;
+}
+
+#endif
+/****** End Of File *************************************************/
diff --git a/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_KEIL.c b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_KEIL.c
new file mode 100755
index 00000000..f7f5aed4
--- /dev/null
+++ b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_KEIL.c
@@ -0,0 +1,386 @@
+/*********************************************************************
+* SEGGER Microcontroller GmbH *
+* The Embedded Experts *
+**********************************************************************
+* *
+* (c) 1995 - 2019 SEGGER Microcontroller GmbH *
+* *
+* www.segger.com Support: support@segger.com *
+* *
+**********************************************************************
+* *
+* SEGGER RTT * Real Time Transfer for embedded targets *
+* *
+**********************************************************************
+* *
+* All rights reserved. *
+* *
+* SEGGER strongly recommends to not make any changes *
+* to or modify the source code of this software in order to stay *
+* compatible with the RTT protocol and J-Link. *
+* *
+* Redistribution and use in source and binary forms, with or *
+* without modification, are permitted provided that the following *
+* condition is met: *
+* *
+* o Redistributions of source code must retain the above copyright *
+* notice, this condition and the following disclaimer. *
+* *
+* 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 SEGGER Microcontroller 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. *
+* *
+**********************************************************************
+---------------------------END-OF-HEADER------------------------------
+File : RTT_Syscalls_KEIL.c
+Purpose : Retargeting module for KEIL MDK-CM3.
+ Low-level functions for using printf() via RTT
+Revision: $Rev: 17697 $
+----------------------------------------------------------------------
+*/
+#ifdef __CC_ARM
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <rt_sys.h>
+#include <rt_misc.h>
+
+#include "SEGGER_RTT.h"
+/*********************************************************************
+*
+* #pragmas
+*
+**********************************************************************
+*/
+#pragma import(__use_no_semihosting)
+
+#ifdef _MICROLIB
+ #pragma import(__use_full_stdio)
+#endif
+
+/*********************************************************************
+*
+* Defines non-configurable
+*
+**********************************************************************
+*/
+
+/* Standard IO device handles - arbitrary, but any real file system handles must be
+ less than 0x8000. */
+#define STDIN 0x8001 // Standard Input Stream
+#define STDOUT 0x8002 // Standard Output Stream
+#define STDERR 0x8003 // Standard Error Stream
+
+/*********************************************************************
+*
+* Public const
+*
+**********************************************************************
+*/
+#if __ARMCC_VERSION < 5000000
+//const char __stdin_name[] = "STDIN";
+const char __stdout_name[] = "STDOUT";
+const char __stderr_name[] = "STDERR";
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+
+/*********************************************************************
+*
+* _ttywrch
+*
+* Function description:
+* Outputs a character to the console
+*
+* Parameters:
+* c - character to output
+*
+*/
+void _ttywrch(int c) {
+ fputc(c, stdout); // stdout
+ fflush(stdout);
+}
+
+/*********************************************************************
+*
+* _sys_open
+*
+* Function description:
+* Opens the device/file in order to do read/write operations
+*
+* Parameters:
+* sName - sName of the device/file to open
+* OpenMode - This parameter is currently ignored
+*
+* Return value:
+* != 0 - Handle to the object to open, otherwise
+* == 0 -"device" is not handled by this module
+*
+*/
+FILEHANDLE _sys_open(const char * sName, int OpenMode) {
+ (void)OpenMode;
+ // Register standard Input Output devices.
+ if (strcmp(sName, __stdout_name) == 0) {
+ return (STDOUT);
+ } else if (strcmp(sName, __stderr_name) == 0) {
+ return (STDERR);
+ } else
+ return (0); // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_close
+*
+* Function description:
+* Closes the handle to the open device/file
+*
+* Parameters:
+* hFile - Handle to a file opened via _sys_open
+*
+* Return value:
+* 0 - device/file closed
+*
+*/
+int _sys_close(FILEHANDLE hFile) {
+ (void)hFile;
+ return 0; // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_write
+*
+* Function description:
+* Writes the data to an open handle.
+* Currently this function only outputs data to the console
+*
+* Parameters:
+* hFile - Handle to a file opened via _sys_open
+* pBuffer - Pointer to the data that shall be written
+* NumBytes - Number of bytes to write
+* Mode - The Mode that shall be used
+*
+* Return value:
+* Number of bytes *not* written to the file/device
+*
+*/
+int _sys_write(FILEHANDLE hFile, const unsigned char * pBuffer, unsigned NumBytes, int Mode) {
+ int r = 0;
+
+ (void)Mode;
+ if (hFile == STDOUT) {
+ SEGGER_RTT_Write(0, (const char*)pBuffer, NumBytes);
+ return 0;
+ }
+ return r;
+}
+
+/*********************************************************************
+*
+* _sys_read
+*
+* Function description:
+* Reads data from an open handle.
+* Currently this modules does nothing.
+*
+* Parameters:
+* hFile - Handle to a file opened via _sys_open
+* pBuffer - Pointer to buffer to store the read data
+* NumBytes - Number of bytes to read
+* Mode - The Mode that shall be used
+*
+* Return value:
+* Number of bytes read from the file/device
+*
+*/
+int _sys_read(FILEHANDLE hFile, unsigned char * pBuffer, unsigned NumBytes, int Mode) {
+ (void)hFile;
+ (void)pBuffer;
+ (void)NumBytes;
+ (void)Mode;
+ return (0); // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_istty
+*
+* Function description:
+* This function shall return whether the opened file
+* is a console device or not.
+*
+* Parameters:
+* hFile - Handle to a file opened via _sys_open
+*
+* Return value:
+* 1 - Device is a console
+* 0 - Device is not a console
+*
+*/
+int _sys_istty(FILEHANDLE hFile) {
+ if (hFile > 0x8000) {
+ return (1);
+ }
+ return (0); // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_seek
+*
+* Function description:
+* Seeks via the file to a specific position
+*
+* Parameters:
+* hFile - Handle to a file opened via _sys_open
+* Pos -
+*
+* Return value:
+* int -
+*
+*/
+int _sys_seek(FILEHANDLE hFile, long Pos) {
+ (void)hFile;
+ (void)Pos;
+ return (0); // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_ensure
+*
+* Function description:
+*
+*
+* Parameters:
+* hFile - Handle to a file opened via _sys_open
+*
+* Return value:
+* int -
+*
+*/
+int _sys_ensure(FILEHANDLE hFile) {
+ (void)hFile;
+ return (-1); // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_flen
+*
+* Function description:
+* Returns the length of the opened file handle
+*
+* Parameters:
+* hFile - Handle to a file opened via _sys_open
+*
+* Return value:
+* Length of the file
+*
+*/
+long _sys_flen(FILEHANDLE hFile) {
+ (void)hFile;
+ return (0); // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_tmpnam
+*
+* Function description:
+* This function converts the file number fileno for a temporary
+* file to a unique filename, for example, tmp0001.
+*
+* Parameters:
+* pBuffer - Pointer to a buffer to store the name
+* FileNum - file number to convert
+* MaxLen - Size of the buffer
+*
+* Return value:
+* 1 - Error
+* 0 - Success
+*
+*/
+int _sys_tmpnam(char * pBuffer, int FileNum, unsigned MaxLen) {
+ (void)pBuffer;
+ (void)FileNum;
+ (void)MaxLen;
+ return (1); // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_command_string
+*
+* Function description:
+* This function shall execute a system command.
+*
+* Parameters:
+* cmd - Pointer to the command string
+* len - Length of the string
+*
+* Return value:
+* == NULL - Command was not successfully executed
+* == sCmd - Command was passed successfully
+*
+*/
+char * _sys_command_string(char * cmd, int len) {
+ (void)len;
+ return cmd; // Not implemented
+}
+
+/*********************************************************************
+*
+* _sys_exit
+*
+* Function description:
+* This function is called when the application returns from main
+*
+* Parameters:
+* ReturnCode - Return code from the main function
+*
+*
+*/
+void _sys_exit(int ReturnCode) {
+ (void)ReturnCode;
+ while (1); // Not implemented
+}
+
+#if __ARMCC_VERSION >= 5000000
+/*********************************************************************
+*
+* stdout_putchar
+*
+* Function description:
+* Put a character to the stdout
+*
+* Parameters:
+* ch - Character to output
+*
+*
+*/
+int stdout_putchar(int ch) {
+ (void)ch;
+ return ch; // Not implemented
+}
+#endif
+
+#endif
+/*************************** End of file ****************************/
diff --git a/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_SES.c b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_SES.c
new file mode 100755
index 00000000..5ce8457e
--- /dev/null
+++ b/tinyusb/lib/SEGGER_RTT/Syscalls/SEGGER_RTT_Syscalls_SES.c
@@ -0,0 +1,247 @@
+/*********************************************************************
+* SEGGER Microcontroller GmbH *
+* The Embedded Experts *
+**********************************************************************
+* *
+* (c) 1995 - 2019 SEGGER Microcontroller GmbH *
+* *
+* www.segger.com Support: support@segger.com *
+* *
+**********************************************************************
+* *
+* SEGGER RTT * Real Time Transfer for embedded targets *
+* *
+**********************************************************************
+* *
+* All rights reserved. *
+* *
+* SEGGER strongly recommends to not make any changes *
+* to or modify the source code of this software in order to stay *
+* compatible with the RTT protocol and J-Link. *
+* *
+* Redistribution and use in source and binary forms, with or *
+* without modification, are permitted provided that the following *
+* condition is met: *
+* *
+* o Redistributions of source code must retain the above copyright *
+* notice, this condition and the following disclaimer. *
+* *
+* 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 SEGGER Microcontroller 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. *
+* *
+**********************************************************************
+---------------------------END-OF-HEADER------------------------------
+File : SEGGER_RTT_Syscalls_SES.c
+Purpose : Reimplementation of printf, puts and __getchar using RTT
+ in SEGGER Embedded Studio.
+ To use RTT for printf output, include this file in your
+ application.
+Revision: $Rev: 18539 $
+----------------------------------------------------------------------
+*/
+#if (defined __SES_ARM) || (defined __SES_RISCV) || (defined __CROSSWORKS_ARM)
+
+#include "SEGGER_RTT.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include "limits.h"
+#include "__libc.h"
+#include "__vfprintf.h"
+
+/*********************************************************************
+*
+* Defines, configurable
+*
+**********************************************************************
+*/
+//
+// Select string formatting implementation.
+//
+// RTT printf formatting
+// - Configurable stack usage. (SEGGER_RTT_PRINTF_BUFFER_SIZE in SEGGER_RTT_Conf.h)
+// - No maximum string length.
+// - Limited conversion specifiers and flags. (See SEGGER_RTT_printf.c)
+// Standard library printf formatting
+// - Configurable formatting capabilities.
+// - Full conversion specifier and flag support.
+// - Maximum string length has to be known or (slightly) slower character-wise output.
+//
+// #define PRINTF_USE_SEGGER_RTT_FORMATTING 0 // Use standard library formatting
+// #define PRINTF_USE_SEGGER_RTT_FORMATTING 1 // Use RTT formatting
+//
+#ifndef PRINTF_USE_SEGGER_RTT_FORMATTING
+ #define PRINTF_USE_SEGGER_RTT_FORMATTING 0
+#endif
+//
+// If using standard library formatting,
+// select maximum output string buffer size or character-wise output.
+//
+// #define PRINTF_BUFFER_SIZE 0 // Use character-wise output
+// #define PRINTF_BUFFER_SIZE 128 // Default maximum string length
+//
+#ifndef PRINTF_BUFFER_SIZE
+ #define PRINTF_BUFFER_SIZE 128
+#endif
+
+#if PRINTF_USE_SEGGER_RTT_FORMATTING // Use SEGGER RTT formatting implementation
+/*********************************************************************
+*
+* Function prototypes
+*
+**********************************************************************
+*/
+int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList);
+
+/*********************************************************************
+*
+* Global functions, printf
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* printf()
+*
+* Function description
+* print a formatted string using RTT and SEGGER RTT formatting.
+*/
+int printf(const char *fmt,...) {
+ int n;
+ va_list args;
+
+ va_start (args, fmt);
+ n = SEGGER_RTT_vprintf(0, fmt, &args);
+ va_end(args);
+ return n;
+}
+
+#elif PRINTF_BUFFER_SIZE == 0 // Use standard library formatting with character-wise output
+
+/*********************************************************************
+*
+* Static functions
+*
+**********************************************************************
+*/
+static int _putchar(int x, __printf_tag_ptr ctx) {
+ (void)ctx;
+ SEGGER_RTT_Write(0, (char *)&x, 1);
+ return x;
+}
+
+/*********************************************************************
+*
+* Global functions, printf
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* printf()
+*
+* Function description
+* print a formatted string character-wise, using RTT and standard
+* library formatting.
+*/
+int printf(const char *fmt, ...) {
+ int n;
+ va_list args;
+ __printf_t iod;
+
+ va_start(args, fmt);
+ iod.string = 0;
+ iod.maxchars = INT_MAX;
+ iod.output_fn = _putchar;
+ SEGGER_RTT_LOCK();
+ n = __vfprintf(&iod, fmt, args);
+ SEGGER_RTT_UNLOCK();
+ va_end(args);
+ return n;
+}
+
+#else // Use standard library formatting with static buffer
+
+/*********************************************************************
+*
+* Global functions, printf
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* printf()
+*
+* Function description
+* print a formatted string using RTT and standard library formatting.
+*/
+int printf(const char *fmt,...) {
+ int n;
+ char aBuffer[PRINTF_BUFFER_SIZE];
+ va_list args;
+
+ va_start (args, fmt);
+ n = vsnprintf(aBuffer, sizeof(aBuffer), fmt, args);
+ if (n > (int)sizeof(aBuffer)) {
+ SEGGER_RTT_Write(0, aBuffer, sizeof(aBuffer));
+ } else if (n > 0) {
+ SEGGER_RTT_Write(0, aBuffer, n);
+ }
+ va_end(args);
+ return n;
+}
+#endif
+
+/*********************************************************************
+*
+* Global functions
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* puts()
+*
+* Function description
+* print a string using RTT.
+*/
+int puts(const char *s) {
+ return SEGGER_RTT_WriteString(0, s);
+}
+
+/*********************************************************************
+*
+* __putchar()
+*
+* Function description
+* Write one character via RTT.
+*/
+int __putchar(int x, __printf_tag_ptr ctx) {
+ (void)ctx;
+ SEGGER_RTT_Write(0, (char *)&x, 1);
+ return x;
+}
+
+/*********************************************************************
+*
+* __getchar()
+*
+* Function description
+* Wait for and get a character via RTT.
+*/
+int __getchar() {
+ return SEGGER_RTT_WaitKey();
+}
+
+#endif
+/****** End Of File *************************************************/