FWUP(1)

πŸ“¦ version 1.15.0, in alpine 3.24

πŸ‘‘ fwup(1) β€” like, the manual page, bestie ✨

okay so before we even get into it: this is fwup, it lives in the User Commands corner of the manual-verse, and it's genuinely one of those tools that ate and left no crumbs πŸ’…. Let's get into it fr fr.


🌸 NAME 🌸

fwup β€” the configurable embedded firmware update creator and runner. yes, both. she does it all 🫢


✨ SYNOPSIS ✨

fwup [OPTION]...

that's it. that's the whole vibe. options go in, firmware magic comes out πŸŽ€


πŸ¦‹ DESCRIPTION πŸ¦‹

so fwup is a self-contained utility for creating and applying firmware update files. and like β€” what even is a firmware update file? bestie, listen: .fw files are literally nothing more than zip archives containing metadata, a limited set of instructions, and data. no cap. that's the whole secret 🀫

and where does it run? on an embedded device or on a host PC β€” either one, she's flexible like that 😌. fwup is used to write nonvolatile memory (eMMC, SDCards, etc.) in such a way as to upgrade the firmware on the device, or to completely initialize it. it's giving main character energy for your storage media, honestly πŸ‘‘


πŸ’– OPTIONS πŸ’–

like yes there are a lot of them, but each one is iconic in her own way:

  • -a, --apply β€” applies the firmware update. do the thing πŸ”₯
  • -c, --create β€” creates the firmware update. make the thing πŸŽ€
  • -d <file> β€” the device file for the memory card
  • -D, --detect β€” lists attached SDCards or MMC devices, plus their sizes. a little headcount for your hardware πŸ’…
  • -E, --eject β€” ejects removable media after successfully writing firmware
  • --no-eject β€” do not eject media after writing firmware
  • --enable-trim β€” enables use of the hardware TRIM command ✨
  • --exit-handshake β€” sends a Ctrl+Z on exit and waits for stdin to close (Erlang)
  • -f <fwup.conf> β€” specifies the firmware update configuration file
  • -F, --framing β€” applies framing on stdin/stdout
  • -g, --gen-keys β€” generates firmware signing keys (fwup-key.pub and fwup-key.priv, or specify with -o)
  • -i <input.fw> β€” specifies the input firmware update file (use - for stdin)
  • -l, --list β€” lists the available tasks in a firmware update πŸ—’οΈ
  • --max-size <blocks> β€” max size of the destination in 512-byte blocks (usually automatic)
  • -m, --metadata β€” prints metadata in the firmware update
  • --metadata-key <key> β€” only outputs the specified key's value when printing metadata
  • --minimize-writes β€” skips the write if contents match the destination. savings, queen πŸ’Έ
  • --no-minimize-writes β€” doesn't try to minimize writes when applying firmware updates (default)
  • -n β€” reports numeric progress
  • -o <output.fw> β€” specifies the output file when creating an update (use - for stdout)
  • -p, --public-key-file <keyfile> β€” a public key file for verifying firmware updates (can specify multiple times)
  • --private-key <key> β€” a private key for signing firmware updates
  • --progress-low <number> β€” when displaying progress, this is the lowest number (normally 0 for 0%)
  • --progress-high <number> β€” when displaying progress, this is the highest number (normally 100 for 100%)
  • --public-key <key> β€” a public key for verifying firmware updates (can specify multiple times)
  • -q, --quiet β€” quiet 🀐
  • --reboot-param-path β€” path to write reboot parameters (defaults to systemd and Nerves locations)
  • -s, --private-key-file <keyfile> β€” a private key file for signing firmware updates
  • -S, --sign β€” signs an existing firmware file (specify -i and -o)
  • --sparse-check <path> β€” checks if the OS and file system support sparse files at path
  • --sparse-check-size <bytes> β€” hole size to check for --sparse-check
  • -t, --task <task> β€” task to apply within the firmware update
  • -u, --unmount β€” unmounts all partitions on the device first
  • -U, --no-unmount β€” does not try to unmount partitions on the device
  • --unsafe β€” allows unsafe commands (consider applying only signed archives ⚠️)
  • -v, --verbose β€” verbose πŸ—£οΈ
  • -V, --verify β€” verifies an existing firmware file (specify -i)
  • --verify-writes β€” verifies writes when applying firmware updates to detect corruption (default for writing to device files)
  • --no-verify-writes β€” does not verify writes when applying firmware updates (default for regular files)
  • --version β€” prints out the version
  • -y β€” accepts automatically found memory card when applying a firmware update
  • -z β€” prints the memory card that would be automatically detected, then exits
  • -1 β€” fast compression (for create)
  • -9 β€” best compression (default)
lowkey important: --unsafe literally says allow unsafe commands in the description, and it comes with the parenthetical advice to consider applying only signed archives. read that twice, bestie πŸ™ˆ

🌈 EXAMPLES 🌈

initialize an attached SDCard using all of the default options:

$ fwup myfirmware.fw

create a firmware update archive:

$ fwup -c -f fwup.conf -o myfirmware.fw

apply the firmware to an attached SDCard

this would normally be run on the host, where it would auto-detect an SDCard and initialize it using the complete task:

$ fwup -a -i myfirmware.fw -t complete

apply the firmware update to /dev/sdc and specify the upgrade task:

$ fwup -a -d /dev/sdc -i myfirmware.fw -t upgrade

create an image file from a .fw file for use with dd(1):

$ fwup -a -d myimage.img -i myfirmware.fw -t complete

generate a public/private key pair:

$ fwup -g

store fwup-key.priv in a safe place πŸ” and fwup-key.pub on the target. to sign an existing archive, run:

$ fwup -S -s fwup-key.priv -i myfirmware.fw -o signedfirmware.fw

also see the unit tests that come with fwup source code for more examples πŸ‘€. obtain source code and report bugs at https://github.com/fwup-home/fwup.


🧚 AUTHOR 🧚

Written by Frank Hunleth.


πŸ’€ REPORTING BUGS πŸ’€

please report any bugs on the project page at <https://github.com/fwup-home/fwup> 🫢


not the bug-report section being the shortest one 😭 anyway

okay that's the whole page, you ate that ngl πŸ’œ β€” this was fwup version 1.15.0, dated March 2026, and that's the FWUP(1) manual page, periodt. πŸŒΈβœ¨πŸŽ€

πŸ“¦ where this page comes from