Revision b3a09205

b/firmware/fx2/include/usrp_commands.h
54 54
							// wIndexL:	format
55 55
							// len: how much to read
56 56

  
57
#define	VRQ_SPI_TRANSACT		0x83		// wValueH:  OUT byte 0
58
							// wValueL:  OUT byte 1
59
							// wIndexH:  OUT byte 2
60
							// wIndexL:  OUT byte 3 
61
							// wLengthH: enables 
62
							// wLengthL: transaction length
63

  
57 64
// OUT commands
58 65

  
59 66
#define	VRQ_SET_LED			0x01		// wValueL off/on {0,1}; wIndexL: which {0,1}
b/firmware/fx2/src/usrp1/spi.c
97 97
static void
98 98
write_byte_msb (unsigned char v);
99 99

  
100
unsigned char
101
transact_byte_msb (unsigned char v);
102

  
100 103
static void
101 104
write_bytes_msb (const xdata unsigned char *buf, unsigned char len);
102 105

  
103 106
static void
104 107
read_bytes_msb (xdata unsigned char *buf, unsigned char len);
105 108

  
106
  
109
static void
110
transact_bytes_msb (xdata unsigned char *buf, unsigned char len);
111

  
107 112
// returns non-zero if successful, else 0
108 113
unsigned char
109 114
spi_read (unsigned char header_hi, unsigned char header_lo,
......
214 219
  return 1;		// success
215 220
}
216 221

  
217
// ----------------------------------------------------------------
222
unsigned char
223
spi_transact (unsigned char data0, unsigned char data1,
224
              unsigned char data2, unsigned char data3,
225
              unsigned char enables, xdata unsigned char *buf,
226
              unsigned char len)
227
{
228
  if (count_bits8 (enables) > 1)
229
    return 0;		// error, too many enables set
230

  
231
  if (len > 4)
232
    return 0;
233

  
234
  setup_enables (enables);
235

  
236
  buf[0] = data0;
237
  buf[1] = data1;
238
  buf[2] = data2; 
239
  buf[3] = data3; 
240

  
241
  if (len != 0)
242
    transact_bytes_msb(buf, len);
243

  
244
  disable_all ();
245
  return 1;		// success
246
}
247

  
248
static unsigned char 
249
transact_byte_msb (unsigned char v)
250
{
251
  v = (v << 1) | (v >> 7);	// rotate left (MSB into bottom bit)
252
  bitS_OUT = v & 0x1;
253
  bitS_CLK = 1;
254
  v |= bitS_IN;                 // read into bottom bit
255
  bitS_CLK = 0;
256

  
257
  v = (v << 1) | (v >> 7);
258
  bitS_OUT = v & 0x1;
259
  bitS_CLK = 1;
260
  v |= bitS_IN;
261
  bitS_CLK = 0;
262

  
263
  v = (v << 1) | (v >> 7);
264
  bitS_OUT = v & 0x1;
265
  bitS_CLK = 1;
266
  v |= bitS_IN;
267
  bitS_CLK = 0;
268

  
269
  v = (v << 1) | (v >> 7);
270
  bitS_OUT = v & 0x1;
271
  bitS_CLK = 1;
272
  v |= bitS_IN;
273
  bitS_CLK = 0;
274

  
275
  v = (v << 1) | (v >> 7);
276
  bitS_OUT = v & 0x1;
277
  bitS_CLK = 1;
278
  v |= bitS_IN;
279
  bitS_CLK = 0;
280

  
281
  v = (v << 1) | (v >> 7);
282
  bitS_OUT = v & 0x1;
283
  bitS_CLK = 1;
284
  v |= bitS_IN;
285
  bitS_CLK = 0;
286

  
287
  v = (v << 1) | (v >> 7);
288
  bitS_OUT = v & 0x1;
289
  bitS_CLK = 1;
290
  v |= bitS_IN;
291
  bitS_CLK = 0;
292

  
293
  v = (v << 1) | (v >> 7);
294
  bitS_OUT = v & 0x1;
295
  bitS_CLK = 1;
296
  v |= bitS_IN;
297
  bitS_CLK = 0;
298

  
299
  return v;
300
}
301

  
302
static void
303
transact_bytes_msb (xdata unsigned char *buf, unsigned char len)
304
{
305
  while (len-- != 0){
306
    *buf++ = transact_byte_msb (*buf);
307
  }
308
}
218 309

  
219 310
static void
220 311
write_byte_msb (unsigned char v)
b/firmware/fx2/src/usrp1/spi.h
39 39
	   unsigned char enables, unsigned char format,
40 40
	   const xdata unsigned char *buf, unsigned char len);
41 41

  
42
// returns non-zero if successful, else 0
43
unsigned char
44
spi_transact (unsigned char data0, unsigned char data1,
45
              unsigned char data2, unsigned char data3,
46
	      unsigned char enables, xdata unsigned char *buf,
47
              unsigned char len);
48

  
42 49

  
43 50
#endif /* INCLUDED_SPI_H */
b/firmware/fx2/src/usrp1/usrp_main.c
117 117
      EP0BCH = 0;
118 118
      EP0BCL = wLengthL;
119 119
      break;
120
      
120

  
121 121
    case VRQ_SPI_READ:
122 122
      if (!spi_read (wValueH, wValueL, wIndexH, wIndexL, EP0BUF, wLengthL))
123 123
	return 0;
......
126 126
      EP0BCL = wLengthL;
127 127
      break;
128 128

  
129
    case VRQ_SPI_TRANSACT:
130
      if (!spi_transact (wValueH, wValueL, wIndexH, wIndexL, wLengthH, EP0BUF, wLengthL))
131
	return 0;
132

  
133
      EP0BCH = 0;
134
      EP0BCL = wLengthL;
135
      break;
136

  
129 137
    default:
130 138
      return 0;
131 139
    }

Also available in: Unified diff