diff --git a/Host/Source/BootCommander/main.c b/Host/Source/BootCommander/main.c index e63382b4..05962f60 100644 --- a/Host/Source/BootCommander/main.c +++ b/Host/Source/BootCommander/main.c @@ -170,8 +170,8 @@ int main(int argc, char const * const argv[]) printf("Loading firmware data from file..."); (void)fflush(stdout); /* Initialize the firmware data module using the S-record parser. */ BltFirmwareInit(BLT_FIRMWARE_PARSER_SRECORD); - /* Load firmware data from the firmware file. */ - if (BltFirmwareLoadFromFile(appFirmwareFile) != BLT_RESULT_OK) + /* Load firmware data from the firmware file without memory address offset. */ + if (BltFirmwareLoadFromFile(appFirmwareFile, 0) != BLT_RESULT_OK) { /* Set error code. */ result = RESULT_ERROR_FIRMWARE_LOAD; diff --git a/Host/Source/LibOpenBLT/firmware.c b/Host/Source/LibOpenBLT/firmware.c index 1b640525..2d77adbf 100644 --- a/Host/Source/LibOpenBLT/firmware.c +++ b/Host/Source/LibOpenBLT/firmware.c @@ -93,10 +93,12 @@ void FirmwareTerminate(void) ** \brief Uses the linked parser to load the firmware data from the specified file ** into the linked list of segments. ** \param firmwareFile Filename of the firmware file to load. +** \param addressOffset Optional memory address offset to add when loading the +** firmware data from the file. ** \return True if successful, false otherwise. ** ****************************************************************************************/ -bool FirmwareLoadFromFile(char const * firmwareFile) +bool FirmwareLoadFromFile(char const * firmwareFile, uint32_t addressOffset) { bool result = false; @@ -113,7 +115,7 @@ bool FirmwareLoadFromFile(char const * firmwareFile) if (parserPtr->LoadFromFile != NULL) { /* Request the parser to perform the load operation. */ - result = parserPtr->LoadFromFile(firmwareFile); + result = parserPtr->LoadFromFile(firmwareFile, addressOffset); } } } diff --git a/Host/Source/LibOpenBLT/firmware.h b/Host/Source/LibOpenBLT/firmware.h index 0d8251e2..687fb304 100644 --- a/Host/Source/LibOpenBLT/firmware.h +++ b/Host/Source/LibOpenBLT/firmware.h @@ -68,7 +68,7 @@ typedef struct t_firmware_parser /** \brief Extract the firmware segments from the firmware file and add them as nodes * to the linked list. */ - bool (* LoadFromFile) (char const * firmwareFile); + bool (* LoadFromFile) (char const * firmwareFile, uint32_t addressOffset); /** \brief Write all the firmware segments from the linked list to the specified * firmware file. */ @@ -81,7 +81,7 @@ typedef struct t_firmware_parser ****************************************************************************************/ void FirmwareInit(tFirmwareParser const * parser); void FirmwareTerminate(void); -bool FirmwareLoadFromFile(char const * firmwareFile); +bool FirmwareLoadFromFile(char const * firmwareFile, uint32_t addressOffset); bool FirmwareSaveToFile(char const * firmwareFile); uint32_t FirmwareGetSegmentCount(void); tFirmwareSegment * FirmwareGetSegment(uint32_t segmentIdx); diff --git a/Host/Source/LibOpenBLT/openblt.c b/Host/Source/LibOpenBLT/openblt.c index dc1702a0..11c40d4e 100644 --- a/Host/Source/LibOpenBLT/openblt.c +++ b/Host/Source/LibOpenBLT/openblt.c @@ -357,10 +357,14 @@ LIBOPENBLT_EXPORT void BltFirmwareTerminate(void) ** \brief Loads firmware data from the specified file using the firmware file parser ** that was specified during the initialization of this module. ** \param firmwareFile Filename of the firmware file to load. +** \param addressOffset Optional memory address offset to add when loading the +** firmware data from the file. This is typically only useful when loading +** firmware data from a binary formatted firmware file. ** \return BLT_RESULT_OK if successful, BLT_RESULT_ERROR_xxx otherwise. ** ****************************************************************************************/ -LIBOPENBLT_EXPORT uint32_t BltFirmwareLoadFromFile(char const * firmwareFile) +LIBOPENBLT_EXPORT uint32_t BltFirmwareLoadFromFile(char const * firmwareFile, + uint32_t addressOffset) { uint32_t result = BLT_RESULT_ERROR_GENERIC; @@ -371,7 +375,7 @@ LIBOPENBLT_EXPORT uint32_t BltFirmwareLoadFromFile(char const * firmwareFile) if (firmwareFile != NULL) /*lint !e774 */ { /* Pass the request on to the firmware data module. */ - if (FirmwareLoadFromFile(firmwareFile)) + if (FirmwareLoadFromFile(firmwareFile, addressOffset)) { result = BLT_RESULT_OK; } diff --git a/Host/Source/LibOpenBLT/openblt.h b/Host/Source/LibOpenBLT/openblt.h index 87389d49..854d8f46 100644 --- a/Host/Source/LibOpenBLT/openblt.h +++ b/Host/Source/LibOpenBLT/openblt.h @@ -191,7 +191,8 @@ LIBOPENBLT_EXPORT uint32_t BltSessionReadData(uint32_t address, uint32_t len, ****************************************************************************************/ LIBOPENBLT_EXPORT void BltFirmwareInit(uint32_t parserType); LIBOPENBLT_EXPORT void BltFirmwareTerminate(void); -LIBOPENBLT_EXPORT uint32_t BltFirmwareLoadFromFile(char const * firmwareFile); +LIBOPENBLT_EXPORT uint32_t BltFirmwareLoadFromFile(char const * firmwareFile, + uint32_t addressOffset); LIBOPENBLT_EXPORT uint32_t BltFirmwareSaveToFile(char const * firmwareFile); LIBOPENBLT_EXPORT uint32_t BltFirmwareGetSegmentCount(void); LIBOPENBLT_EXPORT uint8_t * BltFirmwareGetSegment(uint32_t idx, uint32_t * address, diff --git a/Host/Source/LibOpenBLT/openblt.pas b/Host/Source/LibOpenBLT/openblt.pas index 42dc8cf1..5d517f40 100644 --- a/Host/Source/LibOpenBLT/openblt.pas +++ b/Host/Source/LibOpenBLT/openblt.pas @@ -134,9 +134,9 @@ const procedure BltFirmwareInit(parserType: LongWord); cdecl; external LIBOPENBLT_LIBNAME; procedure BltFirmwareTerminate; cdecl; external LIBOPENBLT_LIBNAME; -function BltFirmwareLoadFromFile(firmwareFile: PAnsiChar): LongWord; - cdecl; external LIBOPENBLT_LIBNAME; -function BltFirmwareSaveToFile(firmwareFile: PAnsiChar): LongWord; +function BltFirmwareLoadFromFile(firmwareFile: PAnsiChar; addressOffsets: LongWord): + LongWord; cdecl; external LIBOPENBLT_LIBNAME; +function BltFirmwareSaveToFile(firmwareFile: PAnsiChar): LongWord; cdecl; external LIBOPENBLT_LIBNAME; function BltFirmwareGetSegmentCount: LongWord; cdecl; external LIBOPENBLT_LIBNAME; function BltFirmwareGetSegment(idx: LongWord; diff --git a/Host/Source/LibOpenBLT/srecparser.c b/Host/Source/LibOpenBLT/srecparser.c index 8688c64b..a8cddf35 100644 --- a/Host/Source/LibOpenBLT/srecparser.c +++ b/Host/Source/LibOpenBLT/srecparser.c @@ -61,7 +61,7 @@ typedef enum t_srec_parser_line_type /**************************************************************************************** * Function prototypes ****************************************************************************************/ -static bool SRecParserLoadFromFile (char const * firmwareFile); +static bool SRecParserLoadFromFile (char const * firmwareFile, uint32_t addressOffset); static bool SRecParserSaveToFile (char const * firmwareFile); static bool SRecParserExtractLineData(char const * line, uint32_t * address, uint32_t * len, uint8_t * data); @@ -101,10 +101,12 @@ tFirmwareParser const * SRecParserGetParser(void) ** data to the firmware data that is currently managed by the firmware data ** module. ** \param firmwareFile Filename of the firmware file to load. +** \param addressOffset Optional memory address offset to add when loading the +** firmware data from the file. ** \return True if successful, false otherwise. ** ****************************************************************************************/ -static bool SRecParserLoadFromFile (char const * firmwareFile) +static bool SRecParserLoadFromFile (char const * firmwareFile, uint32_t addressOffset) { bool result = false; FILE *fp; @@ -151,8 +153,10 @@ static bool SRecParserLoadFromFile (char const * firmwareFile) /* Only add data if there is actually something to add. */ if (len > 0) { - /* Add the extracted data to the firmware data module. */ - if (!FirmwareAddData(address, len, data)) + /* Add the extracted data to the firmware data module and add the memory + * address that was specified by the caller. + */ + if (!FirmwareAddData(address + addressOffset, len, data)) { /* Error detected. Flag it and abort. */ result = false;