/* * Trace Recorder for Tracealyzer v4.6.0 * Copyright 2021 Percepio AB * www.percepio.com * * SPDX-License-Identifier: Apache-2.0 * * Supporting functions for trace streaming, used by the "stream ports" * for reading and writing data to the interface. */ #include #include #if ( TRC_USE_TRACEALYZER_RECORDER == 1 ) #if ( TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING ) typedef struct TraceStreamPortXS { #if ( TRC_USE_INTERNAL_BUFFER == 1 ) uint8_t uiBufferInternal[ TRC_STREAM_PORT_INTERNAL_BUFFER_SIZE ]; #endif uint8_t uiBuffer[ 4 ]; } TraceStreamPortXS_t; static TraceStreamPortXS_t * pxStreamPortXS; traceResult xTraceStreamPortInitialize( TraceStreamPortBuffer_t * pxBuffer ) { TRC_ASSERT_EQUAL_SIZE( TraceStreamPortBuffer_t, TraceStreamPortXS_t ); if( pxBuffer == 0 ) { return TRC_FAIL; } pxStreamPortXS = ( TraceStreamPortXS_t * ) pxBuffer; #if ( TRC_USE_INTERNAL_BUFFER == 1 ) return xTraceInternalEventBufferInitialize( pxStreamPortXS->uiBufferInternal, sizeof( pxStreamPortXS->uiBufferInternal ) ); #else return TRC_SUCCESS; #endif } traceResult xTraceStreamPortOnBegin( void ) { return TRC_SUCCESS; } traceResult xTraceStreamPortOnEnd( void ) { return TRC_SUCCESS; } traceResult xTraceStreamPortAllocate( uint32_t uiSize, void ** ppvData ) { ( void ) uiSize; return xTraceStaticBufferGet( ppvData ); } traceResult xTraceStreamPortCommit( void * pvData, uint32_t uiSize, int32_t * piBytesCommitted ) { if( pvData == 0 ) { return TRC_FAIL; } #if ( TRC_USE_INTERNAL_BUFFER == 1 ) /* Push to internal buffer. It will call on xTraceStreamPortWriteData() periodically. */ return xTraceInternalEventBufferPush( pvData, uiSize, piBytesCommitted ); #else /* Write directly to file */ return xTraceStreamPortWriteData( pvData, uiSize, piBytesCommitted ); #endif } traceResult xTraceStreamPortWriteData( void * pvData, uint32_t uiSize, int32_t * piBytesWritten ) { /* xscope_bytes is supposed to be thread safe, so we do not bother with any * critical sections here. */ xscope_bytes( 0, uiSize, ( unsigned char * ) pvData ); if( piBytesWritten != 0 ) { /* Since xScope always write all bytes (not all might be received) we flag this as * a full write */ *piBytesWritten = ( int32_t ) uiSize; } return TRC_SUCCESS; } traceResult xTraceStreamPortReadData( void * pvData, uint32_t uiSize, int32_t * piBytesRead ) { return TRC_SUCCESS; } #endif /* (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) */ #endif /* (TRC_USE_TRACEALYZER_RECORDER == 1) */