From dbd66da2876df4b57e083aa90ad04e024f70ec34 Mon Sep 17 00:00:00 2001 From: jcorgan Date: Sun, 28 Dec 2008 17:26:29 +0000 Subject: [PATCH] Replaced USRP2 peek() with peek32(), handles endian-swapping if needed git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10174 221aa14e-8319-0410-a670-987f0aec2ac5 --- gr-usrp2/src/usrp2.i | 4 ++-- gr-usrp2/src/usrp2_base.cc | 6 +++--- gr-usrp2/src/usrp2_base.h | 5 ++--- usrp2/host/include/usrp2/usrp2.h | 8 ++++---- usrp2/host/lib/usrp2.cc | 6 +++--- usrp2/host/lib/usrp2_impl.cc | 30 ++++++++++++++++-------------- 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 a484397f..8d3e732e 100644 --- a/gr-usrp2/src/usrp2.i +++ b/gr-usrp2/src/usrp2.i @@ -36,7 +36,7 @@ %include -%template(uint8_t_vector) std::vector; +%template(uint32_t_vector) std::vector; // ---------------------------------------------------------------- @@ -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 peek(uint32_t addr, uint32_t len); + std::vector peek32(uint32_t addr, uint32_t words); }; // ---------------------------------------------------------------- diff --git a/gr-usrp2/src/usrp2_base.cc b/gr-usrp2/src/usrp2_base.cc index 443d1faa..1f795421 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 -usrp2_base::peek(uint32_t addr, uint32_t len) +std::vector +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 87743700..ed2a28fe 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 peek(uint32_t addr, uint32_t len); + std::vector 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 e942bb57..ea906cdc 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 peek(uint32_t addr, uint32_t len); + std::vector 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 136062d0..37d8aaa3 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 - usrp2::peek(uint32_t addr, uint32_t len) + std::vector + 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 d7769a84..c44c6598 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 - usrp2::impl::peek(uint32_t addr, uint32_t len) + std::vector + usrp2::impl::peek32(uint32_t addr, uint32_t words) { - std::vector result; // zero sized on error return - // fprintf(stderr, "usrp2::peek: addr=%08X len=%u\n", addr, len); + std::vector 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 d9701287..0a6b97b8 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 peek(uint32_t addr, uint32_t len); + std::vector peek32(uint32_t addr, uint32_t words); }; } // namespace usrp2 -- 2.30.2