diff options
Diffstat (limited to 'firmware/usrp3/x300/x300_debug.py')
-rwxr-xr-x | firmware/usrp3/x300/x300_debug.py | 130 |
1 files changed, 78 insertions, 52 deletions
diff --git a/firmware/usrp3/x300/x300_debug.py b/firmware/usrp3/x300/x300_debug.py index c9bcbb138..e134a7275 100755 --- a/firmware/usrp3/x300/x300_debug.py +++ b/firmware/usrp3/x300/x300_debug.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -# Copyright 2010-2011 Ettus Research LLC +# Copyright 2010-2014 Ettus Research LLC # # 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 @@ -21,27 +21,36 @@ import math import socket import struct - ######################################################################## # constants ######################################################################## -B250_FW_COMMS_UDP_PORT = 49152 +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_FIXED_PORTS = 5 -B250_FW_COMMS_FLAGS_ACK = 1 -B250_FW_COMMS_FLAGS_ERROR = 2 -B250_FW_COMMS_FLAGS_POKE32 = 4 -B250_FW_COMMS_FLAGS_PEEK32 = 8 +X300_ZPU_MISC_SR_BUS_OFFSET = 0xA000 +X300_ZPU_XBAR_SR_BUS_OFFSET = 0xB000 + +# Settings register bus addresses (hangs off ZPU wishbone bus) +# Multiple by 4 as ZPU wishbone bus is word aligned +X300_SR_NUM_CE = X300_ZPU_MISC_SR_BUS_OFFSET + 4*7 +X300_SR_RB_ADDR_XBAR = X300_ZPU_MISC_SR_BUS_OFFSET + 4*128 +# Readback addresses +X300_RB_CROSSBAR = X300_ZPU_MISC_SR_BUS_OFFSET + 4*128 #UDP_CTRL_PORT = 49183 UDP_MAX_XFER_BYTES = 1024 UDP_TIMEOUT = 3 -#USRP2_FW_PROTO_VERSION = 11 #should be unused after r6 #REG_ARGS_FMT = '!LLLLLB15x' #REG_IP_FMT = '!LLLL20x' REG_PEEK_POKE_FMT = '!LLLL' - _seq = -1 def seq(): global _seq @@ -66,7 +75,7 @@ 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, B250_FW_COMMS_UDP_PORT)) + 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 @@ -78,47 +87,71 @@ class ctrl_socket(object): self._sock.send(pkt) return self._sock.recv(UDP_MAX_XFER_BYTES) - def read_router_stats(self): + def read_router_stats(self, blocks=None, ignore=None): + # Readback number of CEs + num_ports = self.peek(X300_SR_NUM_CE) + X300_FIXED_PORTS + ports = ['eth0', 'eth1', 'pcie', 'radio0', 'radio1'] + ["Block{num}".format(num=x) for x in range(num_ports-X300_FIXED_PORTS)] + if blocks is None: + print("\nNote: Using default CE port names (use --blocks to specify)\n") + else: + user_ports = [x.strip() for x in blocks.split(",") if len(x.strip())] + for idx, user_port in enumerate(user_ports): + ports[idx + X300_FIXED_PORTS] = user_port + if ignore is None: + ignore = [] + else: + ignore = [int(x.strip()) for x in ignore.split(",") if len(x.strip())] + print("Egress Port "), + # Write out xbar ports + PORT_MAX_LEN = 12 + for idx, in_prt in enumerate(ports): + if idx in ignore: + continue + print "{spaces}{name}".format(spaces=(" "*max(0, PORT_MAX_LEN-len(in_prt))), name=in_prt), print - print(" "), - ports = [' eth0',' eth1',' radio0',' radio1',' compute0',' compute1',' compute2',' pcie'] - for in_prt in ports: - print("%s" % in_prt), - print(" Egress Port") - print(" "), - for in_prt in range (0, 8): - print("____________"), + print(" "*(PORT_MAX_LEN+1)), + for in_prt in range(num_ports-len(ignore)): + print("_" * (PORT_MAX_LEN-1) + " "), print - for in_prt in range (0, 8): - print("%s |" % ports[in_prt]), - for out_prt in range (0, 8): - out_pkt = pack_reg_peek_poke_fmt(B250_FW_COMMS_FLAGS_PEEK32|B250_FW_COMMS_FLAGS_ACK, seq(), 0xA000+256+((in_prt*8+out_prt)*4), 0) - in_pkt = self.send_and_recv(out_pkt) - (flags, rxseq, addr, data) = unpack_reg_peek_poke_fmt(in_pkt) - if flags & B250_FW_COMMS_FLAGS_ERROR == B250_FW_COMMS_FLAGS_ERROR: - raise Exception("B250 peek returns error code") + for in_prt, port_name in enumerate(ports): + if in_prt in ignore: + continue + print "{spaces}{name} |".format(spaces=(" "*max(0, PORT_MAX_LEN-len(port_name))), name=port_name), + for out_prt in range(num_ports): + if out_prt in ignore: + continue + self.poke(X300_SR_RB_ADDR_XBAR,(in_prt*num_ports+out_prt)) + data = self.peek(X300_RB_CROSSBAR) print("%10d " % (data)), print print print("Ingress Port") print + def peek_print(self,peek_addr): + peek_data = self.peek(peek_addr) + print("PEEK of address %d(0x%x) reads %d(0x%x)" % (peek_addr,peek_addr,peek_data,peek_data)) + return peek_data def peek(self,peek_addr): - out_pkt = pack_reg_peek_poke_fmt(B250_FW_COMMS_FLAGS_PEEK32|B250_FW_COMMS_FLAGS_ACK, seq(), peek_addr, 0) + out_pkt = pack_reg_peek_poke_fmt(X300_FW_COMMS_FLAGS_PEEK32|X300_FW_COMMS_FLAGS_ACK, seq(), peek_addr, 0) in_pkt = self.send_and_recv(out_pkt) (flags, rxseq, addr, data) = unpack_reg_peek_poke_fmt(in_pkt) - if flags & B250_FW_COMMS_FLAGS_ERROR == B250_FW_COMMS_FLAGS_ERROR: - raise Exception("B250 peek of address %d returns error code" % (addr)) - print("PEEK of address %d(0x%x) reads %d(0x%x)" % (addr,addr,data,data)) + if flags & X300_FW_COMMS_FLAGS_ERROR == X300_FW_COMMS_FLAGS_ERROR: + raise Exception("X300 peek of address %d returns error code" % (addr)) + return data + + def poke_print(self,poke_addr,poke_data): + print("POKE of address %d(0x%x) with %d(0x%x)" % (poke_addr,poke_addr,poke_data,poke_data)) + return(self.poke(poke_addr,poke_data)) def poke(self,poke_addr,poke_data): - out_pkt = pack_reg_peek_poke_fmt(B250_FW_COMMS_FLAGS_POKE32|B250_FW_COMMS_FLAGS_ACK, seq(), 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) in_pkt = self.send_and_recv(out_pkt) (flags, rxseq, addr, data) = unpack_reg_peek_poke_fmt(in_pkt) - if flags & B250_FW_COMMS_FLAGS_ERROR == B250_FW_COMMS_FLAGS_ERROR: - raise Exception("B250 peek of address %d returns error code" % (addr)) - print("POKE of address %d(0x%x) with %d(0x%x)" % (poke_addr,poke_addr,poke_data,poke_data) ) + if flags & X300_FW_COMMS_FLAGS_ERROR == X300_FW_COMMS_FLAGS_ERROR: + raise Exception("X300 peek of address %d returns error code" % (addr)) + return data ######################################################################## @@ -126,14 +159,14 @@ class ctrl_socket(object): ######################################################################## def get_options(): parser = optparse.OptionParser() - parser.add_option("--addr", type="string", help="USRP-N2XX device address", default='') - parser.add_option("--list", action="store_true", help="list possible network devices", default=False) - parser.add_option("--peek", type="int", help="Read from memory map", default=None) - parser.add_option("--poke", type="int", help="Write to memory map", default=None) - parser.add_option("--data", type="int", help="Data for poke", default=None) - parser.add_option("--stats", action="store_true", help="Display SuperMIMO Network Stats", default=False) + parser.add_option("--addr", type="string", help="USRP-X300 device address", default='') + parser.add_option("--stats", action="store_true", help="Display RFNoC Crossbar Stats", default=False) + parser.add_option("--peek", type="int", help="Read from memory map", default=None) + parser.add_option("--poke", type="int", help="Write to memory map", default=None) + parser.add_option("--data", type="int", help="Data for poke", default=None) + parser.add_option("--blocks", help="List names of blocks (post-radio)", default=None) + parser.add_option("--ignore", help="List of ports to ignore", default=None) (options, args) = parser.parse_args() - return options @@ -143,25 +176,18 @@ def get_options(): if __name__=='__main__': options = get_options() - - if options.list: - print('Possible network devices:') - print(' ' + '\n '.join(enumerate_devices())) - exit() - if not options.addr: raise Exception('no address specified') status = ctrl_socket(addr=options.addr) if options.stats: - status.read_router_stats() - + status.read_router_stats(options.blocks, options.ignore) if options.peek is not None: addr = options.peek - status.peek(addr) + status.peek_print(addr) if options.poke is not None and options.data is not None: addr = options.poke data = options.data - status.poke(addr,data) + status.poke_print(addr,data) |