diff options
| author | Nick Foster <bistromath@gmail.com> | 2019-04-23 10:28:09 -0700 | 
|---|---|---|
| committer | michael-west <michael.west@ettus.com> | 2019-05-21 16:12:49 -0700 | 
| commit | 94908dc612676b3f9afc2f32812e1cc23542dcde (patch) | |
| tree | 9d66cfb1291341fb41b7f2314ae8647a0ae10b39 | |
| parent | ab5e687147f337d9bf1054aeb7e926922610dacf (diff) | |
| download | uhd-94908dc612676b3f9afc2f32812e1cc23542dcde.tar.gz uhd-94908dc612676b3f9afc2f32812e1cc23542dcde.tar.bz2 uhd-94908dc612676b3f9afc2f32812e1cc23542dcde.zip  | |
utils: Add X300/X310 reset program
| -rwxr-xr-x | host/utils/x300_reset.py | 109 | 
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."  | 
