From d8a5fcbc1cc335e81e293f938738b3125a6f8a00 Mon Sep 17 00:00:00 2001
From: Jakob Haufe <jakob@haufe.it>
Date: Fri, 6 Sep 2019 13:10:00 +0200
Subject: [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 | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/bootloader/crc_patch.py b/bootloader/crc_patch.py
index 59ec6bef..4ba61e8e 100755
--- a/bootloader/crc_patch.py
+++ b/bootloader/crc_patch.py
@@ -1,16 +1,29 @@
 #!/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)
+    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)
-- 
GitLab