diff --git a/bootloader/crc_patch.py b/bootloader/crc_patch.py
index 59ec6befb14a5dc625139e8042363ce2ac86f3ed..7d93353d507531c097a3e69d2186c15c1b8ebded 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__":