The firmware of this GPON ONT SFP module can be updated using the web interface (Management | Update Software):
The web interface only accepts image files with a special header. These can be created by adding the header to a flash dump.
.img unmodified mtd2 / mtd3 flash dump
.upf with header (can be installed using the web interface)
V1.00 is based on OpenWrt 12.09. Deutsche Telekom (Germany) seems to stick with this branch.
V1.00(ABVJ.0)b3s (2020-12-23)
V1.00(ABVJ.0)b3v (2021-05-08)
V1.00(ABVJ.1)b1e (2023-07-26) (no ssh)
V1.00(ABVJ.1)b1i (2026-02-06) (no ssh, known compatibility issues)
V2.50 is based on OpenWrt 14.07. Wind Tre (Italy) upgraded to this branch at the end of 2022.
V2.50(ABVJ.1)b1d (2023-04-21)
V2.50(ABVJ.1)b1f (2023-07-14)
Both branches are maintained separately, so a 1.00 image can have a later build date than a 2.50 image.
Create flash dump of mtd2 or mtd3 (Image A / Image B):
dd if=/dev/mtd2 of=/tmp/mtd2
Download flash dump from SFP (e. g. using TFTP).
Download header file and add it to flash dump:
cat header mtd2 > firmware.upf
Copy software version string from flash dump to header:
dd if=firmware.upf of=firmware.upf bs=1 skip=632 seek=124 count=32 conv=notrunc
Get CRC32 of firmware.upf:
v=$(cat firmware.upf | gzip | tail -c 8 | head -c 4 | hexdump -e '1/4 "%08x"')
Convert CRC32 to binary and write it to header:
echo -e -n "\x${v:0:2}\x${v:2:2}\x${v:4:2}\x${v:6:2}" | dd of=firmware.upf bs=1 seek=104 conv=notrunc

@github-tomster
The module has two firmware partitions, an active and an inactive one. Performing an upgrade / downgrade writes the new image to the inactive partition and then makes it active. So there are always two images installed and you can dump both of them, no matter which one is currently active.
Example:
V1.00(ABVJ.1)b1i is in mtd2 (Image A) and currently active. You then downgrade to V1.00(ABVJ.0)b3v using the web interface, which will write the image to mtd3 (Image B). After the reboot, mtd3 (Image B) is active and V1.00(ABVJ.0)b3v is running. But V1.00(ABVJ.1)b1i is still in mtd2 and can be dumped.
Of course it can be the other way around (V1.00(ABVJ.1)b1i in mtd3 and V1.00(ABVJ.0)b3v in mtd2), this you'll have to check.