#include "trcRecorder.h" #if (TRC_USE_TRACEALYZER_RECORDER == 1) #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) static void itm_write_32(uint32_t data); volatile int32_t tz_host_command_bytes_to_read = 0; // This is set by the Tracealyzer host application (to the number of bytes written), after having written to tz_host_commands. Set to zero by the read function after the message in tz_host_commands has been read. volatile char tz_host_command_data[32]; /* This reads "command" data from a RAM buffer, written by a host macro in the debugger */ int32_t read_from_host(void* ptrData, uint32_t size, int32_t* ptrBytesRead) { if ( tz_host_command_bytes_to_read > 0) { int i; uint8_t * bytesBuffer = (uint8_t*) ptrData; if (ptrBytesRead != NULL) *ptrBytesRead = (int32_t)tz_host_command_bytes_to_read; if (tz_host_command_bytes_to_read != size) { return -1; } for (i=0; i < tz_host_command_bytes_to_read; i++) { bytesBuffer[i] = tz_host_command_data[i]; } tz_host_command_bytes_to_read = 0; } return 0; } static void itm_write_32(uint32_t data) { if ((CoreDebug->DEMCR & CoreDebug_DEMCR_TRCENA_Msk) && // Trace enabled (ITM->TCR & ITM_TCR_ITMENA_Msk) && // ITM enabled (ITM->TER & (1UL << TRC_CFG_ITM_PORT))) // ITM port enabled { while (ITM->PORT[TRC_CFG_ITM_PORT].u32 == 0); // Block until room in ITM FIFO - This stream port is always in "blocking mode", since intended for high-speed ITM! ITM->PORT[TRC_CFG_ITM_PORT].u32 = data; // Write the data } } /* This is assumed to execute from within the recorder, with interrupts disabled */ int32_t itm_write(void* ptrData, uint32_t size, int32_t* ptrBytesWritten) { uint32_t bytesWritten = 0; uint32_t* ptr32 = (uint32_t*)ptrData; if (size % 4 != 0) return -2; while(bytesWritten < size) { itm_write_32(*ptr32); ptr32++; bytesWritten += 4; } *ptrBytesWritten = bytesWritten; return 0; } #endif #endif