Commit de9bd767 authored by Dean Camera's avatar Dean Camera

Correct UC3 global interrupt functions.

Replace all calls and references to _delay_ms() in the code with the architecture-agnostic Delay_MS() function.

Improve code generation for the Delay_MS() function on the AVR8 architecture when called with a constant input.
parent 70284d39
...@@ -109,7 +109,7 @@ int main(void) ...@@ -109,7 +109,7 @@ int main(void)
/* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */ /* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */
PORTF |= (1 << 4); PORTF |= (1 << 4);
_delay_ms(10); Delay_MS(10);
/* If the TCK pin is not jumpered to ground, start the user application instead */ /* If the TCK pin is not jumpered to ground, start the user application instead */
RunBootloader = (!(PINF & (1 << 4))); RunBootloader = (!(PINF & (1 << 4)));
......
...@@ -236,18 +236,28 @@ ...@@ -236,18 +236,28 @@
/** Function to perform a blocking delay for a specified number of milliseconds. The actual delay will be /** Function to perform a blocking delay for a specified number of milliseconds. The actual delay will be
* at a minimum the specified number of milliseconds, however due to loop overhead and internal calculations * at a minimum the specified number of milliseconds, however due to loop overhead and internal calculations
* may be slightly higher. * may be slightly higher.
*
* \param[in] Milliseconds Number of milliseconds to delay
*/ */
static inline void Delay_MS(uint8_t Milliseconds) static inline void Delay_MS(uint8_t Milliseconds)
{ {
#if (ARCH == ARCH_AVR8)
if (__builtin_constant_p(Milliseconds))
{
_delay_ms(Milliseconds);
}
else
{
while (Milliseconds--)
_delay_ms(1);
}
#elif (ARCH == ARCH_UC3)
while (Milliseconds--) while (Milliseconds--)
{ {
#if (ARCH == ARCH_AVR8)
_delay_ms(1);
#elif (ARCH == ARCH_UC3)
__builtin_mtsr(AVR32_COUNT, 0); __builtin_mtsr(AVR32_COUNT, 0);
while (__builtin_mfsr(AVR32_COUNT) < (F_CPU / 1000)); while (__builtin_mfsr(AVR32_COUNT) < (F_CPU / 1000));
#endif
} }
#endif
} }
#endif #endif
......
...@@ -79,17 +79,17 @@ ...@@ -79,17 +79,17 @@
* *
* // Turn on each of the four LEDs in turn * // Turn on each of the four LEDs in turn
* LEDs_SetAllLEDs(LEDS_LED1); * LEDs_SetAllLEDs(LEDS_LED1);
* _delay_ms(500); * Delay_MS(500);
* LEDs_SetAllLEDs(LEDS_LED1); * LEDs_SetAllLEDs(LEDS_LED1);
* _delay_ms(500); * Delay_MS(500);
* LEDs_SetAllLEDs(LEDS_LED1); * LEDs_SetAllLEDs(LEDS_LED1);
* _delay_ms(500); * Delay_MS(500);
* LEDs_SetAllLEDs(LEDS_LED1); * LEDs_SetAllLEDs(LEDS_LED1);
* _delay_ms(500); * Delay_MS(500);
* *
* // Turn on all LEDs * // Turn on all LEDs
* LEDs_SetAllLEDs(LEDS_ALL_LEDS); * LEDs_SetAllLEDs(LEDS_ALL_LEDS);
* _delay_ms(1000); * Delay_MS(1000);
* *
* // Turn on LED 1, turn off LED 2, leaving LEDs 3 and 4 in their current state * // Turn on LED 1, turn off LED 2, leaving LEDs 3 and 4 in their current state
* LEDs_ChangeLEDs((LEDS_LED1 | LEDS_LED2), LEDS_LED1); * LEDs_ChangeLEDs((LEDS_LED1 | LEDS_LED2), LEDS_LED1);
......
...@@ -273,7 +273,7 @@ static void USB_Host_ResetDevice(void) ...@@ -273,7 +273,7 @@ static void USB_Host_ResetDevice(void)
break; break;
} }
_delay_ms(1); Delay_MS(1);
} }
if (HSOFIEnabled) if (HSOFIEnabled)
......
...@@ -273,7 +273,7 @@ static void USB_Host_ResetDevice(void) ...@@ -273,7 +273,7 @@ static void USB_Host_ResetDevice(void)
break; break;
} }
_delay_ms(1); Delay_MS(1);
} }
if (HSOFIEnabled) if (HSOFIEnabled)
......
...@@ -87,14 +87,15 @@ ...@@ -87,14 +87,15 @@
static inline uint_reg_t USB_INT_GetGlobalEnableState(void) static inline uint_reg_t USB_INT_GetGlobalEnableState(void)
{ {
GCC_MEMORY_BARRIER(); GCC_MEMORY_BARRIER();
return (__builtin_mfsr(AVR32_SR) & AVR32_SR_GM); return __builtin_mfsr(AVR32_SR);
} }
static inline void USB_INT_SetGlobalEnableState(uint_reg_t GlobalIntState) ATTR_ALWAYS_INLINE; static inline void USB_INT_SetGlobalEnableState(uint_reg_t GlobalIntState) ATTR_ALWAYS_INLINE;
static inline void USB_INT_SetGlobalEnableState(uint_reg_t GlobalIntState) static inline void USB_INT_SetGlobalEnableState(uint_reg_t GlobalIntState)
{ {
GCC_MEMORY_BARRIER(); GCC_MEMORY_BARRIER();
__builtin_ssrf(AVR32_SR_GM_OFFSET, GlobalIntState); if (GlobalIntState & AVR32_SR_GM)
__builtin_ssrf(AVR32_SR_GM_OFFSET);
GCC_MEMORY_BARRIER(); GCC_MEMORY_BARRIER();
} }
......
...@@ -54,8 +54,7 @@ ...@@ -54,8 +54,7 @@
* cli(); * cli();
* *
* // Wait two seconds for the USB detachment to register on the host * // Wait two seconds for the USB detachment to register on the host
* for (uint8_t i = 0; i < 128; i++) * Delay_MS(2000);
* _delay_ms(16);
* *
* // Set the bootloader key to the magic value and force a reset * // Set the bootloader key to the magic value and force a reset
* Boot_Key = MAGIC_BOOT_KEY; * Boot_Key = MAGIC_BOOT_KEY;
......
...@@ -519,7 +519,7 @@ void ISPProtocol_SPIMulti(void) ...@@ -519,7 +519,7 @@ void ISPProtocol_SPIMulti(void)
void ISPProtocol_DelayMS(uint8_t DelayMS) void ISPProtocol_DelayMS(uint8_t DelayMS)
{ {
while (DelayMS-- && !(TimeoutExpired)) while (DelayMS-- && !(TimeoutExpired))
_delay_ms(1); Delay_MS(1);
} }
#endif #endif
...@@ -181,7 +181,7 @@ void SetupHardware(void) ...@@ -181,7 +181,7 @@ void SetupHardware(void)
/* Enable pull-up on the JTAG TDI pin so we can use it to select the mode */ /* Enable pull-up on the JTAG TDI pin so we can use it to select the mode */
PORTF |= (1 << 7); PORTF |= (1 << 7);
_delay_ms(10); Delay_MS(10);
/* Select the firmware mode based on the JTD pin's value */ /* Select the firmware mode based on the JTD pin's value */
CurrentFirmwareMode = (PINF & (1 << 7)) ? MODE_USART_BRIDGE : MODE_PDI_PROGRAMMER; CurrentFirmwareMode = (PINF & (1 << 7)) ? MODE_USART_BRIDGE : MODE_PDI_PROGRAMMER;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment