| 55 | | // Set up basic clocking functions in AD9510 |
|---|
| 56 | | ad9510_write_reg(0x45, 0x00); // CLK2 drives distribution |
|---|
| 57 | | ad9510_write_reg(0x3D, 0x00); // Turn on output 1 (FPGA CLK), normal levels |
|---|
| 58 | | ad9510_write_reg(0x4B, 0x80); // Bypass divider 1 |
|---|
| 59 | | ad9510_write_reg(0x5A, 0x01); // Update Regs |
|---|
| 60 | | |
|---|
| 61 | | spi_wait(); |
|---|
| 62 | | |
|---|
| 63 | | // Set up PLL for 10 MHz reference |
|---|
| 64 | | // Reg 4, A counter, Don't Care |
|---|
| 65 | | ad9510_write_reg(0x05, 0x00); // Reg 5, B counter MSBs, 0 |
|---|
| 66 | | ad9510_write_reg(0x06, 0x05); // Reg 6, B counter LSBs, 5 |
|---|
| 67 | | // Reg 7, Loss of reference detect, doesn't work yet, 0 |
|---|
| 68 | | |
|---|
| 69 | | #define LOCK_TO_EXT_REF 0 |
|---|
| 70 | | #define LOCK_TO_MIMO_REF 0 |
|---|
| 71 | | #define LOCK_NONE 1 |
|---|
| 72 | | #define THEY_LOCK_TO_ME 0 |
|---|
| 73 | | |
|---|
| 74 | | timesync_regs->tick_control = 4; |
|---|
| 75 | | |
|---|
| 76 | | // if(I WANT TO LOCK TO A REFERENCE CLOCK) |
|---|
| 77 | | if(LOCK_TO_EXT_REF || LOCK_TO_MIMO_REF) { |
|---|
| 78 | | // Reg 8, Charge pump on, dig lock det, positive PFD, 47 |
|---|
| 79 | | ad9510_write_reg(0x08, 0x47); |
|---|
| 80 | | } |
|---|
| 81 | | else { |
|---|
| 82 | | // Reg 8, Charge pump off, dig lock det, positive PFD |
|---|
| 83 | | ad9510_write_reg(0x08, 0x00); |
|---|
| 84 | | } |
|---|
| 85 | | |
|---|
| 86 | | // Reg 9, Charge pump current, 0x40=3mA, 0x00=650uA |
|---|
| 87 | | ad9510_write_reg(0x09, 0x00); |
|---|
| 88 | | // Reg A, Prescaler of 2, everything normal 04 |
|---|
| 89 | | ad9510_write_reg(0x0A, 0x04); |
|---|
| 90 | | // Reg B, R Div MSBs, 0 |
|---|
| 91 | | ad9510_write_reg(0x0B, 0x00); |
|---|
| 92 | | // Reg C, R Div LSBs, 1 |
|---|
| 93 | | ad9510_write_reg(0x0C, 0x01); |
|---|
| 94 | | // Reg D, Antibacklash, Digital lock det, 0 |
|---|
| 95 | | |
|---|
| 96 | | ad9510_write_reg(0x5A, 0x01); // Update Regs |
|---|
| 97 | | |
|---|
| 98 | | spi_wait(); |
|---|
| 99 | | |
|---|
| 100 | | // Allow for clock switchover |
|---|
| 101 | | if (LOCK_NONE) { |
|---|
| 102 | | // Disable both ext clk inputs |
|---|
| 103 | | output_regs->clk_ctrl = 0x10; |
|---|
| 104 | | } |
|---|
| 105 | | else if (LOCK_TO_EXT_REF) { |
|---|
| 106 | | // turn on ref output and choose the SMA |
|---|
| 107 | | output_regs->clk_ctrl = 0x1C; |
|---|
| 108 | | } |
|---|
| 109 | | else if (LOCK_TO_MIMO_REF) { |
|---|
| 110 | | // Turn on ref output and choose the MIMO connector |
|---|
| 111 | | output_regs->clk_ctrl = 0x15; |
|---|
| 112 | | } |
|---|
| 113 | | |
|---|
| 114 | | #define TEST_CLK 1 |
|---|
| 115 | | #define REV2 1 |
|---|
| 116 | | #define HACKED 0 |
|---|
| 117 | | |
|---|
| 118 | | // Set up other clocks |
|---|
| 119 | | if(TEST_CLK) { |
|---|
| 120 | | ad9510_write_reg(0x3C, 0x08); // Turn on output 0 -- Test output |
|---|
| 121 | | ad9510_write_reg(0x49, 0x80); // Bypass divider 0 |
|---|
| 122 | | } else { |
|---|
| 123 | | ad9510_write_reg(0x3C, 0x02); // Turn off output 0 |
|---|
| 124 | | } |
|---|
| 125 | | |
|---|
| 126 | | if (THEY_LOCK_TO_ME) { |
|---|
| 127 | | ad9510_write_reg(0x3E, 0x00); // Turn on output 2 (clk_exp_out), normal levels |
|---|
| 128 | | ad9510_write_reg(0x4D, 0x00); // Turn on Div2 |
|---|
| 129 | | ad9510_write_reg(0x4C, 0x44); // Set Div2 = 10, output a 10 MHz clock |
|---|
| 130 | | } |
|---|
| 131 | | else { |
|---|
| 132 | | ad9510_write_reg(0x3E, 0x02); // Turn off output 2 (clk_exp_out) |
|---|
| 133 | | ad9510_write_reg(0x4D, 0x80); // Bypass divider 2 |
|---|
| 134 | | } |
|---|
| 135 | | |
|---|
| 136 | | if(HACKED) { // Using the indirect ETH Clk |
|---|
| 137 | | ad9510_write_reg(0x41, 0x02); // Turn on output 5, LVDS |
|---|
| 138 | | ad9510_write_reg(0x52, 0x11); // Div by 4 |
|---|
| 139 | | ad9510_write_reg(0x53, 0x0); |
|---|
| 140 | | } |
|---|
| 141 | | else if (REV2) { |
|---|
| 142 | | ad9510_write_reg(0x41, 0x01); // Turn off output 5 (phy_clk) |
|---|
| 143 | | ad9510_write_reg(0x53, 0x80); // Bypass divider |
|---|
| 144 | | } |
|---|
| 145 | | else { |
|---|
| 146 | | ad9510_write_reg(0x40, 0x01); // Turn off output 4 (phy_clk) |
|---|
| 147 | | ad9510_write_reg(0x51, 0x80); // Bypass divider |
|---|
| 148 | | } |
|---|
| 149 | | |
|---|
| 150 | | ad9510_write_reg(0x42, 0x01); // Turn off output 6 (db_tx_clk) |
|---|
| 151 | | ad9510_write_reg(0x43, 0x01); // Turn off output 7 (db_rx_clk) |
|---|
| 152 | | ad9510_write_reg(0x5A, 0x01); // Update Regs |
|---|
| 153 | | |
|---|
| 154 | | // Enable ADCs |
|---|
| 155 | | output_regs->adc_ctrl = ADC_CTRL_ON; |
|---|
| 156 | | |
|---|
| 157 | | // Enable clock to ADCs and DACs |
|---|
| 158 | | ad9510_write_reg(0x3F, 0x00); // Turn on output 3 (DAC CLK), normal levels |
|---|
| 159 | | ad9510_write_reg(0x4F, 0x80); // Bypass Div #3 |
|---|
| 160 | | if (REV2) { |
|---|
| 161 | | //ad9510_write_reg(0x40, 0x08); // Turn on out 4 (ADC clk), CMOS |
|---|
| 162 | | ad9510_write_reg(0x40, 0x02); // Turn on out 4 (ADC clk), LVDS |
|---|
| 163 | | ad9510_write_reg(0x51, 0x80); // Bypass Div #4 |
|---|
| 164 | | } else { |
|---|
| 165 | | ad9510_write_reg(0x41, 0x08); // Turn on out 5 (ADC clk), CMOS |
|---|
| 166 | | ad9510_write_reg(0x53, 0x80); // Bypass Div #5 |
|---|
| 167 | | } |
|---|
| 168 | | |
|---|
| 169 | | ad9510_write_reg(0x5A, 0x01); // Update Regs |
|---|
| | 55 | // set up the default clocks |
|---|
| | 56 | clocks_init(); |
|---|