fbt fixes & improvements (#1490)
* fbt: minimal USB flash mode; scripts: faster storage.py with larger chunks * fbt: fixed creation of temporary file nodes confusing scons * docs: removed refs to --with-updater * fbt: removed splashscreen from minimal update package * fbt: renamed dist arguments for consistency * docs: fixed updater_debug target * fbt: separate target for generating compilation_database.json without building the code. * fbt: added `jflash` target for programming over JLink probe; refactored usb flashing targets * fbt: building updater_app in unit_tests configuration * fbt: fixed reset behavior after flashing with J-Link * fbt: generating .map file for firmware binary & external apps * fbt/core: moved library contents before apps code Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									1e732830ec
								
							
						
					
					
						commit
						a1637e9216
					
				
							
								
								
									
										4
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @ -78,7 +78,7 @@ jobs: | ||||
|             set -e | ||||
|             for TARGET in ${TARGETS} | ||||
|             do | ||||
|               ./fbt TARGET_HW=`echo ${TARGET} | sed 's/f//'` --with-updater updater_package ${{ startsWith(github.ref, 'refs/tags') && 'DEBUG=0 COMPACT=1' || '' }} | ||||
|               ./fbt TARGET_HW=`echo ${TARGET} | sed 's/f//'` updater_package ${{ startsWith(github.ref, 'refs/tags') && 'DEBUG=0 COMPACT=1' || '' }} | ||||
|             done | ||||
| 
 | ||||
|       - name: 'Move upload files' | ||||
| @ -214,5 +214,5 @@ jobs: | ||||
|             set -e | ||||
|             for TARGET in ${TARGETS} | ||||
|             do | ||||
|               ./fbt TARGET_HW=`echo ${TARGET} | sed 's/f//'` --with-updater updater_package DEBUG=0 COMPACT=1 | ||||
|               ./fbt TARGET_HW=`echo ${TARGET} | sed 's/f//'` updater_package DEBUG=0 COMPACT=1 | ||||
|             done | ||||
|  | ||||
| @ -29,11 +29,11 @@ They both must be flashed in the order described. | ||||
| 
 | ||||
| With Flipper attached over USB: | ||||
| 
 | ||||
| `./fbt --with-updater flash_usb` | ||||
| `./fbt flash_usb` | ||||
| 
 | ||||
| Just building the package: | ||||
| 
 | ||||
| `./fbt --with-updater updater_package` | ||||
| `./fbt updater_package` | ||||
| 
 | ||||
| To update, copy the resulting directory to Flipper's SD card and navigate to `update.fuf` file in Archive app.  | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										66
									
								
								SConstruct
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								SConstruct
									
									
									
									
									
								
							| @ -33,8 +33,10 @@ coreenv["ROOT_DIR"] = Dir(".") | ||||
| 
 | ||||
| # Create a separate "dist" environment and add construction envs to it | ||||
| distenv = coreenv.Clone( | ||||
|     tools=["fbt_dist", "openocd", "blackmagic"], | ||||
|     OPENOCD_GDB_PIPE=["|openocd -c 'gdb_port pipe; log_output debug/openocd.log' ${[SINGLEQUOTEFUNC(OPENOCD_OPTS)]}"], | ||||
|     tools=["fbt_dist", "openocd", "blackmagic", "jflash"], | ||||
|     OPENOCD_GDB_PIPE=[ | ||||
|         "|openocd -c 'gdb_port pipe; log_output debug/openocd.log' ${[SINGLEQUOTEFUNC(OPENOCD_OPTS)]}" | ||||
|     ], | ||||
|     GDBOPTS_BASE=[ | ||||
|         "-ex", | ||||
|         "target extended-remote ${GDBREMOTE}", | ||||
| @ -61,6 +63,7 @@ distenv = coreenv.Clone( | ||||
|         "-ex", | ||||
|         "compare-sections", | ||||
|     ], | ||||
|     JFLASHPROJECT="${ROOT_DIR.abspath}/debug/fw.jflash", | ||||
|     ENV=os.environ, | ||||
| ) | ||||
| 
 | ||||
| @ -71,7 +74,9 @@ firmware_env = distenv.AddFwProject( | ||||
| ) | ||||
| 
 | ||||
| # If enabled, initialize updater-related targets | ||||
| if GetOption("fullenv"): | ||||
| if GetOption("fullenv") or any( | ||||
|     filter(lambda target: "updater" in target or "flash_usb" in target, BUILD_TARGETS) | ||||
| ): | ||||
|     updater_env = distenv.AddFwProject( | ||||
|         base_env=coreenv, | ||||
|         fw_type="updater", | ||||
| @ -79,11 +84,11 @@ if GetOption("fullenv"): | ||||
|     ) | ||||
| 
 | ||||
|     # Target for self-update package | ||||
|     dist_arguments = [ | ||||
|         "-r", | ||||
|         '"${ROOT_DIR.abspath}/assets/resources"', | ||||
|     dist_basic_arguments = [ | ||||
|         "--bundlever", | ||||
|         '"${UPDATE_VERSION_STRING}"', | ||||
|     ] | ||||
|     dist_radio_arguments = [ | ||||
|         "--radio", | ||||
|         '"${ROOT_DIR.abspath}/${COPRO_STACK_BIN_DIR}/${COPRO_STACK_BIN}"', | ||||
|         "--radiotype", | ||||
| @ -92,16 +97,34 @@ if GetOption("fullenv"): | ||||
|         "--obdata", | ||||
|         '"${ROOT_DIR.abspath}/${COPRO_OB_DATA}"', | ||||
|     ] | ||||
|     if distenv["UPDATE_SPLASH"]: | ||||
|         dist_arguments += [ | ||||
|     dist_resource_arguments = [ | ||||
|         "-r", | ||||
|         '"${ROOT_DIR.abspath}/assets/resources"', | ||||
|     ] | ||||
|     dist_splash_arguments = ( | ||||
|         [ | ||||
|             "--splash", | ||||
|             distenv.subst("assets/slideshow/$UPDATE_SPLASH"), | ||||
|         ] | ||||
|         if distenv["UPDATE_SPLASH"] | ||||
|         else [] | ||||
|     ) | ||||
| 
 | ||||
|     selfupdate_dist = distenv.DistCommand( | ||||
|         "updater_package", | ||||
|         (distenv["DIST_DEPENDS"], firmware_env["FW_RESOURCES"]), | ||||
|         DIST_EXTRA=dist_arguments, | ||||
|         DIST_EXTRA=[ | ||||
|             *dist_basic_arguments, | ||||
|             *dist_radio_arguments, | ||||
|             *dist_resource_arguments, | ||||
|             *dist_splash_arguments, | ||||
|         ], | ||||
|     ) | ||||
| 
 | ||||
|     selfupdate_min_dist = distenv.DistCommand( | ||||
|         "updater_minpackage", | ||||
|         distenv["DIST_DEPENDS"], | ||||
|         DIST_EXTRA=dist_basic_arguments, | ||||
|     ) | ||||
| 
 | ||||
|     # Updater debug | ||||
| @ -121,18 +144,16 @@ if GetOption("fullenv"): | ||||
|     ) | ||||
| 
 | ||||
|     # Installation over USB & CLI | ||||
|     usb_update_package = distenv.UsbInstall( | ||||
|         "#build/usbinstall.flag", | ||||
|         ( | ||||
|             distenv["DIST_DEPENDS"], | ||||
|             firmware_env["FW_RESOURCES"], | ||||
|             selfupdate_dist, | ||||
|         ), | ||||
|     usb_update_package = distenv.AddUsbFlashTarget( | ||||
|         "#build/usbinstall.flag", (firmware_env["FW_RESOURCES"], selfupdate_dist) | ||||
|     ) | ||||
|     if distenv["FORCE"]: | ||||
|         distenv.AlwaysBuild(usb_update_package) | ||||
|     distenv.Depends(usb_update_package, selfupdate_dist) | ||||
|     distenv.Alias("flash_usb", usb_update_package) | ||||
|     distenv.Alias("flash_usb_full", usb_update_package) | ||||
| 
 | ||||
|     usb_minupdate_package = distenv.AddUsbFlashTarget( | ||||
|         "#build/minusbinstall.flag", (selfupdate_min_dist,) | ||||
|     ) | ||||
|     distenv.Alias("flash_usb", usb_minupdate_package) | ||||
| 
 | ||||
| 
 | ||||
| # Target for copying & renaming binaries to dist folder | ||||
| basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"]) | ||||
| @ -147,8 +168,9 @@ distenv.Alias("copro_dist", copro_dist) | ||||
| 
 | ||||
| firmware_flash = distenv.AddOpenOCDFlashTarget(firmware_env) | ||||
| distenv.Alias("flash", firmware_flash) | ||||
| if distenv["FORCE"]: | ||||
|     distenv.AlwaysBuild(firmware_flash) | ||||
| 
 | ||||
| firmware_jflash = distenv.AddJFlashTarget(firmware_env) | ||||
| distenv.Alias("jflash", firmware_jflash) | ||||
| 
 | ||||
| firmware_bm_flash = distenv.PhonyTarget( | ||||
|     "flash_blackmagic", | ||||
|  | ||||
| @ -38,6 +38,8 @@ appenv.AppendUnique( | ||||
|         "-Wl,--no-export-dynamic", | ||||
|         "-fvisibility=hidden", | ||||
|         "-Wl,-e${APP_ENTRY}", | ||||
|         "-Xlinker", | ||||
|         "-Map=${TARGET}.map", | ||||
|     ], | ||||
| ) | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										90
									
								
								debug/fw.jflash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								debug/fw.jflash
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | ||||
|   AppVersion = 76803 | ||||
|   FileVersion = 2 | ||||
| [GENERAL] | ||||
|   aATEModuleSel[24] = 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 | ||||
|   ConnectMode = 0 | ||||
|   CurrentFile = "..\build\latest\firmware.bin" | ||||
|   DataFileSAddr = 0x08000000 | ||||
|   GUIMode = 0 | ||||
|   HostName = "" | ||||
|   TargetIF = 1 | ||||
|   USBPort = 0 | ||||
|   USBSerialNo = 0x00000000 | ||||
|   UseATEModuleSelection = 0 | ||||
| [JTAG] | ||||
|   IRLen = 0 | ||||
|   MultipleTargets = 0 | ||||
|   NumDevices = 0 | ||||
|   Speed0 = 8000 | ||||
|   Speed1 = 8000 | ||||
|   TAP_Number = 0 | ||||
|   UseAdaptive0 = 0 | ||||
|   UseAdaptive1 = 0 | ||||
|   UseMaxSpeed0 = 0 | ||||
|   UseMaxSpeed1 = 0 | ||||
| [CPU] | ||||
|   NumInitSteps = 2 | ||||
|   InitStep0_Action = "Reset" | ||||
|   InitStep0_Value0 = 0x00000000 | ||||
|   InitStep0_Value1 = 0x00000000 | ||||
|   InitStep0_Comment = "" | ||||
|   InitStep1_Action = "Halt" | ||||
|   InitStep1_Value0 = 0xFFFFFFFF | ||||
|   InitStep1_Value1 = 0xFFFFFFFF | ||||
|   InitStep1_Comment = "" | ||||
|   NumExitSteps = 1 | ||||
|   ExitStep0_Action = "Reset" | ||||
|   ExitStep0_Value0 = 0x00000005 | ||||
|   ExitStep0_Value1 = 0x00000032 | ||||
|   ExitStep0_Comment = "" | ||||
|   UseScriptFile = 0 | ||||
|   ScriptFile = "" | ||||
|   UseRAM = 1 | ||||
|   RAMAddr = 0x20000000 | ||||
|   RAMSize = 0x00030000 | ||||
|   CheckCoreID = 1 | ||||
|   CoreID = 0x6BA02477 | ||||
|   CoreIDMask = 0x0F000FFF | ||||
|   UseAutoSpeed = 0x00000001 | ||||
|   ClockSpeed = 0x00000000 | ||||
|   EndianMode = 0 | ||||
|   ChipName = "ST STM32WB55RG" | ||||
| [FLASH] | ||||
|   aRangeSel[1] = 0-255 | ||||
|   BankName = "Internal flash" | ||||
|   BankSelMode = 1 | ||||
|   BaseAddr = 0x08000000 | ||||
|   NumBanks = 1 | ||||
| [PRODUCTION] | ||||
|   AutoPerformsDisconnect = 0 | ||||
|   AutoPerformsErase = 1 | ||||
|   AutoPerformsProgram = 1 | ||||
|   AutoPerformsSecure = 0 | ||||
|   AutoPerformsStartApp = 1 | ||||
|   AutoPerformsUnsecure = 0 | ||||
|   AutoPerformsVerify = 0 | ||||
|   EnableFixedVTref = 0 | ||||
|   EnableTargetPower = 0 | ||||
|   EraseType = 1 | ||||
|   FixedVTref = 0x00000CE4 | ||||
|   MonitorVTref = 0 | ||||
|   MonitorVTrefMax = 0x0000157C | ||||
|   MonitorVTrefMin = 0x000003E8 | ||||
|   OverrideTimeouts = 0 | ||||
|   ProgramSN = 0 | ||||
|   SerialFile = "" | ||||
|   SNAddr = 0x00000000 | ||||
|   SNInc = 0x00000001 | ||||
|   SNLen = 0x00000004 | ||||
|   SNListFile = "" | ||||
|   SNValue = 0x00000001 | ||||
|   StartAppType = 1 | ||||
|   TargetPowerDelay = 0x00000014 | ||||
|   TimeoutErase = 0x00003A98 | ||||
|   TimeoutProgram = 0x00002710 | ||||
|   TimeoutVerify = 0x00002710 | ||||
|   VerifyType = 1 | ||||
| [PERFORMANCE] | ||||
|   DisableSkipBlankDataOnProgram = 0x00000000 | ||||
|   PerfromBlankCheckPriorEraseChip = 0x00000001 | ||||
|   PerfromBlankCheckPriorEraseSelectedSectors = 0x00000001 | ||||
| @ -110,7 +110,12 @@ Even if something goes wrong, Updater gives you an option to retry failed operat | ||||
| 
 | ||||
| ## Full package | ||||
| 
 | ||||
| To build a basic update package, run `./fbt --with-updater COMPACT=1 DEBUG=0 updater_package` | ||||
| To build full update package, including firmware, radio stack and resources for SD card, run `./fbt COMPACT=1 DEBUG=0 updater_package` | ||||
| 
 | ||||
| 
 | ||||
| ## Minimal package | ||||
| 
 | ||||
| To build minimal update package, including only firmware, run `./fbt COMPACT=1 DEBUG=0 updater_minpackage` | ||||
| 
 | ||||
| 
 | ||||
| ## Customizing update bundles | ||||
| @ -118,7 +123,7 @@ To build a basic update package, run `./fbt --with-updater COMPACT=1 DEBUG=0 upd | ||||
| Default update packages are built with Bluetooth Light stack.  | ||||
| You can pick a different stack, if your firmware version supports it, and build a bundle with it passing stack type and binary name to `fbt`:  | ||||
| 
 | ||||
| `./fbt --with-updater updater_package COMPACT=1 DEBUG=0 COPRO_OB_DATA=scripts/ob_custradio.data COPRO_STACK_BIN=stm32wb5x_BLE_Stack_full_fw.bin COPRO_STACK_TYPE=ble_full`   | ||||
| `./fbt updater_package COMPACT=1 DEBUG=0 COPRO_OB_DATA=scripts/ob_custradio.data COPRO_STACK_BIN=stm32wb5x_BLE_Stack_full_fw.bin COPRO_STACK_TYPE=ble_full`   | ||||
| 
 | ||||
| Note that `COPRO_OB_DATA` must point to a valid file in `scripts` folder containing reference Option Byte data matching to your radio stack type. | ||||
| 
 | ||||
|  | ||||
| @ -20,7 +20,7 @@ Make sure that `gcc-arm-none-eabi` toolchain & OpenOCD executables are in system | ||||
| 
 | ||||
| To build with FBT, call it specifying configuration options & targets to build. For example, | ||||
| 
 | ||||
| `./fbt --with-updater COMPACT=1 DEBUG=0 VERBOSE=1 updater_package copro_dist` | ||||
| `./fbt COMPACT=1 DEBUG=0 VERBOSE=1 updater_package copro_dist` | ||||
| 
 | ||||
| To run cleanup (think of `make clean`) for specified targets, add `-c` option. | ||||
| 
 | ||||
| @ -31,13 +31,13 @@ FBT keeps track of internal dependencies, so you only need to build the highest- | ||||
| ### High-level (what you most likely need) | ||||
| 
 | ||||
| - `fw_dist` - build & publish firmware to `dist` folder. This is a default target, when no other are specified | ||||
| - `updater_package` - build self-update package. _Requires `--with-updater` option_ | ||||
| - `updater_package`, `updater_minpackage` - build self-update package. Minimal version only inclues firmware's DFU file; full version also includes radio stack & resources for SD card | ||||
| - `copro_dist` - bundle Core2 FUS+stack binaries for qFlipper | ||||
| - `flash` - flash attached device with OpenOCD over ST-Link | ||||
| - `flash_usb` - build, upload and install update package to device over USB.  _Requires `--with-updater` option_ | ||||
| - `flash_usb`, `flash_usb_full` - build, upload and install update package to device over USB. See details on `updater_package`, `updater_minpackage`  | ||||
| - `debug` - build and flash firmware, then attach with gdb with firmware's .elf loaded | ||||
| - `debug_updater` - attach gdb with updater's .elf loaded. _Requires `--with-updater` option_ | ||||
| - `debug_other` - attach gdb without loading any .elf. Allows to manually add external elf files with `add-symbol-file` in gdb. | ||||
| - `debug_other` - attach gdb without loading any .elf. Allows to manually add external elf files with `add-symbol-file` in gdb | ||||
| - `updater_debug` - attach gdb with updater's .elf loaded | ||||
| - `blackmagic` - debug firmware with Blackmagic probe (WiFi dev board) | ||||
| - `openocd` - just start OpenOCD | ||||
| - `get_blackmagic` - output blackmagic address in gdb remote format. Useful for IDE integration | ||||
| @ -49,9 +49,11 @@ FBT keeps track of internal dependencies, so you only need to build the highest- | ||||
|     - Check out `--extra-ext-apps` for force adding extra apps to external build  | ||||
|     - `firmware_snake_game_list`, etc - generate source + assembler listing for app's .elf | ||||
| - `flash`, `firmware_flash` - flash current version to attached device with OpenOCD over ST-Link | ||||
| - `jflash` - flash current version to attached device with JFlash using J-Link probe. JFlash executable must be on your $PATH | ||||
| - `flash_blackmagic` - flash current version to attached device with Blackmagic probe | ||||
| - `firmware_all`, `updater_all` - build basic set of binaries | ||||
| - `firmware_list`, `updater_list` - generate source + assembler listing | ||||
| - `firmware_cdb`, `updater_cdb` - generate `compilation_database.json` file for external tools and IDEs. It can be created without actually building the firmware.  | ||||
| 
 | ||||
| ### Assets | ||||
| 
 | ||||
| @ -66,7 +68,7 @@ FBT keeps track of internal dependencies, so you only need to build the highest- | ||||
| ## Command-line parameters | ||||
| 
 | ||||
| - `--options optionfile.py` (default value `fbt_options.py`) - load file with multiple configuration values | ||||
| - `--with-updater` - enables updater-related targets and dependency tracking. Enabling this option introduces extra startup time costs, so use it when bundling update packages. Or if you have a fast computer and don't care about a few extra seconds of startup time | ||||
| - `--with-updater` - enables updater-related targets and dependency tracking. Enabling this option introduces extra startup time costs, so use it when bundling update packages. _Explicily enabling this should no longer be required, fbt now has specific handling for updater-related targets_ | ||||
| - `--extra-int-apps=app1,app2,appN` - forces listed apps to be built as internal with `firmware` target | ||||
| - `--extra-ext-apps=app1,app2,appN` - forces listed apps to be built as external with `firmware_extapps` target | ||||
| 
 | ||||
|  | ||||
| @ -80,6 +80,7 @@ FIRMWARE_APPS = { | ||||
|     ], | ||||
|     "unit_tests": [ | ||||
|         "basic_services", | ||||
|         "updater_app", | ||||
|         "unit_tests", | ||||
|     ], | ||||
| } | ||||
|  | ||||
| @ -9,7 +9,11 @@ from fbt.util import ( | ||||
| 
 | ||||
| # Building initial C environment for libs | ||||
| env = ENV.Clone( | ||||
|     tools=["compilation_db", "fwbin", "fbt_apps"], | ||||
|     tools=[ | ||||
|         ("compilation_db", {"COMPILATIONDB_COMSTR": "\tCDB\t${TARGET}"}), | ||||
|         "fwbin", | ||||
|         "fbt_apps", | ||||
|     ], | ||||
|     COMPILATIONDB_USE_ABSPATH=False, | ||||
|     BUILD_DIR=fw_build_meta["build_dir"], | ||||
|     IS_BASE_FIRMWARE=fw_build_meta["type"] == "firmware", | ||||
| @ -76,7 +80,6 @@ if not env["VERBOSE"]: | ||||
|         HEXCOMSTR="\tHEX\t${TARGET}", | ||||
|         BINCOMSTR="\tBIN\t${TARGET}", | ||||
|         DFUCOMSTR="\tDFU\t${TARGET}", | ||||
|         OPENOCDCOMSTR="\tFLASH\t${SOURCE}", | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @ -139,7 +142,7 @@ apps_c = fwenv.ApplicationsC( | ||||
|     Value(fwenv["APPS"]), | ||||
| ) | ||||
| # Adding dependency on manifest files so apps.c is rebuilt when any manifest is changed | ||||
| fwenv.Depends(apps_c, fwenv.GlobRecursive("*.fam", "applications")) | ||||
| fwenv.Depends(apps_c, fwenv.GlobRecursive("*.fam", "#/applications")) | ||||
| 
 | ||||
| sources = [apps_c] | ||||
| # Gather sources only from app folders in current configuration | ||||
| @ -164,6 +167,8 @@ fwenv.AppendUnique( | ||||
|         "-u", | ||||
|         "_printf_float", | ||||
|         "-n", | ||||
|         "-Xlinker", | ||||
|         "-Map=${TARGET}.map", | ||||
|     ], | ||||
| ) | ||||
| 
 | ||||
| @ -202,7 +207,6 @@ fwelf = fwenv["FW_ELF"] = fwenv.Program( | ||||
|     ], | ||||
| ) | ||||
| 
 | ||||
| # Make it depend on everything child builders returned | ||||
| # Firmware depends on everything child builders returned | ||||
| Depends(fwelf, lib_targets) | ||||
| # Output extra details after building firmware | ||||
| @ -232,7 +236,8 @@ if should_gen_cdb_and_link_dir(fwenv, BUILD_TARGETS): | ||||
|     fwcdb = fwenv.CompilationDatabase() | ||||
|     # without filtering, both updater & firmware commands would be generated | ||||
|     fwenv.Replace(COMPILATIONDB_PATH_FILTER=fwenv.subst("*${FW_FLAVOR}*")) | ||||
|     Depends(fwcdb, fwelf) | ||||
|     AlwaysBuild(fwcdb) | ||||
|     Alias(fwenv["FIRMWARE_BUILD_CFG"] + "_cdb", fwcdb) | ||||
|     fw_artifacts.append(fwcdb) | ||||
| 
 | ||||
|     # Adding as a phony target, so folder link is updated even if elf didn't change | ||||
|  | ||||
| @ -75,6 +75,7 @@ SECTIONS | ||||
|   .text : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     *lib*.a:*(.text .text.*) /* code from libraries before apps */ | ||||
|     *(.text)           /* .text sections (code) */ | ||||
|     *(.text*)          /* .text* sections (code) */ | ||||
|     *(.glue_7)         /* glue arm to thumb code */ | ||||
|  | ||||
| @ -53,13 +53,14 @@ class FlipperStorage: | ||||
|     CLI_PROMPT = ">: " | ||||
|     CLI_EOL = "\r\n" | ||||
| 
 | ||||
|     def __init__(self, portname: str, portbaud: int = 115200): | ||||
|     def __init__(self, portname: str, chunk_size: int = 8192): | ||||
|         self.port = serial.Serial() | ||||
|         self.port.port = portname | ||||
|         self.port.timeout = 2 | ||||
|         self.port.baudrate = portbaud | ||||
|         self.port.baudrate = 115200  # Doesn't matter for VCP | ||||
|         self.read = BufferedRead(self.port) | ||||
|         self.last_error = "" | ||||
|         self.chunk_size = chunk_size | ||||
| 
 | ||||
|     def start(self): | ||||
|         self.port.open() | ||||
| @ -192,7 +193,7 @@ class FlipperStorage: | ||||
|         with open(filename_from, "rb") as file: | ||||
|             filesize = os.fstat(file.fileno()).st_size | ||||
| 
 | ||||
|             buffer_size = 512 | ||||
|             buffer_size = self.chunk_size | ||||
|             while True: | ||||
|                 filedata = file.read(buffer_size) | ||||
|                 size = len(filedata) | ||||
| @ -221,7 +222,7 @@ class FlipperStorage: | ||||
| 
 | ||||
|     def read_file(self, filename): | ||||
|         """Receive file from Flipper, and get filedata (bytes)""" | ||||
|         buffer_size = 512 | ||||
|         buffer_size = self.chunk_size | ||||
|         self.send_and_wait_eol( | ||||
|             'storage read_chunks "' + filename + '" ' + str(buffer_size) + "\r" | ||||
|         ) | ||||
| @ -355,7 +356,7 @@ class FlipperStorage: | ||||
|         """Hash of local file""" | ||||
|         hash_md5 = hashlib.md5() | ||||
|         with open(filename, "rb") as f: | ||||
|             for chunk in iter(lambda: f.read(4096), b""): | ||||
|             for chunk in iter(lambda: f.read(self.chunk_size), b""): | ||||
|                 hash_md5.update(chunk) | ||||
|         return hash_md5.hexdigest() | ||||
| 
 | ||||
|  | ||||
| @ -14,14 +14,6 @@ import serial.tools.list_ports as list_ports | ||||
| class Main(App): | ||||
|     def init(self): | ||||
|         self.parser.add_argument("-p", "--port", help="CDC Port", default="auto") | ||||
|         self.parser.add_argument( | ||||
|             "-b", | ||||
|             "--baud", | ||||
|             help="Port Baud rate", | ||||
|             required=False, | ||||
|             default=115200 * 4, | ||||
|             type=int, | ||||
|         ) | ||||
| 
 | ||||
|         self.parser.add_argument("manifest_path", help="Manifest path") | ||||
|         self.parser.add_argument( | ||||
| @ -64,7 +56,7 @@ class Main(App): | ||||
|         if not (port := resolve_port(self.logger, self.args.port)): | ||||
|             return 1 | ||||
| 
 | ||||
|         storage = FlipperStorage(port, self.args.baud) | ||||
|         storage = FlipperStorage(port) | ||||
|         storage.start() | ||||
| 
 | ||||
|         try: | ||||
| @ -99,6 +91,7 @@ class Main(App): | ||||
|                         self.logger.error(f"Error: {storage.last_error}") | ||||
|                         return -3 | ||||
| 
 | ||||
|                 # return -11 | ||||
|                 storage.send_and_wait_eol( | ||||
|                     f"update install {flipper_update_path}/{manifest_name}\r" | ||||
|                 ) | ||||
|  | ||||
| @ -14,14 +14,7 @@ import tempfile | ||||
| class Main(App): | ||||
|     def init(self): | ||||
|         self.parser.add_argument("-p", "--port", help="CDC Port", default="auto") | ||||
|         self.parser.add_argument( | ||||
|             "-b", | ||||
|             "--baud", | ||||
|             help="Port Baud rate", | ||||
|             required=False, | ||||
|             default=115200 * 4, | ||||
|             type=int, | ||||
|         ) | ||||
| 
 | ||||
|         self.subparsers = self.parser.add_subparsers(help="sub-command help") | ||||
| 
 | ||||
|         self.parser_mkdir = self.subparsers.add_parser("mkdir", help="Create directory") | ||||
| @ -77,7 +70,7 @@ class Main(App): | ||||
|         if not (port := resolve_port(self.logger, self.args.port)): | ||||
|             return None | ||||
| 
 | ||||
|         storage = FlipperStorage(port, self.args.baud) | ||||
|         storage = FlipperStorage(port) | ||||
|         storage.start() | ||||
|         return storage | ||||
| 
 | ||||
|  | ||||
| @ -2,6 +2,7 @@ from SCons.Builder import Builder | ||||
| from SCons.Action import Action | ||||
| from SCons.Warnings import warn, WarningOnByDefault | ||||
| import SCons | ||||
| import os.path | ||||
| 
 | ||||
| from fbt.appmanifest import ( | ||||
|     FlipperAppType, | ||||
| @ -17,10 +18,12 @@ from fbt.appmanifest import ( | ||||
| 
 | ||||
| def LoadApplicationManifests(env): | ||||
|     appmgr = env["APPMGR"] = AppManager() | ||||
|     for entry in env.Glob("#/applications/*", source=True): | ||||
|     for entry in env.Glob("#/applications/*", ondisk=True, source=True): | ||||
|         if isinstance(entry, SCons.Node.FS.Dir) and not str(entry).startswith("."): | ||||
|             try: | ||||
|                 appmgr.load_manifest(entry.File("application.fam").abspath, entry.name) | ||||
|                 appmgr.load_manifest( | ||||
|                     os.path.join(entry.abspath, "application.fam"), entry.name | ||||
|                 ) | ||||
|             except FlipperManifestException as e: | ||||
|                 warn(WarningOnByDefault, str(e)) | ||||
| 
 | ||||
|  | ||||
| @ -66,9 +66,38 @@ def AddOpenOCDFlashTarget(env, targetenv, **kw): | ||||
|         **kw, | ||||
|     ) | ||||
|     env.Alias(targetenv.subst("${FIRMWARE_BUILD_CFG}_flash"), openocd_target) | ||||
|     if env["FORCE"]: | ||||
|         env.AlwaysBuild(openocd_target) | ||||
|     return openocd_target | ||||
| 
 | ||||
| 
 | ||||
| def AddJFlashTarget(env, targetenv, **kw): | ||||
|     jflash_target = env.JFlash( | ||||
|         "#build/jflash-${BUILD_CFG}-flash.flag", | ||||
|         targetenv["FW_BIN"], | ||||
|         JFLASHADDR=targetenv.subst("$IMAGE_BASE_ADDRESS"), | ||||
|         BUILD_CFG=targetenv.subst("${FIRMWARE_BUILD_CFG}"), | ||||
|         **kw, | ||||
|     ) | ||||
|     env.Alias(targetenv.subst("${FIRMWARE_BUILD_CFG}_jflash"), jflash_target) | ||||
|     if env["FORCE"]: | ||||
|         env.AlwaysBuild(jflash_target) | ||||
|     return jflash_target | ||||
| 
 | ||||
| 
 | ||||
| def AddUsbFlashTarget(env, file_flag, extra_deps, **kw): | ||||
|     usb_update = env.UsbInstall( | ||||
|         file_flag, | ||||
|         ( | ||||
|             env["DIST_DEPENDS"], | ||||
|             *extra_deps, | ||||
|         ), | ||||
|     ) | ||||
|     if env["FORCE"]: | ||||
|         env.AlwaysBuild(usb_update) | ||||
|     return usb_update | ||||
| 
 | ||||
| 
 | ||||
| def DistCommand(env, name, source, **kw): | ||||
|     target = f"dist_{name}" | ||||
|     command = env.Command( | ||||
| @ -86,6 +115,8 @@ def generate(env): | ||||
|     env.AddMethod(AddFwProject) | ||||
|     env.AddMethod(DistCommand) | ||||
|     env.AddMethod(AddOpenOCDFlashTarget) | ||||
|     env.AddMethod(AddJFlashTarget) | ||||
|     env.AddMethod(AddUsbFlashTarget) | ||||
| 
 | ||||
|     env.SetDefault( | ||||
|         COPRO_MCU_FAMILY="STM32WB5x", | ||||
|  | ||||
							
								
								
									
										27
									
								
								site_scons/site_tools/jflash.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								site_scons/site_tools/jflash.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | ||||
| from SCons.Builder import Builder | ||||
| from SCons.Defaults import Touch | ||||
| 
 | ||||
| 
 | ||||
| def generate(env): | ||||
|     env.SetDefault( | ||||
|         JFLASH="JFlash" if env.subst("$PLATFORM") == "win32" else "JFlashExe", | ||||
|         JFLASHFLAGS=[ | ||||
|             "-auto", | ||||
|             "-exit", | ||||
|         ], | ||||
|         JFLASHCOM="${JFLASH} -openprj${JFLASHPROJECT} -open${SOURCE},${JFLASHADDR} ${JFLASHFLAGS}", | ||||
|     ) | ||||
|     env.Append( | ||||
|         BUILDERS={ | ||||
|             "JFlash": Builder( | ||||
|                 action=[ | ||||
|                     "${JFLASHCOM}", | ||||
|                     Touch("${TARGET}"), | ||||
|                 ], | ||||
|             ), | ||||
|         } | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| def exists(env): | ||||
|     return True | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 hedger
						hedger