Revision b4fc0d61 host/lib/usrp/usrp2/mboard_impl.cpp

b/host/lib/usrp/usrp2/mboard_impl.cpp
191 191
void usrp2_mboard_impl::update_clock_config(void){
192 192
    boost::uint32_t pps_flags = 0;
193 193

  
194
    //slave mode overrides clock config settings
195
    if (not _mimo_clocking_mode_is_master){
196
        _clock_config.ref_source = clock_config_t::REF_MIMO;
197
        _clock_config.pps_source = clock_config_t::PPS_MIMO;
198
    }
199

  
194 200
    //translate pps source enums
195 201
    switch(_clock_config.pps_source){
196
    case clock_config_t::PPS_SMA:  pps_flags |= U2_FLAG_TIME64_PPS_SMA;  break;
202
    case clock_config_t::PPS_MIMO:
203
        _iface->poke32(_iface->regs.time64_mimo_sync,
204
            (1 << 8) | (mimo_clock_sync_delay_cycles & 0xff)
205
        );
206
        break;
207

  
208
    case clock_config_t::PPS_SMA:
209
        _iface->poke32(_iface->regs.time64_mimo_sync, 0);
210
        pps_flags |= U2_FLAG_TIME64_PPS_SMA;
211
        break;
212

  
197 213
    default: throw uhd::value_error("unhandled clock configuration pps source");
198 214
    }
199 215

  
......
214 230
        switch(_clock_config.ref_source){
215 231
        case clock_config_t::REF_INT : _iface->poke32(_iface->regs.misc_ctrl_clock, 0x12); break;
216 232
        case clock_config_t::REF_SMA : _iface->poke32(_iface->regs.misc_ctrl_clock, 0x1C); break;
233
        case clock_config_t::REF_MIMO: _iface->poke32(_iface->regs.misc_ctrl_clock, 0x15); break;
217 234
        default: throw uhd::value_error("unhandled clock configuration reference source");
218 235
        }
219 236
        _clock_ctrl->enable_external_ref(true); //USRP2P has an internal 10MHz TCXO
......
224 241
        switch(_clock_config.ref_source){
225 242
        case clock_config_t::REF_INT : _iface->poke32(_iface->regs.misc_ctrl_clock, 0x10); break;
226 243
        case clock_config_t::REF_SMA : _iface->poke32(_iface->regs.misc_ctrl_clock, 0x1C); break;
244
        case clock_config_t::REF_MIMO: _iface->poke32(_iface->regs.misc_ctrl_clock, 0x15); break;
227 245
        default: throw uhd::value_error("unhandled clock configuration reference source");
228 246
        }
229 247
        _clock_ctrl->enable_external_ref(_clock_config.ref_source != clock_config_t::REF_INT);
......
232 250
    case usrp2_iface::USRP_NXXX: break;
233 251
    }
234 252

  
235
    //Handle the serdes clocking based on master/slave mode:
236
    //   - Masters always drive the clock over serdes.
237
    //   - Slaves always lock to this serdes clock.
238
    //   - Slaves lock their time over the serdes.
253
    //masters always drive the clock over serdes
254
    _clock_ctrl->enable_mimo_clock_out(_mimo_clocking_mode_is_master);
255

  
256
    //set the mimo clock delay over the serdes
239 257
    if (_mimo_clocking_mode_is_master){
240
        _clock_ctrl->enable_mimo_clock_out(true);
241 258
        switch(_iface->get_rev()){
242 259
        case usrp2_iface::USRP_N200:
243 260
        case usrp2_iface::USRP_N210:
......
250 267

  
251 268
        default: break; //not handled
252 269
        }
253
        _iface->poke32(_iface->regs.time64_mimo_sync, 0);
254
    }
255
    else{
256
        _iface->poke32(_iface->regs.misc_ctrl_clock, 0x15);
257
        _clock_ctrl->enable_external_ref(true);
258
        _clock_ctrl->enable_mimo_clock_out(false);
259
        _iface->poke32(_iface->regs.time64_mimo_sync,
260
            (1 << 8) | (mimo_clock_sync_delay_cycles & 0xff)
261
        );
262 270
    }
263 271

  
264 272
}

Also available in: Unified diff