Warning

This documentation is actively being updated as the project evolves and may not be complete in all areas.

XCP Driver

jumpstarter-driver-xcp provides XCP (Universal Measurement and Calibration Protocol) support for Jumpstarter, enabling remote measurement, calibration, DAQ (data acquisition), and programming of XCP-enabled ECUs.

It wraps the pyXCP library and supports Ethernet (TCP/UDP), CAN, USB, and Serial (SxI) transports.

Installation

pip3 install --extra-index-url https://pkg.jumpstarter.dev/simple/ jumpstarter-driver-xcp

Configuration

Ethernet (TCP)

export:
  xcp:
    type: jumpstarter_driver_xcp.driver.Xcp
    config:
      transport: ETH
      host: "192.168.1.100"
      port: 5555
      protocol: TCP

Ethernet (UDP)

export:
  xcp:
    type: jumpstarter_driver_xcp.driver.Xcp
    config:
      transport: ETH
      host: "192.168.1.100"
      port: 5555
      protocol: UDP

CAN

export:
  xcp:
    type: jumpstarter_driver_xcp.driver.Xcp
    config:
      transport: CAN
      can_interface: vector
      channel: 0
      bitrate: 500000
      can_id_master: 0x7E0
      can_id_slave: 0x7E1

Using a pyXCP Config File

For advanced configuration (seed & key, DAQ policies, etc.), provide a pyXCP configuration file:

export:
  xcp:
    type: jumpstarter_driver_xcp.driver.Xcp
    config:
      transport: ETH
      config_file: /path/to/xcp_config.py

Configuration Parameters

Parameter

Type

Default

Description

transport

str

ETH

Transport layer: ETH, CAN, USB, SXI

host

str

localhost

IP address or hostname (Ethernet only)

port

int

5555

Port number (Ethernet only)

protocol

str

TCP

TCP or UDP (Ethernet only)

can_interface

str

None

python-can interface name (CAN only)

channel

str|int

None

CAN channel (CAN only)

bitrate

int

None

CAN bitrate in bits/s (CAN only)

can_id_master

int

None

CAN ID for master -> slave (CAN only)

can_id_slave

int

None

CAN ID for slave -> master (CAN only)

config_file

str

None

Path to a pyXCP config file (overrides individual params)

API Reference

Session Management

  • connect(mode=0) - Connect to the XCP slave, returns negotiated properties

  • disconnect() - Disconnect from the XCP slave

  • get_id(id_type=1) - Get the slave identifier

  • get_status() - Get session status and resource protection

Security

  • unlock(resources=None) - Perform seed & key unlock for protected resources

Memory Access (Measurement / Calibration)

  • upload(length, address, ext=0) - Read memory from the slave

  • download(address, data, ext=0) - Write data to the slave memory

  • set_mta(address, ext=0) - Set the Memory Transfer Address

  • build_checksum(block_size) - Compute checksum over a memory block

DAQ (Data Acquisition)

  • get_daq_info() - Get DAQ processor, resolution, and event channel info

  • free_daq() - Free all DAQ lists

  • alloc_daq(daq_count) - Allocate DAQ lists

  • alloc_odt(daq_list_number, odt_count) - Allocate ODTs

  • alloc_odt_entry(daq_list_number, odt_number, odt_entries_count) - Allocate ODT entries

  • set_daq_ptr(daq_list, odt, entry) - Set DAQ list pointer

  • write_daq(bit_offset, size, ext, address) - Configure what to measure

  • set_daq_list_mode(mode, daq_list, event, prescaler, priority) - Set DAQ list mode

  • start_stop_daq_list(mode, daq_list) - Start/stop a single DAQ list

  • start_stop_synch(mode) - Start/stop all DAQ lists synchronously

Programming (Flashing)

  • program_start() - Begin programming sequence

  • program_clear(clear_range, mode=0) - Erase memory range

  • program(data, block_length=0) - Download program data

  • program_reset() - Reset slave after programming

Example Usage

from jumpstarter.common.utils import env

with env() as client:
    xcp = client.xcp

    info = xcp.connect()
    print(f"Max CTO: {info.max_cto}, Max DTO: {info.max_dto}")

    xcp.unlock()

    data = xcp.upload(4, 0x1000)
    print(f"Memory at 0x1000: {data.hex()}")

    xcp.download(0x2000, b"\x42\x00\x00\x00")

    xcp.disconnect()