changeset 1025:1ac1a62ca493

* src/at91_misc.c (hal_delay_us): Added calculation to better approximate the number of timer ticks for a given number of microseconds. This code also now adjust to the actual CPU clock speed on different platforms.
author nickg
date Thu, 15 May 2003 17:56:19 +0000
parents 7071bcbe4d30
children e4cc97a76353
files packages/hal/arm/at91/var/current/ChangeLog packages/hal/arm/at91/var/current/src/at91_misc.c
diffstat 2 files changed, 15 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/packages/hal/arm/at91/var/current/ChangeLog
+++ b/packages/hal/arm/at91/var/current/ChangeLog
@@ -1,3 +1,10 @@
+2003-05-15  Nick Garnett  <nickg@balti.calivar.com>
+
+	* src/at91_misc.c (hal_delay_us): Added calculation to better
+	approximate the number of timer ticks for a given number of
+	microseconds. This code also now adjust to the actual CPU clock
+	speed on different platforms.
+
 2003-05-12  Nick Garnett  <nickg@balti.calivar.com>
 
 	* src/at91_misc.c: Change definition of hal_IRQ_handler() to be
--- a/packages/hal/arm/at91/var/current/src/at91_misc.c
+++ b/packages/hal/arm/at91/var/current/src/at91_misc.c
@@ -124,20 +124,26 @@ void hal_clock_read(cyg_uint32 *pvalue)
 // -------------------------------------------------------------------------
 //
 // Delay for some number of micro-seconds
-//   Use timer #2 in 1MHz mode
+//   Use timer #2 in MCLOCK/32 mode.
 //
 void hal_delay_us(cyg_int32 usecs)
 {
     CYG_ADDRESS timer = AT91_TC+AT91_TC_TC2;
     cyg_uint32 stat;
+    cyg_uint64 ticks;
 
+    // Calculate how many timer ticks the required number of
+    // microseconds equate to. We do this calculation in 64 bit
+    // arithmetic to avoid overflow.
+    ticks = (((cyg_uint64)usecs) * ((cyg_uint64)CYGNUM_HAL_ARM_AT91_CLOCK_SPEED))/32000000LL;
+    
     // Disable counter
     HAL_WRITE_UINT32(timer+AT91_TC_CCR, AT91_TC_CCR_CLKDIS);
 
     // Set registers
     HAL_WRITE_UINT32(timer+AT91_TC_CMR, AT91_TC_CMR_CLKS_MCK32);  // 1MHz
     HAL_WRITE_UINT32(timer+AT91_TC_RA, 0);
-    HAL_WRITE_UINT32(timer+AT91_TC_RC, usecs);
+    HAL_WRITE_UINT32(timer+AT91_TC_RC, ticks);
 
     // Start timer
     HAL_WRITE_UINT32(timer+AT91_TC_CCR, AT91_TC_CCR_TRIG | AT91_TC_CCR_CLKEN);