From 4d3ca4494c260b0f6a7e0983f452bb4bdf969e99 Mon Sep 17 00:00:00 2001 From: Jakob Haufe <sur5r@sur5r.net> Date: Thu, 19 Sep 2019 22:56:40 +0000 Subject: [PATCH] fix(crc-patch): Autodetect Python crc16 implementation There are several common CRC implementations for Python with the currently used one (crc16) not being available in e.g. Debian. crcmod and/or crcelk are readily available on several distributions. --- bootloader/crc_patch.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/bootloader/crc_patch.py b/bootloader/crc_patch.py index 59ec6bef..7d93353d 100755 --- a/bootloader/crc_patch.py +++ b/bootloader/crc_patch.py @@ -1,19 +1,37 @@ #!/usr/bin/env python3 import sys -import crc16 + +try: + import crc16 + + crcfun = crc16.crc16xmodem +except ImportError: + try: + import crcmod + + crcfun = crcmod.predefined.mkCrcFun("xmodem") + except ImportError: + try: + import crcelk + + crcfun = crcelk.CRC_XMODEM.calc_bytes + except ImportError: + raise Exception( + "Could not find a CRC implementation. Tried: crc16, crcmod, crcelk." + ) def main(): - data = open(sys.argv[1], 'rb').read() - crc = crc16.crc16xmodem(data) + data = open(sys.argv[1], "rb").read() + crc = crcfun(data) # print(crc) padded = data + bytes([crc >> 8, crc & 0xFF]) - crc = crc16.crc16xmodem(padded) + crc = crcfun(padded) # print(crc) - open(sys.argv[1], 'wb').write(padded) + open(sys.argv[1], "wb").write(padded) if __name__ == "__main__": -- GitLab