aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Foster <bistromath@gmail.com>2019-04-23 10:28:09 -0700
committermichael-west <michael.west@ettus.com>2019-05-21 16:12:49 -0700
commit94908dc612676b3f9afc2f32812e1cc23542dcde (patch)
tree9d66cfb1291341fb41b7f2314ae8647a0ae10b39
parentab5e687147f337d9bf1054aeb7e926922610dacf (diff)
downloaduhd-94908dc612676b3f9afc2f32812e1cc23542dcde.tar.gz
uhd-94908dc612676b3f9afc2f32812e1cc23542dcde.tar.bz2
uhd-94908dc612676b3f9afc2f32812e1cc23542dcde.zip
utils: Add X300/X310 reset program
-rwxr-xr-xhost/utils/x300_reset.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/host/utils/x300_reset.py b/host/utils/x300_reset.py
new file mode 100755
index 000000000..7335c5d75
--- /dev/null
+++ b/host/utils/x300_reset.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+#
+# Copyright 2019 Ettus Research, a National Instruments Brand
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# This program is derived from uhd/firmware/usrp3/x300/x300_debug.py.
+
+import optparse
+import math
+import socket
+import struct
+import sys
+
+########################################################################
+# constants
+########################################################################
+X300_FW_COMMS_UDP_PORT = 49152
+
+X300_FW_COMMS_FLAGS_ACK = 1
+X300_FW_COMMS_FLAGS_ERROR = 2
+X300_FW_COMMS_FLAGS_POKE32 = 4
+X300_FW_COMMS_FLAGS_PEEK32 = 8
+
+X300_FW_RESET_REG = 0x100058
+X300_FW_RESET_DATA = 1
+
+#UDP_CTRL_PORT = 49183
+UDP_MAX_XFER_BYTES = 1024
+UDP_TIMEOUT = 3
+
+#REG_ARGS_FMT = '!LLLLLB15x'
+#REG_IP_FMT = '!LLLL20x'
+REG_PEEK_POKE_FMT = '!LLLL'
+
+_seq = -1
+def seq():
+ global _seq
+ _seq = _seq+1
+ return _seq
+
+
+########################################################################
+# helper functions
+########################################################################
+
+def unpack_reg_peek_poke_fmt(s):
+ return struct.unpack(REG_PEEK_POKE_FMT,s) #(flags, seq, addr, data)
+
+def pack_reg_peek_poke_fmt(flags, seq, addr, data):
+ return struct.pack(REG_PEEK_POKE_FMT, flags, seq, addr, data);
+
+########################################################################
+# Burner class, holds a socket and send/recv routines
+########################################################################
+class ctrl_socket(object):
+ def __init__(self, addr):
+ self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ self._sock.settimeout(UDP_TIMEOUT)
+ self._sock.connect((addr, X300_FW_COMMS_UDP_PORT))
+ self.set_callbacks(lambda *a: None, lambda *a: None)
+ #self.init_update() #check that the device is there
+
+ def set_callbacks(self, progress_cb, status_cb):
+ self._progress_cb = progress_cb
+ self._status_cb = status_cb
+
+ def send(self,pkt):
+ self._sock.send(pkt)
+
+ def poke(self,poke_addr,poke_data):
+ out_pkt = pack_reg_peek_poke_fmt(X300_FW_COMMS_FLAGS_POKE32|X300_FW_COMMS_FLAGS_ACK, seq(), poke_addr, poke_data)
+ self.send(out_pkt)
+
+########################################################################
+# command line options
+########################################################################
+def get_options():
+ parser = optparse.OptionParser()
+ parser.add_option("--addr", type="string", help="X300 device address", default='')
+ (options, args) = parser.parse_args()
+ return options
+
+########################################################################
+# main
+########################################################################
+if __name__=='__main__':
+ options = get_options()
+
+ if not options.addr: raise Exception('no address specified')
+
+ status = ctrl_socket(addr=options.addr)
+
+ sys.stdout.write("Sending reset command...")
+ sys.stdout.flush()
+ status.poke(X300_FW_RESET_REG,X300_FW_RESET_DATA)
+ print "Done."