From 354c087d78946abfb87dc3d6377b1ab2846f1e21 Mon Sep 17 00:00:00 2001
From: Thomas Dettbarn
Date: Sat, 30 May 2026 06:03:56 +0200
Subject: [PATCH] Removed a copy&paste error in the main.cpp file. Updated the
documentation on OpenBSD.
---
README.md | 2 +-
doc/guide/troubleshooting.rst | 23 ++++++++++++++++++++---
src/main.cpp | 4 ++--
3 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 0950423..2f85354 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
First steps • Install • Troubleshooting • Advanced usage
-Universal utility for programming FPGAs. Compatible with many boards, cables and FPGA from major manufacturers (Xilinx, Altera/Intel, Lattice, Gowin, Efinix, Anlogic, Cologne Chip). openFPGALoader works on Linux, Windows and macOS.
+Universal utility for programming FPGAs. Compatible with many boards, cables and FPGA from major manufacturers (Xilinx, Altera/Intel, Lattice, Gowin, Efinix, Anlogic, Cologne Chip). openFPGALoader works on Linux, Windowso, macOS and OpenBSD.
Not sure if your hardware is supported? Check the hardware compatibility lists:
diff --git a/doc/guide/troubleshooting.rst b/doc/guide/troubleshooting.rst
index fa5a33c..ad7489c 100644
--- a/doc/guide/troubleshooting.rst
+++ b/doc/guide/troubleshooting.rst
@@ -83,13 +83,28 @@ Unable to flash device on OpenBSD: `JTAG init failed with: DirtyJtag: fails to o
Certain evaluation boards may show the following error message when running openFPGAloader on OpenBSD:
.. code:: bash
+
fail to read data usb bulk read failed
JTAG init failed with: low level FTDI init failed
-This issue is most likely caused by the uftdi module, which has already locked the device.
-Disabling the module can be achieved with the following commands:
+This issue is most likely caused by the uftdi module, which has attached itself to the device, whereas openFPGALoader requires it to be accessible as a ugen device.
+
+Unfortunately, due to the security concept of OpenBSD, it is not possible to detach it without modifying the kernel and rebooting the system. However, there are two ways to resolve the issue: Either by patching and recompiling the kernel; or by deactivating the uftdi module.
+
+After COMMENTING OUT the problematic devices in `/usr/src/sys/dev/usb/uftdi.c`, the code would look like this:
+
+.. code:: c
+
+ { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SEMC_DSS20 },
+ //{ USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_2232C },
+ { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_2232L },
+
+Afterwards, the steps in `https://www.openbsd.org/faq/faq5.html ` can be used to recompile the kernel.
+
+Without recompilation, DEACTIVATING the uftdi module can be achieved using the following commands:
.. code:: bash
+
# doas config -e -f -o /bsd.nouftdi /bsd
OpenBSD 7.8 (GENERIC) #54: Sun Oct 12 12:45:58 MDT 2025
deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC
@@ -105,8 +120,10 @@ Disabling the module can be achieved with the following commands:
At the boot prompt, typing in
.. code:: bash
+
boot> boot /bsd.nouftdi
will boot the new kernel with the disabled module.
-Afterwards, openFPGALoader will access the development board as a generic USB device.
+
+Either way, openFPGALoader will then be able to access the development board as a generic USB device.
diff --git a/src/main.cpp b/src/main.cpp
index 3998aee..44de606 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -569,7 +569,7 @@ int main(int argc, char **argv)
fpga = new CologneChip(jtag, args.bit_file, args.file_type,
args.prg_type, args.board, args.cable, args.verify, args.verbose);
#else
- printError("Support for Gowin FPGAs was not enabled at compile time");
+ printError("Support for Cologne Chip FPGAs was not enabled at compile time");
delete(jtag);
return EXIT_FAILURE;
#endif
@@ -756,7 +756,7 @@ int spi_comm(struct arguments args, const cable_t &cable,
board->reset_pin, board->done_pin, DBUS6, board->oe_pin,
args.verify, args.verbose);
#else
- printError("Support for Gowin FPGAs was not enabled at compile time");
+ printError("Support for Cologne Chip FPGAs was not enabled at compile time");
return EXIT_FAILURE;
#endif
} else {