From 63e80bea0827d28a5a64bd359b0e702babfc1be3 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 3 Mar 2013 14:10:13 +0000
Subject: [PATCH] Add additional comments to the Printer class bootloader, fix
 incorrect VID/PID values.

---
 Bootloaders/Printer/BootloaderPrinter.c | 18 ++++++++++++++++++
 Bootloaders/Printer/Descriptors.c       |  2 +-
 LUFA/DoxygenPages/VIDAndPIDValues.txt   |  4 ++--
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/Bootloaders/Printer/BootloaderPrinter.c b/Bootloaders/Printer/BootloaderPrinter.c
index a913b3330..ef7f03ffc 100644
--- a/Bootloaders/Printer/BootloaderPrinter.c
+++ b/Bootloaders/Printer/BootloaderPrinter.c
@@ -113,6 +113,7 @@ static uint8_t HexToDecimal(const char Byte)
  */
 static void ParseIntelHEXByte(const char ReadCharacter)
 {
+	/* Reset the line parser while waiting for a new line to start */
 	if ((HEXParser.ParserState == HEX_PARSE_STATE_WAIT_LINE) || (ReadCharacter == ':'))
 	{
 		HEXParser.Checksum     = 0;
@@ -120,21 +121,28 @@ static void ParseIntelHEXByte(const char ReadCharacter)
 		HEXParser.ParserState  = HEX_PARSE_STATE_WAIT_LINE;
 		HEXParser.ReadMSB      = false;
 
+		/* ASCII ':' indicates the start of a new HEX record */
 		if (ReadCharacter == ':')
 		  HEXParser.ParserState = HEX_PARSE_STATE_BYTE_COUNT;
 
 		return;
 	}
 
+	/* Only allow ASCII HEX encoded digits, ignore all other characters */
 	if (!IsHex(ReadCharacter))
 	  return;
 
+	/* Read and convert the next nibble of data from the current character */
 	HEXParser.Data    = (HEXParser.Data << 4) | HexToDecimal(ReadCharacter);
 	HEXParser.ReadMSB = !HEXParser.ReadMSB;
 
+	/* Only process further when a full byte (two nibbles) have been read */
 	if (HEXParser.ReadMSB)
 	  return;
 
+	/* Intel HEX checksum is for all fields except starting character and the
+	 * checksum itself
+	 */
 	if (HEXParser.ParserState != HEX_PARSE_STATE_CHECKSUM)
 	  HEXParser.Checksum += HEXParser.Data;
 
@@ -161,8 +169,10 @@ static void ParseIntelHEXByte(const char ReadCharacter)
 			break;
 
 		case HEX_PARSE_STATE_READ_DATA:
+			/* Track the number of read data bytes in the record */
 			HEXParser.DataRem--;
 
+			/* Wait for a machine word (two bytes) of data to be read */
 			if (HEXParser.DataRem & 0x01)
 			{
 				HEXParser.PrevData = HEXParser.Data;
@@ -172,6 +182,9 @@ static void ParseIntelHEXByte(const char ReadCharacter)
 			switch (HEXParser.RecordType)
 			{
 				case HEX_RECORD_TYPE_Data:
+					/* If we are writing to a new page, we need to erase it
+					 * first
+					 */
 					if (!(PageDirty))
 					{
 						boot_page_erase(HEXParser.PageStartAddress);
@@ -180,9 +193,11 @@ static void ParseIntelHEXByte(const char ReadCharacter)
 						PageDirty = true;
 					}
 
+					/* Fill the FLASH memory buffer with the new word of data */
 					boot_page_fill(HEXParser.CurrAddress, ((uint16_t)HEXParser.Data << 8) | HEXParser.PrevData);
 					HEXParser.CurrAddress += 2;
 
+					/* Flush the FLASH page to physical memory if we are crossing a page boundary */
 					uint32_t NewPageStartAddress = (HEXParser.CurrAddress & ~(SPM_PAGESIZE - 1));
 					if (PageDirty && (HEXParser.PageStartAddress != NewPageStartAddress))
 					{
@@ -196,6 +211,7 @@ static void ParseIntelHEXByte(const char ReadCharacter)
 					break;
 
 				case HEX_RECORD_TYPE_ExtendedLinearAddress:
+					/* Extended address data - store the upper 16-bits of the new address */
 					HEXParser.CurrAddress |= (uint32_t)HEXParser.Data << (HEXParser.DataRem ? 24 : 16);
 					break;
 			}
@@ -205,9 +221,11 @@ static void ParseIntelHEXByte(const char ReadCharacter)
 			break;
 
 		case HEX_PARSE_STATE_CHECKSUM:
+			/* Verify checksum of the completed record */
 			if (HEXParser.Data != ((~HEXParser.Checksum + 1) & 0xFF))
 			  break;
 
+			/* Flush the FLASH page to physical memory if we are crossing a page boundary */
 			uint32_t NewPageStartAddress = (HEXParser.CurrAddress & ~(SPM_PAGESIZE - 1));
 			if (PageDirty && (HEXParser.PageStartAddress != NewPageStartAddress))
 			{
diff --git a/Bootloaders/Printer/Descriptors.c b/Bootloaders/Printer/Descriptors.c
index 30fd36401..3bc483753 100644
--- a/Bootloaders/Printer/Descriptors.c
+++ b/Bootloaders/Printer/Descriptors.c
@@ -55,7 +55,7 @@ const USB_Descriptor_Device_t DeviceDescriptor =
 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
 
 	.VendorID               = 0x03EB,
-	.ProductID              = 0xFFEF,
+	.ProductID              = 0x206B,
 	.ReleaseNumber          = VERSION_BCD(00.01),
 
 	.ManufacturerStrIndex   = 0x01,
diff --git a/LUFA/DoxygenPages/VIDAndPIDValues.txt b/LUFA/DoxygenPages/VIDAndPIDValues.txt
index 7791fb2aa..b31f007bb 100644
--- a/LUFA/DoxygenPages/VIDAndPIDValues.txt
+++ b/LUFA/DoxygenPages/VIDAndPIDValues.txt
@@ -75,7 +75,7 @@
  *   <tr>
  *    <td>0x03EB</td>
  *    <td>0x204A</td>
- *    <td>CDC Bootloader</td>
+ *    <td>CDC Class Bootloader</td>
  *   </tr>
  *   <tr>
  *    <td>0x03EB</td>
@@ -166,7 +166,7 @@
  *   <tr>
  *    <td>0x03EB</td>
  *    <td>0x206B</td>
- *    <td><i>Currently Unallocated</i></td>
+ *    <td>Printer Class Bootloader</td>
  *   </tr>
  *   <tr>
  *    <td>0x03EB</td>
-- 
GitLab