/******************************************************************************* * Trace Recorder Library for Tracealyzer v3.0.2 * Percepio AB, www.percepio.com * * trcHardwarePort.h * * The hardware abstraction layer for the trace recorder library. * * Terms of Use * This software (the "Tracealyzer Recorder Library") is the intellectual * property of Percepio AB and may not be sold or in other ways commercially * redistributed without explicit written permission by Percepio AB. * * Separate conditions applies for the SEGGER branded source code included. * * The recorder library is free for use together with Percepio products. * You may distribute the recorder library in its original form, but public * distribution of modified versions require approval by Percepio AB. * * Disclaimer * The trace tool and recorder library is being delivered to you AS IS and * Percepio AB makes no warranty as to its use or performance. Percepio AB does * not and cannot warrant the performance or results you may obtain by using the * software or documentation. Percepio AB make no warranties, express or * implied, as to noninfringement of third party rights, merchantability, or * fitness for any particular purpose. In no event will Percepio AB, its * technology partners, or distributors be liable to you for any consequential, * incidental or special damages, including any lost profits or lost savings, * even if a representative of Percepio AB has been advised of the possibility * of such damages, or for any claim by any third party. Some jurisdictions do * not allow the exclusion or limitation of incidental, consequential or special * damages, or the exclusion of implied warranties or limitations on how long an * implied warranty may last, so the above limitations may not apply to you. * * Tabs are used for indent in this file (1 tab = 4 spaces) * * Copyright Percepio AB, 2015. * www.percepio.com ******************************************************************************/ #ifndef TRC_HARDWARE_PORT_H #define TRC_HARDWARE_PORT_H #ifdef __cplusplus extern “C” { #endif #include /****************************************************************************** * Hardware ports * To get accurate timestamping, a hardware timer is necessary. Below are the * available ports. Some of these are "unofficial", meaning that * they have not yet been verified by Percepio but have been contributed by * external developers. They should work, otherwise let us know by emailing * support@percepio.com. Some work on any OS platform, while other are specific * to a certain operating system. *****************************************************************************/ /****** Port Name ***************************** Code */ #define TRC_PORT_APPLICATION_DEFINED -1 #define TRC_PORT_NOT_SET 0 #define TRC_PORT_ARM_Cortex_M 1 #define TRC_PORT_ARM_CORTEX_A9 2 #define TRC_PORT_Renesas_RX600 3 #define TRC_PORT_TEXAS_INSTRUMENTS_TMS570_RM48 4 #define TRC_PORT_MICROCHIP_PIC32_MX_MZ 5 /******************************************************************************* * * HWTC Macros - Hardware Timer/Counter Isolation Layer * * These two HWTC macros provides a hardware isolation layer representing a * generic hardware timer/counter used for the timestamping. * * HWTC_COUNT: The current value of the counter. This is expected to be reset * a each tick interrupt. Thus, when the tick handler starts, the counter has * already wrapped. * * HWTC_TYPE: Defines the type of timer/counter used for HWTC_COUNT: * * - FREE_RUNNING_32BIT_INCR: * Free-running 32-bit timer, counting upwards from 0 - > 0xFFFFFFFF * * - FREE_RUNNING_32BIT_DECR * Free-running 32-bit counter, counting downwards from 0xFFFFFFFF -> 0 * * - OS_TIMER_INCR * Interrupt timer, counts upwards from 0 until HWTC_PERIOD-1 * * - OS_TIMER_DECR * Interrupt timer, counts downwards from HWTC_PERIOD-1 until 0 * ******************************************************************************* * * IRQ_PRIORITY_ORDER * * Macro which should be defined as an integer of 0 or 1. * * It is only used only to sort and colorize the interrupts in priority order, * in case you record interrupts using the vTraceStoreISRBegin and * vTraceStoreISREnd routines. 1 indicates higher value is more important. * ******************************************************************************/ #define TRC_FREE_RUNNING_32BIT_INCR 1 #define TRC_FREE_RUNNING_32BIT_DECR 2 #define TRC_OS_TIMER_INCR 3 #define TRC_OS_TIMER_DECR 4 #if (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_ARM_Cortex_M) #define HWTC_TYPE TRC_OS_TIMER_DECR #define HWTC_COUNT (*((uint32_t*)0xE000E018)) /* SysTick counter */ #define IRQ_PRIORITY_ORDER 0 #elif (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_Renesas_RX600) #include "iodefine.h" #define HWTC_TYPE TRC_OS_TIMER_INCR #define HWTC_COUNT (CMT0.CMCNT) #define IRQ_PRIORITY_ORDER 1 #elif (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_MICROCHIP_PIC32_MX_MZ) #define HWTC_TYPE TRC_OS_TIMER_INCR #define HWTC_COUNT (TMR1) #define IRQ_PRIORITY_ORDER 0 #elif (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_TEXAS_INSTRUMENTS_TMS570_RM48) #define RTIFRC0 *((uint32_t *)0xFFFFFC10) #define RTICOMP0 *((uint32_t *)0xFFFFFC50) #define RTIUDCP0 *((uint32_t *)0xFFFFFC54) #define HWTC_TYPE TRC_OS_TIMER_INCR #define HWTC_COUNT (RTIFRC0 - (RTICOMP0 - RTIUDCP0)) #define IRQ_PRIORITY_ORDER 0 #elif (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_ARM_CORTEX_A9) /* INPUT YOUR PERIPHERAL BASE ADDRESS HERE */ #define CA9_MPCORE_PERIPHERAL_BASE_ADDRESS 0xSOMETHING #define CA9_MPCORE_PRIVATE_MEMORY_OFFSET 0x0600 #define CA9_MPCORE_PRIVCTR_PERIOD_REG (*(volatile uint32_t*)(CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x00)) #define CA9_MPCORE_PRIVCTR_COUNTER_REG (*(volatile uint32_t*)(CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x04)) #define CA9_MPCORE_PRIVCTR_CONTROL_REG (*(volatile uint32_t*)(CA9_MPCORE_PERIPHERAL_BASE_ADDRESS + CA9_MPCORE_PRIVATE_MEMORY_OFFSET + 0x08)) #define CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_MASK 0x0000FF00 #define CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_SHIFT 8 #define CA9_MPCORE_PRIVCTR_PRESCALER (((CA9_MPCORE_PRIVCTR_CONTROL_REG & CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_MASK) >> CA9_MPCORE_PRIVCTR_CONTROL_PRESCALER_SHIFT) + 1) #define HWTC_TYPE TRC_OS_TIMER_DECR #define HWTC_COUNT CA9_MPCORE_PRIVCTR_COUNTER_REG #define IRQ_PRIORITY_ORDER 0 #elif (TRC_RECORDER_HARDWARE_PORT == TRC_PORT_APPLICATION_DEFINED) #if !( defined (HWTC_TYPE) && defined (HWTC_COUNT) && defined (IRQ_PRIORITY_ORDER)) #error RECORDER_HARDWARE_PORT is PORT_APPLICATION_DEFINED but not all of the necessary constants have been defined. #endif #elif (TRC_RECORDER_HARDWARE_PORT != TRC_PORT_NOT_SET) #error "RECORDER_HARDWARE_PORT had unsupported value!" #define TRC_RECORDER_HARDWARE_PORT PORT_NOT_SET #endif #if (TRC_RECORDER_HARDWARE_PORT != TRC_PORT_NOT_SET) #ifndef HWTC_COUNT #error "HWTC_COUNT is not set!" #endif #ifndef HWTC_TYPE #error "HWTC_TYPE is not set!" #endif #ifndef IRQ_PRIORITY_ORDER #error "IRQ_PRIORITY_ORDER is not set!" #elif (IRQ_PRIORITY_ORDER != 0) && (IRQ_PRIORITY_ORDER != 1) #error "IRQ_PRIORITY_ORDER has bad value!" #endif #endif #ifdef __cplusplus } #endif #endif /* TRC_HARDWARE_PORT_H */