def thread(package, port, address, server_port, panid, channel, jlink_snr, flash_connectivity, sim, rate, reset_suppress): """ Perform a Device Firmware Update on a device that supports Thread DFU. This requires a second nRF device, connected to this computer, with Thread Network CoProcessor (NCP) firmware loaded. The NCP device will perform the DFU procedure onto the target device. """ ble_driver_init('NRF52') from nordicsemi.thread import tncp from nordicsemi.thread.dfu_thread import create_dfu_server from nordicsemi.thread.tncp import NCPTransport from nordicsemi.thread.ncp_flasher import NCPFlasher mcast_dfu = False if address is None: address = ipaddress.ip_address(u"ff03::1") click.echo("Address not specified. Using ff03::1 (all Thread nodes)") else: try: address = ipaddress.ip_address(address) mcast_dfu = address.is_multicast except: click.echo("Invalid IPv6 address") return 1 if (not sim): if port is None and jlink_snr is None: click.echo("Please specify serial port or Jlink serial number.") return 2 elif port is None: port = get_port_by_snr(jlink_snr) if port is None: click.echo("\nNo Segger USB CDC ports found, please connect your board.") return 3 stream_descriptor = 'u:' + port click.echo("Using connectivity board at serial port: {}".format(port)) else: stream_descriptor = 'p:' + Flasher.which('ot-ncp') + ' 30' click.echo("Using ot-ncp binary: {}".format(stream_descriptor)) if flash_connectivity: flasher = NCPFlasher(serial_port=port, snr = jlink_snr) if flasher.fw_check(): click.echo("Board already flashed with connectivity firmware.") else: click.echo("Flashing connectivity firmware...") flasher.fw_flash() click.echo("Connectivity firmware flashed.") flasher.reset() # Delay is required because NCP needs time to initialize. time.sleep(1.0) config = tncp.NCPTransport.get_default_config() if (panid): config[tncp.NCPTransport.CFG_KEY_PANID] = panid if (channel): config[tncp.NCPTransport.CFG_KEY_CHANNEL] = channel if (flash_connectivity): config[tncp.NCPTransport.CFG_KEY_RESET] = False opts = type('DFUServerOptions', (object,), {})() opts.rate = rate opts.reset_suppress = reset_suppress opts.mcast_dfu = mcast_dfu transport = NCPTransport(server_port, stream_descriptor, config) dfu = create_dfu_server(transport, package, opts) try: sighandler = lambda signum, frame : transport.close() signal.signal(signal.SIGINT, sighandler) signal.signal(signal.SIGTERM, sighandler) transport.open() # Delay DFU trigger until NCP promotes to a router (6 seconds by default) click.echo("Waiting for NCP to promote to a router...") time.sleep(6.0) dfu.trigger(address, 3) click.echo("Thread DFU server is running... Press <Ctrl + D> to stop.") pause() click.echo("Terminating") except Exception as e: logger.exception(e) finally: transport.close()
def thread(package, port, address, server_port, prefix, panid, channel, jlink_snr, flash_connectivity, sim): ble_driver_init('NRF52') from nordicsemi.thread import tncp from nordicsemi.thread.dfu_thread import create_dfu_server from nordicsemi.thread.tncp import NCPTransport from nordicsemi.thread.ncp_flasher import NCPFlasher """Perform a Device Firmware Update on a device with a bootloader that supports Thread DFU.""" if address is None: address = ipaddress.ip_address(u"ff03::1") click.echo("Address not specified. Using ff03::1 (all Thread nodes)") else: try: address = ipaddress.ip_address(address) except: click.echo("Invalid IPv6 address") return if (not sim): if port is None and jlink_snr is None: click.echo("Please specify serial port or Jlink serial number.") return elif port is None: port = get_port_by_snr(jlink_snr) if port is None: click.echo("\nNo Segger USB CDC ports found, please connect your board.") return stream_descriptor = 'u:' + port logger.info("Using connectivity board at serial port: {}".format(port)) else: stream_descriptor = 'p:' + Flasher.which('ot-ncp') + ' 30' logger.info("Using ot-ncp binary: {}".format(stream_descriptor)) if flash_connectivity: flasher = NCPFlasher(serial_port=port, snr = jlink_snr) if flasher.fw_check(): click.echo("Board already flashed with connectivity firmware.") else: click.echo("Flashing connectivity firmware...") flasher.fw_flash() click.echo("Connectivity firmware flashed.") flasher.reset() # Delay is required because NCP needs time to initialize. time.sleep(1.0) config = tncp.NCPTransport.get_default_config() if (panid): config[tncp.NCPTransport.CFG_KEY_PANID] = panid if (channel): config[tncp.NCPTransport.CFG_KEY_CHANNEL] = channel if (flash_connectivity): config[tncp.NCPTransport.CFG_KEY_RESET] = False transport = NCPTransport(server_port, stream_descriptor, config) dfu = create_dfu_server(transport, package, prefix) try: sighandler = lambda signum, frame : dfu.stop signal.signal(signal.SIGINT, sighandler) signal.signal(signal.SIGTERM, sighandler) dfu.start() dfu.trigger(address, 3) click.echo("Press <ENTER> terminate") pause() click.echo("Terminating") except Exception as e: logger.exception(e) finally: dfu.stop()