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