Commit 28343b14 authored by Dean Camera's avatar Dean Camera
Browse files

Updated bootloaders to use the new main() function layout and remove any...

Updated bootloaders to use the new main() function layout and remove any references to the scheduler to keep them in line with the rest of the library.
parent 0323e13b
...@@ -66,6 +66,26 @@ bool RunBootloader = true; ...@@ -66,6 +66,26 @@ bool RunBootloader = true;
* the loaded application code. * the loaded application code.
*/ */
int main(void) int main(void)
{
/* Setup hardware required for the bootloader */
SetupHardware();
while (RunBootloader)
{
CDC_Task();
USB_USBTask();
}
/* Reset all configured hardware to their default states for the user app */
ResetHardware();
/* Start the user application */
AppPtr_t AppStartPtr = (AppPtr_t)0x0000;
AppStartPtr();
}
/** Configures all hardware required for the bootloader. */
void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF); MCUSR &= ~(1 << WDRF);
...@@ -80,18 +100,11 @@ int main(void) ...@@ -80,18 +100,11 @@ int main(void)
/* Initialize USB Subsystem */ /* Initialize USB Subsystem */
USB_Init(); USB_Init();
}
while (RunBootloader) /** Resets all configured hardware required for the bootloader back to their original states. */
{ void ResetHardware(void)
USB_USBTask(); {
CDC_Task();
}
Endpoint_SelectEndpoint(CDC_TX_EPNUM);
/* Wait until any pending transmissions have completed before shutting down */
while (!(Endpoint_IsINReady()));
/* Shut down the USB subsystem */ /* Shut down the USB subsystem */
USB_ShutDown(); USB_ShutDown();
...@@ -99,21 +112,8 @@ int main(void) ...@@ -99,21 +112,8 @@ int main(void)
MCUCR = (1 << IVCE); MCUCR = (1 << IVCE);
MCUCR = 0; MCUCR = 0;
/* Reset any used hardware ports back to their defaults */
PORTD = 0;
DDRD = 0;
#if defined(PORTE)
PORTE = 0;
DDRE = 0;
#endif
/* Re-enable RWW section */ /* Re-enable RWW section */
boot_rww_enable(); boot_rww_enable();
/* Start the user application */
AppPtr_t AppStartPtr = (AppPtr_t)0x0000;
AppStartPtr();
} }
/** Event handler for the USB_Disconnect event. This indicates that the bootloader should exit and the user /** Event handler for the USB_Disconnect event. This indicates that the bootloader should exit and the user
...@@ -364,7 +364,7 @@ static void WriteNextResponseByte(const uint8_t Response) ...@@ -364,7 +364,7 @@ static void WriteNextResponseByte(const uint8_t Response)
/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions /** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions
* and send the appropriate response back to the host. * and send the appropriate response back to the host.
*/ */
TASK(CDC_Task) void CDC_Task(void)
{ {
/* Select the OUT endpoint */ /* Select the OUT endpoint */
Endpoint_SelectEndpoint(CDC_RX_EPNUM); Endpoint_SelectEndpoint(CDC_RX_EPNUM);
...@@ -566,6 +566,9 @@ TASK(CDC_Task) ...@@ -566,6 +566,9 @@ TASK(CDC_Task)
while (!(Endpoint_IsINReady())); while (!(Endpoint_IsINReady()));
Endpoint_ClearIN(); Endpoint_ClearIN();
} }
/* Wait until the data has been sent to the host */
while (!(Endpoint_IsINReady()));
/* Select the OUT endpoint */ /* Select the OUT endpoint */
Endpoint_SelectEndpoint(CDC_RX_EPNUM); Endpoint_SelectEndpoint(CDC_RX_EPNUM);
......
...@@ -118,10 +118,11 @@ ...@@ -118,10 +118,11 @@
Parity_Space = 4, /**< Space data parity checking */ Parity_Space = 4, /**< Space data parity checking */
}; };
/* Tasks: */
TASK(CDC_Task);
/* Function Prototypes: */ /* Function Prototypes: */
void CDC_Task(void);
void SetupHardware(void);
void ResetHardware(void);
void EVENT_USB_Disconnect(void); void EVENT_USB_Disconnect(void);
void EVENT_USB_ConfigurationChanged(void); void EVENT_USB_ConfigurationChanged(void);
void EVENT_USB_UnhandledControlPacket(void); void EVENT_USB_UnhandledControlPacket(void);
......
...@@ -97,6 +97,23 @@ uint16_t EndAddr = 0x0000; ...@@ -97,6 +97,23 @@ uint16_t EndAddr = 0x0000;
* the loaded application code. * the loaded application code.
*/ */
int main (void) int main (void)
{
/* Configure hardware required by the bootloader */
SetupHardware();
/* Run the USB management task while the bootloader is supposed to be running */
while (RunBootloader || WaitForExit)
USB_USBTask();
/* Reset configured hardware back to their original states for the user application */
ResetHardware();
/* Start the user application */
AppStartPtr();
}
/** Configures all hardware required for the bootloader. */
void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF); MCUSR &= ~(1 << WDRF);
...@@ -111,29 +128,17 @@ int main (void) ...@@ -111,29 +128,17 @@ int main (void)
/* Initialize the USB subsystem */ /* Initialize the USB subsystem */
USB_Init(); USB_Init();
}
/* Run the USB management task while the bootloader is supposed to be running */ /** Resets all configured hardware required for the bootloader back to their original states. */
while (RunBootloader || WaitForExit) void ResetHardware(void)
USB_USBTask(); {
/* Shut down the USB subsystem */ /* Shut down the USB subsystem */
USB_ShutDown(); USB_ShutDown();
/* Relocate the interrupt vector table back to the application section */ /* Relocate the interrupt vector table back to the application section */
MCUCR = (1 << IVCE); MCUCR = (1 << IVCE);
MCUCR = 0; MCUCR = 0;
/* Reset any used hardware ports back to their defaults */
PORTD = 0;
DDRD = 0;
#if defined(PORTE)
PORTE = 0;
DDRE = 0;
#endif
/* Start the user application */
AppStartPtr();
} }
/** Event handler for the USB_Disconnect event. This indicates that the bootloader should exit and the user /** Event handler for the USB_Disconnect event. This indicates that the bootloader should exit and the user
......
...@@ -193,6 +193,9 @@ ...@@ -193,6 +193,9 @@
}; };
/* Function Prototypes: */ /* Function Prototypes: */
void SetupHardware(void);
void ResetHardware(void);
void EVENT_USB_Disconnect(void); void EVENT_USB_Disconnect(void);
void EVENT_USB_UnhandledControlPacket(void); void EVENT_USB_UnhandledControlPacket(void);
......
...@@ -48,6 +48,27 @@ bool RunBootloader = true; ...@@ -48,6 +48,27 @@ bool RunBootloader = true;
* runs the bootloader processing routine until instructed to soft-exit. * runs the bootloader processing routine until instructed to soft-exit.
*/ */
int main(void) int main(void)
{
/* Setup hardware required for the bootloader */
SetupHardware();
while (RunBootloader)
USB_USBTask();
/* Reset all configured hardware to their default states for the user app */
ResetHardware();
/* Wait 100ms to give the host time to register the disconnection */
_delay_ms(100);
/* Enable the watchdog and force a timeout to reset the AVR */
wdt_enable(WDTO_250MS);
for (;;);
}
/** Configures all hardware required for the bootloader. */
void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF); MCUSR &= ~(1 << WDRF);
...@@ -62,20 +83,13 @@ int main(void) ...@@ -62,20 +83,13 @@ int main(void)
/* Initialize USB subsystem */ /* Initialize USB subsystem */
USB_Init(); USB_Init();
}
while (RunBootloader)
USB_USBTask();
/* Shut down the USB interface, so that the host will register the disconnection */
USB_ShutDown();
/* Wait 100ms to give the host time to register the disconnection */
_delay_ms(100);
/* Enable the watchdog and force a timeout to reset the AVR */ /** Resets all configured hardware required for the bootloader back to their original states. */
wdt_enable(WDTO_250MS); void ResetHardware(void)
{
for (;;); /* Shut down the USB subsystem */
USB_ShutDown();
} }
/** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready
......
...@@ -59,9 +59,13 @@ ...@@ -59,9 +59,13 @@
/** HID Class specific request to send the next HID report to the device. */ /** HID Class specific request to send the next HID report to the device. */
#define REQ_SetReport 0x09 #define REQ_SetReport 0x09
/** Teensy Bootloader special address to start the user application */
#define TEENSY_STARTAPPLICATION 0xFFFF #define TEENSY_STARTAPPLICATION 0xFFFF
/* Function Prototypes: */ /* Function Prototypes: */
void SetupHardware(void);
void ResetHardware(void);
void EVENT_USB_ConfigurationChanged(void); void EVENT_USB_ConfigurationChanged(void);
void EVENT_USB_UnhandledControlPacket(void); void EVENT_USB_UnhandledControlPacket(void);
......
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