summaryrefslogtreecommitdiff
path: root/bootloader/ota-dfu-python/dfu.py
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader/ota-dfu-python/dfu.py')
-rwxr-xr-xbootloader/ota-dfu-python/dfu.py188
1 files changed, 188 insertions, 0 deletions
diff --git a/bootloader/ota-dfu-python/dfu.py b/bootloader/ota-dfu-python/dfu.py
new file mode 100755
index 00000000..207962d0
--- /dev/null
+++ b/bootloader/ota-dfu-python/dfu.py
@@ -0,0 +1,188 @@
+#!/usr/bin/env python3
+"""
+------------------------------------------------------------------------------
+ DFU Server for Nordic nRF51 based systems.
+ Conforms to nRF51_SDK 11.0 BLE_DFU requirements.
+------------------------------------------------------------------------------
+"""
+import os, re
+import sys
+import optparse
+import time
+import math
+import traceback
+
+from unpacker import Unpacker
+
+from ble_secure_dfu_controller import BleDfuControllerSecure
+from ble_legacy_dfu_controller import BleDfuControllerLegacy
+
+def main():
+
+ init_msg = """
+ ================================
+ == ==
+ == DFU Server ==
+ == ==
+ ================================
+ """
+
+ # print "DFU Server start"
+ print(init_msg)
+
+ try:
+ parser = optparse.OptionParser(usage='%prog -f <hex_file> -a <dfu_target_address>\n\nExample:\n\tdfu.py -f application.hex -d application.dat -a cd:e3:4a:47:1c:e4',
+ version='0.5')
+
+ parser.add_option('-a', '--address',
+ action='store',
+ dest="address",
+ type="string",
+ default=None,
+ help='DFU target address.'
+ )
+
+ parser.add_option('-f', '--file',
+ action='store',
+ dest="hexfile",
+ type="string",
+ default=None,
+ help='hex file to be uploaded.'
+ )
+
+ parser.add_option('-d', '--dat',
+ action='store',
+ dest="datfile",
+ type="string",
+ default=None,
+ help='dat file to be uploaded.'
+ )
+
+ parser.add_option('-z', '--zip',
+ action='store',
+ dest="zipfile",
+ type="string",
+ default=None,
+ help='zip file to be used.'
+ )
+
+ parser.add_option('--secure',
+ action='store_true',
+ dest='secure_dfu',
+ default=True,
+ help='Use secure bootloader (Nordic SDK > 12)'
+ )
+
+ parser.add_option('--legacy',
+ action='store_false',
+ dest='secure_dfu',
+ help='Use secure bootloader (Nordic SDK < 12)'
+ )
+
+ options, args = parser.parse_args()
+
+ except Exception as e:
+ print(e)
+ print("For help use --help")
+ sys.exit(2)
+
+ try:
+
+ ''' Validate input parameters '''
+
+ if not options.address:
+ parser.print_help()
+ exit(2)
+
+ unpacker = None
+ hexfile = None
+ datfile = None
+
+ if options.zipfile != None:
+
+ if (options.hexfile != None) or (options.datfile != None):
+ print("Conflicting input directives")
+ exit(2)
+
+ unpacker = Unpacker()
+ #print options.zipfile
+ try:
+ hexfile, datfile = unpacker.unpack_zipfile(options.zipfile)
+ except Exception as e:
+ print("ERR")
+ print(e)
+ pass
+
+ else:
+ if (not options.hexfile) or (not options.datfile):
+ parser.print_help()
+ exit(2)
+
+ if not os.path.isfile(options.hexfile):
+ print("Error: Hex file doesn't exist")
+ exit(2)
+
+ if not os.path.isfile(options.datfile):
+ print("Error: DAT file doesn't exist")
+ exit(2)
+
+ hexfile = options.hexfile
+ datfile = options.datfile
+
+
+ ''' Start of Device Firmware Update processing '''
+
+ if options.secure_dfu:
+ ble_dfu = BleDfuControllerSecure(options.address.upper(), hexfile, datfile)
+ else:
+ ble_dfu = BleDfuControllerLegacy(options.address.upper(), hexfile, datfile)
+
+ # Initialize inputs
+ ble_dfu.input_setup()
+
+ # Connect to peer device. Assume application mode.
+ if ble_dfu.scan_and_connect():
+ if not ble_dfu.check_DFU_mode():
+ print("Need to switch to DFU mode")
+ success = ble_dfu.switch_to_dfu_mode()
+ if not success:
+ print("Couldn't reconnect")
+ else:
+ # The device might already be in DFU mode (MAC + 1)
+ ble_dfu.target_mac_increase(1)
+
+ # Try connection with new address
+ print("Couldn't connect, will try DFU MAC")
+ if not ble_dfu.scan_and_connect():
+ raise Exception("Can't connect to device")
+
+ ble_dfu.start()
+
+ # Disconnect from peer device if not done already and clean up.
+ ble_dfu.disconnect()
+
+ except Exception as e:
+ # print traceback.format_exc()
+ print("Exception at line {}: {}".format(sys.exc_info()[2].tb_lineno, e))
+ pass
+
+ except:
+ pass
+
+ # If Unpacker for zipfile used then delete Unpacker
+ if unpacker != None:
+ unpacker.delete()
+
+ print("DFU Server done")
+
+"""
+------------------------------------------------------------------------------
+
+------------------------------------------------------------------------------
+"""
+if __name__ == '__main__':
+
+ # Do not litter the world with broken .pyc files.
+ sys.dont_write_bytecode = True
+
+ main()