Skip to content
Snippets Groups Projects
Commit 2e7fc37a authored by Dean Camera's avatar Dean Camera
Browse files

Fix incorrect HEX extended address parsing in the Printer class bootloader.

parent d999ca8f
No related branches found
No related tags found
No related merge requests found
...@@ -59,6 +59,8 @@ struct ...@@ -59,6 +59,8 @@ struct
uint8_t Checksum; uint8_t Checksum;
/** Starting address of the last addressed FLASH page. */ /** Starting address of the last addressed FLASH page. */
uint32_t PageStartAddress; uint32_t PageStartAddress;
/** Current 32-bit byte extended base address in FLASH being targeted. */
uint32_t CurrBaseAddress;
/** Current 32-bit byte address in FLASH being targeted. */ /** Current 32-bit byte address in FLASH being targeted. */
uint32_t CurrAddress; uint32_t CurrAddress;
} HEXParser = } HEXParser =
...@@ -117,7 +119,7 @@ static void ParseIntelHEXByte(const char ReadCharacter) ...@@ -117,7 +119,7 @@ static void ParseIntelHEXByte(const char ReadCharacter)
if ((HEXParser.ParserState == HEX_PARSE_STATE_WAIT_LINE) || (ReadCharacter == ':')) if ((HEXParser.ParserState == HEX_PARSE_STATE_WAIT_LINE) || (ReadCharacter == ':'))
{ {
HEXParser.Checksum = 0; HEXParser.Checksum = 0;
HEXParser.CurrAddress &= ~0xFFFF; HEXParser.CurrAddress = HEXParser.CurrBaseAddress;
HEXParser.ParserState = HEX_PARSE_STATE_WAIT_LINE; HEXParser.ParserState = HEX_PARSE_STATE_WAIT_LINE;
HEXParser.ReadMSB = false; HEXParser.ReadMSB = false;
...@@ -154,12 +156,12 @@ static void ParseIntelHEXByte(const char ReadCharacter) ...@@ -154,12 +156,12 @@ static void ParseIntelHEXByte(const char ReadCharacter)
break; break;
case HEX_PARSE_STATE_ADDRESS_HIGH: case HEX_PARSE_STATE_ADDRESS_HIGH:
HEXParser.CurrAddress |= ((uint16_t)HEXParser.Data << 8); HEXParser.CurrAddress += ((uint16_t)HEXParser.Data << 8);
HEXParser.ParserState = HEX_PARSE_STATE_ADDRESS_LOW; HEXParser.ParserState = HEX_PARSE_STATE_ADDRESS_LOW;
break; break;
case HEX_PARSE_STATE_ADDRESS_LOW: case HEX_PARSE_STATE_ADDRESS_LOW:
HEXParser.CurrAddress |= HEXParser.Data; HEXParser.CurrAddress += HEXParser.Data;
HEXParser.ParserState = HEX_PARSE_STATE_RECORD_TYPE; HEXParser.ParserState = HEX_PARSE_STATE_RECORD_TYPE;
break; break;
...@@ -172,6 +174,14 @@ static void ParseIntelHEXByte(const char ReadCharacter) ...@@ -172,6 +174,14 @@ static void ParseIntelHEXByte(const char ReadCharacter)
/* Track the number of read data bytes in the record */ /* Track the number of read data bytes in the record */
HEXParser.DataRem--; HEXParser.DataRem--;
/* Protect the bootloader against being written to */
if (HEXParser.CurrAddress >= BOOT_START_ADDR)
{
HEXParser.ParserState = HEX_PARSE_STATE_WAIT_LINE;
PageDirty = false;
return;
}
/* Wait for a machine word (two bytes) of data to be read */ /* Wait for a machine word (two bytes) of data to be read */
if (HEXParser.DataRem & 0x01) if (HEXParser.DataRem & 0x01)
{ {
...@@ -210,9 +220,14 @@ static void ParseIntelHEXByte(const char ReadCharacter) ...@@ -210,9 +220,14 @@ static void ParseIntelHEXByte(const char ReadCharacter)
} }
break; break;
case HEX_RECORD_TYPE_ExtendedSegmentAddress:
/* Extended address data - store the upper 12-bits of the new address */
HEXParser.CurrBaseAddress = (((uint32_t)HEXParser.PrevData << 8) | HEXParser.Data) << 4;
break;
case HEX_RECORD_TYPE_ExtendedLinearAddress: case HEX_RECORD_TYPE_ExtendedLinearAddress:
/* Extended address data - store the upper 16-bits of the new address */ /* Extended address data - store the upper 16-bits of the new address */
HEXParser.CurrAddress |= (uint32_t)HEXParser.Data << (HEXParser.DataRem ? 24 : 16); HEXParser.CurrBaseAddress = (((uint32_t)HEXParser.PrevData << 8) | HEXParser.Data) << 16;
break; break;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment