1 | #!/usr/bin/env python |
---|
2 | # |
---|
3 | # Copyright 2005,2007 Free Software Foundation, Inc. |
---|
4 | # |
---|
5 | # This file is part of GNU Radio |
---|
6 | # |
---|
7 | # GNU Radio is free software; you can redistribute it and/or modify |
---|
8 | # it under the terms of the GNU General Public License as published by |
---|
9 | # the Free Software Foundation; either version 3, or (at your option) |
---|
10 | # any later version. |
---|
11 | # |
---|
12 | # GNU Radio is distributed in the hope that it will be useful, |
---|
13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
15 | # GNU General Public License for more details. |
---|
16 | # |
---|
17 | # You should have received a copy of the GNU General Public License |
---|
18 | # along with GNU Radio; see the file COPYING. If not, write to |
---|
19 | # the Free Software Foundation, Inc., 51 Franklin Street, |
---|
20 | # Boston, MA 02110-1301, USA. |
---|
21 | # |
---|
22 | |
---|
23 | from usrpm.usrp_prims import * |
---|
24 | from optparse import OptionParser |
---|
25 | import sys |
---|
26 | from usrpm.usrp_dbid import * |
---|
27 | |
---|
28 | i2c_addr_map = { 'TX_A' : 0x54, 'RX_A' : 0x55, 'TX_B' : 0x56, 'RX_B' : 0x57 } |
---|
29 | |
---|
30 | daughterboards = { |
---|
31 | # name : ((tx-dbid, tx-oe), (rx-dbid, rx-oe)) |
---|
32 | 'basictx' : ((BASIC_TX, 0x0000), None), |
---|
33 | 'basicrx' : (None, (BASIC_RX, 0x0000)), |
---|
34 | 'dbsrx' : (None, (DBS_RX, 0x0000)), |
---|
35 | 'dbsrx_clkmod' : (None, (DBS_RX_CLKMOD, 0x0000)), |
---|
36 | 'tvrx' : (None, (TV_RX, 0x0000)), |
---|
37 | 'tvrx2' : (None, (TV_RX_REV_2, 0x0000)), |
---|
38 | 'tvrx3' : (None, (TV_RX_REV_3, 0x0000)), |
---|
39 | 'dtt754' : (None, (DTT754, 0x0000)), |
---|
40 | 'dtt768' : (None, (DTT768, 0x0000)), |
---|
41 | 'rfx400' : ((FLEX_400_TX, 0x0000), (FLEX_400_RX, 0x0000)), |
---|
42 | 'rfx900' : ((FLEX_900_TX, 0x0000), (FLEX_900_RX, 0x0000)), |
---|
43 | 'rfx1200' : ((FLEX_1200_TX, 0x0000), (FLEX_1200_RX, 0x0000)), |
---|
44 | 'rfx1800' : ((FLEX_1800_TX, 0x0000), (FLEX_1800_RX, 0x0000)), |
---|
45 | 'rfx2400' : ((FLEX_2400_TX, 0x0000), (FLEX_2400_RX, 0x0000)), |
---|
46 | 'rfx400_tx' : ((FLEX_400_TX, 0x0000), None), |
---|
47 | 'rfx900_tx' : ((FLEX_900_TX, 0x0000), None), |
---|
48 | 'rfx1200_tx' : ((FLEX_1200_TX, 0x0000), None), |
---|
49 | 'rfx1800_tx' : ((FLEX_1800_TX, 0x0000), None), |
---|
50 | 'rfx2400_tx' : ((FLEX_2400_TX, 0x0000), None), |
---|
51 | 'rfx400_rx' : (None, (FLEX_400_RX, 0x0000)), |
---|
52 | 'rfx900_rx' : (None, (FLEX_900_RX, 0x0000)), |
---|
53 | 'rfx1200_rx' : (None, (FLEX_1200_RX, 0x0000)), |
---|
54 | 'rfx1800_rx' : (None, (FLEX_1800_RX, 0x0000)), |
---|
55 | 'rfx2400_rx' : (None, (FLEX_2400_RX, 0x0000)), |
---|
56 | 'rfx400_mimo_a' : ((FLEX_400_TX_MIMO_A, 0x0000), (FLEX_400_RX_MIMO_A, 0x0000)), |
---|
57 | 'rfx900_mimo_a' : ((FLEX_900_TX_MIMO_A, 0x0000), (FLEX_900_RX_MIMO_A, 0x0000)), |
---|
58 | 'rfx1200_mimo_a' : ((FLEX_1200_TX_MIMO_A, 0x0000), (FLEX_1200_RX_MIMO_A, 0x0000)), |
---|
59 | 'rfx1800_mimo_a' : ((FLEX_1800_TX_MIMO_A, 0x0000), (FLEX_1800_RX_MIMO_A, 0x0000)), |
---|
60 | 'rfx2400_mimo_a' : ((FLEX_2400_TX_MIMO_A, 0x0000), (FLEX_2400_RX_MIMO_A, 0x0000)), |
---|
61 | 'rfx400_mimo_b' : ((FLEX_400_TX_MIMO_B, 0x0000), (FLEX_400_RX_MIMO_B, 0x0000)), |
---|
62 | 'rfx900_mimo_b' : ((FLEX_900_TX_MIMO_B, 0x0000), (FLEX_900_RX_MIMO_B, 0x0000)), |
---|
63 | 'rfx1200_mimo_b' : ((FLEX_1200_TX_MIMO_B, 0x0000), (FLEX_1200_RX_MIMO_B, 0x0000)), |
---|
64 | 'rfx1800_mimo_b' : ((FLEX_1800_TX_MIMO_B, 0x0000), (FLEX_1800_RX_MIMO_B, 0x0000)), |
---|
65 | 'rfx2400_mimo_b' : ((FLEX_2400_TX_MIMO_B, 0x0000), (FLEX_2400_RX_MIMO_B, 0x0000)), |
---|
66 | 'lftx' : ((LF_TX, 0x0000), None), |
---|
67 | 'lfrx' : (None, (LF_RX, 0x0000)), |
---|
68 | 'wbx_lo' : ((WBX_LO_TX, 0x0000), (WBX_LO_RX, 0x0000)), |
---|
69 | 'xcvr2450' : ((XCVR2450_TX, 0x0000), (XCVR2450_RX, 0x0000)), |
---|
70 | 'experimental_tx' : ((EXPERIMENTAL_TX, 0x0000), None), |
---|
71 | 'experimental_rx' : (None, (EXPERIMENTAL_RX, 0x0000)), |
---|
72 | 'rfic' : ((RFIC_TX, 0x0000), (RFIC_RX, 0x0000)), |
---|
73 | } |
---|
74 | |
---|
75 | def open_cmd_interface(which_board = 0): |
---|
76 | if not usrp_load_standard_bits (which_board, 0): |
---|
77 | raise RuntimeError, "usrp_load_standard_bits" |
---|
78 | dev = usrp_find_device (which_board) |
---|
79 | if not dev: |
---|
80 | raise RuntimeError, "usrp_find_device" |
---|
81 | u = usrp_open_cmd_interface (dev) |
---|
82 | if not u: |
---|
83 | raise RuntimeError, "usrp_open_cmd_interface" |
---|
84 | return u |
---|
85 | |
---|
86 | def write_dboard_eeprom(u, i2c_addr, dbid, oe): |
---|
87 | eeprom = 0x20 * [0] |
---|
88 | eeprom[0] = 0xDB # magic value |
---|
89 | eeprom[1] = dbid & 0xff |
---|
90 | eeprom[2] = (dbid >> 8) & 0xff |
---|
91 | eeprom[3] = oe & 0xff |
---|
92 | eeprom[4] = (oe >> 8) & 0xff |
---|
93 | eeprom[0x1f] = 0xff & (-reduce(lambda x, y: x+y, eeprom)) # checksum |
---|
94 | s = ''.join (map (chr, eeprom)) |
---|
95 | ok = usrp_eeprom_write (u, i2c_addr, 0, s) |
---|
96 | return ok |
---|
97 | |
---|
98 | |
---|
99 | def init_eeprom(u, slot_name, force, dbid, oe): |
---|
100 | i2c_addr = i2c_addr_map[slot_name] |
---|
101 | e = usrp_eeprom_read (u, i2c_addr, 0, 0x20) |
---|
102 | if not e: |
---|
103 | print "%s: no d'board, skipped" % (slot_name,) |
---|
104 | return True |
---|
105 | |
---|
106 | if not force and (sum (map (ord, e)) & 0xff) == 0 and ord (e[0]) == 0xDB: |
---|
107 | print "%s: already initialized, skipped" % (slot_name,) |
---|
108 | return True |
---|
109 | |
---|
110 | if not write_dboard_eeprom (u, i2c_addr, dbid, oe): |
---|
111 | print "%s: failed to write d'board EEPROM" % (slot_name,) |
---|
112 | return False |
---|
113 | |
---|
114 | print "%s: OK" % (slot_name,) |
---|
115 | return True |
---|
116 | |
---|
117 | |
---|
118 | def init_daughterboard(u, side, type, force): |
---|
119 | ok = True |
---|
120 | dbinfo = daughterboards[type] |
---|
121 | if dbinfo[0] is not None: # burn tx slot |
---|
122 | ok &= init_eeprom(u, 'TX_' + side, force, dbinfo[0][0], dbinfo[0][1]) |
---|
123 | if dbinfo[1] is not None: # burn rx slot |
---|
124 | ok &= init_eeprom(u, 'RX_' + side, force, dbinfo[1][0], dbinfo[1][1]) |
---|
125 | return ok |
---|
126 | |
---|
127 | |
---|
128 | def main(): |
---|
129 | dbs = daughterboards.keys() |
---|
130 | dbs.sort() |
---|
131 | usage = """\ |
---|
132 | usage: %prog [options] |
---|
133 | You must specify a type with -t or --type, |
---|
134 | and at least one side using -A and/or -B.""" |
---|
135 | |
---|
136 | parser = OptionParser(usage=usage) |
---|
137 | parser.add_option ("-t", "--type", type="choice", help="choose type from %r" % (dbs,), |
---|
138 | choices=dbs, default=None) |
---|
139 | parser.add_option ("-A", "--burn-a", action="store_true", default=False, |
---|
140 | help="burn eeprom(s) on side A") |
---|
141 | parser.add_option ("-B", "--burn-b", action="store_true", default=False, |
---|
142 | help="burn eeprom(s) on side B") |
---|
143 | parser.add_option ("-f", "--force", action="store_true", default=False, |
---|
144 | help="force init of already initialized eeproms") |
---|
145 | (options, args) = parser.parse_args () |
---|
146 | |
---|
147 | which=[] |
---|
148 | if options.burn_a: |
---|
149 | which.append('A') |
---|
150 | if options.burn_b: |
---|
151 | which.append('B') |
---|
152 | |
---|
153 | if len(args) != 0 or len(which) == 0 or options.type is None: |
---|
154 | parser.print_help() |
---|
155 | sys.exit (1) |
---|
156 | |
---|
157 | u = open_cmd_interface (0) |
---|
158 | ok = True |
---|
159 | for w in which: |
---|
160 | ok &= init_daughterboard (u, w, options.type, options.force) |
---|
161 | |
---|
162 | if ok: |
---|
163 | sys.exit (0) |
---|
164 | else: |
---|
165 | sys.exit (1) |
---|
166 | |
---|
167 | if __name__ == "__main__": |
---|
168 | main () |
---|
169 | |
---|