mirror of
https://github.com/preble/libpinproc
synced 2026-02-24 18:25:23 +01:00
Added pinprocfw, a utility to verify/update the P-ROC's firmware (FPGA image).
This commit is contained in:
@@ -623,7 +623,51 @@ PRResult PRDevice::DMDDraw(uint8_t * dots)
|
||||
//}
|
||||
}
|
||||
|
||||
PRResult PRDevice::PRJTAGDriveOutputs(PRJTAGOutputs * jtagOutputs, bool_t toggleClk)
|
||||
{
|
||||
const int burstSize = 2;
|
||||
uint32_t burst[burstSize];
|
||||
|
||||
if (toggleClk) CreateJTAGLatchOutputsBurst( burst, jtagOutputs );
|
||||
else CreateJTAGForceOutputsBurst( burst, jtagOutputs );
|
||||
return WriteData(burst, burstSize);
|
||||
}
|
||||
|
||||
PRResult PRDevice::PRJTAGWriteTDOMemory(uint16_t tableOffset, uint16_t numWords, uint32_t * tdoData)
|
||||
{
|
||||
int32_t i;
|
||||
const int maxBurstSize = 513;
|
||||
uint32_t burst[maxBurstSize];
|
||||
|
||||
burst[0] = CreateBurstCommand(P_ROC_BUS_JTAG_SELECT, P_ROC_JTAG_TDO_MEMORY_BASE_ADDR + tableOffset, numWords);
|
||||
for (i=0; i<numWords; i++) {
|
||||
burst[i+1] = tdoData[i];
|
||||
}
|
||||
|
||||
return WriteData(burst, numWords + 1);
|
||||
}
|
||||
|
||||
PRResult PRDevice::PRJTAGShiftTDOData(uint16_t numBits, bool_t dataBlockComplete)
|
||||
{
|
||||
const int burstSize = 2;
|
||||
uint32_t burst[burstSize];
|
||||
|
||||
CreateJTAGShiftTDODataBurst( burst, numBits, dataBlockComplete );
|
||||
return WriteData(burst, burstSize);
|
||||
}
|
||||
|
||||
PRResult PRDevice::PRJTAGReadTDIMemory(uint16_t tableOffset, uint16_t numWords, uint32_t * tdiData)
|
||||
{
|
||||
ReadDataRaw (P_ROC_BUS_JTAG_SELECT, P_ROC_JTAG_TDI_MEMORY_BASE_ADDR + tableOffset, numWords, tdiData);
|
||||
}
|
||||
|
||||
PRResult PRDevice::PRJTAGGetStatus(PRJTAGStatus * status)
|
||||
{
|
||||
uint32_t rdBuffer[1];
|
||||
ReadDataRaw (P_ROC_BUS_JTAG_SELECT, P_ROC_JTAG_STATUS_REG_BASE_ADDR, 1, rdBuffer);
|
||||
status->commandComplete = rdBuffer[0] >> P_ROC_JTAG_STATUS_DONE_SHIFT;
|
||||
status->tdi = rdBuffer[0] >> P_ROC_JTAG_STATUS_TDI_SHIFT;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Device I/O
|
||||
@@ -798,7 +842,7 @@ PRResult PRDevice::WriteDataRaw(uint32_t moduleSelect, uint32_t startingAddr, in
|
||||
PRResult PRDevice::ReadDataRaw(uint32_t moduleSelect, uint32_t startingAddr, int32_t numReadWords, uint32_t * readBuffer)
|
||||
{
|
||||
uint32_t rc;
|
||||
uint8_t i;
|
||||
uint32_t i;
|
||||
|
||||
// Send out the request.
|
||||
rc = RequestData(moduleSelect, startingAddr, numReadWords);
|
||||
|
||||
@@ -73,6 +73,12 @@ public:
|
||||
PRResult DMDUpdateConfig(PRDMDConfig *dmdConfig);
|
||||
PRResult DMDDraw(uint8_t * dots);
|
||||
|
||||
PRResult PRJTAGDriveOutputs(PRJTAGOutputs * jtagOutputs, bool_t toggleClk);
|
||||
PRResult PRJTAGWriteTDOMemory(uint16_t tableOffset, uint16_t numWords, uint32_t * tdoData);
|
||||
PRResult PRJTAGShiftTDOData(uint16_t numBits, bool_t dataBlockComplete);
|
||||
PRResult PRJTAGReadTDIMemory(uint16_t tableOffset, uint16_t numWords, uint32_t * tdiData);
|
||||
PRResult PRJTAGGetStatus(PRJTAGStatus * status);
|
||||
|
||||
protected:
|
||||
|
||||
// Device I/O
|
||||
|
||||
@@ -234,6 +234,44 @@ int32_t CreateDMDUpdateConfigBurst ( uint32_t * burst, PRDMDConfig *dmd_config)
|
||||
return kPRSuccess;
|
||||
}
|
||||
|
||||
int32_t CreateJTAGForceOutputsBurst ( uint32_t * burst, PRJTAGOutputs *jtagOutputs) {
|
||||
burst[0] = CreateBurstCommand (P_ROC_BUS_JTAG_SELECT, P_ROC_JTAG_COMMAND_REG_BASE_ADDR, 1 );
|
||||
burst[1] = 0;
|
||||
burst[1] = 1 << P_ROC_JTAG_CMD_START_SHIFT |
|
||||
1 << P_ROC_JTAG_CMD_OE_SHIFT |
|
||||
P_ROC_JTAG_CMD_SET_PORTS << P_ROC_JTAG_CMD_CMD_SHIFT |
|
||||
jtagOutputs->tckMask << P_ROC_JTAG_TRANSITION_TCK_MASK_SHIFT |
|
||||
jtagOutputs->tdoMask << P_ROC_JTAG_TRANSITION_TDO_MASK_SHIFT |
|
||||
jtagOutputs->tmsMask << P_ROC_JTAG_TRANSITION_TMS_MASK_SHIFT |
|
||||
jtagOutputs->tck << P_ROC_JTAG_TRANSITION_TCK_SHIFT |
|
||||
jtagOutputs->tdo << P_ROC_JTAG_TRANSITION_TCK_SHIFT |
|
||||
jtagOutputs->tms << P_ROC_JTAG_TRANSITION_TCK_SHIFT;
|
||||
return kPRSuccess;
|
||||
|
||||
}
|
||||
int32_t CreateJTAGLatchOutputsBurst ( uint32_t * burst, PRJTAGOutputs *jtagOutputs) {
|
||||
burst[0] = CreateBurstCommand (P_ROC_BUS_JTAG_SELECT, P_ROC_JTAG_COMMAND_REG_BASE_ADDR, 1 );
|
||||
burst[1] = 0;
|
||||
burst[1] = 1 << P_ROC_JTAG_CMD_START_SHIFT |
|
||||
1 << P_ROC_JTAG_CMD_OE_SHIFT |
|
||||
P_ROC_JTAG_CMD_TRANSITION << P_ROC_JTAG_CMD_CMD_SHIFT |
|
||||
jtagOutputs->tdoMask << P_ROC_JTAG_TRANSITION_TDO_MASK_SHIFT |
|
||||
jtagOutputs->tmsMask << P_ROC_JTAG_TRANSITION_TMS_MASK_SHIFT |
|
||||
jtagOutputs->tdo << P_ROC_JTAG_TRANSITION_TCK_SHIFT |
|
||||
jtagOutputs->tms << P_ROC_JTAG_TRANSITION_TMS_SHIFT;
|
||||
return kPRSuccess;
|
||||
|
||||
}
|
||||
int32_t CreateJTAGShiftTDODataBurst ( uint32_t * burst, uint16_t numBits, bool_t dataBlockComplete) {
|
||||
burst[0] = CreateBurstCommand (P_ROC_BUS_JTAG_SELECT, P_ROC_JTAG_COMMAND_REG_BASE_ADDR, 1 );
|
||||
burst[1] = 0;
|
||||
burst[1] = 1 << P_ROC_JTAG_CMD_START_SHIFT |
|
||||
1 << P_ROC_JTAG_CMD_OE_SHIFT |
|
||||
P_ROC_JTAG_CMD_SHIFT << P_ROC_JTAG_CMD_CMD_SHIFT |
|
||||
dataBlockComplete << P_ROC_JTAG_SHIFT_EXIT_SHIFT |
|
||||
numBits << P_ROC_JTAG_SHIFT_NUM_BITS_SHIFT;
|
||||
return kPRSuccess;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is where all FTDI driver-specific code should go.
|
||||
|
||||
@@ -64,7 +64,7 @@ const uint32_t P_ROC_REG_ADDR_SHIFT = 0;
|
||||
const uint32_t P_ROC_MODULE_SELECT_SHIFT = 16;
|
||||
|
||||
const uint32_t P_ROC_MANAGER_SELECT = 0;
|
||||
const uint32_t P_ROC_BUS_MASTER_SELECT = 1;
|
||||
const uint32_t P_ROC_BUS_JTAG_SELECT = 1;
|
||||
const uint32_t P_ROC_BUS_SWITCH_CTRL_SELECT = 2;
|
||||
const uint32_t P_ROC_BUS_DRIVER_CTRL_SELECT = 3;
|
||||
const uint32_t P_ROC_BUS_STATE_CHANGE_PROC_SELECT = 4;
|
||||
@@ -80,6 +80,33 @@ const uint32_t P_ROC_MANAGER_WATCHDOG_EXPIRED_SHIFT = 30;
|
||||
const uint32_t P_ROC_MANAGER_WATCHDOG_ENABLE_SHIFT = 14;
|
||||
const uint32_t P_ROC_MANAGER_WATCHDOG_RESET_TIME_SHIFT = 0;
|
||||
|
||||
const uint32_t P_ROC_JTAG_SHIFT_EXIT_SHIFT = 16;
|
||||
const uint32_t P_ROC_JTAG_SHIFT_NUM_BITS_SHIFT = 0;
|
||||
|
||||
const uint32_t P_ROC_JTAG_CMD_CHANGE_STATE = 0;
|
||||
const uint32_t P_ROC_JTAG_CMD_SHIFT = 1;
|
||||
const uint32_t P_ROC_JTAG_CMD_TRANSITION = 2;
|
||||
const uint32_t P_ROC_JTAG_CMD_SET_PORTS = 3;
|
||||
|
||||
const uint32_t P_ROC_JTAG_CMD_START_SHIFT = 31;
|
||||
const uint32_t P_ROC_JTAG_CMD_OE_SHIFT = 30;
|
||||
const uint32_t P_ROC_JTAG_CMD_CMD_SHIFT = 24;
|
||||
|
||||
const uint32_t P_ROC_JTAG_TRANSITION_TCK_MASK_SHIFT = 6;
|
||||
const uint32_t P_ROC_JTAG_TRANSITION_TDO_MASK_SHIFT = 5;
|
||||
const uint32_t P_ROC_JTAG_TRANSITION_TMS_MASK_SHIFT = 4;
|
||||
const uint32_t P_ROC_JTAG_TRANSITION_TCK_SHIFT = 2;
|
||||
const uint32_t P_ROC_JTAG_TRANSITION_TDO_SHIFT = 1;
|
||||
const uint32_t P_ROC_JTAG_TRANSITION_TMS_SHIFT = 0;
|
||||
|
||||
const uint32_t P_ROC_JTAG_STATUS_DONE_SHIFT = 31;
|
||||
const uint32_t P_ROC_JTAG_STATUS_TDI_SHIFT = 16;
|
||||
|
||||
const uint32_t P_ROC_JTAG_COMMAND_REG_BASE_ADDR = 0x0;
|
||||
const uint32_t P_ROC_JTAG_STATUS_REG_BASE_ADDR = 0x1;
|
||||
const uint32_t P_ROC_JTAG_TDO_MEMORY_BASE_ADDR = 0x400;
|
||||
const uint32_t P_ROC_JTAG_TDI_MEMORY_BASE_ADDR = 0x800;
|
||||
|
||||
const uint32_t P_ROC_SWITCH_CTRL_STATE_BASE_ADDR = 4;
|
||||
const uint32_t P_ROC_SWITCH_CTRL_DEBOUNCE_BASE_ADDR = 11;
|
||||
|
||||
@@ -187,6 +214,10 @@ void ParseSwitchRuleIndex(uint16_t index, uint8_t *switchNum, PREventType *event
|
||||
int16_t CreateSwitchRuleIndex(uint8_t switchNum, PREventType eventType);
|
||||
int32_t CreateSwitchRuleAddr(uint8_t switchNum, PREventType eventType);
|
||||
|
||||
int32_t CreateJTAGLatchOutputsBurst ( uint32_t * burst, PRJTAGOutputs *jtagOutputs);
|
||||
int32_t CreateJTAGForceOutputsBurst ( uint32_t * burst, PRJTAGOutputs *jtagOutputs);
|
||||
int32_t CreateJTAGShiftTDODataBurst ( uint32_t * burst, uint16_t numBits, bool_t dataBlockComplete);
|
||||
|
||||
|
||||
PRResult PRHardwareOpen();
|
||||
void PRHardwareClose();
|
||||
|
||||
@@ -293,6 +293,8 @@ PR_EXPORT PRResult PRSwitchGetStates(PRHandle handle, PREventType * switchStates
|
||||
return handleAsDevice->SwitchGetStates(switchStates, numSwitches);
|
||||
}
|
||||
|
||||
// DMD
|
||||
|
||||
PR_EXPORT int32_t PRDMDUpdateConfig(PRHandle handle, PRDMDConfig *dmdConfig)
|
||||
{
|
||||
return handleAsDevice->DMDUpdateConfig(dmdConfig);
|
||||
@@ -302,3 +304,29 @@ PR_EXPORT PRResult PRDMDDraw(PRHandle handle, uint8_t * dots)
|
||||
return handleAsDevice->DMDDraw(dots);
|
||||
}
|
||||
|
||||
// JTAG
|
||||
|
||||
PR_EXPORT PRResult PRJTAGDriveOutputs(PRHandle handle, PRJTAGOutputs * jtagOutputs, bool_t toggleClk)
|
||||
{
|
||||
return handleAsDevice->PRJTAGDriveOutputs(jtagOutputs, toggleClk);
|
||||
}
|
||||
|
||||
PR_EXPORT PRResult PRJTAGWriteTDOMemory(PRHandle handle, uint16_t tableOffset, uint16_t numWords, uint32_t * tdoData)
|
||||
{
|
||||
return handleAsDevice->PRJTAGWriteTDOMemory(tableOffset, numWords, tdoData);
|
||||
}
|
||||
|
||||
PR_EXPORT PRResult PRJTAGShiftTDOData(PRHandle handle, uint16_t numBits, bool_t dataBlockComplete)
|
||||
{
|
||||
return handleAsDevice->PRJTAGShiftTDOData(numBits, dataBlockComplete);
|
||||
}
|
||||
|
||||
PR_EXPORT PRResult PRJTAGReadTDIMemory(PRHandle handle, uint16_t tableOffset, uint16_t numWords, uint32_t * tdiData)
|
||||
{
|
||||
return handleAsDevice->PRJTAGReadTDIMemory(tableOffset, numWords, tdiData);
|
||||
}
|
||||
|
||||
PR_EXPORT PRResult PRJTAGGetStatus(PRHandle handle, PRJTAGStatus * status)
|
||||
{
|
||||
return handleAsDevice->PRJTAGGetStatus(status);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user