From 383d5c97ea210aba1d107c257ecf28981084d36e Mon Sep 17 00:00:00 2001 From: Andrey G Date: Sun, 7 Nov 2021 21:50:01 +0300 Subject: [PATCH] Openblt deliver (#3486) * common_make: rusefi.* should be functional image OpenBLT used: rusefi.* is bootloader plus RusEFI OpenBLT not used: rusefi.* is RusEFI only. In both cases flashing of rusefi.* image to blank device should be enough. rusefi_update.srec does not include bootloader and this image should be used for CAN update. * Boundle generation: include bootloader and update image * Update hex2dfu, deliver composite bin file --- firmware/config/boards/common_make.sh | 43 +++++++++++++++++--------- misc/encedo_hex2dfu/hex2dfu.bin | Bin 21688 -> 21768 bytes misc/jenkins/build_working_folder.sh | 6 ++++ 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/firmware/config/boards/common_make.sh b/firmware/config/boards/common_make.sh index 47129eaf15..4d29f0d7f1 100644 --- a/firmware/config/boards/common_make.sh +++ b/firmware/config/boards/common_make.sh @@ -22,29 +22,42 @@ fi chmod u+x $HEX2DFU mkdir -p deliver +rm -f deliver/* -rm -f deliver/rusefi.dfu echo "$SCRIPT_NAME: invoking hex2dfu for RusEFI" -$HEX2DFU -i build/rusefi.hex -C 0x1C -o deliver/rusefi.dfu +$HEX2DFU -i build/rusefi.hex -C 0x1C -o build/rusefi.dfu -# rusEFI console does not use .hex files but for Cypress that's the primary binary format -cp build/rusefi.hex deliver/ -cp build/rusefi.bin deliver/ -cp build/rusefi.srec deliver/ - -# bootloader if [ $USE_OPENBLT = "yes" ]; then - rm -f deliver/openblt_$PROJECT_BOARD.dfu - echo "$SCRIPT_NAME: invoking hex2dfu for OpenBLT" - $HEX2DFU -i build-openblt/openblt_$PROJECT_BOARD.hex -o deliver/openblt_$PROJECT_BOARD.dfu + # this image is suitable for update through bootloader only + # do not deliver update images in any format that can confuse users + #cp build/rusefi.bin deliver/rusefi_update.bin + #cp build/rusefi.dfu deliver/rusefi_update.dfu + #cp build/rusefi.hex deliver/rusefi_update.hex + # srec is the only format used by OpenBLT host tools + cp build/rusefi.srec deliver/rusefi_update.srec +else + # standalone images (for use with no bootloader) + cp build/rusefi.bin deliver/ + cp build/rusefi.dfu deliver/ + # rusEFI console does not use .hex files but for Cypress that's the primary binary format + cp build/rusefi.hex deliver/ +fi - cp build-openblt/openblt_$PROJECT_BOARD.hex deliver/ - cp build-openblt/openblt_$PROJECT_BOARD.bin deliver/ - cp build-openblt/openblt_$PROJECT_BOARD.srec deliver/ +# bootloader and composite image +if [ $USE_OPENBLT = "yes" ]; then + rm -f deliver/openblt.dfu + echo "$SCRIPT_NAME: invoking hex2dfu for OpenBLT" + $HEX2DFU -i build-openblt/openblt_$PROJECT_BOARD.hex -o build-openblt/openblt_$PROJECT_BOARD.dfu + + # do we need all these formats? + cp build-openblt/openblt_$PROJECT_BOARD.bin deliver/openblt.bin + cp build-openblt/openblt_$PROJECT_BOARD.dfu deliver/openblt.dfu + #cp build-openblt/openblt_$PROJECT_BOARD.hex deliver/openblt.hex rm -f deliver/rusefi_openblt.dfu echo "$SCRIPT_NAME: invoking hex2dfu for composite RusEFI+OpenBLT image" - $HEX2DFU -i build-openblt/openblt_$PROJECT_BOARD.hex -i build/rusefi.hex -C 0x1C -o deliver/rusefi_openblt.dfu + $HEX2DFU -i build-openblt/openblt_$PROJECT_BOARD.hex -i build/rusefi.hex -C 0x1C -o deliver/rusefi.dfu -b deliver/rusefi.bin + #todo: how to create 'signed' hex and srec? Do we need? fi echo "$SCRIPT_NAME: build folder content:" diff --git a/misc/encedo_hex2dfu/hex2dfu.bin b/misc/encedo_hex2dfu/hex2dfu.bin index b5a4e11193e75173481668fefa7070910a4f2936..484737fd032326a7e0be5a9b76d01d64137caeb0 100755 GIT binary patch literal 21768 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