Implement sync_to_pps command for USRP2
authorjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 14 Dec 2008 01:01:11 +0000 (01:01 +0000)
committerjcorgan <jcorgan@221aa14e-8319-0410-a670-987f0aec2ac5>
Sun, 14 Dec 2008 01:01:11 +0000 (01:01 +0000)
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10116 221aa14e-8319-0410-a670-987f0aec2ac5

usrp2/firmware/apps/app_common_v2.c
usrp2/firmware/include/usrp2_eth_packet.h
usrp2/host/include/usrp2/usrp2.h
usrp2/host/lib/usrp2.cc
usrp2/host/lib/usrp2_impl.cc
usrp2/host/lib/usrp2_impl.h

index d58ea8a41b7ca62ad6016e4471d0e8f66a5387a1..0777ee0901b36dfedc8660ee99c0a1dd60b09476 100644 (file)
@@ -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;
index ed3ce1fe31af486d22131e6be4bcb99963b23be8..cfff0dd08201113a53a3e4121c6d79b735871f8e 100644 (file)
@@ -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
index 83e14cd3401db027ba77226e36002c437f65a71e..4fa9da1eefae6e13f63a968a204715936d9aeffc 100644 (file)
@@ -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
     /*!
index 55f80d8e05716d1ce22e7108e4f268d7b17016fa..ecfc0b30af672c5db0c92b4c7278ea1034f81d3b 100644 (file)
@@ -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
 
index 956f2561eef00562dff22aa74a2e7a92ac79c2bb..24e6d7e7310972f3c4558dbc0241b60eb9b78151 100644 (file)
@@ -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
index f513cf9d38f40b0fa9dedbfc51b2395ebc05afa2..f5030f5412f4ad032c8fa85b553fdbcce23bbac9 100644 (file)
@@ -173,6 +173,7 @@ namespace usrp2 {
     // low level
 
     bool burn_mac_addr(const std::string &new_addr);
+    bool sync_to_pps();
   };
   
 } // namespace usrp2