The library bootloaders will now correctly start the user application after a watchdog-based application start, even if the /HWB line is held low externally during the reset phase.
This commit is contained in:
		
							parent
							
								
									cc959c945b
								
							
						
					
					
						commit
						04740d680e
					
				
					 8 changed files with 92 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -41,6 +41,28 @@
 | 
			
		|||
 */
 | 
			
		||||
static bool RunBootloader = true;
 | 
			
		||||
 | 
			
		||||
/** Magic lock for forced application start. If the HWBE fuse is programmed and BOOTRST is unprogrammed, the bootloader
 | 
			
		||||
 *  will start if the /HWB line of the AVR is held low and the system is reset. However, if the /HWB line is still held
 | 
			
		||||
 *  low when the application attempts to start via a watchdog reset, the bootloader will re-start. If set to the value
 | 
			
		||||
 *  \ref MAGIC_BOOT_KEY the special init function \ref Application_Jump_Check() will force the application to start.
 | 
			
		||||
 */
 | 
			
		||||
uint32_t MagicBootKey ATTR_NO_INIT;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/** Special startup routine to check if the bootloader was started via a watchdog reset, and if the magic application
 | 
			
		||||
 *  start key has been loaded into \ref MagicBootKey. If the bootloader started via the watchdog and the key is valid,
 | 
			
		||||
 *  this will force the user application to start via a software jump.
 | 
			
		||||
 */
 | 
			
		||||
void Application_Jump_Check(void)
 | 
			
		||||
{
 | 
			
		||||
	// If the reset source was the bootloader and the key is correct, clear it and jump to the application
 | 
			
		||||
	if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
 | 
			
		||||
	{
 | 
			
		||||
		MagicBootKey = 0;
 | 
			
		||||
		((void (*)(void))0x0000)();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
 | 
			
		||||
 *  runs the bootloader processing routine until instructed to soft-exit.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -58,6 +80,9 @@ int main(void)
 | 
			
		|||
	/* Disconnect from the host - USB interface will be reset later along with the AVR */
 | 
			
		||||
	USB_Detach();
 | 
			
		||||
 | 
			
		||||
	/* Unlock the forced application start mode of the bootloader if it is restarted */
 | 
			
		||||
	MagicBootKey = MAGIC_BOOT_KEY;
 | 
			
		||||
 | 
			
		||||
	/* Enable the watchdog and force a timeout to reset the AVR */
 | 
			
		||||
	wdt_enable(WDTO_250MS);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,9 +52,14 @@
 | 
			
		|||
		/** Bootloader special address to start the user application */
 | 
			
		||||
		#define COMMAND_STARTAPPLICATION   0xFFFF
 | 
			
		||||
 | 
			
		||||
		/** Magic bootloader key to unlock forced application start mode. */
 | 
			
		||||
		#define MAGIC_BOOT_KEY            0xDC42CACA
 | 
			
		||||
		
 | 
			
		||||
	/* Function Prototypes: */
 | 
			
		||||
		static void SetupHardware(void);
 | 
			
		||||
 | 
			
		||||
		void Application_Jump_Check(void) ATTR_INIT_SECTION(3);
 | 
			
		||||
		
 | 
			
		||||
		void EVENT_USB_Device_ConfigurationChanged(void);
 | 
			
		||||
		void EVENT_USB_Device_UnhandledControlRequest(void);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue