From f2695be7c09fec1bc5b62f3b229b9002572aeb30 Mon Sep 17 00:00:00 2001 From: jcorgan Date: Sun, 14 Dec 2008 01:01:11 +0000 Subject: [PATCH] Implement sync_to_pps command for USRP2 git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10116 221aa14e-8319-0410-a670-987f0aec2ac5 --- usrp2/firmware/apps/app_common_v2.c | 12 ++++++++++++ usrp2/firmware/include/usrp2_eth_packet.h | 2 ++ usrp2/host/include/usrp2/usrp2.h | 4 ++++ usrp2/host/lib/usrp2.cc | 5 +++++ usrp2/host/lib/usrp2_impl.cc | 22 ++++++++++++++++++++++ usrp2/host/lib/usrp2_impl.h | 1 + 6 files changed, 46 insertions(+) diff --git a/usrp2/firmware/apps/app_common_v2.c b/usrp2/firmware/apps/app_common_v2.c index d58ea8a4..0777ee09 100644 --- a/usrp2/firmware/apps/app_common_v2.c +++ b/usrp2/firmware/apps/app_common_v2.c @@ -46,6 +46,14 @@ burn_mac_addr(const op_burn_mac_addr_t *p) return ethernet_set_mac_addr(&p->addr); } +static bool +sync_to_pps(const op_generic_t *p) +{ + timesync_regs->sync_on_next_pps = 1; + putstr("SYNC to PPS\n"); + return true; +} + static bool config_mimo_cmd(const op_config_mimo_t *p) { @@ -422,6 +430,10 @@ handle_control_chan_frame(u2_eth_packet_t *pkt, size_t len) subpktlen = dboard_info_cmd(gp, reply_payload, reply_payload_space); break; + case OP_SYNC_TO_PPS: + subpktlen = generic_reply(gp, reply_payload, reply_payload_space, + sync_to_pps((op_generic_t *) payload)); + default: printf("app_common_v2: unhandled opcode = %d\n", gp->opcode); break; diff --git a/usrp2/firmware/include/usrp2_eth_packet.h b/usrp2/firmware/include/usrp2_eth_packet.h index ed3ce1fe..cfff0dd0 100644 --- a/usrp2/firmware/include/usrp2_eth_packet.h +++ b/usrp2/firmware/include/usrp2_eth_packet.h @@ -183,6 +183,8 @@ typedef struct { #define OP_CONFIG_MIMO_REPLY (OP_CONFIG_MIMO | OP_REPLY_BIT) #define OP_DBOARD_INFO 9 #define OP_DBOARD_INFO_REPLY (OP_DBOARD_INFO | OP_REPLY_BIT) +#define OP_SYNC_TO_PPS 10 +#define OP_SYNC_TO_PPS_REPLY (OP_SYNC_TO_PPS | OP_REPLY_BIT) //#define OP_WRITE_REG xx // not implemented diff --git a/usrp2/host/include/usrp2/usrp2.h b/usrp2/host/include/usrp2/usrp2.h index 83e14cd3..4fa9da1e 100644 --- a/usrp2/host/include/usrp2/usrp2.h +++ b/usrp2/host/include/usrp2/usrp2.h @@ -356,6 +356,10 @@ namespace usrp2 { */ bool burn_mac_addr(const std::string &new_addr); + /*! + * Reset master time to 0 at next PPS rising edge + */ + bool sync_to_pps(); #if 0 // not yet implemented /*! diff --git a/usrp2/host/lib/usrp2.cc b/usrp2/host/lib/usrp2.cc index 55f80d8e..ecfc0b30 100644 --- a/usrp2/host/lib/usrp2.cc +++ b/usrp2/host/lib/usrp2.cc @@ -389,6 +389,11 @@ namespace usrp2 { return d_impl->burn_mac_addr(new_addr); } + bool + usrp2::sync_to_pps() + { + return d_impl->sync_to_pps(); + } } // namespace usrp2 diff --git a/usrp2/host/lib/usrp2_impl.cc b/usrp2/host/lib/usrp2_impl.cc index 956f2561..24e6d7e7 100644 --- a/usrp2/host/lib/usrp2_impl.cc +++ b/usrp2/host/lib/usrp2_impl.cc @@ -71,6 +71,7 @@ namespace usrp2 { case OP_CONFIG_MIMO: return "OP_CONFIG_MIMO"; case OP_DBOARD_INFO: return "OP_DBOARD_INFO"; case OP_DBOARD_INFO_REPLY: return "OP_DBOARD_INFO_REPLY"; + case OP_SYNC_TO_PPS: return "OP_SYNC_TO_PPS"; #if 0 case OP_WRITE_REG: return "OP_WRITE_REG"; case OP_WRITE_REG_MASKED: return "OP_WRITE_REG_MASKED"; @@ -1020,4 +1021,25 @@ namespace usrp2 { } + bool + usrp2::impl::sync_to_pps() + { + op_config_mimo_cmd cmd; + op_generic_t reply; + + memset(&cmd, 0, sizeof(cmd)); + init_etf_hdrs(&cmd.h, d_addr, 0, CONTROL_CHAN, -1); + cmd.op.opcode = OP_SYNC_TO_PPS; + cmd.op.len = sizeof(cmd.op); + cmd.op.rid = d_next_rid++; + cmd.eop.opcode = OP_EOP; + cmd.eop.len = sizeof(cmd.eop); + + pending_reply p(cmd.op.rid, &reply, sizeof(reply)); + if (!transmit_cmd(&cmd, sizeof(cmd), &p, DEF_CMD_TIMEOUT)) + return false; + + return ntohx(reply.ok) == 1; + } + } // namespace usrp2 diff --git a/usrp2/host/lib/usrp2_impl.h b/usrp2/host/lib/usrp2_impl.h index f513cf9d..f5030f54 100644 --- a/usrp2/host/lib/usrp2_impl.h +++ b/usrp2/host/lib/usrp2_impl.h @@ -173,6 +173,7 @@ namespace usrp2 { // low level bool burn_mac_addr(const std::string &new_addr); + bool sync_to_pps(); }; } // namespace usrp2 -- 2.47.2