From c97587803742cfef1ccfbd639cc2b9c98a41632c Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Thu, 24 Jul 2014 09:31:17 +0000 Subject: [PATCH] - added seed/key security functionality. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@102 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- Host/FeaserKey.dll | Bin 0 -> 451072 bytes .../Source/MicroBoot/interfaces/XcpLoader.pas | 47 +- .../interfaces/can/peak/openblt_can_peak.dpr | 24 +- .../can/vector/openblt_can_vector.dpr | 24 +- .../MicroBoot/interfaces/net/WSockets.dcu | Bin 38522 -> 38520 bytes .../MicroBoot/interfaces/net/XcpSettings.dcu | Bin 8863 -> 8863 bytes .../MicroBoot/interfaces/net/XcpTransport.dcu | Bin 5486 -> 5485 bytes .../MicroBoot/interfaces/net/openblt_net.dpr | 37 +- .../interfaces/uart/openblt_uart.dpr | 16 +- .../MicroBoot/interfaces/usb/openblt_usb.dpr | 18 +- Host/Source/MicroBoot/seedkey/SeedNKey.cpp | 126 + Host/Source/MicroBoot/seedkey/SeedNKey.sln | 20 + Host/Source/MicroBoot/seedkey/SeedNKey.vcproj | 233 + Host/openblt_can_peak.dll | Bin 396800 -> 397312 bytes Host/openblt_can_peak.ini | 2 +- Host/openblt_can_vector.dll | Bin 399360 -> 399872 bytes Host/openblt_can_vector.ini | 2 +- Host/openblt_net.dll | Bin 389120 -> 389632 bytes Host/openblt_net.ini | 2 +- Host/openblt_uart.dll | Bin 392192 -> 392704 bytes Host/openblt_uart.ini | 2 +- Host/openblt_usb.dll | Bin 375808 -> 376320 bytes Host/openblt_usb.ini | 2 +- .../bin/openbtl_olimex_lpc_l2294_20mhz.elf | Bin 45630 -> 45630 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/ide/lpc2294_crossworks.hzs | 12 +- .../bin/openbtl_olimex_lpc_l2294_20mhz.elf | Bin 97249 -> 97249 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/bin/openbtl_olimex_efm32g880.elf | Bin 194972 -> 194972 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/ide/EFM32G880_crossworks.hzs | 2 +- .../Boot/bin/openbtl_olimex_efm32g880.elf | Bin 141563 -> 141563 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/bin/openbtl_olimex_efm32g880.out | Bin 246320 -> 246320 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/ide/efm32G880.dep | 248 +- .../Boot/ide/settings/efm32G880.wsdt | 10 +- .../Boot/bin/openbtl_ek_lm3s6965.elf | Bin 250339 -> 250339 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 59 + .../Boot/ide/lm3s6965_crossworks.hzs | 2 +- .../Boot/bin/openbtl_ek_lm3s6965.elf | Bin 254065 -> 254065 bytes .../Boot/blt_conf.h | 21 + .../ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/hooks.c | 59 + .../Boot/bin/openbtl_ek_lm3s6965.out | Bin 429732 -> 429732 bytes .../Boot/blt_conf.h | 21 + .../ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/hooks.c | 59 + .../Boot/ide/lm3s6965.dep | 1468 +++--- .../Boot/ide/settings/lm3s6965.wsdt | 6 +- .../Boot/bin/openbtl_ek_lm3s8962.elf | Bin 119279 -> 119279 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/ide/lm3s8962_crossworks.hzs | 8 +- .../Boot/bin/openbtl_ek_lm3s8962.elf | Bin 161490 -> 161490 bytes .../Boot/blt_conf.h | 21 + .../ARMCM3_LM3S_EK_LM3S8962_GCC/Boot/hooks.c | 60 + .../Boot/bin/openbtl_ek_lm3s8962.out | Bin 180664 -> 180664 bytes .../Boot/bin/openbtl_ek_lm3s8962.sim | Bin 9351 -> 9707 bytes .../Boot/blt_conf.h | 21 + .../ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/hooks.c | 60 + .../Boot/ide/lm3s8962.dep | 510 +-- .../Boot/ide/settings/lm3s8962.dbgdt | 12 +- .../Boot/ide/settings/lm3s8962.dni | 2 +- .../Boot/ide/settings/lm3s8962.wsdt | 10 +- .../Boot/bin/openbtl_olimex_stm32h103.elf | Bin 115485 -> 115485 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/ide/stm32f103_crossworks.hzs | 6 +- .../Boot/bin/openbtl_olimex_stm32h103.elf | Bin 148484 -> 148484 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/bin/openbtl_olimex_stm32h103.out | Bin 250812 -> 250820 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 60 + .../Boot/ide/settings/stm32f103.dbgdt | 4 +- .../Boot/ide/settings/stm32f103.dni | 2 +- .../Boot/ide/settings/stm32f103.wsdt | 8 +- .../Boot/ide/stm32f103.dep | 1416 +++--- .../Boot/bin/openbtl_olimex_stm32p103.elf | Bin 184575 -> 184575 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 59 + .../Boot/ide/stm32f103_crossworks.hzs | 8 +- .../Boot/bin/openbtl_olimex_stm32p103.elf | Bin 201364 -> 201364 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 59 + .../Boot/bin/openbtl_olimex_stm32p103.out | Bin 327984 -> 327984 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 59 + .../Boot/ide/settings/stm32f103.dbgdt | 2 +- .../Boot/ide/settings/stm32f103.wsdt | 6 +- .../Boot/ide/stm32f103.dep | 1386 +++--- .../Boot/bin/openbtl_olimex_stm32e407.elf | Bin 326623 -> 326623 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 59 + .../Boot/ide/stm32f407_crossworks.hzs | 8 +- .../Boot/bin/openbtl_olimex_stm32e407.elf | Bin 283984 -> 283984 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 59 + .../Boot/bin/openbtl_olimex_stm32e407.out | Bin 576276 -> 576276 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 59 + .../Boot/ide/settings/stm32f407.wsdt | 6 +- .../Boot/ide/stm32f407.dep | 2272 ++++----- .../Boot/bin/openblt_dk_tm4c123g.out | Bin 437652 -> 437652 bytes .../Boot/blt_conf.h | 21 + .../ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/hooks.c | 59 + .../Boot/ide/settings/tm4c123g.wsdt | 6 +- .../Boot/ide/tm4c123g.dep | 4066 ++++++++--------- .../Boot/bin/openblt_evbplus_dragon12p.abs | Bin 250300 -> 250300 bytes .../Boot/blt_conf.h | 21 + .../Boot/hooks.c | 58 + .../hcs12_Data/Standard/TargetDataWindows.tdt | Bin 564936 -> 551964 bytes Target/Source/plausibility.h | 12 + Target/Source/xcp.c | 48 +- Target/Source/xcp.h | 4 + 120 files changed, 8059 insertions(+), 5816 deletions(-) create mode 100644 Host/FeaserKey.dll create mode 100644 Host/Source/MicroBoot/seedkey/SeedNKey.cpp create mode 100644 Host/Source/MicroBoot/seedkey/SeedNKey.sln create mode 100644 Host/Source/MicroBoot/seedkey/SeedNKey.vcproj diff --git a/Host/FeaserKey.dll b/Host/FeaserKey.dll new file mode 100644 index 0000000000000000000000000000000000000000..43e81d6ea5fc309f8c3c580a2609dee2813d9bd9 GIT binary patch literal 451072 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�RSX1R5p-Kg= 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 DYyQ_w literal 0 HcmV?d00001 diff --git a/Host/Source/MicroBoot/interfaces/XcpLoader.pas b/Host/Source/MicroBoot/interfaces/XcpLoader.pas index d9737548..0fb77483 100644 --- a/Host/Source/MicroBoot/interfaces/XcpLoader.pas +++ b/Host/Source/MicroBoot/interfaces/XcpLoader.pas @@ -104,6 +104,11 @@ const kErrFsrResourceUnavailable = $81; // Resource needed but not available const kErrFsrSeedKeyDllInvalid = $82; // Seed/Key DLL is invalid const kErrFsrKeyAlgoMissing = $83; // Key computation algorithm is missing +// Start programming session return codes +const kProgSessionStarted = 0; +const kProgSessionUnlockError = 1; +const kProgSessionGenericError = 2; + //*************************************************************************************** // Type Definitions @@ -148,7 +153,7 @@ type function Connect : Boolean; function IsComError : Boolean; procedure Disconnect; - function StartProgrammingSession : Boolean; + function StartProgrammingSession : Byte; function StopProgrammingSession : Boolean; function ClearMemory(addr : LongWord; len : LongWord) : Boolean; function WriteData(addr : LongWord; len : LongWord; data : PByteArray) : Boolean; @@ -1073,7 +1078,8 @@ end; //*** end of CmdProgramClear *** //*************************************************************************************** // NAME: StartProgrammingSession // PARAMETER: none -// RETURN VALUE: True is successful, False otherwise +// RETURN VALUE: kProgSessionStarted if successful, kProgSessionUnlockError in case +// the PGM resource could not be unlocked or kProgSessionGenericError. // DESCRIPTION: Starts the programming session using the following XCP command // sequence: // * CONNECT @@ -1083,7 +1089,7 @@ end; //*** end of CmdProgramClear *** // * PROGRAM_START // //*************************************************************************************** -function TXcpLoader.StartProgrammingSession : Boolean; +function TXcpLoader.StartProgrammingSession : Byte; var xcpProtection : TXcpProtection; supportedRes : Byte; @@ -1092,21 +1098,27 @@ var keyData : array[0..5] of Byte; keyLen : byte; begin - // init return value - result := false; - // send the CONNECT command - if not CmdConnect then Exit; + if not CmdConnect then + begin + result := kProgSessionGenericError; + Exit; + end; // make sure the programming resource is supported if (FResources and kResPGM) <> kResPGM then begin FLastError := kErrFsrResourceUnavailable; + result := kProgSessionGenericError; Exit; end; // send the GET_STATUS command - if not CmdGetStatus then Exit; + if not CmdGetStatus then + begin + result := kProgSessionGenericError; + Exit; + end; // check if we need to unlock the programming resource if (FProtection and kResPGM) = kResPGM then @@ -1118,12 +1130,14 @@ begin if xcpProtection.GetPrivileges(@supportedRes) <> 0 then begin FLastError := kErrFsrSeedKeyDllInvalid; // error calling DLL function + result := kProgSessionUnlockError; xcpProtection.Free; // release the object Exit; end; if (supportedRes and kResPGM) <> kResPGM then begin FLastError := kErrFsrKeyAlgoMissing; // key algorithm not present + result := kProgSessionUnlockError; xcpProtection.Free; // release the object Exit; end; @@ -1131,6 +1145,7 @@ begin // obtain the seed for the programming resource if not CmdGetSeed(@seedData, kResPGM, seedLen) then begin + result := kProgSessionUnlockError; xcpProtection.Free; // release the object Exit; end; @@ -1140,6 +1155,7 @@ begin if xcpProtection.ComputKeyFromSeed(kResPGM, seedLen, @seedData, @keyLen, @keyData) <> 0 then begin FLastError := kErrFsrSeedKeyDllInvalid; // error calling DLL function + result := kProgSessionUnlockError; xcpProtection.Free; // release the object Exit; end; @@ -1148,21 +1164,30 @@ begin xcpProtection.Free; // we have the key so now unlock the resource - if not CmdUnlock(@keyData, keyLen) then Exit; + if not CmdUnlock(@keyData, keyLen) then + begin + result := kProgSessionUnlockError; + Exit; + end; // make sure the PGM resource is really unprotected now if (FProtection and kResPGM) = kResPGM then begin FLastError := kErrACCESS_LOCKED; + result := kProgSessionUnlockError; Exit; end; end; // send the PROGRAM_START command - if not CmdProgramStart then Exit; + if not CmdProgramStart then + begin + result := kProgSessionGenericError; + Exit; + end; // successfully started the programming session - result := true; + result := kProgSessionStarted; end; //*** end of StartProgrammingSession *** diff --git a/Host/Source/MicroBoot/interfaces/can/peak/openblt_can_peak.dpr b/Host/Source/MicroBoot/interfaces/can/peak/openblt_can_peak.dpr index 70c3735a..819a675d 100644 --- a/Host/Source/MicroBoot/interfaces/can/peak/openblt_can_peak.dpr +++ b/Host/Source/MicroBoot/interfaces/can/peak/openblt_can_peak.dpr @@ -254,6 +254,7 @@ var progress : longword; regionCnt : longword; currentWriteCnt : word; + sessionStartResult : byte; bufferOffset : longword; addr : longword; len : longword; @@ -278,7 +279,16 @@ begin // try initial connect via XCP. if the user program is able to reactivate the bootloader // it will do so now - if not loader.StartProgrammingSession then + sessionStartResult := loader.StartProgrammingSession; + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + loader.Disconnect; + Exit; + end; + // try initial connect via XCP + if sessionStartResult <> kProgSessionStarted then begin // update the user info MbiCallbackOnInfo('Could not connect. Retrying. Reset your target if this takes a long time.'); @@ -290,8 +300,10 @@ begin // should be at least 2.5x this. Sleep(200); // continuously try to connect via XCP true the backdoor - while not loader.StartProgrammingSession do + sessionStartResult := kProgSessionGenericError; + while sessionStartResult <> kProgSessionStarted do begin + sessionStartResult := loader.StartProgrammingSession; Application.ProcessMessages; Sleep(5); // if the is in reset of otherwise does not have the CAN controller synchronized to @@ -310,7 +322,15 @@ begin end; Sleep(200); end; + // don't retry if the error was caused by not being able to unprotect the programming resource + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + Exit; + end; + // check if the user cancelled if stopRequest then begin MbiCallbackOnError('Programming session cancelled by user.'); diff --git a/Host/Source/MicroBoot/interfaces/can/vector/openblt_can_vector.dpr b/Host/Source/MicroBoot/interfaces/can/vector/openblt_can_vector.dpr index f3514d88..0e0660c7 100644 --- a/Host/Source/MicroBoot/interfaces/can/vector/openblt_can_vector.dpr +++ b/Host/Source/MicroBoot/interfaces/can/vector/openblt_can_vector.dpr @@ -254,6 +254,7 @@ var progress : longword; regionCnt : longword; currentWriteCnt : word; + sessionStartResult : byte; bufferOffset : longword; addr : longword; len : longword; @@ -278,7 +279,16 @@ begin // try initial connect via XCP. if the user program is able to reactivate the bootloader // it will do so now - if not loader.StartProgrammingSession then + sessionStartResult := loader.StartProgrammingSession; + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + loader.Disconnect; + Exit; + end; + // try initial connect via XCP + if sessionStartResult <> kProgSessionStarted then begin // update the user info MbiCallbackOnInfo('Could not connect. Retrying. Reset your target if this takes a long time.'); @@ -290,8 +300,10 @@ begin // should be at least 2.5x this. Sleep(200); // continuously try to connect via XCP true the backdoor - while not loader.StartProgrammingSession do + sessionStartResult := kProgSessionGenericError; + while sessionStartResult <> kProgSessionStarted do begin + sessionStartResult := loader.StartProgrammingSession; Application.ProcessMessages; Sleep(5); // if the is in reset of otherwise does not have the CAN controller synchronized to @@ -310,7 +322,15 @@ begin end; Sleep(200); end; + // don't retry if the error was caused by not being able to unprotect the programming resource + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + Exit; + end; + // check if the user cancelled if stopRequest then begin MbiCallbackOnError('Programming session cancelled by user.'); diff --git a/Host/Source/MicroBoot/interfaces/net/WSockets.dcu b/Host/Source/MicroBoot/interfaces/net/WSockets.dcu index c342bb0c7a5b40a8d53c16ca21270492fee8959f..ae43ac3a1edc03208267bcccc59e986b4058d01a 100644 GIT binary patch delta 29 lcmeyhhUv!|Chi-{GTbYsF)%a)|JcYa-pRtzjE diff --git a/Host/Source/MicroBoot/interfaces/net/XcpSettings.dcu b/Host/Source/MicroBoot/interfaces/net/XcpSettings.dcu index c3a07e1198db46d06cf906e062177ef5f3b746f9..d509a8f79650e4405a3d38b13c9115e4c3d73963 100644 GIT binary patch delta 20 ccmbR5I^UK1#@>>$#e)JbOcB- gG9Lqytjwn%LT7-~MdnKo&SWMLO-6>zx+0E@00812$N&HU delta 101 zcmaE>^-hcX#M}QO~^D!XF%6tk)RvR;)0a6#4F9AtuF6PNhBAQGWSvKp4I5GkN)`%Gv diff --git a/Host/Source/MicroBoot/interfaces/net/openblt_net.dpr b/Host/Source/MicroBoot/interfaces/net/openblt_net.dpr index b27bface..89aa2a3f 100644 --- a/Host/Source/MicroBoot/interfaces/net/openblt_net.dpr +++ b/Host/Source/MicroBoot/interfaces/net/openblt_net.dpr @@ -253,6 +253,7 @@ var progress : longword; regionCnt : longword; currentWriteCnt : word; + sessionStartResult : byte; bufferOffset : longword; addr : longword; len : longword; @@ -287,7 +288,16 @@ begin // we now have a socket connected to the target. next attempt to connect to the target // via XCP. MbiCallbackOnLog('Starting the programming session. t='+TimeToStr(Time)); - if not loader.StartProgrammingSession then + sessionStartResult := loader.StartProgrammingSession; + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + loader.Disconnect; + Exit; + end; + + if sessionStartResult <> kProgSessionStarted then begin // note that a running user program might have received the connect command and // performed a software reset to activate the bootloader. this causes a reconfigu- @@ -322,17 +332,38 @@ begin //---------------- start the programming session -------------------------------------- MbiCallbackOnLog('Starting the programming session. t='+TimeToStr(Time)); // try initial connect via XCP - if not loader.StartProgrammingSession then + sessionStartResult := loader.StartProgrammingSession; + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + loader.Disconnect; + Exit; + end; + + + if sessionStartResult <> kProgSessionStarted then begin // update the user info MbiCallbackOnInfo('Could not connect. Please reset your target...'); MbiCallbackOnLog('Connect failed. Switching to backdoor entry mode. t='+TimeToStr(Time)); Application.ProcessMessages; // continuously try to connect via XCP true the backdoor - while not loader.StartProgrammingSession do + sessionStartResult := kProgSessionGenericError; + while sessionStartResult <> kProgSessionStarted do begin + sessionStartResult := loader.StartProgrammingSession; Application.ProcessMessages; Sleep(5); + // don't retry if the error was caused by not being able to unprotect the programming resource + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + Exit; + end; + + // check if the user cancelled if stopRequest then begin MbiCallbackOnError('Programming session cancelled by user.'); diff --git a/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr b/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr index abb7748b..bb41c3e7 100644 --- a/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr +++ b/Host/Source/MicroBoot/interfaces/uart/openblt_uart.dpr @@ -253,6 +253,7 @@ var progress : longword; regionCnt : longword; currentWriteCnt : word; + sessionStartResult : byte; bufferOffset : longword; addr : longword; len : longword; @@ -276,17 +277,28 @@ begin MbiCallbackOnLog('Starting the programming session. t='+TimeToStr(Time)); // try initial connect via XCP - if not loader.StartProgrammingSession then + if loader.StartProgrammingSession <> kProgSessionStarted then begin // update the user info MbiCallbackOnInfo('Could not connect. Retrying. Reset your target if this takes a long time.'); MbiCallbackOnLog('Connect failed. Switching to backdoor entry mode. t='+TimeToStr(Time)); Application.ProcessMessages; // continuously try to connect via XCP true the backdoor - while not loader.StartProgrammingSession do + sessionStartResult := kProgSessionGenericError; + while sessionStartResult <> kProgSessionStarted do begin + sessionStartResult := loader.StartProgrammingSession; Application.ProcessMessages; Sleep(5); + // don't retry if the error was caused by not being able to unprotect the programming resource + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + Exit; + end; + + // check if the user cancelled if stopRequest then begin MbiCallbackOnError('Programming session cancelled by user.'); diff --git a/Host/Source/MicroBoot/interfaces/usb/openblt_usb.dpr b/Host/Source/MicroBoot/interfaces/usb/openblt_usb.dpr index 6fcad194..30c8316c 100644 --- a/Host/Source/MicroBoot/interfaces/usb/openblt_usb.dpr +++ b/Host/Source/MicroBoot/interfaces/usb/openblt_usb.dpr @@ -253,6 +253,7 @@ var progress : longword; regionCnt : longword; currentWriteCnt : word; + sessionStartResult : byte; bufferOffset : longword; addr : longword; len : longword; @@ -288,17 +289,28 @@ begin MbiCallbackOnLog('Starting the programming session. t='+TimeToStr(Time)); // try initial connect via XCP - if not loader.StartProgrammingSession then + if loader.StartProgrammingSession <> kProgSessionStarted then begin // update the user info - MbiCallbackOnInfo('Could not connect. Please reset your target...'); + MbiCallbackOnInfo('Could not connect. Retrying. Reset your target if this takes a long time.'); MbiCallbackOnLog('Connect failed. Switching to backdoor entry mode. t='+TimeToStr(Time)); Application.ProcessMessages; // continuously try to connect via XCP true the backdoor - while not loader.StartProgrammingSession do + sessionStartResult := kProgSessionGenericError; + while sessionStartResult <> kProgSessionStarted do begin + sessionStartResult := loader.StartProgrammingSession; Application.ProcessMessages; Sleep(5); + // don't retry if the error was caused by not being able to unprotect the programming resource + if sessionStartResult = kProgSessionUnlockError then + begin + MbiCallbackOnLog('Security issue. Could not unprotect the programming resource. Check your configured XCP protection DLL. t='+TimeToStr(Time)); + MbiCallbackOnError('Security issue. Could not unprotect the programming resource.'); + Exit; + end; + + // check if the user cancelled if stopRequest then begin MbiCallbackOnError('Programming session cancelled by user.'); diff --git a/Host/Source/MicroBoot/seedkey/SeedNKey.cpp b/Host/Source/MicroBoot/seedkey/SeedNKey.cpp new file mode 100644 index 00000000..b05a9b09 --- /dev/null +++ b/Host/Source/MicroBoot/seedkey/SeedNKey.cpp @@ -0,0 +1,126 @@ +/************************************************************************************//** +* \file SeedNKey.cpp +* \brief XCP Seed/Key algorithms +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2014 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifdef __cplusplus +extern "C" +{ +#endif +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +typedef unsigned char BYTE; +typedef unsigned long DWORD; + + +/**************************************************************************************** +* Defines +****************************************************************************************/ +/* XCP dll function type info */ +#define XCP_DLL_EXPORT __declspec(dllexport) __cdecl + +/* XCP supported resources */ +#define kXcpResPGM 0x10 /* ProGraMing */ +#define kXcpResSTIM 0x08 /* data STIMulation */ +#define kXcpResDAQ 0x04 /* Data AcQuisition */ +#define kXcpResCALPAG 0x01 /* CALibration and PAGing */ + + +/**************************************************************************************** +** NAME: XCP_ComputeKeyFromSeed +** PARAMETER: resource : resource for which the unlock key is requested +** seedLen : length of the seed +** seedPtr : pointer to the seed data +** keyLenPtr: pointer where to store the key length +** keyPtr : pointer where to store the key data +** RETURN VALUE: 0: success, 1: error +** DESCRIPTION: Computes the key for the requested resource. +** +****************************************************************************************/ + +/************************************************************************************//** +** \brief Computes the key for the requested resource. +** \param resource resource for which the unlock key is requested +** \param seedLen length of the seed +** \param seedPtr pointer to the seed data +** \param keyLenPtr pointer where to store the key length +** \param keyPtr pointer where to store the key data +** \return 0 on success, otherwise 1. +** +****************************************************************************************/ +DWORD XCP_DLL_EXPORT XCP_ComputeKeyFromSeed( BYTE resource, BYTE seedLen, BYTE *seedPtr, + BYTE *keyLenPtr, BYTE *keyPtr) +{ + BYTE i; + + /* Feaser XCP driver example key algorithm for PGM simply + * decrements the value of each seed by 1 + */ + if ( resource == kXcpResPGM ) + { + /* compute the key */ + for ( i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Host/openblt_can_peak.dll b/Host/openblt_can_peak.dll index 19eb3c7b54cd438229238338252fa08500f6b08a..fc39d61e61239db8996782b642d82bc941106687 100644 GIT binary patch delta 13172 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 B6W9O% delta 12839 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 GMgI@OYkbiF diff --git a/Host/openblt_can_peak.ini b/Host/openblt_can_peak.ini index 99679d0d..98acacfa 100644 --- a/Host/openblt_can_peak.ini +++ b/Host/openblt_can_peak.ini @@ -6,7 +6,7 @@ extended=0 txid=1639 rxid=2017 [xcp] -seedkey= +seedkey=FeaserKey.dll t1=1000 t3=2000 t4=10000 diff --git a/Host/openblt_can_vector.dll b/Host/openblt_can_vector.dll index 0b5ff7f3df9b77b671d5431daa52745f80f90ce3..10688c4d014a4dec698e52f0b2a89968cf360829 100644 GIT binary patch delta 13207 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 nKrrV?1i20bZ$612&w=3JlL$&32<|b(B}RHLUI diff --git a/Host/openblt_can_vector.ini b/Host/openblt_can_vector.ini index b750f89e..571a73bb 100644 --- a/Host/openblt_can_vector.ini +++ b/Host/openblt_can_vector.ini @@ -6,7 +6,7 @@ extended=0 txid=1639 rxid=2017 [xcp] -seedkey= +seedkey=FeaserKey.dll t1=1000 t3=2000 t4=10000 diff --git a/Host/openblt_net.dll b/Host/openblt_net.dll index 6fa5405e307c47e4e4441b1f462314d2e1f99d24..8936b1bcece5f4c51ce652add9d0016fc9f679e7 100644 GIT binary patch delta 41191 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 XFNlk;ii>ZKi&w?Px7GemPMYu^4hVd( diff --git a/Host/openblt_net.ini b/Host/openblt_net.ini index f319755a..d659c657 100644 --- a/Host/openblt_net.ini +++ b/Host/openblt_net.ini @@ -3,7 +3,7 @@ hostname=169.254.19.63 port=1000 retry=1 [xcp] -seedkey= +seedkey=FeaserKey.dll t1=1000 t3=2000 t4=10000 diff --git a/Host/openblt_uart.dll b/Host/openblt_uart.dll index ccf0bc440cd7aa608b4459c63b6ba09f0971d7bd..6fde1e8f9e2c13be819686c592ff0f3cad583e9e 100644 GIT binary patch delta 12629 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%0A}#r)j>I%&%ap zOg7!aqy8x>^Oh~iSotCHFmsUe5}@#hK+ZeZjWmf$k=zd=W%fsZORA&r8uIu|w$Ar- zYY?}kW4?3)3VIHyT^I_IZ0By-z^6P5$!5a5&i#BUnp@eFq}0*~oCBP_6VdBZPJD_T z51MampY~&Foa;p++RG9$@|ifp*-wIdQOnKdSSr8o2U*|ekhPjSiqKJXq80E3130ml z?~39vnY80U3F(B9ISe}s+nt;=1jo}2ctTkwUAut@h@3S_o1LZ>Tn@_NppWdi5&x zM)h{}4t2hIuewluP+d&D-jmIV%Gd1G6lxA?iZvyg6Pi-Zc}leEcn^Lw&c83S|!bxNI9XVs0?jn$><7U}48anqgXF+GN^c+GW~nDx{Z_WiQbDELq403uPpu z$ozx(i20cLl=-arg1Ov$)%>&hSMyEtZS!3-XX$DQu!LI%Sw>irEpshzTGm=Vw0v#3 zZ286Vx20FikeFF93u9Kstc%Hu`7CC4%*mJ^V{XU%5z{#~AXXVWF?L35X6&liov~lX zo{7B_dq1`zmOD>4Id1d8iZDfgMXX}zFvS$b%Ze<;N`+1FnPRu1R8gk5t9YR365TDj zXS6DMO!U8_w?rR}z8&qWR4KI3`GZnW%2ispCsVZzFN60~es~d@GDjBJK3$!s z?yu2nhS8Dl$p+Ca*|K(2PGtcZ4h^rBX+zTt z>!UYEAC7iJ4^j?BSmi4(Dt}e>Q6;PLRG+G@tKLx)jo~Ftxb6p?M!(JwVw_~0V?1ok zGwlcQMw8kcW9A%$Q@|?s717Z#$~Tl>Dfg&KR8^|mswUN^>Z59hdWPnf_P(}3>#6Ik z^V5as!Vo`+x)Hibx~WiOF6}Z~W}xPcGHb>>z15gvOf#-GzGvKM++^Hh+-}@q+-1x+ z?lqn=o;6-KI*i2RW0ITvOhKk#Q>ZD-)ZY|oGMe5rT`~1D4>M0j96T@+OM7@e(lXzY zZh0SGFR`4o+_%(Q`ox6CjEWf(voz+Nn9A4(%%_};V?U4uD0(Q&{S|}Z&$)_s6;$!P z;)p^}{H}N^Iw(3OIzD=Ov`QJP9HD$kIa9fu@~N_?GK!U#VJty;U)h8;=c@`*g{Vxb zMAZn@YpP|c<*F}L->D9&Zm9;VsrtT}({#}2G}ATnG)pu)HI15ZtwB3myFt5I`>pnX z_7v*{nwKUu#>zeK-We_8*F-rq3Pu*|U8@SUL~!*I?} z1&`k|bT^JNPBRu7PZ%qVzZ)MKMdOR638wX?Bc>ka>E<`hRc0?su;ppXK+D^f9Lpig z|17~V{bMG@ycdH&kjpqT48Z(etE^K#Qnr&+>8%=|QmM?U1gJ9x3T3L+s6J3_R_#>f zs}3P<Y0scx#`)X%Bss8_1jssE#{RXYoVKr*S;+|=CF)Inbl zZ3nGf8>9`<4$@B1Zr2{ymTSFr{Ox+6IM%rtmY!2O>Aq%FMV25{GPcMTOO=OPWc{Q{udT9#9soNtb@P9|DV&=+ z$B1NXmHGbzkmLr~(-vTX8{n6=0PEcVzW;55MZOy#wk^PUH^BV101h|6=C%NEru4_u zJl7UL;RX=f0wlQs25oCYiv@0gDQyAPy8+g<1;}>;9BK=2-VJcCEr6pHP|$0;?ArMM E1LAJIc>n+a diff --git a/Host/openblt_uart.ini b/Host/openblt_uart.ini index fe11aa00..12b4d97c 100644 --- a/Host/openblt_uart.ini +++ b/Host/openblt_uart.ini @@ -2,7 +2,7 @@ port=3 baudrate=8 [xcp] -seedkey= +seedkey=FeaserKey.dll t1=1000 t3=2000 t4=10000 diff --git a/Host/openblt_usb.dll b/Host/openblt_usb.dll index b7ae27f321437482f1635cfc8b7cf3318980939d..52b30116dfd6bc0de540f886e117d9e61bba9d71 100644 GIT binary patch delta 12545 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 diff --git a/Host/openblt_usb.ini b/Host/openblt_usb.ini index 6a8f24d1..16d7f206 100644 --- a/Host/openblt_usb.ini +++ b/Host/openblt_usb.ini @@ -1,5 +1,5 @@ [xcp] -seedkey= +seedkey=FeaserKey.dll t1=1000 t3=2000 t4=10000 diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf index 0d5ee156d525087ea993b3e3e5cd4c59f60f1fd3..92c3c32303af3c35c4d4689b4d7d2dc1db02425f 100644 GIT binary patch delta 1089 zcmX|=Ur1Cz6voe)*#&W3-F0_$*W8Gp5LT>3b2l-fsE1T^4bq5wh)feI0;8AIrC1~% z1Y_)>ULwf;kYMCnsPqpCA0m)20u@5YhYdk|h)n1^_g?S9+@1M;-J&8VXx=~b)Di_ApMB|isl!_f{;7#FgEG~!g5o}HP5iZ8EV&5!+GqKbY5s*{n zH?p)CUpjucjl0FQAB&@?)H#4XwV?57z5`Nm3|c$NMo}rXkjp~Pm<#C`pEbAe&6)e@ z1TUF)=?Je*FQ&)i*%i$pUEZTSc#z~(l_-I}?cs3mf#w~pQM5dZCchn7-lN{et2mfc z1$MN&MvY4s?%gp-@%2N+EqYw_B>S|#Nf$M>wKiW(CiTo>?qw$O|bb61s?xzM!GdO@tZLMTm7_2w@moLI3A{U*Exbch3L!e4Xc{IVfYJ9DB_Gy>rlvjh=F4qd?!JNZA`2wV9hE zP8&r39Jgu1+Up&5TL228T&oQWHY(y|{Xq2&>bKE6dl@dGb_W?QE8usa6jg)uIjq`d zS$1m%N;|08MjtrY2oXJW(1>~DfwQO2Gr5GWiBh`ETk#X|^~jV8aWh|t&n_X#%$wmi zU1oMb4Bo?$KY-O=3@WEJ#0@>>dlP((?|O+42_HzMe%~0TD!qztjn0pSDWYp)6*Q#} z$M$Wlqn8H!(&(EA@=>MzxSALg)swN%?gm+E8DJe 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs index a33a434f..4f2416d1 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_Crossworks/Boot/ide/lpc2294_crossworks.hzs @@ -51,12 +51,12 @@ - - - - - - + + + + + + diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/bin/openbtl_olimex_lpc_l2294_20mhz.elf index d2131ab4aad0d7f700f43c3ad2702aa2bbe0ca31..36d0618f01316cf2f5da966281c67fecd5bfb26f 100644 GIT binary patch delta 936 zcmX|;O-NKx6vyxX-8VTp@68)^rbaRQpbt|U8I&YVrZ!=tsRf}$wn!ZpeNk=#Kc+-1 zE5Wk7n<$~oAjzP@MY@Zqo#8r5407ShMMfZW&U>%-7VqBk|NYNB=bpQ??ps>--FS!f z42-Hj8Q6z0wbPFi{zv&&G$HhdGu?hv08no-5lKU95<;L!7@b71dPoXU#L8on?bz5& zK|6_2TMW*#XrhOdu&r2eA1T=y#vw##iGCFDUS#Whbj~bU@g1-dY+Tdu#WSvHY1?TP z>YOIA?4fMwkaJ8HHEeif(K+2pFzJ)nLLE7E`<$HIqg-)M;Zb?r_gUkr9PbZP^n8UaG??4wns+nw~k!wxXge?D8y!+8brRb3`FwsZGM;J z=pfziIVHAGfbFWrKmp?FjDZpqsX+rtl&G(~#8iQat;DKKvJ9wZ6A4r(#bTv;Z=!Tt z6|U0TrM0vogB%fvZn2H6_ih6Y~h;B40zlA+G zsmd%Iz$umDs6`E1*iSV-Sm?kvwIhTGe$G^e@VfZmO`33Lnf%q;PYZoAE0xRK3HiVoo=S_Ds>g4!^Go@Zv7Im|oH|M!1B-ezCtb! zlj?UKc3@gn_;A=aReD|%LchB>>_a0^re5YFoG#P4g%Ic#<{(k5?Uh1Qv+~f-cH}B4 z=qE8^i-C_U=3#`CkgZs8gOoZA83+-~(u)HA78`XgUG$c$_ybriYz#9;%ZLImu*Q!(WfAJJqcgCNmP7X(FfZjFVH`${lCvPIUA#eahBZOpy?*;VInj zw)`{&8QT=Ms_~xNG-MRizPFmJ!1OG3%?2N~jsdMuh)p^Th>)^OgiAs;zeRFn zobLCG5_>5?soG~EiVk(mL@g@RxQQex)h9lxRn(6%)T%vxvSd_`A1#O}#bR8&_G9Ok zMqHqOS29bTs;H!h@Q#-@2(gWeH{A~)TJ%5@5nk|jl8>`|P{jf`fmU@pfMFa`J`3B? zuIer9LYGQ$bVS{;P=_n(jfDYxQCouu=3HKgQck?N5Cq%@Naoo#31aXB-Zx+Z_9@@ABq*GH0l4gGyGKPG>wL^FCYwU}wf Hf&Kpgu#utD diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/blt_conf.h b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/blt_conf.h index 0a0e3187..00cea9f8 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/blt_conf.h +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/blt_conf.h @@ -155,5 +155,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c index b19c1d11..3bc96cc4 100644 --- a/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c +++ b/Target/Demo/ARM7_LPC2000_Olimex_LPC_L2294_GCC/Boot/hooks.c @@ -227,4 +227,64 @@ void CopServiceHook(void) #endif /* BOOT_COP_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_Crossworks/Boot/bin/openbtl_olimex_efm32g880.elf b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_Crossworks/Boot/bin/openbtl_olimex_efm32g880.elf index a67dbd0b3268a37aa488bb9a7362603ee1fbf3a1..89f4ad14a5bc0d102bbe23a75ce015723da3b72b 100644 GIT binary patch delta 1242 zcmX|=Uq}>D6vpqFJ1ga^Ypa{PuI;)iE~e%x37M&d^@B$<2=l8&iDJyy=U${6FJZ#2imLO z`R-mKzqHrZKa$oW#U_Y^MLBg`2)Qw9E9g>NdsT8&Wo88w8E3&nX1hd=%B(;jD@#%1 zayR5dqSS0p^^tWL+K57qYe%jKlxGSRd$Z+ReKU}qx6)HoCqGCfkAl)!5zO)ARF%}r zg>XfQd`|ot@2)soQz}2|{^A=nI~yv#J9wd&HjfE`CcT;v7HUrxf?5f}6@IE%Ojx(E z){rZh%ZNqz5;|bIKASzCriMQgk+zq@LZ?DhOF~!^Wh_H1lGH|iYoSz@xP9s{4I@g- zppBw-n$duXrVaE3Xo=C7iI(EXwr6KFK@`UF^cDOyww<5>7OV@{&xpUP98bnP$+tQM zy(H9dXK-pQ*rU)wq$)?P7h2+-bpW-gM42XPQ{!kA>)W}raJk9sM%R~7rtyl+Cen-* z*HE_4We-iXZ&Za)WtT)xO=Oqx&E|o&xN6cwTSnD*7%aqPt0oH>W&ePNxcyBN4H@kV zpczJgOf+L4KhO@N6h6-QRqhz*9ndJ>_jwbIrpK=Q#Qob3fVyz7_GEk|>GjLbN>XC? z(Jubh2@zb#o`U z7#LLUp04Vys3%-UW&9cLpG+2ccj3kCU1Hu2PXoDdEr{Jq|-L(QzlnQ!-P PM+di~^kzG%%$NNK{x!4| delta 1242 zcmX|=Uq}>D6vpqFJ7eXpYwG5%YrE=-t7+>h37M&dMVPuILIypE5CvsKkWhxYkf2~f z#qv-2>+Ip6O)_nx`;OnBE4-nG2> zS?u~N$S2bpg7>AhRIv#np(#fX2_e^KY$cuQ)e)8KwK;hKMaEfsGP5X=y(TXZ$jejI zxZDkSk0`_Iu1i>lpbaQwZ%nwtP@XGP=JCp?z8UZqjr5c@$sbZFqIT)1ZqIk;*Omw6 ze5kryju5{dbyuILuaLiVU)dFUHq%>nbKrCjZ5|W?O?oUsXw;S}1ho=`^ZeAZn6z$V zt+7BbmtjrhCUw9Robk?Os-fRRWZ6k);fX@jKtfoPWh_H1Qq*RCTY58CnqotTX_!)C z2Fp{_t}yC1(TagS0c|iEH_=8M*>=(xjS_{hJbea#i)}}#p9SkY_A}zB%JEptlX~r* zpqGRi?hH;#EB2_@h*Txfdc79!tOKY^CCV{Tml{XQSl`c`g{n;EH@ZHDvO-?*vWW_f z71vN^lSFq-WRvj~dr{?Q^w>mx1I+>L^JcG1v~TP+5ds_LvSpJE8)g51Cb|7h6HOZJ z3!qg-dnQ^nkPk@Z?$h}=<5#H~-MuZY+pNqb8Gg$>Z0Ml%1#|#7&;l$Y&^YB*jLtfpwnBPTu{gT^LLa%u$T(j&t zmLfzp2J9hQhhQJm`to&Jk}RKS_UhNe?>tn9yEu zC%70GRPLV6>CT8dbb%`QGhE-8Eb#8agV{UFybYd<)Xe zKrfN!D{qOo8+i+5 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_Crossworks/Boot/ide/EFM32G880_crossworks.hzs b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_Crossworks/Boot/ide/EFM32G880_crossworks.hzs index 697fcb24..f8a21e17 100644 --- a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_Crossworks/Boot/ide/EFM32G880_crossworks.hzs +++ b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_Crossworks/Boot/ide/EFM32G880_crossworks.hzs @@ -51,7 +51,7 @@ - + diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/bin/openbtl_olimex_efm32g880.elf b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/bin/openbtl_olimex_efm32g880.elf index 0daebe7876d93f0e21d55f8219129d420f32ec30..e757137f449f8293aba419e10f9c54c04efb86eb 100644 GIT binary patch delta 1172 zcmX|=O-NKx6vyxX-8aMFIORBFGk%PYj!qxe=%f&sPNp-7HKj(87)B963$aB-1?D6~ z)Iu||E`^I0*#`-M1yW>Dwrf#AWkgv?iy(=xML}4d^XB3knh}$=_n^QH!$VDC>h9)9s6FeElY(YsYZab2^%}FkGlU?s zz_6E_kNGnC@H&OaGQ^xA7F{T{6sO%!%AAH->+Ex8y$_8}NZ926NAk&jO>ts$7Q z(6nj#&8A+78jJLrrcO4U(Xq`UXUvwDv*)&sZj0PDNgI=|I!;^UYnm*X@)F70gleiJ zla7wz3A+$J}S# zh!>pwq>u$pPJc#N^~es6P9MT@F>{i zTZo{eoiDv@JlO;}u)R-*H&#@v*=VYSP2&-gvw*j*xT3;Rd4}XX;HlE=={TMtN&l)> zbEE~n3VB&WNnwe6s;<69u=&yPNK!ttJK6)$P$(KGEe^@+$0G899E{4xJ+-o59+HzH zva?G1YIlbMp;&aYd?#wx$*VoVXr-Kz?W^U@o}ipkt~bJg zJ^y%AwAh!qvvLPZ28OVaDps>Q( z$eIex-TVza5Pr=-kH@bW4i7w9$z;mFd5=uFq)jwW4NQ3CsY`wl%{B|Sh2)&$wpsad ze+ud|@s}s+GxG#O8V$VlNTXZsA0hP?{KnGd>)mR#a)nDk!XuZQ7K?h0^$N&wZ@cKL zuoM`Fbcz#_>I*u75e^jmCpE_5tnEr(PdGU%j-Dj^?r7K~p~bzD8PP|+L1`{xIMsGj zFvDJB{^N2Y789=6Vm=n?cw+~MRye`ZQ3)o}p{Q%n6e zx+Ekw_-r7W^U!D4q>m!Htgz7|mtE0!BD!i~uSc%BmN$rI+C;BMrd_f}h-u-XN6ftC zD`#yc_71dgCk1?UT)E>T3OSE#JLbo$h{E!|ZJe@J+Aqff*C~6!u`^Mk@-;4;Fd25~ zd+lgIr+(Frc-3mOass=2#SklOn zWHnJlhGA_1(Icroq3@@$2?_nL2wQYzhJPFM#tbS;el;j8c3tG;S}C8_$1~`}7JVaw z&B*Ha89rr~F6-dmx4Nx^r9bHJJ8&>GJI761>I2VFT>7sY6_e*CA9kPw7|<`bpc(sh za4YIdcE~7L>Io?7@0LgJn#^v68r(N#!cJ9H8x{d%88Sj@9n=W>t-v*MIztXy@2KBCFo`{N0gcES8MaR>#y&eF-(EhLdW% zzg1mVr_=*V99pkJt%qZgSSs12o>A*&^<#fD*{nXP?se)ye^hjW->5~cYFQ^z#O!q diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/blt_conf.h b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/blt_conf.h index 53066665..d42b95ad 100644 --- a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/blt_conf.h +++ b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/blt_conf.h @@ -128,5 +128,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/hooks.c b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/hooks.c index 399852ff..b1f16f47 100644 --- a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/hooks.c +++ b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_GCC/Boot/hooks.c @@ -213,4 +213,64 @@ void CopServiceHook(void) #endif /* BOOT_COP_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/bin/openbtl_olimex_efm32g880.out b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/bin/openbtl_olimex_efm32g880.out index 559120f13f97b0d0936477aa69d65ebb5e04bafe..5bb727a6b5d7ae7f9d3d661c6d029dd5e7606dfe 100644 GIT binary patch delta 3282 zcmZ{l4Nz3q702Iy7f^Wb?ed|B)? zW7R0q0iVfHu<|M0R1zhKtAN3vF(V=(UjizOij)$oQEH4yi9L5O%kDZj!#-wz|NlAn z+;i_cd-$)`!~C}}5>dvY$W+7_K9jRB%dk)WAp9dmQGR2KUow9A@)f^bG(Uccf=%$l zI>z7iSCkFR2-(NUZ8><=uqvM7W-Zt(}d z=S5fjM)3I={oB}Sc|p3;-Oe_DBcmZJEFnNwCb24%V{SFUh-=IV z%VqH$7Ry3Iv|T5g)%iFX(UZ9nbV z*x8oeoiVGuT3=tf25QnCr+Ljaq;AE=Q5$Wh8rN?>bUP+*oY( z^{D*_?H!MA!=6z4N0ed3+m1o6;(@Cq8aNTBdd}T35wp5`nAe^c;gOZE&LeTDP6l{g zF(`}a^B7DB=@P|Vna0D8??fAIj>H?D!VW1sq>f0;^c40U+ zfAbr!A=QNybBgXkt2@NgU2GoAY`GD7EbjpSWHJ2 zZu?TrRQ$oSU@;I`Nu&wWVDl_k3_}*a^P}Qv-UW-%$4UeJIM%ygV(hW7g;F0A#K>de zAX%qlwdW#Y4zkeVPkW|&*CnPKE89q&;oTK6*;ueU*3ZDC30j&C|DfJxADB~hs@jh^ zYKe}4aFQbWRT@^PtvW_ZaGj2&VUM;;N3aBc($;Ov(V7e_ zQ@__SR5~8eoea!Zb1nSS?p(%Bb2Aa67F!S@!7(bzWJkLN0|T9oRvMm#En1S*1$J7g zI1Ag=0xL`doR&O_&PJ4$s>4?%A)O9p<5kVxO|o_B%;pW|=?Isek7>aHt8buw zIas3J*Wn`_cO8j22nf-R<^#PX`joPc zFlvI+v*`$pEy8%^qkdc$}S+s38ZLO7`-H1CUZT#@fj}YSx12g*~7G>^otVYYE_JaB&wjh zCD@?dVKPJ}|BBY1M1!8@;JrQV%$@2W+vixX7c;UBa-w5SG=!|Bh}LTbSDpN#oA;)a zQcTiHJ_hE$PWCSls~*?! zv}{NL^*)2?>U9RPnkHJzK-*zKFA26<=-e61($Xv#&{yuk;&|~(>@tZonoL|k6=z{n zE4mN5jDA^$32LK`-qKM=JIi>Xb{)N*a%O3z|CAv{dw2{mOUr$lcn+(zHr~M?Nm}UK zIn?RNg+O0P5)0{*a-7llK47Rk_k*nP~DLnrLtZ7HQuy36cl#U)o)PcSI+; zE+Tj0sSB8*UbMhpWO;B%yz$)XK>E% IO?O)V540}jg8%>k delta 3280 zcmZ{k3s6+&7018-t_#AwcbA7ETBDK_Gir>c)^^$^)}%IOGzdP>s6?~HXVsech*n2q z0#OU5F<#!oP(Pn5Zv`*n6(vhiPiK~)y^=~{Ikeur15h359q#E4-+H1Ikv26UI6tG8CC_x;$S2|J61Fv~4| zY|;1pEe$#Pn3@oNN7tl;USww>I}_No)9t*dYqcq8(ht{$@cVpiYG@}L1D_M3j7?YE z#!h`>U5e??KKh{g-p1e0>oY=geKe88);aeMFUZ(mLe&GgemG>e8164bp)rarVWHLQZg z9V{BcTDMr?H`rL^ufydUvzvzZjrZ4t^?B(^aXaJv_0*>H(1WZ_WYtiPyVZkwOmkM~ zMHV-(Sjj>IKZ?9P7xjKEtv(M<74Emh>v^{#^+{J&^xBn}vEOpdyf*gj=NAdn?Uwud zEI0D&uKX5mquoDNn6eIY*yo@-FJWfC#|42KB$ny#w7wqP&1?Cz(rq%Ar zjckJ%>_lc-JxTRoruxMExh=+~ae1Ou($}9_HQ33-`#%SLaYWU#ctq zURMlaF_lcl_~0(lxGU3m*zujXMsX2%(^E*0LI-t3V5X`}4Gp&hyB$X8Q()CE#JtK^H$r1NxMigfD@+kML6n6KZ(kQ&)8Dfk+4#}Yr zld;S*#29-lBwFamWbY7T7_yQ{KbrE$-lb4ViBr4_HijZc)YH93B8)-E!d+T8)w^J0 zIT}mS@4nKx8F{#!rLYvtVNwvar*aPEPYK*cg4R{F|PQ_U@N4_E<=zJ&y>+ z$YbFG*`{N)=OV@&WMPv(?V9dgmoeQ~Nhf87cUO$b#zLuM{R~VTuXd{N3+!p`!Mj$e zW{4&52$JBYN--(erfks=AW0l`q~MQAUU!mQ zT9b-pN`rD> zlj-=AvfTz#Kc{6IMP(pTy{p0^ll)7i&oc0;8mGC)LzNz6@CLVO2$P+2%%JJ^% z3#d;PmMGO4dPqm5`84JPK2VbjfL_5)w38}NV2yg5Nl1{B6j0fB@U=l8S*m;zGaT3%>nGBZ6%V_->G-;hof(JNr-#te560BFr0oVpQkxp-w;90VrMU;BPz={(e z>c%}O`79=?$+^HB*|VMW{aHLza|;1Q)|^BCJBK*+ER#XfbIOreia@A8s8A&7R4MyB zqLm~K17th4Q_nI?H*VwrSxX@;W}vod@Ri`IMiph4rFLrQ*IVvDbG&c?J4{9zRVLm} zm%e~q$>~1kO!{Rx#w$lP^puV~+E&gBo#(tyIkS||?Q%?3>y86vX{n|O6ucr zqt_ca$1a#xVM-0SlDd-ElV!ny54f!zSYzsO>VADuuoAv;;>frV(qEw%)Fx zc9mKixh;tyuA#Pt5}Qz}l!myre1>K 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/efm32G880.dep b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/efm32G880.dep index 384de8ca..1325bf38 100644 --- a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/efm32G880.dep +++ b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/efm32G880.dep @@ -82,8 +82,9 @@ $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\cpu.h $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\flash.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\flash.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\nvm.c + $PROJ_DIR$\..\obj\efm32_msc.o $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\nvm.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\nvm.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\timer.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\timer.h $PROJ_DIR$\..\..\..\..\Source\ARMCM3_EFM32\types.h @@ -102,16 +103,16 @@ $PROJ_DIR$\..\..\..\..\Source\plausibility.h $PROJ_DIR$\..\..\..\..\Source\xcp.c $PROJ_DIR$\..\..\..\..\Source\xcp.h - $PROJ_DIR$\..\obj\core_cm3.lst $PROJ_DIR$\..\config.h + $PROJ_DIR$\..\obj\core_cm3.lst $PROJ_DIR$\..\obj\core_cm3.o - $PROJ_DIR$\..\obj\main.pbi - $PROJ_DIR$\..\obj\timer.o - $PROJ_DIR$\..\obj\boot.lst $PROJ_DIR$\..\obj\vectors.pbi - $PROJ_DIR$\..\obj\timer.pbi $PROJ_DIR$\..\obj\system_efm32.pbi + $PROJ_DIR$\..\obj\timer.pbi + $PROJ_DIR$\..\obj\boot.lst $PROJ_DIR$\..\obj\efm32G880.pbd + $PROJ_DIR$\..\obj\timer.o + $PROJ_DIR$\..\obj\main.pbi $PROJ_DIR$\..\obj\boot.pbi $PROJ_DIR$\..\obj\efm32_assert.lst $PROJ_DIR$\..\obj\uart.pbi @@ -126,7 +127,6 @@ $PROJ_DIR$\..\obj\efm32_vcmp.pbi $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h $PROJ_DIR$\..\obj\efm32_mpu.o - $PROJ_DIR$\..\obj\efm32_msc.o $PROJ_DIR$\..\obj\system_efm32.o $TOOLKIT_DIR$\inc\c\ycheck.h $PROJ_DIR$\..\obj\efm32_cmu.o @@ -270,7 +270,7 @@ ICCARM - 96 98 + 98 99 BICOMP @@ -280,11 +280,11 @@ ICCARM - 125 122 213 236 118 229 216 214 + 125 122 213 236 119 229 216 214 BICOMP - 125 122 213 236 118 229 216 214 + 125 122 213 236 119 229 216 214 @@ -297,17 +297,17 @@ BICOMP - 104 + 101 ICCARM - 125 122 213 236 118 229 216 214 0 5 3 4 181 180 1 7 + 125 122 213 236 119 229 216 214 0 5 3 4 181 180 1 7 BICOMP - 125 122 213 236 118 229 216 214 0 5 3 4 181 180 1 7 + 125 122 213 236 119 229 216 214 0 5 3 4 181 180 1 7 @@ -326,11 +326,7 @@ ICCARM - 255 9 125 122 213 236 118 229 216 214 0 5 3 4 181 180 1 7 16 15 - - - BICOMP - 255 9 125 122 213 236 118 229 216 214 0 5 3 4 181 180 1 7 16 15 + 255 9 125 122 213 236 119 229 216 214 0 5 3 4 181 180 1 7 16 15 @@ -349,7 +345,7 @@ ICCARM - 11 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 11 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 @@ -368,11 +364,11 @@ ICCARM - 13 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 + 13 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 BICOMP - 13 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 + 13 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 @@ -381,7 +377,7 @@ ICCARM - 107 211 + 108 211 BICOMP @@ -414,11 +410,11 @@ ICCARM - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 255 16 15 29 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 255 16 15 29 BICOMP - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 255 16 15 29 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 255 16 15 29 @@ -437,11 +433,11 @@ ICCARM - 21 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 21 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 BICOMP - 21 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 21 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 @@ -460,14 +456,23 @@ ICCARM - 15 23 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 31 + 15 23 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 31 BICOMP - 15 23 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 31 + 15 23 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 31 + + [ROOT_NODE] + + + ILINK + 223 237 + + + $PROJ_DIR$\..\lib\efm32lib\src\efm32_dma.c @@ -483,11 +488,11 @@ ICCARM - 25 182 122 213 236 118 229 216 214 184 183 255 0 5 3 125 4 181 180 1 7 19 16 15 + 25 182 122 213 236 119 229 216 214 184 183 255 0 5 3 125 4 181 180 1 7 19 16 15 BICOMP - 25 182 122 213 236 118 229 216 214 184 183 255 0 5 3 125 4 181 180 1 7 19 16 15 + 25 182 122 213 236 119 229 216 214 184 183 255 0 5 3 125 4 181 180 1 7 19 16 15 @@ -506,11 +511,11 @@ ICCARM - 27 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 255 16 219 184 + 27 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 255 16 219 184 BICOMP - 27 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 255 16 219 184 + 27 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 255 16 219 184 @@ -529,23 +534,14 @@ ICCARM - 29 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 16 19 15 + 29 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 16 19 15 BICOMP - 29 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 16 19 15 + 29 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 16 19 15 - - [ROOT_NODE] - - - ILINK - 223 237 - - - $PROJ_DIR$\..\lib\efm32lib\src\efm32_gpio.c @@ -561,11 +557,11 @@ ICCARM - 31 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 16 15 + 31 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 16 15 BICOMP - 31 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 16 15 + 31 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 16 15 @@ -584,11 +580,11 @@ ICCARM - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 33 255 19 16 15 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 33 255 19 16 15 BICOMP - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 33 255 19 16 15 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 33 255 19 16 15 @@ -607,11 +603,11 @@ ICCARM - 125 122 213 236 118 229 216 214 35 0 5 3 4 181 180 1 7 + 125 122 213 236 119 229 216 214 35 0 5 3 4 181 180 1 7 BICOMP - 125 122 213 236 118 229 216 214 35 0 5 3 4 181 180 1 7 + 125 122 213 236 119 229 216 214 35 0 5 3 4 181 180 1 7 @@ -630,11 +626,11 @@ ICCARM - 37 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 255 15 16 + 37 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 255 15 16 BICOMP - 37 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 255 15 16 + 37 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 255 15 16 @@ -653,11 +649,11 @@ ICCARM - 39 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 + 39 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 BICOMP - 39 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 + 39 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 @@ -676,11 +672,11 @@ ICCARM - 41 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 41 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 BICOMP - 41 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 41 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 @@ -699,11 +695,11 @@ ICCARM - 43 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 43 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 BICOMP - 43 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 43 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 @@ -712,7 +708,7 @@ ICCARM - 225 119 + 225 120 BICOMP @@ -722,11 +718,11 @@ ICCARM - 45 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 255 + 45 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 255 BICOMP - 45 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 255 + 45 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 255 @@ -735,7 +731,7 @@ ICCARM - 220 120 + 220 76 BICOMP @@ -745,11 +741,11 @@ ICCARM - 47 125 122 213 236 118 229 216 214 255 0 5 3 4 181 180 1 7 16 15 + 47 125 122 213 236 119 229 216 214 255 0 5 3 4 181 180 1 7 16 15 BICOMP - 47 125 122 213 236 118 229 216 214 255 0 5 3 4 181 180 1 7 16 15 + 47 125 122 213 236 119 229 216 214 255 0 5 3 4 181 180 1 7 16 15 @@ -768,11 +764,11 @@ ICCARM - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 BICOMP - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 @@ -791,11 +787,11 @@ ICCARM - 50 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 50 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 BICOMP - 50 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 50 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 @@ -814,11 +810,11 @@ ICCARM - 52 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 16 + 52 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 16 BICOMP - 52 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 16 + 52 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 16 @@ -831,17 +827,17 @@ BICOMP - 112 + 113 ICCARM - 54 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 29 16 + 54 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 29 16 BICOMP - 54 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 29 16 + 54 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 29 16 @@ -854,13 +850,13 @@ BICOMP - 113 + 114 ICCARM - 56 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 15 16 + 56 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 15 16 @@ -873,17 +869,17 @@ BICOMP - 114 + 115 ICCARM - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 58 255 15 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 58 255 15 BICOMP - 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 58 255 15 + 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 58 255 15 @@ -896,17 +892,17 @@ BICOMP - 115 + 116 ICCARM - 60 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 60 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 BICOMP - 60 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 60 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 @@ -919,17 +915,17 @@ BICOMP - 116 + 117 ICCARM - 62 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 62 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 BICOMP - 62 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 16 15 + 62 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 16 15 @@ -942,17 +938,17 @@ BICOMP - 117 + 118 ICCARM - 15 64 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 255 + 15 64 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 255 BICOMP - 15 64 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 255 + 15 64 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 255 @@ -971,11 +967,11 @@ ICCARM - 66 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 16 + 66 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 16 BICOMP - 66 255 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 16 + 66 255 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 16 @@ -994,11 +990,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 @@ -1011,17 +1007,17 @@ BICOMP - 99 + 106 ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 17 58 255 19 16 31 15 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 17 58 255 19 16 31 15 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 17 58 255 19 16 31 15 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 17 58 255 19 16 31 15 @@ -1030,7 +1026,7 @@ AARM - 109 + 110 @@ -1039,21 +1035,21 @@ ICCARM - 111 110 + 112 111 BICOMP - 102 + 100 ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1072,11 +1068,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1095,11 +1091,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 47 125 122 213 236 118 229 216 214 255 0 5 3 4 181 180 1 7 16 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 47 125 122 213 236 119 229 216 214 255 0 5 3 4 181 180 1 7 16 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 47 125 122 213 236 118 229 216 214 255 0 5 3 4 181 180 1 7 16 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 47 125 122 213 236 119 229 216 214 255 0 5 3 4 181 180 1 7 16 @@ -1118,11 +1114,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1131,21 +1127,21 @@ ICCARM - 128 100 + 128 105 BICOMP - 103 + 102 ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1158,17 +1154,17 @@ BICOMP - 108 + 109 ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 255 16 31 15 43 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 255 16 31 15 43 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 0 5 3 125 122 213 236 118 229 216 214 4 181 180 1 7 19 255 16 31 15 43 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 0 5 3 125 122 213 236 119 229 216 214 4 181 180 1 7 19 255 16 31 15 43 @@ -1187,11 +1183,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1210,11 +1206,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1223,21 +1219,21 @@ ICCARM - 101 188 + 103 188 BICOMP - 106 + 107 ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1256,11 +1252,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 82 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 83 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 82 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 83 @@ -1279,11 +1275,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1302,11 +1298,11 @@ ICCARM - 88 80 84 67 93 73 92 77 75 79 86 257 90 95 + 89 81 85 67 94 73 93 77 75 80 87 257 91 96 BICOMP - 88 80 84 97 93 73 92 77 75 79 86 257 90 95 + 89 81 85 97 94 73 93 77 75 80 87 257 91 96 @@ -1325,7 +1321,7 @@ ILINK - 218 131 194 188 189 193 98 201 109 167 169 168 211 123 227 228 147 148 149 150 173 172 171 170 165 166 119 120 145 146 179 177 178 175 174 176 144 126 202 132 187 200 121 100 203 110 191 186 143 129 142 + 218 131 194 188 189 193 99 201 110 167 169 168 211 123 227 228 147 148 149 150 173 172 171 170 165 166 120 76 145 146 179 177 178 175 174 176 144 126 202 132 187 200 121 105 203 111 191 186 143 129 142 diff --git a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/settings/efm32G880.wsdt b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/settings/efm32G880.wsdt index 9035b239..8912565e 100644 --- a/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/settings/efm32G880.wsdt +++ b/Target/Demo/ARMCM3_EFM32_Olimex_EM32G880F128STK_IAR/Boot/ide/settings/efm32G880.wsdt @@ -29,7 +29,7 @@ - + TabID-3636-6432 @@ -41,7 +41,7 @@ - 0 + 0 TabID-28813-8212 @@ -57,20 +57,20 @@ TabID-20200-19078Debug LogDebug-Log - 0 + 0 - TextEditor$WS_DIR$\..\main.c0000036310631060TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_EFM32\timer.h00000000TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_EFM32\timer.c00000000TextEditor$WS_DIR$\..\blt_conf.h0000066339533950100000010000001 + TextEditor$WS_DIR$\..\main.c0000036310631060TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_EFM32\timer.h00000000TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_EFM32\timer.c00000000TextEditor$WS_DIR$\..\blt_conf.h00000112924992490100000010000001 - iaridepm.enu1-2-2723442-2-2240242125000240079231250719246-2-22401922-2-219242421002083240079125000240079 + iaridepm.enu1-2-2723442-2-2240242125000240079231250719246-2-22401922-2-219242421002083240079125000240079 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/bin/openbtl_ek_lm3s6965.elf b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/bin/openbtl_ek_lm3s6965.elf index 688a752220693a10d2db4f5b252dc67ba9df3416..f91837aeea2635c642b1016daa4aaaefb7ced905 100644 GIT binary patch delta 1184 zcmX|=TWkzr6vw~+oSiCz+O||m*G#w8t?AmJLR-3BiAyT((a`nK;)M|DgP^(^4Js*Z z&`%^nNR_CRkSyYwcq0)JAriN!#Dj;XLPR2Q&g^s^=CbGaKWD!4KWD#Q&iQ&d=g=J_ z%h9U0lw%n->E3db=B}Emlrrg9ma?2KvYAHXSnxB~Ogt?yMJX`KNIF+QSH z;B?xl#22JK0kB?A@~*}NR`cCTOy^Js3)*}^hv5pW0YQC?F8HX= zL+=DVWOUz04?R>SsMJIXZ+up2W-1N}O9p^JA0-1Blq)F66)j`>KMxK+AhOS%G~b;N{y}Cc z!9fpXXk6u_+-MHf6{&#S#=GV1bWSixm9M=!uWMyC|$C;F4HS2uMSdS@@Ez zL2Ly3 zOfJ~KUwpMysgMjmoBjJUlFPU0pK(-Ru8!7l;zGSn9#wj84V=7Y78Xe7+gW{F9AB=l z*I+qn^{*N%##%iufe1F}`UD@LPPZpGw@u$jpswJ9hI6o$X|p1D2#K|vbUEgg~s&fDqQyAobIm1a`fxF)oAgjfI`fU zDCO%*+co%zrt4;c4QyDx+C1XXZFzcG2y3b$gD^iXC3 z5f7EQ1;+&Sa-)qN>UCPpIgs3YP*9SaRJr>_HvmY>YzLq4bb%8|abWsThC1&b=W~3} z(adZ+qHx8@VYh_NdL+uAfl(gBBmNkj3JvN^sl-vr)pM!xVOgBZ{$9_TP}>atH{~q$xR+@yjo$g3(G3Rk-Mvpot`Vx!q$E zu9qocmpJW^hc3BkB#sR6aC$v7qjj+JFS4*eI^W0Y zUU593uh(G%*6E*hSc3+=Jb?%{>*fSsVXHoq;M^{KGl8ap*IW7CCS7k7un**oOX|^}|T7A2vcq>~7vvnzk{~czzlAYZe&UiXAYGi(#ecl>!x|PZd(o+{ypp zK-3Nu8)ilzn?hfJz$!Z$wI`#pCiEM~UutA!bh0AUV<0eDS?r|?28u()G+^k7`4qM< zcUCsg*R1TOU@RPt1xxHOoouh9_tY1ofsPs)(W@<*JMYIai_XHLZ(SCpU@d8;zhqHQ Shebd2VT&4&O5eAr^wxjEdd`pl diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/blt_conf.h b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/blt_conf.h index e02458bf..352c0911 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/blt_conf.h +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/blt_conf.h @@ -240,5 +240,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/hooks.c b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/hooks.c index 7612e8e2..18f20ed9 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/hooks.c +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/hooks.c @@ -465,4 +465,63 @@ void FileFirmwareUpdateLogHook(blt_char *info_string) #endif /* BOOT_FILE_SYS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/ide/lm3s6965_crossworks.hzs b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/ide/lm3s6965_crossworks.hzs index 594a1c1b..b9f7b850 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/ide/lm3s6965_crossworks.hzs +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/ide/lm3s6965_crossworks.hzs @@ -51,7 +51,7 @@ - + diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/bin/openbtl_ek_lm3s6965.elf b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/bin/openbtl_ek_lm3s6965.elf index 4456764349bddf765469832a24e9ac782348bf2c..985479c8fdc65740a6eee1218b80dd026d77215a 100644 GIT binary patch delta 1171 zcmX|=U2KbC6vvSR7r!k-uS~b=}sqC+%_JiD2j@7{bo}ln9 zjaG+uX`6d?3F+79a!7xMY!x!7al;{l88Ti-nG27FB<$Cfxzgbd3)*bqts~lOrOEd~ zCSHv{4)KnK6XJ0pSC1v{$wV6x(gQ4TNRM6O#2wpq3P^Bm36)zYZr31{V!yb~4%vp& zY{*`nhW7ns8QZVhK6zVP6>i!ZZjw-MLOh|f`S3}ozRMgdzgjASwu3jQNgi%JzJ=I_ zf9&H+$T0A)grBO|lxJHfXH92g4r(2XXB}VhOXIgw%dbrR1LEr?&yW;n$4wlmUftj?bulG z{s&j&qLC)0N~E|*w>0BRYHkNgfuz~ciRIX6`Z_Tyzh1`dqG8P${gpniNxkaC>H_qh zh+IS}a#3$T-juZ9TRNjiyLfMuOUtg%H^8@~sJz^<%C68qU{Zz7O8d#K5PzdS?M@q{ z=X61%I9SY{=5v_BHA6?Dwe&2@-5iL8!?8f5C`>mFM(H8-#OQInin?eoJyFq36?L&X zn%KN090=1V6-CSc$XdX$m`hqg68jrK~f#crVr=JqP$ZgGymUV<(gE|$R|R!*tjbs?OwOV&WAf8 zsK>$!Pt;@O$-8PMF^&H`5}OYvq~1oEo=?8M5bchTAz+P1hTIZMzdd+ZK$>eytFmfw zn}Sq|>5VdP`oV<-Tjl#*?z(GDL-&j;gYN2CJ9}b7SEtA=Eadv6BjvFMXOX4 z)Nb$&waCw{$Llcr@W(z*T84oSb$n`JQ@LwhTvWxz1!(sy{$0F9DdAtQmQu=h=DPUC z2qiRMf2=?ri{_(7y+=M4diI5oaY8F`5AqWqFNlUE;ma2GdZNpP5zL9`p@m}}c~~I7 z3bAaAc*M$&U`dly=U^W@IGi~q9u+B7>CW77XJP*CLq#Zn1(s4v-|%o#ok|5(@#Y9? zd_LABjnj{2w3)VkEXNA-eLsRom|G%doK7{3Od-GnPSh#h6x~wX*6qJ4a;%8_oR;+OXM_XR!h8rX$N&Z#O^6 z(rM0TS$fjk%Ho^K=l^g;Ha+iBs!ocF4ofp$=3+mi0mzy?1NaJEW?}&K6%Uhw>fU~})vC*^2TcHoYq9$FG z_mj6mgBp(Z~ zU85i9o{H~nN+yz2+Pyy#jL=^yzJW5SaAFnBQuk^aOoeIIY>(0=jGA*%x>S<|meZ$S cZ%qEuO#YUY^9kGtaRSd2s5-a1jsiFT2irl-vj6}9 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/blt_conf.h b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/blt_conf.h index 891230ff..c391cb83 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/blt_conf.h +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/blt_conf.h @@ -240,5 +240,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/hooks.c b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/hooks.c index 64b57b49..19a94bda 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/hooks.c +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/hooks.c @@ -465,4 +465,63 @@ void FileFirmwareUpdateLogHook(blt_char *info_string) #endif /* BOOT_FILE_SYS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/bin/openbtl_ek_lm3s6965.out b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/bin/openbtl_ek_lm3s6965.out index 6454c983a69502baf74f0b52e4323de94fdbd6f7..9b2ca756431f65ebea0d953230163357decf40a9 100644 GIT binary patch delta 5931 zcmZu#dwfk-7QSomog2wMH#9fN%}qi=NJvx}&q1q76OSU4Dq4{rqec+VX=mDwq@EE( z5DSrz5EF#NqfRk2REefqsd|M((TaK`o(Un$K4&{OH}mtyadW@#TWhbq_S$QmYg4-4 zrgXpjxU(>5#niKDFnEP>ZX=9bk$)}+66TCJuZ}nmy*=S~%(w|Fp%mNSg0*lPf4T*m zp%!P|hMlkkL+?Niti@Azz(;(P-+@i7mQjo8#!8cE^dOUIf_U7<#mtN`!7>_F-~*-x zsREhwwOl)@~g&{ZZ=mWabQ$`MNn3(;bU zT!nenFctgXhj9A?Asr#4nygcu^Z~=<`;g_k#KmGt60}B*ucMb>-v_Y4H&?Jb1*)2d`hk`vQ*lU8-n5;VXAntnznZ9L$bwkN~Q^%I!^hdD4eqXR%1*e%}(7+xi^ zmx8CNMCwzpyb3mx=VnZ<25;?ib2V%ZDs5mf`L8yaW)3!)c8KTYQIs|a*S6nnHRe}C z9A113;l7D(7SjMB)nxbUq>0$%31mVZ7CaHl6Sl**L{=REv8;Vs>xQ?Ns}<@DQx!573?g*<_Kn&c(^Q;T-DpTn_w(rIpEO?1wYf()14sRd-@D{SyR zAcO5v0w$9S@trFE1$x%x;XO{AZbgkN)kOlSDnvLxkiE>^-kzon9qWbZ$ zJ9%4u!bnA(RfU<{bT)7^3}Q9)5H-3131ZG$UyDH&(!trp^`!~kvXJ-H5(_z5=YB^+ z^0TwnNK;-T@{k&C)vaFS?_kJIjUplLMii!W%(RiY>Pa8+sI{TT6TQeOXSw0Es5cqo zZm8713?lCJyc)78Q3UE_{}@SzzEbvV6zS~Py4rONnej^5 zf?Zm%Br`0CBc0K*mBeD}S>*4p2pZp*NT#?N@=X)T633S=u_VFqr686hI=)0ra{BVy zBr?xn)Jc;`IB}#PBkuo#cCLrHSUinPQ}<6J>2(&PXOhm2ZKlm4ot!N;;^9xp=jw<5 zAge6K8u(}qd136UW-b}-Y%oWbT>3n6uP&3Ri$vKP76tvfc;fKIq?vI-vlo-! z9p!{!gVRH^Om6!w-;nwfzrds;k58)?#wn za4XI)(DK>Xscj~hsJwz|-Y?{Q-F+6l@30{jrx0ut&FzKO`3l_YnPKu7GQj$h(Ry0Y zK)t8kz{)e^V`t(6Nj$;mvt)!bF+mcESag;Qb0%g=VimSON75TRt)Y#0(Ki=Ut#5+W z1p=_xjr76SFA-N~2ij|Z&}HGE^CZTZm@kQo_}zIj!pq6?Qc2WOY|rj^#umo}XR zF%KJ-)hD!(Er@M6r>uTfv>7dk-`!BTTt6;tBnxH%&c0lKkJ>aAM2=c{nN%LqWZL!%qr@Pq)+f!{s7!>AQM%%Ptu$yRtnqDfY~m_rZo1D@b15fwLWp=&gaLhhNmM~vXy?tZ&{(0RFvZ<+vu0dIxjFwV6_+C-A0G;TrX%LksOT5 zrL%a67X&oY!#Rtma_KxC?`;6jaLjhPNXhmF;-@Pzy|HRL9mtP*f{S!gfP;3>NM7s! zPGaT`8qG^Qp{Z1yMV?1DEAy>J@LyT+U>=>QWLSYo$yzJ6&!_M63(X-=LkK;CDfx7Q zlGQ>6OK3(5blFMMm8BuzCnbwQaK}!X!plRzUn1AA-!3{u$!rPzeS{ZE(_7-vU9?D9 z+zNbp=*YrWn6{fHEAzsjx0jA2gkh&Wbcd1_4&G9O;dplsP2%6ThKADdVO+eIcELkm z)871gYw+{dW4wx%y>zCM{<XOB6G{mNctF$0gN$f>QkibO& zeuvd%^gX^$AZ>NzYaDo)M)BtYXr==-xaBe(z<0mvLR#xU9>Q;QB>y1-+_k8H9>ej! z(TTh?0?bw&xPTXbqaX8%2=JA_P3(1r7F(7@!fGOI79UreUZt}c-`N*@0(GnHxb3>w z?Js?ynWql?ggwjYPGw#{m~PjBgdf!B<+Kk`=Jtn%T!-R|aL7$MR@u-W+_Y=}T~~yM zZ_-cr-u^N_KzE6sJajTI>kt02zDjW0ExM5ZY%_|d2;aI*hx02ouy)d&l;Vcl;z$#G z!9xPI*!>PoP}ccE+elrp+80jJ-GQE zJ4)M<7lgw&4WRVDIPMYsgI{k0eo}E2hgQ)qlxJxaJhWsG`WP=&(V@!T zbPC?u`BIVd?$va)C3QW8ZW2jZk5{T`k!4*L1x14hU7dyd9@7NNpBpK>CZRtzV!Nlb zF+Q)RW}Nth&a^Ddc93(kok))wI$hbG;~=+S+ov=VPuI}FO2QTgT&ux}{CX4cmdA7z zk3JPQdO@JkOXdV(muKQsRt6dcy(|!upV3&pB@irHSU|JUrIt?ThXcV)0tfM{TA?@_ zC^roB7kpex)09KoDR6m``*HnqIzu@v5FcsuGd6ia=PL=zsL?5EG5>|Q7})~RyA+|B z%TkxJJ4&HI^i&ejtrq}Ws$3R`-lhn>h)oF_qTCdSo3Eb9>o}XRu}W2)<~~*sHbzNE zp~kB=BTq?{9o zpF~dMw=M#CDv%b6uBlcN&8#^n`O7J^vj~XNTy>u-+Yic30l7#>MCm4?d@PWFU?DQo zhgjjpN-Y^HCBDQPVsQUcgg^?8lG z2g-3#Loa8`cR0n9Wh$ox5+PMTs{U3s94u?MiuB5hv}!BP_F`WuxdIX)YE_ei4ZPV1 z{-Y;w2^8WaZ}tJd>IqF`M<~OS0#K5y&_rI+1y+2+hYjPqt>7w=JWTdsqj;g!XlF<9 zk&oDRc@VH}Vi`iO;W!%`>UFv)bkUY!^yj8xoV%O(nEg5(!O{LAo`?Xkp<`lPNWVugH-HVdZ0Z9C zKq4Co)kclALwL{^?t<)tmFk2hY#3#+cuXE$0P| zp`k?nivxn$41PfXvW=g?qG0wJ|K=}XepAoM9vs-5jrQ8!0eWkZP`agqNP&x4iC%-5 zEtnscG-tc{v5xY^iqIn%6e2QvpamPruXhByOv6B#r!8^$K` zGm&7EKrt=}6FIGk1RAa@s?Z)TB3{(T=zH@EaaK6{r;^=QHdN8~PGC(qo51(>lZQvd z2$|fPeX1Pp2m9UJbTHODf%RAB4mI4w|B6{1M0J%qwsZj- zbY%Vb9S86ye%z4_QZNEMWSUnT!*4pW&z1i~z?%};cno`VVpYoeNN6LMPCJf0JF_Bw zD-zz3nsU|Fh1~`1cE5akEJV+)?0sHiHHJhLPVLHuDM{kpSJue_FD&jV)=u*>Y|sl^ zcVior950xp`31VkOFiF>rGb*+ZTMO1jkDhrS8TU8c*vv8!?HKo7=FiFo)geNvF}@K z08jQYUbB-h^DXuXU+)7SO227n?ZLj~2{z;Pw-!r#u;Dz-W>h|6kGI)Je7_A`rO960 z{I=*tMKXVu3lQZKI^j|geQVI-MrCiQ{k5}bf-Ue}TqY7-J3ZSc**1Zi4EI+X3}Xiw43ovjW#ag`;|-8NLyvlb zp~)J7O#S zYAjJ}ad!>O#Qskp%sbi1WEdr+s;o_tx}U3=q&780UNES1e+^Z zm6_eZo=nV@7Ocu_YGAM6fl5fX)(O@HC9}VQt;5+>u+cloXfi|yR%MRraJox*7dzAsx=*(OR+0S-e~en*-uqO$Ot7gJIYZgW)Uj zdF3|VRdd^Vy>!d#;Z5sSA?+oks%&+GbSp;J!xrl)!Oj!xHo^QTK3tZ{DVy6f7!S@l zkN2lJRRSjcL1OUYbC_*hmzbI6bPMw~lh($P!rD})`?i0*fRl}+vs@+^Xm#nTG^f35 zj*`)@vB8gk4EB~1Fc_SOb*A_i=pdK89KO!p%3wsW4ODqPp&>0ac# zqg?lTwl^8)s;g{&8$?_idDUgpqX{&~{yCZqd#&u*7}C|gbz8(ZGUv6j;_>8}(d$)l zOr9|#c22tq23WdOl*S(vkIo=n(X^e!V)#7rkJki^Z%rZ7oppKU6tc|zpEmm5>bcRFL6I*o)8dkWHK{8!M9^$?Hwv&byl!C54=!D8%O($&7rlzF6! zqeTYheNMi#jr=EBYtq-isyOme-&b8c8R2LUCrd8%JMy?8lWP)0+3FUD4w4|8befoP z#8T2yKcV?c$)EP}KvAO|Fl9MO(~TT2T*^RW{(Xc~gfvw{iGSk`a zc6&a#pt}_Z*uwP1gqiIo8>qa4w%xyzf`$t%nqQtS7RM0eCA!J3#1uz(ECMyd$wt5;gdL1!R=FgXbhktY_H%3K{8W zqRw*RD+^Puka>f{zgq7w#RZET_rZNY5Dd1Y)q=Q)v4xE- z)cGxlYAh^l9I!f|1(9IHK1F1lW5DXz7EBf%Dk9?@1CA7PRuF5QvHi8i0jmRBFjbgx zt#Q88@hpgRY+<1@bI2OclTUjwF z`k9^Or-D79u_Qc`8cjyZHF-xCZiRD{qR zT#-X3^XI`bSVC)6zzcnI=_2JpEAWxBJFRe6E?vQowFX~_9Kn7+(&@^x5a{nIJW={I z1dsnn&noxYfM*X4x!nd+{!NpW8*QPtyM`3C#V&j3E~PpYJf!AHD3P3F<~sd|ukJ-jdktBR1B+=izaoH^8gLP_is=BJ^q~_8*MJ0s8+0_^90{&! zRB9zpx6rv<`ut>7*9tT?2M_E+ky&`e5dte90s=kj&l5ZqMLtj0Fw;+p;94ezQFLQmnja{4P@p4-T%Rt#C$#xN8Z%&{QUPAx2lycKE!4_Td=< zl^NWiqF?YUp%CJxEqDm1`Wko6l5A}elNcy`qbe*X@jY2nxJW9ixHT0~hCY^$!LWEYNb#%6}c$=M!$M*F!3NO^r!AemBT%f{Bc%DCa z$a6Z3$Lr~2<(9wRP_Fyq+t0+Yl=tipV3$z-vUf(Sfcl$({nnT|Ih+lB(M&@ zeJ&KaE#!uQX5-W6G(}mTO@Yg!T!R~4&^gL3fp|)z?dboKE>wz=sop9IFz2PX84H$E z*{TSAmb@m3l_(hk(Nal7%U%R5NjWGGtydAc4+9AsqMQ(ji&e{H9?mChf|B2$Iftc$ zjZ=yQV)D~81vr|r1*XRW(HbYACCl+1Wz$SA1k}V;6V)xp@r*52l2=ghRv{;vh*gXo zQGOJNk3@FiPfh~4B#>5$rup5r#K?j{NnA;xgGoS?F0vhPW(PqzAs{CSi6~t}lotfz z7bHYR`Wu$Iuxm=KKw3zoN=5vz!j+XN8LKG7$OSgoN;wN6O7dzEs%!^|*xZdxQ}!u876ReY!ArK{jCm}Y^ zH`qs@Y|46-CZK6J-OSRJ9Ri7zs;xF(3mXBZDgl|~J$jsl^WE9k%A)NQM2Kq9#9;!%Z|A}?=Bw(Vs3U9@erd=mt#2ASHu(PCpMHW#)Wj7iaY(-2-C|b zI0O=@|Jl~8xq1k{_JwkgeejHJvOgORYVx%10rUW#YQe_y-|Zv(SL_tPqWE?3Vp077 zy^0G1M0!ij;M`mT{xakJ02agd_~}k^a7ZBghM)1%Yvv?g4`e5m`+m??*36%NnA4K2 zUZGAc3a zF})S@!K=aS-#opud|VNliUF-z5FTp9M)SPR;4RZ|SViNM1rfj_HMh^+!NAt6CFZwg z(Moy*c&YIS>j)JN!srk-R;i2tKlRl?Xn6!C)zOw%6e8~2-EO**TisN(9}cV+9d=q9 z7Ri6ID^VM6OpVscydzdSPvoI^EaBU(e* z6rK|WUJ}@e%R)s?FGc|k(-isW9VQ~a6Q#Gkn?K{cF!nEHL0{QVMcX@tbzy8WU(rt< z9uX5{S~&Y$`Jo>ibaBz#th1GevuJ02WhhYf(L}`KzJDjyUnw4{yD7YYn>vZ=+Hc>| z9&FN?_2Z}Pz;XPvGaIBl`4HS>noCdM{?6=6<=aSjPa-c)V2>`WTB(bKc5> zJIhZ-!3R=v%;xnrD+l#YLFRf_o#bWs_@rseYuj5y}#2rfV)qhST;LBbto$vA0f0N|kj^6Az vFY(nk{Q&>xLvat6`{~Op#it*#u{_rg+|*+eLwV8oNG3i`w(*h1UVZ)_s(%B2 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/blt_conf.h b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/blt_conf.h index f50307f8..947f20d4 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/blt_conf.h +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/blt_conf.h @@ -240,5 +240,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/hooks.c b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/hooks.c index 6f780145..70796895 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/hooks.c +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/hooks.c @@ -465,4 +465,63 @@ void FileFirmwareUpdateLogHook(blt_char *info_string) #endif /* BOOT_FILE_SYS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/lm3s6965.dep b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/lm3s6965.dep index 5671821e..de638449 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/lm3s6965.dep +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/lm3s6965.dep @@ -6,10 +6,52 @@ Debug - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\flash.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\lc-switch.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\nvm.c + $PROJ_DIR$\..\lib\driverlib\cpulib.h + $PROJ_DIR$\..\lib\driverlib\ethernet.h + $PROJ_DIR$\..\lib\driverlib\cpulib.c + $PROJ_DIR$\..\lib\driverlib\debug.h + $PROJ_DIR$\..\lib\driverlib\ethernet.c + $PROJ_DIR$\..\lib\driverlib\flashlib.c + $PROJ_DIR$\..\lib\driverlib\flashlib.h + $PROJ_DIR$\..\lib\driverlib\gpio.c + $PROJ_DIR$\..\lib\driverlib\gpio.h + $PROJ_DIR$\..\lib\driverlib\interrupt.c + $PROJ_DIR$\..\lib\driverlib\interrupt.h + $PROJ_DIR$\..\lib\driverlib\pin_map.h + $PROJ_DIR$\..\lib\driverlib\ssi.c + $PROJ_DIR$\..\lib\driverlib\ssi.h + $PROJ_DIR$\..\lib\driverlib\sysctl.c + $PROJ_DIR$\..\lib\driverlib\sysctl.h + $PROJ_DIR$\..\lib\driverlib\uartlib.c + $PROJ_DIR$\..\lib\driverlib\uartlib.h + $PROJ_DIR$\..\lib\fatfs\ffconf.h + $PROJ_DIR$\..\lib\fatfs\mmc.c + $PROJ_DIR$\..\lib\inc\hw_ethernet.h + $PROJ_DIR$\..\lib\inc\hw_flash.h + $PROJ_DIR$\..\lib\inc\hw_gpio.h + $PROJ_DIR$\..\lib\inc\hw_ints.h + $PROJ_DIR$\..\lib\inc\hw_memmap.h + $PROJ_DIR$\..\lib\inc\hw_nvic.h + $PROJ_DIR$\..\lib\inc\hw_ssi.h + $PROJ_DIR$\..\lib\inc\hw_sysctl.h + $PROJ_DIR$\..\lib\inc\hw_types.h + $PROJ_DIR$\..\lib\inc\hw_uart.h + $PROJ_DIR$\..\lib\uip\clock-arch.c + $PROJ_DIR$\..\lib\uip\clock-arch.h + $PROJ_DIR$\..\lib\uip\netdev.c + $PROJ_DIR$\..\lib\uip\netdev.h + $PROJ_DIR$\..\lib\uip\uip-conf.h + $PROJ_DIR$\..\blt_conf.h + $PROJ_DIR$\..\hooks.c + $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\vectors.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\flash.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\flash.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\nvm.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\nvm.h $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.h @@ -21,8 +63,10 @@ $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.h $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\integer.h $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\pt.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\lc-switch.h + $PROJ_DIR$\..\obj\openbtl_ek_lm3s6965.map $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\lc.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\pt.h $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.h $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arch.h @@ -51,15 +95,15 @@ $PROJ_DIR$\..\..\..\..\Source\xcp.c $PROJ_DIR$\..\..\..\..\Source\xcp.h $PROJ_DIR$\..\obj\uip.o - $PROJ_DIR$\..\obj\uip_timer.o $TOOLKIT_DIR$\inc\c\DLib_Threads.h - $PROJ_DIR$\..\obj\netdev.o - $PROJ_DIR$\..\obj\ssi.lst - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c + $PROJ_DIR$\..\obj\uip_timer.o $PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\hello-world\hello-world.c - $PROJ_DIR$\..\obj\netdev.pbi $TOOLKIT_DIR$\inc\c\wchar.h + $PROJ_DIR$\..\obj\netdev.pbi + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c $PROJ_DIR$\..\obj\uip_arp.o + $PROJ_DIR$\..\obj\ssi.lst + $PROJ_DIR$\..\obj\netdev.o $PROJ_DIR$\..\obj\netdev.lst $PROJ_DIR$\..\..\..\..\Source\fatfs\src\integer.h $PROJ_DIR$\..\obj\nvm.pbi @@ -71,7 +115,6 @@ $PROJ_DIR$\..\obj\uartlib.lst $PROJ_DIR$\..\obj\ff.lst $PROJ_DIR$\..\obj\cpulib.lst - $PROJ_DIR$\..\obj\openbtl_ek_lm3s6965.map $PROJ_DIR$\..\obj\nvm.lst $TOOLKIT_DIR$\inc\c\stdarg.h $PROJ_DIR$\..\obj\cpulib.o @@ -79,8 +122,8 @@ $PROJ_DIR$\..\obj\mmc.o $PROJ_DIR$\..\obj\flashlib.lst $PROJ_DIR$\..\obj\filesys.pbi - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\psock.h $PROJ_DIR$\..\obj\mmc.pbi + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\psock.h $PROJ_DIR$\..\obj\vectors.pbi $PROJ_DIR$\..\obj\timer.o $PROJ_DIR$\..\bin\openbtl_ek_lm3s6965.srec @@ -88,8 +131,8 @@ $PROJ_DIR$\..\obj\assert.lst $PROJ_DIR$\..\obj\hooks.lst $PROJ_DIR$\..\obj\nvm.o - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c $PROJ_DIR$\..\obj\cpu.o + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c $PROJ_DIR$\..\obj\interrupt.lst $PROJ_DIR$\..\obj\sysctl.lst $PROJ_DIR$\..\obj\gpio.lst @@ -134,8 +177,8 @@ $PROJ_DIR$\..\obj\tapdev.o $PROJ_DIR$\..\obj\clock-arch.pbi $PROJ_DIR$\..\obj\tapdev.pbi - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\psock.c $PROJ_DIR$\..\obj\hello-world.pbi + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\psock.c $PROJ_DIR$\..\obj\uip.pbi $PROJ_DIR$\..\obj\uip_arp.lst $PROJ_DIR$\..\obj\uiplib.o @@ -174,8 +217,8 @@ $PROJ_DIR$\..\obj\cpu.lst $TOOLKIT_DIR$\inc\c\ysizet.h $TOOLKIT_DIR$\inc\c\xlocaleuse.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\memory.x $PROJ_DIR$\..\obj\clock-arch.lst + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\memory.x $PROJ_DIR$\..\obj\uip_timer.lst $PROJ_DIR$\..\obj\uiplib.lst $PROJ_DIR$\..\obj\uip.lst @@ -203,49 +246,6 @@ $PROJ_DIR$\..\obj\ff.o $PROJ_DIR$\..\obj\filesys.o $PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\hello-world\hello-world.h - $PROJ_DIR$\..\lib\driverlib\debug.h - $PROJ_DIR$\..\lib\driverlib\ethernet.h - $PROJ_DIR$\..\lib\driverlib\cpulib.h - $PROJ_DIR$\..\lib\driverlib\cpulib.c - $PROJ_DIR$\..\lib\driverlib\ethernet.c - $PROJ_DIR$\..\lib\driverlib\flashlib.c - $PROJ_DIR$\..\lib\driverlib\flashlib.h - $PROJ_DIR$\..\lib\driverlib\gpio.c - $PROJ_DIR$\..\lib\driverlib\gpio.h - $PROJ_DIR$\..\lib\driverlib\interrupt.c - $PROJ_DIR$\..\lib\driverlib\interrupt.h - $PROJ_DIR$\..\lib\driverlib\pin_map.h - $PROJ_DIR$\..\lib\driverlib\ssi.c - $PROJ_DIR$\..\lib\driverlib\ssi.h - $PROJ_DIR$\..\lib\driverlib\sysctl.c - $PROJ_DIR$\..\lib\driverlib\sysctl.h - $PROJ_DIR$\..\lib\driverlib\uartlib.c - $PROJ_DIR$\..\lib\driverlib\uartlib.h - $PROJ_DIR$\..\lib\fatfs\ffconf.h - $PROJ_DIR$\..\lib\fatfs\mmc.c - $PROJ_DIR$\..\lib\inc\hw_ethernet.h - $PROJ_DIR$\..\lib\inc\hw_flash.h - $PROJ_DIR$\..\lib\inc\hw_gpio.h - $PROJ_DIR$\..\lib\inc\hw_ints.h - $PROJ_DIR$\..\lib\inc\hw_memmap.h - $PROJ_DIR$\..\lib\inc\hw_nvic.h - $PROJ_DIR$\..\lib\inc\hw_ssi.h - $PROJ_DIR$\..\lib\inc\hw_sysctl.h - $PROJ_DIR$\..\lib\inc\hw_types.h - $PROJ_DIR$\..\lib\inc\hw_uart.h - $PROJ_DIR$\..\lib\uip\clock-arch.c - $PROJ_DIR$\..\lib\uip\clock-arch.h - $PROJ_DIR$\..\lib\uip\netdev.c - $PROJ_DIR$\..\lib\uip\netdev.h - $PROJ_DIR$\..\lib\uip\uip-conf.h - $PROJ_DIR$\..\blt_conf.h - $PROJ_DIR$\..\hooks.c - $PROJ_DIR$\..\main.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\vectors.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\flash.c $PROJ_DIR$\..\obj\flashlib.o $PROJ_DIR$\..\obj\gpio.o $PROJ_DIR$\..\obj\interrupt.o @@ -264,246 +264,85 @@ ILINK - 107 65 + 150 58 - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\nvm.c + $PROJ_DIR$\..\lib\driverlib\cpulib.c ICCARM - 66 81 + 108 111 BICOMP - 56 + 162 ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 0 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 0 - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + $PROJ_DIR$\..\lib\driverlib\ethernet.c ICCARM - 144 101 + 152 146 BICOMP - 137 + 145 ICCARM - 12 13 215 123 + 20 23 24 28 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 1 15 10 BICOMP - 12 13 215 123 + 20 23 24 28 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 1 15 10 - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.c + $PROJ_DIR$\..\lib\driverlib\flashlib.c ICCARM - 188 76 + 114 240 BICOMP - 189 + 164 ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 21 23 27 28 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 6 10 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 21 23 27 28 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 6 10 - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\uart.c + $PROJ_DIR$\..\lib\driverlib\gpio.c ICCARM - 246 180 - - - BICOMP - 60 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 221 225 212 214 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 221 225 212 214 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c - - - ICCARM - 63 194 - - - BICOMP - 251 - - - - - ICCARM - 12 13 215 10 67 95 93 58 244 94 177 46 - - - BICOMP - 12 13 215 10 67 95 93 58 244 94 177 46 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c - - - ICCARM - 172 44 - - - BICOMP - 130 - - - - - ICCARM - 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 19 114 95 93 58 244 94 177 46 166 115 - - - BICOMP - 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 19 114 95 93 58 244 94 177 46 166 115 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c - - - ICCARM - 131 53 - - - BICOMP - 174 - - - - - ICCARM - 21 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 114 95 93 58 244 94 177 46 166 115 - - - BICOMP - 21 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 114 95 93 58 244 94 177 46 166 115 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c - - - ICCARM - 170 45 - - - BICOMP - 175 - - - - - ICCARM - 14 228 23 - - - BICOMP - 14 228 23 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c - - - ICCARM - 171 132 - - - BICOMP - 148 - - - - - ICCARM - 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 25 - - - BICOMP - 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 25 - - - - - $PROJ_DIR$\..\..\..\..\Source\assert.c - - - ICCARM - 79 105 - - - BICOMP - 157 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - - - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - - - ICCARM - 164 159 + 129 241 BICOMP @@ -513,459 +352,11 @@ ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 22 23 24 27 28 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 8 11 10 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - - - $PROJ_DIR$\..\..\..\..\Source\boot.c - - - ICCARM - 191 155 - - - BICOMP - 151 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - - - $PROJ_DIR$\..\..\..\..\Source\com.c - - - ICCARM - 248 140 - - - BICOMP - 111 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 9 40 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 9 40 - - - - - $PROJ_DIR$\..\..\..\..\Source\cop.c - - - ICCARM - 247 160 - - - BICOMP - 112 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - - - $PROJ_DIR$\..\..\..\..\Source\file.c - - - ICCARM - 59 187 - - - BICOMP - 185 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 114 95 93 58 244 94 177 46 166 115 89 88 243 138 142 167 176 52 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 114 95 93 58 244 94 177 46 166 115 89 88 243 138 142 167 176 52 - - - - - $PROJ_DIR$\..\..\..\..\Source\net.c - - - ICCARM - 100 99 - - - BICOMP - 110 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 230 18 26 231 40 21 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 230 18 26 231 40 21 - - - - - $PROJ_DIR$\..\..\..\..\Source\xcp.c - - - ICCARM - 61 158 - - - BICOMP - 113 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c - - - ICCARM - 63 194 - - - BICOMP - 251 - - - - - ICCARM - 143 55 215 57 67 95 93 58 244 94 177 46 - - - BICOMP - 143 55 215 57 67 95 93 58 244 94 177 46 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\hello-world\hello-world.c - - - ICCARM - 134 - - - BICOMP - 129 - - - - - ICCARM - 196 26 231 32 7 28 232 41 238 36 4 0 6 30 38 34 43 91 73 15 16 1 18 114 95 93 58 244 94 177 46 166 115 - - - BICOMP - 196 26 231 32 7 28 232 41 238 36 4 0 6 30 38 34 43 91 73 15 16 1 18 114 95 93 58 244 94 177 46 166 115 - - - - - $PROJ_DIR$\..\led.c - - - ICCARM - 146 104 - - - BICOMP - 98 - - - - - ICCARM - 32 7 28 182 41 238 36 4 0 6 30 38 143 55 215 34 43 221 225 212 205 208 - - - BICOMP - 32 7 28 182 41 238 36 4 0 6 30 38 143 55 215 34 43 221 225 212 205 208 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c - - - ICCARM - 144 101 - - - BICOMP - 137 - - - - - ICCARM - 143 55 215 90 - - - BICOMP - 143 55 215 90 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\net.c - - - ICCARM - 100 99 - - - BICOMP - 110 - - - - - ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 34 43 230 18 26 231 91 21 - - - BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 34 43 230 18 26 231 91 21 - - - - - $PROJ_DIR$\..\bin\openbtl_ek_lm3s6965.out - - - ILINK - 65 - - - OBJCOPY - 77 - - - - - ILINK - 168 105 159 155 124 140 160 83 68 152 103 194 187 162 240 241 141 242 154 70 99 47 81 192 116 76 180 122 44 53 45 132 101 181 158 96 250 190 249 - - - - - $PROJ_DIR$\..\..\..\..\Source\filesys.c - - - ICCARM - 147 195 - - - BICOMP - 72 - - - - - ICCARM - 32 7 28 182 41 238 36 4 0 6 30 145 143 55 156 34 43 - - - BICOMP - 32 7 28 182 41 238 36 4 0 6 30 145 143 55 156 34 43 - - - - - $PROJ_DIR$\..\lib\uip\tapdev.c - - - ICCARM - 133 125 - - - BICOMP - 127 - - - - - ICCARM - 18 26 231 196 73 15 16 1 21 32 7 28 232 41 238 36 4 0 6 30 38 34 43 221 225 217 212 205 208 198 - - - BICOMP - 18 26 231 196 73 15 16 1 21 32 7 28 232 41 238 36 4 0 6 30 38 34 43 221 225 217 212 205 208 198 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\psock.c - - - ICCARM - 135 106 - - - BICOMP - 173 - - - - - ICCARM - 149 95 93 58 244 94 177 46 166 150 114 115 26 231 32 7 28 232 41 238 36 4 0 6 30 38 34 43 91 73 15 16 1 18 - - - BICOMP - 149 95 93 58 244 94 177 46 166 150 114 115 26 231 32 7 28 232 41 238 36 4 0 6 30 38 34 43 91 73 15 16 1 18 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\diskio.c - - - BICOMP - 87 - - - - - ICCARM - 57 55 - - - BICOMP - 57 55 - - - - - $PROJ_DIR$\..\lib\driverlib\cpulib.c - - - ICCARM - 64 68 - - - BICOMP - 119 - - - - - ICCARM - 199 - - - BICOMP - 199 - - - - - $PROJ_DIR$\..\lib\driverlib\ethernet.c - - - ICCARM - 109 103 - - - BICOMP - 102 - - - - - ICCARM - 217 220 221 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 198 212 207 - - - BICOMP - 217 220 221 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 198 212 207 - - - - - $PROJ_DIR$\..\lib\driverlib\flashlib.c - - - ICCARM - 71 240 - - - BICOMP - 121 - - - - - ICCARM - 218 220 224 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 203 207 - - - BICOMP - 218 220 224 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 203 207 - - - - - $PROJ_DIR$\..\lib\driverlib\gpio.c - - - ICCARM - 86 241 - - - BICOMP - 118 - - - - - ICCARM - 219 220 221 224 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 205 208 207 - - - BICOMP - 219 220 221 224 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 205 208 207 + 22 23 24 27 28 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 8 11 10 @@ -974,21 +365,21 @@ ICCARM - 84 242 + 127 242 BICOMP - 120 + 163 ICCARM - 220 222 225 199 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 + 23 25 28 0 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 10 BICOMP - 220 222 225 199 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 + 23 25 28 0 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 10 @@ -997,21 +388,17 @@ ICCARM - 48 192 + 96 235 BICOMP - 193 + 236 ICCARM - 220 221 223 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 210 212 - - - BICOMP - 220 221 223 225 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 210 212 + 23 24 26 28 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 10 13 15 @@ -1020,21 +407,21 @@ ICCARM - 85 116 + 128 159 BICOMP - 178 + 221 ICCARM - 220 222 224 225 199 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 212 + 23 25 27 28 0 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 10 15 BICOMP - 220 222 224 225 199 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 212 + 23 25 27 28 0 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 10 15 @@ -1043,21 +430,21 @@ ICCARM - 62 122 + 106 165 BICOMP - 179 + 222 ICCARM - 220 221 224 225 226 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 214 212 + 23 24 27 28 29 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 10 17 15 BICOMP - 220 221 224 225 226 197 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 207 214 212 + 23 24 27 28 29 3 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 10 17 15 @@ -1066,17 +453,17 @@ ICCARM - 97 70 + 140 113 BICOMP - 74 + 116 ICCARM - 221 225 205 208 210 212 10 13 32 7 28 232 41 238 36 4 0 6 30 38 12 215 34 43 + 24 28 8 11 13 15 52 55 76 49 72 35 85 42 80 46 44 48 74 82 54 18 78 87 @@ -1085,21 +472,21 @@ ICCARM - 169 124 + 211 167 BICOMP - 126 + 169 ICCARM - 228 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 31 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 BICOMP - 228 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 31 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 @@ -1108,21 +495,21 @@ ICCARM - 54 47 + 98 97 BICOMP - 51 + 93 ICCARM - 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 21 221 225 217 212 205 208 198 203 + 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 65 24 28 20 15 8 11 1 6 BICOMP - 18 26 231 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 40 21 221 225 217 212 205 208 198 203 + 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 65 24 28 20 15 8 11 1 6 @@ -1131,7 +518,7 @@ ICCARM - 80 141 + 123 184 BICOMP @@ -1141,11 +528,11 @@ ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 221 225 214 212 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 24 28 17 15 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 221 225 214 212 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 24 28 17 15 @@ -1154,21 +541,21 @@ ICCARM - 183 154 + 226 197 BICOMP - 69 + 112 ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 220 221 222 224 225 212 205 208 214 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 23 24 25 27 28 15 8 11 17 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 220 221 222 224 225 212 205 208 214 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 23 24 25 27 28 15 8 11 17 @@ -1177,21 +564,21 @@ ICCARM - 186 181 + 229 224 BICOMP - 75 + 118 ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 @@ -1200,30 +587,53 @@ AARM - 152 + 195 + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + + + ICCARM + 187 144 + + + BICOMP + 180 + + + + + ICCARM + 54 55 18 166 + + + BICOMP + 54 55 18 166 + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.c ICCARM - 165 83 + 208 125 BICOMP - 139 + 182 ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 @@ -1232,21 +642,607 @@ ICCARM - 163 162 + 206 205 BICOMP - 136 + 179 ICCARM - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 221 225 203 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 24 28 6 BICOMP - 32 7 28 232 41 238 36 4 0 6 30 38 12 13 215 34 43 221 225 203 + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 24 28 6 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\nvm.c + + + ICCARM + 109 124 + + + BICOMP + 100 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.c + + + ICCARM + 231 119 + + + BICOMP + 232 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\uart.c + + + ICCARM + 246 223 + + + BICOMP + 104 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 24 28 15 17 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 24 28 15 17 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + + + ICCARM + 107 237 + + + BICOMP + 251 + + + + + ICCARM + 54 55 18 52 110 138 136 102 244 137 220 89 + + + BICOMP + 54 55 18 52 110 138 136 102 244 137 220 89 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c + + + ICCARM + 215 88 + + + BICOMP + 173 + + + + + ICCARM + 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 63 157 138 136 102 244 137 220 89 209 158 + + + BICOMP + 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 63 157 138 136 102 244 137 220 89 209 158 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c + + + ICCARM + 174 95 + + + BICOMP + 217 + + + + + ICCARM + 65 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 157 138 136 102 244 137 220 89 209 158 + + + BICOMP + 65 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 157 138 136 102 244 137 220 89 209 158 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c + + + ICCARM + 213 90 + + + BICOMP + 218 + + + + + ICCARM + 56 31 67 + + + BICOMP + 56 31 67 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c + + + ICCARM + 214 175 + + + BICOMP + 191 + + + + + ICCARM + 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 69 + + + BICOMP + 62 70 34 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 84 69 + + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + ICCARM + 122 148 + + + BICOMP + 200 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 207 202 + + + BICOMP + 204 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + ICCARM + 234 198 + + + BICOMP + 194 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + ICCARM + 248 183 + + + BICOMP + 154 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 51 84 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 51 84 + + + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + ICCARM + 247 203 + + + BICOMP + 155 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + ICCARM + 103 230 + + + BICOMP + 228 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 157 138 136 102 244 137 220 89 209 158 132 131 243 181 185 210 219 92 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 157 138 136 102 244 137 220 89 209 158 132 131 243 181 185 210 219 92 + + + + + $PROJ_DIR$\..\..\..\..\Source\net.c + + + ICCARM + 143 142 + + + BICOMP + 153 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 33 62 70 34 84 65 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 33 62 70 34 84 65 + + + + + $PROJ_DIR$\..\..\..\..\Source\xcp.c + + + ICCARM + 105 201 + + + BICOMP + 156 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 54 55 18 78 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\hello-world\hello-world.c + + + ICCARM + 177 + + + BICOMP + 171 + + + + + ICCARM + 239 70 34 76 49 72 35 85 42 80 46 44 48 74 82 78 87 134 117 60 59 57 62 157 138 136 102 244 137 220 89 209 158 + + + BICOMP + 239 70 34 76 49 72 35 85 42 80 46 44 48 74 82 78 87 134 117 60 59 57 62 157 138 136 102 244 137 220 89 209 158 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c + + + ICCARM + 107 237 + + + BICOMP + 251 + + + + + ICCARM + 186 99 18 101 110 138 136 102 244 137 220 89 + + + BICOMP + 186 99 18 101 110 138 136 102 244 137 220 89 + + + + + $PROJ_DIR$\..\led.c + + + ICCARM + 189 147 + + + BICOMP + 141 + + + + + ICCARM + 76 49 72 225 85 42 80 46 44 48 74 82 186 99 18 78 87 24 28 15 8 11 + + + BICOMP + 76 49 72 225 85 42 80 46 44 48 74 82 186 99 18 78 87 24 28 15 8 11 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c + + + ICCARM + 187 144 + + + BICOMP + 180 + + + + + ICCARM + 186 99 18 133 + + + BICOMP + 186 99 18 133 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\net.c + + + ICCARM + 143 142 + + + BICOMP + 153 + + + + + ICCARM + 76 49 72 35 85 42 80 46 44 48 74 82 78 87 33 62 70 34 134 65 + + + BICOMP + 76 49 72 35 85 42 80 46 44 48 74 82 78 87 33 62 70 34 134 65 + + + + + $PROJ_DIR$\..\bin\openbtl_ek_lm3s6965.out + + + ILINK + 58 + + + OBJCOPY + 120 + + + + + ILINK + 212 148 202 198 167 183 203 125 111 195 146 237 230 205 240 241 184 242 197 113 142 97 124 235 159 119 223 165 88 95 90 175 144 224 201 139 250 233 249 + + + + + $PROJ_DIR$\..\..\..\..\Source\filesys.c + + + ICCARM + 190 238 + + + BICOMP + 115 + + + + + ICCARM + 76 49 72 225 85 42 80 46 44 48 74 188 186 99 199 78 87 + + + BICOMP + 76 49 72 225 85 42 80 46 44 48 74 188 186 99 199 78 87 + + + + + $PROJ_DIR$\..\lib\uip\tapdev.c + + + ICCARM + 176 168 + + + BICOMP + 170 + + + + + ICCARM + 62 70 34 239 117 60 59 57 65 76 49 72 35 85 42 80 46 44 48 74 82 78 87 24 28 20 15 8 11 1 + + + BICOMP + 62 70 34 239 117 60 59 57 65 76 49 72 35 85 42 80 46 44 48 74 82 78 87 24 28 20 15 8 11 1 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\psock.c + + + ICCARM + 178 149 + + + BICOMP + 216 + + + + + ICCARM + 192 138 136 102 244 137 220 89 209 193 157 158 70 34 76 49 72 35 85 42 80 46 44 48 74 82 78 87 134 117 60 59 57 62 + + + BICOMP + 192 138 136 102 244 137 220 89 209 193 157 158 70 34 76 49 72 35 85 42 80 46 44 48 74 82 78 87 134 117 60 59 57 62 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\diskio.c + + + BICOMP + 130 + + + + + ICCARM + 101 99 + + + BICOMP + 101 99 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/settings/lm3s6965.wsdt b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/settings/lm3s6965.wsdt index 02a5e9d6..62710c22 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/settings/lm3s6965.wsdt +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/ide/settings/lm3s6965.wsdt @@ -17,7 +17,7 @@ 100Find-All-References2011553087730055278946300FileFunctionLine200700100300BuildFind-in-FilesFind-All-References664941138100Build664941138 - + TabID-31649-22318 @@ -29,7 +29,7 @@ - 0TabID-23631-11730BuildBuildTabID-25094-12726Ambiguous DefinitionsSelect-Ambiguous-Definitions0 + 0TabID-23631-11730BuildBuildTabID-25094-12726Ambiguous DefinitionsSelect-Ambiguous-Definitions0 @@ -42,7 +42,7 @@ - iaridepm.enu1-2-2563326-2-2372353193750350198170833560516004935226449352264-2561258237134375235119170833398810 + iaridepm.enu1-2-2563326-2-2372353193750350198170833560516004935587249355872-2561258237134375235119170833398810 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/bin/openbtl_ek_lm3s8962.elf b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/bin/openbtl_ek_lm3s8962.elf index 0a52c7552d8f799ae0b53480062504869af8ed19..d4b493f43f47bba3522a8ccbfa03e25cd03d2e12 100644 GIT binary patch delta 1112 zcmX|=TS!z<6o&VI_KX^%)#TLV)aV&cnUJWHMUa=sA~Gy9x(F&*5lBQtMi{A6=|d8h zwoAi@BBC2fR`W1Lb0G?P=t9&(AZ0!DU?eCKbOE8Y&YU?9d$Z5_{@#&Ued=cV z!wnHARUKJ_LDe257%{J;cOPzZ-bnpnH5EUur)o_Sg0GEt& ztlgJmS_a6FSdr{(&}uyQU9yi>do9-vPWh@deO0 z{e|bR%}`UkGS!qBt0|i} z6So9b*~l%EtvtbKJVb8WY&LGW?Pu0SZml-zvfQGKdTBV_HtMy8)5O({61rxiQ45`A zG(qU8jV4SqM=U~wTi{cr(VTLhIhKFa8!r#Phe~`v3p&aiLM%>w=lmwP+=ut1{6z~jYD>HZwdzuQJ$9-O@dE5tf8#}HPz4Et z;%rScc)wJo3*nSu>edQB9SeSP-@b>RCeA1JoN>TY63EThob(!mQ{&;wNx)MXC@Be~ ztUP%+3uKpRX-OSVUD99Z(K3<-egbk>Lw;_)d^t26g1#%!SzIe$r)4zwgN70GFAEs* z&dFjKmHk2ayrV+)$>Z{cC~hp1-ij8(Z&U@h$uUt8l!K>qc>%hd>C)u@^wK8zN$T=m Thb})3%{`5Jgd;7dak2hCjC8?d delta 1112 zcmX|b zAcTHZ5!#C()fPJG90by^k|~5fF!?p~4#9r_oKO5hpkD);A;iY2H1m(Y#U}kI?anxZ zLXSz%X$u}}roh?2XJ-kG*l5;5wpw5-lD(vk2RPDZMV%+OutW*CWo#&kGCHqA zTuDBm-8Ra%&{an3L7HW)&DO11o@O>m$69SPY8?wRdPL^ju+bySoM!HBj?g_D%~|L= zBc05dvXO3@vq5Y_h)3X3Md8#^mubs7&Bo2<_fU&ZY0;Z4)`i#}`%hgXm{wvbk`hQ! zt9rtDs8%n+xyV%uVGjc8PuPH8rB7!gOC6jp%-Dq^4k0p{sD>}~LS*uDxRfr$MNV*E z4NRA!K)stbut%-XUZPwPU&;uH+&qVmq+F$igQ_Z0jY>5X*^e6aDUyvk^*54-V=8;b zK$ki^)9C(O9xsGLPSUh;JoK6UgXgw5IW=>8reREntI(I>*Bk;64vo#1OMq*iudvV; zi?Z`_4M-{0;-WfsUG{2lX$jE)KLL4HgFnMBmxf1!@E#xQEU1w`;}RM@0mBG*cKQr? zv%Nqr%7K6!? 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/ide/lm3s8962_crossworks.hzs b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/ide/lm3s8962_crossworks.hzs index f8927e5c..20dd50a9 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/ide/lm3s8962_crossworks.hzs +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_Crossworks/Boot/ide/lm3s8962_crossworks.hzs @@ -19,8 +19,6 @@ - - @@ -52,9 +50,9 @@ - - - + + + diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_GCC/Boot/bin/openbtl_ek_lm3s8962.elf b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_GCC/Boot/bin/openbtl_ek_lm3s8962.elf index c8d9d9dc093933b7d17f47ca9e360cf154179739..c84c02ae18aa671c7a528364b7ac0cb6f11a6ee0 100644 GIT binary patch delta 1132 zcmYL|OGuPa6vyxX-fv`NG+(2R;$wWGXk(L7U}}&N2tp=GD(DztP)xRPlcY|8L@oqH z>w>t5(5x_B6bRz+P7(AKOui2l`JtE;#RJo=X+Nm|SY_Kui+H1nK3x&! zqY^=zk4lrf5}3?O+_lNPMS@Ji5)W+>w#er+BIOP&GYOg3l{=z#KN)oz_+*PZjVL+F zBuV0zO_D6TRVFS6obs@Em*v*PC5!<+n~a$)9trmJG6+#`A(3#F4Q9ce;s&RVux=LP z6o@PF{6DAhWFDJ2iI@8Xo|qaM5@#koVin{{vJh^znw}!BF&&N(BHi41rnw8Px{#dX#cz^ke5d6$*9ehWN(T>VJd_Q;uIxe?&g(!IifetS zF(@^K@+T=(c!HF>Ot};lIEfCX{S=!s=?2~Uim17g61_?mDAPZ>P(i*K0c2rVp9tVo zZWT%#q?{n-LM{6?)9DP!s5gOXJr+PVYV`t1k_V*lR8s-ngbNur=q~{@pivih<20J} zm2SGGRgcnFZX2#q7a7mV?s^>?^Fwvgg3VnI>y2)7q<`I_9EU2*7NVF(RP>(Lu(MQu z3ENj&?-+2`<>pBTJtg6g{CrddaM$KlRM=5|KI#BSsgyC%Jbpfk{_h+~sdU}}&d3PvVI>SD$SgTidlCP|wJ$`V4S zgd3tLl7vCF2?WsySHiR~DMAP#4584rq84<{o9AmYbKm*>&;Oo}yS5X%wiA2*9acLq ztUq<26wmZQ2QE6pnGLBz7$fs-ov1?S0EoMjE(C@pnju8|QkMC_XK~bMq2IV|=Ccw# zHlLLyk4t2-BJs#3D;DWtvMw=YlXZ)HNh8wezygzyd0nF;YWIs#pMlSIQlAkeNyMqbI?Z0?b!d5cJ?qtRn)l{Dl< z8dr#yf!#v-+NNld8BP7b!6W!%N8&2Djs%5myO#tNoy=czG72&3u>W$4)N@7q61g_n zw`S&LGNw?iXa>=Zk6B4!Ml%N5?4%iM1(*4vh=E?4L@YAE#BkuTO^oOY(l%)na3Ma0 zuA#~?z7!)wy18?gxeKiVNY2j0E~RFCr{%WR2$5Mz2RG%oNsaTmGJrBP>0kgwwI!%A zNSZ?WQIZOG4`~-jOHlzoI+^xS?3GE^=+^f{&6VWqWwJn_{uw|8%5+8$S(wr%gE*bz zLy3bjpHt>sE&I08=`5vDZvs_%BnS^q={ZVCej$asnhNM5>}6c9zXj2R23^#JGicV= zy6Bn<`YHY8wBiPJk@1G?Zq~6eKU60z*xdC!z1D@!^sgJFaVW1xh$0?Q;R>%|W4`_h zHm_frFyN}o$&(HN2#4h7qqYE7ZC*u%9p&evc7c>i857m<^HGBmF6oR0cnxY)B0oD{ zZRxuaqzC=E{^M#-wVzOf T{kdvS|A 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/bin/openbtl_ek_lm3s8962.out b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/bin/openbtl_ek_lm3s8962.out index 1f200ecd8d1e119e407fe81b6eac71f060664d84..d805c26de9a76f635d80b586ac07a7e168a21ec6 100644 GIT binary patch delta 4098 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 delta 4096 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 Fe*sEPvx5Kt diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/blt_conf.h b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/blt_conf.h index 0db60831..7670b2d8 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/blt_conf.h +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/blt_conf.h @@ -155,5 +155,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/hooks.c b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/hooks.c index 1e54f9d4..2f4100b4 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/hooks.c +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/hooks.c @@ -213,4 +213,64 @@ void CopServiceHook(void) #endif /* BOOT_COP_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/lm3s8962.dep b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/lm3s8962.dep index 68a77d37..1e175569 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/lm3s8962.dep +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/lm3s8962.dep @@ -7,16 +7,82 @@ Debug $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\nvm.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.c + $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\types.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\uart.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\uart.h + $PROJ_DIR$\..\..\..\..\Source\assert.h + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\..\..\..\Source\boot.h + $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\..\..\..\Source\com.h + $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\..\..\..\Source\cop.h + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + $PROJ_DIR$\..\..\..\..\Source\xcp.c + $PROJ_DIR$\..\..\..\..\Source\xcp.h + $PROJ_DIR$\..\obj\uartlib.lst + $PROJ_DIR$\..\obj\cpulib.o + $PROJ_DIR$\..\obj\flashlib.o + $PROJ_DIR$\..\obj\flashlib.pbi + $PROJ_DIR$\..\obj\gpio.pbi + $PROJ_DIR$\..\obj\cpulib.pbi + $PROJ_DIR$\..\obj\uartlib.o + $PROJ_DIR$\..\obj\sysctl.o + $PROJ_DIR$\..\obj\interrupt.o + $PROJ_DIR$\..\obj\gpio.o + $PROJ_DIR$\..\obj\uartlib.pbi + $PROJ_DIR$\..\obj\uart.o + $PROJ_DIR$\..\obj\flash.pbi + $PROJ_DIR$\..\obj\cpu.pbi + $PROJ_DIR$\..\obj\nvm.pbi + $PROJ_DIR$\..\obj\uart.pbi + $PROJ_DIR$\..\obj\lm3s6965.pbd + $PROJ_DIR$\..\obj\cstart.o + $PROJ_DIR$\..\obj\vectors.o + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\memory.x + $PROJ_DIR$\..\obj\timer.o + $PROJ_DIR$\..\obj\boot.lst + $PROJ_DIR$\..\obj\main.lst + $PROJ_DIR$\..\obj\vectors.lst + $PROJ_DIR$\..\obj\vectors.pbi + $PROJ_DIR$\..\obj\timer.pbi + $PROJ_DIR$\..\obj\main.pbi + $PROJ_DIR$\..\obj\boot.pbi + $TOOLKIT_DIR$\lib\m7M_tl.a + $PROJ_DIR$\..\bin\openbtl_ek_lm3s6965.srec + $PROJ_DIR$\..\bin\openbtl_ek_lm3s6965.out + $PROJ_DIR$\..\obj\hooks.lst + $PROJ_DIR$\..\obj\assert.o + $PROJ_DIR$\..\obj\assert.lst + $PROJ_DIR$\..\obj\flash.lst + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\..\obj\main.o + $PROJ_DIR$\..\obj\backdoor.lst + $PROJ_DIR$\..\obj\hooks.pbi + $PROJ_DIR$\..\obj\boot.o + $PROJ_DIR$\..\obj\com.o + $PROJ_DIR$\..\obj\hooks.o + $PROJ_DIR$\..\obj\cpu.lst + $PROJ_DIR$\..\obj\uart.lst + $PROJ_DIR$\..\obj\cop.lst + $PROJ_DIR$\..\obj\com.lst + $TOOLKIT_DIR$\lib\dl7M_tln.a + $TOOLKIT_DIR$\lib\rt7M_tl.a $PROJ_DIR$\..\obj\canlib.pbi $PROJ_DIR$\..\obj\can.o $PROJ_DIR$\..\obj\canlib.o - $PROJ_DIR$\..\obj\lm3s8962.pbd - $PROJ_DIR$\..\obj\can.pbi - $PROJ_DIR$\..\obj\canlib.lst - $PROJ_DIR$\..\obj\can.lst $PROJ_DIR$\..\obj\openbtl_ek_lm3s8962.map - $PROJ_DIR$\..\bin\openbtl_ek_lm3s8962.srec $PROJ_DIR$\..\bin\openbtl_ek_lm3s8962.out + $PROJ_DIR$\..\bin\openbtl_ek_lm3s8962.srec + $PROJ_DIR$\..\obj\can.lst + $PROJ_DIR$\..\obj\canlib.lst + $PROJ_DIR$\..\obj\can.pbi + $PROJ_DIR$\..\obj\lm3s8962.pbd $PROJ_DIR$\..\..\..\..\Source\file.h $PROJ_DIR$\..\obj\interrupt.pbi $PROJ_DIR$\..\obj\sysctl.pbi @@ -38,72 +104,6 @@ $PROJ_DIR$\..\obj\flashlib.lst $PROJ_DIR$\..\obj\interrupt.lst $PROJ_DIR$\..\obj\sysctl.lst - $PROJ_DIR$\..\obj\uartlib.lst - $PROJ_DIR$\..\obj\cpulib.o - $PROJ_DIR$\..\obj\flashlib.o - $PROJ_DIR$\..\obj\gpio.o - $PROJ_DIR$\..\obj\interrupt.o - $PROJ_DIR$\..\obj\sysctl.o - $PROJ_DIR$\..\obj\uartlib.o - $PROJ_DIR$\..\obj\flashlib.pbi - $PROJ_DIR$\..\obj\cpulib.pbi - $PROJ_DIR$\..\obj\gpio.pbi - $PROJ_DIR$\..\obj\uartlib.pbi - $PROJ_DIR$\..\obj\uart.o - $PROJ_DIR$\..\obj\flash.pbi - $PROJ_DIR$\..\obj\cpu.pbi - $PROJ_DIR$\..\obj\nvm.pbi - $PROJ_DIR$\..\obj\uart.pbi - $PROJ_DIR$\..\obj\lm3s6965.pbd - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\memory.x - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.c - $PROJ_DIR$\..\..\..\..\Source\assert.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\types.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\uart.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\uart.h - $PROJ_DIR$\..\..\..\..\Source\assert.h - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - $PROJ_DIR$\..\..\..\..\Source\backdoor.h - $PROJ_DIR$\..\..\..\..\Source\boot.c - $PROJ_DIR$\..\..\..\..\Source\boot.h - $PROJ_DIR$\..\..\..\..\Source\com.c - $PROJ_DIR$\..\..\..\..\Source\com.h - $PROJ_DIR$\..\..\..\..\Source\cop.c - $PROJ_DIR$\..\..\..\..\Source\cop.h - $PROJ_DIR$\..\..\..\..\Source\plausibility.h - $PROJ_DIR$\..\..\..\..\Source\xcp.c - $PROJ_DIR$\..\..\..\..\Source\xcp.h - $PROJ_DIR$\..\obj\cstart.o - $PROJ_DIR$\..\obj\vectors.o - $PROJ_DIR$\..\obj\timer.o - $PROJ_DIR$\..\obj\boot.lst - $PROJ_DIR$\..\obj\main.lst - $PROJ_DIR$\..\obj\vectors.lst - $PROJ_DIR$\..\obj\vectors.pbi - $PROJ_DIR$\..\obj\timer.pbi - $PROJ_DIR$\..\obj\main.pbi - $PROJ_DIR$\..\obj\boot.pbi - $PROJ_DIR$\..\obj\timer.lst - $TOOLKIT_DIR$\lib\m7M_tl.a - $PROJ_DIR$\..\bin\openbtl_ek_lm3s6965.srec - $PROJ_DIR$\..\bin\openbtl_ek_lm3s6965.out - $PROJ_DIR$\..\obj\hooks.lst - $PROJ_DIR$\..\obj\assert.o - $PROJ_DIR$\..\obj\assert.lst - $PROJ_DIR$\..\obj\flash.lst - $TOOLKIT_DIR$\lib\shb_l.a - $PROJ_DIR$\..\obj\main.o - $PROJ_DIR$\..\obj\backdoor.lst - $PROJ_DIR$\..\obj\hooks.pbi - $PROJ_DIR$\..\obj\boot.o - $PROJ_DIR$\..\obj\com.o - $PROJ_DIR$\..\obj\hooks.o - $PROJ_DIR$\..\obj\cpu.lst - $PROJ_DIR$\..\obj\uart.lst - $PROJ_DIR$\..\obj\cop.lst - $PROJ_DIR$\..\obj\com.lst - $TOOLKIT_DIR$\lib\dl7M_tln.a $PROJ_DIR$\..\lib\driverlib\cpulib.c $PROJ_DIR$\..\lib\driverlib\debug.h $PROJ_DIR$\..\lib\driverlib\canlib.h @@ -133,7 +133,7 @@ $PROJ_DIR$\..\main.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\vectors.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s - $TOOLKIT_DIR$\lib\rt7M_tl.a + $PROJ_DIR$\..\obj\timer.lst $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\can.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\can.h $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.c @@ -147,58 +147,30 @@ ILINK - 10 8 + 71 70 - - $PROJ_DIR$\..\bin\openbtl_ek_lm3s8962.out - - - ILINK - 8 - - - OBJCOPY - 9 - - - - - ILINK - 49 83 18 90 2 3 91 17 25 33 68 26 34 35 92 36 87 24 37 70 43 38 69 21 86 127 79 97 - - - - - $PROJ_DIR$\..\obj\lm3s6965.pbd - - - BILINK - 15 16 77 14 19 45 40 44 39 41 89 12 76 46 13 75 47 42 74 20 - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\timer.c ICCARM - 78 70 + 127 39 BICOMP - 75 + 44 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 @@ -207,21 +179,21 @@ ICCARM - 84 83 + 52 51 BICOMP - 15 + 81 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 @@ -230,21 +202,21 @@ ICCARM - 94 43 + 62 30 BICOMP - 47 + 34 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 117 120 110 112 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 117 120 110 112 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 117 120 110 112 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 117 120 110 112 @@ -253,21 +225,21 @@ ICCARM - 88 18 + 56 84 BICOMP - 16 + 82 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 @@ -276,21 +248,21 @@ ICCARM - 71 90 + 40 58 BICOMP - 77 + 46 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 @@ -299,21 +271,21 @@ ICCARM - 96 91 + 64 59 BICOMP - 14 + 80 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 129 55 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 129 6 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 129 55 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 129 6 @@ -322,21 +294,21 @@ ICCARM - 95 17 + 63 83 BICOMP - 19 + 85 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 @@ -345,21 +317,30 @@ ICCARM - 22 21 + 88 87 BICOMP - 20 + 86 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 + + + + + $PROJ_DIR$\..\obj\lm3s6965.pbd + + + BILINK + 81 82 46 80 85 32 24 31 22 23 57 78 45 33 79 44 34 29 43 86 @@ -368,13 +349,32 @@ OBJCOPY - 80 + 48 ILINK - 49 83 18 90 91 17 25 33 68 26 34 35 92 36 87 24 37 70 43 38 69 21 86 127 79 97 + 38 51 84 58 59 83 91 20 36 92 21 28 60 27 55 90 26 39 30 25 37 87 54 66 47 65 + + + + + $PROJ_DIR$\..\bin\openbtl_ek_lm3s8962.out + + + ILINK + 70 + + + OBJCOPY + 72 + + + + + ILINK + 38 51 84 58 68 69 59 83 91 20 36 92 21 28 60 27 55 90 26 39 30 25 37 87 54 66 47 65 @@ -383,11 +383,11 @@ ICCARM - 28 33 + 94 20 BICOMP - 40 + 24 @@ -406,21 +406,17 @@ ICCARM - 6 3 + 74 69 BICOMP - 1 + 67 ICCARM - 113 116 118 117 120 100 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 - - - BICOMP - 113 116 118 117 120 100 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 + 113 116 118 117 120 100 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 108 @@ -429,21 +425,21 @@ ICCARM - 29 34 + 95 21 BICOMP - 39 + 22 ICCARM - 114 116 119 120 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 104 108 + 114 116 119 120 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 104 108 BICOMP - 114 116 119 120 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 104 108 + 114 116 119 120 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 104 108 @@ -452,21 +448,21 @@ ICCARM - 27 35 + 93 28 BICOMP - 41 + 23 ICCARM - 115 116 117 119 120 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 106 108 + 115 116 117 119 120 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 106 108 BICOMP - 115 116 117 119 120 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 106 108 + 115 116 117 119 120 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 106 108 @@ -475,21 +471,21 @@ ICCARM - 30 36 + 96 27 BICOMP - 12 + 78 ICCARM - 116 118 120 102 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 + 116 118 120 102 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 108 BICOMP - 116 118 120 102 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 + 116 118 120 102 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 108 @@ -498,21 +494,21 @@ ICCARM - 31 37 + 97 26 BICOMP - 13 + 79 ICCARM - 116 118 119 120 102 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 110 + 116 118 119 120 102 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 108 110 BICOMP - 116 118 119 120 102 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 110 + 116 118 119 120 102 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 108 110 @@ -521,21 +517,21 @@ ICCARM - 32 38 + 19 25 BICOMP - 42 + 29 ICCARM - 116 117 119 120 121 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 112 110 + 116 117 119 120 121 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 108 112 110 BICOMP - 116 117 119 120 121 99 60 53 56 122 65 131 64 0 133 52 58 11 62 67 108 112 110 + 116 117 119 120 121 99 11 4 7 122 16 131 15 0 133 3 9 77 13 18 108 112 110 @@ -544,21 +540,21 @@ ICCARM - 82 92 + 50 60 BICOMP - 89 + 57 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 @@ -567,85 +563,7 @@ ICCARM - 72 87 - - - BICOMP - 76 - - - - - ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 116 117 118 119 120 110 106 - - - BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 116 117 118 119 120 110 106 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\vectors.c - - - ICCARM - 73 69 - - - BICOMP - 74 - - - - - ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 - - - BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s - - - AARM - 68 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\can.c - - - ICCARM - 7 2 - - - BICOMP - 5 - - - - - ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 117 120 110 100 - - - BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 117 120 110 100 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.c - - - ICCARM - 93 25 + 41 55 BICOMP @@ -655,11 +573,89 @@ ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 116 117 118 119 120 110 106 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 116 117 118 119 120 110 106 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\vectors.c + + + ICCARM + 42 37 + + + BICOMP + 43 + + + + + ICCARM + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 + + + BICOMP + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s + + + AARM + 36 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\can.c + + + ICCARM + 73 68 + + + BICOMP + 75 + + + + + ICCARM + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 117 120 110 100 + + + BICOMP + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 117 120 110 100 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.c + + + ICCARM + 61 91 + + + BICOMP + 32 + + + + + ICCARM + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 + + + BICOMP + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 @@ -668,21 +664,21 @@ ICCARM - 85 26 + 53 92 BICOMP - 44 + 31 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 117 120 104 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 117 120 104 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 117 120 104 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 117 120 104 @@ -691,21 +687,21 @@ ICCARM - 23 24 + 89 90 BICOMP - 46 + 33 ICCARM - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 BICOMP - 60 53 56 122 65 131 64 0 133 52 58 11 62 67 + 11 4 7 122 16 131 15 0 133 3 9 77 13 18 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dbgdt b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dbgdt index 1863d7d1..fd65dc8f 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dbgdt +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dbgdt @@ -39,7 +39,7 @@ - + TabID-23054-22949 @@ -55,7 +55,7 @@ - 0 + 0 TabID-1035-22952 @@ -67,7 +67,7 @@ - 0 + 0 TabID-11783-22956 @@ -77,20 +77,20 @@ - 0 + 0 - TextEditor$WS_DIR$\..\main.c0000045296429640TextEditor$WS_DIR$\..\..\..\..\Source\com.h0000010559875987TextEditor$WS_DIR$\..\..\..\..\Source\com.c000005035483548TextEditor$WS_DIR$\..\..\..\..\Source\assert.c000002724262426TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s000003024992499TextEditor$WS_DIR$\..\blt_conf.h0000010592829282TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_LM3S\flash.c000006102837128371TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c000001832923292TextEditor$WS_DIR$\..\..\..\..\Source\boot.c0000018262826360100000010000001 + TextEditor$WS_DIR$\..\main.c0000045296429640TextEditor$WS_DIR$\..\..\..\..\Source\com.h000009759875987TextEditor$WS_DIR$\..\..\..\..\Source\com.c000005035483548TextEditor$WS_DIR$\..\..\..\..\Source\assert.c000002724262426TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s000002524992499TextEditor$WS_DIR$\..\blt_conf.h0000010592829282TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_LM3S\flash.c000006102837128371TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c000001832923292TextEditor$WS_DIR$\..\..\..\..\Source\boot.c0000018262826360100000010000001 - iaridepm.enu1debuggergui.enu1-2-2698238-2-2240243125000241071125000694444-2-2698238-2-2240243125000241071125000694444-2-22411922-2-219242431002083241071125000241071 + iaridepm.enu1debuggergui.enu1-2-2698238-2-2240243125000241071125000694444-2-2698238-2-2240243125000241071125000694444-2-22411922-2-219242431002083241071125000241071 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dni b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dni index 353c3c1e..706f4b7f 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dni +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.dni @@ -9,7 +9,7 @@ TriggerName=main LimitSize=0 ByteLimit=50 [DebugChecksum] -Checksum=-1720845113 +Checksum=-969169161 [Exceptions] StopOnUncaught=_ 0 StopOnThrow=_ 0 diff --git a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.wsdt b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.wsdt index 69d85d6d..fbfa4871 100644 --- a/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.wsdt +++ b/Target/Demo/ARMCM3_LM3S_EK_LM3S8962_IAR/Boot/ide/settings/lm3s8962.wsdt @@ -25,7 +25,7 @@ - + TabID-17931-22022 @@ -37,7 +37,7 @@ - 0 + 0 TabID-24560-22511 @@ -47,20 +47,20 @@ TabID-23843-13527Debug LogDebug-Log - 0 + 0 - TextEditor$WS_DIR$\..\main.c0000045296429640TextEditor$WS_DIR$\..\..\..\..\Source\com.h0000010559875987TextEditor$WS_DIR$\..\..\..\..\Source\com.c000005035483548TextEditor$WS_DIR$\..\..\..\..\Source\assert.c000002724262426TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR\cstart.s000003024992499TextEditor$WS_DIR$\..\blt_conf.h0000010592829282TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM3_LM3S\flash.c000006102837128371TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c000001832923292TextEditor$WS_DIR$\..\..\..\..\Source\boot.c0000018262826360100000010000001 + TextEditor$WS_DIR$\..\main.c000004529642964TextEditor$WS_DIR$\..\blt_conf.h000001369086908610100000010000001 - iaridepm.enu1-2-2775335-2-218716997396167659175521770833-2-21881922-2-21924190100208318849297396167659 + iaridepm.enu1-2-2775335-2-218716997396167659175521770833-2-21881922-2-21924190100208318849297396167659 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/bin/openbtl_olimex_stm32h103.elf b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/bin/openbtl_olimex_stm32h103.elf index 8a258ea4b61d8f10fb1b74d4e8f1a51db2c2444a..ea4d8885d33247c107172bd905f3c441b7b741ab 100644 GIT binary patch delta 1142 zcmYL|T}TvB6vywGJBuTJuwS~nx|^+Hey?pGh_c&SPgX`IMk+}{B^A|+)*7hWl86R^ zFr{J$ec%@9?ppg`L_$UM5?N3$MXm%968d6qk<~dfJJZA5x%d3e|K4-XJ$HI2ZF(qe z{%Qo;<#5Cb;ly~POgypz(726B$MF;TSw?#qV*mos`m$;}1&n1ru2SqR41Y~53;IfN zvIf2AGOoI1gNL-6vT@cH$^w`~^FtLG4dqBo0>E?J%T(u9Ry1d3k+w8i$YBE=zUmGe zg5qF2M<yG2 zLov-3{-1A>Jp$xoJ=x9Rfug~n$H6j84*K!>Z)iNxRDvrphp%5-rc8p{l$Z9l(D;1duts-jH z(P|1+6Us0ET+mU5K~?P|REcOmjQe#qrd)Z>`O_B(^=?XSi(!iKa>5M$NGis~d3O{iZM}nHf{u;;O5+-4$5|n~TWGwF^+KN3ysb`4f zmLjc?=c6w0$V)hS<+Z322IcfvVD~O~g(}A|7M9uR!k(b_OH$N8lE^)U&~=gZ2a!6t zKjz5ygBfFUd{Q`FOlBFA@SRAoUw#yGL8JT*$HVe^%mK}ETHKX?6mFBE6BA%|D&YZ4 zvIReAl>>1HM${Isur2>ZCj+0XVp0KRzr{>t`Ifj9|8pkiGlL>;KoIdUGK1hNW)cs> zLd*^_uV3L{;kF(DR7g*ihefbnav#)e^e*`tkgdAf?bgf~596B?VJBGHumi2vG(b1O zrv%u}ZwNkbkZ1XLrf+Y(|3py{f7ahR$lr6p55bN*fkQmIE7)=*Ig1 delta 1142 zcmYL|e@IhN6vyv*_l-SC$8(!*(=C}|^9P%)ABZuV6@-}`++!T> zF-~0_gCk1Um=(g)17pSF;WdDoO-wq5pAcpnnu-|%mjJZBtl3TiW9g5*s=c1!ua;#% zXAw@8pdDQXG&d9YNV}rQ6SjyEUUeRUlP_$=$@FDBGg5s3x;~@*uhkpeEBs_<5dc z>BCSmC-VQ#*U3HtMCS@g!QM$odg2>8L-6K9edY0sv3t8WXh&&68>lku!xNxYXEDl64>}Pcd9+$V^By z0MzM7G-#-dkO$Fu9eI*yH=$}oy*jE+q8On*j4)BDvp)68v(BBmK&Tzd#8h5v86X zl3j$fP??%^L6I_#W2y3e(g`C$yu)#yvK)6njbco=au2}>DOxZAW~UPF z$0Y0VgE}RcaKII%F;Qy!_!pfFe8|hBJj#BfnaZ*_eJAnfbk+w31^%EQG5}@}0)ue@&2ZdLyajNZIIJ@+BZ!S()3NGGjc9uMBoM!P0m`0PD3B zpqt>g1lY`<2mybHX9Re9U{_V;@qz*#4L5Z2A6%$}Q1iXuL2hadHJ@q1$+Jjn$j_tD d5aQQ6eXgz56+F$ye+@1>p%!k=>~z7G*gxzd#*6>} diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/blt_conf.h b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/blt_conf.h index ad2adfa2..f538af8b 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/blt_conf.h +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/blt_conf.h @@ -122,5 +122,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/hooks.c b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/hooks.c index b3aef8b6..fd73cee7 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/hooks.c +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/hooks.c @@ -298,4 +298,64 @@ void CopServiceHook(void) #endif /* BOOT_COP_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/ide/stm32f103_crossworks.hzs b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/ide/stm32f103_crossworks.hzs index d8ef1965..3f8c30a8 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/ide/stm32f103_crossworks.hzs +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_Crossworks/Boot/ide/stm32f103_crossworks.hzs @@ -40,8 +40,8 @@ - + @@ -54,8 +54,8 @@ - - + + diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_GCC/Boot/bin/openbtl_olimex_stm32h103.elf b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_GCC/Boot/bin/openbtl_olimex_stm32h103.elf index 6176abd3521abb85ef248738b59c559642836b03..32c0fbe1b9eeef7fcea11d12bd04d49fc755fc4e 100644 GIT binary patch delta 1156 zcmX|=T}YEr7{|~5oOksuwYjNnTADg6VQV@14n-NI+gfQsF(e_9idEEw5J4YH*o9V- zWp+R$yvYKEF3KiRb`wEY1$9%<2h@d-gm@D~LeKMVdk5n^=lT8r=Q+C0SHlag~ovF;z*Y$enny| zyeG{%OH;ybEH}`Ee;)c{e05_5eM+!EvQjJJy5OaVTVjINEcI7g6CMk6Z zjyMAPGkuyvm@>$*NW!%>r1EhmbXN*JqW7vR0dS?vVaaf<{ zSyJDNVH2(XI))S8FH=;gLp5y_rk`uB_i=Ch%(lg`66n^^eQ2ueA6P3)N<-&jo}v9? zuk$z0+OxO!VOuKQPxpALP8#$cg+uZiR14tH=FN3d=Axt*Y8fc&Dd_kSD(bazY33w+ z`f5y~Nxeq1`XEk*RY^z{hZ@>i4*LD-#g%wQy;rgssm_t`eziK8>P#hQ;C-G>row6r u@sxUaITUD!?o!TL^+6wU2&w|5grD&`n2wEKsTyx~ZjhArc9ZR4gMe0!hl&#Uio7 z)ary-Nnjv$S2pRQZXygX3W~xmLI}JmLV^%1q4(Y9HyGbJ@9%led){;26C1F{2JBa# zqauhQT^U3PMs!OMK6BW!;1a^P9ghXE6VW0$>lS9N5CY>zAjIZ=8lyzHy(Tf1 zK9Hs`p-E>qR!V8YKPUY$o>87dpN;rQvdl!p(d(v&Phx`B%=8u|COj5d1~2Udr}>L0 z95GgAD7>?j87iT4bhE~%@ZBQ56q#nSDzRpfRhjhMWHP4Umg{-PlAi1vyvIjW6MZ_E zwvseTkztBt_V6xJ<2EXlHqIhf*9C#c2@~y{m5xuGVL{@em0=;3yPVgUlNhncT#78R zXG-F!MW&J@>WK5Uh9urvXeeb`X49mBMT<-t$s!-JXWpO_STAxuMLO8iXTYV_NneV* zXOCfn-y()>0#UB0j!k7Yge+7>h)E8UkPRm-5=xO-CWF9$MFtahopbKgc?P_&$Zh6k zap52JMK1|4KDbc`ccL9!3Ax@;4`*>cR*2?}QqEV@D)~=nu)!nDG+G0PbyqzqP@;$G z(TGz0l|HrQm^R3+K6tVK{C-(e@Auo%f~i@O?P*g&AbeL0uC 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/bin/openbtl_olimex_stm32h103.out b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/bin/openbtl_olimex_stm32h103.out index db825dbc9829bbf5d02ac8705a2e9a62fe7788a4..6f274814b07a70d61d350e6ee733573948c698e5 100644 GIT binary patch delta 5346 zcmaJ_30xIr*MH7)xeLy{m&+ocp`ap&8!Bk-S)#Zmk`|h;LO@}nlAxlYVxpiRiIX04 z-$B99ceK&c!ob`G#Vv)&oQvD^w+ zBkst13`S}F9)CM9if8s+Cz|u$D-a_kOSFxPn6|$L3Z$e1l>9g;`Ey!2N-1(AP#&rd zJ_FLN`l3*&NZ#RENRqZ62~Z@iel;Ap-4Lm5!J7bOQqs{50M$~?H`f9BN-0JDz}X1t zz%dR`Bpv*gjHZZ(kKcoyQqGB&fTAusNsdUHPrVAdHKQ0yvlAa(a+dx$O|@Sm>dqDt zJ!Pet=al=<;;-#hImYZTB1_{eb}Gps#^n-)z4rXquw5E|!GZE7zF%5QY3qHll(sQn zqRL6tm;7~9K##IwqSa-mi5@I3C7SWQf=sBmPPFHZ>(pK@H!s5q>E2CB%?h#Rhhn0I zx2{lV>u!GrIztp=i8{qq@tvO@fI$qc{F11-N+$Ykm2&^loi8C!?0@&F?nVq_f9Y_A z7kG(%?>(m21F9EL?2`0zf6(PkV=O^$jk?JLy`Fl~>G9V@FIefyTID|Ui9(%z|B~pr z-czCjNPv%HRI4)8H;X{_7s>6@Peo1%kvc{w}6EEqhi9Q3oahgpEJz?+Vd{FWXz03^x38Q^UWNjO@7LO6j0XU4wW~hZIInhBeW|WgHK%H?|-tVZav2v9YP^CR&I~Qd=gI-PH zPe?!ySE$u`EoE#rdbxrtc6NhuI3pX~fl8ksyEju-5A<$M(naX?5-qW^hlhf?$n9Fd z8$d24wIn!BPV@vP>QhYjQhs7;E2t#Z>8;^+l9}8FifQTP4f(Ja?|8#nT^D35$DVTT zB5!C5tHDhL7}F$1#tohJ?sR5f$e8&y4)cXM9u1jqBt#@ko<4186!ZLsB+9YE7m}e2 z!`neKsK&YNU@?qX?FT-v9DV&D1@>c}AGCqBSmFn+v{d?$d=$pChci{kK?9g<1LQ<#eq~1%2 zVX#9Jq+nGF7O6b8<7ZA~uv633k5FwF#+pRNGswYx9pEDf!oZHu7AkOjM{;^E-slKk zun?gWxY5$A6Nz}>`cB~Km1SpQDWrXZeC*t;-p?#MAH~n@T`)fY;_Ma92)fqen9k6; zSq&+DPD(boF1Q*y{J1lvzoz!0zronJ*y$0p!!M+aq^u}9HLuUk zFIw!-jRFnCyl&J0Sy50-!DbTZbP9KvQMi89)=(1=|IJw^zBr#1gyF zs3mJf&n=c4Iw<*G(+&3qz;t_sV|a-&g0};qwfji?J)Mn3X(n$$Q`O5*u zINOSzJ>i7DbamlItq8a<2wulNy7{;$A)30h^^lT-iAvmco^hRxO z=%CNFn%VIWGvQ4l8DI2G!A7kF_^=aDhfLz#Vbz}2C+?a;?{t)snJ5KEnxAc-#bI(6CgE4jh zq`1G(SH>pe=+_`re*0Az&2d066gN!a5!V-M;ekOg7IzMUS^5|H`)DwH)$GNpj4i

Ejz9m>&@2zdDKIr7KqD9HMk9L+|@cPU4Y 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 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dbgdt b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dbgdt index 9ac15e16..27b949a5 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dbgdt +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dbgdt @@ -75,14 +75,14 @@ - TextEditor$WS_DIR$\..\main.c0000032287228720TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c00000110583758510100000010000001 + TextEditor$WS_DIR$\..\main.c0000032287228720TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c0000011058375851TextEditor$WS_DIR$\..\hooks.c00000000TextEditor$WS_DIR$\..\blt_conf.h0000093864286420100000010000001 - iaridepm.enu1debuggergui.enu1-2-2737259-2-2261204135938202381135938733135-2-2737462-2-2261204135938202381241667733135-2460737795460-2200200104167198413174479733135-2-22021922-2-219242041002083202381135938202381 + iaridepm.enu1debuggergui.enu1-2-2737259-2-2261204135938202381135938733135-2-2737462-2-2261204135938202381241667733135-2460737795460-2200200104167198413174479733135-2-22021922-2-219242041002083202381135938202381 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dni b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dni index 001ad2c5..2c9eb200 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dni +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.dni @@ -18,7 +18,7 @@ ActionState=1 Enabled=0 ShowSource=1 [DebugChecksum] -Checksum=1854575004 +Checksum=1209114256 [DisAssemblyWindow] NumStates=_ 1 State 1=_ 1 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.wsdt b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.wsdt index 8cda8e19..2055f906 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.wsdt +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/settings/stm32f103.wsdt @@ -17,7 +17,7 @@ 20105928270201413664941138 - + TabID-32216-31616 @@ -29,20 +29,20 @@ - 0TabID-12497-1878BuildBuildTabID-2690-2881Debug LogDebug-LogTabID-24296-22939Ambiguous DefinitionsSelect-Ambiguous-Definitions0 + 0TabID-12497-1878BuildBuildTabID-2690-2881Debug LogDebug-LogTabID-24296-22939Ambiguous DefinitionsSelect-Ambiguous-Definitions0 - TextEditor$WS_DIR$\..\main.c000003228722872TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c0000011058375851TextEditor$WS_DIR$\..\hooks.c00000000TextEditor$WS_DIR$\..\blt_conf.h00000433647364730100000010000001 + TextEditor$WS_DIR$\..\main.c0000032287228720TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c0000011058375851TextEditor$WS_DIR$\..\hooks.c00000000TextEditor$WS_DIR$\..\blt_conf.h0000093864286420100000010000001 - iaridepm.enu1-2-2726454-2-2261203135938201389237500722222-2-22371922-2-219242391002083237103135938201389 + iaridepm.enu1-2-2726454-2-2261203135938201389237500722222-2-22371922-2-219242391002083237103135938201389 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/stm32f103.dep b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/stm32f103.dep index 2d5d4644..fd8e3852 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/stm32f103.dep +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32H103_IAR/Boot/ide/stm32f103.dep @@ -6,11 +6,10 @@ Debug - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - $PROJ_DIR$\..\lib\USB_FS_DEVICE\inc\usb_def.h - $PROJ_DIR$\..\lib\USB_FS_DEVICE\inc\usb_init.h $PROJ_DIR$\..\lib\USB_FS_DEVICE\inc\usb_core.h + $PROJ_DIR$\..\lib\USB_FS_DEVICE\inc\usb_init.h $PROJ_DIR$\..\lib\USB_FS_DEVICE\src\usb_core.c + $PROJ_DIR$\..\lib\USB_FS_DEVICE\inc\usb_def.h $PROJ_DIR$\..\lib\USB_FS_DEVICE\src\usb_init.c $PROJ_DIR$\..\lib\USB_FS_DEVICE\src\usb_int.c $PROJ_DIR$\..\lib\USB_FS_DEVICE\inc\usb_int.h @@ -40,6 +39,7 @@ $PROJ_DIR$\..\usb_prop.h $PROJ_DIR$\..\usb_pwr.c $PROJ_DIR$\..\usb_pwr.h + $PROJ_DIR$\..\..\..\..\Source\assert.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\cstart.s $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\vectors.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\can.c @@ -48,7 +48,6 @@ $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\flash.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\flash.h $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\nvm.c - $PROJ_DIR$\..\..\..\..\Source\assert.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\nvm.h $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\timer.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\timer.h @@ -57,6 +56,7 @@ $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\usb.c $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\usb.h $PROJ_DIR$\..\..\..\..\Source\assert.h + $PROJ_DIR$\..\..\..\..\Source\backdoor.c $PROJ_DIR$\..\..\..\..\Source\backdoor.h $PROJ_DIR$\..\..\..\..\Source\boot.c $PROJ_DIR$\..\..\..\..\Source\boot.h @@ -70,13 +70,13 @@ $TOOLKIT_DIR$\lib\shb_l.a $PROJ_DIR$\..\obj\stm32f10x_adc.o $PROJ_DIR$\Debug\Obj\stm32f10x_crc.o - $TOOLKIT_DIR$\inc\c\stdint.h - $PROJ_DIR$\..\obj\core_cm3.lst - $PROJ_DIR$\Debug\Obj\stm32f10x_i2c.o $TOOLKIT_DIR$\inc\c\ycheck.h - $PROJ_DIR$\..\memory.x $PROJ_DIR$\..\obj\system_stm32f10x.lst + $PROJ_DIR$\..\memory.x + $PROJ_DIR$\Debug\Obj\stm32f10x_i2c.o $PROJ_DIR$\Debug\Obj\stm32f10x_tim.pbi + $PROJ_DIR$\..\obj\core_cm3.lst + $TOOLKIT_DIR$\inc\c\stdint.h $PROJ_DIR$\..\obj\hw.lst $PROJ_DIR$\..\obj\os.lst $PROJ_DIR$\Debug\Obj\stm32f10x_spi.pbi @@ -119,6 +119,44 @@ $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_pwr.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_spi.h + $PROJ_DIR$\..\obj\usb.lst + $PROJ_DIR$\..\obj\nvm.o + $PROJ_DIR$\..\obj\can.o + $PROJ_DIR$\..\obj\usb.o + $PROJ_DIR$\..\obj\cpu.o + $PROJ_DIR$\..\obj\flash.o + $PROJ_DIR$\..\obj\can.pbi + $PROJ_DIR$\..\obj\uart.o + $PROJ_DIR$\..\obj\flash.pbi + $PROJ_DIR$\..\obj\cpu.pbi + $PROJ_DIR$\..\obj\nvm.pbi + $PROJ_DIR$\..\obj\uart.pbi + $PROJ_DIR$\..\obj\usb.pbi + $PROJ_DIR$\..\obj\usb_desc.pbi + $PROJ_DIR$\..\obj\usb_pwr.o + $PROJ_DIR$\..\obj\usb_pwr.pbi + $PROJ_DIR$\..\obj\usb_desc.o + $PROJ_DIR$\..\obj\usb_prop.pbi + $PROJ_DIR$\..\obj\usb_istr.o + $PROJ_DIR$\..\obj\usb_prop.o + $PROJ_DIR$\..\obj\usb_istr.pbi + $PROJ_DIR$\..\obj\usb_endp.o + $PROJ_DIR$\..\obj\usb_endp.pbi + $PROJ_DIR$\Debug\Obj\stm32f10x_dma.pbi + $PROJ_DIR$\Debug\Obj\stm32f10x_flash.pbi + $PROJ_DIR$\Debug\Obj\stm32f10x_tim.o + $PROJ_DIR$\..\obj\stm32f10x_dbgmcu.pbi + $PROJ_DIR$\..\obj\stm32f10x_bkp.pbi + $PROJ_DIR$\..\obj\stm32f10x_can.pbi + $PROJ_DIR$\..\obj\stm32f10x_cec.pbi + $PROJ_DIR$\..\obj\stm32f10x_crc.pbi + $PROJ_DIR$\..\obj\stm32f10x_dac.pbi + $PROJ_DIR$\..\obj\stm32f10x_dma.pbi + $PROJ_DIR$\..\obj\stm32f10x_exti.pbi + $PROJ_DIR$\..\obj\hw.pbi + $PROJ_DIR$\Debug\Obj\os.pbi + $PROJ_DIR$\..\..\..\..\Source\file.h + $PROJ_DIR$\..\obj\cop.o $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c @@ -307,9 +345,9 @@ $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_adc.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_can.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_cec.h $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.h $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_cec.h $PROJ_DIR$\..\lib\stdperiphlib\stm32f10x_conf.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_crc.h @@ -340,8 +378,8 @@ $PROJ_DIR$\..\obj\cpu.lst $PROJ_DIR$\..\obj\uart.lst $PROJ_DIR$\..\obj\can.lst - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\memory.x $PROJ_DIR$\..\obj\cop.lst + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\memory.x $PROJ_DIR$\..\obj\com.lst $PROJ_DIR$\..\obj\stm32f10x_sdio.o $PROJ_DIR$\..\obj\stm32f10x_spi.o @@ -357,74 +395,13 @@ $PROJ_DIR$\..\obj\xcp.pbi $PROJ_DIR$\..\obj\xcp.lst $PROJ_DIR$\..\obj\nvm.lst - $PROJ_DIR$\..\obj\usb.lst - $PROJ_DIR$\..\obj\nvm.o - $PROJ_DIR$\..\obj\can.o - $PROJ_DIR$\..\obj\usb.o - $PROJ_DIR$\..\obj\cpu.o - $PROJ_DIR$\..\obj\flash.o - $PROJ_DIR$\..\obj\can.pbi - $PROJ_DIR$\..\obj\uart.o - $PROJ_DIR$\..\obj\flash.pbi - $PROJ_DIR$\..\obj\cpu.pbi - $PROJ_DIR$\..\obj\nvm.pbi - $PROJ_DIR$\..\obj\uart.pbi - $PROJ_DIR$\..\obj\usb.pbi - $PROJ_DIR$\..\obj\usb_desc.pbi - $PROJ_DIR$\..\obj\usb_pwr.o - $PROJ_DIR$\..\obj\usb_pwr.pbi - $PROJ_DIR$\..\obj\usb_desc.o - $PROJ_DIR$\..\obj\usb_prop.pbi - $PROJ_DIR$\..\obj\usb_istr.o - $PROJ_DIR$\..\obj\usb_prop.o - $PROJ_DIR$\..\obj\usb_istr.pbi - $PROJ_DIR$\..\obj\usb_endp.o - $PROJ_DIR$\..\obj\usb_endp.pbi - $PROJ_DIR$\Debug\Obj\stm32f10x_dma.pbi - $PROJ_DIR$\Debug\Obj\stm32f10x_flash.pbi - $PROJ_DIR$\Debug\Obj\stm32f10x_tim.o - $PROJ_DIR$\..\obj\stm32f10x_dbgmcu.pbi - $PROJ_DIR$\..\obj\stm32f10x_bkp.pbi - $PROJ_DIR$\..\obj\stm32f10x_can.pbi - $PROJ_DIR$\..\obj\stm32f10x_cec.pbi - $PROJ_DIR$\..\obj\stm32f10x_crc.pbi - $PROJ_DIR$\..\obj\stm32f10x_dac.pbi - $PROJ_DIR$\..\obj\stm32f10x_dma.pbi - $PROJ_DIR$\..\obj\stm32f10x_exti.pbi - $PROJ_DIR$\..\obj\hw.pbi - $PROJ_DIR$\Debug\Obj\os.pbi - $PROJ_DIR$\..\..\..\..\Source\file.h - $PROJ_DIR$\..\obj\cop.o - - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - - - ICCARM - 327 265 - - - BICOMP - 141 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - [ROOT_NODE] ILINK - 130 199 + 168 237 @@ -433,21 +410,21 @@ ICCARM - 134 142 + 172 180 BICOMP - 122 + 160 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 @@ -456,21 +433,21 @@ ICCARM - 198 143 + 236 181 BICOMP - 148 + 186 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 @@ -479,17 +456,21 @@ ICCARM - 132 144 + 170 182 BICOMP - 123 + 161 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 + + + BICOMP + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 @@ -498,21 +479,21 @@ ICCARM - 196 145 + 234 183 BICOMP - 124 + 162 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 @@ -521,21 +502,21 @@ ICCARM - 128 146 + 166 184 BICOMP - 125 + 163 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 @@ -544,7 +525,122 @@ ICCARM - 127 147 + 165 185 + + + BICOMP + 164 + + + + + ICCARM + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 + + + BICOMP + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 + + + + + $PROJ_DIR$\..\lib\CMSIS\CM3\CoreSupport\core_cm3.c + + + ICCARM + 69 206 + + + BICOMP + 382 + + + + + ICCARM + 70 64 317 195 74 312 107 283 + + + BICOMP + 70 64 317 195 74 312 107 283 + + + + + $PROJ_DIR$\..\lib\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c + + + ICCARM + 65 380 + + + BICOMP + 328 + + + + + ICCARM + 17 16 70 64 317 195 74 312 107 283 345 19 + + + BICOMP + 17 16 70 64 317 195 74 312 107 283 345 19 + + + + + $PROJ_DIR$\..\hooks.c + + + ICCARM + 360 368 + + + BICOMP + 367 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 17 16 70 64 317 195 74 312 107 283 345 19 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 17 16 70 64 317 195 74 312 107 283 345 19 + + + + + $PROJ_DIR$\..\main.c + + + ICCARM + 260 297 + + + BICOMP + 254 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 17 16 70 64 317 195 74 312 107 283 345 19 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 17 16 70 64 317 195 74 312 107 283 345 19 + + + + + $PROJ_DIR$\..\usb_desc.c + + + ICCARM + 235 129 BICOMP @@ -554,126 +650,11 @@ ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 25 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 - - - - - $PROJ_DIR$\..\lib\CMSIS\CM3\CoreSupport\core_cm3.c - - - ICCARM - 65 168 - - - BICOMP - 344 - - - - - ICCARM - 64 67 279 157 74 274 107 245 - - - BICOMP - 64 67 279 157 74 274 107 245 - - - - - $PROJ_DIR$\..\lib\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c - - - ICCARM - 69 342 - - - BICOMP - 290 - - - - - ICCARM - 18 17 64 67 279 157 74 274 107 245 307 20 - - - BICOMP - 18 17 64 67 279 157 74 274 107 245 307 20 - - - - - $PROJ_DIR$\..\hooks.c - - - ICCARM - 322 330 - - - BICOMP - 329 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 18 17 64 67 279 157 74 274 107 245 307 20 - - - BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 18 17 64 67 279 157 74 274 107 245 307 20 - - - - - $PROJ_DIR$\..\main.c - - - ICCARM - 222 259 - - - BICOMP - 216 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 18 17 64 67 279 157 74 274 107 245 307 20 - - - BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 18 17 64 67 279 157 74 274 107 245 307 20 - - - - - $PROJ_DIR$\..\usb_desc.c - - - ICCARM - 197 367 - - - BICOMP - 364 - - - - - ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 26 - - - BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 26 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 25 @@ -682,21 +663,21 @@ ICCARM - 133 372 + 171 134 BICOMP - 373 + 135 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 26 29 33 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 25 28 32 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 26 29 33 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 25 28 32 @@ -705,21 +686,21 @@ ICCARM - 195 369 + 233 131 BICOMP - 371 + 133 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 31 33 29 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 30 32 28 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 31 33 29 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 30 32 28 @@ -728,21 +709,21 @@ ICCARM - 200 370 + 238 132 BICOMP - 368 + 130 ICCARM - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 31 26 33 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 30 25 32 BICOMP - 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 31 26 33 + 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 30 25 32 @@ -751,141 +732,21 @@ ICCARM - 131 365 + 169 127 BICOMP - 366 + 128 ICCARM - 18 17 64 67 279 157 74 274 107 245 307 20 8 15 24 12 1 3 2 10 7 14 33 46 + 17 16 70 64 317 195 74 312 107 283 345 19 7 14 23 11 3 0 1 9 6 13 32 45 BICOMP - 18 17 64 67 279 157 74 274 107 245 307 20 8 15 24 12 1 3 2 10 7 14 33 46 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\cstart.s - - - AARM - 177 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\vectors.c - - - ICCARM - 221 211 - - - BICOMP - 218 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\can.c - - - ICCARM - 333 353 - - - BICOMP - 357 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\cpu.c - - - ICCARM - 331 355 - - - BICOMP - 360 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\flash.c - - - ICCARM - 326 356 - - - BICOMP - 359 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\nvm.c - - - ICCARM - 350 352 - - - BICOMP - 361 - - - - - ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 - - - BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 17 16 70 64 317 195 74 312 107 283 345 19 7 14 23 11 3 0 1 9 6 13 32 45 @@ -894,21 +755,145 @@ ICCARM - 325 324 + 363 362 BICOMP - 285 + 323 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\cstart.s + + + AARM + 215 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\vectors.c + + + ICCARM + 259 249 + + + BICOMP + 256 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\can.c + + + ICCARM + 371 115 + + + BICOMP + 119 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\cpu.c + + + ICCARM + 369 117 + + + BICOMP + 122 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\flash.c + + + ICCARM + 364 118 + + + BICOMP + 121 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\nvm.c + + + ICCARM + 388 114 + + + BICOMP + 123 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 @@ -917,21 +902,21 @@ ICCARM - 223 212 + 261 250 BICOMP - 217 + 255 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 @@ -940,21 +925,21 @@ ICCARM - 332 358 + 370 120 BICOMP - 362 + 124 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 @@ -963,21 +948,44 @@ ICCARM - 351 354 + 113 116 BICOMP - 363 + 125 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 26 33 29 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 25 32 28 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 8 18 17 64 67 279 157 74 274 107 245 307 20 15 24 12 1 3 2 10 7 14 26 33 29 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 7 17 16 70 64 317 195 74 312 107 283 345 19 14 23 11 3 0 1 9 6 13 25 32 28 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 365 303 + + + BICOMP + 179 + + + + + ICCARM + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 + + + BICOMP + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 @@ -986,21 +994,21 @@ ICCARM - 219 261 + 257 299 BICOMP - 213 + 251 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 @@ -1009,21 +1017,21 @@ ICCARM - 336 140 + 374 178 BICOMP - 286 + 324 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 49 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 48 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 49 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 48 @@ -1032,21 +1040,21 @@ ICCARM - 335 388 + 372 150 BICOMP - 347 + 385 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 @@ -1055,21 +1063,21 @@ ICCARM - 349 264 + 387 302 BICOMP - 348 + 386 ICCARM - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 BICOMP - 53 46 50 21 58 38 57 43 40 45 51 387 55 60 + 53 45 49 20 58 38 57 42 40 44 51 149 55 60 @@ -1078,17 +1086,17 @@ ICCARM - 100 320 + 100 358 BICOMP - 230 + 268 ICCARM - 207 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 206 208 112 114 116 118 297 + 245 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 244 246 112 152 154 156 335 @@ -1097,17 +1105,17 @@ ICCARM - 103 338 + 103 376 BICOMP - 238 + 276 ICCARM - 112 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 114 116 118 297 + 112 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 152 154 156 335 @@ -1116,17 +1124,17 @@ ICCARM - 105 339 + 105 377 BICOMP - 235 + 273 ICCARM - 114 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 116 118 297 + 152 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 154 156 335 @@ -1135,17 +1143,17 @@ ICCARM - 106 340 + 106 378 BICOMP - 234 + 272 ICCARM - 116 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 118 297 + 154 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 156 335 @@ -1154,17 +1162,17 @@ ICCARM - 83 341 + 83 379 BICOMP - 231 + 269 ICCARM - 118 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 297 + 156 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 335 @@ -1173,17 +1181,17 @@ ICCARM - 69 342 + 65 380 BICOMP - 290 + 328 ICCARM - 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1192,17 +1200,17 @@ ICCARM - 219 261 + 257 299 BICOMP - 213 + 251 ICCARM - 275 266 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 268 269 270 276 + 313 304 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 306 307 308 314 @@ -1211,17 +1219,17 @@ ILINK - 199 + 237 OBJCOPY - 129 + 167 ILINK - 334 324 265 261 353 140 388 168 355 177 356 330 259 352 342 212 358 354 142 367 372 143 144 369 145 370 365 146 147 211 264 61 248 228 244 + 373 362 303 299 115 178 150 206 117 215 118 368 297 114 380 250 120 116 180 129 134 181 182 131 183 132 127 184 185 249 302 61 286 266 282 @@ -1230,7 +1238,7 @@ BILINK - 173 309 172 243 386 312 313 314 78 277 256 257 374 85 375 249 164 108 76 79 77 280 75 73 70 281 252 137 + 211 347 210 281 148 350 351 352 78 315 294 295 136 85 137 287 202 108 76 79 77 318 75 73 68 319 290 175 @@ -1239,17 +1247,17 @@ ICCARM - 221 211 + 259 249 BICOMP - 218 + 256 ICCARM - 275 266 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 268 269 270 276 + 313 304 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 306 307 308 314 @@ -1258,17 +1266,17 @@ ICCARM - 169 343 + 207 381 BICOMP - 236 + 274 ICCARM - 155 153 158 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 151 + 193 191 196 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 189 @@ -1277,7 +1285,7 @@ AARM - 177 + 215 @@ -1290,13 +1298,13 @@ BICOMP - 289 + 327 ICCARM - 153 + 191 @@ -1305,17 +1313,17 @@ ICCARM - 71 346 + 71 384 BICOMP - 385 + 147 ICCARM - 155 153 158 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 151 + 193 191 196 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 189 @@ -1324,17 +1332,17 @@ ICCARM - 91 209 + 91 247 BICOMP - 382 + 144 ICCARM - 179 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 217 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1343,17 +1351,17 @@ ICCARM - 92 139 + 92 177 BICOMP - 377 + 139 ICCARM - 188 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 226 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1362,17 +1370,17 @@ ICCARM - 93 225 + 93 263 BICOMP - 384 + 146 ICCARM - 184 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 222 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1381,17 +1389,17 @@ ICCARM - 94 226 + 94 264 BICOMP - 227 + 265 ICCARM - 186 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 190 192 194 202 110 207 206 208 112 114 116 118 297 + 224 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1400,7 +1408,264 @@ ICCARM - 104 210 + 104 248 + + + BICOMP + 145 + + + + + ICCARM + 223 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c + + + ICCARM + 95 216 + + + BICOMP + 270 + + + + + ICCARM + 228 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 230 232 240 110 245 244 246 112 152 154 156 335 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c + + + ICCARM + 96 354 + + + BICOMP + 325 + + + + + ICCARM + 230 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 232 240 110 245 244 246 112 152 154 156 335 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c + + + ICCARM + 97 355 + + + BICOMP + 278 + + + + + ICCARM + 232 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 240 110 245 244 246 112 152 154 156 335 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c + + + ICCARM + 98 356 + + + BICOMP + 277 + + + + + ICCARM + 240 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 110 245 244 246 112 152 154 156 335 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c + + + ICCARM + 99 357 + + + BICOMP + 279 + + + + + ICCARM + 110 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 245 244 246 112 152 154 156 335 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c + + + ICCARM + 101 359 + + + BICOMP + 267 + + + + + ICCARM + 244 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 246 112 152 154 156 335 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c + + + ICCARM + 102 375 + + + BICOMP + 280 + + + + + ICCARM + 246 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 112 152 154 156 335 + + + + + $PROJ_DIR$\..\bin\demoprog_olimex_stm32p103.out + + + OBJCOPY + 301 + + + + + ILINK + 66 299 206 215 296 298 297 203 62 204 201 200 199 247 177 248 263 264 216 354 355 356 357 358 359 375 376 377 378 379 380 250 249 61 286 266 282 + + + + + $PROJ_DIR$\..\cstart.s + + + AARM + 215 + + + + + $PROJ_DIR$\..\led.c + + + ICCARM + 258 298 + + + BICOMP + 253 + + + + + ICCARM + 313 304 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 306 307 308 314 + + + + + $PROJ_DIR$\..\timer.c + + + ICCARM + 261 250 + + + BICOMP + 255 + + + + + ICCARM + 313 304 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 306 307 308 314 + + + + + $PROJ_DIR$\..\irq.c + + + ICCARM + 262 296 + + + BICOMP + 252 + + + + + ICCARM + 313 304 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 306 307 308 314 + + + + + $PROJ_DIR$\Debug\Exe\stm32f103.out + + + ILINK + 66 173 316 205 213 198 214 209 320 321 63 208 289 291 292 293 192 288 67 212 80 284 285 81 348 138 346 349 353 61 286 266 282 + + + + + $PROJ_DIR$\..\bin\stm32f103.out + + + OBJCOPY + 271 + + + + + ILINK + 66 299 206 215 296 298 297 203 62 204 201 200 199 247 177 248 263 264 216 354 355 356 357 358 359 375 376 377 378 379 380 250 249 61 286 266 282 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\misc.c + + + ICCARM + 90 203 BICOMP @@ -1410,264 +1675,7 @@ ICCARM - 185 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c - - - ICCARM - 95 178 - - - BICOMP - 232 - - - - - ICCARM - 190 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 192 194 202 110 207 206 208 112 114 116 118 297 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c - - - ICCARM - 96 316 - - - BICOMP - 287 - - - - - ICCARM - 192 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 194 202 110 207 206 208 112 114 116 118 297 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c - - - ICCARM - 97 317 - - - BICOMP - 240 - - - - - ICCARM - 194 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 202 110 207 206 208 112 114 116 118 297 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c - - - ICCARM - 98 318 - - - BICOMP - 239 - - - - - ICCARM - 202 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 110 207 206 208 112 114 116 118 297 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c - - - ICCARM - 99 319 - - - BICOMP - 241 - - - - - ICCARM - 110 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 207 206 208 112 114 116 118 297 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c - - - ICCARM - 101 321 - - - BICOMP - 229 - - - - - ICCARM - 206 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 208 112 114 116 118 297 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c - - - ICCARM - 102 337 - - - BICOMP - 242 - - - - - ICCARM - 208 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 112 114 116 118 297 - - - - - $PROJ_DIR$\..\bin\demoprog_olimex_stm32p103.out - - - OBJCOPY - 263 - - - - - ILINK - 68 261 168 177 258 260 259 165 62 166 163 162 161 209 139 210 225 226 178 316 317 318 319 320 321 337 338 339 340 341 342 212 211 61 248 228 244 - - - - - $PROJ_DIR$\..\cstart.s - - - AARM - 177 - - - - - $PROJ_DIR$\..\led.c - - - ICCARM - 220 260 - - - BICOMP - 215 - - - - - ICCARM - 275 266 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 268 269 270 276 - - - - - $PROJ_DIR$\..\timer.c - - - ICCARM - 223 212 - - - BICOMP - 217 - - - - - ICCARM - 275 266 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 268 269 270 276 - - - - - $PROJ_DIR$\..\irq.c - - - ICCARM - 224 258 - - - BICOMP - 214 - - - - - ICCARM - 275 266 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 268 269 270 276 - - - - - $PROJ_DIR$\Debug\Exe\stm32f103.out - - - ILINK - 68 135 278 167 175 160 176 171 282 283 63 170 251 253 254 255 154 250 66 174 80 246 247 81 310 376 308 311 315 61 248 228 244 - - - - - $PROJ_DIR$\..\bin\stm32f103.out - - - OBJCOPY - 233 - - - - - ILINK - 68 261 168 177 258 260 259 165 62 166 163 162 161 209 139 210 225 226 178 316 317 318 319 320 321 337 338 339 340 341 342 212 211 61 248 228 244 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\misc.c - - - ICCARM - 90 165 - - - BICOMP - 345 - - - - - ICCARM - 297 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 + 335 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 @@ -1676,17 +1684,17 @@ ICCARM - 86 166 + 86 204 BICOMP - 378 + 140 ICCARM - 293 292 301 64 67 279 157 74 274 107 245 307 120 304 298 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 331 330 340 70 64 317 195 74 312 107 283 345 158 342 336 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1699,13 +1707,13 @@ BICOMP - 136 + 174 ICCARM - 298 292 301 64 67 279 157 74 274 107 245 307 120 304 293 299 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 336 330 340 70 64 317 195 74 312 107 283 345 158 342 331 337 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1714,17 +1722,17 @@ ICCARM - 87 163 + 87 201 BICOMP - 379 + 141 ICCARM - 299 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 303 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 337 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 339 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1733,17 +1741,17 @@ ICCARM - 84 162 + 84 200 BICOMP - 380 + 142 ICCARM - 303 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 306 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 339 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 344 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1752,17 +1760,17 @@ ICCARM - 65 168 + 69 206 BICOMP - 344 + 382 ICCARM - 64 67 279 157 74 274 107 245 + 70 64 317 195 74 312 107 283 @@ -1771,17 +1779,17 @@ ICCARM - 89 161 + 89 199 BICOMP - 381 + 143 ICCARM - 306 292 301 64 67 279 157 74 274 107 245 307 120 304 298 293 299 303 179 188 185 184 186 190 192 194 202 110 207 206 208 112 114 116 118 297 + 344 330 340 70 64 317 195 74 312 107 283 345 158 342 336 331 337 339 217 226 223 222 224 228 230 232 240 110 245 244 246 112 152 154 156 335 @@ -1790,13 +1798,13 @@ OBJCOPY - 328 + 366 ILINK - 334 324 265 261 353 140 388 168 355 177 356 330 259 352 342 212 358 354 211 264 61 248 228 244 + 373 362 303 299 115 178 150 206 117 215 118 368 297 114 380 250 120 116 249 302 61 286 266 282 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.elf b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/bin/openbtl_olimex_stm32p103.elf index 5e3d01c38e47c3b0d9f2d6f71904ef3ca940843b..1cb8435f2b6ec394b49f4a6f6b4e70f778141bd0 100644 GIT binary patch delta 1148 zcmYL|Ur19?9LImZdp4PE)^yYD&Nf|xoJ}N~XtOQL2P+hkD6l{TBYG%&agkATghD7t z#(fYX3?IyhfkvTF`BD$|Qi;6;k@k>aW)I3X$PoMe&aStIvz`0>e81<<@0_zUZrvHT zPLFRSml5Cl!19Hfk^pN<5CBm@{@%=K*AT!q7LodSpuaXKz!3Y^F-?}DG8x^Aan`o6 zk~~h*4(9ZI_?Yzq#2^U`Inn--wL%4xI8VbD-tx;&?n9A@XR(Lbv8f=g8iq|p8te}$ z*ewu+Vq`@Q^>b>8Qa%GM=_wbZK1xLl)F+ZM=Gfp7ClKZSZZi)alFAS*rEtyhzpnd{d%qd^m*MeLSg(3C5~TOM$VP{2S_Itp{DgV1qCNm=<0otZecO6;N$Th-AL zSIBBcj2p;m&P}$!sVYME4OFG0E=D7WIAfp@dE&*_uXHm>_R{{L1mirs2QfCB ziW9BtS936OWNyNPV delta 1148 zcmYL|Ur19?9LImZb2ghfZMx}pwawVgSjWSfeg){S3raD_z70&1rJ`1gmSLQ= z9jqshgR~=g{Qyp|z7H`#!l}Gyd&Al>fk|AX^5p|w?UkRQ!o;)KLhLA$h(8TOnbZun z5kI>LNnvDlG{~u(K=c?WC-NyLqcKW_4KyZ`8nbV4#R)`hfA^UOj%rGZmQucH|NpG` z=y?*^w7M^Ovq=TWgUe$H9+VLqomgP0iBsRW-=pQHDV@n zzTz5p$WJJ4Ais{jaH^fquz}ij)XOM^i1P+YX(wKJ`$iv=WIyd6sxZ#w9f%S7KH7X> z`FjFj-3;K=*5}YNN(jI;OAU*WX`BXDV~*-7Z@G!CkMtWj1eQJ;ScfhXK=pUhrYQz4 z{)(8)Gd+yWOtT1;@Ik};B{5oI98l-dZValQ(g$%;{he;b1~r&bY8r8!V#-VMf{Tx_ z*9(>u4Qx_-GD^4w6Rr;_HF27cj7eV|(U|%=aUEu<`TZ(N;k;`F7Egy`O@sYta`HwK2%Rpurt#56j{PnHg=4iY^>k J7>bI1^&i4a!)O2i diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/blt_conf.h b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/blt_conf.h index df194691..cfb59c10 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/blt_conf.h +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/blt_conf.h @@ -191,5 +191,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c index 4ad04ef7..bc2d77d1 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/hooks.c @@ -391,4 +391,63 @@ void FileFirmwareUpdateLogHook(blt_char *info_string) #endif /* BOOT_FILE_SYS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs index 81e02cba..a7ac3c43 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_Crossworks/Boot/ide/stm32f103_crossworks.hzs @@ -40,9 +40,9 @@ - - + + @@ -55,8 +55,8 @@ - - + + diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_GCC/Boot/bin/openbtl_olimex_stm32p103.elf b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_GCC/Boot/bin/openbtl_olimex_stm32p103.elf index 309baf973f3123fedcd9d7a2c8e9ffde500d886c..7ed08decf3235bfe18e5cf0361fa8a50fd3bb199 100644 GIT binary patch delta 1079 zcmX|=O-Phc6o&76?>98z=r}t0GiqvPB-;2>8u^0}Q6`2OShg4{!eT($NCl?zjUtqR zXgGDvglVI;NL*NGpe<`tAy~^SBGSZKxXF#sIp2)m>fZZ4?>Xn5`xBXTMJ8S0SE%g9 zsIKZp5uWI)-Dq___PzEAVMONNbfX3)L;*}_VTaDB<7aq~HO zvMo;{M`Ndu7K(~l9b%71VZ$aK6(bWIvnpZ8-R!IJm|P|yh5a@O#bQ!_akfe7iH0jo-{uNo zlJba@&Q?P?}3C7#;kWt{xxT@6Xh z*<>h2Om_|kbxC}*QCB?ZGLu0AYc?4)V(q`Fpy=FK%BTZX5B!g zP1cE++|df3Oo9W=HcD{B3Vr6F5(k1dDT$MZOh$lVn~Yd@y|1(576VQ!(suau`0$YV&8|A`D z4_Ba0Ukf8UrALYkz6PU0I8U*DP7j9>K$HFx#yvFaU>^?Qf*$EZ725QBUbXALeKe!dbwr9_Zv_`gwn>AM<1V@?VzOXTW tm8?aud9?hzN@@=_2X#_Zx?R&f{^G)h6KZdsTG2&Oc@cB-;i&X>{RfWPy^{a{ delta 1079 zcmX|=Ur1Cz6vpS9xl0>ecTG3{tZt^Znb@wbrBND2g_$U7(7y+%2#W>jMJn8K?<$5N z#A+>!ZN^Gq;)72W8bpsJSRq)1FA+T`3H1Td=5{cdwXbGBWh)LC-{O8N@} z&i&+c2rODohcKPaFnN3eYZmdP$T-Dpa%eoAeUm3+iipGoc3LE!jLBZ1YzbA98ZHuj zQ^c5|lu@N*maB88=XI(&OqeFul^%wtW{^5LIh}rL&@zW%?XaBM`!JDtjz<=mPmv#V zs%ehr7MV^G!|9=*D8~m2MN>f+h)il&waBEFEb=X-ThIWJE`K3K8Y!k%LxDwlQ$(j2 z&4wC_XtpUBRM8T3rp$&m3zaEE(9$kZ0&FsfWKQ5yYbfQuIjNmp-$zVVBphb@KqZV!Q9j#8w zU;XeQEDHzFmHXwRs?R1`TA00*N-gQ8Hhmo$8^G+?0ADXKo@j7gE9M#ln2poF5-T97 zva*=-q)H!4tOMDdX&-$oF~s5G_N0Y6Dq 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/bin/openbtl_olimex_stm32p103.out b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/bin/openbtl_olimex_stm32p103.out index 67b3d34030b70a34ffd055b931badb75d65138a2..1375665566598f4343ca14db783f6a8d4b37735b 100644 GIT binary patch delta 4176 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 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.dbgdt b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.dbgdt index 059e0de2..087f43ba 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.dbgdt +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.dbgdt @@ -26,7 +26,7 @@ 111Disassembly_I05002011 - 200100100100100200resdircExpressionLocationTypeValue100150100207 + 200100100100100200resdircExpressionLocationTypeValue100150100207 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.wsdt b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.wsdt index 0e6fb373..fa68ea6b 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.wsdt +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/settings/stm32f103.wsdt @@ -17,7 +17,7 @@ 300Debug-Log20105928270300Build201413664941138 - + TabID-32216-31616 @@ -29,7 +29,7 @@ - 0TabID-13144-32069BuildBuildTabID-25023-6652Debug LogDebug-LogTabID-18334-26223Find in FilesFind-in-Files0 + 0TabID-13144-32069BuildBuildTabID-25023-6652Debug LogDebug-LogTabID-18334-26223Find in FilesFind-in-Files0 @@ -42,7 +42,7 @@ - iaridepm.enu1-2-2752400-2-215416480208162698209375748016-2-22111922-2-219242131002083211310209375352183 + iaridepm.enu1-2-2752400-2-215416480208162698209375748016-2-22111922-2-219242131002083211310209375352183 diff --git a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/stm32f103.dep b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/stm32f103.dep index 2549e01a..452fa117 100644 --- a/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/stm32f103.dep +++ b/Target/Demo/ARMCM3_STM32_Olimex_STM32P103_IAR/Boot/ide/stm32f103.dep @@ -62,13 +62,13 @@ $PROJ_DIR$\..\..\..\..\Source\file.h $PROJ_DIR$\..\..\..\..\Source\plausibility.h $PROJ_DIR$\..\..\..\..\Source\xcp.h - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c $PROJ_DIR$\..\..\..\..\Source\fatfs\src\diskio.h + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c $PROJ_DIR$\..\..\..\..\Source\fatfs\src\integer.h $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.h $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_exti.h + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_fsmc.h $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_i2c.h @@ -86,6 +86,42 @@ $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_sdio.h $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dma.h $PROJ_DIR$\..\obj\xcp.lst + $PROJ_DIR$\..\irq.h + $PROJ_DIR$\..\led.c + $PROJ_DIR$\..\led.h + $PROJ_DIR$\..\timer.c + $PROJ_DIR$\..\timer.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dac.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_exti.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_flash.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dma.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dbgmcu.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_fsmc.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_pwr.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_iwdg.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_i2c.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rtc.h + $PROJ_DIR$\..\obj\unicode.o + $PROJ_DIR$\..\obj\unicode.pbi + $PROJ_DIR$\..\obj\mmc.lst + $PROJ_DIR$\..\obj\ff.o + $PROJ_DIR$\..\obj\ff.pbi + $PROJ_DIR$\..\vectors.c + $PROJ_DIR$\..\src\app\app.c $PROJ_DIR$\..\src\app\app.h $PROJ_DIR$\..\src\hw\cstart.s $PROJ_DIR$\..\src\os\os.h @@ -116,8 +152,8 @@ $TOOLKIT_DIR$\inc\c\xencoding_limits.h $PROJ_DIR$\Debug\Obj\stm32f10x_i2c.pbi $TOOLKIT_DIR$\lib\dl7M_tln.a - $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\memory.x $PROJ_DIR$\Debug\Obj\misc.pbi + $PROJ_DIR$\..\..\..\..\Source\ARMCM3_STM32\IAR\memory.x $TOOLKIT_DIR$\inc\c\DLib_Threads.h $PROJ_DIR$\Debug\Obj\stm32f10x_rcc.o $PROJ_DIR$\Debug\Obj\stm32f10x_rtc.o @@ -187,8 +223,8 @@ $PROJ_DIR$\..\obj\irq.o $PROJ_DIR$\..\obj\main.o $PROJ_DIR$\..\obj\led.o - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\misc.c $PROJ_DIR$\..\obj\boot.o + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\misc.c $PROJ_DIR$\..\bin\demoprog_olimex_stm32p103.out $PROJ_DIR$\..\bin\demoprog_olimex_stm32p103.srec $PROJ_DIR$\..\obj\xcp.o @@ -334,10 +370,10 @@ $PROJ_DIR$\Debug\Obj\stm32f10x_spi.o $PROJ_DIR$\Debug\Obj\stm32f10x_wwdg.o $PROJ_DIR$\Debug\Obj\stm32f10x_adc.pbi - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.h $PROJ_DIR$\Debug\Obj\stm32f10x_bkp.pbi - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.c + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.h $PROJ_DIR$\Debug\Obj\stm32f10x_can.pbi + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.c $PROJ_DIR$\Debug\Obj\system_stm32f10x.o $PROJ_DIR$\..\obj\stm32f10x_gpio.o $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dac.h @@ -365,8 +401,8 @@ $PROJ_DIR$\..\cstart.s $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_tim.h - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_wwdg.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c @@ -386,49 +422,13 @@ $PROJ_DIR$\..\boot.h $PROJ_DIR$\..\header.h $PROJ_DIR$\..\irq.c - $PROJ_DIR$\..\irq.h - $PROJ_DIR$\..\led.c - $PROJ_DIR$\..\led.h - $PROJ_DIR$\..\timer.c - $PROJ_DIR$\..\timer.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dac.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_exti.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_flash.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dma.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_dbgmcu.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_fsmc.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_gpio.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_pwr.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_iwdg.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rcc.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_i2c.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\inc\stm32f10x_rtc.h - $PROJ_DIR$\..\obj\unicode.o - $PROJ_DIR$\..\obj\unicode.pbi - $PROJ_DIR$\..\obj\mmc.lst - $PROJ_DIR$\..\obj\ff.o - $PROJ_DIR$\..\obj\ff.pbi - $PROJ_DIR$\..\vectors.c - $PROJ_DIR$\..\src\app\app.c [ROOT_NODE] ILINK - 251 90 + 287 126 @@ -437,21 +437,21 @@ ICCARM - 369 217 + 405 253 BICOMP - 129 + 165 ICCARM - 371 255 201 86 263 198 107 112 + 407 291 237 122 299 234 143 148 BICOMP - 371 255 201 86 263 198 107 112 + 407 291 237 122 299 234 143 148 @@ -460,21 +460,21 @@ ICCARM - 176 127 + 212 163 BICOMP - 307 + 343 ICCARM - 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 BICOMP - 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 @@ -483,21 +483,21 @@ ICCARM - 411 339 + 111 375 BICOMP - 340 + 376 ICCARM - 25 38 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 47 33 43 16 54 26 51 30 28 32 45 53 40 5 49 55 + 25 38 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 47 33 43 16 54 26 51 30 28 32 45 53 40 5 49 55 BICOMP - 25 38 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 47 33 43 16 54 26 51 30 28 32 45 53 40 5 49 55 + 25 38 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 47 33 43 16 54 26 51 30 28 32 45 53 40 5 49 55 @@ -506,21 +506,17 @@ ICCARM - 146 333 + 182 369 BICOMP - 253 + 289 ICCARM - 9 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 - - - BICOMP - 9 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 9 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 @@ -529,21 +525,21 @@ ICCARM - 150 248 + 186 284 BICOMP - 276 + 312 ICCARM - 11 3 0 371 255 201 86 263 198 107 112 322 1 7 9 13 15 + 11 3 0 407 291 237 122 299 234 143 148 358 1 7 9 13 15 BICOMP - 11 3 0 371 255 201 86 263 198 107 112 322 1 7 9 13 15 + 11 3 0 407 291 237 122 299 234 143 148 358 1 7 9 13 15 @@ -552,21 +548,21 @@ ICCARM - 153 102 + 189 138 BICOMP - 284 + 320 ICCARM - 13 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 15 + 13 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 15 BICOMP - 13 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 15 + 13 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 15 @@ -575,21 +571,21 @@ ICCARM - 106 104 + 142 140 BICOMP - 280 + 316 ICCARM - 15 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 + 15 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 BICOMP - 15 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 + 15 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 @@ -598,21 +594,21 @@ ICCARM - 250 95 + 286 131 BICOMP - 94 + 130 ICCARM - 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 BICOMP - 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 @@ -621,21 +617,21 @@ ICCARM - 268 179 + 304 215 BICOMP - 300 + 336 ICCARM - 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 BICOMP - 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 @@ -644,11 +640,11 @@ ICCARM - 79 185 + 79 221 BICOMP - 231 + 267 @@ -667,7 +663,7 @@ AARM - 286 + 322 @@ -676,11 +672,11 @@ ICCARM - 267 295 + 303 331 BICOMP - 233 + 269 @@ -699,11 +695,11 @@ ICCARM - 98 239 + 134 275 BICOMP - 243 + 279 @@ -722,11 +718,11 @@ ICCARM - 96 241 + 132 277 BICOMP - 208 + 244 @@ -745,11 +741,11 @@ ICCARM - 91 242 + 127 278 BICOMP - 207 + 243 @@ -768,11 +764,11 @@ ICCARM - 236 238 + 272 274 BICOMP - 265 + 301 @@ -791,11 +787,11 @@ ICCARM - 269 296 + 305 332 BICOMP - 232 + 268 @@ -814,11 +810,11 @@ ICCARM - 97 244 + 133 280 BICOMP - 266 + 302 @@ -837,11 +833,11 @@ ICCARM - 237 240 + 273 276 BICOMP - 338 + 374 @@ -860,21 +856,21 @@ ICCARM - 342 412 + 378 112 BICOMP - 413 + 113 ICCARM - 40 38 5 25 343 255 201 86 263 198 107 112 + 40 38 5 25 379 291 237 122 299 234 143 148 BICOMP - 40 38 5 25 343 255 201 86 263 198 107 112 + 40 38 5 25 379 291 237 122 299 234 143 148 @@ -883,21 +879,21 @@ ICCARM - 341 409 + 377 109 BICOMP - 410 + 110 ICCARM - 40 38 5 301 + 40 38 5 337 BICOMP - 40 38 5 301 + 40 38 5 337 @@ -906,11 +902,11 @@ ICCARM - 89 252 + 125 288 BICOMP - 225 + 261 @@ -929,11 +925,11 @@ ICCARM - 92 186 + 128 222 BICOMP - 228 + 264 @@ -948,11 +944,11 @@ ICCARM - 234 182 + 270 217 BICOMP - 297 + 333 @@ -971,11 +967,11 @@ ICCARM - 100 227 + 136 263 BICOMP - 229 + 265 @@ -994,11 +990,11 @@ ICCARM - 99 226 + 135 262 BICOMP - 230 + 266 @@ -1017,21 +1013,21 @@ ICCARM - 351 344 + 387 380 BICOMP - 345 + 381 ICCARM - 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 375 255 201 86 263 198 107 112 372 373 374 349 346 347 350 348 352 353 + 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 411 291 237 122 299 234 143 148 408 409 410 385 382 383 386 384 388 389 BICOMP - 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 375 255 201 86 263 198 107 112 372 373 374 349 346 347 350 348 352 353 + 47 33 43 16 54 26 51 30 28 32 45 53 40 38 5 49 55 411 291 237 122 299 234 143 148 408 409 410 385 382 383 386 384 388 389 @@ -1040,17 +1036,17 @@ ICCARM - 342 412 + 378 112 BICOMP - 413 + 113 ICCARM - 61 60 5 57 343 255 201 86 263 198 107 112 + 60 59 5 56 379 291 237 122 299 234 143 148 @@ -1059,17 +1055,17 @@ ICCARM - 341 409 + 377 109 BICOMP - 410 + 110 ICCARM - 61 60 5 359 + 60 59 5 396 @@ -1078,21 +1074,21 @@ ICCARM - 138 160 + 174 196 BICOMP - 289 + 325 ICCARM - 164 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 200 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 BICOMP - 164 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 200 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 @@ -1101,21 +1097,21 @@ ICCARM - 143 271 + 179 307 BICOMP - 195 + 231 ICCARM - 62 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 61 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 BICOMP - 62 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 61 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 @@ -1124,21 +1120,21 @@ ICCARM - 147 245 + 183 281 BICOMP - 303 + 339 ICCARM - 65 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 65 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 BICOMP - 65 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 65 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 @@ -1147,21 +1143,21 @@ ICCARM - 145 287 + 181 323 BICOMP - 278 + 314 ICCARM - 64 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 64 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 BICOMP - 64 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 64 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 @@ -1170,21 +1166,21 @@ ICCARM - 148 246 + 184 282 BICOMP - 302 + 338 ICCARM - 71 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 71 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 BICOMP - 71 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 71 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 @@ -1193,21 +1189,21 @@ ICCARM - 144 272 + 180 308 BICOMP - 273 + 309 ICCARM - 69 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 69 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 BICOMP - 69 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 69 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 @@ -1216,21 +1212,21 @@ ICCARM - 149 247 + 185 283 BICOMP - 304 + 340 ICCARM - 73 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 73 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 BICOMP - 73 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 73 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 @@ -1239,21 +1235,21 @@ ICCARM - 151 249 + 187 285 BICOMP - 275 + 311 ICCARM - 75 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 75 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 BICOMP - 75 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 75 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 @@ -1262,352 +1258,68 @@ ICCARM - 152 101 + 188 137 BICOMP - 305 + 341 ICCARM - 77 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 77 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 BICOMP - 77 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 + 77 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 - $PROJ_DIR$\..\src\hw\cstart.s - - - AARM - 286 - - - - - $PROJ_DIR$\..\src\os\os.c + $PROJ_DIR$\..\led.c ICCARM - 177 132 + 271 216 BICOMP - 306 + 335 ICCARM - 82 + 414 199 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 413 80 82 84 - $PROJ_DIR$\..\src\hw\hw.c + $PROJ_DIR$\..\timer.c ICCARM - 368 131 + 305 332 BICOMP - 196 + 268 ICCARM - 84 82 87 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 80 + 414 199 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 413 80 82 84 - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c ICCARM - 155 103 - - - BICOMP - 281 - - - - - ICCARM - 157 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 - - - BICOMP - 157 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 - - - - - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c - - - ICCARM - 133 105 - - - BICOMP - 277 - - - - - ICCARM - 159 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 - - - BICOMP - 159 3 0 371 255 201 86 263 198 107 112 322 1 7 11 13 15 - - - - - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c - - - ICCARM - 137 212 - - - BICOMP - 190 - - - - - ICCARM - 172 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - BICOMP - 172 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - - - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c - - - ICCARM - 136 215 - - - BICOMP - 189 - - - - - ICCARM - 170 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - BICOMP - 170 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - - - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c - - - ICCARM - 139 210 - - - BICOMP - 192 - - - - - ICCARM - 168 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - BICOMP - 168 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - - - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c - - - ICCARM - 134 211 - - - BICOMP - 191 - - - - - ICCARM - 166 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - BICOMP - 166 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - - - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c - - - ICCARM - 141 293 - - - BICOMP - 193 - - - - - ICCARM - 334 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - BICOMP - 334 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - - - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\misc.c - - - BICOMP - 130 - - - - - $PROJ_DIR$\..\bin\demoprog_olimex_stm32p103.out - - - OBJCOPY - 184 - - - - - ILINK - 162 182 217 286 178 180 179 214 160 215 212 211 210 293 292 294 271 272 287 333 245 246 247 248 249 101 102 103 104 105 127 296 295 161 115 274 109 - - - - - $PROJ_DIR$\Debug\Exe\stm32f103.out - - - ILINK - 162 288 200 216 224 209 285 220 204 205 174 219 118 120 121 122 83 117 175 223 257 113 114 264 325 187 323 326 332 161 115 274 109 - - - - - $PROJ_DIR$\..\bin\openbtl_olimex_stm32p103.out - - - ILINK - 90 - - - OBJCOPY - 93 - - - - - ILINK - 110 252 186 182 239 227 226 217 241 286 412 344 242 95 179 339 238 333 248 102 104 127 296 244 409 240 295 185 161 115 274 109 - - - - - $PROJ_DIR$\..\bin\stm32f103.out - - - OBJCOPY - 279 - - - - - ILINK - 162 182 217 286 178 180 179 214 160 215 212 211 210 293 292 294 271 272 287 333 245 246 247 248 249 101 102 103 104 105 127 296 295 161 115 274 109 - - - - - $PROJ_DIR$\Debug\Obj\stm32f103.pbd - - - BILINK - 222 324 221 111 197 327 329 331 256 199 123 124 125 135 126 116 213 108 258 259 261 202 260 262 370 203 119 290 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\misc.c - - - ICCARM - 140 214 - - - BICOMP - 130 - - - - - ICCARM - 314 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c - - - ICCARM - 136 215 - - - BICOMP - 189 - - - - - ICCARM - 310 309 328 371 255 201 86 263 198 107 112 322 355 319 315 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c - - - ICCARM - 138 160 + 182 369 BICOMP @@ -1617,318 +1329,291 @@ ICCARM - 315 309 328 371 255 201 86 263 198 107 112 322 355 319 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 99 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c ICCARM - 137 212 + 177 329 BICOMP - 190 + 229 ICCARM - 316 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 85 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c ICCARM - 134 211 + 180 308 BICOMP - 191 + 309 ICCARM - 318 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 89 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c ICCARM - 139 210 + 190 330 BICOMP - 192 + 230 ICCARM - 321 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 90 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c ICCARM - 369 217 + 179 307 BICOMP - 129 + 231 ICCARM - 371 255 201 86 263 198 107 112 + 88 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c ICCARM - 142 292 + 178 328 BICOMP - 188 + 224 ICCARM - 336 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - BICOMP - 336 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 95 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c ICCARM - 154 294 + 181 323 BICOMP - 194 + 314 ICCARM - 78 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 - - - BICOMP - 78 3 0 371 255 201 86 263 198 107 112 322 1 7 9 11 13 15 + 98 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c ICCARM - 176 127 + 183 281 BICOMP - 307 + 339 ICCARM - 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 106 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\cstart.s + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c + + + ICCARM + 185 283 + + + BICOMP + 340 + + + + + ICCARM + 102 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 104 108 402 403 394 400 398 350 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c + + + ICCARM + 186 284 + + + BICOMP + 312 + + + + + ICCARM + 104 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 108 402 403 394 400 398 350 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c + + + ICCARM + 184 282 + + + BICOMP + 338 + + + + + ICCARM + 103 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 102 104 108 402 403 394 400 398 350 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c + + + ICCARM + 187 285 + + + BICOMP + 311 + + + + + ICCARM + 108 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 402 403 394 400 398 350 + + + + + $PROJ_DIR$\..\vectors.c + + + ICCARM + 303 331 + + + BICOMP + 269 + + + + + ICCARM + 414 199 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 413 80 82 84 + + + + + $PROJ_DIR$\..\src\app\app.c + + + ICCARM + 254 164 + + + BICOMP + 318 + + + + + ICCARM + 120 118 123 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 116 + + + + + $PROJ_DIR$\..\src\hw\cstart.s AARM - 286 + 322 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c + $PROJ_DIR$\..\src\os\os.c ICCARM - 152 101 + 213 168 BICOMP - 305 + 342 ICCARM - 366 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 367 358 364 362 314 + 118 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + $PROJ_DIR$\..\src\hw\hw.c ICCARM - 155 103 - - - BICOMP - 281 - - - - - ICCARM - 358 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 364 362 314 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c - - - ICCARM - 133 105 - - - BICOMP - 277 - - - - - ICCARM - 362 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 314 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c - - - ICCARM - 106 104 - - - BICOMP - 280 - - - - - ICCARM - 364 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 362 314 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c - - - ICCARM - 153 102 - - - BICOMP - 284 - - - - - ICCARM - 367 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 358 364 362 314 - - - - - $PROJ_DIR$\..\boot.c - - - ICCARM - 234 182 - - - BICOMP - 297 - - - - - ICCARM - 378 163 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 377 380 382 384 - - - - - $PROJ_DIR$\..\irq.c - - - ICCARM - 270 178 - - - BICOMP - 298 - - - - - ICCARM - 378 163 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 377 380 382 384 - - - - - $PROJ_DIR$\..\led.c - - - ICCARM - 235 180 - - - BICOMP - 299 - - - - - ICCARM - 378 163 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 377 380 382 384 - - - - - $PROJ_DIR$\..\timer.c - - - ICCARM - 269 296 + 404 167 BICOMP @@ -1938,273 +1623,584 @@ ICCARM - 378 163 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 377 380 382 384 + 120 118 123 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 116 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c ICCARM - 146 333 + 191 139 BICOMP - 253 + 317 ICCARM - 399 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 406 403 402 404 408 366 367 358 364 362 314 + 193 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 + + + BICOMP + 193 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c ICCARM - 141 293 + 169 141 BICOMP - 193 + 313 ICCARM - 385 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 195 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 + + + BICOMP + 195 3 0 407 291 237 122 299 234 143 148 358 1 7 11 13 15 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c ICCARM - 144 272 + 173 248 BICOMP - 273 + 226 ICCARM - 389 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 398 399 406 403 402 404 408 366 367 358 364 362 314 + 208 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + BICOMP + 208 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c ICCARM - 154 294 + 172 251 BICOMP - 194 + 225 ICCARM - 390 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 206 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + BICOMP + 206 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_exti.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c ICCARM - 143 271 + 175 246 BICOMP - 195 + 228 ICCARM - 388 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 204 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + BICOMP + 204 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c ICCARM - 142 292 + 170 247 BICOMP - 188 + 227 ICCARM - 395 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 + 202 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + BICOMP + 202 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_fsmc.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dac.c ICCARM - 145 287 + 177 329 BICOMP - 278 + 229 ICCARM - 398 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 399 406 403 402 404 408 366 367 358 364 362 314 + 370 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + BICOMP + 370 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_i2c.c + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\misc.c + + + BICOMP + 166 + + + + + $PROJ_DIR$\..\bin\demoprog_olimex_stm32p103.out + + + OBJCOPY + 220 + + + + + ILINK + 198 217 253 322 214 216 215 250 196 251 248 247 246 329 328 330 307 308 323 369 281 282 283 284 285 137 138 139 140 141 163 332 331 197 151 310 145 + + + + + $PROJ_DIR$\Debug\Exe\stm32f103.out + + + ILINK + 198 324 236 252 260 245 321 256 240 241 210 255 154 156 157 158 119 153 211 259 293 149 150 300 361 223 359 362 368 197 151 310 145 + + + + + $PROJ_DIR$\..\bin\openbtl_olimex_stm32p103.out + + + ILINK + 126 + + + OBJCOPY + 129 + + + + + ILINK + 147 288 222 217 275 263 262 253 277 322 112 380 278 131 215 375 274 369 284 138 140 163 332 280 109 276 331 221 197 151 310 145 + + + + + $PROJ_DIR$\..\bin\stm32f103.out + + + OBJCOPY + 315 + + + + + ILINK + 198 217 253 322 214 216 215 250 196 251 248 247 246 329 328 330 307 308 323 369 281 282 283 284 285 137 138 139 140 141 163 332 331 197 151 310 145 + + + + + $PROJ_DIR$\Debug\Obj\stm32f103.pbd + + + BILINK + 258 360 257 146 233 363 364 366 292 235 159 160 161 171 162 152 249 144 294 295 297 238 296 298 406 239 155 326 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\misc.c ICCARM - 147 245 + 176 250 BICOMP - 303 + 166 ICCARM - 406 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 403 402 404 408 366 367 358 364 362 314 + 350 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_pwr.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_bkp.c ICCARM - 149 247 + 172 251 BICOMP - 304 + 225 ICCARM - 402 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 404 408 366 367 358 364 362 314 + 346 345 365 407 291 237 122 299 234 143 148 358 391 355 351 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_adc.c ICCARM - 150 248 + 174 196 BICOMP - 276 + 325 ICCARM - 404 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 408 366 367 358 364 362 314 + 351 345 365 407 291 237 122 299 234 143 148 358 391 355 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_iwdg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_can.c ICCARM - 148 246 + 173 248 BICOMP - 302 + 226 ICCARM - 403 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 402 404 408 366 367 358 364 362 314 + 352 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rtc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_cec.c ICCARM - 151 249 + 170 247 BICOMP - 275 + 227 ICCARM - 408 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 366 367 358 364 362 314 + 354 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\vectors.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_crc.c ICCARM - 267 295 + 175 246 BICOMP - 233 + 228 ICCARM - 378 163 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 377 380 382 384 + 357 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 - $PROJ_DIR$\..\src\app\app.c + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\CoreSupport\core_cm3.c ICCARM - 218 128 + 405 253 BICOMP - 282 + 165 ICCARM - 84 82 87 309 328 371 255 201 86 263 198 107 112 322 355 319 315 310 316 318 321 385 395 390 388 389 398 399 406 403 402 404 408 366 367 358 364 362 314 80 + 407 291 237 122 299 234 143 148 + + + + + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dbgmcu.c + + + ICCARM + 178 328 + + + BICOMP + 224 + + + + + ICCARM + 372 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + BICOMP + 372 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + + + $PROJ_DIR$\..\lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_dma.c + + + ICCARM + 190 330 + + + BICOMP + 230 + + + + + ICCARM + 78 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + BICOMP + 78 3 0 407 291 237 122 299 234 143 148 358 1 7 9 11 13 15 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c + + + ICCARM + 212 163 + + + BICOMP + 343 + + + + + ICCARM + 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 + + + + + $PROJ_DIR$\..\cstart.s + + + AARM + 322 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_sdio.c + + + ICCARM + 188 137 + + + BICOMP + 341 + + + + + ICCARM + 402 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 403 394 400 398 350 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_tim.c + + + ICCARM + 191 139 + + + BICOMP + 317 + + + + + ICCARM + 394 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 400 398 350 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_wwdg.c + + + ICCARM + 169 141 + + + BICOMP + 313 + + + + + ICCARM + 398 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 350 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_usart.c + + + ICCARM + 142 140 + + + BICOMP + 316 + + + + + ICCARM + 400 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 398 350 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F10x_StdPeriph_Driver\src\stm32f10x_spi.c + + + ICCARM + 189 138 + + + BICOMP + 320 + + + + + ICCARM + 403 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 394 400 398 350 + + + + + $PROJ_DIR$\..\boot.c + + + ICCARM + 270 217 + + + BICOMP + 333 + + + + + ICCARM + 414 199 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 413 80 82 84 + + + + + $PROJ_DIR$\..\irq.c + + + ICCARM + 306 214 + + + BICOMP + 334 + + + + + ICCARM + 414 199 345 365 407 291 237 122 299 234 143 148 358 391 355 351 346 352 354 357 85 95 90 88 89 98 99 106 103 102 104 108 402 403 394 400 398 350 413 80 82 84 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.elf b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.elf index a523cdfebb817eff130d3e3b8fec74dd00110784..f8883a1bda2b32c7c5a670d1076b22727749bf81 100644 GIT binary patch delta 1093 zcmYL|OGuPa6vyxXyWiM|@5V=onGXVAOc|1-V_ImTXqpt-!ZO52uohXg@G**txG==m ztv0#IBqW1M7mbiJ6Ga3GE+fZ4!e~rzV;iA!zWMxG%y94jcmC&m_uP8|yNN#HPsFAAYgEPnIg7u*4$pjg<;>8EuIL_Dn%0?@$1HB;<^5Rr#& z8Q`)I;$A2HMd42kDM2(-RF4@MZ6wDYvMHjM#4!`Z;1N|t6fi-`jH$+MxVc=M2CP$! zxa|sK$7^v==Tfml9I!(H(Dnm%G$SB(tCpiBkYb@Y8A6}fwMMQ&3$2;14n{rXs%PXj zO7?_ojv8jq0IrM)<_qDvvO#7e#C}`05fi;&)Ilgr?zf@CL_Zk~>p;4NhV@VzcKAH=gj^Py zH_ zf6!Okq-#vrGx-1+FS!RBi)|mU)q<&^hHP!IAzS)4js+wfnw^GD*fgFx*{37^e!6B0 zNjzRMsLG=Cgz`PW(WL1iz=I^|wZv=TA%UAFpJ+HC_uwj(@s0TpWRy!ry3UrBT+hsu up6!}IPyPR^nCrysyW?prF?r9nBl&k7Xv|fkTi$`K~Z}1;WDBe#1 delta 1093 zcmYL|Pe@cz6vprO?wcA>r?DBeLM;{1(Xpq~yV%JSp&tbX^xNITa7Rk7mQ6`~Y3uT%}aK#CO1znKo5@GMBn})aR>G~OSa;uBuNW>P^HICCrQ#0eJ zK!(Z=qQaX6yG@9sY-(L^Dv@2BQA*A7uY7U_erRqZnH&Cuh!z3P4O=0Xtr5fg4wF-sdLAzQE zqcQR8clv6Z^!kN8oez-qoO>`GXnKdm2Kc*cJX)Z}Bg1nUYZ5NaE&yTE_|?frI^0)N zHCsgD=OyRWeuo}^cm;6PX?g_kLz3MZ+*(vb;HJp|4LjwK<}H!#+Wc!W)+=MY2lf}A yO;4ADZMC=LvU=#yQ{uZ?^W;+dHrbE!+mChT?2%D<^0)fv(5rASki0<;F8l@lyxiUZ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h index 3acb7769..de43df14 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h @@ -267,5 +267,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c index 847c8694..36fbe521 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c @@ -391,4 +391,63 @@ void FileFirmwareUpdateLogHook(blt_char *info_string) #endif /* BOOT_FILE_SYS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs index 360a42a1..5d09cabd 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs @@ -48,9 +48,9 @@ - - + + @@ -63,8 +63,8 @@ - - + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.elf b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.elf index ae8af72c70d8a56a0b749f8e6bb7ac78b5b68895..2db8def8eed3a62e8b2dbaeac5ced97352b26c47 100644 GIT binary patch delta 1109 zcmX|=OGuPa6vyxX-fw8i$2e*}CKFAJNYfE|8Hyr7YMKu)bfF1hH4ss_Q*#WY#=tZ* zFPbG$YKY>(U?7yDm5Yo4X_;< z=y#iNV@QABM2G!F^1o6cj6r|HAMD#O{vNT zt5n|+%g!x{faTnhrqj{F9;d=@i#Sz?v~$dggdq>IuY_avIi^z~)gqmtn7Ab-YYJjdEn^Wgc>L>JE+*E7(B_x^=@2if~pBvv@)KcaU9q34=CDIzdPI;0+~8 z;+tq|7IqhBEyNe5pGoT`YLe{9@+JrrW58%XAKD?h#^7r7+-;;|^y^jpU-%ghX z{XAil{M*z9Sjx>!molXCcT;;nT;qX{znh|06))`}3!k$Zk#Li*ph#UVSIgp7o{Gv* zkvW;gg*6!&YW`t)w+bj(08iCGUZskz_f&awmrpq&Cp&VoGE4K-;WV|ZU;5N_%=x!` Hs_E;0CxG9e delta 1109 zcmX|=T}YE*6vvc-U(_N}EDMhd`&uCchK@prRlg2VSS%Y^ zX%vnvl!Wg-@~k&K*<1y49$M6sm~VDKV)Te`})nfoXD`x+L((Ork$$>ddYuIxP{gI!tGJ7cogl z+_gv|LlXSIV-hbcGL|M0XNplwV!}ePOwukcH)`OAMMjPEkfWUQ!2s0q_#ZOF!#S4? zth31F4Ee?58#ZjWh+%t%2v78iQMnBv3zZXM@`4)$YzSKzfPcz(Kt- zg-xi}{uFi~q|frINyk#C!d3kyg|>n(pJ-~E`rR(YY-0I_BW`U=5Q#iyQ0eJxYp^d@C2&WiW2o#-;1ha M=!?%r)$x!20n5SOO8@`> diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h index 1bc54a2b..a9d0e997 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h @@ -267,5 +267,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c index 616323f4..0f9671bc 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c @@ -391,4 +391,63 @@ void FileFirmwareUpdateLogHook(blt_char *info_string) #endif /* BOOT_FILE_SYS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.out b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.out index f29fcef062fead9b8efa5b3a3c55628cde7d8adb..fa1ebd269b168c4d9a81cc3dfe3f06709e384d50 100644 GIT binary patch delta 4493 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 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt index 06316c68..1a567810 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt @@ -30,7 +30,7 @@ - + TabID-10231-8055 @@ -42,7 +42,7 @@ - 0TabID-19870-1384BuildBuildTabID-11216-22197Debug LogDebug-Log0 + 0TabID-19870-1384BuildBuildTabID-11216-22197Debug LogDebug-Log0 @@ -55,7 +55,7 @@ - iaridepm.enu1-2-2963413-2-2200200104167198413216146957341-2-2963413-2-2200200104167198413216146957341 + iaridepm.enu1-2-2963413-2-2200200104167198413216146957341-2-2963413-2-2200200104167198413216146957341 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep index 483d80df..f9d39a1a 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep @@ -6,97 +6,10 @@ Debug - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rng.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rtc.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_sdio.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_spi.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_syscfg.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_tim.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_usart.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_wwdg.h - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h - $PROJ_DIR$\..\lib\uip\clock-arch.c - $PROJ_DIR$\..\lib\uip\clock-arch.h - $PROJ_DIR$\..\lib\uip\netdev.c - $PROJ_DIR$\..\lib\uip\netdev.h - $PROJ_DIR$\..\lib\uip\uip-conf.h - $PROJ_DIR$\..\blt_conf.h - $PROJ_DIR$\..\hooks.c - $PROJ_DIR$\..\main.c - $TOOLKIT_DIR$\inc\c\ctype.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\types.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\integer.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arch.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.h - $PROJ_DIR$\..\..\..\..\Source\assert.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.h - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uipopt.h - $PROJ_DIR$\..\..\..\..\Source\assert.h - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - $PROJ_DIR$\..\..\..\..\Source\backdoor.h - $PROJ_DIR$\..\..\..\..\Source\boot.c - $PROJ_DIR$\..\..\..\..\Source\boot.h - $PROJ_DIR$\..\..\..\..\Source\com.c - $PROJ_DIR$\..\..\..\..\Source\com.h - $PROJ_DIR$\..\..\..\..\Source\cop.c - $PROJ_DIR$\..\..\..\..\Source\cop.h - $PROJ_DIR$\..\..\..\..\Source\file.c - $PROJ_DIR$\..\..\..\..\Source\file.h - $PROJ_DIR$\..\..\..\..\Source\net.c - $PROJ_DIR$\..\..\..\..\Source\net.h - $PROJ_DIR$\..\..\..\..\Source\plausibility.h - $PROJ_DIR$\..\..\..\..\Source\xcp.c - $PROJ_DIR$\..\..\..\..\Source\xcp.h - $PROJ_DIR$\..\obj\nvm.pbi - $PROJ_DIR$\..\obj\misc.lst - $PROJ_DIR$\..\obj\net.pbi - $TOOLKIT_DIR$\inc\c\wchar.h - $PROJ_DIR$\..\obj\stm32f4x7_eth.o - $TOOLKIT_DIR$\inc\c\xlocale.h - $PROJ_DIR$\..\obj\system_stm32f4xx.pbi - $PROJ_DIR$\..\obj\vectors.lst - $PROJ_DIR$\..\obj\stm32f4x7_eth.pbi - $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.o - $PROJ_DIR$\..\lib\fatfs\ffconf.h - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cm4_simd.h $PROJ_DIR$\..\lib\ethernetlib\inc\stm32_eth.h + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cm4_simd.h $PROJ_DIR$\..\lib\ethernetlib\src\stm32_eth.c + $PROJ_DIR$\..\lib\fatfs\ffconf.h $PROJ_DIR$\..\lib\fatfs\mmc.c $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cm4.h $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cmInstr.h @@ -144,95 +57,64 @@ $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_pwr.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rcc.h - $TOOLKIT_DIR$\inc\c\xtls.h - $PROJ_DIR$\..\obj\system_stm32f4xx.o - $PROJ_DIR$\..\obj\clock-arch.lst - $PROJ_DIR$\..\obj\nvm.o - $PROJ_DIR$\..\obj\stm32f4x7_eth.lst - $PROJ_DIR$\..\obj\uip.lst - $PROJ_DIR$\..\obj\netdev.o - $PROJ_DIR$\..\obj\net.lst - $PROJ_DIR$\..\obj\netdev.pbi - $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.o - $PROJ_DIR$\..\obj\uip_arp.o - $PROJ_DIR$\..\obj\uip_timer.lst - $PROJ_DIR$\..\obj\uiplib.o - $PROJ_DIR$\..\obj\netdev.lst - $PROJ_DIR$\..\obj\uiplib.lst - $PROJ_DIR$\..\obj\uip.o - $PROJ_DIR$\..\obj\uip-fw.lst - $TOOLKIT_DIR$\inc\c\DLib_Product.h - $PROJ_DIR$\..\obj\stm32f4xx_exti.pbi - $PROJ_DIR$\..\obj\stm32f4xx_iwdg.pbi - $PROJ_DIR$\..\obj\stm32f4xx_fsmc.pbi - $PROJ_DIR$\..\obj\stm32f4xx_fsmc.lst - $TOOLKIT_DIR$\lib\rt7M_tl.a - $PROJ_DIR$\..\obj\stm32f4xx_syscfg.lst - $PROJ_DIR$\..\obj\uart.o - $PROJ_DIR$\..\obj\stm32f4xx_sdio.lst - $PROJ_DIR$\..\obj\stm32f4xx_hash.lst - $PROJ_DIR$\..\obj\stm32f4xx_dac.lst - $PROJ_DIR$\..\obj\stm32f4xx_dma.lst - $PROJ_DIR$\..\obj\stm32f4xx_dcmi.lst - $TOOLKIT_DIR$\lib\dl7M_tln.a - $PROJ_DIR$\..\obj\stm32f4xx_rng.lst - $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.lst - $PROJ_DIR$\..\obj\system_stm32f4xx.lst - $PROJ_DIR$\..\obj\stm32f4xx_rtc.lst - $PROJ_DIR$\..\obj\stm32f4xx_iwdg.lst - $PROJ_DIR$\..\obj\stm32f4xx_rcc.lst - $PROJ_DIR$\..\obj\stm32f4xx_pwr.lst - $PROJ_DIR$\..\obj\stm32f4xx_gpio.lst - $PROJ_DIR$\..\obj\stm32f4xx_wwdg.lst - $PROJ_DIR$\..\obj\stm32f4xx_flash.lst - $PROJ_DIR$\..\obj\stm32f4xx_usart.lst - $PROJ_DIR$\..\obj\stm32f4xx_i2c.lst - $PROJ_DIR$\..\obj\clock-arch.o - $PROJ_DIR$\..\obj\nvm.lst - $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.lst - $PROJ_DIR$\..\obj\uip-fw.pbi - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\memory.x - $PROJ_DIR$\..\obj\uip.pbi - $PROJ_DIR$\..\obj\stm32f4xx_syscfg.pbi - $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth_conf.h - $PROJ_DIR$\..\obj\stm32f4xx_cryp.lst - $PROJ_DIR$\..\obj\openbtl_olimex_stm32e407.map - $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth.h - $PROJ_DIR$\..\obj\unicode.lst - $PROJ_DIR$\..\obj\uip_timer.o - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c - $PROJ_DIR$\..\obj\stm32_eth.pbi - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\diskio.h - $PROJ_DIR$\..\obj\stm32_eth.lst - $PROJ_DIR$\..\obj\stm32f4xx_flash.pbi - $PROJ_DIR$\..\obj\stm32f4xx_rng.o - $PROJ_DIR$\..\obj\stm32f4xx_rtc.o - $PROJ_DIR$\..\obj\stm32f4xx_sdio.o - $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.pbi - $PROJ_DIR$\..\obj\stm32f4xx_spi.o - $PROJ_DIR$\..\obj\can.pbi - $PROJ_DIR$\..\obj\can.o - $PROJ_DIR$\..\obj\can.lst - $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.o - $PROJ_DIR$\..\obj\stm32f4xx_adc.o - $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.o - $PROJ_DIR$\..\obj\stm32f4xx_can.o - $PROJ_DIR$\..\obj\stm32f4xx_cryp.o - $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.o - $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.o - $PROJ_DIR$\..\obj\stm32f4xx_crc.o - $PROJ_DIR$\..\obj\stm32f4xx_dcmi.pbi - $TOOLKIT_DIR$\inc\c\yvals.h - $TOOLKIT_DIR$\inc\c\xencoding_limits.h - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c - $PROJ_DIR$\..\obj\stm32f4xx_dac.o - $PROJ_DIR$\..\obj\stm32f4xx_dcmi.o - $PROJ_DIR$\..\obj\stm32f4xx_dma.o - $PROJ_DIR$\..\obj\stm32f4xx_flash.o - $PROJ_DIR$\..\obj\stm32f4xx_exti.o - $PROJ_DIR$\..\obj\stm32f4xx_fsmc.o - $PROJ_DIR$\..\obj\file.o - $PROJ_DIR$\..\obj\boot.pbi + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rng.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rtc.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_sdio.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_spi.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_syscfg.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_tim.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_usart.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_wwdg.h + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h + $PROJ_DIR$\..\lib\uip\clock-arch.c + $PROJ_DIR$\..\lib\uip\clock-arch.h + $PROJ_DIR$\..\lib\uip\netdev.c + $PROJ_DIR$\..\lib\uip\netdev.h + $PROJ_DIR$\..\lib\uip\uip-conf.h + $PROJ_DIR$\..\blt_conf.h + $PROJ_DIR$\..\hooks.c + $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\types.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\integer.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arch.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.h $PROJ_DIR$\..\obj\timer.o $PROJ_DIR$\..\obj\cop.o $PROJ_DIR$\..\obj\xcp.o @@ -358,560 +240,274 @@ $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.lst $PROJ_DIR$\..\obj\stm32f4xx_gpio.pbi $PROJ_DIR$\..\obj\stm32_eth.o + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uipopt.h + $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\..\..\..\Source\assert.h + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\..\..\..\Source\boot.h + $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\..\..\..\Source\com.h + $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\..\..\..\Source\cop.h + $PROJ_DIR$\..\..\..\..\Source\file.c + $PROJ_DIR$\..\..\..\..\Source\file.h + $PROJ_DIR$\..\..\..\..\Source\net.c + $PROJ_DIR$\..\..\..\..\Source\net.h + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + $PROJ_DIR$\..\..\..\..\Source\xcp.c + $PROJ_DIR$\..\..\..\..\Source\xcp.h + $TOOLKIT_DIR$\inc\c\ctype.h + $PROJ_DIR$\..\obj\nvm.pbi + $PROJ_DIR$\..\obj\misc.lst + $TOOLKIT_DIR$\inc\c\xlocale.h + $PROJ_DIR$\..\obj\vectors.lst + $PROJ_DIR$\..\obj\system_stm32f4xx.pbi + $PROJ_DIR$\..\obj\stm32f4x7_eth.o + $PROJ_DIR$\..\obj\stm32f4x7_eth.pbi + $TOOLKIT_DIR$\inc\c\wchar.h + $PROJ_DIR$\..\obj\net.pbi + $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.o + $PROJ_DIR$\..\obj\system_stm32f4xx.o + $TOOLKIT_DIR$\inc\c\xtls.h + $PROJ_DIR$\..\obj\clock-arch.lst + $PROJ_DIR$\..\obj\nvm.o + $PROJ_DIR$\..\obj\stm32f4x7_eth.lst + $PROJ_DIR$\..\obj\uip.lst + $PROJ_DIR$\..\obj\netdev.o + $PROJ_DIR$\..\obj\net.lst + $PROJ_DIR$\..\obj\netdev.pbi + $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.o + $PROJ_DIR$\..\obj\uip_arp.o + $PROJ_DIR$\..\obj\uip_timer.lst + $PROJ_DIR$\..\obj\uiplib.o + $PROJ_DIR$\..\obj\netdev.lst + $PROJ_DIR$\..\obj\uiplib.lst + $PROJ_DIR$\..\obj\uip.o + $PROJ_DIR$\..\obj\uip-fw.lst + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\..\obj\stm32f4xx_exti.pbi + $PROJ_DIR$\..\obj\stm32f4xx_iwdg.pbi + $PROJ_DIR$\..\obj\stm32f4xx_fsmc.pbi + $PROJ_DIR$\..\obj\stm32f4xx_fsmc.lst + $TOOLKIT_DIR$\lib\rt7M_tl.a + $PROJ_DIR$\..\obj\stm32f4xx_syscfg.lst + $PROJ_DIR$\..\obj\uart.o + $PROJ_DIR$\..\obj\stm32f4xx_sdio.lst + $PROJ_DIR$\..\obj\stm32f4xx_hash.lst + $PROJ_DIR$\..\obj\stm32f4xx_dac.lst + $PROJ_DIR$\..\obj\stm32f4xx_dma.lst + $PROJ_DIR$\..\obj\stm32f4xx_dcmi.lst + $TOOLKIT_DIR$\lib\dl7M_tln.a + $PROJ_DIR$\..\obj\stm32f4xx_rng.lst + $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.lst + $PROJ_DIR$\..\obj\system_stm32f4xx.lst + $PROJ_DIR$\..\obj\stm32f4xx_rtc.lst + $PROJ_DIR$\..\obj\stm32f4xx_iwdg.lst + $PROJ_DIR$\..\obj\stm32f4xx_rcc.lst + $PROJ_DIR$\..\obj\stm32f4xx_pwr.lst + $PROJ_DIR$\..\obj\stm32f4xx_gpio.lst + $PROJ_DIR$\..\obj\stm32f4xx_wwdg.lst + $PROJ_DIR$\..\obj\stm32f4xx_flash.lst + $PROJ_DIR$\..\obj\stm32f4xx_usart.lst + $PROJ_DIR$\..\obj\stm32f4xx_i2c.lst + $PROJ_DIR$\..\obj\clock-arch.o + $PROJ_DIR$\..\obj\nvm.lst + $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.lst + $PROJ_DIR$\..\obj\uip-fw.pbi + $PROJ_DIR$\..\obj\uip.pbi + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\memory.x + $PROJ_DIR$\..\obj\stm32f4xx_syscfg.pbi + $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth_conf.h + $PROJ_DIR$\..\obj\stm32f4xx_cryp.lst + $PROJ_DIR$\..\obj\openbtl_olimex_stm32e407.map + $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth.h + $PROJ_DIR$\..\obj\unicode.lst + $PROJ_DIR$\..\obj\uip_timer.o + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c + $PROJ_DIR$\..\obj\stm32_eth.pbi + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\diskio.h + $PROJ_DIR$\..\obj\stm32_eth.lst + $PROJ_DIR$\..\obj\stm32f4xx_flash.pbi + $PROJ_DIR$\..\obj\stm32f4xx_rng.o + $PROJ_DIR$\..\obj\stm32f4xx_rtc.o + $PROJ_DIR$\..\obj\stm32f4xx_sdio.o + $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.pbi + $PROJ_DIR$\..\obj\stm32f4xx_spi.o + $PROJ_DIR$\..\obj\can.pbi + $PROJ_DIR$\..\obj\can.o + $PROJ_DIR$\..\obj\can.lst + $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.o + $PROJ_DIR$\..\obj\stm32f4xx_adc.o + $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.o + $PROJ_DIR$\..\obj\stm32f4xx_can.o + $PROJ_DIR$\..\obj\stm32f4xx_cryp.o + $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.o + $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.o + $PROJ_DIR$\..\obj\stm32f4xx_crc.o + $PROJ_DIR$\..\obj\stm32f4xx_dcmi.pbi + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\..\obj\stm32f4xx_dac.o + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c + $PROJ_DIR$\..\obj\stm32f4xx_dcmi.o + $PROJ_DIR$\..\obj\stm32f4xx_dma.o + $PROJ_DIR$\..\obj\stm32f4xx_flash.o + $PROJ_DIR$\..\obj\stm32f4xx_exti.o + $PROJ_DIR$\..\obj\stm32f4xx_fsmc.o + $PROJ_DIR$\..\obj\file.o + $PROJ_DIR$\..\obj\boot.pbi - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c - - - ICCARM - 169 199 - - - BICOMP - 301 - - - - - ICCARM - 0 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 3 5 7 9 11 13 15 96 - - - BICOMP - 0 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c - - - ICCARM - 172 200 - - - BICOMP - 263 - - - - - ICCARM - 3 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 5 7 9 11 13 15 96 - - - BICOMP - 3 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 5 7 9 11 13 15 96 - - - [ROOT_NODE] ILINK - 286 190 + 168 315 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c + $PROJ_DIR$\..\lib\ethernetlib\src\stm32_eth.c ICCARM - 163 201 + 322 233 BICOMP - 262 + 320 ICCARM - 5 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 7 9 11 13 15 96 + 0 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 5 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 7 9 11 13 15 96 + 0 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c + $PROJ_DIR$\..\lib\fatfs\mmc.c ICCARM - 335 203 + 213 208 BICOMP - 296 + 224 ICCARM - 7 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 9 11 13 15 96 - - - BICOMP - 7 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 9 11 13 15 96 + 120 121 341 115 167 280 342 185 161 211 83 94 10 5 131 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\misc.c ICCARM - 161 299 + 254 166 BICOMP - 187 + 132 ICCARM - 9 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 11 13 15 96 + 9 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 BICOMP - 9 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 11 13 15 96 + 9 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_adc.c ICCARM - 334 343 + 137 333 BICOMP - 264 + 119 ICCARM - 11 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 13 15 96 + 12 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 11 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 13 15 96 + 12 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_can.c ICCARM - 179 298 + 228 335 BICOMP - 338 + 116 ICCARM - 13 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 15 96 + 14 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 13 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 15 96 + 14 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_crc.c ICCARM - 177 242 + 176 339 BICOMP - 240 + 123 ICCARM - 15 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 96 + 17 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 15 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 96 + 17 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp.c ICCARM - 171 139 - - - BICOMP - 83 - - - - - ICCARM - 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\uip\clock-arch.c - - - ICCARM - 140 181 - - - BICOMP - 252 - - - - - ICCARM - 19 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - BICOMP - 19 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - - - $PROJ_DIR$\..\lib\uip\netdev.c - - - ICCARM - 151 144 - - - BICOMP - 146 - - - - - ICCARM - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 54 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 89 238 279 329 - - - BICOMP - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 54 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 89 238 279 329 - - - - - $PROJ_DIR$\..\hooks.c - - - ICCARM - 318 312 - - - BICOMP - 272 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\main.c - - - ICCARM - 321 311 - - - BICOMP - 273 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s - - - AARM - 274 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c - - - ICCARM - 84 245 - - - BICOMP - 268 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c - - - ICCARM - 206 205 - - - BICOMP - 204 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c - - - ICCARM - 320 269 - - - BICOMP - 277 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c - - - ICCARM - 322 276 - - - BICOMP - 275 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c - - - ICCARM - 182 141 - - - BICOMP - 77 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c - - - ICCARM - 289 227 - - - BICOMP - 323 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c - - - ICCARM - 337 162 - - - BICOMP - 330 - - - - - ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c - - - ICCARM - 333 302 - - - BICOMP - 344 - - - - - ICCARM - 45 43 87 42 328 239 216 233 285 155 217 303 - - - BICOMP - 45 43 87 42 328 239 216 233 285 155 217 303 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c - - - ICCARM - 192 300 - - - BICOMP - 260 - - - - - ICCARM - 45 43 87 248 - - - BICOMP - 45 43 87 248 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c - - - ICCARM - 154 292 - - - BICOMP - 184 - - - - - ICCARM - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 50 49 238 239 216 233 285 155 217 303 279 329 - - - BICOMP - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 50 49 238 239 216 233 285 155 217 303 279 329 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c - - - ICCARM - 143 153 + 314 336 BICOMP @@ -921,66 +517,181 @@ ICCARM - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 50 238 239 216 233 285 155 217 303 279 329 + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 50 238 239 216 233 285 155 217 303 279 329 + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_aes.c ICCARM - 257 148 + 229 272 BICOMP - 254 + 160 ICCARM - 54 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 238 239 216 233 285 155 217 303 279 329 + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 54 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 238 239 216 233 285 155 217 303 279 329 + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_des.c ICCARM - 149 193 + 231 262 BICOMP - 258 + 223 ICCARM - 47 19 56 + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 47 19 56 + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_tdes.c ICCARM - 282 280 + 308 332 + + + BICOMP + 327 + + + + + ICCARM + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 19 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dac.c + + + ICCARM + 290 343 + + + BICOMP + 133 + + + + + ICCARM + 24 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 24 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c + + + ICCARM + 175 334 + + + BICOMP + 147 + + + + + ICCARM + 26 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 26 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dcmi.c + + + ICCARM + 292 345 + + + BICOMP + 340 + + + + + ICCARM + 28 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 28 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dma.c + + + ICCARM + 291 346 + + + BICOMP + 190 + + + + + ICCARM + 30 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 30 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_exti.c + + + ICCARM + 141 348 BICOMP @@ -990,43 +701,62 @@ ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 32 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 32 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_flash.c ICCARM - 152 150 + 303 347 BICOMP - 256 + 323 ICCARM - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 59 + 34 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 52 60 22 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 73 59 + 34 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c ICCARM - 315 309 + 284 349 + + + BICOMP + 283 + + + + + ICCARM + 36 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c + + + ICCARM + 301 113 BICOMP @@ -1036,135 +766,411 @@ ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 38 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 38 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c ICCARM - 316 310 + 289 112 BICOMP - 226 + 230 ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 40 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 40 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c ICCARM - 319 313 + 172 337 BICOMP - 267 + 227 ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 30 41 73 + 40 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 30 41 73 + 40 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c ICCARM - 317 228 + 295 338 BICOMP - 243 + 173 ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 40 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 40 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\file.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c ICCARM - 314 225 + 305 222 BICOMP - 244 + 188 ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 238 239 216 233 285 155 217 303 279 329 26 82 138 324 270 247 246 80 + 44 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 238 239 216 233 285 155 217 303 279 329 26 82 138 324 270 247 246 80 + 44 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\net.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c ICCARM - 145 253 + 298 187 BICOMP - 79 + 282 ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 21 52 60 22 73 54 + 46 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 21 52 60 22 73 54 + 46 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\xcp.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c ICCARM - 287 229 + 300 117 + + + BICOMP + 143 + + + + + ICCARM + 48 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 48 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c + + + ICCARM + 299 189 + + + BICOMP + 118 + + + + + ICCARM + 50 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 52 54 56 58 60 62 64 66 9 + + + BICOMP + 50 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c + + + ICCARM + 294 324 + + + BICOMP + 183 + + + + + ICCARM + 52 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 54 56 58 60 62 64 66 9 + + + BICOMP + 52 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c + + + ICCARM + 297 325 + + + BICOMP + 145 + + + + + ICCARM + 54 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 56 58 60 62 64 66 9 + + + BICOMP + 54 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c + + + ICCARM + 288 326 + + + BICOMP + 144 + + + + + ICCARM + 56 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 58 60 62 64 66 9 + + + BICOMP + 56 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c + + + ICCARM + 217 328 + + + BICOMP + 178 + + + + + ICCARM + 58 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 60 62 64 66 9 + + + BICOMP + 58 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c + + + ICCARM + 286 181 + + + BICOMP + 312 + + + + + ICCARM + 60 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 62 64 66 9 + + + BICOMP + 60 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c + + + ICCARM + 216 225 + + + BICOMP + 146 + + + + + ICCARM + 62 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 64 66 9 + + + BICOMP + 62 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c + + + ICCARM + 304 180 + + + BICOMP + 220 + + + + + ICCARM + 64 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 66 9 + + + BICOMP + 64 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c + + + ICCARM + 302 124 + + + BICOMP + 122 + + + + + ICCARM + 66 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 9 + + + BICOMP + 66 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c + + + ICCARM + 296 263 + + + BICOMP + 257 + + + + + ICCARM + 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\uip\clock-arch.c + + + ICCARM + 265 306 + + + BICOMP + 134 + + + + + ICCARM + 70 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + BICOMP + 70 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + + + $PROJ_DIR$\..\lib\uip\netdev.c + + + ICCARM + 276 269 BICOMP @@ -1174,518 +1180,167 @@ ICCARM - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 105 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 0 120 161 211 BICOMP - 65 39 61 23 74 32 69 36 34 38 63 71 45 43 87 67 76 + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 105 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 0 120 161 211 - $PROJ_DIR$\..\lib\ethernetlib\src\stm32_eth.c + $PROJ_DIR$\..\hooks.c ICCARM - 197 351 + 200 194 BICOMP - 195 + 154 ICCARM - 89 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 89 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\fatfs\mmc.c + $PROJ_DIR$\..\main.c ICCARM - 331 326 + 203 193 BICOMP - 342 + 155 ICCARM - 238 239 216 233 285 155 217 303 279 329 42 43 97 92 249 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 238 239 216 233 285 155 217 303 279 329 42 43 97 92 249 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\misc.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c ICCARM - 78 284 + 277 275 BICOMP - 250 + 138 ICCARM - 96 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 108 BICOMP - 96 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 108 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_adc.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s - ICCARM - 255 208 - - - BICOMP - 237 - - - - - ICCARM - 99 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 99 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_can.c - - - ICCARM - 346 210 - - - BICOMP - 234 - - - - - ICCARM - 101 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 101 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_crc.c - - - ICCARM - 294 214 - - - BICOMP - 241 - - - - - ICCARM - 104 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 104 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp.c - - - ICCARM - 189 211 - - - BICOMP - 304 - - - - - ICCARM - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_aes.c - - - ICCARM - 347 147 - - - BICOMP - 278 - - - - - ICCARM - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_des.c - - - ICCARM - 349 86 - - - BICOMP - 341 - - - - - ICCARM - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_tdes.c - - - ICCARM - 183 207 - - - BICOMP - 202 - - - - - ICCARM - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 106 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dac.c - - - ICCARM - 165 219 - - - BICOMP - 251 - - - - - ICCARM - 111 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 111 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c - - - ICCARM - 293 209 - - - BICOMP - 265 - - - - - ICCARM - 113 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 113 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dcmi.c - - - ICCARM - 167 220 - - - BICOMP - 215 - - - - - ICCARM - 115 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 115 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dma.c - - - ICCARM - 166 221 - - - BICOMP - 308 - - - - - ICCARM - 117 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 117 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_exti.c - - - ICCARM - 259 223 - - - BICOMP + AARM 156 - - - ICCARM - 119 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 119 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_flash.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c ICCARM - 178 222 + 256 127 BICOMP - 198 + 150 ICCARM - 121 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 BICOMP - 121 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c ICCARM - 159 224 + 331 330 BICOMP - 158 + 329 ICCARM - 123 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c ICCARM - 176 231 + 202 151 BICOMP - 350 + 159 ICCARM - 125 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 BICOMP - 125 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 131 133 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c ICCARM - 164 230 - - - BICOMP - 348 - - - - - ICCARM - 127 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c - - - ICCARM - 290 212 - - - BICOMP - 345 - - - - - ICCARM - 127 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 127 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c - - - ICCARM - 170 213 - - - BICOMP - 291 - - - - - ICCARM - 127 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 127 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 125 131 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c - - - ICCARM - 180 340 - - - BICOMP - 306 - - - - - ICCARM - 131 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 133 135 137 0 3 5 7 9 11 13 15 96 - - - BICOMP - 131 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 133 135 137 0 3 5 7 9 11 13 15 96 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c - - - ICCARM - 173 305 + 204 158 BICOMP @@ -1695,20 +1350,430 @@ ICCARM - 133 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 133 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 135 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c ICCARM - 175 235 + 307 266 + + + BICOMP + 253 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c + + + ICCARM + 171 109 + + + BICOMP + 205 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c + + + ICCARM + 219 287 + + + BICOMP + 212 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + + + ICCARM + 215 184 + + + BICOMP + 226 + + + + + ICCARM + 96 94 3 83 210 121 341 115 167 280 342 185 + + + BICOMP + 96 94 3 83 210 121 341 115 167 280 342 185 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + + + ICCARM + 317 182 + + + BICOMP + 142 + + + + + ICCARM + 96 94 3 130 + + + BICOMP + 96 94 3 130 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c + + + ICCARM + 279 174 + + + BICOMP + 309 + + + + + ICCARM + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 101 100 120 121 341 115 167 280 342 185 161 211 + + + BICOMP + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 101 100 120 121 341 115 167 280 342 185 161 211 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c + + + ICCARM + 268 278 + + + BICOMP + 310 + + + + + ICCARM + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 101 120 121 341 115 167 280 342 185 161 211 + + + BICOMP + 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 101 120 121 341 115 167 280 342 185 161 211 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c + + + ICCARM + 139 273 + + + BICOMP + 136 + + + + + ICCARM + 105 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 120 121 341 115 167 280 342 185 161 211 + + + BICOMP + 105 103 234 73 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 248 120 121 341 115 167 280 342 185 161 211 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c + + + ICCARM + 274 318 + + + BICOMP + 140 + + + + + ICCARM + 98 70 107 + + + BICOMP + 98 70 107 + + + + + $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.out + + + ILINK + 315 + + + OBJCOPY + 148 + + + + + ILINK + 311 162 191 192 330 306 195 110 151 156 184 350 158 194 193 166 208 135 269 266 233 333 335 339 336 272 262 332 343 334 345 346 348 347 349 113 112 337 338 222 187 117 189 324 325 326 328 181 225 180 124 263 109 287 174 278 273 318 275 182 127 111 170 285 209 293 + + + + + $PROJ_DIR$\..\lib\ethernetlib\src\stm32f4x7_eth.c + + + ICCARM + 267 258 + + + BICOMP + 259 + + + + + ICCARM + 316 313 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 120 161 211 + + + BICOMP + 316 313 10 5 131 121 341 115 167 280 342 185 6 179 165 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 120 161 211 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c + + + ICCARM + 317 182 + + + BICOMP + 142 + + + + + ICCARM + 207 218 3 344 + + + BICOMP + 207 218 3 344 + + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + ICCARM + 164 162 + + + BICOMP + 163 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 197 191 + + + BICOMP + 114 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + ICCARM + 198 192 + + + BICOMP + 351 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + ICCARM + 201 195 + + + BICOMP + 149 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 81 93 248 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 81 93 248 + + + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + ICCARM + 199 110 + + + BICOMP + 125 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 + + + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + ICCARM + 196 350 + + + BICOMP + 126 + + + + + ICCARM + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 120 121 341 115 167 280 342 185 161 211 252 255 264 206 152 129 128 260 + + + BICOMP + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 120 121 341 115 167 280 342 185 161 211 252 255 264 206 152 129 128 260 + + + + + $PROJ_DIR$\..\..\..\..\Source\net.c + + + ICCARM + 270 135 BICOMP @@ -1718,34 +1783,34 @@ ICCARM - 135 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 72 103 234 73 248 105 BICOMP - 135 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 137 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 72 103 234 73 248 105 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c + $PROJ_DIR$\..\..\..\..\Source\xcp.c ICCARM - 174 307 + 169 111 BICOMP - 236 + 153 ICCARM - 137 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 BICOMP - 137 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 0 3 5 7 9 11 13 15 96 + 240 91 236 74 249 84 244 88 86 90 238 246 96 94 3 242 251 @@ -1754,86 +1819,21 @@ ICCARM - 333 302 + 215 184 BICOMP - 344 + 226 ICCARM - 325 336 87 196 328 239 216 233 285 155 217 303 + 207 218 3 321 210 121 341 115 167 280 342 185 BICOMP - 325 336 87 196 328 239 216 233 285 155 217 303 - - - - - $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.out - - - ILINK - 190 - - - OBJCOPY - 266 - - - - - ILINK - 185 280 309 310 205 181 313 228 269 274 302 225 276 312 311 284 326 253 144 141 351 208 210 214 211 147 86 207 219 209 220 221 223 222 224 231 230 212 213 340 305 235 307 199 200 201 203 299 343 298 242 139 227 162 292 153 148 193 150 300 245 229 288 160 327 168 - - - - - $PROJ_DIR$\..\lib\ethernetlib\src\stm32f4x7_eth.c - - - ICCARM - 142 81 - - - BICOMP - 85 - - - - - ICCARM - 191 188 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 238 279 329 - - - BICOMP - 191 188 97 92 249 239 216 233 285 155 217 303 93 297 283 94 88 17 102 99 101 104 106 111 113 115 117 119 121 123 127 125 131 133 135 137 0 3 5 7 9 11 13 15 96 238 279 329 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c - - - ICCARM - 192 300 - - - BICOMP - 260 - - - - - ICCARM - 325 336 87 218 - - - BICOMP - 325 336 87 218 + 207 218 3 321 210 121 341 115 167 280 342 185 diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/bin/openblt_dk_tm4c123g.out b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/bin/openblt_dk_tm4c123g.out index ed43a21fee0e697590eb3b9171ae459c4f7e6846..f79f587a8de0eefc59765e7521c8a46c407d939b 100644 GIT binary patch delta 4175 zcmZ`*dstOf7C&q6dqLO-wR?G^87e-?Q69?UO1{9Wpr+WDf;9$#i2-AwPR(RrQjk2P zK*&Ylh+-frJ|>$EiQprLG_~-{kOIp}iz!F^#6%%*_PLvLIrM$=$Nla-zu#}I^V@5$ zz4k3`^)7DpJ{(a8i;E)b${?obYTa&FQIvV?UEjTuB+W@kOo?2(Ha#MFRbq++8Q=ha z=WwZ2lA5hYEcLIRgKPLvHWb4ZT#y5$a07qJfhy?5{9O1a8M4LoRSjOCrD6=5Axvsi3QX}^4=tv(*tY)ebmq-NfypHrLOvm1O<403%n1N_)vT0h-xy%2wW2X>QA0~Qp3oBF+{ zfUEP3E>b;LZ{^BU1L}NCD1@D!HJtsCvnuoX09%7zTRB_LS+_R?(>K7@26yBxTQ7blQ$4lSGb?;A?tc4*Wq)14C~`sS$_(u?c%~c@^n`i}IMJ(w?}W|zcWuI`3Rt3l zf#&L51xzJ6|8cmo60-D4XSn8J(|E%s+u0fgD4c`AJJ{x^|A=$BCiS0d*Wq(-zJLKCRhV(*){h^>2 za_kR}^ywZB_YEXa!XH37b?kSA+=W%?A!M)>* zeF2x9NU%O?H=cARuPVjP#L-17>n;z{q!moN#a~} zcGZ!uo?nW!kt9|hqE36xt4|ULU$xS0R%_H%8>*`qNOg=`; zCkgrxb=GsD+W~9m54NrjbIyE?W1_-+oxIXHf=fpK9ERG)R zOP%qY*^G`02G_?h!$wpqFE1cpR?9giaC&G6HSpJ(aM>NQQr>HV5nw|qO?cuCd6hMp zV2VJ_qxCm(oc;a~m;`VShuYDE9BbP?<3fWHm6i`ir85_UX-lF>Gx4u4b?cOs2s zk`1_p)BWfQInN5tBJ1Wx+~r5t$UCgyV75t08_|6neTE&ff~P?C<7?ySMfsu?N{EQM zpsW~AHyPON`QSdv7IhP^KSuN9q9_<`vH|a$#f_8bVb&N0>0UPEloIkM8b#Q@qhT1c zAty0!3Qc0)M}w1_4Y-2cQ)n{liUw~1bYhx6O_R$PfREUKvUB*8Kiw?n25RMfD-iz{ zK$pqe1Hl|@%Tf}EtpT)v9Sek^0;$En2GR_6IS~Bk*(6^g38HVvg+bsd)|elJ1wr&h zc8DWl0ldwp(hclF5D-6G%vsEvN*A)$AQ&zbm+=QxaW4qQ4znrl;B(VxDXW!TV}xvGwDlAv4E36j$qU*n!?Uoz)b*W@c1lR#=4dR z6N~S}RkP`9@|IW_Efm=;cyl(bVqb@VkBSib6_(H8YwZnzkpj4n8zN|{yggK8CA1_I zpNXVf*pX1t_Jkh7&PW==8u$V|ZAp&e;<>zOKC>$tv0*M>@mHbXGQy^~h!d>zb@ofB zXc0nx!Vj!8jdg{>5NDgB6Ca&Nv*qkC@KOOI%?!hadGr|D9|qn6*@Id0X+8TQ4E$u9 z5wp23b4w1_?6{VRYT%zv7$lS@KinCRZ(5Ji55&NQg2?w@;n)yw1QQdVcy zdQrg-|Br^cIdz;x#zv23{g&ALb|V;o0P-T@dH-dJj4e0wk zUC!FvwGy=8o6qxE+T#w6BBTp{d7f|K77y?cK(+@iSWQ>310LFO+>3`-^O%z!T9SJ7 zNT!ACsy(Jn1s=n1leymuo-j;gI*U)U)VJ+U;O?n9V{9{xqQyn^H{SRjr By~O|k delta 4177 zcmZ`*d017|7C&om?nT%K_1?>jL#Q~EB`DKHb7D|XocdC+oc}0R?=-cOR&gIbe^#|Ym&hPhI>-^T*Yp+Az zRqwp3-j(5pVM1=i;jIvxd;M?;OwV0@WRvesNs`7UB&I~npPwF{JSQEp1Y@6^C|cyJZuK|M}b4f${f@2rM0XvVc!@DZ%UQQ5H5GmjV{>ODz1Zg*ev?A!+A*xpHTnjyi z7f}BzoGxsq=Ppc^pnyiG*ijWrR2?r^lqNwT4RGS>b!;Sr{P8hk6$#Y=A<~)11A@S(Q20!JbC1jhy|4vu;ZT^SFck2J1FLk!LGs zhjUhCTu0b_v|?5+6#A|+x=5*^h^L+QKzUC46rkyn%=FV6bNe*H&|_sw?i$ zR^XF7-i~}n7peO)!JO}4^Bu8z6O?(jba9blIjvI8&)aRZ;Nth87)r4>f;;~SMsB&r z$wfNCwUfB6vO`;g4G5)P%bi`M(B*=;(!nlw#){2Q0_8Y$3r|&!$y@k1oyKnY{OPpP zKOYjn*mmgC4-B8+lHCxG_qIa1adY;L4-7Z3ZXoGzymz%_yWy^~VHzcV%F7 zF-+0FKyy`741q-FKMrS?LZ)8nY_~EG6Ut$ll2QiU9dseJdbMM_8h_jaFDRGyz*)Ty zcRW@BhxB^Q$DVxg!Jz)x&Wu%f_TMx z3%+sl5N89)^XI25c#gL`=i%p@4YgDm)C%5z5x)w3+aTGoU5R%eL8kp-;UBQp{?Mfj zme?P1+F-T);i<>Ehswtt36v2}Ae}n4yF%_FN_j*`XDhP3=aRG>;R<+Tg9DkNR6CHn zRBOQAF2v7XK)n+Q)<>1#XU^muCC`~Sx@c`J@*wB6hN+XO*T0FrUSzi7=tX|%s_FSS zkHN5kWP?6PJFvEaWRO9#GWa>-W4H3>vsmI!UQw)L@cVSl`R&9vo=cXfu2XzI$C7cDc3!&BmOvs#Oa9>f>?$xj3qDX3H4LKQ{~{{v1GfRP`@9XSb-_we@Z2YZCD>p67&%_ z1ksEWB1oL8&aS%hd8#cASQSBL>O<6R&zW7=H(xW6g{Fk z*RF1RPMpA%QJoE|p8!r=!bTp^Q|C+F@tkNfbTv@9M-Kz^#()?yS?@z#^jwl<#Pj1w zyxzLH);Y5a!^e{ZeTcg2Iq|+DR*mm$U0vp!d4PSRJ9kdq@SG?@{1c(BbWWT?7Sp*u z>YnFBhBM~HboQn0c+QldOviWUN_5dJ`q+T? z@usS%jWCeGHlPNF`_WnQok(yNS#O-gB0oA$Zixh=#U^=h65adLmswU6cnV|%zT2PH z$$O(vu7o^G zqX{dFfo{x(Y{Tp!G>ILF0Vg*bP=&2SXfnGH1Kt8ShiU#aO>T_=A8`OpU*R2px>CL! zptbjh0Q_eFoh~;AfF;UfIdQTvmWn{p=Inq2>7T7p_N!Lme#N1 zdR1-?5m^as48fNp=o+>zR17|$S=bmsr?M@)Ku=qeO*lD{k4>pvQH0fzyyD7GaOq)F z?8Sjm^gVVmR168BpW*%}n#L}KLKkP7;v7Cbj;@k#hJu$080hz*SUrv&VJocQEs&*{ zIi4P6yRG0S+azU5Y&7i)^7mEd}{LjC}X) zok*{-vtiI%0B2Od2lvI&2Dv#5UJ=O~!<1cw{!hAm*FHfPd@?8`ECyeI; zddq}Ert-0PY=T~5C|gaK!x42k_7a0qg8!RJr?Xl!I0~Q!r%t0U$+yhfrMhlbs;1FM zgPKMbiFq2QnKYi|+Sko`TsV`CV+DM}3dvUdawgCFAW@Zl#h@O zOKULvb>5Z--rA@1S8RBlo?!cYw3>HgbqZa;>U=bNXK_R-oy~spfv!%rbHBf`G?nr{ O2mWVJN>hyuqyG<(64F@! diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/blt_conf.h b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/blt_conf.h index 986a0591..b0a7f739 100644 --- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/blt_conf.h +++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/blt_conf.h @@ -177,5 +177,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/hooks.c b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/hooks.c index 746b79d8..ffbaafc7 100644 --- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/hooks.c +++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/hooks.c @@ -460,4 +460,63 @@ void FileFirmwareUpdateLogHook(blt_char *info_string) #endif /* BOOT_FILE_SYS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/settings/tm4c123g.wsdt b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/settings/tm4c123g.wsdt index 71a6daff..a8ee49a4 100644 --- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/settings/tm4c123g.wsdt +++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/settings/tm4c123g.wsdt @@ -17,7 +17,7 @@ 20139537293142202431837113619234300FileFunctionLine20070010013619234 - + TabID-23736-13759 @@ -29,7 +29,7 @@ - 0TabID-11003-23003BuildBuildTabID-13665-29690Find All DeclarationsFind-All-DeclarationsTabID-2562-1429Debug LogDebug-LogTabID-23273-22207Find in FilesFind-in-FilesTabID-14368-8233Ambiguous DefinitionsSelect-Ambiguous-Definitions2 + 0TabID-11003-23003BuildBuildTabID-13665-29690Find All DeclarationsFind-All-DeclarationsTabID-2562-1429Debug LogDebug-LogTabID-23273-22207Find in FilesFind-in-FilesTabID-14368-8233Ambiguous DefinitionsSelect-Ambiguous-Definitions0 @@ -42,7 +42,7 @@ - iaridepm.enu1-2-2579403-2-22002001041671984132109385763890011765302731919381362-257719242001002083198413210938382937 + iaridepm.enu1-2-2579403-2-22002001041671984132109385763890011765302731919381362-257719242001002083198413210938382937 diff --git a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/tm4c123g.dep b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/tm4c123g.dep index 9f7914f4..3ca7df35 100644 --- a/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/tm4c123g.dep +++ b/Target/Demo/ARMCM4_TM4C_DK_TM4C123G_IAR/Boot/ide/tm4c123g.dep @@ -36,60 +36,34 @@ $PROJ_DIR$\..\lib\driverlib\qei.c $PROJ_DIR$\..\lib\driverlib\qei.h $PROJ_DIR$\..\lib\driverlib\rom.h - $PROJ_DIR$\..\lib\driverlib\rom_map.h - $PROJ_DIR$\..\lib\driverlib\rtos_bindings.h - $PROJ_DIR$\..\lib\driverlib\ssi.c - $PROJ_DIR$\..\lib\driverlib\ssi.h - $PROJ_DIR$\..\lib\driverlib\sw_crc.c - $PROJ_DIR$\..\lib\driverlib\sw_crc.h - $PROJ_DIR$\..\lib\driverlib\sysctl.c - $PROJ_DIR$\..\lib\driverlib\sysctl.h - $PROJ_DIR$\..\lib\driverlib\sysexc.c - $PROJ_DIR$\..\lib\driverlib\systick.c - $PROJ_DIR$\..\lib\driverlib\systick.h - $PROJ_DIR$\..\lib\driverlib\timerlib.c - $PROJ_DIR$\..\lib\driverlib\timerlib.h - $PROJ_DIR$\..\lib\driverlib\uartlib.c - $PROJ_DIR$\..\lib\driverlib\uartlib.h - $PROJ_DIR$\..\lib\driverlib\udma.c - $PROJ_DIR$\..\lib\driverlib\udma.h - $PROJ_DIR$\..\lib\driverlib\usbdrv.c - $PROJ_DIR$\..\lib\driverlib\usbdrv.h - $PROJ_DIR$\..\lib\driverlib\watchdog.c - $PROJ_DIR$\..\lib\driverlib\watchdog.h - $PROJ_DIR$\..\lib\fatfs\ffconf.h - $PROJ_DIR$\..\lib\fatfs\mmc.c - $PROJ_DIR$\..\lib\inc\hw_adc.h - $PROJ_DIR$\..\lib\inc\hw_can.h - $PROJ_DIR$\..\lib\inc\hw_comp.h - $PROJ_DIR$\..\lib\inc\hw_eeprom.h - $PROJ_DIR$\..\lib\inc\hw_flash.h - $PROJ_DIR$\..\lib\inc\hw_gpio.h - $PROJ_DIR$\..\lib\inc\hw_hibernate.h - $PROJ_DIR$\..\lib\inc\hw_i2c.h - $PROJ_DIR$\..\lib\inc\hw_ints.h - $PROJ_DIR$\..\lib\inc\hw_memmap.h - $PROJ_DIR$\..\lib\inc\hw_nvic.h - $PROJ_DIR$\..\lib\inc\hw_pwm.h - $PROJ_DIR$\..\lib\inc\hw_qei.h - $PROJ_DIR$\..\lib\inc\hw_ssi.h - $PROJ_DIR$\..\lib\inc\hw_sysctl.h - $PROJ_DIR$\..\lib\inc\hw_sysexc.h - $PROJ_DIR$\..\lib\inc\hw_timer.h - $PROJ_DIR$\..\lib\inc\hw_types.h - $PROJ_DIR$\..\lib\inc\hw_uart.h - $PROJ_DIR$\..\lib\inc\hw_udma.h - $PROJ_DIR$\..\lib\inc\hw_usb.h - $PROJ_DIR$\..\lib\inc\hw_watchdog.h - $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.c - $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.h - $PROJ_DIR$\..\lib\usblib\device\usbdaudio.c - $PROJ_DIR$\..\lib\usblib\device\usbdaudio.h - $PROJ_DIR$\..\lib\usblib\device\usbdbulk.c - $PROJ_DIR$\..\lib\usblib\device\usbdbulk.h - $PROJ_DIR$\..\lib\usblib\device\usbdcdc.c - $PROJ_DIR$\..\lib\usblib\device\usbdcdc.h - $PROJ_DIR$\..\lib\usblib\device\usbdcdesc.c + $PROJ_DIR$\flashstore.c + $PROJ_DIR$\qs-logger.c + $PROJ_DIR$\..\drivers\slidemenuwidget.c + $PROJ_DIR$\startup_ewarm.c + $PROJ_DIR$\stripchartmanager.c + $PROJ_DIR$\..\drivers\stripchartwidget.c + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + $PROJ_DIR$\usb_serial_structs.c + $PROJ_DIR$\usbserial.c + $PROJ_DIR$\usbstick.c + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + $PROJ_DIR$\..\obj\images.o + $PROJ_DIR$\..\obj\buttons.o + $PROJ_DIR$\..\obj\clocksetwidget.o + $PROJ_DIR$\..\obj\acquire.o + $PROJ_DIR$\..\obj\cfal96x64x16.o + $PROJ_DIR$\..\obj\i2c.pbi + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + $PROJ_DIR$\..\obj\interrupt.pbi + $PROJ_DIR$\..\obj\mpu.pbi + $PROJ_DIR$\..\obj\pwm.pbi + $PROJ_DIR$\..\obj\qei.pbi + $PROJ_DIR$\..\obj\usbdbulk.o + $PROJ_DIR$\..\lib\driverlib\usblib.c + $PROJ_DIR$\..\lib\driverlib\usblib.h + $PROJ_DIR$\..\obj\usbbuffer.o + $PROJ_DIR$\..\obj\ssi.pbi + $PROJ_DIR$\..\obj\sw_crc.pbi $PROJ_DIR$\..\lib\usblib\device\usbdcomp.c $PROJ_DIR$\..\lib\usblib\device\usbdcomp.h $PROJ_DIR$\..\lib\usblib\device\usbdconfig.c @@ -144,11 +118,11 @@ $PROJ_DIR$\..\main.c $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\vectors.c $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\cstart.s - $PROJ_DIR$\..\obj\usbdconfig.o + $PROJ_DIR$\..\..\..\..\Source\xcp.h $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\cpu.c $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\cpu.h + $PROJ_DIR$\..\obj\usbdconfig.o $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\flash.c - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\flash.h $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\nvm.c $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\nvm.h @@ -156,28 +130,6 @@ $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\timer.h $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\types.h $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\uart.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\uart.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\usb.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\usb.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\integer.h - $PROJ_DIR$\..\..\..\..\Source\assert.c - $PROJ_DIR$\..\..\..\..\Source\assert.h - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - $PROJ_DIR$\..\..\..\..\Source\backdoor.h - $PROJ_DIR$\..\..\..\..\Source\boot.c - $PROJ_DIR$\..\..\..\..\Source\boot.h - $PROJ_DIR$\..\..\..\..\Source\com.c - $PROJ_DIR$\..\..\..\..\Source\com.h - $PROJ_DIR$\..\..\..\..\Source\cop.c - $PROJ_DIR$\..\..\..\..\Source\cop.h - $PROJ_DIR$\..\..\..\..\Source\file.c - $PROJ_DIR$\..\..\..\..\Source\file.h - $PROJ_DIR$\..\..\..\..\Source\plausibility.h - $PROJ_DIR$\..\..\..\..\Source\xcp.c - $PROJ_DIR$\..\..\..\..\Source\xcp.h $TOOLKIT_DIR$\lib\shb_l.a $PROJ_DIR$\..\obj\openblt_dk_tm4c123g.map $PROJ_DIR$\..\obj\fpu.o @@ -207,6 +159,147 @@ $PROJ_DIR$\..\obj\usbdmsc.pbi $PROJ_DIR$\..\obj\usbhaudio.o $PROJ_DIR$\..\obj\usbhhid.o + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\uart.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\usb.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\usb.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\integer.h + $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\..\..\..\Source\assert.h + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\..\..\..\Source\boot.h + $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\..\..\..\Source\com.h + $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\..\..\..\Source\cop.h + $PROJ_DIR$\..\..\..\..\Source\file.c + $PROJ_DIR$\..\..\..\..\Source\file.h + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + $PROJ_DIR$\..\..\..\..\Source\xcp.c + $PROJ_DIR$\..\obj\usbdesc.pbi + $PROJ_DIR$\..\obj\usbdma.pbi + $PROJ_DIR$\..\obj\usbkeyboardmap.pbi + $PROJ_DIR$\..\obj\usbmode.pbi + $PROJ_DIR$\..\obj\usbringbuf.pbi + $PROJ_DIR$\..\obj\usbtick.pbi + $PROJ_DIR$\..\obj\usblib.o + $PROJ_DIR$\..\obj\usblib.pbi + $PROJ_DIR$\..\obj\comp.pbi + $PROJ_DIR$\..\obj\cpu.pbi + $PROJ_DIR$\..\obj\eeprom.pbi + $PROJ_DIR$\..\obj\flash.pbi + $PROJ_DIR$\..\obj\fpu.pbi + $PROJ_DIR$\..\obj\gpio.pbi + $PROJ_DIR$\..\obj\hibernate.pbi + $TOOLKIT_DIR$\inc\c\xtls.h + $TOOLKIT_DIR$\inc\c\xmtx.h + $TOOLKIT_DIR$\inc\c\stdlib.h + $TOOLKIT_DIR$\inc\c\xlocaleuse.h + $TOOLKIT_DIR$\inc\c\xlocale_c.h + $TOOLKIT_DIR$\inc\c\wchar.h + $PROJ_DIR$\..\obj\nvm.o + $PROJ_DIR$\..\obj\cpulib.o + $PROJ_DIR$\..\obj\cpulib.pbi + $PROJ_DIR$\..\obj\timerlib.o + $PROJ_DIR$\..\obj\timerlib.pbi + $PROJ_DIR$\..\obj\flashlib.o + $PROJ_DIR$\..\obj\flashlib.pbi + $PROJ_DIR$\..\obj\uartlib.o + $PROJ_DIR$\..\obj\uartlib.pbi + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\ccsbcs.c + $PROJ_DIR$\..\obj\unicode.pbi + $PROJ_DIR$\..\obj\unicode.o + $TOOLKIT_DIR$\inc\c\stdarg.h + $PROJ_DIR$\..\obj\mmc.pbi + $PROJ_DIR$\..\obj\mmc.o + $PROJ_DIR$\..\obj\cstart.o + $PROJ_DIR$\..\lib\driverlib\timer.h + $PROJ_DIR$\..\lib\driverlib\timer.c + $PROJ_DIR$\..\obj\adc.o + $PROJ_DIR$\..\obj\vectors.o + $PROJ_DIR$\..\lib\driverlib\uart.c + $PROJ_DIR$\..\lib\driverlib\uart.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\memory.x + $PROJ_DIR$\..\lib\driverlib\cpu.c + $PROJ_DIR$\..\lib\driverlib\flash.c + $PROJ_DIR$\..\obj\led.pbi + $PROJ_DIR$\..\obj\time.pbi + $PROJ_DIR$\..\obj\main.pbi + $PROJ_DIR$\..\obj\irq.pbi + $PROJ_DIR$\..\obj\vectors.pbi + $PROJ_DIR$\..\obj\boot.pbi + $PROJ_DIR$\..\obj\buttons.pbi + $PROJ_DIR$\..\obj\cfal96x64x16.pbi + $PROJ_DIR$\..\obj\clocksetwidget.pbi + $PROJ_DIR$\..\obj\fat_usbmsc.pbi + $PROJ_DIR$\..\boot.c + $PROJ_DIR$\..\boot.h + $PROJ_DIR$\..\obj\sysctl.pbi + $PROJ_DIR$\..\obj\stripchartwidget.pbi + $PROJ_DIR$\..\obj\menus.o + $PROJ_DIR$\..\obj\qs-logger.o + $PROJ_DIR$\..\obj\slidemenuwidget.o + $PROJ_DIR$\..\obj\usbdrv.o + $PROJ_DIR$\..\obj\usbdrv.pbi + $PROJ_DIR$\..\obj\usbhostenum.o + $PROJ_DIR$\..\obj\usbhmsc.o + $PROJ_DIR$\..\obj\usbhscsi.o + $PROJ_DIR$\..\obj\usbhaudio.pbi + $PROJ_DIR$\..\obj\usbhhid.pbi + $PROJ_DIR$\..\obj\usbhhidkeyboard.pbi + $PROJ_DIR$\..\obj\usbhhidmouse.pbi + $PROJ_DIR$\..\obj\usbhhub.pbi + $PROJ_DIR$\..\obj\usbhmsc.pbi + $PROJ_DIR$\..\obj\usbhostenum.pbi + $PROJ_DIR$\..\obj\usbhscsi.pbi + $PROJ_DIR$\..\obj\usb_bulk_structs.o + $PROJ_DIR$\..\obj\usb_bulk_structs.pbi + $PROJ_DIR$\..\obj\usbdaudio.o + $PROJ_DIR$\..\obj\usbdcdc.o + $PROJ_DIR$\..\obj\usbdesc.o + $PROJ_DIR$\..\obj\usbdma.o + $PROJ_DIR$\..\obj\usbkeyboardmap.o + $PROJ_DIR$\..\obj\usbmode.o + $PROJ_DIR$\..\obj\usbringbuf.o + $PROJ_DIR$\..\obj\usbtick.o + $PROJ_DIR$\..\obj\usbbuffer.pbi + $PROJ_DIR$\..\cstart.s + $PROJ_DIR$\..\header.h + $PROJ_DIR$\..\irq.c + $PROJ_DIR$\..\irq.h + $PROJ_DIR$\..\led.c + $PROJ_DIR$\..\led.h + $PROJ_DIR$\..\obj\fat_usbmsc.o + $PROJ_DIR$\..\obj\flashstore.o + $PROJ_DIR$\..\obj\startup_ewarm.pbi + $PROJ_DIR$\..\obj\slidemenuwidget.pbi + $PROJ_DIR$\..\obj\uartstdio.pbi + $PROJ_DIR$\..\obj\usbserial.pbi + $PROJ_DIR$\..\obj\usb_serial_structs.pbi + $PROJ_DIR$\..\obj\usbstick.pbi + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\..\lib\driverlib\usb.h + $PROJ_DIR$\..\lib\driverlib\flash.h + $PROJ_DIR$\..\lib\driverlib\cpu.h + $PROJ_DIR$\..\obj\stripchartmanager.o + $PROJ_DIR$\..\obj\ff.o + $PROJ_DIR$\..\obj\usb_serial_structs.o + $PROJ_DIR$\..\obj\startup_ewarm.o + $PROJ_DIR$\..\lib\driverlib\usb.c + $PROJ_DIR$\..\obj\uartstdio.o + $PROJ_DIR$\..\obj\stripchartwidget.o + $PROJ_DIR$\..\obj\usbserial.o $PROJ_DIR$\..\obj\usbhhidmouse.o $PROJ_DIR$\..\obj\usbhhidkeyboard.o $PROJ_DIR$\..\obj\usbhhub.o @@ -293,174 +386,90 @@ $PROJ_DIR$\images.c $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c $PROJ_DIR$\menus.c - $PROJ_DIR$\flashstore.c - $PROJ_DIR$\qs-logger.c - $PROJ_DIR$\..\drivers\slidemenuwidget.c - $PROJ_DIR$\startup_ewarm.c - $PROJ_DIR$\stripchartmanager.c - $PROJ_DIR$\..\drivers\stripchartwidget.c - $PROJ_DIR$\..\..\..\..\utils\uartstdio.c - $PROJ_DIR$\usb_serial_structs.c - $PROJ_DIR$\usbserial.c - $PROJ_DIR$\usbstick.c - $PROJ_DIR$\..\..\..\..\utils\ustdlib.c - $PROJ_DIR$\..\obj\images.o - $PROJ_DIR$\..\obj\buttons.o - $PROJ_DIR$\..\obj\clocksetwidget.o - $PROJ_DIR$\..\obj\acquire.o - $PROJ_DIR$\..\obj\cfal96x64x16.o - $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c - $PROJ_DIR$\..\obj\i2c.pbi - $PROJ_DIR$\..\obj\interrupt.pbi - $PROJ_DIR$\..\obj\mpu.pbi - $PROJ_DIR$\..\obj\pwm.pbi - $PROJ_DIR$\..\obj\qei.pbi - $PROJ_DIR$\..\obj\usbdbulk.o - $PROJ_DIR$\..\lib\driverlib\usblib.c - $PROJ_DIR$\..\lib\driverlib\usblib.h - $PROJ_DIR$\..\obj\usbbuffer.o - $PROJ_DIR$\..\obj\ssi.pbi - $PROJ_DIR$\..\obj\sw_crc.pbi - $PROJ_DIR$\..\obj\sysctl.pbi - $PROJ_DIR$\..\obj\stripchartwidget.pbi - $PROJ_DIR$\..\obj\menus.o - $PROJ_DIR$\..\obj\qs-logger.o - $PROJ_DIR$\..\obj\slidemenuwidget.o - $PROJ_DIR$\..\obj\usbdrv.o - $PROJ_DIR$\..\obj\usbdrv.pbi - $PROJ_DIR$\..\obj\usbhostenum.o - $PROJ_DIR$\..\obj\usbhmsc.o - $PROJ_DIR$\..\obj\usbhscsi.o - $PROJ_DIR$\..\obj\usbhaudio.pbi - $PROJ_DIR$\..\obj\usbhhid.pbi - $PROJ_DIR$\..\obj\usbhhidkeyboard.pbi - $PROJ_DIR$\..\obj\usbhhidmouse.pbi - $PROJ_DIR$\..\obj\usbhhub.pbi - $PROJ_DIR$\..\obj\usbhmsc.pbi - $PROJ_DIR$\..\obj\usbhostenum.pbi - $PROJ_DIR$\..\obj\usbhscsi.pbi - $PROJ_DIR$\..\obj\usb_bulk_structs.o - $PROJ_DIR$\..\obj\usb_bulk_structs.pbi - $PROJ_DIR$\..\obj\usbdaudio.o - $PROJ_DIR$\..\obj\usbdcdc.o - $PROJ_DIR$\..\obj\usbdesc.o - $PROJ_DIR$\..\obj\usbdma.o - $PROJ_DIR$\..\obj\usbkeyboardmap.o - $PROJ_DIR$\..\obj\usbmode.o - $PROJ_DIR$\..\obj\usbringbuf.o - $PROJ_DIR$\..\obj\usbtick.o - $PROJ_DIR$\..\obj\usbbuffer.pbi - $PROJ_DIR$\..\obj\usbdesc.pbi - $PROJ_DIR$\..\obj\usbdma.pbi - $PROJ_DIR$\..\obj\usbkeyboardmap.pbi - $PROJ_DIR$\..\obj\usbmode.pbi - $PROJ_DIR$\..\obj\usbringbuf.pbi - $PROJ_DIR$\..\obj\usbtick.pbi - $PROJ_DIR$\..\obj\usblib.o - $PROJ_DIR$\..\obj\usblib.pbi - $PROJ_DIR$\..\obj\comp.pbi - $PROJ_DIR$\..\obj\cpu.pbi - $PROJ_DIR$\..\obj\eeprom.pbi - $PROJ_DIR$\..\obj\flash.pbi - $PROJ_DIR$\..\obj\fpu.pbi - $PROJ_DIR$\..\obj\gpio.pbi - $PROJ_DIR$\..\obj\hibernate.pbi - $TOOLKIT_DIR$\inc\c\xtls.h - $TOOLKIT_DIR$\inc\c\xmtx.h - $TOOLKIT_DIR$\inc\c\stdlib.h - $TOOLKIT_DIR$\inc\c\xlocaleuse.h - $TOOLKIT_DIR$\inc\c\xlocale_c.h - $TOOLKIT_DIR$\inc\c\wchar.h - $PROJ_DIR$\..\obj\nvm.o - $PROJ_DIR$\..\obj\cpulib.o - $PROJ_DIR$\..\obj\cpulib.pbi - $PROJ_DIR$\..\obj\timerlib.o - $PROJ_DIR$\..\obj\timerlib.pbi - $PROJ_DIR$\..\obj\flashlib.o - $PROJ_DIR$\..\obj\flashlib.pbi - $PROJ_DIR$\..\obj\uartlib.o - $PROJ_DIR$\..\obj\uartlib.pbi - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\ccsbcs.c - $PROJ_DIR$\..\obj\unicode.pbi - $PROJ_DIR$\..\obj\unicode.o - $TOOLKIT_DIR$\inc\c\stdarg.h - $PROJ_DIR$\..\obj\mmc.pbi - $PROJ_DIR$\..\obj\mmc.o - $PROJ_DIR$\..\obj\cstart.o - $PROJ_DIR$\..\lib\driverlib\timer.h - $PROJ_DIR$\..\lib\driverlib\timer.c - $PROJ_DIR$\..\obj\adc.o - $PROJ_DIR$\..\obj\vectors.o - $PROJ_DIR$\..\lib\driverlib\uart.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\memory.x - $PROJ_DIR$\..\lib\driverlib\uart.h - $PROJ_DIR$\..\lib\driverlib\cpu.c - $PROJ_DIR$\..\lib\driverlib\flash.c - $PROJ_DIR$\..\obj\led.pbi - $PROJ_DIR$\..\obj\time.pbi - $PROJ_DIR$\..\obj\main.pbi - $PROJ_DIR$\..\obj\irq.pbi - $PROJ_DIR$\..\obj\vectors.pbi - $PROJ_DIR$\..\obj\boot.pbi - $PROJ_DIR$\..\obj\buttons.pbi - $PROJ_DIR$\..\obj\cfal96x64x16.pbi - $PROJ_DIR$\..\obj\clocksetwidget.pbi - $PROJ_DIR$\..\obj\fat_usbmsc.pbi - $PROJ_DIR$\..\boot.c - $PROJ_DIR$\..\boot.h - $PROJ_DIR$\..\cstart.s - $PROJ_DIR$\..\header.h - $PROJ_DIR$\..\irq.c - $PROJ_DIR$\..\irq.h - $PROJ_DIR$\..\led.c - $PROJ_DIR$\..\led.h - $PROJ_DIR$\..\obj\fat_usbmsc.o - $PROJ_DIR$\..\obj\flashstore.o - $PROJ_DIR$\..\obj\startup_ewarm.pbi - $PROJ_DIR$\..\obj\slidemenuwidget.pbi - $PROJ_DIR$\..\obj\uartstdio.pbi - $PROJ_DIR$\..\obj\usbserial.pbi - $PROJ_DIR$\..\obj\usb_serial_structs.pbi - $PROJ_DIR$\..\obj\usbstick.pbi - $TOOLKIT_DIR$\inc\c\yvals.h - $TOOLKIT_DIR$\inc\c\ycheck.h - $TOOLKIT_DIR$\inc\c\DLib_Defaults.h - $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h - $TOOLKIT_DIR$\inc\c\DLib_Product.h - $TOOLKIT_DIR$\inc\c\xencoding_limits.h - $TOOLKIT_DIR$\inc\c\DLib_Threads.h - $PROJ_DIR$\..\lib\driverlib\usb.h - $PROJ_DIR$\..\lib\driverlib\flash.h - $PROJ_DIR$\..\lib\driverlib\cpu.h - $PROJ_DIR$\..\obj\stripchartmanager.o - $PROJ_DIR$\..\obj\ff.o - $PROJ_DIR$\..\obj\usb_serial_structs.o - $PROJ_DIR$\..\obj\startup_ewarm.o - $PROJ_DIR$\..\lib\driverlib\usb.c - $PROJ_DIR$\..\obj\uartstdio.o - $PROJ_DIR$\..\obj\stripchartwidget.o - $PROJ_DIR$\..\obj\usbserial.o + $PROJ_DIR$\..\lib\driverlib\rom_map.h + $PROJ_DIR$\..\lib\driverlib\rtos_bindings.h + $PROJ_DIR$\..\lib\driverlib\ssi.c + $PROJ_DIR$\..\lib\driverlib\ssi.h + $PROJ_DIR$\..\lib\driverlib\sw_crc.c + $PROJ_DIR$\..\lib\driverlib\sw_crc.h + $PROJ_DIR$\..\lib\driverlib\sysctl.c + $PROJ_DIR$\..\lib\driverlib\sysctl.h + $PROJ_DIR$\..\lib\driverlib\sysexc.c + $PROJ_DIR$\..\lib\driverlib\systick.c + $PROJ_DIR$\..\lib\driverlib\systick.h + $PROJ_DIR$\..\lib\driverlib\timerlib.c + $PROJ_DIR$\..\lib\driverlib\timerlib.h + $PROJ_DIR$\..\lib\driverlib\uartlib.c + $PROJ_DIR$\..\lib\driverlib\uartlib.h + $PROJ_DIR$\..\lib\driverlib\udma.c + $PROJ_DIR$\..\lib\driverlib\udma.h + $PROJ_DIR$\..\lib\driverlib\usbdrv.c + $PROJ_DIR$\..\lib\driverlib\usbdrv.h + $PROJ_DIR$\..\lib\driverlib\watchdog.c + $PROJ_DIR$\..\lib\driverlib\watchdog.h + $PROJ_DIR$\..\lib\fatfs\ffconf.h + $PROJ_DIR$\..\lib\fatfs\mmc.c + $PROJ_DIR$\..\lib\inc\hw_adc.h + $PROJ_DIR$\..\lib\inc\hw_can.h + $PROJ_DIR$\..\lib\inc\hw_comp.h + $PROJ_DIR$\..\lib\inc\hw_eeprom.h + $PROJ_DIR$\..\lib\inc\hw_flash.h + $PROJ_DIR$\..\lib\inc\hw_gpio.h + $PROJ_DIR$\..\lib\inc\hw_hibernate.h + $PROJ_DIR$\..\lib\inc\hw_i2c.h + $PROJ_DIR$\..\lib\inc\hw_ints.h + $PROJ_DIR$\..\lib\inc\hw_memmap.h + $PROJ_DIR$\..\lib\inc\hw_nvic.h + $PROJ_DIR$\..\lib\inc\hw_pwm.h + $PROJ_DIR$\..\lib\inc\hw_qei.h + $PROJ_DIR$\..\lib\inc\hw_ssi.h + $PROJ_DIR$\..\lib\inc\hw_sysctl.h + $PROJ_DIR$\..\lib\inc\hw_sysexc.h + $PROJ_DIR$\..\lib\inc\hw_timer.h + $PROJ_DIR$\..\lib\inc\hw_types.h + $PROJ_DIR$\..\lib\inc\hw_uart.h + $PROJ_DIR$\..\lib\inc\hw_udma.h + $PROJ_DIR$\..\lib\inc\hw_usb.h + $PROJ_DIR$\..\lib\inc\hw_watchdog.h + $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.c + $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.h + $PROJ_DIR$\..\lib\usblib\device\usbdaudio.c + $PROJ_DIR$\..\lib\usblib\device\usbdaudio.h + $PROJ_DIR$\..\lib\usblib\device\usbdbulk.c + $PROJ_DIR$\..\lib\usblib\device\usbdbulk.h + $PROJ_DIR$\..\lib\usblib\device\usbdcdc.c + $PROJ_DIR$\..\lib\usblib\device\usbdcdc.h + $PROJ_DIR$\..\lib\usblib\device\usbdcdesc.c + + [ROOT_NODE] + + + ILINK + 327 125 + + + $PROJ_DIR$\..\lib\driverlib\adc.c ICCARM - 383 + 214 BICOMP - 275 + 368 ICCARM - 252 251 417 416 418 419 420 421 422 53 61 62 70 67 3 8 22 + 345 344 277 276 278 279 280 281 282 403 411 412 420 417 3 8 22 BICOMP - 252 251 417 416 418 419 420 421 422 53 61 62 70 67 3 8 22 + 345 344 277 276 278 279 280 281 282 403 411 412 420 417 3 8 22 @@ -469,430 +478,7 @@ ICCARM - 253 - - - BICOMP - 276 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 54 61 63 62 67 70 1 8 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 54 61 63 62 67 70 1 8 22 - - - - - $PROJ_DIR$\..\lib\driverlib\comp.c - - - ICCARM - 254 - - - BICOMP - 352 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 55 61 62 70 5 8 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 55 61 62 70 5 8 22 - - - - - $PROJ_DIR$\..\lib\driverlib\cpulib.c - - - ICCARM - 366 - - - BICOMP - 367 - - - - - ICCARM - 251 417 416 418 419 420 421 422 7 - - - BICOMP - 251 417 416 418 419 420 421 422 7 - - - - - $PROJ_DIR$\..\lib\driverlib\eeprom.c - - - ICCARM - 256 - - - BICOMP - 354 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 56 57 61 67 70 8 12 22 37 10 - - - BICOMP - 252 251 417 416 418 419 420 421 422 56 57 61 67 70 8 12 22 37 10 - - - - - $PROJ_DIR$\..\lib\driverlib\flashlib.c - - - ICCARM - 370 - - - BICOMP - 371 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 57 61 67 70 8 12 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 57 61 67 70 8 12 22 - - - - - $PROJ_DIR$\..\lib\driverlib\fpu.c - - - ICCARM - 174 - - - BICOMP - 356 - - - - - ICCARM - 251 417 416 418 419 420 421 422 63 70 14 - - - BICOMP - 251 417 416 418 419 420 421 422 63 70 14 - - - - - $PROJ_DIR$\..\lib\driverlib\gpio.c - - - ICCARM - 258 - - - BICOMP - 357 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 58 61 62 67 70 8 16 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 58 61 62 67 70 8 16 22 - - - - - $PROJ_DIR$\..\lib\driverlib\hibernate.c - - - ICCARM - 259 - - - BICOMP - 358 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 209 210 59 61 67 70 8 18 22 37 - - - BICOMP - 252 251 417 416 418 419 420 421 422 209 210 59 61 67 70 8 18 22 37 - - - - - $PROJ_DIR$\..\lib\driverlib\i2c.c - - - ICCARM - 260 - - - BICOMP - 304 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 60 61 62 67 70 8 20 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 60 61 62 67 70 8 20 22 - - - - - $PROJ_DIR$\..\lib\driverlib\interrupt.c - - - ICCARM - 261 - - - BICOMP - 305 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 63 70 7 8 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 63 70 7 8 22 - - - - - $PROJ_DIR$\..\lib\driverlib\mpu.c - - - ICCARM - 262 - - - BICOMP - 306 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 63 70 8 22 24 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 63 70 8 22 24 - - - - - $PROJ_DIR$\..\lib\driverlib\pwm.c - - - ICCARM - 263 - - - BICOMP - 307 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 64 67 70 8 22 26 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 64 67 70 8 22 26 - - - - - $PROJ_DIR$\..\lib\driverlib\qei.c - - - ICCARM - 264 - - - BICOMP - 308 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 65 70 67 8 22 28 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 65 70 67 8 22 28 - - - - - [ROOT_NODE] - - - ILINK - 234 173 - - - - - $PROJ_DIR$\..\lib\driverlib\ssi.c - - - ICCARM - 265 - - - BICOMP - 313 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 66 67 70 8 22 33 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 66 67 70 8 22 33 - - - - - $PROJ_DIR$\..\lib\driverlib\sw_crc.c - - - ICCARM - 266 - - - BICOMP - 314 - - - - - ICCARM - 251 417 416 418 419 420 421 422 35 - - - BICOMP - 251 417 416 418 419 420 421 422 35 - - - - - $PROJ_DIR$\..\lib\driverlib\sysctl.c - - - ICCARM - 267 - - - BICOMP - 315 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 63 67 70 57 7 8 22 37 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 63 67 70 57 7 8 22 37 - - - - - $PROJ_DIR$\..\lib\driverlib\sysexc.c - - - ICCARM - 268 - - - BICOMP - 244 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 67 68 70 8 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 67 68 70 8 22 - - - - - $PROJ_DIR$\..\lib\driverlib\systick.c - - - ICCARM - 269 - - - BICOMP - 245 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 63 70 8 22 40 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 63 70 8 22 40 - - - - - $PROJ_DIR$\..\lib\driverlib\timerlib.c - - - ICCARM - 368 + 346 BICOMP @@ -902,435 +488,44 @@ ICCARM - 252 251 417 416 418 419 420 421 422 61 62 69 70 8 22 42 + 345 344 277 276 278 279 280 281 282 404 411 413 412 417 420 1 8 22 BICOMP - 252 251 417 416 418 419 420 421 422 61 62 69 70 8 22 42 + 345 344 277 276 278 279 280 281 282 404 411 413 412 417 420 1 8 22 - $PROJ_DIR$\..\lib\driverlib\uartlib.c + $PROJ_DIR$\..\lib\driverlib\comp.c ICCARM - 372 + 347 BICOMP - 373 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 67 70 71 8 22 44 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 67 70 71 8 22 44 - - - - - $PROJ_DIR$\..\lib\driverlib\udma.c - - - ICCARM - 272 - - - BICOMP - 248 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 67 70 72 8 22 46 - - - BICOMP - 252 251 417 416 418 419 420 421 422 67 70 72 8 22 46 - - - - - $PROJ_DIR$\..\lib\driverlib\usbdrv.c - - - ICCARM - 320 - - - BICOMP - 321 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 37 46 48 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 37 46 48 - - - - - $PROJ_DIR$\..\lib\driverlib\watchdog.c - - - ICCARM - 274 - - - BICOMP - 250 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 70 74 8 22 50 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 70 74 8 22 50 - - - - - $PROJ_DIR$\..\lib\fatfs\mmc.c - - - ICCARM - 379 - - - BICOMP - 378 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 16 33 37 153 156 162 148 158 133 169 140 166 145 143 147 160 168 155 51 164 171 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 16 33 37 153 156 162 148 158 133 169 140 166 145 143 147 160 168 155 51 164 171 - - - - - $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.c - - - ICCARM - 333 - - - BICOMP - 334 - - - - - ICCARM - 251 417 416 418 419 420 421 422 252 70 48 127 118 90 91 80 76 - - - BICOMP - 251 417 416 418 419 420 421 422 252 70 48 127 118 90 91 80 76 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdaudio.c - - - ICCARM - 335 - - - BICOMP - 186 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 48 127 128 119 90 91 78 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 48 127 128 119 90 91 78 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdbulk.c - - - ICCARM - 309 - - - BICOMP - 187 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 48 127 128 90 91 80 85 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 48 127 128 90 91 80 85 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdcdc.c - - - ICCARM - 336 - - - BICOMP - 188 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 48 127 121 128 90 91 85 82 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 48 127 121 128 90 91 85 82 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdcdesc.c - - - ICCARM - 180 - - - BICOMP - 189 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 8 48 127 128 90 91 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 8 48 127 128 90 91 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdcomp.c - - - ICCARM - 178 - - - BICOMP - 190 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 8 37 29 30 48 127 128 118 121 90 91 82 85 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 8 37 29 30 48 127 128 118 121 90 91 82 85 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdconfig.c - - - ICCARM - 138 - - - BICOMP - 191 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 8 48 127 128 90 91 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 8 48 127 128 90 91 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbddfu-rt.c - - - ICCARM - 177 - - - BICOMP - 192 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 63 8 48 37 40 22 29 30 127 128 123 118 90 91 88 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 63 8 48 37 40 22 29 30 127 128 123 118 90 91 88 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdenum.c - - - ICCARM - 176 - - - BICOMP - 193 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 70 67 8 22 29 30 37 48 31 127 128 90 91 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 70 67 8 22 29 30 37 48 31 127 128 90 91 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdhandler.c - - - ICCARM - 179 - - - BICOMP - 194 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 29 30 48 127 128 90 91 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 29 30 48 127 128 90 91 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdhid.c - - - ICCARM - 182 - - - BICOMP - 195 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 8 48 29 30 127 128 125 90 91 94 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 8 48 29 30 127 128 125 90 91 94 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdhidkeyb.c - - - ICCARM 183 - - BICOMP - 196 - ICCARM - 252 251 417 416 418 419 420 421 422 70 8 48 127 128 90 91 125 94 96 + 345 344 277 276 278 279 280 281 282 405 411 412 420 5 8 22 BICOMP - 252 251 417 416 418 419 420 421 422 70 8 48 127 128 90 91 125 94 96 + 345 344 277 276 278 279 280 281 282 405 411 412 420 5 8 22 - $PROJ_DIR$\..\lib\usblib\device\usbdhidmouse.c + $PROJ_DIR$\..\lib\driverlib\cpulib.c ICCARM - 184 - - - BICOMP 197 - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 8 48 127 128 90 91 125 94 98 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 8 48 127 128 90 91 125 94 98 - - - - - $PROJ_DIR$\..\lib\usblib\device\usbdmsc.c - - - ICCARM - 185 - BICOMP 198 @@ -1339,11 +534,623 @@ ICCARM - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 37 48 127 128 130 90 91 100 + 344 277 276 278 279 280 281 282 7 BICOMP - 252 251 417 416 418 419 420 421 422 62 70 8 29 30 37 48 127 128 130 90 91 100 + 344 277 276 278 279 280 281 282 7 + + + + + $PROJ_DIR$\..\lib\driverlib\eeprom.c + + + ICCARM + 349 + + + BICOMP + 185 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 406 407 411 417 420 8 12 22 387 10 + + + BICOMP + 345 344 277 276 278 279 280 281 282 406 407 411 417 420 8 12 22 387 10 + + + + + $PROJ_DIR$\..\lib\driverlib\flashlib.c + + + ICCARM + 201 + + + BICOMP + 202 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 407 411 417 420 8 12 22 + + + + + $PROJ_DIR$\..\lib\driverlib\fpu.c + + + ICCARM + 126 + + + BICOMP + 187 + + + + + ICCARM + 344 277 276 278 279 280 281 282 413 420 14 + + + BICOMP + 344 277 276 278 279 280 281 282 413 420 14 + + + + + $PROJ_DIR$\..\lib\driverlib\gpio.c + + + ICCARM + 351 + + + BICOMP + 188 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 408 411 412 417 420 8 16 22 + + + BICOMP + 345 344 277 276 278 279 280 281 282 408 411 412 417 420 8 16 22 + + + + + $PROJ_DIR$\..\lib\driverlib\hibernate.c + + + ICCARM + 352 + + + BICOMP + 189 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 302 303 409 411 417 420 8 18 22 387 + + + BICOMP + 345 344 277 276 278 279 280 281 282 302 303 409 411 417 420 8 18 22 387 + + + + + $PROJ_DIR$\..\lib\driverlib\i2c.c + + + ICCARM + 353 + + + BICOMP + 46 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 410 411 412 417 420 8 20 22 + + + BICOMP + 345 344 277 276 278 279 280 281 282 410 411 412 417 420 8 20 22 + + + + + $PROJ_DIR$\..\lib\driverlib\interrupt.c + + + ICCARM + 354 + + + BICOMP + 48 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 413 420 7 8 22 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 413 420 7 8 22 + + + + + $PROJ_DIR$\..\lib\driverlib\mpu.c + + + ICCARM + 355 + + + BICOMP + 49 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 413 420 8 22 24 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 413 420 8 22 24 + + + + + $PROJ_DIR$\..\lib\driverlib\pwm.c + + + ICCARM + 356 + + + BICOMP + 50 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 414 417 420 8 22 26 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 414 417 420 8 22 26 + + + + + $PROJ_DIR$\..\lib\driverlib\qei.c + + + ICCARM + 357 + + + BICOMP + 51 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 415 420 417 8 22 28 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 415 420 417 8 22 28 + + + + + $PROJ_DIR$\flashstore.c + + + ICCARM + 269 + + + BICOMP + 333 + + + + + $PROJ_DIR$\qs-logger.c + + + ICCARM + 236 + + + BICOMP + 336 + + + + + $PROJ_DIR$\..\drivers\slidemenuwidget.c + + + ICCARM + 237 + + + BICOMP + 271 + + + + + $PROJ_DIR$\startup_ewarm.c + + + ICCARM + 289 + + + BICOMP + 270 + + + + + $PROJ_DIR$\stripchartmanager.c + + + ICCARM + 286 + + + BICOMP + 328 + + + + + $PROJ_DIR$\..\drivers\stripchartwidget.c + + + ICCARM + 292 + + + BICOMP + 234 + + + + + $PROJ_DIR$\..\..\..\..\utils\uartstdio.c + + + ICCARM + 291 + + + BICOMP + 272 + + + + + $PROJ_DIR$\usb_serial_structs.c + + + ICCARM + 288 + + + BICOMP + 274 + + + + + $PROJ_DIR$\usbserial.c + + + ICCARM + 293 + + + BICOMP + 273 + + + + + $PROJ_DIR$\usbstick.c + + + ICCARM + 329 + + + BICOMP + 275 + + + + + $PROJ_DIR$\..\..\..\..\utils\ustdlib.c + + + ICCARM + 330 + + + BICOMP + 326 + + + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c + + + ICCARM + 268 + + + BICOMP + 230 + + + + + $PROJ_DIR$\..\lib\driverlib\usblib.c + + + ICCARM + 181 + + + BICOMP + 182 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 387 396 54 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 387 396 54 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdcomp.c + + + ICCARM + 130 + + + BICOMP + 142 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 8 387 29 380 398 101 102 92 95 64 65 432 59 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 8 387 29 380 398 101 102 92 95 64 65 432 59 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdconfig.c + + + ICCARM + 115 + + + BICOMP + 143 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 8 398 101 102 64 65 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 8 398 101 102 64 65 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbddfu-rt.c + + + ICCARM + 129 + + + BICOMP + 144 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 413 8 398 387 390 22 29 380 101 102 97 92 64 65 62 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 413 8 398 387 390 22 29 380 101 102 97 92 64 65 62 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdenum.c + + + ICCARM + 128 + + + BICOMP + 145 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 420 417 8 22 29 380 387 398 381 101 102 64 65 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 420 417 8 22 29 380 387 398 381 101 102 64 65 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdhandler.c + + + ICCARM + 131 + + + BICOMP + 146 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 29 380 398 101 102 64 65 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 29 380 398 101 102 64 65 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdhid.c + + + ICCARM + 134 + + + BICOMP + 147 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 8 398 29 380 101 102 99 64 65 68 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 8 398 29 380 101 102 99 64 65 68 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdhidkeyb.c + + + ICCARM + 135 + + + BICOMP + 148 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 420 8 398 101 102 64 65 99 68 70 + + + BICOMP + 345 344 277 276 278 279 280 281 282 420 8 398 101 102 64 65 99 68 70 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdhidmouse.c + + + ICCARM + 136 + + + BICOMP + 149 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 420 8 398 101 102 64 65 99 68 72 + + + BICOMP + 345 344 277 276 278 279 280 281 282 420 8 398 101 102 64 65 99 68 72 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdmsc.c + + + ICCARM + 137 + + + BICOMP + 150 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 387 398 101 102 104 64 65 74 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 387 398 101 102 104 64 65 74 @@ -1352,21 +1159,21 @@ ICCARM - 199 + 151 BICOMP - 325 + 243 ICCARM - 252 251 417 416 418 419 420 421 422 70 48 127 128 119 113 115 102 + 345 344 277 276 278 279 280 281 282 420 398 101 102 93 87 89 76 BICOMP - 252 251 417 416 418 419 420 421 422 70 48 127 128 119 113 115 102 + 345 344 277 276 278 279 280 281 282 420 398 101 102 93 87 89 76 @@ -1375,21 +1182,21 @@ ICCARM - 200 + 152 BICOMP - 326 + 244 ICCARM - 252 251 417 416 418 419 420 421 422 70 48 127 128 125 113 115 104 + 345 344 277 276 278 279 280 281 282 420 398 101 102 99 87 89 78 BICOMP - 252 251 417 416 418 419 420 421 422 70 48 127 128 125 113 115 104 + 345 344 277 276 278 279 280 281 282 420 398 101 102 99 87 89 78 @@ -1398,21 +1205,21 @@ ICCARM - 202 + 295 BICOMP - 327 + 245 ICCARM - 252 251 417 416 418 419 420 421 422 70 127 113 125 104 106 + 345 344 277 276 278 279 280 281 282 420 101 87 99 78 80 BICOMP - 252 251 417 416 418 419 420 421 422 70 127 113 125 104 106 + 345 344 277 276 278 279 280 281 282 420 101 87 99 78 80 @@ -1421,453 +1228,7 @@ ICCARM - 201 - - - BICOMP - 328 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 127 113 125 104 108 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 127 113 125 104 108 - - - - - $PROJ_DIR$\..\lib\usblib\host\usbhhub.c - - - ICCARM - 203 - - - BICOMP - 329 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 61 67 48 22 30 31 127 113 115 110 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 61 67 48 22 30 31 127 113 115 110 - - - - - $PROJ_DIR$\..\lib\usblib\host\usbhmsc.c - - - ICCARM - 323 - - - BICOMP - 330 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 48 127 128 130 113 115 112 117 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 48 127 128 130 113 115 112 117 - - - - - $PROJ_DIR$\..\lib\usblib\host\usbhostenum.c - - - ICCARM - 322 - - - BICOMP - 331 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 67 70 29 30 8 22 37 48 31 127 128 113 115 110 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 67 70 29 30 8 22 37 48 31 127 128 113 115 110 - - - - - $PROJ_DIR$\..\lib\usblib\host\usbhscsi.c - - - ICCARM - 324 - - - BICOMP - 332 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 127 130 113 112 117 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 127 130 113 112 117 - - - - - $PROJ_DIR$\..\lib\usblib\usbbuffer.c - - - ICCARM - 312 - - - BICOMP - 343 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 8 127 128 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 8 127 128 - - - - - $PROJ_DIR$\..\lib\usblib\usbdesc.c - - - ICCARM - 337 - - - BICOMP - 344 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 127 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 127 - - - - - $PROJ_DIR$\..\lib\usblib\usbdma.c - - - ICCARM - 338 - - - BICOMP - 345 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 62 70 61 67 72 8 22 31 48 29 30 46 127 128 - - - BICOMP - 252 251 417 416 418 419 420 421 422 62 70 61 67 72 8 22 31 48 29 30 46 127 128 - - - - - $PROJ_DIR$\..\lib\usblib\usbkeyboardmap.c - - - ICCARM - 339 - - - BICOMP - 346 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 127 125 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 127 125 - - - - - $PROJ_DIR$\..\lib\usblib\usbmode.c - - - ICCARM - 340 - - - BICOMP - 347 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 29 30 37 48 31 127 128 90 91 113 115 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 29 30 37 48 31 127 128 90 91 113 115 - - - - - $PROJ_DIR$\..\lib\usblib\usbringbuf.c - - - ICCARM - 341 - - - BICOMP - 348 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 8 22 127 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 8 22 127 - - - - - $PROJ_DIR$\..\lib\usblib\usbtick.c - - - ICCARM - 342 - - - BICOMP - 349 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 70 8 127 128 - - - BICOMP - 252 251 417 416 418 419 420 421 422 70 8 127 128 - - - - - $PROJ_DIR$\..\hooks.c - - - ICCARM - 211 - - - BICOMP - 212 - - - - - ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 62 70 44 37 16 - - - BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 62 70 44 37 16 - - - - - $PROJ_DIR$\..\main.c - - - ICCARM - 208 - - - BICOMP - 392 - - - - - ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 61 62 63 67 70 37 16 44 - - - BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 61 62 63 67 70 37 16 44 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\vectors.c - - - ICCARM - 384 - - - BICOMP - 394 - - - - - ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\cstart.s - - - AARM - 380 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\cpu.c - - - ICCARM - 255 - - - BICOMP - 353 - - - - - ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\flash.c - - - ICCARM - 257 - - - BICOMP - 355 - - - - - ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 62 70 12 - - - BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 62 70 12 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c - - - ICCARM - 376 - - - BICOMP - 375 - - - - - ICCARM - 155 156 51 374 - - - BICOMP - 155 156 51 374 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\nvm.c - - - ICCARM - 365 - - - BICOMP - 228 - - - - - ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\timer.c - - - ICCARM - 270 + 294 BICOMP @@ -1877,20 +1238,20 @@ ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 420 101 87 99 78 82 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 420 101 87 99 78 82 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\uart.c + $PROJ_DIR$\..\lib\usblib\host\usbhhub.c ICCARM - 271 + 296 BICOMP @@ -1900,20 +1261,43 @@ ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 62 70 37 44 + 345 344 277 276 278 279 280 281 282 420 411 417 398 22 380 381 101 87 89 84 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 252 251 417 416 418 419 420 421 422 62 70 37 44 + 345 344 277 276 278 279 280 281 282 420 411 417 398 22 380 381 101 87 89 84 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\usb.c + $PROJ_DIR$\..\lib\usblib\host\usbhmsc.c ICCARM - 273 + 241 + + + BICOMP + 248 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 420 398 101 102 104 87 89 86 91 + + + BICOMP + 345 344 277 276 278 279 280 281 282 420 398 101 102 104 87 89 86 91 + + + + + $PROJ_DIR$\..\lib\usblib\host\usbhostenum.c + + + ICCARM + 240 BICOMP @@ -1923,158 +1307,227 @@ ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 411 412 417 420 29 380 8 22 387 398 381 101 102 87 89 84 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 411 412 417 420 29 380 8 22 387 398 381 101 102 87 89 84 - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + $PROJ_DIR$\..\lib\usblib\host\usbhscsi.c ICCARM - 427 + 242 BICOMP - 239 + 250 ICCARM - 155 156 51 153 377 417 416 418 419 420 421 422 + 345 344 277 276 278 279 280 281 282 420 101 104 87 86 91 BICOMP - 155 156 51 153 377 417 416 418 419 420 421 422 + 345 344 277 276 278 279 280 281 282 420 101 104 87 86 91 - $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\lib\usblib\usbbuffer.c ICCARM - 213 + 55 BICOMP - 219 + 261 ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 420 8 101 102 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 420 8 101 102 - $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\lib\usblib\usbdesc.c ICCARM - 214 + 255 BICOMP - 220 + 175 ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 420 101 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 420 101 - $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\lib\usblib\usbdma.c ICCARM - 205 + 256 BICOMP - 395 + 176 ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 412 420 411 417 422 8 22 381 398 29 380 396 101 102 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 412 420 411 417 422 8 22 381 398 29 380 396 101 102 - $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\lib\usblib\usbkeyboardmap.c ICCARM - 215 + 257 BICOMP - 221 + 177 ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 150 + 345 344 277 276 278 279 280 281 282 420 101 99 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 150 + 345 344 277 276 278 279 280 281 282 420 101 99 - $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\lib\usblib\usbmode.c ICCARM - 216 + 258 BICOMP - 222 + 178 ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 29 380 387 398 381 101 102 64 65 87 89 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 29 380 387 398 381 101 102 64 65 87 89 - $PROJ_DIR$\..\..\..\..\Source\file.c + $PROJ_DIR$\..\lib\usblib\usbringbuf.c ICCARM - 217 + 259 + + + BICOMP + 179 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 420 8 22 101 + + + BICOMP + 345 344 277 276 278 279 280 281 282 420 8 22 101 + + + + + $PROJ_DIR$\..\lib\usblib\usbtick.c + + + ICCARM + 260 + + + BICOMP + 180 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 420 8 101 102 + + + BICOMP + 345 344 277 276 278 279 280 281 282 420 8 101 102 + + + + + $PROJ_DIR$\..\hooks.c + + + ICCARM + 304 + + + BICOMP + 305 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 412 420 394 387 16 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 412 420 394 387 16 + + + + + $PROJ_DIR$\..\main.c + + + ICCARM + 301 BICOMP @@ -2084,11 +1537,365 @@ ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 226 417 416 418 419 420 421 422 210 225 227 229 359 360 361 362 363 364 + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 411 412 413 417 420 387 16 394 BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 226 417 416 418 419 420 421 422 210 225 227 229 359 360 361 362 363 364 + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 411 412 413 417 420 387 16 394 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\vectors.c + + + ICCARM + 215 + + + BICOMP + 225 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\IAR\cstart.s + + + AARM + 211 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\cpu.c + + + ICCARM + 348 + + + BICOMP + 184 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\flash.c + + + ICCARM + 350 + + + BICOMP + 186 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 412 420 12 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 412 420 12 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\nvm.c + + + ICCARM + 196 + + + BICOMP + 321 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\timer.c + + + ICCARM + 363 + + + BICOMP + 339 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\uart.c + + + ICCARM + 364 + + + BICOMP + 340 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 412 420 387 394 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 345 344 277 276 278 279 280 281 282 412 420 387 394 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + + + ICCARM + 207 + + + BICOMP + 206 + + + + + ICCARM + 159 160 401 205 + + + BICOMP + 159 160 401 205 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_TM4C\usb.c + + + ICCARM + 366 + + + BICOMP + 342 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + + + ICCARM + 287 + + + BICOMP + 332 + + + + + ICCARM + 159 160 401 157 208 277 276 278 279 280 281 282 + + + BICOMP + 159 160 401 157 208 277 276 278 279 280 281 282 + + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + ICCARM + 306 + + + BICOMP + 312 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 307 + + + BICOMP + 313 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + ICCARM + 298 + + + BICOMP + 226 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + ICCARM + 308 + + + BICOMP + 314 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 153 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 153 + + + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + ICCARM + 309 + + + BICOMP + 315 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + ICCARM + 310 + + + BICOMP + 316 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 319 277 276 278 279 280 281 282 303 318 320 322 190 191 192 193 194 195 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 319 277 276 278 279 280 281 282 303 318 320 322 190 191 192 193 194 195 @@ -2097,7 +1904,150 @@ ICCARM - 218 + 311 + + + BICOMP + 317 + + + + + ICCARM + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + BICOMP + 166 122 162 107 173 114 170 119 117 121 164 172 159 160 401 168 112 + + + + + $PROJ_DIR$\..\lib\driverlib\timer.c + + + ICCARM + 363 + + + BICOMP + 339 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 419 420 8 22 212 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 419 420 8 22 212 + + + + + $PROJ_DIR$\..\lib\driverlib\uart.c + + + ICCARM + 364 + + + BICOMP + 340 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 417 420 421 8 22 217 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 417 420 421 8 22 217 + + + + + $PROJ_DIR$\..\lib\driverlib\cpu.c + + + ICCARM + 348 + + + BICOMP + 184 + + + + + ICCARM + 344 277 276 278 279 280 281 282 285 + + + BICOMP + 344 277 276 278 279 280 281 282 285 + + + + + $PROJ_DIR$\..\lib\driverlib\flash.c + + + ICCARM + 350 + + + BICOMP + 186 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 407 411 417 420 8 284 22 + + + BICOMP + 345 344 277 276 278 279 280 281 282 407 411 417 420 8 284 22 + + + + + $PROJ_DIR$\..\boot.c + + + ICCARM + 298 + + + BICOMP + 226 + + + + + ICCARM + 263 107 232 265 267 371 345 344 277 276 278 279 280 281 282 411 412 413 417 420 387 16 217 14 22 390 + + + + + $PROJ_DIR$\..\cstart.s + + + AARM + 211 + + + + + $PROJ_DIR$\..\irq.c + + + ICCARM + 299 BICOMP @@ -2107,477 +2057,7 @@ ICCARM - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - BICOMP - 162 148 158 133 169 140 166 145 143 147 160 168 155 156 51 164 171 - - - - - $PROJ_DIR$\..\bin\openblt_dk_tm4c123g.out - - - ILINK - 173 - - - OBJCOPY - 232 - - - - - ILINK - 386 383 213 214 205 253 215 254 216 255 366 380 256 427 217 257 370 174 258 259 211 260 261 208 379 262 365 263 264 265 266 267 268 269 270 368 271 372 272 376 273 333 312 335 309 336 180 178 138 177 176 337 179 182 183 184 338 185 320 199 200 202 201 203 323 322 324 339 340 341 342 384 274 218 172 175 181 204 - - - - - $PROJ_DIR$\..\time.c - - - ICCARM - 230 - - - BICOMP - 391 - - - - - ICCARM - 403 133 401 405 407 278 252 251 417 416 418 419 420 421 422 61 62 63 67 70 37 16 387 14 22 40 - - - - - $PROJ_DIR$\..\vectors.c - - - ICCARM - 384 - - - BICOMP - 394 - - - - - ICCARM - 403 133 401 405 407 278 252 251 417 416 418 419 420 421 422 61 62 63 67 70 37 16 387 14 22 40 - - - - - $PROJ_DIR$\acquire.c - - - ICCARM - 301 - - - BICOMP - 238 - - - - - $PROJ_DIR$\..\drivers\buttons.c - - - ICCARM - 299 - - - BICOMP - 396 - - - - - $PROJ_DIR$\..\drivers\cfal96x64x16.c - - - ICCARM - 302 - - - BICOMP - 397 - - - - - $PROJ_DIR$\clocksetwidget.c - - - ICCARM - 300 - - - BICOMP - 398 - - - - - $PROJ_DIR$\images.c - - - ICCARM - 298 - - - BICOMP - 241 - - - - - $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c - - - ICCARM - 427 - - - BICOMP - 239 - - - - - $PROJ_DIR$\menus.c - - - ICCARM - 317 - - - BICOMP - 242 - - - - - $PROJ_DIR$\flashstore.c - - - ICCARM - 409 - - - BICOMP - 240 - - - - - $PROJ_DIR$\qs-logger.c - - - ICCARM - 318 - - - BICOMP - 243 - - - - - $PROJ_DIR$\..\drivers\slidemenuwidget.c - - - ICCARM - 319 - - - BICOMP - 411 - - - - - $PROJ_DIR$\startup_ewarm.c - - - ICCARM - 429 - - - BICOMP - 410 - - - - - $PROJ_DIR$\stripchartmanager.c - - - ICCARM - 426 - - - BICOMP - 235 - - - - - $PROJ_DIR$\..\drivers\stripchartwidget.c - - - ICCARM - 432 - - - BICOMP - 316 - - - - - $PROJ_DIR$\..\..\..\..\utils\uartstdio.c - - - ICCARM - 431 - - - BICOMP - 412 - - - - - $PROJ_DIR$\usb_serial_structs.c - - - ICCARM - 428 - - - BICOMP - 414 - - - - - $PROJ_DIR$\usbserial.c - - - ICCARM - 433 - - - BICOMP - 413 - - - - - $PROJ_DIR$\usbstick.c - - - ICCARM - 236 - - - BICOMP - 415 - - - - - $PROJ_DIR$\..\..\..\..\utils\ustdlib.c - - - ICCARM - 237 - - - BICOMP - 233 - - - - - $PROJ_DIR$\..\..\..\..\third_party\fatfs\port\fat_usbmsc.c - - - ICCARM - 408 - - - BICOMP - 399 - - - - - $PROJ_DIR$\..\lib\driverlib\usblib.c - - - ICCARM - 350 - - - BICOMP - 351 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 37 46 311 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 37 46 311 - - - - - $PROJ_DIR$\..\lib\driverlib\timer.c - - - ICCARM - 270 - - - BICOMP - 246 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 69 70 8 22 381 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 69 70 8 22 381 - - - - - $PROJ_DIR$\..\lib\driverlib\uart.c - - - ICCARM - 271 - - - BICOMP - 247 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 61 62 67 70 71 8 22 387 - - - BICOMP - 252 251 417 416 418 419 420 421 422 61 62 67 70 71 8 22 387 - - - - - $PROJ_DIR$\..\lib\driverlib\cpu.c - - - ICCARM - 255 - - - BICOMP - 353 - - - - - ICCARM - 251 417 416 418 419 420 421 422 425 - - - BICOMP - 251 417 416 418 419 420 421 422 425 - - - - - $PROJ_DIR$\..\lib\driverlib\flash.c - - - ICCARM - 257 - - - BICOMP - 355 - - - - - ICCARM - 252 251 417 416 418 419 420 421 422 57 61 67 70 8 424 22 - - - BICOMP - 252 251 417 416 418 419 420 421 422 57 61 67 70 8 424 22 - - - - - $PROJ_DIR$\..\boot.c - - - ICCARM - 205 - - - BICOMP - 395 - - - - - ICCARM - 403 133 401 405 407 278 252 251 417 416 418 419 420 421 422 61 62 63 67 70 37 16 387 14 22 40 - - - - - $PROJ_DIR$\..\cstart.s - - - AARM - 380 - - - - - $PROJ_DIR$\..\irq.c - - - ICCARM - 206 - - - BICOMP - 393 - - - - - ICCARM - 403 133 401 405 407 278 252 251 417 416 418 419 420 421 422 61 62 63 67 70 37 16 387 14 22 40 + 263 107 232 265 267 371 345 344 277 276 278 279 280 281 282 411 412 413 417 420 387 16 217 14 22 390 @@ -2586,17 +2066,17 @@ ICCARM - 207 + 300 BICOMP - 390 + 221 ICCARM - 403 133 401 405 407 278 252 251 417 416 418 419 420 421 422 61 62 63 67 70 37 16 387 14 22 40 + 263 107 232 265 267 371 345 344 277 276 278 279 280 281 282 411 412 413 417 420 387 16 217 14 22 390 @@ -2605,21 +2085,537 @@ ICCARM - 273 + 366 BICOMP - 249 + 342 ICCARM - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 37 46 423 + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 387 396 283 BICOMP - 252 251 417 416 418 419 420 421 422 61 62 70 67 73 8 22 37 46 423 + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 387 396 283 + + + + + $PROJ_DIR$\..\bin\openblt_dk_tm4c123g.out + + + ILINK + 125 + + + OBJCOPY + 325 + + + + + ILINK + 218 214 306 307 298 346 308 347 309 348 197 211 349 287 310 350 201 126 351 352 304 353 354 301 210 355 196 356 357 358 359 360 361 362 363 199 364 203 365 207 366 251 55 253 52 254 132 130 115 129 128 255 131 134 135 136 256 137 238 151 152 295 294 296 241 240 242 257 258 259 260 215 367 311 124 127 133 297 + + + + + $PROJ_DIR$\..\time.c + + + ICCARM + 323 + + + BICOMP + 222 + + + + + ICCARM + 263 107 232 265 267 371 345 344 277 276 278 279 280 281 282 411 412 413 417 420 387 16 217 14 22 390 + + + + + $PROJ_DIR$\..\vectors.c + + + ICCARM + 215 + + + BICOMP + 225 + + + + + ICCARM + 263 107 232 265 267 371 345 344 277 276 278 279 280 281 282 411 412 413 417 420 387 16 217 14 22 390 + + + + + $PROJ_DIR$\acquire.c + + + ICCARM + 44 + + + BICOMP + 331 + + + + + $PROJ_DIR$\..\drivers\buttons.c + + + ICCARM + 42 + + + BICOMP + 227 + + + + + $PROJ_DIR$\..\drivers\cfal96x64x16.c + + + ICCARM + 45 + + + BICOMP + 228 + + + + + $PROJ_DIR$\clocksetwidget.c + + + ICCARM + 43 + + + BICOMP + 229 + + + + + $PROJ_DIR$\images.c + + + ICCARM + 41 + + + BICOMP + 334 + + + + + $PROJ_DIR$\..\..\..\..\third_party\fatfs\src\ff.c + + + ICCARM + 287 + + + BICOMP + 332 + + + + + $PROJ_DIR$\menus.c + + + ICCARM + 235 + + + BICOMP + 335 + + + + + $PROJ_DIR$\..\lib\driverlib\ssi.c + + + ICCARM + 358 + + + BICOMP + 56 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 416 417 420 8 22 383 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 416 417 420 8 22 383 + + + + + $PROJ_DIR$\..\lib\driverlib\sw_crc.c + + + ICCARM + 359 + + + BICOMP + 57 + + + + + ICCARM + 344 277 276 278 279 280 281 282 385 + + + BICOMP + 344 277 276 278 279 280 281 282 385 + + + + + $PROJ_DIR$\..\lib\driverlib\sysctl.c + + + ICCARM + 360 + + + BICOMP + 233 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 413 417 420 407 7 8 22 387 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 413 417 420 407 7 8 22 387 + + + + + $PROJ_DIR$\..\lib\driverlib\sysexc.c + + + ICCARM + 361 + + + BICOMP + 337 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 417 418 420 8 22 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 417 418 420 8 22 + + + + + $PROJ_DIR$\..\lib\driverlib\systick.c + + + ICCARM + 362 + + + BICOMP + 338 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 413 420 8 22 390 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 413 420 8 22 390 + + + + + $PROJ_DIR$\..\lib\driverlib\timerlib.c + + + ICCARM + 199 + + + BICOMP + 200 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 419 420 8 22 392 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 419 420 8 22 392 + + + + + $PROJ_DIR$\..\lib\driverlib\uartlib.c + + + ICCARM + 203 + + + BICOMP + 204 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 417 420 421 8 22 394 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 417 420 421 8 22 394 + + + + + $PROJ_DIR$\..\lib\driverlib\udma.c + + + ICCARM + 365 + + + BICOMP + 341 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 417 420 422 8 22 396 + + + BICOMP + 345 344 277 276 278 279 280 281 282 417 420 422 8 22 396 + + + + + $PROJ_DIR$\..\lib\driverlib\usbdrv.c + + + ICCARM + 238 + + + BICOMP + 239 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 387 396 398 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 420 417 423 8 22 387 396 398 + + + + + $PROJ_DIR$\..\lib\driverlib\watchdog.c + + + ICCARM + 367 + + + BICOMP + 343 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 411 412 420 424 8 22 400 + + + BICOMP + 345 344 277 276 278 279 280 281 282 411 412 420 424 8 22 400 + + + + + $PROJ_DIR$\..\lib\fatfs\mmc.c + + + ICCARM + 210 + + + BICOMP + 209 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 16 383 387 157 160 166 122 162 107 173 114 170 119 117 121 164 172 159 401 168 112 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 16 383 387 157 160 166 122 162 107 173 114 170 119 117 121 164 172 159 401 168 112 + + + + + $PROJ_DIR$\..\lib\usblib\config\usb_bulk_structs.c + + + ICCARM + 251 + + + BICOMP + 252 + + + + + ICCARM + 344 277 276 278 279 280 281 282 345 420 398 101 92 64 65 430 426 + + + BICOMP + 344 277 276 278 279 280 281 282 345 420 398 101 92 64 65 430 426 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdaudio.c + + + ICCARM + 253 + + + BICOMP + 138 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 398 101 102 93 64 65 428 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 398 101 102 93 64 65 428 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdbulk.c + + + ICCARM + 52 + + + BICOMP + 139 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 398 101 102 64 65 430 59 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 398 101 102 64 65 430 59 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdcdc.c + + + ICCARM + 254 + + + BICOMP + 140 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 398 101 95 102 64 65 59 432 + + + BICOMP + 345 344 277 276 278 279 280 281 282 412 420 8 29 380 398 101 95 102 64 65 59 432 + + + + + $PROJ_DIR$\..\lib\usblib\device\usbdcdesc.c + + + ICCARM + 132 + + + BICOMP + 141 + + + + + ICCARM + 345 344 277 276 278 279 280 281 282 420 8 398 101 102 64 65 + + + BICOMP + 345 344 277 276 278 279 280 281 282 420 8 398 101 102 64 65 diff --git a/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/bin/openblt_evbplus_dragon12p.abs b/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/bin/openblt_evbplus_dragon12p.abs index b943860593819b4a778581eb44e2cd8577836457..d4d4e5c389780be5c88d659e2f6d8cf89edc4ea7 100644 GIT binary patch delta 1336 zcmaJ4>I`~zGT(U_Qkk+LZJVlrX3?MyYX{ct~=bDrlp z&pGE#4CYS^=8w*|;7@~b`E_TdTz91aW8cP2&)qq|KfB{H>fddiI~LNU4OKfIq2lHVKs!gsFlQc!Mc6H)AqQNN z!=X(jFSTS39UR3j0i_vWqFMoa`@^meheaB}wKwe(yHssLdc!W5ln25N{zAy(;T1}8 zAY4)QT37f&7YgoxlqSC6%^p;|hw@2y8HA)3SqZmgb!01_vPyrX!Wpq8`xJoVT_bh-tMc)ak>K8DzYBNymPrO2iN<9H%E17@LrDU)uA1E+4~laO=h2{ z$2}f&kHeUIoZqX38Jgx;4zKA0#E;aZqW0Q|qCQ=C`t4$*ixr$@f)z zpe3FE*`m;=VTkT)xJG}BphEduT`?62w8I&y5?HbHtOiYOZAaTu6u80Ef1a6QEa3#@ zMV(^#vVJXN6OS;1F}T4MEa6nI8emQ%Q(!s&N29+4mZ*_msSx_8RL4@dMcZ|B!U%nt zjDDdm9m`$6ij1W8&0CVnc_Ik#h~he~fX6hgNc^QBtAWe;oS-#^Y7nK*47JRDI$@~l zyiVU4Sm|ESGn!%`qd9w!vDqGgNlS8mMg`4SO!EdVQeE;a%2SxCEVvRP^hGj?QNW_y zkJ5mO__UQKEVzn4v(l6WOZ4-$)DlPQi>TC!`Or&it*IgFtXQ#a#FnvOeEz=$3lqrL z^hTHj_etNeJsk}lhmW>?(wJJfaUosy*22><(~4JG7Vm8ilzkfTm(^@2^LVz@Y~J#b Lcg%MJ_wD}=Uu>ar delta 1350 zcmaJ+Gr0=R(b!7qY_RXs@>i@z#-ZIKlQ_TGxA{~6` z@B*Y(%c?6?=6{{pn1-?~cqpF5jQX2WI8`dRUogf5XY9#gq2ogUfvCY+yWK9p&Vd0e zq20oU&t){^gcEW!WCtmyLLLaqwOuQrU)FY2IA5aDW(Yt#M@TB4&WL4rPDZ;Na9RG| zwJEP##AoQ>$aM+GPZDDlia2yS>{>DPhQYPB<73+uc1PBPU9c$kh8_HrF24;IDaYP$ zNx@Hsa?Ez2;0{Q5;#=K(gVOygAB0!KMX5#Bz~8bWvV{k2(jO^t4%*^LvcU0vkY@oU znleWt(<%0rSnEi4dAj?{k^zzWa?C%^)}>R|oUcg-4-H&P2lo$sl96V1&iK7F2Mf9< zLhcC|cTezZweX1MI2OYT`T%h&glH$?2Ka%3h^26bh7q?zgccEtb5A08>)Y$qYhsMs z1mn>oaFVJubi;Ytt6|x;3kdaIZ>z7ZZHaUtPU4{2eqUf;d*eIZ&Un|;=<^(C>u6f) z|6x(=qwq7`(r}&r3PF|fdR;E%2(&{Vl?yCc)vtlCwY9l5A%Q`r-u2VRjK!P)!xRu$ zxOzlO#>D;1Ulx7EGp9_D!1So7^GeC>K1iaRQlW0 zt15oXMw1pS<;QLG*n)ZbFSf)I$9CpWz7;cJh}K&Zhpe+=$w$++WCUZ!n+O&rkg>Uq zFaz#Go|Z4$>)XF+4t(lOEZjJ?1lQEU{c+QZeND@E`@998b@&T5RI6`u^@p1)tH(VD IanD!(1G-74hX4Qo diff --git a/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/blt_conf.h b/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/blt_conf.h index a643f548..42292681 100644 --- a/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/blt_conf.h +++ b/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/blt_conf.h @@ -191,5 +191,26 @@ #define BOOT_COP_HOOKS_ENABLE (0) +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "FeaserKey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + #endif /* BLT_CONF_H */ /*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/hooks.c b/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/hooks.c index b26a14af..582addf6 100644 --- a/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/hooks.c +++ b/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/hooks.c @@ -213,5 +213,63 @@ void CopServiceHook(void) #endif /* BOOT_COP_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "FeaserKey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + /*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/ide/hcs12_Data/Standard/TargetDataWindows.tdt b/Target/Demo/HCS12_Evbplus_Dragon12p_CodeWarrior/Boot/ide/hcs12_Data/Standard/TargetDataWindows.tdt index d3b8a5e830209c7f394d34d5ed8ff0bb419d35c0..0d11712ca37d4c50d9fbce8b3263afaffe2374f1 100644 GIT binary patch delta 12509 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 Ou}3vrT}6GZH~#+!DnnBM delta 15252 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,E2hn!%K%!Lm>bu^Vxni*`9W#KYny ziKBzVSZaJ_Z9<=7!eyf&8@I_E?ITpJh~QFzqXYU2X_+WhgNy7S@UxQ`Y$yTIk`cD& z#pSL(D<{)ysjpBdEE$@?RjFX!&tuD&j*Y*+#}BdbXGx0wLS3@d%q~X*qgZCFZ&`64 zU^T+2G<82b`8=PdjvzdAY!TMT1L4FLVR<>oH8fovs=#BxsdLmD$R?L-j`}!H9)Vhu z+7`2>k9D?nHf}=FtQ_&jclWZ@Y~}FIgWRkhK{PPhthSF|7c4^Tv%6JmG+Ko<@RIP~ z5nHusSXx&2z^r~KYQ0kUB+n^DI#8ta5bU+6Eo7tXnnfL{ARAnP3)Ec%&;9l@TVvZI|y0|vw=rYgYV*zrd9M`O>)x07LY zoo{u1L;H)Txl(t=t|?^R<=+)X1MylDKELUXZZx;6ga+M|6h{a*_-NNtbb$L7#Z4oM zfOjjqgK2P#JGC@y3v-7XuEmQw4ie%%7Ygfssr&CV6lOR`q%yi^I1Phbe66eOSx>`# z+|vrvPx1u8M9*_QuhEEG&u~cXM@D1eYy+NWjf0B~m>?Pa8j%|hBO5Wn1ju0AL?~;-94A3XBeuuM z@Khse-U;tEqBnQ-G~rdFDdK?>uCd$)PNAJ^JGaxRklBQ%|$IdJj1vw_<(6Zu3nHUiNI$&OBfJ~g`+W931TXd+!EZcpZwm>8 zEiHKX`3k<_1)q0YFv`UsZ$**|BU(ukpEpWq8SE2Lj8IwQ5A8Yh49$mzRxAoD9A;z* zyw!>&QUE`<;`#4V@j#LdrS74fwUVjzrutl3coQbx6{%lcZ>L3I!0RNW7|I!02HUoi z=-A~x32?N;aab_cpl%pIOW-uB;5DK58Ts=z3cI25f95s{WVK;?|MMcspBGX7yomDW zMUF2}{&nk%>6-mM^QV_zbTQO3yL89A5+Q=^hU2~XBAhU)Z&KNC1?8@w z0yX~Mg%99xp*lSB%d0Zk9yC!{R9kV;$J!2fzfgS#`5W{tQisbIhQhES^_Zv+Ly2q& z{s*F>g5nY>Uq&@?P+6o7i?qfO8CxDLwbd35m&wot_fre^pqa>x2(twcgGczl0OuII zA7L~uz&K}mQXhsJ41OHpv2r)8^nouxQn5NbDq#_k;r~VwQup_P$1Z~WVs%)o5%GQ^ z?(c)=qkIZ<6svT%!@oWL9+A4gav!g#~V1OFAiWbg|An)i{al4 zU*v=1lFEZGSq%M_BfiWB$4inPynHdtVE8`}PZr&q>VvCtp%U@P+*~5;qgc^R^TBO! z&vJ}z6T-z}a%=$}^B3S8!cku!ECnC$1FQ4k7iK+X8IiFD$E*+a!CN7z1g+nn=dF63 z4?Gm|7(5PPt(e;B1K)rh2uFqH6B&=~uBM>85Vbr{!!kHof(_@zwQ5-uuAyv&1r_ey zgInd^T|~ATE|*}#33(R%!v@b(+^a3O%0`GSMF%4K%Vm6`8+PA)bHnkF#o)*D<+3C( zwR;!ghChH!41V=tx$GmXGiKaYCnC}fGa*bd_>9=m8@ZgTvl7LuEr;|?0*2_E#Wu- diff --git a/Target/Source/plausibility.h b/Target/Source/plausibility.h index 223c7d2f..dc605ae0 100644 --- a/Target/Source/plausibility.h +++ b/Target/Source/plausibility.h @@ -478,5 +478,17 @@ #endif +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +#ifndef BOOT_XCP_SEED_KEY_ENABLE +#define BOOT_XCP_SEED_KEY_ENABLE (0) +#endif + +#if (BOOT_XCP_SEED_KEY_ENABLE < 0) || (BOOT_XCP_SEED_KEY_ENABLE > 1) +#error "BOOT_XCP_SEED_KEY_ENABLE must be 0 or 1" +#endif + + #endif /* PLAUSIBILITY_H */ /*********************************** end of plausibility.h *****************************/ diff --git a/Target/Source/xcp.c b/Target/Source/xcp.c index b34e2c2b..a018da1f 100644 --- a/Target/Source/xcp.c +++ b/Target/Source/xcp.c @@ -194,6 +194,12 @@ extern blt_int8u XcpCalGetPageHook(blt_int8u segment); extern blt_bool XcpConnectModeHook(blt_int8u mode); #endif +#if (XCP_SEED_KEY_PROTECTION_EN == 1) +extern blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed); +extern blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len); +#endif + + /**************************************************************************************** * External functions @@ -442,20 +448,8 @@ static blt_int8u XcpComputeChecksum(blt_int32u address, blt_int32u length, ****************************************************************************************/ static blt_int8u XcpGetSeed(blt_int8u resource, blt_int8u *seed) { - /* request seed for unlocking ProGraMming resource */ - if ((resource & XCP_RES_PGM) != 0) - { - seed[0] = 0x55; - } - - /* request seed for unlocking CALibration and PAGing resource */ - if ((resource & XCP_RES_CALPAG) != 0) - { - seed[0] = 0xaa; - } - - /* return seed length */ - return 1; + /* pass request on to the application through a hook function */ + return XcpGetSeedHook(resource, seed); } /*** end of XcpGetSeed ***/ @@ -471,30 +465,8 @@ static blt_int8u XcpGetSeed(blt_int8u resource, blt_int8u *seed) ****************************************************************************************/ static blt_int8u XcpVerifyKey(blt_int8u resource, blt_int8u *key, blt_int8u len) { - /* suppress compiler warning for unused parameter */ - len = len; - - /* the example key algorithm in "FeaserKey.dll" works as follows: - * - PGM will be unlocked if key = seed - 1 - * - CAL_PAG will be unlocked if key = seed + 1 - */ - - /* check key for unlocking ProGraMming resource */ - if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) - { - /* correct key received for unlocking PGM resource */ - return 1; - } - - /* check key for unlocking CALibration and PAGing resource */ - if ((resource == XCP_RES_CALPAG) && (key[0] == (0xaa+1))) - { - /* correct key received for unlocking CAL_PAG resource */ - return 1; - } - - /* still here so key incorrect */ - return 0; + /* pass request on to the application through a hook function */ + return XcpVerifyKeyHook(resource, key, len); } /*** end of XcpVerifyKey ***/ #endif /* XCP_SEED_KEY_PROTECTION_EN == 1 */ diff --git a/Target/Source/xcp.h b/Target/Source/xcp.h index 43e96733..31949407 100644 --- a/Target/Source/xcp.h +++ b/Target/Source/xcp.h @@ -98,7 +98,11 @@ * obtain access to a resource. The protection algorithm is implemented in * XcpGetSeed and XcpVerifyKey. */ +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +#define XCP_SEED_KEY_PROTECTION_EN (1) +#else #define XCP_SEED_KEY_PROTECTION_EN (0) +#endif /****************************************************************************************