Skip to content

Commit

Permalink
Add missing "Send Immediate" Opcode
Browse files Browse the repository at this point in the history
  • Loading branch information
tow3rs committed Feb 18, 2024
1 parent 2abfe2b commit 0cff0c5
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 50 deletions.
79 changes: 39 additions & 40 deletions Src/JTAG-MPSSE-Blaster.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ JTAGClientData* InitDevice(unsigned int devNum, JTAGServerOperations* serverOper

status |= FT_Open(devNum, &hwData->deviceHandle);
status |= FT_ResetDevice(hwData->deviceHandle);
status |= FT_SetUSBParameters(hwData->deviceHandle, BUFFER_SIZE, BUFFER_SIZE);
status |= FT_SetUSBParameters(hwData->deviceHandle, BUFFER_SIZE, BUFFER_SIZE-1);
status |= FT_SetChars(hwData->deviceHandle, 0, 0, 0, 0);
status |= FT_SetTimeouts(hwData->deviceHandle, 200, 200);
status |= FT_SetLatencyTimer(hwData->deviceHandle, 10);
Expand All @@ -178,7 +178,7 @@ JTAGClientData* InitDevice(unsigned int devNum, JTAGServerOperations* serverOper
status |= FT_SetBitMode(hwData->deviceHandle, 0, FT_BITMODE_MPSSE);

dwNumBytesToSend = 0;
buffer[dwNumBytesToSend++] = 0xAA;
buffer[dwNumBytesToSend++] = FT_OPCODE_INVALID_COMMAND;
buffer[dwNumBytesToSend++] = FT_OPCODE_SEND_IMMEDIATE;
status |= FT_Write(hwData->deviceHandle, buffer, dwNumBytesToSend, &dwNumBytesSent);
do
Expand Down Expand Up @@ -339,10 +339,11 @@ DWORD CloseHardware(JTAGClientData* mpsseBlaster)

BOOL Flush(JTAGClientData* mpsseBlaster, BOOL store, int position)
{
if (mpsseBlaster->bytePosition)
unsigned int tdoPosition = 0;
if (mpsseBlaster->bytesToSend)
{
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition] = FT_OPCODE_SEND_IMMEDIATE;
FTSendReceive(mpsseBlaster->deviceHandle, mpsseBlaster->ftIOBuffer, mpsseBlaster->bytePosition, mpsseBlaster->ftIOBuffer, mpsseBlaster->bytesToReceive);
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = FT_OPCODE_SEND_IMMEDIATE;
FTSendReceive(mpsseBlaster->deviceHandle, mpsseBlaster->ftIOBuffer, mpsseBlaster->bytesToSend, mpsseBlaster->ftIOBuffer, mpsseBlaster->bytesToReceive);

for (unsigned int inbytePosition = 0; inbytePosition < mpsseBlaster->bytesToReceive; inbytePosition++)
{
Expand All @@ -351,39 +352,38 @@ BOOL Flush(JTAGClientData* mpsseBlaster, BOOL store, int position)
for(int inPos = 0; inPos < bitCount; inPos++)
{
unsigned char tdoSingleBit = 1 & (alignedByte >> inPos);
mpsseBlaster->tdoBits[mpsseBlaster->tdoPosition / 8] |= tdoSingleBit << mpsseBlaster->tdoPosition % 8;
mpsseBlaster->tdoPosition++;
mpsseBlaster->tdoBits[tdoPosition / 8] |= tdoSingleBit << tdoPosition % 8;
tdoPosition++;
}
}
}

if (mpsseBlaster->bitPosition)
if (mpsseBlaster->bitsToSend)
{
unsigned char buffer[4] =
{
FT_OPCODE_CLOCK_DATA_BITS,
mpsseBlaster->bitPosition - 1,
mpsseBlaster->bitsToSend - 1,
mpsseBlaster->currentByte,
FT_OPCODE_SEND_IMMEDIATE
};

FTSendReceive(mpsseBlaster->deviceHandle, buffer, 4, buffer, 1);
unsigned char tdoPartialByte = buffer[0] >> (8 - mpsseBlaster->bitsToSend);

unsigned char tdoPartialByte = buffer[0] >> (8 - mpsseBlaster->bitPosition);

for (unsigned char bitCount = 0; bitCount < mpsseBlaster->bitPosition; bitCount++)
for (unsigned char bitCount = 0; bitCount < mpsseBlaster->bitsToSend; bitCount++)
{
unsigned char tdoSingleBit = 1 & (tdoPartialByte >> bitCount);
mpsseBlaster->tdoBits[mpsseBlaster->tdoPosition / 8] |= tdoSingleBit << (mpsseBlaster->tdoPosition % 8);
mpsseBlaster->tdoPosition++;
mpsseBlaster->tdoBits[tdoPosition / 8] |= tdoSingleBit << (tdoPosition % 8);
tdoPosition++;
}
}

if (mpsseBlaster->tdoPosition)
if (tdoPosition)
{
if (mpsseBlaster->serverOperations->StoreTDO)
{
mpsseBlaster->serverOperations->StoreTDO(mpsseBlaster->serverInstance, mpsseBlaster->tdoBits, mpsseBlaster->tdoPosition);
mpsseBlaster->serverOperations->StoreTDO(mpsseBlaster->serverInstance, mpsseBlaster->tdoBits, tdoPosition);
}

if (mpsseBlaster->serverOperations->IndicateFlush)
Expand All @@ -395,9 +395,8 @@ BOOL Flush(JTAGClientData* mpsseBlaster, BOOL store, int position)
mpsseBlaster->bytesToReceive = 0;
memset(mpsseBlaster->tdoBits, 0, BUFFER_SIZE);
memset(mpsseBlaster->tdoBitCountPerByte, 0, BUFFER_SIZE);
mpsseBlaster->bitPosition = 0;
mpsseBlaster->tdoPosition = 0;
mpsseBlaster->bytePosition = 0;
mpsseBlaster->bitsToSend = 0;
mpsseBlaster->bytesToSend = 0;
mpsseBlaster->status = FirstByte;

return TRUE;
Expand All @@ -409,54 +408,54 @@ DWORD ClockBits(JTAGClientData* mpsseBlaster, int tms, int tdi, int bitCount, in
{
if (mpsseBlaster->lastTMS == tms)
{
if (mpsseBlaster->bitPosition == 0)
if (mpsseBlaster->bitsToSend == 0)
{
mpsseBlaster->currentByte = 0;
}

mpsseBlaster->currentByte |= tdi << mpsseBlaster->bitPosition;
mpsseBlaster->bitPosition++;
mpsseBlaster->currentByte |= tdi << mpsseBlaster->bitsToSend;
mpsseBlaster->bitsToSend++;

if (mpsseBlaster->bitPosition == 8)
if (mpsseBlaster->bitsToSend == 8)
{
if (mpsseBlaster->status == FirstByte)
{
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = FT_OPCODE_CLOCK_DATA_BYTES;
mpsseBlaster->numberOfBytes = (unsigned short*)&mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition];
mpsseBlaster->bytePosition += 2;
*mpsseBlaster->numberOfBytes = 0;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = FT_OPCODE_CLOCK_DATA_BYTES;
mpsseBlaster->numberOfBytesInChunk = (unsigned short*)&mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend];
mpsseBlaster->bytesToSend += 2;
*mpsseBlaster->numberOfBytesInChunk = 0;
mpsseBlaster->status = MultiByte;
}
else
{
(*mpsseBlaster->numberOfBytes)++;
(*mpsseBlaster->numberOfBytesInChunk)++;
}
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = mpsseBlaster->currentByte;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = mpsseBlaster->currentByte;
mpsseBlaster->tdoBitCountPerByte[mpsseBlaster->bytesToReceive++] = 8;
mpsseBlaster->bitPosition = 0;
mpsseBlaster->bitsToSend = 0;
mpsseBlaster->currentByte = 0;
}
}
else
{
if (mpsseBlaster->bitPosition)
if (mpsseBlaster->bitsToSend)
{
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = FT_OPCODE_CLOCK_DATA_BITS;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = mpsseBlaster->bitPosition - 1;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = mpsseBlaster->currentByte;
mpsseBlaster->tdoBitCountPerByte[mpsseBlaster->bytesToReceive++] = mpsseBlaster->bitPosition;
mpsseBlaster->bitPosition = 0;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = FT_OPCODE_CLOCK_DATA_BITS;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = mpsseBlaster->bitsToSend - 1;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = mpsseBlaster->currentByte;
mpsseBlaster->tdoBitCountPerByte[mpsseBlaster->bytesToReceive++] = mpsseBlaster->bitsToSend;
mpsseBlaster->bitsToSend = 0;
}

mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = FT_OPCODE_CLOCK_TMS;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = 0;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytePosition++] = (unsigned char)((tdi ? 0x80 : 0) | (tms ? 0x3 : 0));
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = FT_OPCODE_CLOCK_TMS;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = 0;
mpsseBlaster->ftIOBuffer[mpsseBlaster->bytesToSend++] = (unsigned char)((tdi ? 0x80 : 0) | (tms ? 0x3 : 0));
mpsseBlaster->tdoBitCountPerByte[mpsseBlaster->bytesToReceive++] = 1;
mpsseBlaster->lastTMS = tms;
mpsseBlaster->status = FirstByte;
}

if (mpsseBlaster->bytePosition > BUFFER_SIZE - 8)
if (mpsseBlaster->bytesToSend > BUFFER_SIZE - 8)
{
Flush(mpsseBlaster, TRUE, position);
}
Expand Down
19 changes: 10 additions & 9 deletions Src/JTAG-MPSSE-Blaster.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ typedef void* HANDLE;
// Opcodes
#define FT_OPCODE_CLOCK_TMS 0x6B
#define FT_OPCODE_SEND_IMMEDIATE 0x87
#define FT_OPCODE_INVALID_COMMAND 0xAA
#define FT_OPCODE_CLOCK_DATA_BITS 0x3B
#define FT_OPCODE_DISABLE_LOOPBACK 0x85
#define FT_OPCODE_CLOCK_DATA_BYTES 0x39
Expand Down Expand Up @@ -77,20 +78,20 @@ typedef struct
void* serverInstance;
BOOL isHighSpeed;
DWORD jtagClock;
StateMachine status;
FT_HANDLE deviceHandle;
int lastTMS;

unsigned int bytesToSend;
unsigned char bitsToSend;
unsigned char currentByte;
unsigned int bytesToReceive;
unsigned short* numberOfBytesInChunk;

unsigned char ftIOBuffer[BUFFER_SIZE];
unsigned char tdoBits[BUFFER_SIZE];
unsigned char tdoBitCountPerByte[BUFFER_SIZE];

unsigned short* numberOfBytes;
unsigned int tdoPosition;
int lastTMS;
unsigned char bitPosition;
unsigned char currentByte;
StateMachine status;
unsigned int bytePosition;
unsigned int bytesToReceive;
FT_HANDLE deviceHandle;
}JTAGClientData;

typedef struct
Expand Down
2 changes: 1 addition & 1 deletion version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0.3
1.0.4

0 comments on commit 0cff0c5

Please sign in to comment.