XPCU cable driver troubleshooting¶
Practical fixes for Xilinx Platform Cable USB / USB II use with the
deployment packages from the
xsession/xilinx-usb-driver
submodule, especially the Windows WinUSB package.
Note The canonical source of truth lives in the submodule (
externals/xilinx-usb-driver/TROUBLESHOOTING.md). This copy is kept with the other XPCU field notes so the documentation site is self-contained.
First check¶
Use the exact openFPGALoader executable you just built or installed. An older
copy found through PATH may not include the XPCU fixes.
$ofl = 'C:\path\to\openFPGALoader.exe'
& $ofl --scan-usb
& $ofl -c xilinxPlatformCableUsb_alt --detect -v
The cable normally appears as one of these identities:
| USB ID | State | Probe name |
|---|---|---|
03fd:0013 |
Bootloader variant | xilinxPlatformCableUsb |
03fd:000d |
Embedded bootloader | xilinxPlatformCableUsb_alt |
03fd:0008 |
Firmware initialized | xilinxPlatformCableUsb_initialized |
Firmware is held in RAM. Returning to 000d or 0013 after all power is
removed is normal.
Windows: cable is absent from --scan-usb¶
- Open PowerShell as Administrator in the extracted Windows driver package.
- Run
./install.ps1, unplug/reconnect the cable, then run./detect.ps1. - Check Device Manager under Universal Serial Bus devices.
- If firmware loading changes the PID to
0008, reruninstall.ps1while that0008device is present. A staged package does not always replace an existing libusbK/vendor binding until the matching live device is updated.
The package intentionally replaces the AMD/Xilinx driver with WinUSB for these IDs. Reinstall the Vivado cable driver later if Xilinx vendor tools require it.
Cable stays at the bootloader identity¶
The driver alone does not permanently initialize the cable. For embedded
boot PID 03fd:000d, openFPGALoader first uploads xusb_emb.hex version
0404. When xusb_xlp.hex version 0517 is installed, current builds then
load it as a second-stage upgrade and enable accelerated transfers
automatically.
Make the firmware available with one of these methods:
$env:OPENFPGALOADER_XUSB_FIRMWARE = 'C:\path\to\xusb_emb.hex'
& $ofl -c xilinxPlatformCableUsb_alt --detect -v
Alternatively use --probe-firmware or install both files in the normal
openFPGALoader data directory.
Expected progress is firmware upload followed by a USB reload and PID
0008.
Device Manager reports Code 10¶
Remove power completely from the cable and target, wait a few seconds, and reconnect. Then verify the driver again. A normal unplug may not reset every state involved after a failed USB control request.
Firmware reload fails after adding a newer HEX file¶
Do not replace xusb_emb.hex with xusb_xlp.hex. XLP 0517 is a
second-stage upgrade and is not a standalone boot image for PID 03fd:000d.
The required pair is EMB 0404 as xusb_emb.hex and XLP 0517 as
xusb_xlp.hex.
Accelerated transfer times out or produces random IDCODEs¶
On EMB firmware 0404, accelerated XPCU command 0xA6 stalls endpoint
zero. Any IDCODE read after that timeout can be meaningless. Current builds
keep 0404 on the control-transfer fallback, but automatically use the
accelerated engine when XLP firmware 0517 is running.
Force the safe mode before opening the cable if needed:
$env:OPENFPGALOADER_XPCU_CONTROL_BITBANG = '1'
& $ofl -c xilinxPlatformCableUsb_alt --detect -v --freq 750000
Testing the initialized PID with libusbK instead of WinUSB produced the same
0404 timeout, so changing the Windows backend alone does not make that
firmware accelerated. Bypassing USB alternate-setting selection also
produced the same result.
The reliable control fallback is much slower than the frequency message suggests: it uses two synchronous USB control writes per JTAG bit and additional reads for captured TDO. Large Spartan-6 uploads can consequently take close to an hour.
Do not change the XLP 0517 A6 request from its tested zero-based value
N-1 to N. The latter makes common 32-bit scans a multiple-of-four XPCU
CPLD failure case, stalls bulk IN, and requires a full power cycle.
Do not substitute xusb_xp2.hex for an embedded-loader (03fd:000d)
cable. On the tested unit it reported invalid versions and no connection.
With the proper 0404/0517 pair, the tested 1.48 MB Spartan-6 bitstream
programmed through WinUSB at 6 MHz in 4.124 seconds.
Firmware and cable status work, but detection says found 0 devices¶
If the log shows all of the following, the host USB driver is operating:
XPCU bulk endpoints: OUT=0x02 IN=0x86
FX2 version: 0404
CPLD version: 1200
status 43 connected: yes
Current builds use XPCU status bit 0 and compensate for firmware 0404
returning control-mode TDO one bit late. Older builds could report no
devices, an IDCODE shifted right by one, or a correctly framed but invalid
Xilinx word, even though the official driver detected the target. Rebuild
openFPGALoader before treating this as a hardware fault.
With the corrected build, a single-device chain can emit a warning such as:
ignoring XPCU trailing scan word 0x0a001093
This is the unreliable end-of-chain marker from the slow fallback. It is ignored only after a valid device has already been decoded.
If a current build still reports found 0 devices, check:
- target-board power and common ground;
- ribbon orientation and header pinout;
- JTAG-enable/boot-mode jumpers;
- another programmer or circuit driving the same signals;
- cable/adapter continuity;
- a slower clock, such as
--freq 100000.
connected: yes indicates sensed target voltage; it does not prove that a
TAP is shifting valid TDO data.
Interface claim fails on a second run¶
Close other programming applications and retry. Current openFPGALoader cleanup closes the USB handle even if the device disconnected during interface release. If an older binary still holds the interface, terminate it or power-cycle the cable, then test using the newly built executable's full path.
Diagnostic environment variables¶
| Variable | Effect |
|---|---|
OPENFPGALOADER_XUSB_FIRMWARE |
Explicit firmware HEX path |
OPENFPGALOADER_XPCU_CONTROL_BITBANG=1 |
Force safe control-transfer mode |
OPENFPGALOADER_XUSB_XLP_FIRMWARE |
Explicit XLP second-stage HEX path |
OPENFPGALOADER_XPCU_XLP_UPGRADE=1 |
Force the XLP second-stage reload |
OPENFPGALOADER_XPCU_SKIP_XLP_UPGRADE=1 |
Disable automatic cold-boot XLP reload |
OPENFPGALOADER_FX2_VERBOSE_USB_ERRORS=1 |
Enable detailed libusb errors |
OPENFPGALOADER_XPCU_TDO_MASK |
Developer-only TDO mask diagnostic (0x01 or 0x02) |
For the full measurements, code changes, and test matrix, see the Windows debug report.