xref: /btstack/3rd-party/segger-rtt/SEGGER_RTT_Syscalls_SES.c (revision 7dc86dfd3569d69491d87d64749fd45afb46c67a)
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