OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [or_debug_proxy/] [src/] [FT2232cMpsseJtag.cpp] - Blame information for rev 1779

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1779 julius
/*++
2
 
3
FTC MPSSE Interface DLLs - Copyright © FTDI Ltd. 2009
4
 
5
 
6
The source code to the FTCI2C, FTCJTAG and FTCSPI DLLs is provided as-is and no warranty is made as to its function or reliability.
7
 
8
This source code may be freely modified and redistributed, provided that the FTDI Ltd. copyright notice remains intact.
9
 
10
Copyright (c) 2005  Future Technology Devices International Ltd.
11
 
12
Module Name:
13
 
14
    FT2232cMpsseJtag.cpp
15
 
16
Abstract:
17
 
18
    FT2232C Dual Device Device Class Implementation.
19
 
20
Environment:
21
 
22
    kernel & user mode
23
 
24
Revision History:
25
 
26
    07/02/05    kra     Created.
27
    24/08/05    kra     Added new function JTAG_GenerateClockPulses and new error code FTC_INVALID_NUMBER_CLOCK_PULSES
28
 
29
--*/
30
 
31
#define WIO_DEFINED
32
 
33
#include <unistd.h>
34
#include <stdio.h>
35
//#include <linux/unistd.h> // -- Possibly not needed, trying without -jb
36
#include <errno.h>
37
#include <sys/types.h>
38
#include <sys/stat.h>
39
#include <fcntl.h> 
40
#include <sys/ioctl.h> 
41
#include <string.h>
42
#include <time.h>
43
 
44
// included <sched.h> for sched_yield() calls, 
45
// used in place of Windows' Sleep(0) calls, 
46
// however may not be good idea, not sure it's
47
// exactly the same thing!! -- Julius
48
#include <sched.h>
49
 
50
 
51
#include "FT2232cMpsseJtag.h"
52
 
53
 
54
FTC_STATUS FT2232cMpsseJtag::CheckWriteDataToExternalDeviceBitsBytesParameters(DWORD dwNumBitsToWrite, DWORD dwNumBytesToWrite)
55
{
56
  FTC_STATUS Status = FTC_SUCCESS;
57
  DWORD dwNumBytesForNumBits = 0;
58
 
59
  if (((dwNumBitsToWrite >= MIN_NUM_BITS) && (dwNumBitsToWrite <= MAX_NUM_BITS)) &&
60
      ((dwNumBytesToWrite >= MIN_NUM_BYTES) && (dwNumBytesToWrite <= MAX_NUM_BYTES)))
61
  {
62
    dwNumBytesForNumBits = (dwNumBitsToWrite / NUMBITSINBYTE);
63
 
64
    if ((dwNumBitsToWrite % NUMBITSINBYTE) > 0)
65
      dwNumBytesForNumBits = dwNumBytesForNumBits + 1;
66
 
67
    if (dwNumBytesForNumBits > dwNumBytesToWrite)
68
      Status = FTC_NUMBER_BYTES_TOO_SMALL;
69
  }
70
  else
71
  {
72
    if ((dwNumBitsToWrite < MIN_NUM_BITS) || (dwNumBitsToWrite > MAX_NUM_BITS))
73
      Status = FTC_INVALID_NUMBER_BITS;
74
    else
75
      Status = FTC_INVALID_NUMBER_BYTES;
76
  }
77
 
78
  return Status;
79
}
80
 
81
void FT2232cMpsseJtag::AddByteToOutputBuffer(DWORD dwOutputByte, BOOL bClearOutputBuffer)
82
{
83
  DWORD dwNumBytesToSend_temp = 0;
84
 
85
  if (iCommandsSequenceDataDeviceIndex == -1)
86
    FTC_AddByteToOutputBuffer(dwOutputByte, bClearOutputBuffer);
87
  else
88
  {
89
    // This is used when you are building up a sequence of commands ie write, read and write/read
90
    dwNumBytesToSend_temp = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumBytesToSend;
91
 
92
    (*OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].pCommandsSequenceDataOutPutBuffer)[dwNumBytesToSend_temp] = (dwOutputByte & '\xFF');
93
 
94
    dwNumBytesToSend_temp = dwNumBytesToSend_temp + 1;
95
 
96
    OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumBytesToSend = dwNumBytesToSend_temp;
97
  }
98
}
99
 
100
FTC_STATUS FT2232cMpsseJtag::SetDataInOutClockFrequency(FTC_HANDLE ftHandle, DWORD dwClockDivisor)
101
{
102
  FTC_STATUS Status = FTC_SUCCESS;
103
 
104
  AddByteToOutputBuffer(SET_CLOCK_FREQUENCY_CMD, true);
105
  AddByteToOutputBuffer(dwClockDivisor, false);
106
  AddByteToOutputBuffer((dwClockDivisor >> 8), false);
107
 
108
  Status = FTC_SendBytesToDevice(ftHandle);
109
 
110
  return Status;
111
}
112
 
113
FTC_STATUS FT2232cMpsseJtag::InitDataInOutClockFrequency(FTC_HANDLE ftHandle, DWORD dwClockDivisor)
114
{
115
  FTC_STATUS Status = FTC_SUCCESS;
116
 
117
  // set general purpose I/O low pins 1-4 all to input except TDO
118
  AddByteToOutputBuffer(SET_LOW_BYTE_DATA_BITS_CMD, true);
119
 
120
  dwSavedLowPinsValue = (dwSavedLowPinsValue & '\xF0');
121
  dwSavedLowPinsValue = (dwSavedLowPinsValue | '\x08'); // TDI,TCK start low
122
  AddByteToOutputBuffer(dwSavedLowPinsValue, false);
123
 
124
  dwSavedLowPinsDirection = (dwSavedLowPinsDirection & '\xF0');
125
  dwSavedLowPinsDirection = (dwSavedLowPinsDirection | '\x0B');
126
  AddByteToOutputBuffer(dwSavedLowPinsDirection, false);
127
 
128
  // set general purpose I/O high pins 1-4 all to input
129
  AddByteToOutputBuffer(SET_HIGH_BYTE_DATA_BITS_CMD, false);
130
  AddByteToOutputBuffer(0, false);
131
  AddByteToOutputBuffer(0, false);
132
 
133
  Status = FTC_SendBytesToDevice(ftHandle);
134
 
135
  if (Status == FTC_SUCCESS)
136
    SetDataInOutClockFrequency(ftHandle, dwClockDivisor);
137
 
138
  return Status;
139
}
140
 
141
// This procedure sets the JTAG to a new state
142
void FT2232cMpsseJtag::SetJTAGToNewState(DWORD dwNewJtagState, DWORD dwNumTmsClocks, BOOL bDoReadOperation)
143
{
144
  if ((dwNumTmsClocks >= 1) && (dwNumTmsClocks <= 7))
145
  {
146
    if (bDoReadOperation == TRUE)
147
      AddByteToOutputBuffer(CLK_DATA_TMS_READ_CMD, false);
148
    else
149
      AddByteToOutputBuffer(CLK_DATA_TMS_NO_READ_CMD, false);
150
 
151
    AddByteToOutputBuffer(((dwNumTmsClocks - 1) & '\xFF'), false);
152
    AddByteToOutputBuffer((dwNewJtagState & '\xFF'), false);
153
  }
154
}
155
 
156
// This function returns the number of TMS clocks to work out the last bit of TDO
157
DWORD FT2232cMpsseJtag::MoveJTAGFromOneStateToAnother(JtagStates NewJtagState, DWORD dwLastDataBit, BOOL bDoReadOperation)
158
{
159
  DWORD dwNumTmsClocks = 0;
160
 
161
  if (CurrentJtagState == Undefined)
162
  {
163
    SetJTAGToNewState('\x7F', 7, false);
164
    CurrentJtagState = TestLogicReset;
165
  }
166
 
167
  switch (CurrentJtagState)
168
  {
169
    case TestLogicReset:
170
      dwNumTmsClocks = TestLogicResetToNewJTAGStateNumTMSClocks[NewJtagState];
171
      SetJTAGToNewState((TestLogicResetToNewJTAGState[NewJtagState] | (dwLastDataBit << 7)), dwNumTmsClocks, bDoReadOperation);
172
    break;
173
    case RunTestIdle:
174
      dwNumTmsClocks = RunTestIdleToNewJTAGStateNumTMSClocks[NewJtagState];
175
      SetJTAGToNewState((RunTestIdleToNewJTAGState[NewJtagState] | (dwLastDataBit << 7)), dwNumTmsClocks, bDoReadOperation);
176
    break;
177
    case PauseDataRegister:
178
      dwNumTmsClocks = PauseDataRegToNewJTAGStateNumTMSClocks[NewJtagState];
179
      SetJTAGToNewState((PauseDataRegToNewJTAGState[NewJtagState] | (dwLastDataBit << 7)), dwNumTmsClocks, bDoReadOperation);
180
    break;
181
    case PauseInstructionRegister:
182
      dwNumTmsClocks = PauseInstructionRegToNewJTAGStateNumTMSClocks[NewJtagState];
183
      SetJTAGToNewState((PauseInstructionRegToNewJTAGState[NewJtagState] | (dwLastDataBit << 7)), dwNumTmsClocks, bDoReadOperation);
184
    break;
185
    case ShiftDataRegister:
186
      dwNumTmsClocks = ShiftDataRegToNewJTAGStateNumTMSClocks[NewJtagState];
187
      SetJTAGToNewState((ShiftDataRegToNewJTAGState[NewJtagState] | (dwLastDataBit << 7)), dwNumTmsClocks, bDoReadOperation);
188
    break;
189
    case ShiftInstructionRegister:
190
      dwNumTmsClocks = ShiftInstructionRegToNewJTAGStateNumTMSClocks[NewJtagState];
191
      SetJTAGToNewState((ShiftInstructionRegToNewJTAGState[NewJtagState] | (dwLastDataBit << 7)), dwNumTmsClocks, bDoReadOperation);
192
    break;
193
  default :
194
    // Added default state -- Julius
195
    dwNumTmsClocks = TestLogicResetToNewJTAGStateNumTMSClocks[NewJtagState];
196
    SetJTAGToNewState((TestLogicResetToNewJTAGState[NewJtagState] | (dwLastDataBit << 7)), dwNumTmsClocks, bDoReadOperation);
197
    break;
198
  }
199
 
200
  CurrentJtagState = NewJtagState;
201
 
202
  return dwNumTmsClocks;
203
}
204
 
205
FTC_STATUS FT2232cMpsseJtag::ResetTAPContollerExternalDeviceSetToTestIdleMode(FTC_HANDLE ftHandle)
206
{
207
  FTC_STATUS Status = FTC_SUCCESS;
208
 
209
  // set I/O low bits all out except TDO
210
  AddByteToOutputBuffer(SET_LOW_BYTE_DATA_BITS_CMD, true);
211
 
212
  dwSavedLowPinsValue = (dwSavedLowPinsValue & '\xFF');
213
  // TDI,TCK start low
214
  dwSavedLowPinsValue = (dwSavedLowPinsValue | '\x08');
215
  AddByteToOutputBuffer(dwSavedLowPinsValue, false);
216
 
217
  dwSavedLowPinsDirection = (dwSavedLowPinsDirection & '\xFF');
218
  dwSavedLowPinsDirection = (dwSavedLowPinsDirection | '\x0B');
219
  AddByteToOutputBuffer(dwSavedLowPinsDirection, false);
220
 
221
  //MoveJTAGFromOneStateToAnother(TestLogicReset, 1, false);JtagStates
222
  MoveJTAGFromOneStateToAnother(Undefined, 1, false);
223
 
224
  MoveJTAGFromOneStateToAnother(RunTestIdle, NO_LAST_DATA_BIT, FALSE);
225
 
226
  Status = FTC_SendBytesToDevice(ftHandle);
227
 
228
  return Status;
229
}
230
 
231
FTC_STATUS FT2232cMpsseJtag::SetGeneralPurposeInputOutputPins(FTC_HANDLE ftHandle, BOOL bControlLowInputOutputPins,
232
                                                              DWORD dwLowPinsDirection, DWORD dwLowPinsValue,
233
                                                              BOOL bControlHighInputOutputPins,
234
                                                              DWORD dwHighPinsDirection, DWORD dwHighPinsValue)
235
{
236
  FTC_STATUS Status = FTC_SUCCESS;
237
 
238
  if (bControlLowInputOutputPins != false)
239
  {
240
    // output on the general purpose I/O low pins 1-4
241
    AddByteToOutputBuffer(SET_LOW_BYTE_DATA_BITS_CMD, true);
242
 
243
    // shift left by 4 bits ie move general purpose I/O low pins 1-4 from bits 0-3 to bits 4-7
244
    dwLowPinsValue = ((dwLowPinsValue & '\x0F') << 4);
245
 
246
    dwSavedLowPinsValue = (dwSavedLowPinsValue & '\x0F');
247
    dwSavedLowPinsValue = (dwSavedLowPinsValue | dwLowPinsValue);
248
    AddByteToOutputBuffer(dwSavedLowPinsValue, false);
249
 
250
    // shift left by 4 bits ie move general purpose I/O low pins 1-4 from bits 0-3 to bits 4-7
251
    dwLowPinsDirection = ((dwLowPinsDirection & '\x0F') << 4);
252
 
253
    dwSavedLowPinsDirection = (dwSavedLowPinsDirection & '\x0F');
254
    dwSavedLowPinsDirection = (dwSavedLowPinsDirection | dwLowPinsDirection);
255
    AddByteToOutputBuffer(dwSavedLowPinsDirection, false);
256
 
257
    Status = FTC_SendBytesToDevice(ftHandle);
258
  }
259
 
260
  if (Status == FTC_SUCCESS)
261
  {
262
    if (bControlHighInputOutputPins != false)
263
    {
264
      // output on the general purpose I/O high pins 1-4
265
      AddByteToOutputBuffer(SET_HIGH_BYTE_DATA_BITS_CMD, true);
266
 
267
      dwHighPinsValue = (dwHighPinsValue & '\x0F');
268
      AddByteToOutputBuffer(dwHighPinsValue, false);
269
 
270
      dwHighPinsDirection = (dwHighPinsDirection & '\x0F');
271
      AddByteToOutputBuffer(dwHighPinsDirection, false);
272
 
273
      Status = FTC_SendBytesToDevice(ftHandle);
274
    }
275
  }
276
 
277
  return Status;
278
}
279
 
280
void FT2232cMpsseJtag::GetGeneralPurposeInputOutputPinsInputStates(DWORD dwInputStatesReturnedValue, PFTC_LOW_HIGH_PINS pPinsInputData)
281
{
282
  if ((dwInputStatesReturnedValue & PIN1_HIGH_VALUE) == PIN1_HIGH_VALUE)
283
    pPinsInputData->bPin1LowHighState = TRUE;
284
 
285
  if ((dwInputStatesReturnedValue & PIN2_HIGH_VALUE) == PIN2_HIGH_VALUE)
286
    pPinsInputData->bPin2LowHighState = TRUE;
287
 
288
  if ((dwInputStatesReturnedValue & PIN3_HIGH_VALUE) == PIN3_HIGH_VALUE)
289
    pPinsInputData->bPin3LowHighState = TRUE;
290
 
291
  if ((dwInputStatesReturnedValue & PIN4_HIGH_VALUE) == PIN4_HIGH_VALUE)
292
    pPinsInputData->bPin4LowHighState = TRUE;
293
}
294
 
295
FTC_STATUS FT2232cMpsseJtag::GetGeneralPurposeInputOutputPins(FTC_HANDLE ftHandle, BOOL bControlLowInputOutputPins,
296
                                                              PFTC_LOW_HIGH_PINS pLowPinsInputData,
297
                                                              BOOL bControlHighInputOutputPins,
298
                                                              PFTC_LOW_HIGH_PINS pHighPinsInputData)
299
{
300
  FTC_STATUS Status = FTC_SUCCESS;
301
  InputByteBuffer InputBuffer;
302
  DWORD dwNumBytesRead = 0;
303
  DWORD dwNumBytesDeviceInputBuffer;
304
 
305
  pLowPinsInputData->bPin1LowHighState = false;
306
  pLowPinsInputData->bPin2LowHighState = false;
307
  pLowPinsInputData->bPin3LowHighState = false;
308
  pLowPinsInputData->bPin4LowHighState = false;
309
  pHighPinsInputData->bPin1LowHighState = false;
310
  pHighPinsInputData->bPin2LowHighState = false;
311
  pHighPinsInputData->bPin3LowHighState = false;
312
  pHighPinsInputData->bPin4LowHighState = false;
313
 
314
  // Put in this small delay incase the application programmer does a get GPIOs immediately after a set GPIOs
315
  //Sleep(5);
316
  // Removed Sleep() call and replaced with linux sleep to give up 
317
  // timeslice - sched_yield() -- not sure is best idea! -- Julius
318
  sched_yield();
319
 
320
  if (bControlLowInputOutputPins != false)
321
  {
322
    // Get the number of bytes in the device input buffer
323
    Status = FT_GetQueueStatus((FT_HANDLE)ftHandle, &dwNumBytesDeviceInputBuffer);
324
 
325
    if (Status == FTC_SUCCESS)
326
    {
327
      if (dwNumBytesDeviceInputBuffer > 0)
328
        Status = FTC_ReadBytesFromDevice(ftHandle, &InputBuffer, dwNumBytesDeviceInputBuffer, &dwNumBytesRead);
329
 
330
      if (Status == FTC_SUCCESS)
331
      {
332
        // get the states of the general purpose I/O low pins 1-4
333
        AddByteToOutputBuffer(GET_LOW_BYTE_DATA_BITS_CMD, true);
334
        AddByteToOutputBuffer(SEND_ANSWER_BACK_IMMEDIATELY_CMD, false);
335
        Status = FTC_SendBytesToDevice(ftHandle);
336
 
337
        if (Status == FTC_SUCCESS)
338
        {
339
          Status = FTC_GetNumberBytesFromDeviceInputBuffer(ftHandle, &dwNumBytesDeviceInputBuffer);
340
 
341
          if (Status == FTC_SUCCESS)
342
          {
343
            Status = FTC_ReadBytesFromDevice(ftHandle, &InputBuffer, dwNumBytesDeviceInputBuffer, &dwNumBytesRead);
344
 
345
            if (Status == FTC_SUCCESS)
346
              // shift right by 4 bits ie move general purpose I/O low pins 1-4 from bits 4-7 to bits 0-3
347
              GetGeneralPurposeInputOutputPinsInputStates((InputBuffer[0] >> 4), pLowPinsInputData);
348
          }
349
        }
350
      }
351
    }
352
  }
353
 
354
  if (bControlHighInputOutputPins != false)
355
  {
356
    // Get the number of bytes in the device input buffer
357
    Status = FT_GetQueueStatus((FT_HANDLE)ftHandle, &dwNumBytesDeviceInputBuffer);
358
 
359
    if (Status == FTC_SUCCESS)
360
    {
361
      if (dwNumBytesDeviceInputBuffer > 0)
362
        Status = FTC_ReadBytesFromDevice(ftHandle, &InputBuffer, dwNumBytesDeviceInputBuffer, &dwNumBytesRead);
363
 
364
      if (Status == FTC_SUCCESS)
365
      {
366
        // get the states of the general purpose I/O high pins 1-4
367
        AddByteToOutputBuffer(GET_HIGH_BYTE_DATA_BITS_CMD, true);
368
        AddByteToOutputBuffer(SEND_ANSWER_BACK_IMMEDIATELY_CMD, false);
369
        Status = FTC_SendBytesToDevice(ftHandle);
370
 
371
        if (Status == FTC_SUCCESS)
372
        {
373
          Status = FTC_GetNumberBytesFromDeviceInputBuffer(ftHandle, &dwNumBytesDeviceInputBuffer);
374
 
375
          if (Status == FTC_SUCCESS)
376
          {
377
            Status = FTC_ReadBytesFromDevice(ftHandle, &InputBuffer, dwNumBytesDeviceInputBuffer, &dwNumBytesRead);
378
 
379
            if (Status == FTC_SUCCESS)
380
              GetGeneralPurposeInputOutputPinsInputStates(InputBuffer[0], pHighPinsInputData);
381
          }
382
        }
383
      }
384
    }
385
  }
386
 
387
  return Status;
388
}
389
 
390
void FT2232cMpsseJtag::AddWriteCommandDataToOutPutBuffer(BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
391
                                                         PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
392
                                                         DWORD dwTapControllerState)
393
{
394
  DWORD dwModNumBitsToWrite = 0;
395
  DWORD dwDataBufferIndex = 0;
396
  DWORD dwNumDataBytes = 0;
397
  DWORD dwNumRemainingDataBits = 0;
398
  DWORD dwLastDataBit = 0;
399
  DWORD dwDataBitIndex = 0;
400
 
401
  // adjust for bit count of 1 less than no of bits
402
  dwModNumBitsToWrite = (dwNumBitsToWrite - 1);
403
 
404
  if (bInstructionTestData == false)
405
    MoveJTAGFromOneStateToAnother(ShiftDataRegister, NO_LAST_DATA_BIT, false);
406
  else
407
    MoveJTAGFromOneStateToAnother(ShiftInstructionRegister, NO_LAST_DATA_BIT, false);
408
 
409
  dwNumDataBytes = (dwModNumBitsToWrite / 8);
410
 
411
  if (dwNumDataBytes > 0)
412
  {
413
    // Number of whole bytes
414
    dwNumDataBytes = (dwNumDataBytes - 1);
415
 
416
    // clk data bytes out on -ve clk LSB
417
    AddByteToOutputBuffer(CLK_DATA_BYTES_OUT_ON_NEG_CLK_LSB_FIRST_CMD, false);
418
    AddByteToOutputBuffer((dwNumDataBytes & '\xFF'), false);
419
    AddByteToOutputBuffer(((dwNumDataBytes / 256) & '\xFF'), false);
420
 
421
    // now add the data bytes to go out
422
    do
423
    {
424
      AddByteToOutputBuffer((*pWriteDataBuffer)[dwDataBufferIndex], false);
425
      dwDataBufferIndex = (dwDataBufferIndex + 1);
426
    }
427
    while (dwDataBufferIndex < (dwNumDataBytes + 1));
428
  }
429
 
430
  dwNumRemainingDataBits = (dwModNumBitsToWrite % 8);
431
 
432
  if (dwNumRemainingDataBits > 0)
433
  {
434
    dwNumRemainingDataBits = (dwNumRemainingDataBits - 1);
435
 
436
    //clk data bits out on -ve clk LSB
437
    AddByteToOutputBuffer(CLK_DATA_BITS_OUT_ON_NEG_CLK_LSB_FIRST_CMD, false);
438
    AddByteToOutputBuffer((dwNumRemainingDataBits & '\xFF'), false);
439
    AddByteToOutputBuffer((*pWriteDataBuffer)[dwDataBufferIndex], false);
440
  }
441
 
442
  // get last bit
443
  dwLastDataBit = (*pWriteDataBuffer)[dwDataBufferIndex];
444
  dwDataBitIndex = (dwNumBitsToWrite % 8);
445
 
446
  if (dwDataBitIndex == 0)
447
    dwLastDataBit = (dwLastDataBit >> ((8 - dwDataBitIndex) - 1));
448
  else
449
    dwLastDataBit = (dwLastDataBit >> (dwDataBitIndex - 1));
450
 
451
  // end it in state passed in, take 1 off the dwTapControllerState variable to correspond with JtagStates enumerated types
452
  MoveJTAGFromOneStateToAnother(JtagStates((dwTapControllerState - 1)), dwLastDataBit, false);
453
}
454
 
455
FTC_STATUS FT2232cMpsseJtag::WriteDataToExternalDevice(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
456
                                                       PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
457
                                                       DWORD dwTapControllerState)
458
{
459
  FTC_STATUS Status = FTC_SUCCESS;
460
 
461
  FTC_ClearOutputBuffer();
462
 
463
  AddWriteCommandDataToOutPutBuffer(bInstructionTestData, dwNumBitsToWrite, pWriteDataBuffer,
464
                                    dwNumBytesToWrite, dwTapControllerState);
465
 
466
  Status = FTC_SendBytesToDevice(ftHandle);
467
 
468
  return Status;
469
}
470
 
471
void FT2232cMpsseJtag::GetNumDataBytesToRead(DWORD dwNumBitsToRead, LPDWORD lpdwNumDataBytesToRead, LPDWORD lpdwNumRemainingDataBits)
472
{
473
  DWORD dwModNumBitsToRead = 0;
474
  DWORD dwNumDataBytesToRead = 0;
475
  DWORD dwNumRemainingDataBits = 0;
476
 
477
  // adjust for bit count of 1 less than no of bits
478
  dwModNumBitsToRead = (dwNumBitsToRead - 1);
479
 
480
  // Number of whole bytes to read
481
  dwNumDataBytesToRead = (dwModNumBitsToRead / 8);
482
 
483
  // number of remaining bits
484
  dwNumRemainingDataBits = (dwModNumBitsToRead % 8);
485
 
486
  // increase the number of whole bytes if bits left over
487
  if (dwNumRemainingDataBits > 0)
488
    dwNumDataBytesToRead = (dwNumDataBytesToRead + 1);
489
 
490
  // adjust for SHR of incoming byte
491
  dwNumRemainingDataBits = (8 - dwNumRemainingDataBits);
492
 
493
  // add 1 for TMS read byte
494
  dwNumDataBytesToRead = (dwNumDataBytesToRead + 1);
495
 
496
  *lpdwNumDataBytesToRead = dwNumDataBytesToRead;
497
  *lpdwNumRemainingDataBits = dwNumRemainingDataBits;
498
}
499
 
500
// This will work out the number of whole bytes to read and adjust for the TMS read
501
FTC_STATUS FT2232cMpsseJtag::GetDataFromExternalDevice(FTC_HANDLE ftHandle, DWORD dwNumBitsToRead, DWORD dwNumTmsClocks,
502
                                                       PReadDataByteBuffer pReadDataBuffer, LPDWORD lpdwNumBytesReturned)
503
{
504
  FTC_STATUS Status = FTC_SUCCESS;
505
  DWORD dwNumReadDataBytes = 0;
506
  DWORD dwNumRemainingDataBits = 0;
507
  DWORD dwNumDataBytesRead = 0;
508
  //  DWORD dwNumBytesDeviceInputBuffer = 0;
509
  InputByteBuffer InputBuffer;
510
  DWORD dwBytesReadIndex = 0;
511
  BYTE LastDataBit = 0;
512
 
513
  GetNumDataBytesToRead(dwNumBitsToRead, &dwNumReadDataBytes, &dwNumRemainingDataBits);
514
 
515
  Status = FTC_ReadFixedNumBytesFromDevice(ftHandle, &InputBuffer, dwNumReadDataBytes, &dwNumDataBytesRead);
516
 
517
  if (Status == FTC_SUCCESS)
518
  {
519
    // adjust last 2 bytes
520
    if (dwNumRemainingDataBits < 8)
521
    {
522
      InputBuffer[dwNumReadDataBytes - 2] = (InputBuffer[dwNumReadDataBytes - 2] >> dwNumRemainingDataBits);
523
      LastDataBit = (InputBuffer[dwNumReadDataBytes - 1] << (dwNumTmsClocks - 1));
524
      LastDataBit = (LastDataBit & '\x80'); // strip the rest
525
      InputBuffer[dwNumReadDataBytes - 2] = (InputBuffer[dwNumReadDataBytes - 2] | (LastDataBit >> (dwNumRemainingDataBits - 1)));
526
 
527
      dwNumReadDataBytes = (dwNumReadDataBytes - 1);
528
 
529
      for (dwBytesReadIndex = 0 ; dwBytesReadIndex < dwNumReadDataBytes; dwBytesReadIndex++)
530
        (*pReadDataBuffer)[dwBytesReadIndex] = InputBuffer[dwBytesReadIndex];
531
    }
532
    else // case for 0 bit shift in data + TMS read bit
533
    {
534
      LastDataBit = (InputBuffer[dwNumReadDataBytes - 1] << (dwNumTmsClocks - 1));
535
      LastDataBit = (LastDataBit >> 7); // strip the rest
536
      InputBuffer[dwNumReadDataBytes - 1] = LastDataBit;
537
 
538
      for (dwBytesReadIndex = 0 ; dwBytesReadIndex < dwNumReadDataBytes; dwBytesReadIndex++)
539
        (*pReadDataBuffer)[dwBytesReadIndex] = InputBuffer[dwBytesReadIndex];
540
    }
541
 
542
    *lpdwNumBytesReturned = dwNumReadDataBytes;
543
  }
544
 
545
  return Status;
546
}
547
 
548
DWORD FT2232cMpsseJtag::AddReadCommandToOutputBuffer(BOOL bInstructionTestData, DWORD dwNumBitsToRead, DWORD dwTapControllerState)
549
{
550
  DWORD dwModNumBitsToRead = 0;
551
  DWORD dwNumDataBytes = 0;
552
  DWORD dwNumRemainingDataBits = 0;
553
  DWORD dwNumTmsClocks = 0;
554
 
555
  // adjust for bit count of 1 less than no of bits
556
  dwModNumBitsToRead = (dwNumBitsToRead - 1);
557
 
558
  if (bInstructionTestData == false)
559
    MoveJTAGFromOneStateToAnother(ShiftDataRegister, NO_LAST_DATA_BIT, false);
560
  else
561
    MoveJTAGFromOneStateToAnother(ShiftInstructionRegister, NO_LAST_DATA_BIT, false);
562
 
563
  dwNumDataBytes = (dwModNumBitsToRead / 8);
564
 
565
  if (dwNumDataBytes > 0)
566
  {
567
    // Number of whole bytes
568
    dwNumDataBytes = (dwNumDataBytes - 1);
569
 
570
    // clk data bytes out on -ve clk LSB
571
    AddByteToOutputBuffer(CLK_DATA_BYTES_IN_ON_POS_CLK_LSB_FIRST_CMD, false);
572
    AddByteToOutputBuffer((dwNumDataBytes & '\xFF'), false);
573
    AddByteToOutputBuffer(((dwNumDataBytes / 256) & '\xFF'), false);
574
  }
575
 
576
  // number of remaining bits
577
  dwNumRemainingDataBits = (dwModNumBitsToRead % 8);
578
 
579
  if (dwNumRemainingDataBits > 0)
580
  {
581
    dwNumRemainingDataBits = (dwNumRemainingDataBits - 1);
582
 
583
    //clk data bits out on -ve clk LSB
584
    AddByteToOutputBuffer(CLK_DATA_BITS_IN_ON_POS_CLK_LSB_FIRST_CMD, false);
585
    AddByteToOutputBuffer((dwNumRemainingDataBits & '\xFF'), false);
586
  }
587
 
588
  // end it in state passed in, take 1 off the dwTapControllerState variable to correspond with JtagStates enumerated types
589
  dwNumTmsClocks = MoveJTAGFromOneStateToAnother(JtagStates((dwTapControllerState - 1)), NO_LAST_DATA_BIT, true);
590
 
591
  return dwNumTmsClocks;
592
}
593
 
594
FTC_STATUS FT2232cMpsseJtag::ReadDataFromExternalDevice(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToRead,
595
                                                        PReadDataByteBuffer pReadDataBuffer, LPDWORD lpdwNumBytesReturned,
596
                                                        DWORD dwTapControllerState)
597
{
598
  FTC_STATUS Status = FTC_SUCCESS;
599
  DWORD dwNumTmsClocks = 0;
600
 
601
  FTC_ClearOutputBuffer();
602
 
603
  dwNumTmsClocks = AddReadCommandToOutputBuffer(bInstructionTestData, dwNumBitsToRead, dwTapControllerState);
604
 
605
  AddByteToOutputBuffer(SEND_ANSWER_BACK_IMMEDIATELY_CMD, false);
606
 
607
  Status = FTC_SendBytesToDevice(ftHandle);
608
 
609
  if (Status == FTC_SUCCESS)
610
    Status = GetDataFromExternalDevice(ftHandle, dwNumBitsToRead, dwNumTmsClocks, pReadDataBuffer, lpdwNumBytesReturned);
611
 
612
  return Status;
613
}
614
 
615
DWORD FT2232cMpsseJtag::AddWriteReadCommandDataToOutPutBuffer(BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
616
                                                              PWriteDataByteBuffer pWriteDataBuffer,
617
                                                              DWORD dwNumBytesToWrite, DWORD dwTapControllerState)
618
{
619
  DWORD dwModNumBitsToWriteRead = 0;
620
  DWORD dwNumWriteDataBytes = 0;
621
  DWORD dwDataBufferIndex = 0;
622
  DWORD dwNumRemainingDataBits = 0;
623
  DWORD dwLastDataBit = 0;
624
  DWORD dwDataBitIndex = 0;
625
  DWORD dwNumTmsClocks = 0;
626
 
627
  // adjust for bit count of 1 less than no of bits
628
  dwModNumBitsToWriteRead = (dwNumBitsToWriteRead - 1);
629
 
630
  if (bInstructionTestData == false)
631
    MoveJTAGFromOneStateToAnother(ShiftDataRegister, NO_LAST_DATA_BIT, false);
632
  else
633
    MoveJTAGFromOneStateToAnother(ShiftInstructionRegister, NO_LAST_DATA_BIT, false);
634
 
635
  dwNumWriteDataBytes = (dwModNumBitsToWriteRead / 8);
636
 
637
  if (dwNumWriteDataBytes > 0)
638
  {
639
    // Number of whole bytes
640
    dwNumWriteDataBytes = (dwNumWriteDataBytes - 1);
641
 
642
    // clk data bytes out on -ve in +ve clk LSB
643
    AddByteToOutputBuffer(CLK_DATA_BYTES_OUT_ON_NEG_CLK_IN_ON_POS_CLK_LSB_FIRST_CMD, false);
644
    AddByteToOutputBuffer((dwNumWriteDataBytes & '\xFF'), false);
645
    AddByteToOutputBuffer(((dwNumWriteDataBytes / 256) & '\xFF'), false);
646
 
647
    // now add the data bytes to go out
648
    do
649
    {
650
      AddByteToOutputBuffer((*pWriteDataBuffer)[dwDataBufferIndex], false);
651
      dwDataBufferIndex = (dwDataBufferIndex + 1);
652
    }
653
    while (dwDataBufferIndex < (dwNumWriteDataBytes + 1));
654
  }
655
 
656
  dwNumRemainingDataBits = (dwModNumBitsToWriteRead % 8);
657
 
658
  if (dwNumRemainingDataBits > 0)
659
  {
660
    dwNumRemainingDataBits = (dwNumRemainingDataBits - 1);
661
 
662
    // clk data bits out on -ve in +ve clk LSB
663
    AddByteToOutputBuffer(CLK_DATA_BITS_OUT_ON_NEG_CLK_IN_ON_POS_CLK_LSB_FIRST_CMD, false);
664
    AddByteToOutputBuffer((dwNumRemainingDataBits & '\xFF'), false);
665
    AddByteToOutputBuffer((*pWriteDataBuffer)[dwDataBufferIndex], false);
666
  }
667
 
668
  // get last bit
669
  dwLastDataBit = (*pWriteDataBuffer)[dwDataBufferIndex];
670
  dwDataBitIndex = (dwNumBitsToWriteRead % 8);
671
 
672
  if (dwDataBitIndex == 8)
673
    dwLastDataBit = (dwLastDataBit >> ((8 - dwDataBitIndex) - 1));
674
  else
675
    dwLastDataBit = (dwLastDataBit >> (dwDataBitIndex - 1));
676
 
677
  // end it in state passed in, take 1 off the dwTapControllerState variable to correspond with JtagStates enumerated types
678
  dwNumTmsClocks = MoveJTAGFromOneStateToAnother(JtagStates((dwTapControllerState - 1)), dwLastDataBit, true);
679
 
680
  return dwNumTmsClocks;
681
}
682
 
683
FTC_STATUS FT2232cMpsseJtag::WriteReadDataToFromExternalDevice(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
684
                                                               PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
685
                                                               PReadDataByteBuffer pReadDataBuffer, LPDWORD lpdwNumBytesReturned,
686
                                                               DWORD dwTapControllerState)
687
{
688
  FTC_STATUS Status = FTC_SUCCESS;
689
  DWORD dwNumRemainingDataBits = 0;
690
  BYTE LastDataBit = 0;
691
  DWORD dwNumTmsClocks = 0;
692
  DWORD dwNumReadDataBytes = 0;
693
  InputByteBuffer InputBuffer;
694
  DWORD dwNumDataBytesRead = 0;
695
  DWORD dwBytesReadIndex = 0;
696
 
697
  FTC_ClearOutputBuffer();
698
 
699
  dwNumTmsClocks = AddWriteReadCommandDataToOutPutBuffer(bInstructionTestData, dwNumBitsToWriteRead,
700
                                                         pWriteDataBuffer, dwNumBytesToWrite, dwTapControllerState);
701
 
702
  AddByteToOutputBuffer(SEND_ANSWER_BACK_IMMEDIATELY_CMD, false);
703
 
704
  GetNumDataBytesToRead(dwNumBitsToWriteRead, &dwNumReadDataBytes, &dwNumRemainingDataBits);
705
 
706
  Status = FTC_SendReadBytesToFromDevice(ftHandle, &InputBuffer, dwNumReadDataBytes, &dwNumDataBytesRead);
707
 
708
  if (Status == FTC_SUCCESS)
709
  {
710
    // adjust last 2 bytes
711
    if (dwNumRemainingDataBits < 8)
712
    {
713
      InputBuffer[dwNumReadDataBytes - 2] = (InputBuffer[dwNumReadDataBytes - 2] >> dwNumRemainingDataBits);
714
      LastDataBit = (InputBuffer[dwNumReadDataBytes - 1] << (dwNumTmsClocks - 1));
715
      LastDataBit = (LastDataBit & '\x80'); // strip the rest
716
      InputBuffer[dwNumReadDataBytes - 2] = (InputBuffer[dwNumReadDataBytes - 2] | (LastDataBit >> (dwNumRemainingDataBits - 1)));
717
 
718
      dwNumReadDataBytes = (dwNumReadDataBytes - 1);
719
 
720
      for (dwBytesReadIndex = 0 ; dwBytesReadIndex < dwNumReadDataBytes; dwBytesReadIndex++)
721
        (*pReadDataBuffer)[dwBytesReadIndex] = InputBuffer[dwBytesReadIndex];
722
    }
723
    else // case for 0 bit shift in data + TMS read bit
724
    {
725
      LastDataBit = (InputBuffer[dwNumReadDataBytes - 1] << (dwNumTmsClocks - 1));
726
      LastDataBit = (LastDataBit >> 7); // strip the rest
727
      InputBuffer[dwNumReadDataBytes - 1] = LastDataBit;
728
 
729
      for (dwBytesReadIndex = 0 ; dwBytesReadIndex < dwNumReadDataBytes; dwBytesReadIndex++)
730
        (*pReadDataBuffer)[dwBytesReadIndex] = InputBuffer[dwBytesReadIndex];
731
    }
732
 
733
    *lpdwNumBytesReturned = dwNumReadDataBytes;
734
  }
735
 
736
  return Status;
737
}
738
 
739
FTC_STATUS FT2232cMpsseJtag::GenerateTCKClockPulses(FTC_HANDLE ftHandle, DWORD dwNumClockPulses)
740
{
741
  FTC_STATUS Status = FTC_SUCCESS;
742
  DWORD dwTotalNumClockPulsesBytes = 0;
743
  DWORD dwNumClockPulsesByteBlocks = 0;
744
  DWORD dwNumClockPulsesByteBlockCntr = 0;
745
  DWORD dwNumClockPulsesBytes = 0;
746
  DWORD dwNumRemainingClockPulsesBits = 0;
747
  //  DWORD dwDataBufferIndex = 0;
748
 
749
  MoveJTAGFromOneStateToAnother(RunTestIdle, NO_LAST_DATA_BIT, FALSE);
750
 
751
  dwTotalNumClockPulsesBytes = (dwNumClockPulses / NUMBITSINBYTE);
752
 
753
  if (dwTotalNumClockPulsesBytes > 0)
754
  {
755
    dwNumClockPulsesByteBlocks = (dwTotalNumClockPulsesBytes / NUM_BYTE_CLOCK_PULSES_BLOCK_SIZE);
756
 
757
    do
758
    {
759
      if (dwNumClockPulsesByteBlockCntr < dwNumClockPulsesByteBlocks)
760
        dwNumClockPulsesBytes = NUM_BYTE_CLOCK_PULSES_BLOCK_SIZE;
761
      else
762
        dwNumClockPulsesBytes = (dwTotalNumClockPulsesBytes - (dwNumClockPulsesByteBlockCntr * NUM_BYTE_CLOCK_PULSES_BLOCK_SIZE));
763
 
764
      if (dwNumClockPulsesBytes > 0)
765
      {
766
        // Number of whole bytes
767
        dwNumClockPulsesBytes = (dwNumClockPulsesBytes - 1);
768
 
769
        // clk data bytes out on -ve clk LSB
770
        AddByteToOutputBuffer(CLK_DATA_BYTES_OUT_ON_NEG_CLK_LSB_FIRST_CMD, false);
771
        AddByteToOutputBuffer((dwNumClockPulsesBytes & '\xFF'), false);
772
        AddByteToOutputBuffer(((dwNumClockPulsesBytes / 256) & '\xFF'), false);
773
 
774
        DWORD dwDataBufferIndex = 0;
775
 
776
        // now add the data bytes ie 0 to go out with the clock pulses
777
        do
778
        {
779
          AddByteToOutputBuffer(0, false);
780
          dwDataBufferIndex = (dwDataBufferIndex + 1);
781
        }
782
        while (dwDataBufferIndex < (dwNumClockPulsesBytes + 1));
783
      }
784
 
785
      Status = FTC_SendBytesToDevice(ftHandle);
786
 
787
      dwNumClockPulsesByteBlockCntr = (dwNumClockPulsesByteBlockCntr + 1);
788
    }
789
    while ((dwNumClockPulsesByteBlockCntr <= dwNumClockPulsesByteBlocks) && (Status == FTC_SUCCESS));
790
  }
791
 
792
  if (Status == FTC_SUCCESS)
793
  {
794
    dwNumRemainingClockPulsesBits = (dwNumClockPulses % NUMBITSINBYTE);
795
 
796
    if (dwNumRemainingClockPulsesBits > 0)
797
    {
798
      dwNumRemainingClockPulsesBits = (dwNumRemainingClockPulsesBits - 1);
799
 
800
      //clk data bits out on -ve clk LSB
801
      AddByteToOutputBuffer(CLK_DATA_BITS_OUT_ON_NEG_CLK_LSB_FIRST_CMD, false);
802
      AddByteToOutputBuffer((dwNumRemainingClockPulsesBits & '\xFF'), false);
803
      AddByteToOutputBuffer('\xFF', false);
804
 
805
      Status = FTC_SendBytesToDevice(ftHandle);
806
    }
807
  }
808
 
809
  //MoveJTAGFromOneStateToAnother(RunTestIdle, NO_LAST_DATA_BIT, FALSE);
810
 
811
  //Status = FTC_SendBytesToDevice(ftHandle);
812
 
813
  return Status;
814
}
815
 
816
void FT2232cMpsseJtag::ProcessReadCommandsSequenceBytes(PInputByteBuffer pInputBuffer, DWORD dwNumBytesRead, PReadCmdSequenceDataByteBuffer pReadCmdSequenceDataBuffer,
817
                                                        LPDWORD lpdwNumBytesReturned)
818
{
819
  DWORD CommandSequenceIndex = 0;
820
  PReadCommandsSequenceData pReadCommandsSequenceDataBuffer;
821
  DWORD dwNumReadCommandSequences;
822
  PReadCommandSequenceData pReadCmdSequenceData;
823
  DWORD dwNumBitsToRead = 0;
824
  DWORD dwNumTmsClocks = 0;
825
  DWORD dwNumReadDataBytes = 0;
826
  DWORD dwNumRemainingDataBits = 0;
827
  BYTE  LastDataBit = 0;
828
  DWORD dwBytesReadIndex = 0;
829
  DWORD dwNumReadBytesProcessed = 0;
830
  DWORD dwTotalNumBytesRead = 0;
831
  DWORD dwNumBytesReturned = 0;
832
 
833
  if (iCommandsSequenceDataDeviceIndex != -1)
834
  {
835
    pReadCommandsSequenceDataBuffer = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].pReadCommandsSequenceDataBuffer;
836
    dwNumReadCommandSequences = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumReadCommandSequences;
837
 
838
    for (CommandSequenceIndex = 0; (CommandSequenceIndex < dwNumReadCommandSequences); CommandSequenceIndex++)
839
    {
840
      pReadCmdSequenceData = (*pReadCommandsSequenceDataBuffer)[CommandSequenceIndex];
841
      dwNumBitsToRead = (*pReadCmdSequenceData)[0];
842
      dwNumTmsClocks = (*pReadCmdSequenceData)[1];
843
 
844
      GetNumDataBytesToRead(dwNumBitsToRead, &dwNumReadDataBytes, &dwNumRemainingDataBits);
845
 
846
      dwNumReadBytesProcessed = (dwNumReadBytesProcessed + dwNumReadDataBytes);
847
 
848
      // adjust last 2 bytes
849
      if (dwNumRemainingDataBits < 8)
850
      {
851
        (*pInputBuffer)[dwNumReadBytesProcessed - 2] = ((*pInputBuffer)[dwNumReadBytesProcessed - 2] >> dwNumRemainingDataBits);
852
        LastDataBit = ((*pInputBuffer)[dwNumReadBytesProcessed - 1] << (dwNumTmsClocks - 1));
853
        LastDataBit = (LastDataBit & '\x80'); // strip the rest
854
        (*pInputBuffer)[dwNumReadBytesProcessed - 2] = ((*pInputBuffer)[dwNumReadBytesProcessed - 2] | (LastDataBit >> (dwNumRemainingDataBits - 1)));
855
 
856
        dwNumReadDataBytes = (dwNumReadDataBytes - 1);
857
 
858
        for (dwBytesReadIndex = 0; dwBytesReadIndex < dwNumReadDataBytes; dwBytesReadIndex++)
859
          (*pReadCmdSequenceDataBuffer)[(dwBytesReadIndex + dwNumBytesReturned)] = (*pInputBuffer)[(dwBytesReadIndex + dwTotalNumBytesRead)];
860
      }
861
      else // case for 0 bit shift in data + TMS read bit
862
      {
863
        LastDataBit = ((*pInputBuffer)[dwNumReadBytesProcessed - 1] << (dwNumTmsClocks - 1));
864
        LastDataBit = (LastDataBit >> 7); // strip the rest
865
        (*pInputBuffer)[dwNumReadBytesProcessed - 1] = LastDataBit;
866
 
867
        for (dwBytesReadIndex = 0; dwBytesReadIndex < dwNumReadDataBytes; dwBytesReadIndex++)
868
          (*pReadCmdSequenceDataBuffer)[(dwBytesReadIndex + dwNumBytesReturned)] = (*pInputBuffer)[(dwBytesReadIndex + dwTotalNumBytesRead)];
869
      }
870
 
871
      dwTotalNumBytesRead = dwNumReadBytesProcessed;
872
 
873
      dwNumBytesReturned = (dwNumBytesReturned + dwNumReadDataBytes);
874
    }
875
  }
876
 
877
  *lpdwNumBytesReturned = dwNumBytesReturned;
878
}
879
 
880
DWORD FT2232cMpsseJtag::GetTotalNumCommandsSequenceDataBytesToRead(void)
881
{
882
  DWORD dwTotalNumBytesToBeRead = 0;
883
  DWORD CommandSequenceIndex = 0;
884
  PReadCommandsSequenceData pReadCommandsSequenceDataBuffer;
885
  DWORD dwNumReadCommandSequences = 0;
886
  PReadCommandSequenceData pReadCmdSequenceData;
887
  DWORD dwNumBitsToRead = 0;
888
  DWORD dwNumDataBytesToRead = 0;
889
  DWORD dwNumRemainingDataBits = 0;
890
 
891
  if (iCommandsSequenceDataDeviceIndex != -1)
892
  {
893
    pReadCommandsSequenceDataBuffer = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].pReadCommandsSequenceDataBuffer;
894
    dwNumReadCommandSequences = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumReadCommandSequences;
895
 
896
    for (CommandSequenceIndex = 0; (CommandSequenceIndex < dwNumReadCommandSequences); CommandSequenceIndex++)
897
    {
898
      pReadCmdSequenceData = (*pReadCommandsSequenceDataBuffer)[CommandSequenceIndex];
899
      dwNumBitsToRead = (*pReadCmdSequenceData)[0];
900
 
901
      GetNumDataBytesToRead(dwNumBitsToRead, &dwNumDataBytesToRead, &dwNumRemainingDataBits);
902
 
903
      dwTotalNumBytesToBeRead = (dwTotalNumBytesToBeRead + dwNumDataBytesToRead);
904
    }
905
  }
906
 
907
  return dwTotalNumBytesToBeRead;
908
}
909
 
910
void FT2232cMpsseJtag::CopyReadCommandsSequenceDataBuffer(PReadCommandsSequenceData pDestinationBuffer, PReadCommandsSequenceData pSourceBuffer, DWORD dwSizeReadCommandsSequenceDataBuffer)
911
{
912
  DWORD CommandSequenceIndex = 0;
913
  PReadCommandSequenceData pReadCmdSequenceData;
914
  DWORD dwNumBitsToRead = 0;
915
  DWORD dwNumTmsClocks = 0;
916
 
917
  for (CommandSequenceIndex = 0; (CommandSequenceIndex < dwSizeReadCommandsSequenceDataBuffer); CommandSequenceIndex++)
918
  {
919
    pReadCmdSequenceData = (*pSourceBuffer)[CommandSequenceIndex];
920
    dwNumBitsToRead = (*pReadCmdSequenceData)[0];
921
    dwNumTmsClocks = (*pReadCmdSequenceData)[1];
922
 
923
    pReadCmdSequenceData = (*pDestinationBuffer)[CommandSequenceIndex];
924
    (*pReadCmdSequenceData)[0] = dwNumBitsToRead;
925
    (*pReadCmdSequenceData)[1] = dwNumTmsClocks;
926
  }
927
}
928
 
929
FTC_STATUS FT2232cMpsseJtag::AddReadCommandSequenceData(DWORD dwNumBitsToRead, DWORD dwNumTmsClocks)
930
{
931
  FTC_STATUS Status = FTC_SUCCESS;
932
  DWORD dwSizeReadCommandsSequenceDataBuffer;
933
  PReadCommandsSequenceData pReadCommandsSequenceDataBuffer;
934
  DWORD dwNumReadCommandSequences;
935
  PReadCommandsSequenceData pTmpReadCmdsSequenceDataBuffer;
936
  PReadCommandSequenceData pReadCmdSequenceData;
937
 
938
  if (iCommandsSequenceDataDeviceIndex != -1)
939
  {
940
    dwSizeReadCommandsSequenceDataBuffer = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwSizeReadCommandsSequenceDataBuffer;
941
    pReadCommandsSequenceDataBuffer = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].pReadCommandsSequenceDataBuffer;
942
    dwNumReadCommandSequences = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumReadCommandSequences;
943
 
944
    if (dwNumReadCommandSequences > (dwSizeReadCommandsSequenceDataBuffer - 1))
945
    {
946
      pTmpReadCmdsSequenceDataBuffer = CreateReadCommandsSequenceDataBuffer(dwSizeReadCommandsSequenceDataBuffer);
947
 
948
      if (pTmpReadCmdsSequenceDataBuffer != NULL)
949
      {
950
        // Temporary save the contents of the read commands sequence data buffer
951
        CopyReadCommandsSequenceDataBuffer(pTmpReadCmdsSequenceDataBuffer, pReadCommandsSequenceDataBuffer, dwSizeReadCommandsSequenceDataBuffer);
952
 
953
        DeleteReadCommandsSequenceDataBuffer(pReadCommandsSequenceDataBuffer, dwSizeReadCommandsSequenceDataBuffer);
954
 
955
        // Increase the size of the read commands sequence data buffer
956
        pReadCommandsSequenceDataBuffer = CreateReadCommandsSequenceDataBuffer((dwSizeReadCommandsSequenceDataBuffer + COMMAND_SEQUENCE_READ_DATA_BUFFER_SIZE_INCREMENT));
957
 
958
        if (pReadCommandsSequenceDataBuffer != NULL)
959
        {
960
          CopyReadCommandsSequenceDataBuffer(pReadCommandsSequenceDataBuffer, pTmpReadCmdsSequenceDataBuffer, dwSizeReadCommandsSequenceDataBuffer);
961
 
962
          DeleteReadCommandsSequenceDataBuffer(pTmpReadCmdsSequenceDataBuffer, dwSizeReadCommandsSequenceDataBuffer);
963
 
964
          dwSizeReadCommandsSequenceDataBuffer = (dwSizeReadCommandsSequenceDataBuffer + COMMAND_SEQUENCE_READ_DATA_BUFFER_SIZE_INCREMENT);
965
 
966
          OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwSizeReadCommandsSequenceDataBuffer = dwSizeReadCommandsSequenceDataBuffer;
967
          OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].pReadCommandsSequenceDataBuffer = pReadCommandsSequenceDataBuffer;
968
        }
969
        else
970
          Status = FTC_INSUFFICIENT_RESOURCES;
971
      }
972
      else
973
        Status = FTC_INSUFFICIENT_RESOURCES;
974
    }
975
 
976
    if (Status == FTC_SUCCESS)
977
    {
978
      if (dwNumReadCommandSequences > 0)
979
        pReadCmdSequenceData = (*pReadCommandsSequenceDataBuffer)[(dwNumReadCommandSequences - 1)];
980
 
981
      pReadCmdSequenceData = (*pReadCommandsSequenceDataBuffer)[dwNumReadCommandSequences];
982
 
983
      (*pReadCmdSequenceData)[0] = dwNumBitsToRead;
984
      (*pReadCmdSequenceData)[1] = dwNumTmsClocks;
985
 
986
      dwNumReadCommandSequences = (dwNumReadCommandSequences + 1);
987
 
988
      OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumReadCommandSequences = dwNumReadCommandSequences;
989
    }
990
  }
991
 
992
  return Status;
993
}
994
 
995
PReadCommandsSequenceData FT2232cMpsseJtag::CreateReadCommandsSequenceDataBuffer(DWORD dwSizeReadCmdsSequenceDataBuffer)
996
{
997
  PReadCommandsSequenceData pReadCmdsSequenceDataBuffer;
998
  DWORD CommandSequenceIndex = 0;
999
  PReadCommandSequenceData pReadCmdSequenceData;
1000
 
1001
  pReadCmdsSequenceDataBuffer = PReadCommandsSequenceData(new ReadCommandsSequenceData[dwSizeReadCmdsSequenceDataBuffer]);
1002
 
1003
  if (pReadCmdsSequenceDataBuffer != NULL)
1004
  {
1005
    for (CommandSequenceIndex = 0; (CommandSequenceIndex < dwSizeReadCmdsSequenceDataBuffer); CommandSequenceIndex++)
1006
    {
1007
      pReadCmdSequenceData = PReadCommandSequenceData(new ReadCommandSequenceData);
1008
 
1009
      (*pReadCmdsSequenceDataBuffer)[CommandSequenceIndex] = pReadCmdSequenceData;
1010
    }
1011
  }
1012
 
1013
  return pReadCmdsSequenceDataBuffer;
1014
}
1015
 
1016
void FT2232cMpsseJtag::DeleteReadCommandsSequenceDataBuffer(PReadCommandsSequenceData pReadCmdsSequenceDataBuffer, DWORD dwSizeReadCommandsSequenceDataBuffer)
1017
{
1018
  DWORD CommandSequenceIndex = 0;
1019
  PReadCommandSequenceData pReadCmdSequenceData;
1020
 
1021
  for (CommandSequenceIndex = 0; (CommandSequenceIndex < dwSizeReadCommandsSequenceDataBuffer); CommandSequenceIndex++)
1022
  {
1023
    pReadCmdSequenceData = (*pReadCmdsSequenceDataBuffer)[CommandSequenceIndex];
1024
 
1025
    delete [] pReadCmdSequenceData;
1026
  }
1027
 
1028
  delete [] pReadCmdsSequenceDataBuffer;
1029
}
1030
 
1031
FTC_STATUS FT2232cMpsseJtag::CreateDeviceCommandsSequenceDataBuffers(FTC_HANDLE ftHandle)
1032
{
1033
  FTC_STATUS Status = FTC_SUCCESS;
1034
  DWORD dwDeviceIndex = 0;
1035
  BOOLEAN bDeviceDataBuffersCreated = false;
1036
 
1037
  for (dwDeviceIndex = 0; ((dwDeviceIndex < MAX_NUM_DEVICES) && !bDeviceDataBuffersCreated); dwDeviceIndex++)
1038
  {
1039
    if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice == 0)
1040
    {
1041
      bDeviceDataBuffersCreated = true;
1042
 
1043
      OpenedDevicesCommandsSequenceData[dwDeviceIndex].pCommandsSequenceDataOutPutBuffer = POutputByteBuffer(new OutputByteBuffer);
1044
 
1045
      if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].pCommandsSequenceDataOutPutBuffer != NULL)
1046
      {
1047
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].pReadCommandsSequenceDataBuffer = CreateReadCommandsSequenceDataBuffer(INIT_COMMAND_SEQUENCE_READ_DATA_BUFFER_SIZE);
1048
 
1049
        if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].pReadCommandsSequenceDataBuffer != NULL)
1050
        {
1051
          OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice = ftHandle;
1052
          OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwNumBytesToSend = 0;
1053
          OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwSizeReadCommandsSequenceDataBuffer = INIT_COMMAND_SEQUENCE_READ_DATA_BUFFER_SIZE;
1054
          OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwNumReadCommandSequences = 0;
1055
        }
1056
        else
1057
        {
1058
          delete [] OpenedDevicesCommandsSequenceData[dwDeviceIndex].pCommandsSequenceDataOutPutBuffer;
1059
 
1060
          Status = FTC_INSUFFICIENT_RESOURCES;
1061
        }
1062
      }
1063
      else
1064
        Status = FTC_INSUFFICIENT_RESOURCES;
1065
    }
1066
  }
1067
 
1068
  if ((Status == FTC_SUCCESS) && (bDeviceDataBuffersCreated == true))
1069
    dwNumOpenedDevices = dwNumOpenedDevices + 1;
1070
 
1071
  return Status;
1072
}
1073
 
1074
void FT2232cMpsseJtag::ClearDeviceCommandSequenceData(FTC_HANDLE ftHandle)
1075
{
1076
  DWORD dwDeviceIndex = 0;
1077
  BOOLEAN bDeviceHandleFound = false;
1078
 
1079
  if (ftHandle != 0)
1080
  {
1081
    for (dwDeviceIndex = 0; ((dwDeviceIndex < MAX_NUM_DEVICES) && !bDeviceHandleFound); dwDeviceIndex++)
1082
    {
1083
      if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice == ftHandle)
1084
      {
1085
        bDeviceHandleFound = true;
1086
 
1087
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwNumBytesToSend = 0;
1088
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwNumReadCommandSequences = 0;
1089
      }
1090
    }
1091
  }
1092
  else
1093
  {
1094
    // This code is executed if there is only one device connected to the system, this code is here just in case
1095
    // that a device was unplugged from the system, while the system was still running
1096
    for (dwDeviceIndex = 0; ((dwDeviceIndex < MAX_NUM_DEVICES) && !bDeviceHandleFound); dwDeviceIndex++)
1097
    {
1098
      if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice != 0)
1099
      {
1100
        bDeviceHandleFound = true;
1101
 
1102
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwNumBytesToSend = 0;
1103
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwNumReadCommandSequences = 0;
1104
      }
1105
    }
1106
  }
1107
}
1108
 
1109
DWORD FT2232cMpsseJtag::GetNumBytesInCommandsSequenceDataBuffer(void)
1110
{
1111
  DWORD dwNumBytesToSend_temp = 0;
1112
 
1113
  if (iCommandsSequenceDataDeviceIndex != -1)
1114
    // Get the number commands to be executed in sequence ie write, read and write/read
1115
    dwNumBytesToSend_temp = OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumBytesToSend;
1116
 
1117
  return dwNumBytesToSend_temp;
1118
}
1119
 
1120
DWORD FT2232cMpsseJtag::GetCommandsSequenceDataDeviceIndex(FTC_HANDLE ftHandle)
1121
{
1122
  DWORD dwDeviceIndex = 0;
1123
  BOOLEAN bDeviceHandleFound = false;
1124
  INT iCmdsSequenceDataDeviceIndex = 0;
1125
 
1126
  if (ftHandle != 0)
1127
  {
1128
    for (dwDeviceIndex = 0; ((dwDeviceIndex < MAX_NUM_DEVICES) && !bDeviceHandleFound); dwDeviceIndex++)
1129
    {
1130
      if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice == ftHandle)
1131
      {
1132
        bDeviceHandleFound = true;
1133
 
1134
        iCmdsSequenceDataDeviceIndex = dwDeviceIndex;
1135
      }
1136
    }
1137
  }
1138
  else
1139
  {
1140
    // This code is executed if there is only one device connected to the system, this code is here just in case
1141
    // that a device was unplugged from the system, while the system was still running
1142
    for (dwDeviceIndex = 0; ((dwDeviceIndex < MAX_NUM_DEVICES) && !bDeviceHandleFound); dwDeviceIndex++)
1143
    {
1144
      if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice != 0)
1145
      {
1146
        bDeviceHandleFound = true;
1147
 
1148
        iCmdsSequenceDataDeviceIndex = dwDeviceIndex;
1149
      }
1150
    }
1151
  }
1152
 
1153
  return iCmdsSequenceDataDeviceIndex;
1154
}
1155
 
1156
void FT2232cMpsseJtag::DeleteDeviceCommandsSequenceDataBuffers(FTC_HANDLE ftHandle)
1157
{
1158
  DWORD dwDeviceIndex = 0;
1159
  BOOLEAN bDeviceHandleFound = false;
1160
  POutputByteBuffer pCmdsSequenceDataOutPutBuffer;
1161
 
1162
  for (dwDeviceIndex = 0; ((dwDeviceIndex < MAX_NUM_DEVICES) && !bDeviceHandleFound); dwDeviceIndex++)
1163
  {
1164
    if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice == ftHandle)
1165
    {
1166
      bDeviceHandleFound = true;
1167
 
1168
      OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice = 0;
1169
      OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwNumBytesToSend = 0;
1170
      pCmdsSequenceDataOutPutBuffer = OpenedDevicesCommandsSequenceData[dwDeviceIndex].pCommandsSequenceDataOutPutBuffer;
1171
      delete [] pCmdsSequenceDataOutPutBuffer;
1172
      OpenedDevicesCommandsSequenceData[dwDeviceIndex].pCommandsSequenceDataOutPutBuffer = NULL;
1173
      DeleteReadCommandsSequenceDataBuffer(OpenedDevicesCommandsSequenceData[dwDeviceIndex].pReadCommandsSequenceDataBuffer,
1174
                                           OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwSizeReadCommandsSequenceDataBuffer);
1175
      OpenedDevicesCommandsSequenceData[dwDeviceIndex].pReadCommandsSequenceDataBuffer = NULL;
1176
    }
1177
  }
1178
 
1179
  if ((dwNumOpenedDevices > 0) && bDeviceHandleFound)
1180
    dwNumOpenedDevices = dwNumOpenedDevices - 1;
1181
}
1182
 
1183
FTC_STATUS FT2232cMpsseJtag::AddDeviceWriteCommand(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
1184
                                                   PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1185
                                                   DWORD dwTapControllerState)
1186
{
1187
  FTC_STATUS Status = FTC_SUCCESS;
1188
  DWORD dwNumCommandDataBytes = 0;
1189
 
1190
  if (pWriteDataBuffer != NULL)
1191
  {
1192
    Status = CheckWriteDataToExternalDeviceBitsBytesParameters(dwNumBitsToWrite, dwNumBytesToWrite);
1193
 
1194
    if (Status == FTC_SUCCESS)
1195
    {
1196
      if ((dwTapControllerState >= TEST_LOGIC_STATE) && (dwTapControllerState <= SHIFT_INSTRUCTION_REGISTER_STATE))
1197
      {
1198
        dwNumCommandDataBytes = (NUM_WRITE_COMMAND_BYTES + dwNumBytesToWrite);
1199
 
1200
        iCommandsSequenceDataDeviceIndex = GetCommandsSequenceDataDeviceIndex(ftHandle);
1201
 
1202
        if ((GetNumBytesInCommandsSequenceDataBuffer() + dwNumCommandDataBytes) < OUTPUT_BUFFER_SIZE)
1203
          AddWriteCommandDataToOutPutBuffer(bInstructionTestData, dwNumBitsToWrite, pWriteDataBuffer,
1204
                                            dwNumBytesToWrite, dwTapControllerState);
1205
        else
1206
          Status = FTC_COMMAND_SEQUENCE_BUFFER_FULL;
1207
 
1208
        // Reset to indicate that you are not building up a sequence of commands
1209
        iCommandsSequenceDataDeviceIndex = -1;
1210
      }
1211
      else
1212
        Status = FTC_INVALID_TAP_CONTROLLER_STATE;
1213
    }
1214
  }
1215
  else
1216
    Status = FTC_NULL_WRITE_DATA_BUFFER_POINTER;
1217
 
1218
  return Status;
1219
}
1220
 
1221
FTC_STATUS FT2232cMpsseJtag::AddDeviceReadCommand(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToRead, DWORD dwTapControllerState)
1222
{
1223
  FTC_STATUS Status = FTC_SUCCESS;
1224
  DWORD dwNumTmsClocks = 0;
1225
 
1226
  if ((dwNumBitsToRead >= MIN_NUM_BITS) && (dwNumBitsToRead <= MAX_NUM_BITS))
1227
  {
1228
    if ((dwTapControllerState >= TEST_LOGIC_STATE) && (dwTapControllerState <= SHIFT_INSTRUCTION_REGISTER_STATE))
1229
    {
1230
      iCommandsSequenceDataDeviceIndex = GetCommandsSequenceDataDeviceIndex(ftHandle);
1231
 
1232
      if ((GetNumBytesInCommandsSequenceDataBuffer() + NUM_READ_COMMAND_BYTES) < OUTPUT_BUFFER_SIZE)
1233
      {
1234
        dwNumTmsClocks = AddReadCommandToOutputBuffer(bInstructionTestData, dwNumBitsToRead, dwTapControllerState);
1235
 
1236
        Status = AddReadCommandSequenceData(dwNumBitsToRead, dwNumTmsClocks);
1237
      }
1238
      else
1239
        Status = FTC_COMMAND_SEQUENCE_BUFFER_FULL;
1240
 
1241
      // Reset to indicate that you are not building up a sequence of commands
1242
      iCommandsSequenceDataDeviceIndex = -1;
1243
    }
1244
    else
1245
      Status = FTC_INVALID_TAP_CONTROLLER_STATE;
1246
  }
1247
  else
1248
    Status = FTC_INVALID_NUMBER_BITS;
1249
 
1250
  return Status;
1251
}
1252
 
1253
FTC_STATUS FT2232cMpsseJtag::AddDeviceWriteReadCommand(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
1254
                                                       PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1255
                                                       DWORD dwTapControllerState)
1256
{
1257
  FTC_STATUS Status = FTC_SUCCESS;
1258
  DWORD dwNumCommandDataBytes = 0;
1259
  DWORD dwNumTmsClocks = 0;
1260
 
1261
  if (pWriteDataBuffer != NULL)
1262
  {
1263
    Status = CheckWriteDataToExternalDeviceBitsBytesParameters(dwNumBitsToWriteRead, dwNumBytesToWrite);
1264
 
1265
    if (Status == FTC_SUCCESS)
1266
    {
1267
      if ((dwTapControllerState >= TEST_LOGIC_STATE) && (dwTapControllerState <= SHIFT_INSTRUCTION_REGISTER_STATE))
1268
      {
1269
        dwNumCommandDataBytes = (NUM_WRITE_READ_COMMAND_BYTES + dwNumBytesToWrite);
1270
 
1271
        iCommandsSequenceDataDeviceIndex = GetCommandsSequenceDataDeviceIndex(ftHandle);
1272
 
1273
        if ((GetNumBytesInCommandsSequenceDataBuffer() + dwNumCommandDataBytes) < OUTPUT_BUFFER_SIZE)
1274
        {
1275
          dwNumTmsClocks = AddWriteReadCommandDataToOutPutBuffer(bInstructionTestData, dwNumBitsToWriteRead, pWriteDataBuffer,
1276
                                                                   dwNumBytesToWrite, dwTapControllerState);
1277
 
1278
          Status = AddReadCommandSequenceData(dwNumBitsToWriteRead, dwNumTmsClocks);
1279
        }
1280
        else
1281
          Status = FTC_COMMAND_SEQUENCE_BUFFER_FULL;
1282
 
1283
        // Reset to indicate that you are not building up a sequence of commands
1284
        iCommandsSequenceDataDeviceIndex = -1;
1285
      }
1286
      else
1287
        Status = FTC_INVALID_TAP_CONTROLLER_STATE;
1288
    }
1289
  }
1290
  else
1291
    Status = FTC_NULL_WRITE_DATA_BUFFER_POINTER;
1292
 
1293
  return Status;
1294
}
1295
 
1296
FT2232cMpsseJtag::FT2232cMpsseJtag(void)
1297
{
1298
  DWORD dwDeviceIndex = 0;
1299
 
1300
  CurrentJtagState = Undefined;
1301
 
1302
  dwSavedLowPinsDirection = 0;
1303
  dwSavedLowPinsValue = 0;
1304
 
1305
  dwNumOpenedDevices = 0;
1306
 
1307
  for (dwDeviceIndex = 0; (dwDeviceIndex < MAX_NUM_DEVICES); dwDeviceIndex++)
1308
    OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice = 0;
1309
 
1310
  iCommandsSequenceDataDeviceIndex = -1;
1311
}
1312
 
1313
FT2232cMpsseJtag::~FT2232cMpsseJtag(void)
1314
{
1315
  DWORD dwDeviceIndex = 0;
1316
  POutputByteBuffer pCmdsSequenceDataOutPutBuffer;
1317
 
1318
  if (dwNumOpenedDevices > 0)
1319
  {
1320
    for (dwDeviceIndex = 0; (dwDeviceIndex < MAX_NUM_DEVICES); dwDeviceIndex++)
1321
    {
1322
      if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice != 0)
1323
      {
1324
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].hDevice = 0;
1325
 
1326
        pCmdsSequenceDataOutPutBuffer = OpenedDevicesCommandsSequenceData[dwDeviceIndex].pCommandsSequenceDataOutPutBuffer;
1327
 
1328
        if (pCmdsSequenceDataOutPutBuffer != NULL)
1329
          delete [] pCmdsSequenceDataOutPutBuffer;
1330
 
1331
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].pCommandsSequenceDataOutPutBuffer = NULL;
1332
 
1333
        if (OpenedDevicesCommandsSequenceData[dwDeviceIndex].pReadCommandsSequenceDataBuffer != NULL)
1334
          DeleteReadCommandsSequenceDataBuffer(OpenedDevicesCommandsSequenceData[dwDeviceIndex].pReadCommandsSequenceDataBuffer,
1335
                                               OpenedDevicesCommandsSequenceData[dwDeviceIndex].dwSizeReadCommandsSequenceDataBuffer);
1336
 
1337
        OpenedDevicesCommandsSequenceData[dwDeviceIndex].pReadCommandsSequenceDataBuffer = NULL;
1338
      }
1339
    }
1340
  }
1341
}
1342
 
1343
FTC_STATUS FT2232cMpsseJtag::JTAG_GetNumDevices(LPDWORD lpdwNumDevices)
1344
{
1345
  FTC_STATUS Status = FTC_SUCCESS;
1346
  FT2232CDeviceIndexes FT2232CIndexes;
1347
 
1348
  *lpdwNumDevices = 0;
1349
 
1350
  Status = FTC_GetNumDevices(lpdwNumDevices, &FT2232CIndexes);
1351
 
1352
  return Status;
1353
}
1354
 
1355
FTC_STATUS FT2232cMpsseJtag::JTAG_GetDeviceNameLocationID(DWORD dwDeviceNameIndex, LPSTR lpDeviceNameBuffer, DWORD dwBufferSize, LPDWORD lpdwLocationID)
1356
//FTC_STATUS FT2232cMpsseJtag::JTAG_GetDeviceNameLocID(DWORD dwDeviceNameIndex, LPSTR lpDeviceNameBuffer, DWORD dwBufferSize, LPDWORD lpdwLocationID)
1357
{
1358
  return FTC_GetDeviceNameLocationID(dwDeviceNameIndex, lpDeviceNameBuffer, dwBufferSize, lpdwLocationID);
1359
}
1360
 
1361
FTC_STATUS FT2232cMpsseJtag::JTAG_OpenSpecifiedDevice(LPSTR lpDeviceName, DWORD dwLocationID, FTC_HANDLE *pftHandle)
1362
//FTC_STATUS FT2232cMpsseJtag::JTAG_OpenEx(LPSTR lpDeviceName, DWORD dwLocationID, FTC_HANDLE *pftHandle)
1363
{
1364
  FTC_STATUS Status = FTC_SUCCESS;
1365
 
1366
  Status = FTC_OpenSpecifiedDevice(lpDeviceName, dwLocationID, pftHandle);
1367
 
1368
  if (Status == FTC_SUCCESS)
1369
  {
1370
    Status = CreateDeviceCommandsSequenceDataBuffers(*pftHandle);
1371
 
1372
    if (Status != FTC_SUCCESS)
1373
    {
1374
      FTC_CloseDevice(*pftHandle);
1375
 
1376
      *pftHandle = 0;
1377
    }
1378
  }
1379
 
1380
  return Status;
1381
}
1382
 
1383
FTC_STATUS FT2232cMpsseJtag::JTAG_OpenDevice(FTC_HANDLE *pftHandle)
1384
//FTC_STATUS FT2232cMpsseJtag::JTAG_Open(FTC_HANDLE *pftHandle)
1385
{
1386
  FTC_STATUS Status = FTC_SUCCESS;
1387
 
1388
  Status = FTC_OpenDevice(pftHandle);
1389
 
1390
  if (Status == FTC_SUCCESS)
1391
  {
1392
    Status = CreateDeviceCommandsSequenceDataBuffers(*pftHandle);
1393
 
1394
    if (Status != FTC_SUCCESS)
1395
    {
1396
      //      FTC_CloseDevice(*pftHandle);
1397
      FTC_CloseDevice(*pftHandle);
1398
 
1399
      *pftHandle = 0;
1400
    }
1401
  }
1402
 
1403
  return Status;
1404
}
1405
 
1406
FTC_STATUS FT2232cMpsseJtag::JTAG_CloseDevice(FTC_HANDLE ftHandle)
1407
{
1408
  FTC_STATUS Status = FTC_SUCCESS;
1409
 
1410
  Status = FTC_CloseDevice(ftHandle);
1411
 
1412
  DeleteDeviceCommandsSequenceDataBuffers(ftHandle);
1413
 
1414
  return Status;
1415
}
1416
 
1417
FTC_STATUS FT2232cMpsseJtag::JTAG_InitDevice(FTC_HANDLE ftHandle, DWORD dwClockDivisor)
1418
{
1419
  FTC_STATUS Status = FTC_SUCCESS;
1420
 
1421
  Status = FTC_IsDeviceHandleValid(ftHandle);
1422
 
1423
  if (Status == FTC_SUCCESS)
1424
  {
1425
    if ((dwClockDivisor >= MIN_CLOCK_DIVISOR) && (dwClockDivisor <= MAX_CLOCK_DIVISOR))
1426
    {
1427
      Status = FTC_ResetUSBDevicePurgeUSBInputBuffer(ftHandle);
1428
 
1429
      if (Status == FTC_SUCCESS)
1430
        Status = FTC_SetDeviceUSBBufferSizes(ftHandle, USB_INPUT_BUFFER_SIZE, USB_OUTPUT_BUFFER_SIZE);
1431
 
1432
      if (Status == FTC_SUCCESS)
1433
        Status = FTC_SetDeviceSpecialCharacters(ftHandle, false, FT_EVENT_VALUE, false, FT_ERROR_VALUE);
1434
 
1435
      if (Status == FTC_SUCCESS)
1436
        Status = FTC_SetReadWriteDeviceTimeouts(ftHandle, DEVICE_READ_TIMEOUT_INFINITE, DEVICE_WRITE_TIMEOUT);
1437
 
1438
      if (Status == FTC_SUCCESS)
1439
        Status = FTC_SetDeviceLatencyTimer(ftHandle, DEVICE_LATENCY_TIMER_VALUE);
1440
 
1441
      if (Status == FTC_SUCCESS)
1442
        Status = FTC_ResetMPSSEInterface(ftHandle);
1443
 
1444
      if (Status == FTC_SUCCESS)
1445
        Status = FTC_EnableMPSSEInterface(ftHandle);
1446
 
1447
      if (Status == FTC_SUCCESS)
1448
        Status = FTC_SynchronizeMPSSEInterface(ftHandle);
1449
 
1450
      if (Status == FTC_SUCCESS)
1451
        Status = FTC_ResetUSBDevicePurgeUSBInputBuffer(ftHandle);
1452
 
1453
      if (Status == FTC_SUCCESS)
1454
        //Sleep(20); // wait for all the USB stuff to complete
1455
        // Removed Sleep() call and replaced with linux sleep to give up 
1456
        // timeslice - sched_yield() -- not sure is best idea! -- Julius
1457
        sched_yield();
1458
 
1459
      if (Status == FTC_SUCCESS)
1460
        Status = InitDataInOutClockFrequency(ftHandle, dwClockDivisor);
1461
 
1462
      if (Status == FTC_SUCCESS)
1463
        //        Status = FTC_SetDeviceLoopbackState(ftHandle, false);
1464
        Status = FTC_SetDeviceLoopbackState(ftHandle, false);
1465
 
1466
      if (Status == FTC_SUCCESS)
1467
        //Sleep(20); // wait for all the USB stuff to complete
1468
        // Removed Sleep() call and replaced with linux sleep to give up 
1469
        // timeslice - sched_yield() -- not sure is best idea! -- Julius
1470
        sched_yield();
1471
 
1472
      if (Status == FTC_SUCCESS)
1473
        Status = FTC_ResetUSBDevicePurgeUSBInputBuffer(ftHandle);
1474
 
1475
      if (Status == FTC_SUCCESS)
1476
        //Sleep(20); // wait for all the USB stuff to complete
1477
        // Removed Sleep() call and replaced with linux sleep to give up 
1478
        // timeslice - sched_yield() -- not sure is best idea! -- Julius
1479
        sched_yield();
1480
 
1481
      if (Status == FTC_SUCCESS)
1482
        Status = ResetTAPContollerExternalDeviceSetToTestIdleMode(ftHandle);
1483
    }
1484
    else
1485
      Status = FTC_INVALID_CLOCK_DIVISOR;
1486
  }
1487
 
1488
  return Status;
1489
}
1490
 
1491
FTC_STATUS FT2232cMpsseJtag::JTAG_GetClock(DWORD dwClockDivisor, LPDWORD lpdwClockFrequencyHz)
1492
{
1493
  FTC_STATUS Status = FTC_SUCCESS;
1494
 
1495
  if ((dwClockDivisor >= MIN_CLOCK_DIVISOR) && (dwClockDivisor <= MAX_CLOCK_DIVISOR))
1496
    FTC_GetClockFrequencyValues(dwClockDivisor, lpdwClockFrequencyHz);
1497
  else
1498
    Status = FTC_INVALID_CLOCK_DIVISOR;
1499
 
1500
  return Status;
1501
}
1502
 
1503
FTC_STATUS FT2232cMpsseJtag::JTAG_SetClock(FTC_HANDLE ftHandle, DWORD dwClockDivisor, LPDWORD lpdwClockFrequencyHz)
1504
{
1505
  FTC_STATUS Status = FTC_SUCCESS;
1506
 
1507
  Status = FTC_IsDeviceHandleValid(ftHandle);
1508
 
1509
  if (Status == FTC_SUCCESS)
1510
  {
1511
    if ((dwClockDivisor >= MIN_CLOCK_DIVISOR) && (dwClockDivisor <= MAX_CLOCK_DIVISOR))
1512
    {
1513
      Status = SetDataInOutClockFrequency(ftHandle, dwClockDivisor);
1514
 
1515
      if (Status == FTC_SUCCESS)
1516
        FTC_GetClockFrequencyValues(dwClockDivisor, lpdwClockFrequencyHz);
1517
    }
1518
    else
1519
      Status = FTC_INVALID_CLOCK_DIVISOR;
1520
  }
1521
 
1522
  return Status;
1523
}
1524
 
1525
FTC_STATUS FT2232cMpsseJtag::JTAG_SetDeviceLoopbackState(FTC_HANDLE ftHandle, BOOL bLoopbackState)
1526
//FTC_STATUS FT2232cMpsseJtag::JTAG_SetLoopback(FTC_HANDLE ftHandle, BOOL bLoopbackState)
1527
{
1528
  return FTC_SetDeviceLoopbackState(ftHandle, bLoopbackState);
1529
}
1530
 
1531
FTC_STATUS FT2232cMpsseJtag::JTAG_SetGeneralPurposeInputOutputPins(FTC_HANDLE ftHandle, BOOL bControlLowInputOutputPins,
1532
//FTC_STATUS FT2232cMpsseJtag::JTAG_SetGPIOs(FTC_HANDLE ftHandle, BOOL bControlLowInputOutputPins,
1533
                                                                   PFTC_INPUT_OUTPUT_PINS pLowInputOutputPinsData,
1534
                                                                   BOOL bControlHighInputOutputPins,
1535
                                                                   PFTC_INPUT_OUTPUT_PINS pHighInputOutputPinsData)
1536
{
1537
  FTC_STATUS Status = FTC_SUCCESS;
1538
  DWORD dwLowPinsDirection = 0;
1539
  DWORD dwLowPinsValue = 0;
1540
  DWORD dwHighPinsDirection = 0;
1541
  DWORD dwHighPinsValue = 0;
1542
 
1543
  Status = FTC_IsDeviceHandleValid(ftHandle);
1544
 
1545
  if (Status == FTC_SUCCESS)
1546
  {
1547
    if ((pLowInputOutputPinsData != NULL) && (pHighInputOutputPinsData != NULL))
1548
    {
1549
      if (pLowInputOutputPinsData->bPin1InputOutputState != false)
1550
        dwLowPinsDirection = (dwLowPinsDirection | '\x01');
1551
      if (pLowInputOutputPinsData->bPin2InputOutputState != false)
1552
        dwLowPinsDirection = (dwLowPinsDirection | '\x02');
1553
      if (pLowInputOutputPinsData->bPin3InputOutputState != false)
1554
        dwLowPinsDirection = (dwLowPinsDirection | '\x04');
1555
      if (pLowInputOutputPinsData->bPin4InputOutputState != false)
1556
        dwLowPinsDirection = (dwLowPinsDirection | '\x08');
1557
      if (pLowInputOutputPinsData->bPin1LowHighState != false)
1558
        dwLowPinsValue = (dwLowPinsValue | '\x01');
1559
      if (pLowInputOutputPinsData->bPin2LowHighState != false)
1560
        dwLowPinsValue = (dwLowPinsValue | '\x02');
1561
      if (pLowInputOutputPinsData->bPin3LowHighState != false)
1562
        dwLowPinsValue = (dwLowPinsValue | '\x04');
1563
      if (pLowInputOutputPinsData->bPin4LowHighState != false)
1564
        dwLowPinsValue = (dwLowPinsValue | '\x08');
1565
 
1566
      if (pHighInputOutputPinsData->bPin1InputOutputState != false)
1567
        dwHighPinsDirection = (dwHighPinsDirection | '\x01');
1568
      if (pHighInputOutputPinsData->bPin2InputOutputState != false)
1569
        dwHighPinsDirection = (dwHighPinsDirection | '\x02');
1570
      if (pHighInputOutputPinsData->bPin3InputOutputState != false)
1571
        dwHighPinsDirection = (dwHighPinsDirection | '\x04');
1572
      if (pHighInputOutputPinsData->bPin4InputOutputState != false)
1573
        dwHighPinsDirection = (dwHighPinsDirection | '\x08');
1574
      if (pHighInputOutputPinsData->bPin1LowHighState != false)
1575
        dwHighPinsValue = (dwHighPinsValue | '\x01');
1576
      if (pHighInputOutputPinsData->bPin2LowHighState != false)
1577
        dwHighPinsValue = (dwHighPinsValue | '\x02');
1578
      if (pHighInputOutputPinsData->bPin3LowHighState != false)
1579
        dwHighPinsValue = (dwHighPinsValue | '\x04');
1580
      if (pHighInputOutputPinsData->bPin4LowHighState != false)
1581
        dwHighPinsValue = (dwHighPinsValue | '\x08');
1582
 
1583
      Status = SetGeneralPurposeInputOutputPins(ftHandle, bControlLowInputOutputPins,
1584
                                                dwLowPinsDirection, dwLowPinsValue,
1585
                                                bControlHighInputOutputPins,
1586
                                                dwHighPinsDirection, dwHighPinsValue);
1587
    }
1588
    else
1589
      Status = FTC_NULL_INPUT_OUTPUT_BUFFER_POINTER;
1590
  }
1591
 
1592
  return Status;
1593
}
1594
 
1595
FTC_STATUS FT2232cMpsseJtag::JTAG_GetGeneralPurposeInputOutputPins(FTC_HANDLE ftHandle, BOOL bControlLowInputOutputPins,
1596
//FTC_STATUS FT2232cMpsseJtag::JTAG_GetGPIOs(FTC_HANDLE ftHandle, BOOL bControlLowInputOutputPins,
1597
                                                                   PFTC_LOW_HIGH_PINS pLowPinsInputData,
1598
                                                                   BOOL bControlHighInputOutputPins,
1599
                                                                   PFTC_LOW_HIGH_PINS pHighPinsInputData)
1600
{
1601
  FTC_STATUS Status = FTC_SUCCESS;
1602
 
1603
  Status = FTC_IsDeviceHandleValid(ftHandle);
1604
 
1605
  if (Status == FTC_SUCCESS)
1606
  {
1607
    if ((pLowPinsInputData != NULL) && (pHighPinsInputData != NULL))
1608
      Status = GetGeneralPurposeInputOutputPins(ftHandle, bControlLowInputOutputPins, pLowPinsInputData,
1609
                                                bControlHighInputOutputPins, pHighPinsInputData);
1610
    else
1611
      Status = FTC_NULL_INPUT_OUTPUT_BUFFER_POINTER;
1612
  }
1613
 
1614
  return Status;
1615
}
1616
 
1617
FTC_STATUS FT2232cMpsseJtag::JTAG_WriteDataToExternalDevice(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
1618
//FTC_STATUS FT2232cMpsseJtag::JTAG_Write(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
1619
                                                            PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1620
                                                            DWORD dwTapControllerState)
1621
{
1622
  FTC_STATUS Status = FTC_SUCCESS;
1623
 
1624
  Status = FTC_IsDeviceHandleValid(ftHandle);
1625
 
1626
  if (Status == FTC_SUCCESS)
1627
  {
1628
    if (pWriteDataBuffer != NULL)
1629
    {
1630
      Status = CheckWriteDataToExternalDeviceBitsBytesParameters(dwNumBitsToWrite, dwNumBytesToWrite);
1631
 
1632
      if (Status == FTC_SUCCESS)
1633
      {
1634
        if ((dwTapControllerState >= TEST_LOGIC_STATE) && (dwTapControllerState <= SHIFT_INSTRUCTION_REGISTER_STATE))
1635
          Status = WriteDataToExternalDevice(ftHandle, bInstructionTestData, dwNumBitsToWrite, pWriteDataBuffer,
1636
                                             dwNumBytesToWrite, dwTapControllerState);
1637
        else
1638
          Status = FTC_INVALID_TAP_CONTROLLER_STATE;
1639
      }
1640
    }
1641
    else
1642
      Status = FTC_NULL_WRITE_DATA_BUFFER_POINTER;
1643
  }
1644
 
1645
  return Status;
1646
}
1647
 
1648
FTC_STATUS FT2232cMpsseJtag::JTAG_ReadDataFromExternalDevice(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToRead,
1649
//FTC_STATUS FT2232cMpsseJtag::JTAG_Read(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToRead,
1650
                                                             PReadDataByteBuffer pReadDataBuffer, LPDWORD lpdwNumBytesReturned,
1651
                                                             DWORD dwTapControllerState)
1652
{
1653
  FTC_STATUS Status = FTC_SUCCESS;
1654
 
1655
  Status = FTC_IsDeviceHandleValid(ftHandle);
1656
 
1657
  if (Status == FTC_SUCCESS)
1658
  {
1659
    if (pReadDataBuffer != NULL)
1660
    {
1661
      if ((dwNumBitsToRead >= MIN_NUM_BITS) && (dwNumBitsToRead <= MAX_NUM_BITS))
1662
      {
1663
        if ((dwTapControllerState >= TEST_LOGIC_STATE) && (dwTapControllerState <= SHIFT_INSTRUCTION_REGISTER_STATE))
1664
          Status = ReadDataFromExternalDevice(ftHandle, bInstructionTestData, dwNumBitsToRead, pReadDataBuffer,
1665
                                              lpdwNumBytesReturned, dwTapControllerState);
1666
        else
1667
          Status = FTC_INVALID_TAP_CONTROLLER_STATE;
1668
      }
1669
      else
1670
        Status = FTC_INVALID_NUMBER_BITS;
1671
    }
1672
    else
1673
      Status = FTC_NULL_READ_DATA_BUFFER_POINTER;
1674
  }
1675
 
1676
  return Status;
1677
}
1678
 
1679
FTC_STATUS FT2232cMpsseJtag::JTAG_WriteReadDataToFromExternalDevice(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
1680
//FTC_STATUS FT2232cMpsseJtag::JTAG_WriteRead(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
1681
                                                                    PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1682
                                                                    PReadDataByteBuffer pReadDataBuffer, LPDWORD lpdwNumBytesReturned,
1683
                                                                    DWORD dwTapControllerState)
1684
{
1685
  FTC_STATUS Status = FTC_SUCCESS;
1686
 
1687
  Status = FTC_IsDeviceHandleValid(ftHandle);
1688
 
1689
  if (Status == FTC_SUCCESS)
1690
  {
1691
    if ((pWriteDataBuffer != NULL) && (pReadDataBuffer != NULL))
1692
    {
1693
      Status = CheckWriteDataToExternalDeviceBitsBytesParameters(dwNumBitsToWriteRead, dwNumBytesToWrite);
1694
 
1695
      if (Status == FTC_SUCCESS)
1696
      {
1697
        if ((dwTapControllerState >= TEST_LOGIC_STATE) && (dwTapControllerState <= SHIFT_INSTRUCTION_REGISTER_STATE))
1698
          Status = WriteReadDataToFromExternalDevice(ftHandle, bInstructionTestData, dwNumBitsToWriteRead,
1699
                                                     pWriteDataBuffer, dwNumBytesToWrite, pReadDataBuffer,
1700
                                                     lpdwNumBytesReturned, dwTapControllerState);
1701
        else
1702
          Status = FTC_INVALID_TAP_CONTROLLER_STATE;
1703
      }
1704
    }
1705
    else
1706
    {
1707
      if (pWriteDataBuffer == NULL)
1708
        Status = FTC_NULL_WRITE_DATA_BUFFER_POINTER;
1709
      else
1710
        Status = FTC_NULL_READ_DATA_BUFFER_POINTER;
1711
    }
1712
  }
1713
 
1714
  return Status;
1715
}
1716
 
1717
FTC_STATUS FT2232cMpsseJtag::JTAG_GenerateTCKClockPulses(FTC_HANDLE ftHandle, DWORD dwNumClockPulses)
1718
//FTC_STATUS FT2232cMpsseJtag::JTAG_GenerateClockPulses(FTC_HANDLE ftHandle, DWORD dwNumClockPulses)
1719
{
1720
  FTC_STATUS Status = FTC_SUCCESS;
1721
 
1722
  Status = FTC_IsDeviceHandleValid(ftHandle);
1723
 
1724
  if (Status == FTC_SUCCESS)
1725
  {
1726
    if ((dwNumClockPulses >= MIN_NUM_CLOCK_PULSES) && (dwNumClockPulses <= MAX_NUM_CLOCK_PULSES))
1727
      Status = GenerateTCKClockPulses(ftHandle, dwNumClockPulses);
1728
    else
1729
      Status = FTC_INVALID_NUMBER_CLOCK_PULSES;
1730
  }
1731
 
1732
  return Status;
1733
}
1734
 
1735
FTC_STATUS FT2232cMpsseJtag::JTAG_ClearCommandSequence(void)
1736
//FTC_STATUS FT2232cMpsseJtag::JTAG_ClearCmdSequence(void)
1737
{
1738
  FTC_STATUS Status = FTC_SUCCESS;
1739
  DWORD dwNumDevices;
1740
  FT2232CDeviceIndexes FT2232CIndexes;
1741
 
1742
  Status = FTC_GetNumDevices(&dwNumDevices, &FT2232CIndexes);
1743
 
1744
  if (Status == FTC_SUCCESS)
1745
  {
1746
    if (dwNumDevices == 1)
1747
      ClearDeviceCommandSequenceData(0);
1748
    else
1749
      Status = FTC_TOO_MANY_DEVICES;
1750
  }
1751
 
1752
  return Status;
1753
}
1754
 
1755
FTC_STATUS FT2232cMpsseJtag::JTAG_AddWriteCommand(BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
1756
//FTC_STATUS FT2232cMpsseJtag::JTAG_AddWriteCmd(BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
1757
                                                  PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1758
                                                  DWORD dwTapControllerState)
1759
{
1760
  FTC_STATUS Status = FTC_SUCCESS;
1761
  //DWORD dwNumCommandDataBytes = 0;
1762
  DWORD dwNumDevices;
1763
  FT2232CDeviceIndexes FT2232CIndexes;
1764
 
1765
  Status = FTC_GetNumDevices(&dwNumDevices, &FT2232CIndexes);
1766
 
1767
  if (Status == FTC_SUCCESS)
1768
  {
1769
    if (dwNumDevices == 1)
1770
      // ftHandle parameter set to 0 to indicate only one device present in the system
1771
      Status = AddDeviceWriteCommand(0, bInstructionTestData, dwNumBitsToWrite, pWriteDataBuffer, dwNumBytesToWrite, dwTapControllerState);
1772
    else
1773
      Status = FTC_TOO_MANY_DEVICES;
1774
  }
1775
 
1776
  return Status;
1777
}
1778
 
1779
FTC_STATUS FT2232cMpsseJtag::JTAG_AddReadCommand(BOOL bInstructionTestData, DWORD dwNumBitsToRead, DWORD dwTapControllerState)
1780
//FTC_STATUS FT2232cMpsseJtag::JTAG_AddReadCmd(BOOL bInstructionTestData, DWORD dwNumBitsToRead, DWORD dwTapControllerState)
1781
{
1782
  FTC_STATUS Status = FTC_SUCCESS;
1783
  //DWORD dwNumTmsClocks = 0;
1784
  DWORD dwNumDevices;
1785
  FT2232CDeviceIndexes FT2232CIndexes;
1786
 
1787
  Status = FTC_GetNumDevices(&dwNumDevices, &FT2232CIndexes);
1788
 
1789
  if (Status == FTC_SUCCESS)
1790
  {
1791
    if (dwNumDevices == 1)
1792
      // ftHandle parameter set to 0 to indicate only one device present in the system
1793
      Status = AddDeviceReadCommand(0, bInstructionTestData, dwNumBitsToRead, dwTapControllerState);
1794
    else
1795
      Status = FTC_TOO_MANY_DEVICES;
1796
  }
1797
 
1798
  return Status;
1799
}
1800
 
1801
FTC_STATUS FT2232cMpsseJtag::JTAG_AddWriteReadCommand(BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
1802
//FTC_STATUS FT2232cMpsseJtag::JTAG_AddWriteReadCmd(BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
1803
                                                      PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1804
                                                      DWORD dwTapControllerState)
1805
{
1806
  FTC_STATUS Status = FTC_SUCCESS;
1807
  //DWORD dwNumCommandDataBytes = 0;
1808
  //DWORD dwNumTmsClocks = 0;
1809
  DWORD dwNumDevices;
1810
  FT2232CDeviceIndexes FT2232CIndexes;
1811
 
1812
  Status = FTC_GetNumDevices(&dwNumDevices, &FT2232CIndexes);
1813
 
1814
  if (Status == FTC_SUCCESS)
1815
  {
1816
    if (dwNumDevices == 1)
1817
      // ftHandle parameter set to 0 to indicate only one device present in the system
1818
      Status = AddDeviceWriteReadCommand(0, bInstructionTestData, dwNumBitsToWriteRead, pWriteDataBuffer, dwNumBytesToWrite, dwTapControllerState);
1819
    else
1820
      Status = FTC_TOO_MANY_DEVICES;
1821
  }
1822
 
1823
  return Status;
1824
}
1825
 
1826
FTC_STATUS FT2232cMpsseJtag::JTAG_ClearDeviceCommandSequence(FTC_HANDLE ftHandle)
1827
//FTC_STATUS FT2232cMpsseJtag::JTAG_ClearDeviceCmdSequence(FTC_HANDLE ftHandle)
1828
{
1829
  FTC_STATUS Status = FTC_SUCCESS;
1830
 
1831
  Status = FTC_IsDeviceHandleValid(ftHandle);
1832
 
1833
  if (Status == FTC_SUCCESS)
1834
    ClearDeviceCommandSequenceData(ftHandle);
1835
 
1836
  return Status;
1837
}
1838
 
1839
FTC_STATUS FT2232cMpsseJtag::JTAG_AddDeviceWriteCommand(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
1840
//FTC_STATUS FT2232cMpsseJtag::JTAG_AddDeviceWriteCmd(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWrite,
1841
                                                        PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1842
                                                        DWORD dwTapControllerState)
1843
{
1844
  FTC_STATUS Status = FTC_SUCCESS;
1845
 
1846
  Status = FTC_IsDeviceHandleValid(ftHandle);
1847
 
1848
  if (Status == FTC_SUCCESS)
1849
    Status = AddDeviceWriteCommand(ftHandle, bInstructionTestData, dwNumBitsToWrite, pWriteDataBuffer, dwNumBytesToWrite, dwTapControllerState);
1850
 
1851
  return Status;
1852
}
1853
 
1854
FTC_STATUS FT2232cMpsseJtag::JTAG_AddDeviceReadCommand(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToRead, DWORD dwTapControllerState)
1855
//FTC_STATUS FT2232cMpsseJtag::JTAG_AddDeviceReadCmd(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToRead, DWORD dwTapControllerState)
1856
{
1857
  FTC_STATUS Status = FTC_SUCCESS;
1858
 
1859
  Status = FTC_IsDeviceHandleValid(ftHandle);
1860
 
1861
  if (Status == FTC_SUCCESS)
1862
    Status = AddDeviceReadCommand(ftHandle, bInstructionTestData, dwNumBitsToRead, dwTapControllerState);
1863
 
1864
  return Status;
1865
}
1866
 
1867
FTC_STATUS FT2232cMpsseJtag::JTAG_AddDeviceWriteReadCommand(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
1868
//FTC_STATUS FT2232cMpsseJtag::JTAG_AddDeviceWriteReadCmd(FTC_HANDLE ftHandle, BOOL bInstructionTestData, DWORD dwNumBitsToWriteRead,
1869
                                                            PWriteDataByteBuffer pWriteDataBuffer, DWORD dwNumBytesToWrite,
1870
                                                            DWORD dwTapControllerState)
1871
{
1872
  FTC_STATUS Status = FTC_SUCCESS;
1873
 
1874
  Status = FTC_IsDeviceHandleValid(ftHandle);
1875
 
1876
  if (Status == FTC_SUCCESS)
1877
    Status = AddDeviceWriteReadCommand(ftHandle, bInstructionTestData, dwNumBitsToWriteRead, pWriteDataBuffer, dwNumBytesToWrite, dwTapControllerState);
1878
 
1879
  return Status;
1880
}
1881
 
1882
FTC_STATUS FT2232cMpsseJtag::JTAG_ExecuteCommandSequence(FTC_HANDLE ftHandle, PReadCmdSequenceDataByteBuffer pReadCmdSequenceDataBuffer,
1883
//FTC_STATUS FT2232cMpsseJtag::JTAG_ExecuteCmdSequence(FTC_HANDLE ftHandle, PReadCmdSequenceDataByteBuffer pReadCmdSequenceDataBuffer,
1884
                                                         LPDWORD lpdwNumBytesReturned)
1885
{
1886
  FTC_STATUS Status = FTC_SUCCESS;
1887
  DWORD dwNumCmdSequenceBytes = 0;
1888
  DWORD dwCmdSequenceByteIndex = 0;
1889
  InputByteBuffer InputBuffer;
1890
  DWORD dwTotalNumBytesToBeRead = 0;
1891
  DWORD dwNumBytesRead = 0;
1892
 
1893
  Status = FTC_IsDeviceHandleValid(ftHandle);
1894
 
1895
  if (Status == FTC_SUCCESS)
1896
  {
1897
    if (pReadCmdSequenceDataBuffer != NULL)
1898
    {
1899
      iCommandsSequenceDataDeviceIndex = GetCommandsSequenceDataDeviceIndex(ftHandle);
1900
 
1901
      dwNumCmdSequenceBytes = GetNumBytesInCommandsSequenceDataBuffer();
1902
 
1903
      if (dwNumCmdSequenceBytes > 0)
1904
      {
1905
        AddByteToOutputBuffer(SEND_ANSWER_BACK_IMMEDIATELY_CMD, false);
1906
 
1907
        FTC_ClearOutputBuffer();
1908
 
1909
        dwNumCmdSequenceBytes = GetNumBytesInCommandsSequenceDataBuffer();
1910
 
1911
        // Transfer sequence of commands for specified device to output buffer for transmission to device
1912
        for (dwCmdSequenceByteIndex = 0; (dwCmdSequenceByteIndex < dwNumCmdSequenceBytes); dwCmdSequenceByteIndex++)
1913
          FTC_AddByteToOutputBuffer((*OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].pCommandsSequenceDataOutPutBuffer)[dwCmdSequenceByteIndex], false);
1914
 
1915
        OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumBytesToSend = 0;
1916
 
1917
        Status = FTC_SendCommandsSequenceToDevice(ftHandle);
1918
 
1919
        if (Status == FTC_SUCCESS)
1920
        {
1921
          if (OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumReadCommandSequences > 0)
1922
          {
1923
            // Calculate the total number of bytes to be read, as a result of a command sequence
1924
            dwTotalNumBytesToBeRead = GetTotalNumCommandsSequenceDataBytesToRead();
1925
 
1926
            Status = FTC_ReadCommandsSequenceBytesFromDevice(ftHandle, &InputBuffer, dwTotalNumBytesToBeRead, &dwNumBytesRead);
1927
 
1928
            if (Status == FTC_SUCCESS)
1929
            {
1930
              // Process all bytes received and return them in the read data buffer
1931
              ProcessReadCommandsSequenceBytes(&InputBuffer, dwNumBytesRead, pReadCmdSequenceDataBuffer, lpdwNumBytesReturned);
1932
            }
1933
          }
1934
        }
1935
 
1936
        OpenedDevicesCommandsSequenceData[iCommandsSequenceDataDeviceIndex].dwNumReadCommandSequences = 0;
1937
      }
1938
      else
1939
        Status = FTC_NO_COMMAND_SEQUENCE;
1940
 
1941
      iCommandsSequenceDataDeviceIndex = -1;
1942
    }
1943
    else
1944
      Status = FTC_NULL_READ_CMDS_DATA_BUFFER_POINTER;
1945
  }
1946
 
1947
  return Status;
1948
}
1949
 
1950
FTC_STATUS FT2232cMpsseJtag::JTAG_GetDllVersion(LPSTR lpDllVersionBuffer, DWORD dwBufferSize)
1951
{
1952
  FTC_STATUS Status = FTC_SUCCESS;
1953
 
1954
  if (lpDllVersionBuffer != NULL)
1955
  {
1956
    if (dwBufferSize > strlen(DLL_VERSION_NUM))
1957
      strcpy(lpDllVersionBuffer, DLL_VERSION_NUM);
1958
    else
1959
      Status = FTC_DLL_VERSION_BUFFER_TOO_SMALL;
1960
  }
1961
  else
1962
    Status = FTC_NULL_DLL_VERSION_BUFFER_POINTER;
1963
 
1964
  return Status;
1965
}
1966
 
1967
FTC_STATUS FT2232cMpsseJtag::JTAG_GetErrorCodeString(LPSTR lpLanguage, FTC_STATUS StatusCode,
1968
                                                     LPSTR lpErrorMessageBuffer, DWORD dwBufferSize)
1969
{
1970
  FTC_STATUS Status = FTC_SUCCESS;
1971
  CHAR szErrorMsg[MAX_ERROR_MSG_SIZE];
1972
  INT iCharCntr = 0;
1973
 
1974
  if ((lpLanguage != NULL) && (lpErrorMessageBuffer != NULL))
1975
  {
1976
    for (iCharCntr = 0; (iCharCntr < MAX_ERROR_MSG_SIZE); iCharCntr++)
1977
      szErrorMsg[iCharCntr] = '\0';
1978
 
1979
    if (((StatusCode >= FTC_SUCCESS) && (StatusCode <= FTC_INSUFFICIENT_RESOURCES)) ||
1980
        ((StatusCode >= FTC_FAILED_TO_COMPLETE_COMMAND) && (StatusCode <= FTC_INVALID_STATUS_CODE)))
1981
    {
1982
      if (strcmp(lpLanguage, ENGLISH) == 0)
1983
      {
1984
        if ((StatusCode >= FTC_SUCCESS) && (StatusCode <= FTC_INSUFFICIENT_RESOURCES))
1985
          strcpy(szErrorMsg, EN_Common_Errors[StatusCode]);
1986
        else
1987
          strcpy(szErrorMsg, EN_New_Errors[(StatusCode - FTC_FAILED_TO_COMPLETE_COMMAND)]);
1988
      }
1989
      else
1990
      {
1991
        strcpy(szErrorMsg, EN_New_Errors[FTC_INVALID_LANGUAGE_CODE - FTC_FAILED_TO_COMPLETE_COMMAND]);
1992
 
1993
        Status = FTC_INVALID_LANGUAGE_CODE;
1994
      }
1995
    }
1996
    else
1997
    {
1998
      sprintf(szErrorMsg, "%s%d", EN_New_Errors[FTC_INVALID_STATUS_CODE - FTC_FAILED_TO_COMPLETE_COMMAND], (int)StatusCode);
1999
 
2000
      Status = FTC_INVALID_STATUS_CODE;
2001
    }
2002
 
2003
    if (dwBufferSize > strlen(szErrorMsg))
2004
      strcpy(lpErrorMessageBuffer, szErrorMsg);
2005
    else
2006
      Status = FTC_ERROR_MESSAGE_BUFFER_TOO_SMALL;
2007
  }
2008
  else
2009
  {
2010
    if (lpLanguage == NULL)
2011
      Status = FTC_NULL_LANGUAGE_CODE_BUFFER_POINTER;
2012
    else
2013
      Status = FTC_NULL_ERROR_MESSAGE_BUFFER_POINTER;
2014
  }
2015
 
2016
  return Status;
2017
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.