| 
					
				 | 
			
			
				@@ -7,6 +7,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "w25x20cl.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "stk500.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "bootapp.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <avr/wdt.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define OPTIBOOT_MAJVER 6 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define OPTIBOOT_CUSTOMVER 0 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -39,14 +40,10 @@ static unsigned const int __attribute__((section(".version"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void watchdogConfig(uint8_t x) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CRITICAL_SECTION_START 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   WDTCSR = _BV(WDCE) | _BV(WDE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   WDTCSR = x; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void watchdogReset() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  __asm__ __volatile__ ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    "wdr\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CRITICAL_SECTION_END 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define RECV_READY ((UCSR0A & _BV(RXC0)) != 0) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -63,7 +60,7 @@ static uint8_t getch(void) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        * the application "soon", if it keeps happening.  (Note that we 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        * don't care that an invalid char is returned...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    watchdogReset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wdt_reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ch = UDR0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return ch; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -117,7 +114,7 @@ uint8_t optiboot_w25x20cl_enter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Handshake sequence: Initialize the serial line, flush serial line, send magic, receive magic. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // If the magic is not received on time, or it is not received correctly, continue to the application. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    watchdogReset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wdt_reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     unsigned long  boot_timeout = 2000000; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     unsigned long  boot_timer = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const char    *ptr = entry_magic_send; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -125,7 +122,7 @@ uint8_t optiboot_w25x20cl_enter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const uint8_t selectedSerialPort_bak = selectedSerialPort; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Flush the serial line. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     while (RECV_READY) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      watchdogReset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      wdt_reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Dummy register read (discard) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (void)(*(char *)UDR0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -135,14 +132,14 @@ uint8_t optiboot_w25x20cl_enter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Send the initial magic string. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     while (ptr != end) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       putch(pgm_read_byte(ptr ++)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    watchdogReset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wdt_reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Wait for two seconds until a magic string (constant entry_magic) is received 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // from the serial line. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ptr = entry_magic_receive; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     end = strlen_P(entry_magic_receive) + ptr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     while (ptr != end) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       while (rx_buffer.head == SerialHead) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        watchdogReset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        wdt_reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         delayMicroseconds(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (++ boot_timer > boot_timeout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -159,7 +156,7 @@ uint8_t optiboot_w25x20cl_enter() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           selectedSerialPort = selectedSerialPort_bak; //revert Serial setting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      watchdogReset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      wdt_reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cbi(UCSR0B, RXCIE0); //disable the MarlinSerial0 interrupt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Send the cfm magic string. 
			 |