From c1c6e438a5ebce9eee9e958f550877a99846731c Mon Sep 17 00:00:00 2001 From: germaneguise <251696208+germaneguise@users.noreply.github.com> Date: Sat, 27 Dec 2025 16:12:31 +0900 Subject: [PATCH] dirtyjtag: Allow custom VID/PID via command line options Pass cable.vid and cable.pid to DirtyJtag constructor instead of using hardcoded DIRTYJTAG_VID/PID. This allows users to use DirtyJTAG-compatible firmware with custom USB VID/PID using the --vid and --pid flags: openFPGALoader -c dirtyJtag --vid 0x1337 --pid 0x0001 bitstream.fs This is useful for custom DirtyJTAG implementations, embedded microcontrollers with built-in JTAG adapters, or devices that use MS OS 2.0 descriptors for automatic WinUSB driver loading with different VID/PID. The default VID/PID (0x1209:0xC0CA) is preserved for backward compatibility. --- src/dirtyJtag.cpp | 5 ++--- src/dirtyJtag.hpp | 2 +- src/jtag.cpp | 2 +- src/xvc_server.cpp | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/dirtyJtag.cpp b/src/dirtyJtag.cpp index b671333..bdef162 100644 --- a/src/dirtyJtag.cpp +++ b/src/dirtyJtag.cpp @@ -62,7 +62,7 @@ enum dirtyJtagSig { SIG_SRST = (1 << 6) }; -DirtyJtag::DirtyJtag(uint32_t clkHZ, int8_t verbose): +DirtyJtag::DirtyJtag(uint32_t clkHZ, int8_t verbose, uint16_t vid, uint16_t pid): _verbose(verbose), dev_handle(NULL), usb_ctx(NULL), _tdi(0), _tms(0) { @@ -73,8 +73,7 @@ DirtyJtag::DirtyJtag(uint32_t clkHZ, int8_t verbose): throw std::exception(); } - dev_handle = libusb_open_device_with_vid_pid(usb_ctx, - DIRTYJTAG_VID, DIRTYJTAG_PID); + dev_handle = libusb_open_device_with_vid_pid(usb_ctx, vid, pid); if (!dev_handle) { cerr << "fails to open device" << endl; libusb_exit(usb_ctx); diff --git a/src/dirtyJtag.hpp b/src/dirtyJtag.hpp index 53a273f..b37e4d5 100644 --- a/src/dirtyJtag.hpp +++ b/src/dirtyJtag.hpp @@ -19,7 +19,7 @@ class DirtyJtag : public JtagInterface { public: - DirtyJtag(uint32_t clkHZ, int8_t verbose); + DirtyJtag(uint32_t clkHZ, int8_t verbose, uint16_t vid = 0x1209, uint16_t pid = 0xC0CA); virtual ~DirtyJtag(); int setClkFreq(uint32_t clkHZ) override; diff --git a/src/jtag.cpp b/src/jtag.cpp index 3fd9785..a2a45d9 100644 --- a/src/jtag.cpp +++ b/src/jtag.cpp @@ -139,7 +139,7 @@ Jtag::Jtag(const cable_t &cable, const jtag_pins_conf_t *pin_conf, break; case MODE_DIRTYJTAG: #ifdef ENABLE_DIRTYJTAG - _jtag = new DirtyJtag(clkHZ, verbose); + _jtag = new DirtyJtag(clkHZ, verbose, cable.vid, cable.pid); #else std::cerr << "Jtag: support for dirtyJtag cable was not enabled at compile time" << std::endl; throw std::exception(); diff --git a/src/xvc_server.cpp b/src/xvc_server.cpp index 4e51e68..58811af 100644 --- a/src/xvc_server.cpp +++ b/src/xvc_server.cpp @@ -60,7 +60,7 @@ XVC_server::XVC_server(int port, const cable_t & cable, new CH552_jtag(cable.config, dev, serial, clkHZ, _verbose); break; case MODE_DIRTYJTAG: - _jtag = new DirtyJtag(clkHZ, _verbose); + _jtag = new DirtyJtag(clkHZ, _verbose, cable.vid, cable.pid); break; case MODE_JLINK: _jtag = new Jlink(clkHZ, _verbose);