diff packages/hal/sh/arch/current/src/hal_misc.c @ 1423:440ddbf97b39

2003-09-21 Jonathan Larmour <jifl@eCosCentric.com> * cdl/hal_sh.cdl: CYGHWR_HAL_SH_FPU_REGS is only needed if there's an FPU. * include/hal_var_bank.h (HAL_THREAD_INIT_CONTEXT_FPU): Use FPSCR init value from HAL register definitions. 2003-09-19 John Dallaway <jld@ecoscentric.com> * cdl/hal_sh.cdl: Specify default CDL values for sh4_202_md target. 2003-09-11 Nick Garnett <nickg@ecoscentric.com> * include/hal_var_bank.h (HAL_THREAD_INIT_CONTEXT_FPU): Changed initial value of fpscr to do round-to-nearest rather than round-to-zero. 2003-09-08 Nick Garnett <nickg@ecoscentric.com> * src/vectors.S (cyg_hal_default_exception_vsr): Added code to switch to interrupt stack when fielding exceptions from RedBoot or some other ROM monitor. Without this we get potential stack overflows when debugging via the network. 2003-09-05 Nick Garnett <nickg@ecoscentric.com> * include/hal_arch.h: * include/hal_var_bank.h: * include/hal_var_bank.inc: * src/context.S: Added support for floating point state save and restore and GDB * src/hal_misc.c (hal_delay_us): Fixed implementation of this routine so that it actually works. * src/hal_syscall.c: Added support for all supportable syscalls. * src/sh_stub.c: Added check in __is_bsp_syscall() for trap 34 traps using the TRA register. * src/vectors.S: Set startup stack size to the same as the interrupt stack size. In some configurations of RedBoot the previous value was too small. * include/sh_stub.h: Fixed HAL_STUB_PLATFORM_STUBS_FIXUP() to only rewind for a breakpoint. Traps are not rewound. * cdl/hal_sh.cdl: Added option for SH architecture FP register count.
author nickg
date Fri, 05 Dec 2003 17:06:23 +0000
parents d2c90368aeef
children 74dbf4c3f2e1
line wrap: on
line diff
--- a/packages/hal/sh/arch/current/src/hal_misc.c
+++ b/packages/hal/sh/arch/current/src/hal_misc.c
@@ -9,6 +9,7 @@
 // -------------------------------------------
 // This file is part of eCos, the Embedded Configurable Operating System.
 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+// Copyright (C) 2003 Nick Garnett 
 //
 // eCos is free software; you can redistribute it and/or modify it under
 // the terms of the GNU General Public License as published by the Free
@@ -214,20 +215,32 @@ hal_delay_us(int usecs)
     volatile unsigned char *tstr = (volatile unsigned char *)CYGARC_REG_TSTR;
     volatile unsigned long *tcnt = (volatile unsigned long *)CYGARC_REG_TCNT1;
     volatile unsigned long *tcor = (volatile unsigned long *)CYGARC_REG_TCOR1;
-    unsigned long clocks_per_us = (CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED+(CYGHWR_HAL_SH_TMU_PRESCALE_0-1))/CYGHWR_HAL_SH_TMU_PRESCALE_0;  // Rounded up
-    int diff, diff2;
-    cyg_uint32 val1, val2;
+    volatile unsigned short *tcr = (volatile unsigned short *)CYGARC_REG_TCR1;
+    unsigned long clocks_per_us = (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/1000000) +
+                                    (CYGHWR_HAL_SH_TMU_PRESCALE_0-1))               /
+                                   CYGHWR_HAL_SH_TMU_PRESCALE_0);
+    volatile int diff, diff2;
+    volatile cyg_uint32 val1, val2;
 
+    *tcr = (( 4==CYGHWR_HAL_SH_TMU_PRESCALE_0) ? CYGARC_REG_TCR_TPSC_4 :
+            (16==CYGHWR_HAL_SH_TMU_PRESCALE_0) ? CYGARC_REG_TCR_TPSC_16:
+            (64==CYGHWR_HAL_SH_TMU_PRESCALE_0) ? CYGARC_REG_TCR_TPSC_64:
+                                                 CYGARC_REG_TCR_TPSC_256);
+
+    *tcnt = 0x0FFFFFFF;
+    *tcor = 0x0FFFFFFF;
+    
     _tstr = *tstr;
     *tstr |= CYGARC_REG_TSTR_STR1;  // Enable channel 1
     while (usecs-- > 0) {
         diff = 0;
+        val1 = *tcnt;
         while (diff < clocks_per_us) {
-            val1 = *tcnt;
             while ((val2 = *tcnt) == val1) ;
-            diff2 = val2 - val1;
+            diff2 = val1 - val2;
             if (diff2 < 0) diff2 += *tcor;
             diff += diff2;
+            val1 = val2;
         }
     }
     *tstr = _tstr;                  // Restore timer to previous state