3 # Copyright 2005,2007 Free Software Foundation, Inc.
5 # This file is part of GNU Radio
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)
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.
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.
23 from usrpm.usrp_prims import *
24 from optparse import OptionParser
26 from usrpm.usrp_dbid import *
28 i2c_addr_map = { 'TX_A' : 0x54, 'RX_A' : 0x55, 'TX_B' : 0x56, 'RX_B' : 0x57 }
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 'tvrx_mimo' : (None, (TV_RX_MIMO, 0x0000)),
40 'tvrx2_mimo' : (None, (TV_RX_REV_2_MIMO, 0x0000)),
41 'tvrx3_mimo' : (None, (TV_RX_REV_3_MIMO, 0x0000)),
42 'dtt754' : (None, (DTT754, 0x0000)),
43 'dtt768' : (None, (DTT768, 0x0000)),
44 'rfx400' : ((FLEX_400_TX, 0x0000), (FLEX_400_RX, 0x0000)),
45 'rfx900' : ((FLEX_900_TX, 0x0000), (FLEX_900_RX, 0x0000)),
46 'rfx1200' : ((FLEX_1200_TX, 0x0000), (FLEX_1200_RX, 0x0000)),
47 'rfx1800' : ((FLEX_1800_TX, 0x0000), (FLEX_1800_RX, 0x0000)),
48 'rfx2400' : ((FLEX_2400_TX, 0x0000), (FLEX_2400_RX, 0x0000)),
49 'rfx400_tx' : ((FLEX_400_TX, 0x0000), None),
50 'rfx900_tx' : ((FLEX_900_TX, 0x0000), None),
51 'rfx1200_tx' : ((FLEX_1200_TX, 0x0000), None),
52 'rfx1800_tx' : ((FLEX_1800_TX, 0x0000), None),
53 'rfx2400_tx' : ((FLEX_2400_TX, 0x0000), None),
54 'rfx400_rx' : (None, (FLEX_400_RX, 0x0000)),
55 'rfx900_rx' : (None, (FLEX_900_RX, 0x0000)),
56 'rfx1200_rx' : (None, (FLEX_1200_RX, 0x0000)),
57 'rfx1800_rx' : (None, (FLEX_1800_RX, 0x0000)),
58 'rfx2400_rx' : (None, (FLEX_2400_RX, 0x0000)),
59 'rfx400_mimo_a' : ((FLEX_400_TX_MIMO_A, 0x0000), (FLEX_400_RX_MIMO_A, 0x0000)),
60 'rfx900_mimo_a' : ((FLEX_900_TX_MIMO_A, 0x0000), (FLEX_900_RX_MIMO_A, 0x0000)),
61 'rfx1200_mimo_a' : ((FLEX_1200_TX_MIMO_A, 0x0000), (FLEX_1200_RX_MIMO_A, 0x0000)),
62 'rfx1800_mimo_a' : ((FLEX_1800_TX_MIMO_A, 0x0000), (FLEX_1800_RX_MIMO_A, 0x0000)),
63 'rfx2400_mimo_a' : ((FLEX_2400_TX_MIMO_A, 0x0000), (FLEX_2400_RX_MIMO_A, 0x0000)),
64 'rfx400_mimo_b' : ((FLEX_400_TX_MIMO_B, 0x0000), (FLEX_400_RX_MIMO_B, 0x0000)),
65 'rfx900_mimo_b' : ((FLEX_900_TX_MIMO_B, 0x0000), (FLEX_900_RX_MIMO_B, 0x0000)),
66 'rfx1200_mimo_b' : ((FLEX_1200_TX_MIMO_B, 0x0000), (FLEX_1200_RX_MIMO_B, 0x0000)),
67 'rfx1800_mimo_b' : ((FLEX_1800_TX_MIMO_B, 0x0000), (FLEX_1800_RX_MIMO_B, 0x0000)),
68 'rfx2400_mimo_b' : ((FLEX_2400_TX_MIMO_B, 0x0000), (FLEX_2400_RX_MIMO_B, 0x0000)),
69 'lftx' : ((LF_TX, 0x0000), None),
70 'lfrx' : (None, (LF_RX, 0x0000)),
71 'wbx_lo' : ((WBX_LO_TX, 0x0000), (WBX_LO_RX, 0x0000)),
72 'xcvr2450' : ((XCVR2450_TX, 0x0000), (XCVR2450_RX, 0x0000)),
73 'experimental_tx' : ((EXPERIMENTAL_TX, 0x0000), None),
74 'experimental_rx' : (None, (EXPERIMENTAL_RX, 0x0000)),
77 def open_cmd_interface(which_board = 0):
78 if not usrp_load_standard_bits (which_board, 0):
79 raise RuntimeError, "usrp_load_standard_bits"
80 dev = usrp_find_device (which_board)
82 raise RuntimeError, "usrp_find_device"
83 u = usrp_open_cmd_interface (dev)
85 raise RuntimeError, "usrp_open_cmd_interface"
88 def write_dboard_eeprom(u, i2c_addr, dbid, oe):
90 eeprom[0] = 0xDB # magic value
91 eeprom[1] = dbid & 0xff
92 eeprom[2] = (dbid >> 8) & 0xff
94 eeprom[4] = (oe >> 8) & 0xff
95 eeprom[0x1f] = 0xff & (-reduce(lambda x, y: x+y, eeprom)) # checksum
96 s = ''.join (map (chr, eeprom))
97 ok = usrp_eeprom_write (u, i2c_addr, 0, s)
101 def init_eeprom(u, slot_name, force, dbid, oe):
102 i2c_addr = i2c_addr_map[slot_name]
103 e = usrp_eeprom_read (u, i2c_addr, 0, 0x20)
105 print "%s: no d'board, skipped" % (slot_name,)
108 if not force and (sum (map (ord, e)) & 0xff) == 0 and ord (e[0]) == 0xDB:
109 print "%s: already initialized, skipped" % (slot_name,)
112 if not write_dboard_eeprom (u, i2c_addr, dbid, oe):
113 print "%s: failed to write d'board EEPROM" % (slot_name,)
116 print "%s: OK" % (slot_name,)
120 def init_daughterboard(u, side, type, force):
122 dbinfo = daughterboards[type]
123 if dbinfo[0] is not None: # burn tx slot
124 ok &= init_eeprom(u, 'TX_' + side, force, dbinfo[0][0], dbinfo[0][1])
125 if dbinfo[1] is not None: # burn rx slot
126 ok &= init_eeprom(u, 'RX_' + side, force, dbinfo[1][0], dbinfo[1][1])
131 dbs = daughterboards.keys()
134 usage: %prog [options]
135 You must specify a type with -t or --type,
136 and at least one side using -A and/or -B."""
138 parser = OptionParser(usage=usage)
139 parser.add_option ("-t", "--type", type="choice", help="choose type from %r" % (dbs,),
140 choices=dbs, default=None)
141 parser.add_option ("-A", "--burn-a", action="store_true", default=False,
142 help="burn eeprom(s) on side A")
143 parser.add_option ("-B", "--burn-b", action="store_true", default=False,
144 help="burn eeprom(s) on side B")
145 parser.add_option ("-f", "--force", action="store_true", default=False,
146 help="force init of already initialized eeproms")
147 (options, args) = parser.parse_args ()
155 if len(args) != 0 or len(which) == 0 or options.type is None:
159 u = open_cmd_interface (0)
162 ok &= init_daughterboard (u, w, options.type, options.force)
169 if __name__ == "__main__":