summaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2011-06-06 04:09:13 +0100
committerJosh Blum <josh@joshknows.com>2011-06-06 04:09:13 +0100
commit01d85c733bd3220e6a44e5a9c132172462f85ef7 (patch)
treed61a5dfad158aa2799664075aa186c521f94b37a /host
parent34c95d097ee96502dc1dfa3b4f7b9c1b80d245c6 (diff)
downloaduhd-01d85c733bd3220e6a44e5a9c132172462f85ef7.tar.gz
uhd-01d85c733bd3220e6a44e5a9c132172462f85ef7.tar.bz2
uhd-01d85c733bd3220e6a44e5a9c132172462f85ef7.zip
usrp-e100: added check for wishbone readback and clock recovery
Diffstat (limited to 'host')
-rw-r--r--host/lib/usrp/usrp_e100/fpga_downloader.cpp12
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_impl.cpp44
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_impl.hpp2
3 files changed, 39 insertions, 19 deletions
diff --git a/host/lib/usrp/usrp_e100/fpga_downloader.cpp b/host/lib/usrp/usrp_e100/fpga_downloader.cpp
index a7449d3b1..b8420796f 100644
--- a/host/lib/usrp/usrp_e100/fpga_downloader.cpp
+++ b/host/lib/usrp/usrp_e100/fpga_downloader.cpp
@@ -254,9 +254,9 @@ void usrp_e100_load_fpga(const std::string &bin_file){
UHD_MSG(status) << "Loading FPGA image: " << bin_file << "... " << std::flush;
- if(std::system("/sbin/rmmod usrp_e") != 0){
- UHD_MSG(warning) << "USRP-E100 FPGA downloader: could not unload usrp_e module" << std::endl;
- }
+// if(std::system("/sbin/rmmod usrp_e") != 0){
+// UHD_MSG(warning) << "USRP-E100 FPGA downloader: could not unload usrp_e module" << std::endl;
+// }
prepare_fpga_for_configuration(gpio_prog_b, gpio_init_b);
@@ -264,9 +264,9 @@ void usrp_e100_load_fpga(const std::string &bin_file){
send_file_to_fpga(bin_file, gpio_init_b, gpio_done);
- if(std::system("/sbin/modprobe usrp_e") != 0){
- UHD_MSG(warning) << "USRP-E100 FPGA downloader: could not load usrp_e module" << std::endl;
- }
+// if(std::system("/sbin/modprobe usrp_e") != 0){
+// UHD_MSG(warning) << "USRP-E100 FPGA downloader: could not load usrp_e module" << std::endl;
+// }
}
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
index e9e9b6e20..893e1eb45 100644
--- a/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
+++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
@@ -93,7 +93,7 @@ static device::sptr usrp_e100_make(const device_addr_t &device_addr){
usrp_e100_iface::sptr iface = usrp_e100_iface::make(node);
//extract the fpga path for usrp-e
- std::string usrp_e100_fpga_image = find_image_path(device_addr.get("fpga", "usrp_e100_fpga.bin"));
+ std::string usrp_e100_fpga_image = find_image_path(device_addr.get("fpga", "usrp_e100_fpga_m2.bin"));
//compute a hash of the fpga file
const boost::uint32_t file_hash = boost::uint32_t(hash_fpga_file(usrp_e100_fpga_image));
@@ -105,21 +105,41 @@ static device::sptr usrp_e100_make(const device_addr_t &device_addr){
if (iface->peek32(UE_REG_RB_MISC_TEST32) != file_hash){
iface.reset();
usrp_e100_load_fpga(usrp_e100_fpga_image);
- sleep(1); ///\todo do this better one day.
UHD_MSG(status) << boost::format("re-Opening USRP-E on %s") % node << std::endl;
iface = usrp_e100_iface::make(node);
}
- //store the hash into the FPGA register
- iface->poke32(UE_REG_SR_MISC_TEST32, file_hash);
-
- //check that the hash can be readback correctly
- if (iface->peek32(UE_REG_RB_MISC_TEST32) != file_hash){
- UHD_MSG(error) << boost::format(
- "The FPGA hash readback failed!\n"
- "The FPGA is either clocked improperly\n"
- "or the FPGA build is not compatible.\n"
- );
+ //Perform wishbone readback tests:
+ //If the tests fail, try to re-initialize the clock.
+ //If the tests fail again, we just continue...
+ for (size_t phase = 0; phase <= 1; phase++){
+ bool test_fail = false;
+ UHD_MSG(status) << "Performing wishbone readback test... " << std::flush;
+ for (size_t i = 0; i < 100; i++){
+ iface->poke32(UE_REG_SR_MISC_TEST32, file_hash);
+ test_fail = iface->peek32(UE_REG_RB_MISC_TEST32) != file_hash;
+ if (test_fail) break; //exit loop on any failure
+ }
+ UHD_MSG(status) << ((test_fail)? " fail" : "pass") << std::endl;
+
+ if (not test_fail) break; //no more tests, its good
+
+ switch (phase){
+ case 0:
+ UHD_MSG(warning) << boost::format(
+ "The FPGA may be clocked improperly.\n"
+ "Attempting to re-initialize the clock...\n"
+ );
+ usrp_e100_clock_ctrl::make(iface, 64e6);
+ break;
+
+ case 1:
+ UHD_MSG(error) << boost::format(
+ "The FPGA is either clocked improperly\n"
+ "or the FPGA build is not compatible.\n"
+ );
+ break;
+ }
}
//check that the compatibility is correct
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp
index 318a75191..84703f828 100644
--- a/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp
+++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp
@@ -33,7 +33,7 @@
uhd::transport::zero_copy_if::sptr usrp_e100_make_mmap_zero_copy(usrp_e100_iface::sptr iface);
-static const boost::uint16_t USRP_E_FPGA_COMPAT_NUM = 0x04;
+static const boost::uint16_t USRP_E_FPGA_COMPAT_NUM = 0x05;
//! load an fpga image from a bin file into the usrp-e fpga
extern void usrp_e100_load_fpga(const std::string &bin_file);