Revision df74cfa4 host/lib/usrp/usrp1/dboard_iface.cpp

b/host/lib/usrp/usrp1/dboard_iface.cpp
31 31
using namespace uhd::usrp;
32 32
using namespace boost::assign;
33 33

  
34
/***********************************************************************
35
 * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
36
 * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
37
 * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
38
 * TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO TODO
39
 *
40
 * check the _dboard_slot and handle conditionally...
41
 **********************************************************************/
42

  
43 34
class usrp1_dboard_iface : public dboard_iface {
44 35
public:
45 36

  
......
161 152
{
162 153
    switch(unit) {
163 154
    case UNIT_RX:
164
         _iface->poke32(FR_ATR_MASK_1, value);
165
         _iface->poke32(FR_ATR_MASK_3, 0x00000000);
166
         break; 
155
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
156
             _iface->poke32(FR_ATR_MASK_1, value);
157
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
158
             _iface->poke32(FR_ATR_MASK_3, value);
159
        break;
167 160
    case UNIT_TX:
168
         _iface->poke32(FR_ATR_MASK_0, value);
169
         _iface->poke32(FR_ATR_MASK_2, 0x00000000);
170
         break;
161
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
162
            _iface->poke32(FR_ATR_MASK_0, value);
163
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
164
            _iface->poke32(FR_ATR_MASK_2, value);
165
        break;
171 166
    }
172 167
}
173 168

  
......
175 170
{
176 171
    switch(unit) {
177 172
    case UNIT_RX:
178
        _iface->poke32(FR_OE_1, 0xffff0000 | value);
179
        _iface->poke32(FR_OE_3, 0xffff0000);
180
        break; 
173
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
174
            _iface->poke32(FR_OE_1, 0xffff0000 | value);
175
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
176
            _iface->poke32(FR_OE_3, 0xffff0000 | value);
177
        break;
181 178
    case UNIT_TX:
182
        _iface->poke32(FR_OE_0, 0xffff0000 | value);
183
        _iface->poke32(FR_OE_2, 0xffff0000);
179
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
180
            _iface->poke32(FR_OE_0, 0xffff0000 | value);
181
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
182
            _iface->poke32(FR_OE_2, 0xffff0000 | value);
184 183
        break;
185 184
    }
186 185
}
......
189 188
{
190 189
    switch(unit) {
191 190
    case UNIT_RX:
192
        _iface->poke32(FR_IO_1, 0xffff0000 | value);
191
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
192
            _iface->poke32(FR_IO_1, 0xffff0000 | value);
193
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
194
            _iface->poke32(FR_IO_3, 0xffff0000 | value);
193 195
        break;
194 196
    case UNIT_TX:
195
        _iface->poke32(FR_IO_0, 0xffff0000 | value);
197
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
198
            _iface->poke32(FR_IO_0, 0xffff0000 | value);
199
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
200
            _iface->poke32(FR_IO_2, 0xffff0000 | value);
196 201
        break;
197 202
    }
198 203
}
......
200 205
boost::uint16_t usrp1_dboard_iface::read_gpio(unit_t unit)
201 206
{
202 207
    boost::uint32_t out_value;
203
    boost::uint16_t ret_value;
208

  
209
    if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
210
        out_value = _iface->peek32(1);
211
    else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
212
        out_value = _iface->peek32(2);
213
    else
214
        UHD_THROW_INVALID_CODE_PATH();
204 215

  
205 216
    switch(unit) {
206 217
    case UNIT_RX:
207
        //magic
208
        out_value = _iface->peek32(1);
209
        ret_value = (out_value >> 16) & 0x0000ffff;
210
        return ret_value;
218
        return (boost::uint16_t)((out_value >> 16) & 0x0000ffff);
211 219
    case UNIT_TX:
212
        //magic
213
        out_value = _iface->peek32(1);
214
        ret_value = (out_value >>  0) & 0x0000ffff;
215
        return ret_value;
220
        return (boost::uint16_t)((out_value >>  0) & 0x0000ffff);
216 221
    }
217 222
    UHD_ASSERT_THROW(false);
218 223
}
......
228 233

  
229 234
    switch(unit) {
230 235
    case UNIT_RX:
231
        _iface->poke32(FR_ATR_RXVAL_1, value);
232
        _iface->poke32(FR_ATR_RXVAL_3, 0x0000);
236
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
237
            _iface->poke32(FR_ATR_RXVAL_1, value);
238
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
239
            _iface->poke32(FR_ATR_RXVAL_3, value);
233 240
        break; 
234 241
    case UNIT_TX:
235
        //_iface->poke32(FR_ATR_TXVAL_0, value);
236
        _iface->poke32(FR_ATR_TXVAL_0, 0x0000);
237
        _iface->poke32(FR_ATR_TXVAL_2, 0x0000);
242
        if (_dboard_slot == usrp1_impl::DBOARD_SLOT_A)
243
            _iface->poke32(FR_ATR_TXVAL_0, value);
244
        else if (_dboard_slot == usrp1_impl::DBOARD_SLOT_B)
245
            _iface->poke32(FR_ATR_TXVAL_2, value);
238 246
        break;
239 247
    }
240 248
}
......
244 252
/*!
245 253
 * Static function to convert a unit type to a spi slave device number.
246 254
 * \param unit the dboard interface unit type enum
255
 * \param slot the side (A or B) the dboard is attached
247 256
 * \return the slave device number
248 257
 */
249
static boost::uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit)
258
static boost::uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit,
259
                                           usrp1_impl::dboard_slot_t slot)
250 260
{
251 261
    switch(unit) {
252
    case dboard_iface::UNIT_TX: return SPI_ENABLE_TX_A; 
253
    case dboard_iface::UNIT_RX: return SPI_ENABLE_RX_A;
262
    case dboard_iface::UNIT_TX:
263
        if (slot == usrp1_impl::DBOARD_SLOT_A)
264
            return SPI_ENABLE_TX_A; 
265
        else if (slot == usrp1_impl::DBOARD_SLOT_B)
266
            return SPI_ENABLE_TX_B;
267
        else
268
            break;
269
    case dboard_iface::UNIT_RX:
270
        if (slot == usrp1_impl::DBOARD_SLOT_A)
271
            return SPI_ENABLE_RX_A; 
272
        else if (slot == usrp1_impl::DBOARD_SLOT_B)
273
            return SPI_ENABLE_RX_B;
274
        else
275
            break;
254 276
    }
255 277
    throw std::invalid_argument("unknown unit type");
256

  
257 278
}
258 279

  
259 280
void usrp1_dboard_iface::write_spi(unit_t unit,
......
261 282
                                   boost::uint32_t data,
262 283
                                   size_t num_bits)
263 284
{
264
    _iface->transact_spi(unit_to_otw_spi_dev(unit),
285
    _iface->transact_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
265 286
                         config, data, num_bits, false);
266 287
}
267 288

  
......
270 291
                                                   boost::uint32_t data,
271 292
                                                   size_t num_bits)
272 293
{
273
    return _iface->transact_spi(unit_to_otw_spi_dev(unit),
294
    return _iface->transact_spi(unit_to_otw_spi_dev(unit, _dboard_slot),
274 295
                                config, data, num_bits, true);
275 296
}
276 297

  

Also available in: Unified diff