// Load custom firmware (.hex) into the FX2's RAM DLLEXPORT(FLStatus) flLoadCustomFirmware( const char *curVidPid, const char *fwFile, const char **error) { FLStatus retVal = FL_SUCCESS; struct Buffer fwBuf = {0,}; BufferStatus bStatus; FX2Status fxStatus; struct USBDevice *device = NULL; USBStatus uStatus; const char *const ext = fwFile + strlen(fwFile) - 4; const bool isHex = (strcmp(".hex", ext) == 0) || (strcmp(".ihx", ext) == 0); CHECK_STATUS( !isHex, FL_FILE_ERR, cleanup, "flLoadCustomFirmware(): Filename should have .hex or .ihx extension"); uStatus = usbOpenDevice(curVidPid, 1, 0, 0, &device, error); CHECK_STATUS(uStatus, FL_USB_ERR, cleanup, "flLoadCustomFirmware()"); bStatus = bufInitialise(&fwBuf, 8192, 0x00, error); CHECK_STATUS(bStatus, FL_ALLOC_ERR, cleanup, "flLoadCustomFirmware()"); bStatus = bufReadFromIntelHexFile(&fwBuf, NULL, fwFile, error); CHECK_STATUS(bStatus, FL_FILE_ERR, cleanup, "flLoadCustomFirmware()"); fxStatus = fx2WriteRAM(device, fwBuf.data, (uint32)fwBuf.length, error); CHECK_STATUS(fxStatus, FL_FX2_ERR, cleanup, "flLoadCustomFirmware()"); cleanup: bufDestroy(&fwBuf); if ( device ) { usbCloseDevice(device, 0); } return retVal; }
// Load the standard FPGALink firmware into the FX2 at currentVid/currentPid. DLLEXPORT(FLStatus) flLoadStandardFirmware( const char *curVidPid, const char *newVidPid, const char **error) { FLStatus flStatus, retVal = FL_SUCCESS; struct Buffer ramBuf = {0,}; BufferStatus bStatus; FX2Status fxStatus; struct USBDevice *device = NULL; USBStatus uStatus; uint16 newVid, newPid, newDid; CHECK_STATUS( !usbValidateVidPid(newVidPid), FL_USB_ERR, cleanup, "flLoadStandardFirmware(): The supplied VID:PID:DID \"%s\" is invalid; it should look like 1D50:602B or 1D50:602B:0001", newVidPid); newVid = (uint16)strtoul(newVidPid, NULL, 16); newPid = (uint16)strtoul(newVidPid+5, NULL, 16); newDid = (uint16)((strlen(newVidPid) == 14) ? strtoul(newVidPid+10, NULL, 16) : 0x0000); uStatus = usbOpenDevice(curVidPid, 1, 0, 0, &device, error); CHECK_STATUS(uStatus, FL_USB_ERR, cleanup, "flLoadStandardFirmware()"); bStatus = bufInitialise(&ramBuf, 0x4000, 0x00, error); CHECK_STATUS(bStatus, FL_ALLOC_ERR, cleanup, "flLoadStandardFirmware()"); flStatus = copyFirmwareAndRewriteIDs( &ramFirmware, newVid, newPid, newDid, &ramBuf, error); CHECK_STATUS(flStatus, flStatus, cleanup, "flLoadStandardFirmware()"); fxStatus = fx2WriteRAM(device, ramBuf.data, (uint32)ramBuf.length, error); CHECK_STATUS(fxStatus, FL_FX2_ERR, cleanup, "flLoadStandardFirmware()"); cleanup: bufDestroy(&ramBuf); if ( device ) { usbCloseDevice(device, 0); } return retVal; }
// Load the standard FPGALink firmware into the FX2 at currentVid/currentPid. DLLEXPORT(FLStatus) flLoadStandardFirmware( const char *curVidPid, const char *newVidPid, const char *jtagPort, const char **error) { FLStatus flStatus, returnCode; struct Buffer ramBuf = {0,}; BufferStatus bStatus; FX2Status fxStatus; struct USBDevice *device = NULL; int uStatus; uint16 newVid, newPid, newDid; uint8 port, tdoBit, tdiBit, tmsBit, tckBit; if ( !usbValidateVidPid(newVidPid) ) { errRender(error, "flLoadStandardFirmware(): The supplied VID:PID:DID \"%s\" is invalid; it should look like 1D50:602B or 1D50:602B:0001", newVidPid); FAIL(FL_USB_ERR); } newVid = (uint16)strtoul(newVidPid, NULL, 16); newPid = (uint16)strtoul(newVidPid+5, NULL, 16); newDid = (strlen(newVidPid) == 14) ? (uint16)strtoul(newVidPid+10, NULL, 16) : 0x0000; if ( strlen(jtagPort) != 5 ) { errRender(error, "flLoadStandardFirmware(): JTAG port specification must be <C|D><tdoBit><tdiBit><tmsBit><tckBit>"); FAIL(FL_FX2_ERR); } if ( (jtagPort[0] & 0xDF) == 'A' ) { port = 0; } else if ( (jtagPort[0] & 0xDF) == 'C' ) { port = 2; } else if ( (jtagPort[0] & 0xDF) == 'D' ) { port = 3; } else { errRender(error, "flLoadStandardFirmware(): JTAG port specification must be <A|C|D><tdoBit><tdiBit><tmsBit><tckBit>"); FAIL(FL_FX2_ERR); } if (jtagPort[1] < '0' || jtagPort[1] > '7' || jtagPort[2] < '0' || jtagPort[2] > '7' || jtagPort[3] < '0' || jtagPort[3] > '7' || jtagPort[4] < '0' || jtagPort[4] > '7' ) { errRender(error, "flLoadStandardFirmware(): JTAG port specification must be <A|C|D><tdoBit><tdiBit><tmsBit><tckBit>"); FAIL(FL_FX2_ERR); } tdoBit = jtagPort[1] - '0'; tdiBit = jtagPort[2] - '0'; tmsBit = jtagPort[3] - '0'; tckBit = jtagPort[4] - '0'; if ( port == 0 && (isInvalidPortABit(tdoBit) || isInvalidPortABit(tdiBit) || isInvalidPortABit(tmsBit) || isInvalidPortABit(tckBit)) ) { errRender(error, "flFlashStandardFirmware(): Only bits 0, 1, 3 & 7 are available for JTAG use on port A"); FAIL(FL_FX2_ERR); } uStatus = usbOpenDevice(curVidPid, 1, 0, 0, &device, error); CHECK_STATUS(uStatus, "flLoadStandardFirmware()", FL_USB_ERR); bStatus = bufInitialise(&ramBuf, 0x4000, 0x00, error); CHECK_STATUS(bStatus, "flLoadStandardFirmware()", FL_ALLOC_ERR); flStatus = copyFirmwareAndRewriteIDs( &ramFirmware, newVid, newPid, newDid, port, tdoBit, tdiBit, tmsBit, tckBit, &ramBuf, error); CHECK_STATUS(flStatus, "flLoadStandardFirmware()", flStatus); fxStatus = fx2WriteRAM(device, ramBuf.data, ramBuf.length, error); CHECK_STATUS(fxStatus, "flLoadStandardFirmware()", FL_FX2_ERR); returnCode = FL_SUCCESS; cleanup: bufDestroy(&ramBuf); if ( device ) { usbCloseDevice(device, 0); } return returnCode; }