mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-30 18:10:56 +00:00
249 lines
11 KiB
C
249 lines
11 KiB
C
/*********************************************************************
|
|
* SEGGER Microcontroller GmbH *
|
|
* The Embedded Experts *
|
|
**********************************************************************
|
|
* *
|
|
* (c) 1995 - 2019 SEGGER Microcontroller GmbH *
|
|
* *
|
|
* www.segger.com Support: support@segger.com *
|
|
* *
|
|
**********************************************************************
|
|
* *
|
|
* SEGGER SystemView * Real-time application analysis *
|
|
* *
|
|
**********************************************************************
|
|
* *
|
|
* All rights reserved. *
|
|
* *
|
|
* SEGGER strongly recommends to not make any changes *
|
|
* to or modify the source code of this software in order to stay *
|
|
* compatible with the SystemView and RTT protocol, and J-Link. *
|
|
* *
|
|
* Redistribution and use in source and binary forms, with or *
|
|
* without modification, are permitted provided that the following *
|
|
* condition is met: *
|
|
* *
|
|
* o Redistributions of source code must retain the above copyright *
|
|
* notice, this condition and the following disclaimer. *
|
|
* *
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
|
|
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
|
|
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
|
|
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
|
|
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
|
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
|
|
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
|
|
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
|
|
* DAMAGE. *
|
|
* *
|
|
**********************************************************************
|
|
* *
|
|
* SystemView version: 3.20 *
|
|
* *
|
|
**********************************************************************
|
|
----------------------------------------------------------------------
|
|
File : SEGGER.h
|
|
Purpose : Global types etc & general purpose utility functions
|
|
Revision: $Rev: 18102 $
|
|
---------------------------END-OF-HEADER------------------------------
|
|
*/
|
|
|
|
#ifndef SEGGER_H // Guard against multiple inclusion
|
|
#define SEGGER_H
|
|
|
|
#include <stdarg.h> // For va_list.
|
|
#include "Global.h" // Type definitions: U8, U16, U32, I8, I16, I32
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" { /* Make sure we have C-declarations in C++ programs */
|
|
#endif
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Keywords/specifiers
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#ifndef INLINE
|
|
#if (defined(__ICCARM__) || defined(__RX) || defined(__ICCRX__))
|
|
//
|
|
// Other known compilers.
|
|
//
|
|
#define INLINE inline
|
|
#else
|
|
#if (defined(_WIN32) && !defined(__clang__))
|
|
//
|
|
// Microsoft VC6 and newer.
|
|
// Force inlining without cost checking.
|
|
//
|
|
#define INLINE __forceinline
|
|
#elif defined(__GNUC__) || defined(__clang__)
|
|
//
|
|
// Force inlining with GCC + clang
|
|
//
|
|
#define INLINE inline __attribute__((always_inline))
|
|
#elif (defined(__CC_ARM))
|
|
//
|
|
// Force inlining with ARMCC (Keil)
|
|
//
|
|
#define INLINE __inline
|
|
#else
|
|
//
|
|
// Unknown compilers.
|
|
//
|
|
#define INLINE
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Function-like macros
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#define SEGGER_COUNTOF(a) (sizeof((a))/sizeof((a)[0]))
|
|
#define SEGGER_MIN(a,b) (((a) < (b)) ? (a) : (b))
|
|
#define SEGGER_MAX(a,b) (((a) > (b)) ? (a) : (b))
|
|
|
|
#ifndef SEGGER_USE_PARA // Some compiler complain about unused parameters.
|
|
#define SEGGER_USE_PARA(Para) (void)Para // This works for most compilers.
|
|
#endif
|
|
|
|
#define SEGGER_ADDR2PTR(Type, Addr) (/*lint -e(923) -e(9078)*/((Type*)((PTR_ADDR)(Addr)))) // Allow cast from address to pointer.
|
|
#define SEGGER_PTR2ADDR(p) (/*lint -e(923) -e(9078)*/((PTR_ADDR)(p))) // Allow cast from pointer to address.
|
|
#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).
|
|
#define SEGGER_PTR_DISTANCE(p0, p1) (SEGGER_PTR2ADDR(p0) - SEGGER_PTR2ADDR(p1))
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Defines
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
#define SEGGER_PRINTF_FLAG_ADJLEFT (1 << 0)
|
|
#define SEGGER_PRINTF_FLAG_SIGNFORCE (1 << 1)
|
|
#define SEGGER_PRINTF_FLAG_SIGNSPACE (1 << 2)
|
|
#define SEGGER_PRINTF_FLAG_PRECEED (1 << 3)
|
|
#define SEGGER_PRINTF_FLAG_ZEROPAD (1 << 4)
|
|
#define SEGGER_PRINTF_FLAG_NEGATIVE (1 << 5)
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Types
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
typedef struct {
|
|
char* pBuffer;
|
|
int BufferSize;
|
|
int Cnt;
|
|
} SEGGER_BUFFER_DESC;
|
|
|
|
typedef struct {
|
|
unsigned int CacheLineSize; // 0: No Cache. Most Systems such as ARM9 use a 32 bytes cache line size.
|
|
void (*pfDMB) (void); // Optional DMB function for Data Memory Barrier to make sure all memory operations are completed.
|
|
void (*pfClean) (void *p, unsigned long NumBytes); // Optional clean function for cached memory.
|
|
void (*pfInvalidate)(void *p, unsigned long NumBytes); // Optional invalidate function for cached memory.
|
|
} SEGGER_CACHE_CONFIG;
|
|
|
|
typedef struct SEGGER_SNPRINTF_CONTEXT_struct SEGGER_SNPRINTF_CONTEXT;
|
|
|
|
struct SEGGER_SNPRINTF_CONTEXT_struct {
|
|
void* pContext; // Application specific context.
|
|
SEGGER_BUFFER_DESC* pBufferDesc; // Buffer descriptor to use for output.
|
|
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.
|
|
};
|
|
|
|
typedef struct {
|
|
void (*pfStoreChar) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, char c);
|
|
int (*pfPrintUnsigned) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, U32 v, unsigned Base, char Flags, int Width, int Precision);
|
|
int (*pfPrintInt) (SEGGER_BUFFER_DESC* pBufferDesc, SEGGER_SNPRINTF_CONTEXT* pContext, I32 v, unsigned Base, char Flags, int Width, int Precision);
|
|
} SEGGER_PRINTF_API;
|
|
|
|
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);
|
|
|
|
typedef struct SEGGER_PRINTF_FORMATTER {
|
|
struct SEGGER_PRINTF_FORMATTER* pNext; // Pointer to next formatter.
|
|
SEGGER_pFormatter pfFormatter; // Formatter function.
|
|
char Specifier; // Format specifier.
|
|
} SEGGER_PRINTF_FORMATTER;
|
|
|
|
typedef struct {
|
|
U32 (*pfGetHPTimestamp)(void); // Mandatory, pfGetHPTimestamp
|
|
int (*pfGetUID) (U8 abUID[16]); // Optional, pfGetUID
|
|
} SEGGER_BSP_API;
|
|
|
|
/*********************************************************************
|
|
*
|
|
* Utility functions
|
|
*
|
|
**********************************************************************
|
|
*/
|
|
|
|
//
|
|
// Memory operations.
|
|
//
|
|
void SEGGER_ARM_memcpy(void* pDest, const void* pSrc, int NumBytes);
|
|
void SEGGER_memcpy (void* pDest, const void* pSrc, unsigned NumBytes);
|
|
void SEGGER_memxor (void* pDest, const void* pSrc, unsigned NumBytes);
|
|
|
|
//
|
|
// String functions.
|
|
//
|
|
int SEGGER_atoi (const char* s);
|
|
int SEGGER_isalnum (int c);
|
|
int SEGGER_isalpha (int c);
|
|
unsigned SEGGER_strlen (const char* s);
|
|
int SEGGER_tolower (int c);
|
|
int SEGGER_strcasecmp (const char* sText1, const char* sText2);
|
|
int SEGGER_strncasecmp(const char *sText1, const char *sText2, unsigned Count);
|
|
|
|
//
|
|
// Buffer/printf related.
|
|
//
|
|
void SEGGER_StoreChar (SEGGER_BUFFER_DESC* pBufferDesc, char c);
|
|
void SEGGER_PrintUnsigned(SEGGER_BUFFER_DESC* pBufferDesc, U32 v, unsigned Base, int Precision);
|
|
void SEGGER_PrintInt (SEGGER_BUFFER_DESC* pBufferDesc, I32 v, unsigned Base, int Precision);
|
|
int SEGGER_snprintf (char* pBuffer, int BufferSize, const char* sFormat, ...);
|
|
int SEGGER_vsnprintf (char* pBuffer, int BufferSize, const char* sFormat, va_list ParamList);
|
|
int SEGGER_vsnprintfEx (SEGGER_SNPRINTF_CONTEXT* pContext, const char* sFormat, va_list ParamList);
|
|
|
|
int SEGGER_PRINTF_AddFormatter (SEGGER_PRINTF_FORMATTER* pFormatter, SEGGER_pFormatter pfFormatter, char c);
|
|
void SEGGER_PRINTF_AddDoubleFormatter (void);
|
|
void SEGGER_PRINTF_AddIPFormatter (void);
|
|
void SEGGER_PRINTF_AddBLUEFormatter (void);
|
|
void SEGGER_PRINTF_AddCONNECTFormatter(void);
|
|
void SEGGER_PRINTF_AddSSLFormatter (void);
|
|
void SEGGER_PRINTF_AddSSHFormatter (void);
|
|
void SEGGER_PRINTF_AddHTMLFormatter (void);
|
|
|
|
//
|
|
// BSP abstraction API.
|
|
//
|
|
int SEGGER_BSP_GetUID (U8 abUID[16]);
|
|
int SEGGER_BSP_GetUID32(U32* pUID);
|
|
void SEGGER_BSP_SetAPI (const SEGGER_BSP_API* pAPI);
|
|
void SEGGER_BSP_SeedUID (void);
|
|
|
|
//
|
|
// Other API.
|
|
//
|
|
void SEGGER_VERSION_GetString(char acText[8], unsigned Version);
|
|
|
|
#if defined(__cplusplus)
|
|
} /* Make sure we have C-declarations in C++ programs */
|
|
#endif
|
|
|
|
#endif // Avoid multiple inclusion
|
|
|
|
/*************************** End of file ****************************/
|