The most advanced SDK workflow involves writing a new firmware image into a non-volatile flash slot and orchestrating the subsequent system reboot. The field_update_e2e.py script performs this safely by incorporating strict image validation, overwrite protection, and post-flash proof-of-life checks.
Relevant script:
field_update_e2e.py.bin image for the target instrument. The loader accepts <NAME>_<VERSION>.bin, where NAME is four ASCII alphanumeric characters and VERSION is an unsigned decimal integer. Use the current image from the firmware catalogue: Z080_nnn.bin for a UTT810, K168_nnn.bin for a UTT160810. The SDK bundles the current catalogue in its firmware/ folder (Z080_004.bin and K168_004.bin with firmware_manifest.json); a newer catalogue may be published as a firmware-catalog-N release. Verify the catalogue checksum and target compatibility; there is no generic extended-filename/binary-header fallback in this workflow.VALID slot or the designated default slot without explicit command-line override flags.device.load_field_update_image(). Its synchronous progress callback supplies NexatomFieldUpdateProgress: phase, percentage, bytes and slot information. Phases include sending the image, programming and verifying; the phase table gives the public numeric values. Check the operation’s result, not just its last progress percentage.device.set_field_update_default_slot_with_status().device.boot_field_update_slot() establishes runtime readiness on the same handle. The example additionally closes/reopens and, unless skipped, requests a brief CPS/telemetry data check. That diagnostic reconnect is separate from the native boot operation. Inspect the resulting profile to establish the active device/application contract.To run the field update script, the safety flag --i-understand-this-writes-firmware must be explicitly provided.
python python/examples/field_update_e2e.py `
--home . `
--image "firmware/Z080_004.bin" `
--slot 1 `
--boot-after-load `
--i-understand-this-writes-firmware
Substitute the supplied image and an appropriate reported slot before running. Add --set-default-after-load only if you intend to change persistent boot preference. Linux uses the same arguments on one line (or shell backslash continuation instead of PowerShell backticks).
Illustrative progress: the script prints numeric phase values and actual byte counts; these lines show their form rather than a measured result.
Using first discovered NexatomTT device:
serial_number: 000000000001
firmware_version: X.X.X
hardware_version: X.X
device_name: UTT810
connection_type: FTDI
connection_id: usb:PCIROOT(0)#PCI(0801)#PCI(0004)#USBROOT(0)#USB(4)
Connecting to hardware and checking protocol mode.
Runtime firmware detected; requesting field-upgrade service entry.
Field-update status: slot_count=2 default_slot=0
slot 0: state=VALID version=1 default=True name=0x00000000
slot 1: state=EMPTY version=0 default=False name=0x00000000
Loading firmware/Z080_004.bin into slot 1.
phase=5 percent=<progress> bytes=<sent>/<total> slot=1 ...
phase=6 percent=<progress> bytes=<sent>/<total> slot=1 ...
phase=7 percent=<progress> bytes=<sent>/<total> slot=1 ...
Booting slot 1.
Reconnecting after boot and running runtime proof of life.
CPS total=0 period_ms=1000
Telemetry seq=1 uptime_s=5
Runtime proof callbacks: cps=<count> telemetry=<count>
Firmware image loading workflow complete.
Keep power and USB connected while programming. The example refuses writes without --i-understand-this-writes-firmware, protects valid/pending slots unless --allow-valid-slot-overwrite is supplied, and separately protects the default slot. Review those choices before loading; a bootable old image is useful for recovery. This tutorial changes firmware, whereas the ordinary acquisition and boot_runtime.py examples do not.