Mercurial > ecos-v2_0-branch
diff packages/hal/arm/edb7xxx/current/src/edb7xxx_misc.c @ 115:6ed91473a1cd ecos-sw-2000-08-21
Merge from eCos master repository on 2000-08-21-22:40:54-BST
| author | jlarmour |
|---|---|
| date | Fri, 25 Aug 2000 17:32:38 +0000 |
| parents | 84e4bde58b26 |
| children | f935b880e96c |
line wrap: on
line diff
--- a/packages/hal/arm/edb7xxx/current/src/edb7xxx_misc.c +++ b/packages/hal/arm/edb7xxx/current/src/edb7xxx_misc.c @@ -78,6 +78,7 @@ static cyg_handle_t batlow_interrupt_ha #endif static cyg_uint32 _period; +void dram_delay_loop(void); // Use Timer/Counter #2 for system clock @@ -135,11 +136,7 @@ void hal_clock_reset(cyg_uint32 vector, #ifdef CYGHWR_HAL_ARM_EDB7XXX_SOFTWARE_DRAM_REFRESH do_DRAM_refresh(); #else - // Temporary fix for DRAM starvation problem - if (CYGHWR_HAL_ARM_EDB7XXX_PROCESSOR_CLOCK > 37000) { - int i; - for (i = 0; i < (CYGHWR_HAL_ARM_EDB7XXX_PROCESSOR_CLOCK*2)/24; i++) ; // approx 300 us - } + dram_delay_loop(); #endif #endif } @@ -156,6 +153,29 @@ void hal_clock_read(cyg_uint32 *pvalue) *pvalue = (cyg_uint32)(_period - clock_val); // 'clock_val' counts down and wraps } +// Delay for some number of useconds. Assume that the system clock +// has been set up to run at 512KHz (default). +void hal_delay_us(int us) +{ + volatile cyg_int32 *tc2d = (volatile cyg_int32 *)TC2D; + cyg_int32 val, prev; + while (us >= 2) { + prev = *tc2d & 0x0000FFFF; // Register has only 16 bits + if (prev & 0x00008000) prev |= 0xFFFF8000; // Extend sign bit + while (true) { + val = *tc2d & 0x0000FFFF; // Register has only 16 bits + if (val & 0x00008000) { + val |= 0xFFFF8000; // Extend sign bit + *tc2d = _period; // Need to reset counter + } + if (val != prev) { + break; // At least 2us have passed + } + } + us -= 2; + } +} + void dram_delay_loop(void) { @@ -394,6 +414,9 @@ void hal_hardware_init(void) cyg_drv_interrupt_unmask(CYGNUM_HAL_INTERRUPT_BLINT); #endif + // Initialize real-time clock (for delays, etc, even if kernel doesn't use it) + hal_clock_initialize(CYGNUM_HAL_RTC_PERIOD); + // Set up eCos/ROM interfaces hal_if_init(); }
