1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
/*
* Copyright 2007 Free Software Foundation, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "u2_init.h"
#include "memory_map.h"
#include "spi.h"
#include "pic.h"
#include "hal_io.h"
#include "lsadc.h"
#include "lsdac.h"
#include "buffer_pool.h"
#include "hal_uart.h"
#include "i2c.h"
#include "bool.h"
#include "mdelay.h"
#include "ad9777.h"
#include "clocks.h"
#include "db.h"
#include "usrp2_i2c_addr.h"
//#include "nonstdio.h"
unsigned char u2_hw_rev_major;
unsigned char u2_hw_rev_minor;
static inline void
get_hw_rev(void)
{
bool ok = eeprom_read(I2C_ADDR_MBOARD, MBOARD_REV_LSB, &u2_hw_rev_minor, 1);
ok &= eeprom_read(I2C_ADDR_MBOARD, MBOARD_REV_MSB, &u2_hw_rev_major, 1);
}
/*
* We ought to arrange for this to be called before main, but for now,
* we require that the user's main call u2_init as the first thing...
*/
bool
u2_init(void)
{
// Set GPIOs to inputs, disable GPIO streaming
hal_gpio_set_ddr(GPIO_TX_BANK, 0x0000, 0xffff);
hal_gpio_set_ddr(GPIO_RX_BANK, 0x0000, 0xffff);
hal_gpio_write(GPIO_TX_BANK, 0x0000, 0xffff); // init s/w output value to zero
hal_gpio_write(GPIO_RX_BANK, 0x0000, 0xffff);
dsp_rx_regs->gpio_stream_enable = 0; // I, Q LSBs come from DSP
hal_io_init();
// init spi, so that we can switch over to the high-speed clock
spi_init();
// init i2c so we can read our rev
i2c_init();
get_hw_rev();
// set up the default clocks
clocks_init();
// clocks_enable_test_clk(true,1);
// Enable ADCs
output_regs->adc_ctrl = ADC_CTRL_ON;
// Set up AD9777 DAC
ad9777_write_reg(0, R0_1R);
ad9777_write_reg(1, R1_INTERP_4X | R1_REAL_MIX);
ad9777_write_reg(2, 0);
ad9777_write_reg(3, R3_PLL_DIV_1);
ad9777_write_reg(4, R4_PLL_ON | R4_CP_AUTO);
ad9777_write_reg(5, R5_I_FINE_GAIN(0));
ad9777_write_reg(6, R6_I_COARSE_GAIN(0xf));
ad9777_write_reg(7, 0); // I dac offset
ad9777_write_reg(8, 0);
ad9777_write_reg(9, R9_Q_FINE_GAIN(0));
ad9777_write_reg(10, R10_Q_COARSE_GAIN(0xf));
ad9777_write_reg(11, 0); // Q dac offset
ad9777_write_reg(12, 0);
// Initial values for tx and rx mux registers
dsp_tx_regs->tx_mux = 0x10;
dsp_rx_regs->rx_mux = 0x44444444;
// Set up serdes
output_regs->serdes_ctrl = (SERDES_ENABLE | SERDES_RXEN);
pic_init(); // progammable interrupt controller
bp_init(); // buffer pool
lsadc_init(); // low-speed ADCs
lsdac_init(); // low-speed DACs
db_init(); // daughterboard init
hal_enable_ints();
// flash all leds to let us know board is alive
hal_set_leds(0x0, 0x1f);
mdelay(100);
hal_set_leds(0x1f, 0x1f);
mdelay(100);
hal_set_leds(0x1, 0x1f); // Leave the first one on
#if 0
// test register readback
int rr, vv;
vv = ad9777_read_reg(0);
printf("ad9777 reg[0] = 0x%x\n", vv);
for (rr = 0x04; rr <= 0x0d; rr++){
vv = ad9510_read_reg(rr);
printf("ad9510 reg[0x%x] = 0x%x\n", rr, vv);
}
#endif
return true;
}
|