Skip to main content

CI/CD toolkit for flashing and testing embedded devices

Project description

bmlab-toolkit

Toolkit for flashing and testing embedded devices.

Features

  • Flash embedded devices (currently supports JLink)
  • List and detect connected programmers
  • Automatic STM32 device detection (F1/F4/F7/G0 series)
  • Support for multiple firmware formats (.hex, .bin)
  • Real-Time Transfer (RTT) support - Connect to device RTT for real-time communication
  • Single unified command-line interface
  • Extensible architecture for supporting additional programmers

Installation

pip install bmlab-toolkit

Installation CLI autocomplete

activate-global-python-argcomplete
eval "$(register-python-argcomplete bml)"

Usage

Command Line

List connected programmers:

bml scan
# or specify programmer type
bml scan --programmer jlink

Flash a device with auto-detected programmer (uses first available JLink):

bml flash <firmware_file>

Flash with specific serial number:

bml flash <firmware_file> --serial <serial_number>

Flash with specific MCU:

bml flash <firmware_file> --mcu STM32F765ZG

Flash multiple devices via IP addresses (parallel):

bml flash firmware.bin --ip 192.168.1.100 192.168.1.101 192.168.1.102 --mcu STM32F765ZG

Flash multiple devices via USB serial (sequential due to USB driver limitations):

bml flash firmware.bin --serial 123456 789012 345678 --mcu STM32F103RE

Specify programmer explicitly:

bml flash <firmware_file> --programmer jlink --serial 123456

Get help:

bml flash --help

RTT (Real-Time Transfer)

Connect to RTT for real-time communication with the target device:

# Connect with auto-detection and read indefinitely (Ctrl+C to stop)
bml rtt

# Specify programmer serial number
bml rtt --serial 123456789

# Connect via IP address (no MCU needed)
bml rtt --ip 192.168.1.100

# Specify MCU explicitly
bml rtt --mcu STM32F765ZG

# Read for 10 seconds
bml rtt -t 10

# Send message after connection
bml rtt --msg "hello\n"

# Send message after custom delay
bml rtt --msg "test" --msg-timeout 2.0

# Connect without resetting target
bml rtt --no-reset

# Verbose output
bml rtt -v

# Specify programmer explicitly (default: jlink)
bml rtt --programmer jlink --serial 123456

# Monitor multiple devices via IP (parallel, saves logs to files)
bml rtt --ip 192.168.1.100 192.168.1.101 192.168.1.102 --output-dir rtt_logs --timeout 10

# Monitor multiple devices via USB (sequential, saves logs to files)
bml rtt --serial 123456 789012 --mcu STM32F103RE --output-dir rtt_logs --timeout 10

Note: Multiple devices require --output-dir. Logs are saved as rtt_192_168_1_100.log or rtt_serial_123456.log.

Get RTT help:

bml rtt --help

Erasing Flash Memory

Erase flash memory on a device:

# Erase with auto-detected device
bml erase --mcu STM32F103RE

# Erase specific device by serial
bml erase --serial 123456 --mcu STM32F103RE

# Erase device via IP
bml erase --ip 192.168.1.100 --mcu STM32F765ZG

# Erase multiple devices via IP (parallel)
bml erase --ip 192.168.1.100 192.168.1.101 192.168.1.102 --mcu STM32F103RE

# Erase multiple devices via USB (sequential)
bml erase --serial 123456 789012 345678 --mcu STM32F103RE

Scanning for Devices

Scan for USB-connected JLink devices:

bml scan

Scan network for JLink Remote Servers:

# Scan entire network
bml scan --network 192.168.1.0/24

# Scan specific IP range (last octet)
bml scan --network 192.168.1.0/24 --start-ip 100 --end-ip 150

# With debug output
bml scan --network 192.168.1.0/24 --log-level DEBUG

Python API

Flashing

from bmlab_toolkit import JLinkProgrammer

# Create programmer instance (auto-detect serial)
prog = JLinkProgrammer()

# Or specify serial number
prog = JLinkProgrammer(serial=123456789)

# Flash firmware (auto-detect MCU)
prog.flash("firmware.hex")

# Flash with specific MCU
prog.flash("firmware.hex", mcu="STM32F765ZG")

# Flash without reset
prog.flash("firmware.hex", reset=False)

RTT Communication

from bmlab_toolkit import JLinkProgrammer
import time

# Create programmer
prog = JLinkProgrammer(serial=123456789)

try:
    # Reset device (optional)
    prog.reset(halt=False)
    time.sleep(0.5)
    
    # Start RTT
    prog.start_rtt(delay=1.0)
    
    # Send data
    prog.rtt_write(b"Hello, device!\n")
    
    # Read data
    data = prog.rtt_read(max_bytes=4096)
    if data:
        print(data.decode('utf-8', errors='replace'))
    
    # Stop RTT
    prog.stop_rtt()
    
finally:
    # Disconnect
    prog._disconnect_target()

Development

# Install in editable mode with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

Currently Supported

Programmers

  • JLink (via pylink-square)

Devices

  • STM32F1 series (Low/Medium/High/XL density, Connectivity line)
  • STM32F4 series (F405/407/415/417, F427/429/437/439)
  • STM32F7 series (F74x/75x, F76x/77x)
  • STM32G0 series (G0x0, G0x1, G0Bx/G0Cx)

Roadmap

Planned Features

  • Device Testing - Automated testing capabilities

    • Run tests on connected devices
    • Collect and analyze test results via RTT
    • Generate test reports
  • Additional Programmers

    • ST-Link support
    • OpenOCD support
    • Custom programmer interfaces

Extending with New Programmers

The library is organized into functional modules:

  • constants.py - Programmer type constants
  • list_devices.py - Device detection and listing functionality
  • flashing.py - Flashing operations
  • jlink_device_detector.py - STM32-specific device detection

To add support for a new programmer:

  1. Add the programmer constant to src/bmlab_toolkit/constants.py:
PROGRAMMER_STLINK = "stlink"
SUPPORTED_PROGRAMMERS = [PROGRAMMER_JLINK, PROGRAMMER_STLINK]
  1. Implement device listing in src/bmlab_toolkit/list_devices.py:
def _get_stlink_devices() -> List[Dict[str, Any]]:
    # Implementation here
    pass

# Update get_connected_devices() function to handle new programmer
  1. Implement flashing function in src/bmlab_toolkit/flashing.py:
def _flash_with_stlink(serial: int, fw_file: str, mcu: str = None) -> None:
    # Implementation here
    pass

# Add case in flash_device_by_usb()
elif programmer_lower == PROGRAMMER_STLINK:
    _flash_with_stlink(serial, fw_file, mcu)
  1. Update documentation and tests

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bmlab_toolkit-0.2.2.tar.gz (30.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bmlab_toolkit-0.2.2-py3-none-any.whl (23.5 kB view details)

Uploaded Python 3

File details

Details for the file bmlab_toolkit-0.2.2.tar.gz.

File metadata

  • Download URL: bmlab_toolkit-0.2.2.tar.gz
  • Upload date:
  • Size: 30.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for bmlab_toolkit-0.2.2.tar.gz
Algorithm Hash digest
SHA256 b81a5dc3b62ae252e7b200ea9a18b73aee24a7d89f21fc92bad014a840021c40
MD5 c73884b9e2b30117046f38dfed921a93
BLAKE2b-256 0d9f0aaa4487ae396800620b7b57f39a8f623aed74dd11a9785ccb5838846f42

See more details on using hashes here.

File details

Details for the file bmlab_toolkit-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: bmlab_toolkit-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 23.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for bmlab_toolkit-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 74c0b431a336ee1c59a3862df853990617575fbbd33f59019c30ce19fa796b1c
MD5 f255cdf6c38b28f4b8d9913ff2fed04a
BLAKE2b-256 41c82684fe8e7a36001d67142fd57dc0834b521301c58401d88c6b486d335d0c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page