efm8

Flash via AN945: EFM8 Factory Bootloader HID.

Usage

Communication is over USB-HID. This is implemented via the hidapi pthon wrapper for the hidapi native library.

On linux you can use udev to grant access:

echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="10c4", MODE="0666"' | sudo tee /etc/udev/rules.d/70-silabs.rules
udevadm trigger
efm8 firmware.hex

Also includes an example that resets a https://u2fzero.com/ into the bootloader and flashes in one command.

u2fzero firmware.hex

And a way to (slowly) read the firmware back

efm8_read firmware.hex

Installation

sudo apt install libusb-1.0-0-dev libudev-dev
python3 -m pip install efm8

efm8

Flash via AN945: EFM8 Factory Bootloader HID.

usage: efm8 [-h] [-p PRODUCT] [-s SERIAL] firmware
firmware

Intel Hex format file to flash

-h, --help

show this help message and exit

-p <product>, --product <product>

USB Product ID of device to program

-s <serial>, --serial <serial>

Serial number of device to program


The protocol is documented in AN945.

Flash via AN945: EFM8 Factory Bootloader HID.

exception efm8.BadChecksum

Checksum mismatch.

exception efm8.BadResponse

Command not confirmed.

exception efm8.Unsupported

Input file not understood.

efm8.crc(data)

CITT-16, XModem.

efm8.create_frame(cmd, data)

Bootloader frames start with ‘$’, 1 byte length, 1 byte command, x bytes data.

efm8.flash(manufacturer, product, serial, frames)

Send bootloader frames over HID, and check confirmations.

efm8.read_flash(manufacturer, product, serial, length)

Exploit CRC to read back firmware.

efm8.read_intel_hex(filename)

Read simple Intel format Hex files into byte array.

efm8.to_frames(data, checksum=True, run=True)

Convert firmware byte array into sequence of bootloader frames.

efm8.toaddr(addr)

Split a 16bit address into two bytes (dosn’t check it is a 16bit address ;-).

efm8.tostr(buf)

Ensure we have str across python versions.

efm8.twos_complement(input_value, num_bits=8)

Calculate unsigned int which binary matches the two’s complement of the input.

efm8.write_hex(buf, filename)

Write an Intel Format Hex file.

efm8_read

Flash via AN945: EFM8 Factory Bootloader HID.

usage: efm8_read [-h] [-p PRODUCT] [-s SERIAL] [-l LENGTH] firmware
firmware

Intel Hex format file to flash

-h, --help

show this help message and exit

-p <product>, --product <product>

USB Product ID of device to program

-s <serial>, --serial <serial>

Serial number of device to program

-l <length>, --length <length>

Length to read

u2fzero

Extra utils for U2F-Zero devices.

usage: u2fzero [-h] [-p PRODUCT] [-s SERIAL] firmware
firmware

Intel Hex format file to flash

-h, --help

show this help message and exit

-p <product>, --product <product>

USB Product ID of device to program

-s <serial>, --serial <serial>

Serial number of device to program


Extra utils for U2F-Zero devices.

efm8.u2fzero.main()

Command line.

efm8.u2fzero.reset(manufacturer, product, serial)

Send zeroU2F jump to bootloader, trigger the host to see the device change.

Indices and tables