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 - 2017 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.h 56*7dc86dfdSMatthias Ringwald Purpose : Implementation of SEGGER real-time transfer which allows 57*7dc86dfdSMatthias Ringwald real-time communication on targets which support debugger 58*7dc86dfdSMatthias Ringwald memory accesses while the CPU is running. 59*7dc86dfdSMatthias Ringwald Revision: $Rev: 6849 $ 60*7dc86dfdSMatthias Ringwald ---------------------------------------------------------------------- 61*7dc86dfdSMatthias Ringwald */ 62*7dc86dfdSMatthias Ringwald 63*7dc86dfdSMatthias Ringwald #ifndef SEGGER_RTT_H 64*7dc86dfdSMatthias Ringwald #define SEGGER_RTT_H 65*7dc86dfdSMatthias Ringwald 66*7dc86dfdSMatthias Ringwald #include "SEGGER_RTT_Conf.h" 67*7dc86dfdSMatthias Ringwald 68*7dc86dfdSMatthias Ringwald /********************************************************************* 69*7dc86dfdSMatthias Ringwald * 70*7dc86dfdSMatthias Ringwald * Defines, fixed 71*7dc86dfdSMatthias Ringwald * 72*7dc86dfdSMatthias Ringwald ********************************************************************** 73*7dc86dfdSMatthias Ringwald */ 74*7dc86dfdSMatthias Ringwald 75*7dc86dfdSMatthias Ringwald /********************************************************************* 76*7dc86dfdSMatthias Ringwald * 77*7dc86dfdSMatthias Ringwald * Types 78*7dc86dfdSMatthias Ringwald * 79*7dc86dfdSMatthias Ringwald ********************************************************************** 80*7dc86dfdSMatthias Ringwald */ 81*7dc86dfdSMatthias Ringwald 82*7dc86dfdSMatthias Ringwald // 83*7dc86dfdSMatthias Ringwald // Description for a circular buffer (also called "ring buffer") 84*7dc86dfdSMatthias Ringwald // which is used as up-buffer (T->H) 85*7dc86dfdSMatthias Ringwald // 86*7dc86dfdSMatthias Ringwald typedef struct { 87*7dc86dfdSMatthias Ringwald const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" 88*7dc86dfdSMatthias Ringwald char* pBuffer; // Pointer to start of buffer 89*7dc86dfdSMatthias Ringwald unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. 90*7dc86dfdSMatthias Ringwald unsigned WrOff; // Position of next item to be written by either target. 91*7dc86dfdSMatthias Ringwald volatile unsigned RdOff; // Position of next item to be read by host. Must be volatile since it may be modified by host. 92*7dc86dfdSMatthias Ringwald unsigned Flags; // Contains configuration flags 93*7dc86dfdSMatthias Ringwald } SEGGER_RTT_BUFFER_UP; 94*7dc86dfdSMatthias Ringwald 95*7dc86dfdSMatthias Ringwald // 96*7dc86dfdSMatthias Ringwald // Description for a circular buffer (also called "ring buffer") 97*7dc86dfdSMatthias Ringwald // which is used as down-buffer (H->T) 98*7dc86dfdSMatthias Ringwald // 99*7dc86dfdSMatthias Ringwald typedef struct { 100*7dc86dfdSMatthias Ringwald const char* sName; // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4" 101*7dc86dfdSMatthias Ringwald char* pBuffer; // Pointer to start of buffer 102*7dc86dfdSMatthias Ringwald unsigned SizeOfBuffer; // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty. 103*7dc86dfdSMatthias Ringwald volatile unsigned WrOff; // Position of next item to be written by host. Must be volatile since it may be modified by host. 104*7dc86dfdSMatthias Ringwald unsigned RdOff; // Position of next item to be read by target (down-buffer). 105*7dc86dfdSMatthias Ringwald unsigned Flags; // Contains configuration flags 106*7dc86dfdSMatthias Ringwald } SEGGER_RTT_BUFFER_DOWN; 107*7dc86dfdSMatthias Ringwald 108*7dc86dfdSMatthias Ringwald // 109*7dc86dfdSMatthias Ringwald // RTT control block which describes the number of buffers available 110*7dc86dfdSMatthias Ringwald // as well as the configuration for each buffer 111*7dc86dfdSMatthias Ringwald // 112*7dc86dfdSMatthias Ringwald // 113*7dc86dfdSMatthias Ringwald typedef struct { 114*7dc86dfdSMatthias Ringwald char acID[16]; // Initialized to "SEGGER RTT" 115*7dc86dfdSMatthias Ringwald int MaxNumUpBuffers; // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2) 116*7dc86dfdSMatthias Ringwald int MaxNumDownBuffers; // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2) 117*7dc86dfdSMatthias Ringwald SEGGER_RTT_BUFFER_UP aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS]; // Up buffers, transferring information up from target via debug probe to host 118*7dc86dfdSMatthias Ringwald SEGGER_RTT_BUFFER_DOWN aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS]; // Down buffers, transferring information down from host via debug probe to target 119*7dc86dfdSMatthias Ringwald } SEGGER_RTT_CB; 120*7dc86dfdSMatthias Ringwald 121*7dc86dfdSMatthias Ringwald /********************************************************************* 122*7dc86dfdSMatthias Ringwald * 123*7dc86dfdSMatthias Ringwald * Global data 124*7dc86dfdSMatthias Ringwald * 125*7dc86dfdSMatthias Ringwald ********************************************************************** 126*7dc86dfdSMatthias Ringwald */ 127*7dc86dfdSMatthias Ringwald extern SEGGER_RTT_CB _SEGGER_RTT; 128*7dc86dfdSMatthias Ringwald 129*7dc86dfdSMatthias Ringwald /********************************************************************* 130*7dc86dfdSMatthias Ringwald * 131*7dc86dfdSMatthias Ringwald * RTT API functions 132*7dc86dfdSMatthias Ringwald * 133*7dc86dfdSMatthias Ringwald ********************************************************************** 134*7dc86dfdSMatthias Ringwald */ 135*7dc86dfdSMatthias Ringwald #ifdef __cplusplus 136*7dc86dfdSMatthias Ringwald extern "C" { 137*7dc86dfdSMatthias Ringwald #endif 138*7dc86dfdSMatthias Ringwald int SEGGER_RTT_AllocDownBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); 139*7dc86dfdSMatthias Ringwald int SEGGER_RTT_AllocUpBuffer (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); 140*7dc86dfdSMatthias Ringwald int SEGGER_RTT_ConfigUpBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); 141*7dc86dfdSMatthias Ringwald int SEGGER_RTT_ConfigDownBuffer (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags); 142*7dc86dfdSMatthias Ringwald int SEGGER_RTT_GetKey (void); 143*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_HasData (unsigned BufferIndex); 144*7dc86dfdSMatthias Ringwald int SEGGER_RTT_HasKey (void); 145*7dc86dfdSMatthias Ringwald void SEGGER_RTT_Init (void); 146*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_Read (unsigned BufferIndex, void* pBuffer, unsigned BufferSize); 147*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_ReadNoLock (unsigned BufferIndex, void* pData, unsigned BufferSize); 148*7dc86dfdSMatthias Ringwald int SEGGER_RTT_SetNameDownBuffer (unsigned BufferIndex, const char* sName); 149*7dc86dfdSMatthias Ringwald int SEGGER_RTT_SetNameUpBuffer (unsigned BufferIndex, const char* sName); 150*7dc86dfdSMatthias Ringwald int SEGGER_RTT_SetFlagsDownBuffer (unsigned BufferIndex, unsigned Flags); 151*7dc86dfdSMatthias Ringwald int SEGGER_RTT_SetFlagsUpBuffer (unsigned BufferIndex, unsigned Flags); 152*7dc86dfdSMatthias Ringwald int SEGGER_RTT_WaitKey (void); 153*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_Write (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); 154*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_WriteNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); 155*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_WriteSkipNoLock (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); 156*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_WriteString (unsigned BufferIndex, const char* s); 157*7dc86dfdSMatthias Ringwald void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes); 158*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_PutChar (unsigned BufferIndex, char c); 159*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_PutCharSkip (unsigned BufferIndex, char c); 160*7dc86dfdSMatthias Ringwald unsigned SEGGER_RTT_PutCharSkipNoLock (unsigned BufferIndex, char c); 161*7dc86dfdSMatthias Ringwald // 162*7dc86dfdSMatthias Ringwald // Function macro for performance optimization 163*7dc86dfdSMatthias Ringwald // 164*7dc86dfdSMatthias Ringwald #define SEGGER_RTT_HASDATA(n) (_SEGGER_RTT.aDown[n].WrOff - _SEGGER_RTT.aDown[n].RdOff) 165*7dc86dfdSMatthias Ringwald 166*7dc86dfdSMatthias Ringwald /********************************************************************* 167*7dc86dfdSMatthias Ringwald * 168*7dc86dfdSMatthias Ringwald * RTT "Terminal" API functions 169*7dc86dfdSMatthias Ringwald * 170*7dc86dfdSMatthias Ringwald ********************************************************************** 171*7dc86dfdSMatthias Ringwald */ 172*7dc86dfdSMatthias Ringwald int SEGGER_RTT_SetTerminal (char TerminalId); 173*7dc86dfdSMatthias Ringwald int SEGGER_RTT_TerminalOut (char TerminalId, const char* s); 174*7dc86dfdSMatthias Ringwald 175*7dc86dfdSMatthias Ringwald /********************************************************************* 176*7dc86dfdSMatthias Ringwald * 177*7dc86dfdSMatthias Ringwald * RTT printf functions (require SEGGER_RTT_printf.c) 178*7dc86dfdSMatthias Ringwald * 179*7dc86dfdSMatthias Ringwald ********************************************************************** 180*7dc86dfdSMatthias Ringwald */ 181*7dc86dfdSMatthias Ringwald int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...); 182*7dc86dfdSMatthias Ringwald #ifdef __cplusplus 183*7dc86dfdSMatthias Ringwald } 184*7dc86dfdSMatthias Ringwald #endif 185*7dc86dfdSMatthias Ringwald 186*7dc86dfdSMatthias Ringwald /********************************************************************* 187*7dc86dfdSMatthias Ringwald * 188*7dc86dfdSMatthias Ringwald * Defines 189*7dc86dfdSMatthias Ringwald * 190*7dc86dfdSMatthias Ringwald ********************************************************************** 191*7dc86dfdSMatthias Ringwald */ 192*7dc86dfdSMatthias Ringwald 193*7dc86dfdSMatthias Ringwald // 194*7dc86dfdSMatthias Ringwald // Operating modes. Define behavior if buffer is full (not enough space for entire message) 195*7dc86dfdSMatthias Ringwald // 196*7dc86dfdSMatthias Ringwald #define SEGGER_RTT_MODE_NO_BLOCK_SKIP (0U) // Skip. Do not block, output nothing. (Default) 197*7dc86dfdSMatthias Ringwald #define SEGGER_RTT_MODE_NO_BLOCK_TRIM (1U) // Trim: Do not block, output as much as fits. 198*7dc86dfdSMatthias Ringwald #define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL (2U) // Block: Wait until there is space in the buffer. 199*7dc86dfdSMatthias Ringwald #define SEGGER_RTT_MODE_MASK (3U) 200*7dc86dfdSMatthias Ringwald 201*7dc86dfdSMatthias Ringwald // 202*7dc86dfdSMatthias Ringwald // Control sequences, based on ANSI. 203*7dc86dfdSMatthias Ringwald // Can be used to control color, and clear the screen 204*7dc86dfdSMatthias Ringwald // 205*7dc86dfdSMatthias Ringwald #define RTT_CTRL_RESET "[0m" // Reset to default colors 206*7dc86dfdSMatthias Ringwald #define RTT_CTRL_CLEAR "[2J" // Clear screen, reposition cursor to top left 207*7dc86dfdSMatthias Ringwald 208*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BLACK "[2;30m" 209*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_RED "[2;31m" 210*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_GREEN "[2;32m" 211*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_YELLOW "[2;33m" 212*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BLUE "[2;34m" 213*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_MAGENTA "[2;35m" 214*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_CYAN "[2;36m" 215*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_WHITE "[2;37m" 216*7dc86dfdSMatthias Ringwald 217*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_BLACK "[1;30m" 218*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_RED "[1;31m" 219*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_GREEN "[1;32m" 220*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_YELLOW "[1;33m" 221*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_BLUE "[1;34m" 222*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_MAGENTA "[1;35m" 223*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_CYAN "[1;36m" 224*7dc86dfdSMatthias Ringwald #define RTT_CTRL_TEXT_BRIGHT_WHITE "[1;37m" 225*7dc86dfdSMatthias Ringwald 226*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BLACK "[24;40m" 227*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_RED "[24;41m" 228*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_GREEN "[24;42m" 229*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_YELLOW "[24;43m" 230*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BLUE "[24;44m" 231*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_MAGENTA "[24;45m" 232*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_CYAN "[24;46m" 233*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_WHITE "[24;47m" 234*7dc86dfdSMatthias Ringwald 235*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_BLACK "[4;40m" 236*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_RED "[4;41m" 237*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_GREEN "[4;42m" 238*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_YELLOW "[4;43m" 239*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_BLUE "[4;44m" 240*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_MAGENTA "[4;45m" 241*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_CYAN "[4;46m" 242*7dc86dfdSMatthias Ringwald #define RTT_CTRL_BG_BRIGHT_WHITE "[4;47m" 243*7dc86dfdSMatthias Ringwald 244*7dc86dfdSMatthias Ringwald 245*7dc86dfdSMatthias Ringwald #endif 246*7dc86dfdSMatthias Ringwald 247*7dc86dfdSMatthias Ringwald /*************************** End of file ****************************/ 248