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