Skip to content

Commit

Permalink
Fixed the NIOS console and device sync on init
Browse files Browse the repository at this point in the history
  • Loading branch information
tow3rs committed Feb 13, 2024
1 parent 0ceea0e commit 8083cde
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 43 deletions.
36 changes: 29 additions & 7 deletions Src/JTAG-MPSSE-Blaster.c
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,11 @@ FT_STATUS FTSendReceive(FT_HANDLE ftdih, unsigned char* outBuffer, unsigned int
JTAGClientData* InitDevice(unsigned int devNum, JTAGServerOperations* serverOperations, void* serverInstance)
{
FT_STATUS status;
unsigned char buffer[7];
unsigned char buffer[1024];
DWORD dwNumBytesToSend;
DWORD dwNumBytesToRead;
DWORD dwNumBytesSent;
DWORD dwNumBytesRead;
int clockDivisor;
DWORD numDevices;
DWORD dwFlags;
Expand Down Expand Up @@ -174,6 +177,25 @@ JTAGClientData* InitDevice(unsigned int devNum, JTAGServerOperations* serverOper
status |= FT_SetBitMode(hwData->deviceHandle, 0, FT_BITMODE_RESET);
status |= FT_SetBitMode(hwData->deviceHandle, 0, FT_BITMODE_MPSSE);

dwNumBytesToSend = 0;
buffer[dwNumBytesToSend++] = 0xAA;
buffer[dwNumBytesToSend++] = FT_OPCODE_SEND_IMMEDIATE;
status |= FT_Write(hwData->deviceHandle, buffer, dwNumBytesToSend, &dwNumBytesSent);
do
{
status |= FT_GetQueueStatus(hwData->deviceHandle, &dwNumBytesToRead);
} while ((dwNumBytesToRead == 0) && (status == FT_OK));

status |= FT_Read(hwData->deviceHandle, buffer, dwNumBytesToRead, &dwNumBytesRead);

for (DWORD dwCount = 0; dwCount < dwNumBytesRead - 1; dwCount++)
{
if ((buffer[dwCount] == 0xFA) && (buffer[dwCount + 1] == 0xAA))
{
break;
}
}

// Set initial states of the MPSSE interface - low byte, both pin directions and output values
// Pin Signal Direction
// ADBUS0 TCK output 1
Expand Down Expand Up @@ -267,9 +289,9 @@ BOOL ScanPorts(unsigned int index, char* portName, int size)
if (deviceCount == index)
{
#ifdef _WIN32
sprintf_s(portName, size, "%02d %s (%04X:%04X)", index, description, validDevices[j].VID, validDevices[j].PID);
sprintf_s(portName, size, "%02d %s", index, description);
#else
sprintf(portName, "%02d %s (%04X:%04X)", index, description, validDevices[j].VID, validDevices[j].PID);
sprintf(portName, "%02d %s", index, description);
#endif
return TRUE;
}
Expand All @@ -296,10 +318,10 @@ DWORD OpenHardware(JTAGClientData** mpsseBlaster, char* deviceName, JTAGServerOp
*mpsseBlaster = InitDevice(devnum, serverOperations, serverInstance);
if (*mpsseBlaster)
{
return 0;
return 1;
}
}
return 1;
return 0;
}

DWORD CloseHardware(JTAGClientData* mpsseBlaster)
Expand Down Expand Up @@ -481,7 +503,7 @@ static JtagClientOperations hwDevice =
.Reserved1 = NULL,
.ScanPorts = ScanPorts,
.Reserved2 = NULL,
.OpenHardware = NULL,
.OpenHardware = OpenHardware,
.CloseHardware = CloseHardware,
.SetParam = NULL,
.GetParam = GetParam,
Expand All @@ -495,7 +517,7 @@ static JtagClientOperations hwDevice =
.Recirculate = NULL,
.SetParamBlock = NULL,
.GetParamBlock = NULL,
.InitDriver = OpenHardware,
.InitDriver = NULL,
.EnableActiveSerial = NULL,
.RemoveDriver = NULL,
};
Expand Down
75 changes: 40 additions & 35 deletions Src/JTAG-Scan-Tool.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,60 +26,65 @@ int main(void)
if (clientOperations)
{
JTAGServerOperations serverOperations = { 0 };
serverOperations.StoreTDO = &StoreTDO;
serverOperations.StoreTDO = StoreTDO;
char portName[64];

for (;;)
{
{
int portsFound = FALSE;
printf("Device:\t\t[%s]\n\n", clientOperations->Name);

for (int portNumber = 0; clientOperations->ScanPorts(portNumber, portName, 64); portNumber++)
{
portsFound = TRUE;

JTAGClientData* clientData;
memset(tdoData, 0, sizeof(tdoData));
tdoBitCount = 0;

clientOperations->InitDriver(&clientData, portName, &serverOperations, NULL);

clientOperations->ClockRaw(clientData, 1, 1, 12, 0);
clientOperations->ClockRaw(clientData, 0, 1, 1, 0);
clientOperations->ClockRaw(clientData, 1, 1, 1, 0);
clientOperations->ClockRaw(clientData, 0, 1, 10, 0);
clientOperations->ClockRaw(clientData, 0, 1, 1, 0);
clientOperations->ClockRaw(clientData, 0, 0, 6, 0);
clientOperations->ClockRaw(clientData, 0, 1, 2, 0);
clientOperations->ClockRaw(clientData, 0, 0, 2, 0);
clientOperations->ClockRaw(clientData, 0, 1, 2, 0);
clientOperations->ClockRaw(clientData, 0, 0, 1, 0);
clientOperations->ClockRaw(clientData, 0, 1, 7, 0);
clientOperations->ClockRaw(clientData, 0, 0, 2, 0);

clientOperations->Flush(clientData, TRUE, 0);
clientOperations->CloseHardware(clientData);

printf(" Port:\t\t\t[%s]\n", portName);
printf(" Raw TDO bits:\t\t");

for (unsigned int tdoBytePosition = 0; tdoBytePosition < tdoBitCount; tdoBytePosition++)
if (clientOperations->OpenHardware(&clientData, portName, &serverOperations, NULL) && clientData)
{
if (tdoBytePosition && !(tdoBytePosition % 8))
portsFound = TRUE;
clientOperations->ClockRaw(clientData, 1, 1, 12, 0);
clientOperations->ClockRaw(clientData, 0, 1, 1, 0);
clientOperations->ClockRaw(clientData, 1, 1, 1, 0);
clientOperations->ClockRaw(clientData, 0, 1, 10, 0);
clientOperations->ClockRaw(clientData, 0, 1, 1, 0);
clientOperations->ClockRaw(clientData, 0, 0, 6, 0);
clientOperations->ClockRaw(clientData, 0, 1, 2, 0);
clientOperations->ClockRaw(clientData, 0, 0, 2, 0);
clientOperations->ClockRaw(clientData, 0, 1, 2, 0);
clientOperations->ClockRaw(clientData, 0, 0, 1, 0);
clientOperations->ClockRaw(clientData, 0, 1, 7, 0);
clientOperations->ClockRaw(clientData, 0, 0, 2, 0);

clientOperations->Flush(clientData, TRUE, 0);
clientOperations->CloseHardware(clientData);

printf(" Port:\t\t\t[%s]\n", portName);
printf(" Raw TDO bits:\t\t");

for (unsigned int tdoBytePosition = 0; tdoBytePosition < tdoBitCount; tdoBytePosition++)
{
printf(" ");
if (tdoBytePosition && !(tdoBytePosition % 8))
{
printf(" ");
}
printf("%d", (tdoData[tdoBytePosition / 8] >> (tdoBytePosition % 8)) & 1);
}
printf("%d", (tdoData[tdoBytePosition / 8 ] >> (tdoBytePosition % 8)) & 1);
}

printf("\n Raw TDO bytes:\t");
printf("\n Raw TDO bytes:\t");

for (unsigned int tdoBytePosition = 0; tdoBytePosition <= tdoBitCount / 8; tdoBytePosition++)
for (unsigned int tdoBytePosition = 0; tdoBytePosition <= tdoBitCount / 8; tdoBytePosition++)
{
printf("%02X ", tdoData[tdoBytePosition]);
}

printf("\n JTAG IDCode:\t\t%08X\n\n", *(int*)(tdoData + 2));
}
else
{
printf("%02X ", tdoData[tdoBytePosition]);
printf(" Unable to open port [%s]\n", portName);
getchar();
}

printf("\n JTAG IDCode:\t\t%08X\n\n", *(int*)(tdoData + 2));
}

if (!portsFound)
Expand Down
2 changes: 1 addition & 1 deletion version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0.1
1.0.2

0 comments on commit 8083cde

Please sign in to comment.