1*7dc86dfdSMatthias Ringwald /********************************************************************* 2*7dc86dfdSMatthias Ringwald * SEGGER MICROCONTROLLER GmbH & Co. KG * 3*7dc86dfdSMatthias Ringwald * Solutions for real time microcontroller applications * 4*7dc86dfdSMatthias Ringwald ********************************************************************** 5*7dc86dfdSMatthias Ringwald * * 6*7dc86dfdSMatthias Ringwald * (c) 2014 - 2016 SEGGER Microcontroller GmbH & Co. KG * 7*7dc86dfdSMatthias Ringwald * * 8*7dc86dfdSMatthias Ringwald * www.segger.com Support: [email protected] * 9*7dc86dfdSMatthias Ringwald * * 10*7dc86dfdSMatthias Ringwald ********************************************************************** 11*7dc86dfdSMatthias Ringwald * * 12*7dc86dfdSMatthias Ringwald * SEGGER RTT * Real Time Transfer for embedded targets * 13*7dc86dfdSMatthias Ringwald * * 14*7dc86dfdSMatthias Ringwald ********************************************************************** 15*7dc86dfdSMatthias Ringwald * * 16*7dc86dfdSMatthias Ringwald * All rights reserved. * 17*7dc86dfdSMatthias Ringwald * * 18*7dc86dfdSMatthias Ringwald * SEGGER strongly recommends to not make any changes * 19*7dc86dfdSMatthias Ringwald * to or modify the source code of this software in order to stay * 20*7dc86dfdSMatthias Ringwald * compatible with the RTT protocol and J-Link. * 21*7dc86dfdSMatthias Ringwald * * 22*7dc86dfdSMatthias Ringwald * Redistribution and use in source and binary forms, with or * 23*7dc86dfdSMatthias Ringwald * without modification, are permitted provided that the following * 24*7dc86dfdSMatthias Ringwald * conditions are met: * 25*7dc86dfdSMatthias Ringwald * * 26*7dc86dfdSMatthias Ringwald * o Redistributions of source code must retain the above copyright * 27*7dc86dfdSMatthias Ringwald * notice, this list of conditions and the following disclaimer. * 28*7dc86dfdSMatthias Ringwald * * 29*7dc86dfdSMatthias Ringwald * o Redistributions in binary form must reproduce the above * 30*7dc86dfdSMatthias Ringwald * copyright notice, this list of conditions and the following * 31*7dc86dfdSMatthias Ringwald * disclaimer in the documentation and/or other materials provided * 32*7dc86dfdSMatthias Ringwald * with the distribution. * 33*7dc86dfdSMatthias Ringwald * * 34*7dc86dfdSMatthias Ringwald * o Neither the name of SEGGER Microcontroller GmbH & Co. KG * 35*7dc86dfdSMatthias Ringwald * nor the names of its contributors may be used to endorse or * 36*7dc86dfdSMatthias Ringwald * promote products derived from this software without specific * 37*7dc86dfdSMatthias Ringwald * prior written permission. * 38*7dc86dfdSMatthias Ringwald * * 39*7dc86dfdSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * 40*7dc86dfdSMatthias Ringwald * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * 41*7dc86dfdSMatthias Ringwald * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * 42*7dc86dfdSMatthias Ringwald * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * 43*7dc86dfdSMatthias Ringwald * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * 44*7dc86dfdSMatthias Ringwald * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * 45*7dc86dfdSMatthias Ringwald * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * 46*7dc86dfdSMatthias Ringwald * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * 47*7dc86dfdSMatthias Ringwald * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * 48*7dc86dfdSMatthias Ringwald * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 49*7dc86dfdSMatthias Ringwald * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * 50*7dc86dfdSMatthias Ringwald * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * 51*7dc86dfdSMatthias Ringwald * DAMAGE. * 52*7dc86dfdSMatthias Ringwald * * 53*7dc86dfdSMatthias Ringwald ********************************************************************** 54*7dc86dfdSMatthias Ringwald ---------------------------END-OF-HEADER------------------------------ 55*7dc86dfdSMatthias Ringwald File : SEGGER_RTT_Syscalls_SES.c 56*7dc86dfdSMatthias Ringwald Purpose : Reimplementation of printf, puts and __getchar using RTT 57*7dc86dfdSMatthias Ringwald in SEGGER Embedded Studio. 58*7dc86dfdSMatthias Ringwald To use RTT for printf output, include this file in your 59*7dc86dfdSMatthias Ringwald application. 60*7dc86dfdSMatthias Ringwald Revision: $Rev: 4351 $ 61*7dc86dfdSMatthias Ringwald ---------------------------------------------------------------------- 62*7dc86dfdSMatthias Ringwald */ 63*7dc86dfdSMatthias Ringwald #if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) 64*7dc86dfdSMatthias Ringwald 65*7dc86dfdSMatthias Ringwald #include "SEGGER_RTT.h" 66*7dc86dfdSMatthias Ringwald #include <stdarg.h> 67*7dc86dfdSMatthias Ringwald #include <stdio.h> 68*7dc86dfdSMatthias Ringwald #include "limits.h" 69*7dc86dfdSMatthias Ringwald #include "__libc.h" 70*7dc86dfdSMatthias Ringwald #include "__vfprintf.h" 71*7dc86dfdSMatthias Ringwald 72*7dc86dfdSMatthias Ringwald /********************************************************************* 73*7dc86dfdSMatthias Ringwald * 74*7dc86dfdSMatthias Ringwald * Defines, configurable 75*7dc86dfdSMatthias Ringwald * 76*7dc86dfdSMatthias Ringwald ********************************************************************** 77*7dc86dfdSMatthias Ringwald */ 78*7dc86dfdSMatthias Ringwald // 79*7dc86dfdSMatthias Ringwald // Select string formatting implementation. 80*7dc86dfdSMatthias Ringwald // 81*7dc86dfdSMatthias Ringwald // RTT printf formatting 82*7dc86dfdSMatthias Ringwald // - Configurable stack usage. (SEGGER_RTT_PRINTF_BUFFER_SIZE in SEGGER_RTT_Conf.h) 83*7dc86dfdSMatthias Ringwald // - No maximum string length. 84*7dc86dfdSMatthias Ringwald // - Limited conversion specifiers and flags. (See SEGGER_RTT_printf.c) 85*7dc86dfdSMatthias Ringwald // Standard library printf formatting 86*7dc86dfdSMatthias Ringwald // - Configurable formatting capabilities. 87*7dc86dfdSMatthias Ringwald // - Full conversion specifier and flag support. 88*7dc86dfdSMatthias Ringwald // - Maximum string length has to be known or (slightly) slower character-wise output. 89*7dc86dfdSMatthias Ringwald // 90*7dc86dfdSMatthias Ringwald // #define PRINTF_USE_SEGGER_RTT_FORMATTING 0 // Use standard library formatting 91*7dc86dfdSMatthias Ringwald // #define PRINTF_USE_SEGGER_RTT_FORMATTING 1 // Use RTT formatting 92*7dc86dfdSMatthias Ringwald // 93*7dc86dfdSMatthias Ringwald #ifndef PRINTF_USE_SEGGER_RTT_FORMATTING 94*7dc86dfdSMatthias Ringwald #define PRINTF_USE_SEGGER_RTT_FORMATTING 0 95*7dc86dfdSMatthias Ringwald #endif 96*7dc86dfdSMatthias Ringwald // 97*7dc86dfdSMatthias Ringwald // If using standard library formatting, 98*7dc86dfdSMatthias Ringwald // select maximum output string buffer size or character-wise output. 99*7dc86dfdSMatthias Ringwald // 100*7dc86dfdSMatthias Ringwald // #define PRINTF_BUFFER_SIZE 0 // Use character-wise output 101*7dc86dfdSMatthias Ringwald // #define PRINTF_BUFFER_SIZE 128 // Default maximum string length 102*7dc86dfdSMatthias Ringwald // 103*7dc86dfdSMatthias Ringwald #ifndef PRINTF_BUFFER_SIZE 104*7dc86dfdSMatthias Ringwald #define PRINTF_BUFFER_SIZE 128 105*7dc86dfdSMatthias Ringwald #endif 106*7dc86dfdSMatthias Ringwald 107*7dc86dfdSMatthias Ringwald #if PRINTF_USE_SEGGER_RTT_FORMATTING // Use SEGGER RTT formatting implementation 108*7dc86dfdSMatthias Ringwald /********************************************************************* 109*7dc86dfdSMatthias Ringwald * 110*7dc86dfdSMatthias Ringwald * Function prototypes 111*7dc86dfdSMatthias Ringwald * 112*7dc86dfdSMatthias Ringwald ********************************************************************** 113*7dc86dfdSMatthias Ringwald */ 114*7dc86dfdSMatthias Ringwald int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList); 115*7dc86dfdSMatthias Ringwald 116*7dc86dfdSMatthias Ringwald /********************************************************************* 117*7dc86dfdSMatthias Ringwald * 118*7dc86dfdSMatthias Ringwald * Global functions, printf 119*7dc86dfdSMatthias Ringwald * 120*7dc86dfdSMatthias Ringwald ********************************************************************** 121*7dc86dfdSMatthias Ringwald */ 122*7dc86dfdSMatthias Ringwald /********************************************************************* 123*7dc86dfdSMatthias Ringwald * 124*7dc86dfdSMatthias Ringwald * printf() 125*7dc86dfdSMatthias Ringwald * 126*7dc86dfdSMatthias Ringwald * Function description 127*7dc86dfdSMatthias Ringwald * print a formatted string using RTT and SEGGER RTT formatting. 128*7dc86dfdSMatthias Ringwald */ 129*7dc86dfdSMatthias Ringwald int printf(const char *fmt,...) { 130*7dc86dfdSMatthias Ringwald int n; 131*7dc86dfdSMatthias Ringwald va_list args; 132*7dc86dfdSMatthias Ringwald 133*7dc86dfdSMatthias Ringwald va_start (args, fmt); 134*7dc86dfdSMatthias Ringwald n = SEGGER_RTT_vprintf(0, fmt, &args); 135*7dc86dfdSMatthias Ringwald va_end(args); 136*7dc86dfdSMatthias Ringwald return n; 137*7dc86dfdSMatthias Ringwald } 138*7dc86dfdSMatthias Ringwald 139*7dc86dfdSMatthias Ringwald #elif PRINTF_BUFFER_SIZE == 0 // Use standard library formatting with character-wise output 140*7dc86dfdSMatthias Ringwald 141*7dc86dfdSMatthias Ringwald /********************************************************************* 142*7dc86dfdSMatthias Ringwald * 143*7dc86dfdSMatthias Ringwald * Static functions 144*7dc86dfdSMatthias Ringwald * 145*7dc86dfdSMatthias Ringwald ********************************************************************** 146*7dc86dfdSMatthias Ringwald */ 147*7dc86dfdSMatthias Ringwald static int _putchar(int x, __printf_tag_ptr ctx) { 148*7dc86dfdSMatthias Ringwald (void)ctx; 149*7dc86dfdSMatthias Ringwald SEGGER_RTT_Write(0, (char *)&x, 1); 150*7dc86dfdSMatthias Ringwald return x; 151*7dc86dfdSMatthias Ringwald } 152*7dc86dfdSMatthias Ringwald 153*7dc86dfdSMatthias Ringwald /********************************************************************* 154*7dc86dfdSMatthias Ringwald * 155*7dc86dfdSMatthias Ringwald * Global functions, printf 156*7dc86dfdSMatthias Ringwald * 157*7dc86dfdSMatthias Ringwald ********************************************************************** 158*7dc86dfdSMatthias Ringwald */ 159*7dc86dfdSMatthias Ringwald /********************************************************************* 160*7dc86dfdSMatthias Ringwald * 161*7dc86dfdSMatthias Ringwald * printf() 162*7dc86dfdSMatthias Ringwald * 163*7dc86dfdSMatthias Ringwald * Function description 164*7dc86dfdSMatthias Ringwald * print a formatted string character-wise, using RTT and standard 165*7dc86dfdSMatthias Ringwald * library formatting. 166*7dc86dfdSMatthias Ringwald */ 167*7dc86dfdSMatthias Ringwald int printf(const char *fmt, ...) { 168*7dc86dfdSMatthias Ringwald int n; 169*7dc86dfdSMatthias Ringwald va_list args; 170*7dc86dfdSMatthias Ringwald __printf_t iod; 171*7dc86dfdSMatthias Ringwald 172*7dc86dfdSMatthias Ringwald va_start(args, fmt); 173*7dc86dfdSMatthias Ringwald iod.string = 0; 174*7dc86dfdSMatthias Ringwald iod.maxchars = INT_MAX; 175*7dc86dfdSMatthias Ringwald iod.output_fn = _putchar; 176*7dc86dfdSMatthias Ringwald SEGGER_RTT_LOCK(); 177*7dc86dfdSMatthias Ringwald n = __vfprintf(&iod, fmt, args); 178*7dc86dfdSMatthias Ringwald SEGGER_RTT_UNLOCK(); 179*7dc86dfdSMatthias Ringwald va_end(args); 180*7dc86dfdSMatthias Ringwald return n; 181*7dc86dfdSMatthias Ringwald } 182*7dc86dfdSMatthias Ringwald 183*7dc86dfdSMatthias Ringwald #else // Use standard library formatting with static buffer 184*7dc86dfdSMatthias Ringwald 185*7dc86dfdSMatthias Ringwald /********************************************************************* 186*7dc86dfdSMatthias Ringwald * 187*7dc86dfdSMatthias Ringwald * Global functions, printf 188*7dc86dfdSMatthias Ringwald * 189*7dc86dfdSMatthias Ringwald ********************************************************************** 190*7dc86dfdSMatthias Ringwald */ 191*7dc86dfdSMatthias Ringwald /********************************************************************* 192*7dc86dfdSMatthias Ringwald * 193*7dc86dfdSMatthias Ringwald * printf() 194*7dc86dfdSMatthias Ringwald * 195*7dc86dfdSMatthias Ringwald * Function description 196*7dc86dfdSMatthias Ringwald * print a formatted string using RTT and standard library formatting. 197*7dc86dfdSMatthias Ringwald */ 198*7dc86dfdSMatthias Ringwald int printf(const char *fmt,...) { 199*7dc86dfdSMatthias Ringwald int n; 200*7dc86dfdSMatthias Ringwald char aBuffer[PRINTF_BUFFER_SIZE]; 201*7dc86dfdSMatthias Ringwald va_list args; 202*7dc86dfdSMatthias Ringwald 203*7dc86dfdSMatthias Ringwald va_start (args, fmt); 204*7dc86dfdSMatthias Ringwald n = vsnprintf(aBuffer, sizeof(aBuffer), fmt, args); 205*7dc86dfdSMatthias Ringwald if (n > (int)sizeof(aBuffer)) { 206*7dc86dfdSMatthias Ringwald SEGGER_RTT_Write(0, aBuffer, sizeof(aBuffer)); 207*7dc86dfdSMatthias Ringwald } else if (n > 0) { 208*7dc86dfdSMatthias Ringwald SEGGER_RTT_Write(0, aBuffer, n); 209*7dc86dfdSMatthias Ringwald } 210*7dc86dfdSMatthias Ringwald va_end(args); 211*7dc86dfdSMatthias Ringwald return n; 212*7dc86dfdSMatthias Ringwald } 213*7dc86dfdSMatthias Ringwald #endif 214*7dc86dfdSMatthias Ringwald 215*7dc86dfdSMatthias Ringwald /********************************************************************* 216*7dc86dfdSMatthias Ringwald * 217*7dc86dfdSMatthias Ringwald * Global functions 218*7dc86dfdSMatthias Ringwald * 219*7dc86dfdSMatthias Ringwald ********************************************************************** 220*7dc86dfdSMatthias Ringwald */ 221*7dc86dfdSMatthias Ringwald /********************************************************************* 222*7dc86dfdSMatthias Ringwald * 223*7dc86dfdSMatthias Ringwald * puts() 224*7dc86dfdSMatthias Ringwald * 225*7dc86dfdSMatthias Ringwald * Function description 226*7dc86dfdSMatthias Ringwald * print a string using RTT. 227*7dc86dfdSMatthias Ringwald */ 228*7dc86dfdSMatthias Ringwald int puts(const char *s) { 229*7dc86dfdSMatthias Ringwald return SEGGER_RTT_WriteString(0, s); 230*7dc86dfdSMatthias Ringwald } 231*7dc86dfdSMatthias Ringwald 232*7dc86dfdSMatthias Ringwald /********************************************************************* 233*7dc86dfdSMatthias Ringwald * 234*7dc86dfdSMatthias Ringwald * __putchar() 235*7dc86dfdSMatthias Ringwald * 236*7dc86dfdSMatthias Ringwald * Function description 237*7dc86dfdSMatthias Ringwald * Write one character via RTT. 238*7dc86dfdSMatthias Ringwald */ 239*7dc86dfdSMatthias Ringwald int __putchar(int x, __printf_tag_ptr ctx) { 240*7dc86dfdSMatthias Ringwald (void)ctx; 241*7dc86dfdSMatthias Ringwald SEGGER_RTT_Write(0, (char *)&x, 1); 242*7dc86dfdSMatthias Ringwald return x; 243*7dc86dfdSMatthias Ringwald } 244*7dc86dfdSMatthias Ringwald 245*7dc86dfdSMatthias Ringwald /********************************************************************* 246*7dc86dfdSMatthias Ringwald * 247*7dc86dfdSMatthias Ringwald * __getchar() 248*7dc86dfdSMatthias Ringwald * 249*7dc86dfdSMatthias Ringwald * Function description 250*7dc86dfdSMatthias Ringwald * Wait for and get a character via RTT. 251*7dc86dfdSMatthias Ringwald */ 252*7dc86dfdSMatthias Ringwald int __getchar() { 253*7dc86dfdSMatthias Ringwald return SEGGER_RTT_WaitKey(); 254*7dc86dfdSMatthias Ringwald } 255*7dc86dfdSMatthias Ringwald 256*7dc86dfdSMatthias Ringwald #endif 257*7dc86dfdSMatthias Ringwald /****** End Of File *************************************************/ 258