diff --git a/CMakeLists.txt b/CMakeLists.txt index 33b717f..f47c68e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -146,7 +146,7 @@ if(MSVC) endforeach() endif() # - set(LABEL_SUFFIX "${LABEL_SUFFIX} ${LIB_RT_OPTION}") + set(LABEL_SUFFIX "${LABEL_SUFFIX} ${LIB_RT_SUFFIX}") # b) Change prefix for static libraries set(CMAKE_STATIC_LIBRARY_PREFIX "lib") # to distinguish static libraries from DLL import libs diff --git a/include/pinproc.h b/include/pinproc.h index a8975fe..91746f6 100644 --- a/include/pinproc.h +++ b/include/pinproc.h @@ -537,7 +537,47 @@ PINPROC_API PRResult PRJTAGReadTDIMemory(PRHandle handle, uint16_t tableOffset, /** Read the JTAG status register for the command complete bit and JTAG pin states. */ PINPROC_API PRResult PRJTAGGetStatus(PRHandle handle, PRJTAGStatus * status); -/** @} */ // End of DMD +/** @} */ // End of JTAG + +// PD-LED + +/** + * @defgroup pdled PD-LED Control + * @{ + */ + + +typedef struct PRLED { + uint8_t boardAddr; + uint8_t LEDIndex; +} PRLED; + +typedef struct PRLEDRGB { + PRLED* pRedLED; + PRLED* pGreenLED; + PRLED* pBlueLED; +} PRLEDRGB; + +/** Sets the color of a given PRLED. */ +PINPROC_API PRResult PRLEDColor(PRHandle handle, PRLED * pLED, uint8_t color); +/** Sets the fade color on a given PRLED. */ +PINPROC_API PRResult PRLEDFadeColor(PRHandle handle, PRLED * pLED, uint8_t fadeColor); +/** Sets the fade color and rate on a given PRLED. Note: The rate will apply to any future PRLEDFadeColor or PRLEDRGBFadeColor calls on the same PD-LED board. */ +PINPROC_API PRResult PRLEDFade(PRHandle handle, PRLED * pLED, uint8_t fadeColor, uint16_t fadeRate); + +/** Sets the fade rate on a given board. Note: The rate will apply to any future PRLEDFadeColor or PRLEDRGBFadeColor calls on the same PD-LED board. */ +PINPROC_API PRResult PRLEDFadeRate(PRHandle handle, uint8_t boardAddr, uint16_t fadeRate); + +/** Sets the color of a given PRLEDRGB. */ +PINPROC_API PRResult PRLEDRGBColor(PRHandle handle, PRLEDRGB * pLED, uint32_t color); +/** Sets the fade color and rate on a given PRLEDRGB. Note: The rate will apply to any future PRLEDFadeColor or PRLEDRGBFadeColor calls on any of the referenced PD-LED boards. */ +PINPROC_API PRResult PRLEDRGBFade(PRHandle handle, PRLEDRGB * pLED, uint32_t fadeColor, uint16_t fadeRate); +/** Sets the fade color on a given PRLEDRGB. */ +PINPROC_API PRResult PRLEDRGBFadeColor(PRHandle handle, PRLEDRGB * pLED, uint32_t fadeColor); + + +/** @} */ // End of PD-LED + /** @cond */ PINPROC_EXTERN_C_END diff --git a/src/PRDevice.cpp b/src/PRDevice.cpp index 8e118b0..d2acf62 100644 --- a/src/PRDevice.cpp +++ b/src/PRDevice.cpp @@ -1344,3 +1344,110 @@ int PRDevice::GetVersionInfo(uint16_t *verPtr, uint16_t *revPtr, uint16_t *combi *combinedPtr = combinedVersionRevision; return 0; } + +PRResult PRDevice::PRLEDColor(PRLED * pLED, uint8_t color) +{ + const int bufferWords = 2; + uint32_t buffer[bufferWords]; + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->LEDIndex, buffer); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeColor, color, &buffer[1]); + + return WriteDataRaw(P_ROC_BUS_DRIVER_CTRL_SELECT, P_ROC_DRIVER_PDB_ADDR, bufferWords, buffer); +} + +PRResult PRDevice::PRLEDFade(PRLED * pLED, uint8_t fadeColor, uint16_t fadeRate) +{ + const int bufferWords = 4; + uint32_t buffer[bufferWords]; + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeFadeRateLow, fadeRate & 0xFF, buffer); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeFadeRateHigh, (fadeRate >> 8) & 0xFF, &buffer[1]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->LEDIndex, &buffer[2]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeFadeColor, fadeColor, &buffer[3]); + + return WriteDataRaw(P_ROC_BUS_DRIVER_CTRL_SELECT, P_ROC_DRIVER_PDB_ADDR, bufferWords, buffer); +} + +PRResult PRDevice::PRLEDFadeColor(PRLED * pLED, uint8_t fadeColor) +{ + const int bufferWords = 2; + uint32_t buffer[bufferWords]; + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->LEDIndex, buffer); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->boardAddr, kPRLEDRegisterTypeFadeColor, fadeColor, &buffer[1]); + + return WriteDataRaw(P_ROC_BUS_DRIVER_CTRL_SELECT, P_ROC_DRIVER_PDB_ADDR, bufferWords, buffer); +} + +PRResult PRDevice::PRLEDFadeRate(uint8_t boardAddr, uint16_t fadeRate) +{ + const int bufferWords = 2; + uint32_t buffer[bufferWords]; + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, boardAddr, kPRLEDRegisterTypeFadeRateLow, fadeRate & 0xFF, buffer); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, boardAddr, kPRLEDRegisterTypeFadeRateHigh, (fadeRate >> 8) & 0xFF, &buffer[1]); + + return WriteDataRaw(P_ROC_BUS_DRIVER_CTRL_SELECT, P_ROC_DRIVER_PDB_ADDR, bufferWords, buffer); +} + +PRResult PRDevice::PRLEDRGBColor(PRLEDRGB * pLED, uint32_t color) +{ + const int bufferWords = 6; + uint32_t buffer[bufferWords]; + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pRedLED->LEDIndex, buffer); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeColor, (color >> 16) & 0xFF, &buffer[1]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pGreenLED->LEDIndex, &buffer[2]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeColor, (color >> 8) & 0xFF, &buffer[3]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pBlueLED->LEDIndex, &buffer[4]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeColor, color & 0xFF, &buffer[5]); + + return WriteDataRaw(P_ROC_BUS_DRIVER_CTRL_SELECT, P_ROC_DRIVER_PDB_ADDR, bufferWords, buffer); +} + +PRResult PRDevice::PRLEDRGBFade(PRLEDRGB * pLED, uint32_t fadeColor, uint16_t fadeRate) +{ + const int bufferWords = 12; + uint32_t buffer[bufferWords]; + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeFadeRateLow, fadeRate & 0xFF, buffer); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeFadeRateHigh, (fadeRate >> 8) & 0xFF, &buffer[1]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pRedLED->LEDIndex, &buffer[2]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeFadeColor, (fadeColor >> 16) & 0xFF, &buffer[3]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeFadeRateLow, fadeRate & 0xFF, &buffer[4]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeFadeRateHigh, (fadeRate >> 8) & 0xFF, &buffer[5]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pGreenLED->LEDIndex, &buffer[6]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeFadeColor, (fadeColor >> 8) & 0xFF, &buffer[7]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeFadeRateLow, fadeRate & 0xFF, &buffer[8]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeFadeRateHigh, (fadeRate >> 8) & 0xFF, &buffer[9]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pBlueLED->LEDIndex, &buffer[10]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeFadeColor, fadeColor & 0xFF, &buffer[11]); + + return WriteDataRaw(P_ROC_BUS_DRIVER_CTRL_SELECT, P_ROC_DRIVER_PDB_ADDR, bufferWords, buffer); +} + +PRResult PRDevice::PRLEDRGBFadeColor(PRLEDRGB * pLED, uint32_t fadeColor) +{ + const int bufferWords = 6; + uint32_t buffer[bufferWords]; + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pRedLED->LEDIndex, buffer); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pRedLED->boardAddr, kPRLEDRegisterTypeFadeColor, (fadeColor >> 16) & 0xFF, &buffer[1]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pGreenLED->LEDIndex, &buffer[2]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pGreenLED->boardAddr, kPRLEDRegisterTypeFadeColor, (fadeColor >> 8) & 0xFF, &buffer[3]); + + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeLEDIndex, pLED->pBlueLED->LEDIndex, &buffer[4]); + FillPDBCommand(P_ROC_DRIVER_PDB_WRITE_COMMAND, pLED->pBlueLED->boardAddr, kPRLEDRegisterTypeFadeColor, fadeColor & 0xFF, &buffer[5]); + + return WriteDataRaw(P_ROC_BUS_DRIVER_CTRL_SELECT, P_ROC_DRIVER_PDB_ADDR, bufferWords, buffer); +} diff --git a/src/PRDevice.h b/src/PRDevice.h index fdd89d9..e15bf68 100644 --- a/src/PRDevice.h +++ b/src/PRDevice.h @@ -86,6 +86,13 @@ public: PRResult PRJTAGReadTDIMemory(uint16_t tableOffset, uint16_t numWords, uint32_t * tdiData); PRResult PRJTAGGetStatus(PRJTAGStatus * status); + PRResult PRLEDColor(PRLED * pLED, uint8_t color); + PRResult PRLEDFade(PRLED * pLED, uint8_t fadeColor, uint16_t fadeRate); + PRResult PRLEDFadeColor(PRLED * pLED, uint8_t fadeColor); + PRResult PRLEDFadeRate(uint8_t boardAddr, uint16_t fadeRate); + PRResult PRLEDRGBColor(PRLEDRGB * pLED, uint32_t color); + PRResult PRLEDRGBFade(PRLEDRGB * pLED, uint32_t fadeColor, uint16_t fadeRate); + PRResult PRLEDRGBFadeColor(PRLEDRGB * pLED, uint32_t fadeColor); int GetVersionInfo(uint16_t *verPtr, uint16_t *revPtr, uint16_t *combinedPtr); diff --git a/src/PRHardware.cpp b/src/PRHardware.cpp index 2f2885b..4b2abd2 100644 --- a/src/PRHardware.cpp +++ b/src/PRHardware.cpp @@ -344,6 +344,16 @@ int32_t CreateJTAGShiftTDODataBurst ( uint32_t * burst, uint16_t numBits, bool_t return kPRSuccess; } +void FillPDBCommand(uint8_t command, uint8_t boardAddr, PRLEDRegisterType reg, uint8_t data, uint32_t * buffer) +{ + buffer[0] = (command << P_ROC_DRIVER_PDB_COMMAND_SHIFT) | + (boardAddr << P_ROC_DRIVER_PDB_BOARD_ADDR_SHIFT) | + (reg << P_ROC_DRIVER_PDB_REGISTER_SHIFT) | + (data << P_ROC_DRIVER_PDB_DATA_SHIFT); +} + + + /** * This is where all FTDI driver-specific code should go. * As we add support for other drivers (such as D2xx on Windows), we will add more implementations of the PRHardware*() functions here. diff --git a/src/PRHardware.h b/src/PRHardware.h index 8fe5a5c..3e8192e 100644 --- a/src/PRHardware.h +++ b/src/PRHardware.h @@ -254,6 +254,27 @@ const uint32_t P_ROC_DMD_RCLK_LOW_CYCLES_SHIFT = 24; const uint32_t P_ROC_DMD_DOT_TABLE_BASE_ADDR = 0x1000; +const uint32_t P_ROC_DRIVER_PDB_ADDR = 0xC00; +const uint32_t P_ROC_DRIVER_PDB_COMMAND_SHIFT = 24; +const uint32_t P_ROC_DRIVER_PDB_BOARD_ADDR_SHIFT = 16; +const uint32_t P_ROC_DRIVER_PDB_REGISTER_SHIFT = 8; +const uint32_t P_ROC_DRIVER_PDB_DATA_SHIFT = 0; +const uint32_t P_ROC_DRIVER_PDB_READ_COMMAND = 0x00; +const uint32_t P_ROC_DRIVER_PDB_WRITE_COMMAND = 0x01; +const uint32_t P_ROC_DRIVER_PDB_CLEAR_ALL_COMMAND = 0x07; +const uint32_t P_ROC_DRIVER_PDB_BROADCAST_ADDR = 0x3F; + +const uint32_t p_ROC_DRIVER_PDB_REGISTER_BANK_A = 0; +const uint32_t p_ROC_DRIVER_PDB_REGISTER_BANK_B = 1; + +typedef enum PRLEDRegisterType { + kPRLEDRegisterTypeLEDIndex = 0, + kPRLEDRegisterTypeColor = 1, + kPRLEDRegisterTypeFadeColor = 2, + kPRLEDRegisterTypeFadeRateLow = 3, + kPRLEDRegisterTypeFadeRateHigh = 4 +} PRPDLEDRegisterType; + typedef struct PRSwitchRuleInternal { uint8_t switchNum; /**< Number of the physical switch, or for linked driver changes the virtual switch number (224 and up). */ PREventType eventType; /**< The event type that this rule generates. Determines closed/open, debounced/non-debounced. */ @@ -291,6 +312,8 @@ int32_t CreateJTAGLatchOutputsBurst ( uint32_t * burst, PRJTAGOutputs *jtagOutpu int32_t CreateJTAGForceOutputsBurst ( uint32_t * burst, PRJTAGOutputs *jtagOutputs); int32_t CreateJTAGShiftTDODataBurst ( uint32_t * burst, uint16_t numBits, bool_t dataBlockComplete); +void FillPDBCommand(uint8_t command, uint8_t boardAddr, PRLEDRegisterType reg, uint8_t value, uint32_t * pData); + PRResult PRHardwareOpen(); void PRHardwareClose(); int PRHardwareRead(uint8_t *buffer, int maxBytes); diff --git a/src/pinproc.cpp b/src/pinproc.cpp index 55910f6..e6f65ba 100644 --- a/src/pinproc.cpp +++ b/src/pinproc.cpp @@ -567,3 +567,38 @@ PRResult PRJTAGGetStatus(PRHandle handle, PRJTAGStatus * status) { return handleAsDevice->PRJTAGGetStatus(status); } + +PRResult PRLEDColor(PRHandle handle, PRLED * pLED, uint8_t color) +{ + return handleAsDevice->PRLEDColor(pLED, color); +} + +PRResult PRLEDFade(PRHandle handle, PRLED * pLED, uint8_t fadeColor, uint16_t fadeRate) +{ + return handleAsDevice->PRLEDFade(pLED, fadeColor, fadeRate); +} + +PRResult PRLEDFadeColor(PRHandle handle, PRLED * pLED, uint8_t fadeColor) +{ + return handleAsDevice->PRLEDFadeColor(pLED, fadeColor); +} + +PRResult PRLEDFadeRate(PRHandle handle, uint8_t boardAddr, uint16_t fadeRate) +{ + return handleAsDevice->PRLEDFadeRate(boardAddr, fadeRate); +} + +PRResult PRLEDRGBColor(PRHandle handle, PRLEDRGB * pLED, uint32_t color) +{ + return handleAsDevice->PRLEDRGBColor(pLED, color); +} + +PRResult PRLEDRGBFade(PRHandle handle, PRLEDRGB * pLED, uint32_t fadeColor, uint16_t fadeRate) +{ + return handleAsDevice->PRLEDRGBFade(pLED, fadeColor, fadeRate); +} + +PRResult PRLEDRGBFadeColor(PRHandle handle, PRLEDRGB * pLED, uint32_t fadeColor) +{ + return handleAsDevice->PRLEDRGBFadeColor(pLED, fadeColor); +}