From f0c5dfe8b8f47211f03454da036223d65e08249c Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 29 Jan 2017 15:36:02 +1100
Subject: [PATCH] Restrict HID bootloader programming region (thanks to
 NicoHood).

---
 Bootloaders/HID/BootloaderHID.c | 10 +++++++++-
 Bootloaders/HID/BootloaderHID.h |  2 --
 Bootloaders/HID/Descriptors.c   |  2 +-
 Bootloaders/HID/Descriptors.h   |  2 +-
 Bootloaders/HID/makefile        |  2 +-
 5 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/Bootloaders/HID/BootloaderHID.c b/Bootloaders/HID/BootloaderHID.c
index 04fd0df3b..ec094b1d0 100644
--- a/Bootloaders/HID/BootloaderHID.c
+++ b/Bootloaders/HID/BootloaderHID.c
@@ -58,6 +58,11 @@ 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))
 	{
+		/* Turn off the watchdog */
+		MCUSR &= ~(1 << WDRF);
+		wdt_disable();
+
+		/* Clear the boot key and jump to the user application */
 		MagicBootKey = 0;
 
 		// cppcheck-suppress constStatement
@@ -98,6 +103,9 @@ static void SetupHardware(void)
 	MCUSR &= ~(1 << WDRF);
 	wdt_disable();
 
+	/* Disable clock division */
+	clock_prescale_set(clock_div_1);
+
 	/* Relocate the interrupt vector table to the bootloader section */
 	MCUCR = (1 << IVCE);
 	MCUCR = (1 << IVSEL);
@@ -153,7 +161,7 @@ void EVENT_USB_Device_ControlRequest(void)
 			{
 				RunBootloader = false;
 			}
-			else
+			else if (PageAddress < BOOT_START_ADDR)
 			{
 				/* Erase the given FLASH page, ready to be programmed */
 				boot_page_erase(PageAddress);
diff --git a/Bootloaders/HID/BootloaderHID.h b/Bootloaders/HID/BootloaderHID.h
index 74cb26789..0eaba4655 100644
--- a/Bootloaders/HID/BootloaderHID.h
+++ b/Bootloaders/HID/BootloaderHID.h
@@ -67,7 +67,5 @@
 		void Application_Jump_Check(void) ATTR_INIT_SECTION(3);
 
 		void EVENT_USB_Device_ConfigurationChanged(void);
-		void EVENT_USB_Device_UnhandledControlRequest(void);
 
 #endif
-
diff --git a/Bootloaders/HID/Descriptors.c b/Bootloaders/HID/Descriptors.c
index 4c475db51..70dc9d0d3 100644
--- a/Bootloaders/HID/Descriptors.c
+++ b/Bootloaders/HID/Descriptors.c
@@ -110,7 +110,7 @@ const USB_Descriptor_Configuration_t ConfigurationDescriptor =
 		{
 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 
-			.InterfaceNumber        = INTERFACE_ID_Printer,
+			.InterfaceNumber        = INTERFACE_ID_GenericHID,
 			.AlternateSetting       = 0x00,
 
 			.TotalEndpoints         = 1,
diff --git a/Bootloaders/HID/Descriptors.h b/Bootloaders/HID/Descriptors.h
index 08d87e6f3..179fa31ef 100644
--- a/Bootloaders/HID/Descriptors.h
+++ b/Bootloaders/HID/Descriptors.h
@@ -60,7 +60,7 @@
 		 */
 		enum InterfaceDescriptors_t
 		{
-			INTERFACE_ID_Printer = 0, /**< Printer interface descriptor ID */
+			INTERFACE_ID_GenericHID = 0, /**< GenericHID interface descriptor ID */
 		};
 
 	/* Macros: */
diff --git a/Bootloaders/HID/makefile b/Bootloaders/HID/makefile
index a76faf06e..3176a5a57 100644
--- a/Bootloaders/HID/makefile
+++ b/Bootloaders/HID/makefile
@@ -20,7 +20,7 @@ OPTIMIZATION = s
 TARGET       = BootloaderHID
 SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB)
 LUFA_PATH    = ../../LUFA
-CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/
+CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -DBOOT_START_ADDR=$(BOOT_START_OFFSET) -IConfig/
 LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET)
 
 # Flash size and bootloader section sizes of the target, in KB. These must
-- 
GitLab