-
Notifications
You must be signed in to change notification settings - Fork 1
Comparing changes
Open a pull request
base repository: Josverl/mpflash
base: main
head repository: Josverl/mpflash
compare: pyocd_jv
- 18 commits
- 21 files changed
- 2 contributors
Commits on May 15, 2026
-
Implement pyOCD SWD/JTAG programming support with dynamic target dete…
…ction - Add SWD/JTAG programming as alternative to serial bootloader methods - Support for debug probe discovery and management - Automated target chip selection using dynamic detection - Optional pyOCD dependency via `pyocd` extra - Replace hardcoded target mappings with dynamic API-based detection - Parse MCU info from `sys.implementation._machine` strings - Fuzzy matching algorithm for target selection - Direct probe-based target detection with fallback to fuzzy matching - Extensible architecture for future OpenOCD/J-Link support - Add `--method pyocd` option for explicit SWD/JTAG programming - Add `--probe-id` option for specific debug probe selection - Maintain existing serial bootloader behavior as default - Clean integration with existing flash method selection - Abstract debug probe layer for extensibility - Target detector abstraction with registry system - Proper error handling and fallback mechanisms - Performance optimized with caching and lazy loading - `mpflash/flash/debug_probe.py` - Debug probe abstraction layer - `mpflash/flash/pyocd_probe.py` - pyOCD-specific probe implementation - `mpflash/flash/pyocd_flash.py` - pyOCD flash programming interface - `mpflash/flash/pyocd_targets.py` - Target detection wrapper functions - `mpflash/flash/dynamic_targets.py` - Dynamic target detection engine - `mpflash/cli_pyocd.py` - pyOCD-specific CLI commands (future) - `mpflash/common.py` - Add FlashMethod enum for different programming methods - `mpflash/flash/__init__.py` - Integrate pyOCD into flash method selection - `mpflash/cli_flash.py` - Add CLI options for pyOCD method and probe selection - `pyproject.toml` - Add optional pyOCD dependency - `mpflash/cli_download.py` - Fix unused pytest import - **No hardware requirements change** - existing serial methods remain default - **Automated target selection** - no manual target configuration needed - **Extensible design** - easy to add OpenOCD, J-Link, etc. in future - **Performance optimized** - direct API calls instead of subprocess shells - **Maintainable** - eliminates hardcoded target mappings ```bash mpflash flash mpflash flash --method pyocd mpflash flash --method pyocd --probe-id stlink uv sync --extra pyocd ``` None - all existing functionality preserved with same default behavior.
Configuration menu - View commit details
-
Copy full SHA for d649da8 - Browse repository at this point
Copy the full SHA d649da8View commit details -
cli_flash: use ctx.exit() so exit codes propagate via Click
cli_flash_board previously returned 0/1/2 from the callback, but Click ignores function return values for exit_code in standalone_mode, so the CLI always exited 0 even on flash failure or user cancellation. Switch to ctx.exit(N) so the documented exit codes (0 success, 1 flash failure, 2 user cancellation) actually reach the shell and CliRunner. Test adjustments: - tests/integration/test_cli_integration.py: * Remove xfail from test_flash_failure_handling and test_interactive_parameter_prompting now that exit codes propagate. * test_flash_failure_handling now asserts on mock calls instead of loguru log output, which is order-dependent across the full suite. - tests/cli/test_cli_flash.py: * test_mpflash_connected_comports: when serial ports are detected the test expects success, so make flash_tasks return a non-empty list and stub show_mcus to keep the success path quiet.Configuration menu - View commit details
-
Copy full SHA for 9610d5c - Browse repository at this point
Copy the full SHA 9610d5cView commit details -
test_cli_integration: assert on mock calls instead of log output
test_complete_pyocd_workflow_success previously asserted on the loguru log message 'Flashed 1 boards' reaching result.output, which is fragile because loguru handler configuration can change across tests run earlier in the suite. The test passed in isolation but failed in full-suite runs. Replace the log-output assertion with assertions on the show_mcus mock: the mock must have been called once, with the boards returned by flash_tasks. This verifies the same code path without depending on loguru capture.
Configuration menu - View commit details
-
Copy full SHA for f82749f - Browse repository at this point
Copy the full SHA f82749fView commit details -
test_probe_management: fix TestFlashPyOCDFunction patch targets
The flash_pyocd() implementation in mpflash/flash/pyocd_flash.py imports is_pyocd_supported and get_unsupported_reason from pyocd_core (not the _from_mcu variants), and probe selection happens inside PyOCDFlash, not via find_probe_for_target / get_pyocd_target_from_mcu. The previous tests patched names that do not exist on the pyocd_flash module, so the class was xfailed. Rewrite the three tests to: - patch mpflash.flash.pyocd_flash.is_pyocd_supported - patch mpflash.flash.pyocd_flash.get_unsupported_reason - assert PyOCDFlash is constructed with probe_id / auto_install_packs - simulate 'no probe' by having PyOCDFlash.flash_firmware raise the same MPFlashError the real code raises (probe lookup is internal to it now) Remove the @pytest.mark.xfail marker on TestFlashPyOCDFunction.
Configuration menu - View commit details
-
Copy full SHA for 914dbc0 - Browse repository at this point
Copy the full SHA 914dbc0View commit details -
test_probe_management: rewrite TestPyOCDFlash against the real API
PyOCDFlash.__init__ calls detect_pyocd_target() and is_pyocd_available() (imported from pyocd_core) and stores the resulting target on self.target_type. PyOCDFlash.flash_firmware() looks up the probe via find_pyocd_probe() (defined in pyocd_flash itself), then calls probe.program_flash(fw, target_type, **options). The previous tests patched is_debug_programming_available, get_pyocd_target_dynamic and find_debug_probe on pyocd_flash, none of which exist there, so the whole class was xfailed. Rewrite all six tests to patch the correct names on the pyocd_flash module and to give Mock(spec=PyOCDProbe) a description attribute so the debug log line in flash_firmware does not blow up. Remove the @pytest.mark.xfail marker on TestPyOCDFlash.
Configuration menu - View commit details
-
Copy full SHA for 18b4d86 - Browse repository at this point
Copy the full SHA 18b4d86View commit details -
feat: use python-dotenv for environment variable management
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 78e3e33 - Browse repository at this point
Copy the full SHA 78e3e33View commit details -
chore: dependencies: --all-extras
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 2ede53a - Browse repository at this point
Copy the full SHA 2ede53aView commit details -
feat: Add warning for missing libusb backend on Windows+Latest Python
see: pyocd/libusb-package#28 Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for af41b12 - Browse repository at this point
Copy the full SHA af41b12View commit details -
tests: Enhance test fixtures for non-interactive defaults
- avoid hardcoded tempfile Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 4c18da8 - Browse repository at this point
Copy the full SHA 4c18da8View commit details -
CI: Skip pyocd on 3.14 due to libusb
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 48cdb59 - Browse repository at this point
Copy the full SHA 48cdb59View commit details -
test: handle CI runners having no physical serial ports.
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 6bc3b12 - Browse repository at this point
Copy the full SHA 6bc3b12View commit details -
feat: Add handling for known dependency issues with pyOCD on Python 3…
….14+ Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for f5e0760 - Browse repository at this point
Copy the full SHA f5e0760View commit details
Commits on May 16, 2026
-
fix: py 3.14 libusb dependencies
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for a65baf1 - Browse repository at this point
Copy the full SHA a65baf1View commit details -
fix: adjust dependency installation for Python 3.14 compatibility
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 4b0e494 - Browse repository at this point
Copy the full SHA 4b0e494View commit details -
fix: comment out known dependency issue for Python 3.14 libusb
This should not be needed if the fallback version works good enough Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for d634746 - Browse repository at this point
Copy the full SHA d634746View commit details -
stm32: also download .hex binaries.
They can be used by pyOCD flashing Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for df95172 - Browse repository at this point
Copy the full SHA df95172View commit details -
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 317b733 - Browse repository at this point
Copy the full SHA 317b733View commit details -
Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
Configuration menu - View commit details
-
Copy full SHA for 10a902f - Browse repository at this point
Copy the full SHA 10a902fView commit details
This comparison is taking too long to generate.
Unfortunately it looks like we can’t render this comparison for you right now. It might be too big, or there might be something weird with your repository.
You can try running this command locally to see the comparison on your machine:
git diff main...pyocd_jv