summaryrefslogtreecommitdiff
path: root/usrp2/firmware/lib/u2_init.c
blob: 9a1eb16512cb9ec9e2ab41b8a28b18795ee19ff4 (plain)
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;
}