xref: /btstack/3rd-party/segger-rtt/SEGGER_RTT_Syscalls_SES.c (revision ce6f85e79d1d141c1b45dfa16b2671762457cbb4)
17dc86dfdSMatthias Ringwald /*********************************************************************
2779af47bSMatthias Ringwald *                    SEGGER Microcontroller GmbH                     *
3779af47bSMatthias Ringwald *                        The Embedded Experts                        *
47dc86dfdSMatthias Ringwald **********************************************************************
57dc86dfdSMatthias Ringwald *                                                                    *
6*ce6f85e7SMatthias Ringwald *            (c) 1995 - 2019 SEGGER Microcontroller GmbH             *
77dc86dfdSMatthias Ringwald *                                                                    *
87dc86dfdSMatthias Ringwald *       www.segger.com     Support: [email protected]               *
97dc86dfdSMatthias Ringwald *                                                                    *
107dc86dfdSMatthias Ringwald **********************************************************************
117dc86dfdSMatthias Ringwald *                                                                    *
127dc86dfdSMatthias Ringwald *       SEGGER RTT * Real Time Transfer for embedded targets         *
137dc86dfdSMatthias Ringwald *                                                                    *
147dc86dfdSMatthias Ringwald **********************************************************************
157dc86dfdSMatthias Ringwald *                                                                    *
167dc86dfdSMatthias Ringwald * All rights reserved.                                               *
177dc86dfdSMatthias Ringwald *                                                                    *
187dc86dfdSMatthias Ringwald * SEGGER strongly recommends to not make any changes                 *
197dc86dfdSMatthias Ringwald * to or modify the source code of this software in order to stay     *
207dc86dfdSMatthias Ringwald * compatible with the RTT protocol and J-Link.                       *
217dc86dfdSMatthias Ringwald *                                                                    *
227dc86dfdSMatthias Ringwald * Redistribution and use in source and binary forms, with or         *
237dc86dfdSMatthias Ringwald * without modification, are permitted provided that the following    *
24*ce6f85e7SMatthias Ringwald * condition is met:                                                  *
257dc86dfdSMatthias Ringwald *                                                                    *
267dc86dfdSMatthias Ringwald * o Redistributions of source code must retain the above copyright   *
27*ce6f85e7SMatthias Ringwald *   notice, this condition and the following disclaimer.             *
287dc86dfdSMatthias Ringwald *                                                                    *
297dc86dfdSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             *
307dc86dfdSMatthias Ringwald * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,        *
317dc86dfdSMatthias Ringwald * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           *
327dc86dfdSMatthias Ringwald * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           *
337dc86dfdSMatthias Ringwald * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
347dc86dfdSMatthias Ringwald * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR           *
357dc86dfdSMatthias Ringwald * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  *
367dc86dfdSMatthias Ringwald * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;    *
377dc86dfdSMatthias Ringwald * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF      *
387dc86dfdSMatthias Ringwald * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT          *
397dc86dfdSMatthias Ringwald * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  *
407dc86dfdSMatthias Ringwald * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *
417dc86dfdSMatthias Ringwald * DAMAGE.                                                            *
427dc86dfdSMatthias Ringwald *                                                                    *
437dc86dfdSMatthias Ringwald **********************************************************************
447dc86dfdSMatthias Ringwald ---------------------------END-OF-HEADER------------------------------
457dc86dfdSMatthias Ringwald File    : SEGGER_RTT_Syscalls_SES.c
467dc86dfdSMatthias Ringwald Purpose : Reimplementation of printf, puts and __getchar using RTT
477dc86dfdSMatthias Ringwald           in SEGGER Embedded Studio.
487dc86dfdSMatthias Ringwald           To use RTT for printf output, include this file in your
497dc86dfdSMatthias Ringwald           application.
50*ce6f85e7SMatthias Ringwald Revision: $Rev: 24316 $
517dc86dfdSMatthias Ringwald ----------------------------------------------------------------------
527dc86dfdSMatthias Ringwald */
53*ce6f85e7SMatthias Ringwald #if (defined __SES_ARM) || (defined __SES_RISCV) || (defined __CROSSWORKS_ARM)
547dc86dfdSMatthias Ringwald 
557dc86dfdSMatthias Ringwald #include "SEGGER_RTT.h"
567dc86dfdSMatthias Ringwald #include <stdarg.h>
577dc86dfdSMatthias Ringwald #include <stdio.h>
587dc86dfdSMatthias Ringwald #include "limits.h"
597dc86dfdSMatthias Ringwald #include "__libc.h"
607dc86dfdSMatthias Ringwald #include "__vfprintf.h"
617dc86dfdSMatthias Ringwald 
627dc86dfdSMatthias Ringwald /*********************************************************************
637dc86dfdSMatthias Ringwald *
647dc86dfdSMatthias Ringwald *       Defines, configurable
657dc86dfdSMatthias Ringwald *
667dc86dfdSMatthias Ringwald **********************************************************************
677dc86dfdSMatthias Ringwald */
687dc86dfdSMatthias Ringwald //
697dc86dfdSMatthias Ringwald // Select string formatting implementation.
707dc86dfdSMatthias Ringwald //
717dc86dfdSMatthias Ringwald // RTT printf formatting
727dc86dfdSMatthias Ringwald //  - Configurable stack usage. (SEGGER_RTT_PRINTF_BUFFER_SIZE in SEGGER_RTT_Conf.h)
737dc86dfdSMatthias Ringwald //  - No maximum string length.
747dc86dfdSMatthias Ringwald //  - Limited conversion specifiers and flags. (See SEGGER_RTT_printf.c)
757dc86dfdSMatthias Ringwald // Standard library printf formatting
767dc86dfdSMatthias Ringwald //  - Configurable formatting capabilities.
777dc86dfdSMatthias Ringwald //  - Full conversion specifier and flag support.
787dc86dfdSMatthias Ringwald //  - Maximum string length has to be known or (slightly) slower character-wise output.
797dc86dfdSMatthias Ringwald //
807dc86dfdSMatthias Ringwald // #define PRINTF_USE_SEGGER_RTT_FORMATTING    0 // Use standard library formatting
817dc86dfdSMatthias Ringwald // #define PRINTF_USE_SEGGER_RTT_FORMATTING    1 // Use RTT formatting
827dc86dfdSMatthias Ringwald //
837dc86dfdSMatthias Ringwald #ifndef   PRINTF_USE_SEGGER_RTT_FORMATTING
847dc86dfdSMatthias Ringwald   #define PRINTF_USE_SEGGER_RTT_FORMATTING    0
857dc86dfdSMatthias Ringwald #endif
867dc86dfdSMatthias Ringwald //
877dc86dfdSMatthias Ringwald // If using standard library formatting,
887dc86dfdSMatthias Ringwald // select maximum output string buffer size or character-wise output.
897dc86dfdSMatthias Ringwald //
907dc86dfdSMatthias Ringwald // #define PRINTF_BUFFER_SIZE                  0 // Use character-wise output
917dc86dfdSMatthias Ringwald // #define PRINTF_BUFFER_SIZE                128 // Default maximum string length
927dc86dfdSMatthias Ringwald //
937dc86dfdSMatthias Ringwald #ifndef   PRINTF_BUFFER_SIZE
947dc86dfdSMatthias Ringwald   #define PRINTF_BUFFER_SIZE                128
957dc86dfdSMatthias Ringwald #endif
967dc86dfdSMatthias Ringwald 
977dc86dfdSMatthias Ringwald #if PRINTF_USE_SEGGER_RTT_FORMATTING  // Use SEGGER RTT formatting implementation
987dc86dfdSMatthias Ringwald /*********************************************************************
997dc86dfdSMatthias Ringwald *
1007dc86dfdSMatthias Ringwald *       Function prototypes
1017dc86dfdSMatthias Ringwald *
1027dc86dfdSMatthias Ringwald **********************************************************************
1037dc86dfdSMatthias Ringwald */
1047dc86dfdSMatthias Ringwald int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList);
1057dc86dfdSMatthias Ringwald 
1067dc86dfdSMatthias Ringwald /*********************************************************************
1077dc86dfdSMatthias Ringwald *
1087dc86dfdSMatthias Ringwald *       Global functions, printf
1097dc86dfdSMatthias Ringwald *
1107dc86dfdSMatthias Ringwald **********************************************************************
1117dc86dfdSMatthias Ringwald */
1127dc86dfdSMatthias Ringwald /*********************************************************************
1137dc86dfdSMatthias Ringwald *
1147dc86dfdSMatthias Ringwald *       printf()
1157dc86dfdSMatthias Ringwald *
1167dc86dfdSMatthias Ringwald *  Function description
1177dc86dfdSMatthias Ringwald *    print a formatted string using RTT and SEGGER RTT formatting.
1187dc86dfdSMatthias Ringwald */
printf(const char * fmt,...)1197dc86dfdSMatthias Ringwald int printf(const char *fmt,...) {
1207dc86dfdSMatthias Ringwald   int     n;
1217dc86dfdSMatthias Ringwald   va_list args;
1227dc86dfdSMatthias Ringwald 
1237dc86dfdSMatthias Ringwald   va_start (args, fmt);
1247dc86dfdSMatthias Ringwald   n = SEGGER_RTT_vprintf(0, fmt, &args);
1257dc86dfdSMatthias Ringwald   va_end(args);
1267dc86dfdSMatthias Ringwald   return n;
1277dc86dfdSMatthias Ringwald }
1287dc86dfdSMatthias Ringwald 
1297dc86dfdSMatthias Ringwald #elif PRINTF_BUFFER_SIZE == 0 // Use standard library formatting with character-wise output
1307dc86dfdSMatthias Ringwald 
1317dc86dfdSMatthias Ringwald /*********************************************************************
1327dc86dfdSMatthias Ringwald *
1337dc86dfdSMatthias Ringwald *       Static functions
1347dc86dfdSMatthias Ringwald *
1357dc86dfdSMatthias Ringwald **********************************************************************
1367dc86dfdSMatthias Ringwald */
_putchar(int x,__printf_tag_ptr ctx)1377dc86dfdSMatthias Ringwald static int _putchar(int x, __printf_tag_ptr ctx) {
1387dc86dfdSMatthias Ringwald   (void)ctx;
1397dc86dfdSMatthias Ringwald   SEGGER_RTT_Write(0, (char *)&x, 1);
1407dc86dfdSMatthias Ringwald   return x;
1417dc86dfdSMatthias Ringwald }
1427dc86dfdSMatthias Ringwald 
1437dc86dfdSMatthias Ringwald /*********************************************************************
1447dc86dfdSMatthias Ringwald *
1457dc86dfdSMatthias Ringwald *       Global functions, printf
1467dc86dfdSMatthias Ringwald *
1477dc86dfdSMatthias Ringwald **********************************************************************
1487dc86dfdSMatthias Ringwald */
1497dc86dfdSMatthias Ringwald /*********************************************************************
1507dc86dfdSMatthias Ringwald *
1517dc86dfdSMatthias Ringwald *       printf()
1527dc86dfdSMatthias Ringwald *
1537dc86dfdSMatthias Ringwald *  Function description
1547dc86dfdSMatthias Ringwald *    print a formatted string character-wise, using RTT and standard
1557dc86dfdSMatthias Ringwald *    library formatting.
1567dc86dfdSMatthias Ringwald */
printf(const char * fmt,...)1577dc86dfdSMatthias Ringwald int printf(const char *fmt, ...) {
1587dc86dfdSMatthias Ringwald   int         n;
1597dc86dfdSMatthias Ringwald   va_list     args;
1607dc86dfdSMatthias Ringwald   __printf_t  iod;
1617dc86dfdSMatthias Ringwald 
1627dc86dfdSMatthias Ringwald   va_start(args, fmt);
1637dc86dfdSMatthias Ringwald   iod.string    = 0;
1647dc86dfdSMatthias Ringwald   iod.maxchars  = INT_MAX;
1657dc86dfdSMatthias Ringwald   iod.output_fn = _putchar;
1667dc86dfdSMatthias Ringwald   SEGGER_RTT_LOCK();
1677dc86dfdSMatthias Ringwald   n = __vfprintf(&iod, fmt, args);
1687dc86dfdSMatthias Ringwald   SEGGER_RTT_UNLOCK();
1697dc86dfdSMatthias Ringwald   va_end(args);
1707dc86dfdSMatthias Ringwald   return n;
1717dc86dfdSMatthias Ringwald }
1727dc86dfdSMatthias Ringwald 
1737dc86dfdSMatthias Ringwald #else // Use standard library formatting with static buffer
1747dc86dfdSMatthias Ringwald 
1757dc86dfdSMatthias Ringwald /*********************************************************************
1767dc86dfdSMatthias Ringwald *
1777dc86dfdSMatthias Ringwald *       Global functions, printf
1787dc86dfdSMatthias Ringwald *
1797dc86dfdSMatthias Ringwald **********************************************************************
1807dc86dfdSMatthias Ringwald */
1817dc86dfdSMatthias Ringwald /*********************************************************************
1827dc86dfdSMatthias Ringwald *
1837dc86dfdSMatthias Ringwald *       printf()
1847dc86dfdSMatthias Ringwald *
1857dc86dfdSMatthias Ringwald *  Function description
1867dc86dfdSMatthias Ringwald *    print a formatted string using RTT and standard library formatting.
1877dc86dfdSMatthias Ringwald */
printf(const char * fmt,...)1887dc86dfdSMatthias Ringwald int printf(const char *fmt,...) {
1897dc86dfdSMatthias Ringwald   int     n;
1907dc86dfdSMatthias Ringwald   char    aBuffer[PRINTF_BUFFER_SIZE];
1917dc86dfdSMatthias Ringwald   va_list args;
1927dc86dfdSMatthias Ringwald 
1937dc86dfdSMatthias Ringwald   va_start (args, fmt);
1947dc86dfdSMatthias Ringwald   n = vsnprintf(aBuffer, sizeof(aBuffer), fmt, args);
1957dc86dfdSMatthias Ringwald   if (n > (int)sizeof(aBuffer)) {
1967dc86dfdSMatthias Ringwald     SEGGER_RTT_Write(0, aBuffer, sizeof(aBuffer));
1977dc86dfdSMatthias Ringwald   } else if (n > 0) {
1987dc86dfdSMatthias Ringwald     SEGGER_RTT_Write(0, aBuffer, n);
1997dc86dfdSMatthias Ringwald   }
2007dc86dfdSMatthias Ringwald   va_end(args);
2017dc86dfdSMatthias Ringwald   return n;
2027dc86dfdSMatthias Ringwald }
2037dc86dfdSMatthias Ringwald #endif
2047dc86dfdSMatthias Ringwald 
2057dc86dfdSMatthias Ringwald /*********************************************************************
2067dc86dfdSMatthias Ringwald *
2077dc86dfdSMatthias Ringwald *       Global functions
2087dc86dfdSMatthias Ringwald *
2097dc86dfdSMatthias Ringwald **********************************************************************
2107dc86dfdSMatthias Ringwald */
2117dc86dfdSMatthias Ringwald /*********************************************************************
2127dc86dfdSMatthias Ringwald *
2137dc86dfdSMatthias Ringwald *       puts()
2147dc86dfdSMatthias Ringwald *
2157dc86dfdSMatthias Ringwald *  Function description
2167dc86dfdSMatthias Ringwald *    print a string using RTT.
2177dc86dfdSMatthias Ringwald */
puts(const char * s)2187dc86dfdSMatthias Ringwald int puts(const char *s) {
2197dc86dfdSMatthias Ringwald   return SEGGER_RTT_WriteString(0, s);
2207dc86dfdSMatthias Ringwald }
2217dc86dfdSMatthias Ringwald 
2227dc86dfdSMatthias Ringwald /*********************************************************************
2237dc86dfdSMatthias Ringwald *
2247dc86dfdSMatthias Ringwald *       __putchar()
2257dc86dfdSMatthias Ringwald *
2267dc86dfdSMatthias Ringwald *  Function description
2277dc86dfdSMatthias Ringwald *    Write one character via RTT.
2287dc86dfdSMatthias Ringwald */
__putchar(int x,__printf_tag_ptr ctx)2297dc86dfdSMatthias Ringwald int __putchar(int x, __printf_tag_ptr ctx) {
2307dc86dfdSMatthias Ringwald   (void)ctx;
2317dc86dfdSMatthias Ringwald   SEGGER_RTT_Write(0, (char *)&x, 1);
2327dc86dfdSMatthias Ringwald   return x;
2337dc86dfdSMatthias Ringwald }
2347dc86dfdSMatthias Ringwald 
2357dc86dfdSMatthias Ringwald /*********************************************************************
2367dc86dfdSMatthias Ringwald *
2377dc86dfdSMatthias Ringwald *       __getchar()
2387dc86dfdSMatthias Ringwald *
2397dc86dfdSMatthias Ringwald *  Function description
2407dc86dfdSMatthias Ringwald *    Wait for and get a character via RTT.
2417dc86dfdSMatthias Ringwald */
__getchar()2427dc86dfdSMatthias Ringwald int __getchar() {
2437dc86dfdSMatthias Ringwald   return SEGGER_RTT_WaitKey();
2447dc86dfdSMatthias Ringwald }
2457dc86dfdSMatthias Ringwald 
2467dc86dfdSMatthias Ringwald #endif
2477dc86dfdSMatthias Ringwald /****** End Of File *************************************************/
248