summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sh/gensh1/clock/delay.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/sh/gensh1/clock/delay.c')
-rw-r--r--c/src/lib/libbsp/sh/gensh1/clock/delay.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/sh/gensh1/clock/delay.c b/c/src/lib/libbsp/sh/gensh1/clock/delay.c
new file mode 100644
index 0000000000..085771f777
--- /dev/null
+++ b/c/src/lib/libbsp/sh/gensh1/clock/delay.c
@@ -0,0 +1,51 @@
+/*
+ * This routine is a simple spin delay
+ *
+ * Author: Ralf Corsepius (corsepiu@faw.uni-ulm.de)
+ *
+ * COPYRIGHT (c) 1999, Ralf Corsepius, Ulm, Germany
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *
+ * COPYRIGHT (c) 1989-1999.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * 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.h>
+
+extern uint32_t bsp_clicks_per_second;
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ *
+ * Since we don't have a real time clock, this is a very rough
+ * approximation, assuming that each cycle of the delay loop takes
+ * approx. 4 machine cycles.
+ *
+ * e.g.: clicks_per_second = 20MHz
+ * => 5e-8 secs per instruction
+ * => 4 * 5e-8 secs per delay loop
+ */
+
+void CPU_delay( uint32_t microseconds )
+{
+ register uint32_t clicks_per_usec = bsp_clicks_per_second / 1000000;
+ register uint32_t _delay = (microseconds) * (clicks_per_usec);
+
+ __asm__ volatile (
+"0: add #-4,%0\n\
+ nop\n\
+ cmp/pl %0\n\
+ bt 0b\n\
+ nop"
+ :: "r" (_delay) );
+}