diff options
-rw-r--r-- | gr-usrp2/src/usrp2.i | 4 | ||||
-rw-r--r-- | gr-usrp2/src/usrp2_base.cc | 6 | ||||
-rw-r--r-- | gr-usrp2/src/usrp2_base.h | 5 | ||||
-rw-r--r-- | usrp2/host/include/usrp2/usrp2.h | 8 | ||||
-rw-r--r-- | usrp2/host/lib/usrp2.cc | 6 | ||||
-rw-r--r-- | usrp2/host/lib/usrp2_impl.cc | 30 | ||||
-rw-r--r-- | usrp2/host/lib/usrp2_impl.h | 2 |
7 files changed, 31 insertions, 30 deletions
diff --git a/gr-usrp2/src/usrp2.i b/gr-usrp2/src/usrp2.i index a484397f8..8d3e732ec 100644 --- a/gr-usrp2/src/usrp2.i +++ b/gr-usrp2/src/usrp2.i @@ -36,7 +36,7 @@ %include <usrp2/tune_result.h> -%template(uint8_t_vector) std::vector<uint8_t>; +%template(uint32_t_vector) std::vector<uint32_t>; // ---------------------------------------------------------------- @@ -52,7 +52,7 @@ public: %rename(_real_fpga_master_clock_freq) fpga_master_clock_freq; bool fpga_master_clock_freq(long *freq); bool sync_to_pps(); - std::vector<uint8_t> peek(uint32_t addr, uint32_t len); + std::vector<uint32_t> peek32(uint32_t addr, uint32_t words); }; // ---------------------------------------------------------------- diff --git a/gr-usrp2/src/usrp2_base.cc b/gr-usrp2/src/usrp2_base.cc index 443d1faaa..1f795421c 100644 --- a/gr-usrp2/src/usrp2_base.cc +++ b/gr-usrp2/src/usrp2_base.cc @@ -67,10 +67,10 @@ usrp2_base::sync_to_pps() return d_u2->sync_to_pps(); } -std::vector<uint8_t> -usrp2_base::peek(uint32_t addr, uint32_t len) +std::vector<uint32_t> +usrp2_base::peek32(uint32_t addr, uint32_t words) { - return d_u2->peek(addr, len); + return d_u2->peek32(addr, words); } bool diff --git a/gr-usrp2/src/usrp2_base.h b/gr-usrp2/src/usrp2_base.h index 877437009..ed2a28fe1 100644 --- a/gr-usrp2/src/usrp2_base.h +++ b/gr-usrp2/src/usrp2_base.h @@ -63,11 +63,10 @@ public: */ bool sync_to_pps(); - /*! - * \brief Read memory from Wishbone bus + * \brief Read memory from Wishbone bus as words */ - std::vector<uint8_t> peek(uint32_t addr, uint32_t len); + std::vector<uint32_t> peek32(uint32_t addr, uint32_t words); /*! * \brief Called by scheduler when starting flowgraph diff --git a/usrp2/host/include/usrp2/usrp2.h b/usrp2/host/include/usrp2/usrp2.h index e942bb579..ea906cdc7 100644 --- a/usrp2/host/include/usrp2/usrp2.h +++ b/usrp2/host/include/usrp2/usrp2.h @@ -362,18 +362,18 @@ namespace usrp2 { bool sync_to_pps(); /*! - * Read memory from Wishbone bus + * Read memory from Wishbone bus as 32-bit words. Handles endian swapping if needed. * * \param addr 32-bit aligned address. Only the lower 16-bits are significant. - * \param len Number of bytes to read, must be positive and multiple of 4. + * \param len Number of 32-bit words * - * \returns Vector of 8-bit read values + * \returns Vector of 32-bit read values * * WARNING: Attempts to read memory from addresses that do not correspond to RAM or * memory-mapped peripherals may cause the USRP2 to hang, requiring a power cycle. * */ - std::vector<uint8_t> peek(uint32_t addr, uint32_t len); + std::vector<uint32_t> peek32(uint32_t addr, uint32_t words); #if 0 // not yet implemented diff --git a/usrp2/host/lib/usrp2.cc b/usrp2/host/lib/usrp2.cc index 136062d08..37d8aaa33 100644 --- a/usrp2/host/lib/usrp2.cc +++ b/usrp2/host/lib/usrp2.cc @@ -395,10 +395,10 @@ namespace usrp2 { return d_impl->sync_to_pps(); } - std::vector<uint8_t> - usrp2::peek(uint32_t addr, uint32_t len) + std::vector<uint32_t> + usrp2::peek32(uint32_t addr, uint32_t words) { - return d_impl->peek(addr, len); + return d_impl->peek32(addr, words); } } // namespace usrp2 diff --git a/usrp2/host/lib/usrp2_impl.cc b/usrp2/host/lib/usrp2_impl.cc index d7769a842..c44c65981 100644 --- a/usrp2/host/lib/usrp2_impl.cc +++ b/usrp2/host/lib/usrp2_impl.cc @@ -1039,25 +1039,27 @@ namespace usrp2 { return ntohx(reply.ok) == 1; } - std::vector<uint8_t> - usrp2::impl::peek(uint32_t addr, uint32_t len) + std::vector<uint32_t> + usrp2::impl::peek32(uint32_t addr, uint32_t words) { - std::vector<uint8_t> result; // zero sized on error return - // fprintf(stderr, "usrp2::peek: addr=%08X len=%u\n", addr, len); + std::vector<uint32_t> result; // zero sized on error return + // fprintf(stderr, "usrp2::peek: addr=%08X words=%u\n", addr, words); if (addr % 4 != 0) { fprintf(stderr, "usrp2::peek: addr (=%08X) must be 32-bit word aligned\n", addr); return result; } - if (len < 4 || len % 4 != 0) { - fprintf(stderr, "usrp2::peek: len (=%u) must be an integral multiple of 4\n", len); + if (words == 0) return result; - } op_peek_cmd cmd; op_generic_t *reply; + int wlen = sizeof(uint32_t); + int rlen = sizeof(op_generic_t); + size_t bytes = words*wlen; + memset(&cmd, 0, sizeof(cmd)); init_etf_hdrs(&cmd.h, d_addr, 0, CONTROL_CHAN, -1); cmd.op.opcode = OP_PEEK; @@ -1067,15 +1069,15 @@ namespace usrp2 { cmd.eop.len = sizeof(cmd.eop); cmd.op.addr = htonl(addr); - cmd.op.bytes = htonl(len); + cmd.op.bytes = htonl(bytes); - reply = (op_generic_t *)malloc(sizeof(*reply)+len); - pending_reply p(cmd.op.rid, reply, sizeof(*reply)+len); + reply = (op_generic_t *)malloc(rlen+bytes); + pending_reply p(cmd.op.rid, reply, rlen+bytes); if (transmit_cmd(&cmd, sizeof(cmd), &p, DEF_CMD_TIMEOUT)) { - uint32_t bytes = reply->len-sizeof(*reply); - uint8_t *data = (uint8_t *)(reply)+sizeof(*reply); - for (unsigned int i = 0; i < bytes; i++) - result.push_back(data[i]); + uint32_t nwords = (reply->len-rlen)/sizeof(uint32_t); + uint32_t *data = (uint32_t *)(reply+rlen/wlen); + for (unsigned int i = 0; i < nwords; i++) + result.push_back(ntohl(data[i])); } free(reply); diff --git a/usrp2/host/lib/usrp2_impl.h b/usrp2/host/lib/usrp2_impl.h index d9701287e..0a6b97b86 100644 --- a/usrp2/host/lib/usrp2_impl.h +++ b/usrp2/host/lib/usrp2_impl.h @@ -174,7 +174,7 @@ namespace usrp2 { bool burn_mac_addr(const std::string &new_addr); bool sync_to_pps(); - std::vector<uint8_t> peek(uint32_t addr, uint32_t len); + std::vector<uint32_t> peek32(uint32_t addr, uint32_t words); }; } // namespace usrp2 |