summaryrefslogtreecommitdiff
path: root/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c')
-rw-r--r--c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c b/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c
new file mode 100644
index 0000000000..4549dae882
--- /dev/null
+++ b/c/src/lib/libbsp/arm/xm-tms570/startup/cpucounterread.c
@@ -0,0 +1,62 @@
+/*
+ * @file cpucounterread.c
+ *
+ * @author Miguel Masmano <mmasmano@fentiss.com>
+ *
+ * @copyright
+ * Copyright 2016 Fent Innovative Software Solutions (FENTISS).
+ * All rights reserved.
+ *
+ * Copyright 2017 embedded brains GmbH.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems/counter.h>
+
+#include <libcpu/arm-cp15.h>
+
+#include <bsp.h>
+#include <xm.h>
+
+#ifdef XM_TMS570_USE_PMU_FOR_CPU_COUNTER
+/* PMCCNTR */
+ARM_CP15_TEXT_SECTION static inline uint32_t
+arm_cp15_get_performance_monitors_cycle_count(void)
+{
+ ARM_SWITCH_REGISTERS;
+ uint32_t val;
+
+ __asm__ volatile (
+ ARM_SWITCH_TO_ARM
+ "mrc p15, 0, %[val], c9, c13, 0\n"
+ ARM_SWITCH_BACK
+ : [val] "=&r" (val) ARM_SWITCH_ADDITIONAL_OUTPUT
+ );
+
+ return val;
+}
+#endif
+
+CPU_Counter_ticks _CPU_Counter_read(void)
+{
+#ifdef XM_TMS570_USE_PMU_FOR_CPU_COUNTER
+ return arm_cp15_get_performance_monitors_cycle_count();
+#else
+ xmTime_t cTime;
+ XM_get_time(XM_HW_CLOCK, &cTime);
+
+ return (CPU_Counter_ticks)cTime;
+#endif
+}
+
+void xm_tms570_cpu_counter_initialize(void)
+{
+#ifdef XM_TMS570_USE_PMU_FOR_CPU_COUNTER
+ rtems_counter_initialize_converter(XM_TMS570_GCLK);
+#else
+ rtems_counter_initialize_converter(1000000);
+#endif
+}