Mercurial > ecos
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);
