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