1 /********************************************************************* 2 * SEGGER Microcontroller GmbH * 3 * The Embedded Experts * 4 ********************************************************************** 5 * * 6 * (c) 1995 - 2021 SEGGER Microcontroller GmbH * 7 * * 8 * www.segger.com Support: support@segger.com * 9 * * 10 ********************************************************************** 11 * * 12 * SEGGER SystemView * Real-time application analysis * 13 * * 14 ********************************************************************** 15 * * 16 * All rights reserved. * 17 * * 18 * SEGGER strongly recommends to not make any changes * 19 * to or modify the source code of this software in order to stay * 20 * compatible with the SystemView and RTT protocol, and J-Link. * 21 * * 22 * Redistribution and use in source and binary forms, with or * 23 * without modification, are permitted provided that the following * 24 * condition is met: * 25 * * 26 * o Redistributions of source code must retain the above copyright * 27 * notice, this condition and the following disclaimer. * 28 * * 29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * 30 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * 31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * 32 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * 33 * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * 34 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * 35 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * 36 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * 37 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * 38 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * 39 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * 40 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * 41 * DAMAGE. * 42 * * 43 ********************************************************************** 44 * * 45 * SystemView version: 3.30 * 46 * * 47 ********************************************************************** 48 ---------------------------------------------------------------------- 49 File : SEGGER.h 50 Purpose : Global types etc & general purpose utility functions 51 Revision: $Rev: 18102 $ 52 ---------------------------END-OF-HEADER------------------------------ 53 */ 54 55 #ifndef SEGGER_H // Guard against multiple inclusion 56 #define SEGGER_H 57 58 #include <stdarg.h> // For va_list. 59 #include "Global.h" // Type definitions: U8, U16, U32, I8, I16, I32 60 61 #if defined(__cplusplus) 62 extern "C" { /* Make sure we have C-declarations in C++ programs */ 63 #endif 64 65 /********************************************************************* 66 * 67 * Keywords/specifiers 68 * 69 ********************************************************************** 70 */ 71 72 #ifndef INLINE 73 #if (defined(__ICCARM__) || defined(__RX) || defined(__ICCRX__)) 74 // 75 // Other known compilers. 76 // 77 #define INLINE inline 78 #else 79 #if (defined(_WIN32) && !defined(__clang__)) 80 // 81 // Microsoft VC6 and newer. 82 // Force inlining without cost checking. 83 // 84 #define INLINE __forceinline 85 #elif defined(__GNUC__) || defined(__clang__) 86 // 87 // Force inlining with GCC + clang 88 // 89 #define INLINE inline __attribute__((always_inline)) 90 #elif (defined(__CC_ARM)) 91 // 92 // Force inlining with ARMCC (Keil) 93 // 94 #define INLINE __inline 95 #else 96 // 97 // Unknown compilers. 98 // 99 #define INLINE 100 #endif 101 #endif 102 #endif 103 104 /********************************************************************* 105 * 106 * Function-like macros 107 * 108 ********************************************************************** 109 */ 110 111 #define SEGGER_COUNTOF(a) (sizeof((a))/sizeof((a)[0])) 112 #define SEGGER_MIN(a,b) (((a) < (b)) ? (a) : (b)) 113 #define SEGGER_MAX(a,b) (((a) > (b)) ? (a) : (b)) 114 115 #ifndef SEGGER_USE_PARA // Some compiler complain about unused parameters. 116 #define SEGGER_USE_PARA(Para) (void)Para // This works for most compilers. 117 #endif 118 119 #define SEGGER_ADDR2PTR(Type, Addr) (/*lint -e(923) -e(9078)*/((Type*)((PTR_ADDR)(Addr)))) // Allow cast from address to pointer. 120 #define SEGGER_PTR2ADDR(p) (/*lint -e(923) -e(9078)*/((PTR_ADDR)(p))) // Allow cast from pointer to address. 121 #define SEGGER_PTR2PTR(Type, p) (/*lint -e(740) -e(826) -e(9079) -e(9087)*/((Type*)(p))) // Allow cast from one pointer type to another (ignore different size). 122 #define SEGGER_PTR_DISTANCE(p0, p1) (SEGGER_PTR2ADDR(p0) - SEGGER_PTR2ADDR(p1)) 123 124 /********************************************************************* 125 * 126 * Defines 127 * 128 ********************************************************************** 129 */ 130 131 #define SEGGER_PRINTF_FLAG_ADJLEFT (1 << 0) 132 #define SEGGER_PRINTF_FLAG_SIGNFORCE (1 << 1) 133 #define SEGGER_PRINTF_FLAG_SIGNSPACE (1 << 2) 134 #define SEGGER_PRINTF_FLAG_PRECEED (1 << 3) 135 #define SEGGER_PRINTF_FLAG_ZEROPAD (1 << 4) 136 #define SEGGER_PRINTF_FLAG_NEGATIVE (1 << 5) 137 138 /********************************************************************* 139 * 140 * Types 141 * 142 ********************************************************************** 143 */ 144 145 typedef struct { 146 char* pBuffer; 147 int BufferSize; 148 int Cnt; 149 } SEGGER_BUFFER_DESC; 150 151 typedef struct { 152 unsigned int CacheLineSize; // 0: No Cache. Most Systems such as ARM9 use a 32 bytes cache line size. 153 void (*pfDMB) (void); // Optional DMB function for Data Memory Barrier to make sure all memory operations are completed. 154 void (*pfClean) (void *p, unsigned long NumBytes); // Optional clean function for cached memory. 155 void (*pfInvalidate)(void *p, unsigned long NumBytes); // Optional invalidate function for cached memory. 156 } SEGGER_CACHE_CONFIG; 157 158 typedef struct SEGGER_SNPRINTF_CONTEXT_struct SEGGER_SNPRINTF_CONTEXT; 159 160 struct SEGGER_SNPRINTF_CONTEXT_struct { 161 void* pContext; // Application specific context. 162 SEGGER_BUFFER_DESC* pBufferDesc; // Buffer descriptor to use for output. 163 void (*pfFlush)(SEGGER_SNPRINTF_CONTEXT* pContext); // Callback executed once the buffer is full. Callback decides if the buffer gets cleared to store more or not. 164 }; 165 166 typedef struct { 167 void (*pfStoreChar) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, char c); 168 int (*pfPrintUnsigned) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, U32 v, unsigned Base, char Flags, int Width, int Precision); 169 int (*pfPrintInt) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, I32 v, unsigned Base, char Flags, int Width, int Precision); 170 } SEGGER_PRINTF_API; 171 172 typedef void (*SEGGER_pFormatter)(SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, const SEGGER_PRINTF_API* pApi, va_list* pParamList, char Lead, int Width, int Precision); 173 174 typedef struct SEGGER_PRINTF_FORMATTER { 175 struct SEGGER_PRINTF_FORMATTER* pNext; // Pointer to next formatter. 176 SEGGER_pFormatter pfFormatter; // Formatter function. 177 char Specifier; // Format specifier. 178 } SEGGER_PRINTF_FORMATTER; 179 180 typedef struct { 181 U32 (*pfGetHPTimestamp)(void); // Mandatory, pfGetHPTimestamp 182 int (*pfGetUID) (U8 abUID[16]); // Optional, pfGetUID 183 } SEGGER_BSP_API; 184 185 /********************************************************************* 186 * 187 * Utility functions 188 * 189 ********************************************************************** 190 */ 191 192 // 193 // Memory operations. 194 // 195 void SEGGER_ARM_memcpy(void* pDest, const void* pSrc, int NumBytes); 196 void SEGGER_memcpy (void* pDest, const void* pSrc, unsigned NumBytes); 197 void SEGGER_memxor (void* pDest, const void* pSrc, unsigned NumBytes); 198 199 // 200 // String functions. 201 // 202 int SEGGER_atoi (const char* s); 203 int SEGGER_isalnum (int c); 204 int SEGGER_isalpha (int c); 205 unsigned SEGGER_strlen (const char* s); 206 int SEGGER_tolower (int c); 207 int SEGGER_strcasecmp (const char* sText1, const char* sText2); 208 int SEGGER_strncasecmp(const char *sText1, const char *sText2, unsigned Count); 209 210 // 211 // Buffer/printf related. 212 // 213 void SEGGER_StoreChar (SEGGER_BUFFER_DESC* pBufferDesc, char c); 214 void SEGGER_PrintUnsigned(SEGGER_BUFFER_DESC* pBufferDesc, U32 v, unsigned Base, int Precision); 215 void SEGGER_PrintInt (SEGGER_BUFFER_DESC* pBufferDesc, I32 v, unsigned Base, int Precision); 216 int SEGGER_snprintf (char* pBuffer, int BufferSize, const char* sFormat, ...); 217 int SEGGER_vsnprintf (char* pBuffer, int BufferSize, const char* sFormat, va_list ParamList); 218 int SEGGER_vsnprintfEx (SEGGER_SNPRINTF_CONTEXT* pContext, const char* sFormat, va_list ParamList); 219 220 int SEGGER_PRINTF_AddFormatter (SEGGER_PRINTF_FORMATTER* pFormatter, SEGGER_pFormatter pfFormatter, char c); 221 void SEGGER_PRINTF_AddDoubleFormatter (void); 222 void SEGGER_PRINTF_AddIPFormatter (void); 223 void SEGGER_PRINTF_AddBLUEFormatter (void); 224 void SEGGER_PRINTF_AddCONNECTFormatter(void); 225 void SEGGER_PRINTF_AddSSLFormatter (void); 226 void SEGGER_PRINTF_AddSSHFormatter (void); 227 void SEGGER_PRINTF_AddHTMLFormatter (void); 228 229 // 230 // BSP abstraction API. 231 // 232 int SEGGER_BSP_GetUID (U8 abUID[16]); 233 int SEGGER_BSP_GetUID32(U32* pUID); 234 void SEGGER_BSP_SetAPI (const SEGGER_BSP_API* pAPI); 235 void SEGGER_BSP_SeedUID (void); 236 237 // 238 // Other API. 239 // 240 void SEGGER_VERSION_GetString(char acText[8], unsigned Version); 241 242 #if defined(__cplusplus) 243 } /* Make sure we have C-declarations in C++ programs */ 244 #endif 245 246 #endif // Avoid multiple inclusion 247 248 /*************************** End of file ****************************/ 249