aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/usrp3
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/usrp3')
-rw-r--r--firmware/usrp3/lib/CMakeLists.txt1
-rw-r--r--firmware/usrp3/n230/CMakeLists.txt7
-rw-r--r--firmware/usrp3/n230/n230_eth_handlers.c2
-rw-r--r--firmware/usrp3/n230/n230_fw_comm_protocol.c (renamed from firmware/usrp3/lib/fw_comm_protocol.c)2
-rwxr-xr-xfirmware/usrp3/x300/x300_aurora_bist.py40
-rw-r--r--firmware/usrp3/x300/x300_main.c41
6 files changed, 64 insertions, 29 deletions
diff --git a/firmware/usrp3/lib/CMakeLists.txt b/firmware/usrp3/lib/CMakeLists.txt
index 9d9ee3c6c..cd1a82c3f 100644
--- a/firmware/usrp3/lib/CMakeLists.txt
+++ b/firmware/usrp3/lib/CMakeLists.txt
@@ -30,7 +30,6 @@ add_library(usrp3fw STATIC
print_addrs.c
link_state_route_proto.c
cron.c
- fw_comm_protocol.c
flash/spi_flash.c
flash/spif_spsn_s25flxx.c
)
diff --git a/firmware/usrp3/n230/CMakeLists.txt b/firmware/usrp3/n230/CMakeLists.txt
index 6247477f0..5787fbb7d 100644
--- a/firmware/usrp3/n230/CMakeLists.txt
+++ b/firmware/usrp3/n230/CMakeLists.txt
@@ -19,7 +19,12 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${CMAKE_SOURCE_DIR}/../../host/lib/usrp/n230)
-list(APPEND n230_sources n230_eeprom.c n230_eth_handlers.c n230_init.c n230_main.c)
+list(APPEND n230_sources
+ n230_eeprom.c
+ n230_fw_comm_protocol.c
+ n230_eth_handlers.c
+ n230_init.c
+ n230_main.c)
########################################################################
set(GEN_OUTPUTS_BIN_SIZE 0x7fff)
diff --git a/firmware/usrp3/n230/n230_eth_handlers.c b/firmware/usrp3/n230/n230_eth_handlers.c
index b291bb39f..f5c319681 100644
--- a/firmware/usrp3/n230/n230_eth_handlers.c
+++ b/firmware/usrp3/n230/n230_eth_handlers.c
@@ -22,7 +22,7 @@
#include <u3_net_stack.h>
#include <print_addrs.h>
#include <trace.h>
-#include "../../../host/lib/usrp/common/fw_comm_protocol.h"
+#include "../../../host/lib/usrp/n230/n230_fw_comm_protocol.h"
#include "../../../host/lib/usrp/n230/n230_fw_defs.h"
#include "../n230/n230_fw_host_iface.h"
#include "../../../host/lib/usrp/n230/n230_eeprom.h"
diff --git a/firmware/usrp3/lib/fw_comm_protocol.c b/firmware/usrp3/n230/n230_fw_comm_protocol.c
index 0cc931a76..d6f6dff5a 100644
--- a/firmware/usrp3/lib/fw_comm_protocol.c
+++ b/firmware/usrp3/n230/n230_fw_comm_protocol.c
@@ -15,7 +15,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
-#include "../../../host/lib/usrp/common/fw_comm_protocol.h"
+#include "../../../host/lib/usrp/n230/n230_fw_comm_protocol.h"
#include <trace.h>
#include <string.h> //memcmp
diff --git a/firmware/usrp3/x300/x300_aurora_bist.py b/firmware/usrp3/x300/x300_aurora_bist.py
index f5e119b66..5f7a22a3b 100755
--- a/firmware/usrp3/x300/x300_aurora_bist.py
+++ b/firmware/usrp3/x300/x300_aurora_bist.py
@@ -43,8 +43,9 @@ SFP_TYPE_AURORA = 2
MAC_REG_CTRL = 0
MAC_REG_STATUS = 0
MAC_REG_OVERRUNS = 4
-MAC_REG_BIST_SAMPS = 8
-MAC_REG_BIST_ERRORS = 12
+MAC_REG_CHECKSUM_ERRS = 8
+MAC_REG_BIST_SAMPS = 12
+MAC_REG_BIST_ERRORS = 16
MAC_STATUS_LINK_UP_MSK = 0x00000001
MAC_STATUS_HARD_ERR_MSK = 0x00000002
@@ -52,19 +53,16 @@ MAC_STATUS_SOFT_ERR_MSK = 0x00000004
MAC_STATUS_BIST_LOCKED_MSK = 0x00000008
MAC_STATUS_BIST_LATENCY_MSK = 0x000FFFF0
MAC_STATUS_BIST_LATENCY_OFFSET = 4
-MAC_STATUS_CHECKSUM_ERRS_MSK = 0xFFF00000
-MAC_STATUS_CHECKSUM_ERRS_OFFSET = 20
MAC_CTRL_BIST_CHECKER_EN = 0x00000001
MAC_CTRL_BIST_GEN_EN = 0x00000002
MAC_CTRL_BIST_LOOPBACK_EN = 0x00000004
-MAC_CTRL_PHY_RESET = 0x00000100
-MAC_CTRL_BIST_RATE_MSK = 0x000000F8
+MAC_CTRL_PHY_RESET = 0x00000200
+MAC_CTRL_BIST_RATE_MSK = 0x000001F8
MAC_CTRL_BIST_RATE_OFFSET = 3
-AURORA_CLK_RATE = 156.25e6
BUS_CLK_RATE = 166.66e6
-BIST_MAX_TIME_LIMIT = math.floor(pow(2,48)/AURORA_CLK_RATE)-1
+BIST_MAX_TIME_LIMIT = math.floor(pow(2,48)/BUS_CLK_RATE)-1
########################################################################
# utils
@@ -83,10 +81,11 @@ def get_aurora_info(ctrl):
return (aur_port, link_up)
def get_rate_setting(rate):
- for div in range(2,32):
- if (rate < 8e-6 * BUS_CLK_RATE * (1.0 - 1.0/div)):
- return (div-1, 8e-6 * BUS_CLK_RATE * (1.0 - 1.0/(div-1)))
- return (0, 8e-6 * BUS_CLK_RATE)
+ RATE_RES_BITS = 6
+ rate_sett = int((1.0*rate/(8e-6*BUS_CLK_RATE))*pow(2, RATE_RES_BITS))-1 # Round rate down
+ rate_sett = numpy.clip(rate_sett, 0, pow(2, RATE_RES_BITS)-1)
+ coerced_rate = ((1.0+rate_sett)/pow(2, RATE_RES_BITS))*(8e-6*BUS_CLK_RATE)
+ return (rate_sett, coerced_rate)
def run_ber_loopback_bist(ctrls, duration, rate_tuple):
(rate_sett, rate) = rate_tuple
@@ -107,10 +106,7 @@ def run_ber_loopback_bist(ctrls, duration, rate_tuple):
# Put the slave in loopback mode and the master in BIST mode
if 'slave' in ctrls:
ctrls['slave'].poke(SLA_MAC_REG_BASE + MAC_REG_CTRL, MAC_CTRL_BIST_LOOPBACK_EN)
- if rate_sett == 0:
- master_ctrl = MAC_CTRL_BIST_GEN_EN|MAC_CTRL_BIST_CHECKER_EN
- else:
- master_ctrl = ((rate_sett - 1) << MAC_CTRL_BIST_RATE_OFFSET)|MAC_CTRL_BIST_GEN_EN|MAC_CTRL_BIST_CHECKER_EN
+ master_ctrl = (rate_sett<<MAC_CTRL_BIST_RATE_OFFSET)|MAC_CTRL_BIST_GEN_EN|MAC_CTRL_BIST_CHECKER_EN
ctrls['master'].poke(MST_MAC_REG_BASE + MAC_REG_CTRL, master_ctrl)
start_time = datetime.datetime.now()
# Wait and check if BIST locked
@@ -153,7 +149,7 @@ def run_ber_loopback_bist(ctrls, duration, rate_tuple):
print('[INFO] BIST Complete!')
print('- Elapsed Time = ' + str(time_diff))
print('- Max BER (Bit Error Ratio) = %.4g (%d errors out of %d)'%((mst_errors+1)/mst_samps,mst_errors,mst_samps))
- print('- Max Roundtrip Latency = %.1fus'%(1e6*mst_latency_cyc/AURORA_CLK_RATE))
+ print('- Max Roundtrip Latency = %.1fus'%(1e6*mst_latency_cyc/BUS_CLK_RATE))
print('- Approx Throughput = %.0fMB/s'%((8e-6*mst_samps)/time_diff.total_seconds()))
else:
print('[ERROR] BIST Failed!')
@@ -187,10 +183,7 @@ def run_latency_loopback_bist(ctrls, duration, rate_tuple):
# Put the slave in loopback mode and the master in BIST mode
if 'slave' in ctrls:
ctrls['slave'].poke(SLA_MAC_REG_BASE + MAC_REG_CTRL, MAC_CTRL_BIST_LOOPBACK_EN)
- if rate_sett == 0:
- master_ctrl = MAC_CTRL_BIST_GEN_EN|MAC_CTRL_BIST_CHECKER_EN
- else:
- master_ctrl = ((rate_sett - 1) << MAC_CTRL_BIST_RATE_OFFSET)|MAC_CTRL_BIST_GEN_EN|MAC_CTRL_BIST_CHECKER_EN
+ master_ctrl = (rate_sett<<MAC_CTRL_BIST_RATE_OFFSET)|MAC_CTRL_BIST_GEN_EN|MAC_CTRL_BIST_CHECKER_EN
start_time = datetime.datetime.now()
latencies = []
@@ -216,7 +209,7 @@ def run_latency_loopback_bist(ctrls, duration, rate_tuple):
ctrls['master'].poke(MST_MAC_REG_BASE + MAC_REG_CTRL, 0)
# Compure latency
mst_latency_cyc = 16.0*((mst_status & MAC_STATUS_BIST_LATENCY_MSK) >> MAC_STATUS_BIST_LATENCY_OFFSET)
- mst_latency_us = 1e6*mst_latency_cyc/AURORA_CLK_RATE
+ mst_latency_us = 1e6*mst_latency_cyc/BUS_CLK_RATE
latencies.append(mst_latency_us)
except KeyboardInterrupt:
print('[WARNING] Operation cancelled by user.')
@@ -233,7 +226,7 @@ def run_latency_loopback_bist(ctrls, duration, rate_tuple):
print('- Elapsed Time = ' + str(stop_time - start_time))
print('- Roundtrip Latency Mean = %.2fus'%(numpy.mean(latencies)))
print('- Roundtrip Latency Stdev = %.2fus'%(numpy.std(latencies)))
- # Turn off BIST loopback
+ # Turn off BIST loopback
time.sleep(0.5)
if 'slave' in ctrls:
ctrls['slave'].poke(SLA_MAC_REG_BASE + MAC_REG_CTRL, 0)
@@ -304,4 +297,3 @@ if __name__=='__main__':
run_ber_loopback_bist(ctrls, options.duration, get_rate_setting(options.rate))
else:
run_latency_loopback_bist(ctrls, options.duration, get_rate_setting(options.rate))
-
diff --git a/firmware/usrp3/x300/x300_main.c b/firmware/usrp3/x300/x300_main.c
index 459f7b0b1..3de9283eb 100644
--- a/firmware/usrp3/x300/x300_main.c
+++ b/firmware/usrp3/x300/x300_main.c
@@ -1,4 +1,4 @@
-// Copyright 2013-2014 Ettus Research LLC
+// Copyright 2013-2017 Ettus Research
#include "x300_init.h"
#include "x300_defs.h"
@@ -188,6 +188,44 @@ void handle_udp_fpga_prog(
}
/***********************************************************************
+ * Handler for FPGA image reading packets
+ **********************************************************************/
+void handle_udp_fpga_read(
+ const uint8_t ethno,
+ const struct ip_addr *src, const struct ip_addr *dst,
+ const uint16_t src_port, const uint16_t dst_port,
+ const void *buff, const size_t num_bytes
+)
+{
+ const x300_fpga_read_t *request = (const x300_fpga_read_t *) buff;
+ x300_fpga_read_reply_t reply = {0};
+ bool status = true;
+
+ if (buff == NULL) {
+ return;
+ } else if (num_bytes < offsetof(x300_fpga_read_t, size)) {
+ reply.flags |= X300_FPGA_READ_FLAGS_ERROR;
+ } else {
+ if (request->flags & X300_FPGA_READ_FLAGS_INIT) {
+ STATUS_MERGE(chinch_flash_init(), status);
+ } else if (request->flags & X300_FPGA_READ_FLAGS_CLEANUP) {
+ chinch_flash_cleanup();
+ } else {
+ reply.flags |= X300_FPGA_READ_FLAGS_ACK;
+ reply.sector = request->sector;
+ reply.index = request->index;
+ reply.size = request->size;
+
+ STATUS_MERGE(chinch_flash_select_sector(request->sector), status);
+ STATUS_MERGE(chinch_flash_read_buf(request->index*2, reply.data, request->size), status);
+ }
+ }
+
+ if (!status) reply.flags |= X300_FPGA_READ_FLAGS_ERROR;
+ u3_net_stack_send_udp_pkt(ethno, src, dst_port, src_port, &reply, sizeof(reply));
+}
+
+/***********************************************************************
* Handler for MTU detection
**********************************************************************/
void handle_udp_mtu_detect(
@@ -411,6 +449,7 @@ int main(void)
u3_net_stack_register_udp_handler(X300_FW_COMMS_UDP_PORT, &handle_udp_fw_comms);
u3_net_stack_register_udp_handler(X300_VITA_UDP_PORT, &handle_udp_prog_framer);
u3_net_stack_register_udp_handler(X300_FPGA_PROG_UDP_PORT, &handle_udp_fpga_prog);
+ u3_net_stack_register_udp_handler(X300_FPGA_READ_UDP_PORT, &handle_udp_fpga_read);
u3_net_stack_register_udp_handler(X300_MTU_DETECT_UDP_PORT, &handle_udp_mtu_detect);
uint32_t last_cronjob = 0;