From: Thomas Dettbarn Subject: Re: New port cad/openfpgaloader To: ports@openbsd.org Date: Thu, 11 Jun 2026 08:48:12 +0200 Hello! You can find the second attempt of my port attached to this email. I have applied the changes, suggested by Stu (Thank you, btw). In this particular port, I have moved the ill-placed troubleshooting guide from the pkg/DESCR into a new pkg/README file. It still includes a section about patching the kernel, since this is the method which is the most precise. Again: The problem it solves is HIGHLY individual, but anybody who will run into it, will be grateful that there is such a relatively easy workaround. In addition to that: Using ldd(1), I noticed that the resulting binaries had some implicit library dependencies. They are now explicitly stated inside the Makefile. Please have another look, hopefully, this time around, it meets your standards a little bit better. Thomas On 6/9/26 08:00, Thomas Dettbarn wrote: > Hello Stu! > > > Thank you so so much for your feedback! I will update my > ports later. > > > Thomas > > On 6/9/26 01:14, Stuart Henderson wrote: >> On 2026/06/09 00:54, Thomas Dettbarn wrote: >>> + >>> +*** WARNING *** You might need to recompile the kernel. >>> +Some devices have problems when they are accessed through uftdi(4). >>> One >>> +of the ways to disable them for this module is by commenting out their >>> +USB IDs in /usr/src/sys/dev/usb/uftdi.c. Like so: >>> + >> configuring the kernel via the bsd.re-config(5) mechanism would >> usually be the most convenient way to do this and I think I would >> avoid suggesting other methods. basically you would want to add >> the disable line to /etc/bsd.re-config, run /usr/libexec/reorder_kernel, >> and reboot. >> >> > Nice! > I did not know about this method. I will try it, if it works, then I > will update the README. > > UNFORTUNATELY, with my setup, I encountered a problem where > I need this module, albeit not for loading the FPGA board itself: A > second USB device I had (Which I used for UART communication > with my design) did not work with ugen(4). > > So removing uftdi(4) completely was too much, I needed to be > more precise. Hence my suggestion with the kernel patch. > > > diff --git a/cad/openfpgaloader/Makefile b/cad/openfpgaloader/Makefile new file mode 100644 index 00000000000..fbb65f85aeb --- /dev/null +++ b/cad/openfpgaloader/Makefile @@ -0,0 +1,26 @@ +COMMENT= universal utility for programming FPGAs +CATEGORIES= cad +V= 1.1.1pl20260604 +DISTNAME= openfpgaloader-${V} + +GH_ACCOUNT= trabucayre +GH_PROJECT= openFPGALoader +GH_COMMIT= bf8106ef5f6e92017c5901737db3c3c9593e8b4d + +HOMEPAGE= https://github.com/trabucayre/openFPGALoader +MAINTAINER= Thomas Dettbarn + +# APACHE-2.0 +PERMIT_PACKAGE= yes + +WANTLIB= c c++ c++abi m pthread z +MODULES= devel/cmake + +NO_TEST= Yes + +LIB_DEPENDS= devel/libftdi1 +LIB_DEPENDS+= devel/libusb1 + + +.include + diff --git a/cad/openfpgaloader/distinfo b/cad/openfpgaloader/distinfo new file mode 100644 index 00000000000..f7b4fe5df52 --- /dev/null +++ b/cad/openfpgaloader/distinfo @@ -0,0 +1,2 @@ +SHA256 (openfpgaloader-1.1.1pl20260604-bf8106ef.tar.gz) = wBNVSeoPICa1PcMDLwmw1CUJUq+u+IQ+NwoIFMOpGlc= +SIZE (openfpgaloader-1.1.1pl20260604-bf8106ef.tar.gz) = 2931988 diff --git a/cad/openfpgaloader/pkg/DESCR b/cad/openfpgaloader/pkg/DESCR new file mode 100644 index 00000000000..e738c352fbe --- /dev/null +++ b/cad/openfpgaloader/pkg/DESCR @@ -0,0 +1,6 @@ +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, macOS and OpenBSD. + + diff --git a/cad/openfpgaloader/pkg/PLIST b/cad/openfpgaloader/pkg/PLIST new file mode 100644 index 00000000000..82f98ecfdef --- /dev/null +++ b/cad/openfpgaloader/pkg/PLIST @@ -0,0 +1,115 @@ +@bin bin/openFPGALoader +share/doc/pkg-readmes/${PKGSTEM} +share/openFPGALoader/ +share/openFPGALoader/bpiOverJtag_xc7k480tffg1156.bit.gz +share/openFPGALoader/spiOverJtag_10cl006144.rbf.gz +share/openFPGALoader/spiOverJtag_10cl016484.rbf.gz +share/openFPGALoader/spiOverJtag_10cl025256.rbf.gz +share/openFPGALoader/spiOverJtag_10cl055484.rbf.gz +share/openFPGALoader/spiOverJtag_5ce215.rbf.gz +share/openFPGALoader/spiOverJtag_5ce223.rbf.gz +share/openFPGALoader/spiOverJtag_5ce423.rbf.gz +share/openFPGALoader/spiOverJtag_5ce523.rbf.gz +share/openFPGALoader/spiOverJtag_5ce927.rbf.gz +share/openFPGALoader/spiOverJtag_5sgsd5.rbf.gz +share/openFPGALoader/spiOverJtag_efinix_t120f324.bit.gz +share/openFPGALoader/spiOverJtag_efinix_t13f256.bit.gz +share/openFPGALoader/spiOverJtag_efinix_t8f81.bit.gz +share/openFPGALoader/spiOverJtag_efinix_ti180j484.bit.gz +share/openFPGALoader/spiOverJtag_efinix_ti60f225.bit.gz +share/openFPGALoader/spiOverJtag_ep4ce1017.rbf.gz +share/openFPGALoader/spiOverJtag_ep4ce11523.rbf.gz +share/openFPGALoader/spiOverJtag_ep4ce1523.rbf.gz +share/openFPGALoader/spiOverJtag_ep4ce2217.rbf.gz +share/openFPGALoader/spiOverJtag_ep4ce622.rbf.gz +share/openFPGALoader/spiOverJtag_xc3s500evq100.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx100fgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx150tcsg484.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx150tfgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx16csg324.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx16ftg256.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx25csg324.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx25tcsg324.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx45csg324.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx45tfgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx9csg324.bit.gz +share/openFPGALoader/spiOverJtag_xc6slx9tqg144.bit.gz +share/openFPGALoader/spiOverJtag_xc6vlx130tff784.bit.gz +share/openFPGALoader/spiOverJtag_xc7a100t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a100tcsg324.bit.gz +share/openFPGALoader/spiOverJtag_xc7a100tfgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7a100tfgg676.bit.gz +share/openFPGALoader/spiOverJtag_xc7a100tftg256.bit.gz +share/openFPGALoader/spiOverJtag_xc7a12t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a12tcpg238.bit.gz +share/openFPGALoader/spiOverJtag_xc7a12tcsg325.bit.gz +share/openFPGALoader/spiOverJtag_xc7a15t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a15tcpg236.bit.gz +share/openFPGALoader/spiOverJtag_xc7a15tcsg324.bit.gz +share/openFPGALoader/spiOverJtag_xc7a15tcsg325.bit.gz +share/openFPGALoader/spiOverJtag_xc7a15tfgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7a15tftg256.bit.gz +share/openFPGALoader/spiOverJtag_xc7a200t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a200tfbg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7a200tfbg676.bit.gz +share/openFPGALoader/spiOverJtag_xc7a200tffg1156.bit.gz +share/openFPGALoader/spiOverJtag_xc7a200tsbg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7a25t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a25tcpg238.bit.gz +share/openFPGALoader/spiOverJtag_xc7a25tcsg325.bit.gz +share/openFPGALoader/spiOverJtag_xc7a35t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a35tcpg236.bit.gz +share/openFPGALoader/spiOverJtag_xc7a35tcsg324.bit.gz +share/openFPGALoader/spiOverJtag_xc7a35tcsg325.bit.gz +share/openFPGALoader/spiOverJtag_xc7a35tfgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7a35tftg256.bit.gz +share/openFPGALoader/spiOverJtag_xc7a50t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a50tcpg236.bit.gz +share/openFPGALoader/spiOverJtag_xc7a50tcsg324.bit.gz +share/openFPGALoader/spiOverJtag_xc7a50tcsg325.bit.gz +share/openFPGALoader/spiOverJtag_xc7a50tcsg325_1v35.bit.gz +share/openFPGALoader/spiOverJtag_xc7a50tfgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7a50tftg256.bit.gz +share/openFPGALoader/spiOverJtag_xc7a75t.bit.gz +share/openFPGALoader/spiOverJtag_xc7a75tcsg324.bit.gz +share/openFPGALoader/spiOverJtag_xc7a75tfgg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7a75tfgg676.bit.gz +share/openFPGALoader/spiOverJtag_xc7a75tftg256.bit.gz +share/openFPGALoader/spiOverJtag_xc7k160tffg676.bit.gz +share/openFPGALoader/spiOverJtag_xc7k325tfbg900.bit.gz +share/openFPGALoader/spiOverJtag_xc7k325tffg676.bit.gz +share/openFPGALoader/spiOverJtag_xc7k325tffg900.bit.gz +share/openFPGALoader/spiOverJtag_xc7k420tffg901.bit.gz +share/openFPGALoader/spiOverJtag_xc7k70tfbg484.bit.gz +share/openFPGALoader/spiOverJtag_xc7k70tfbg676.bit.gz +share/openFPGALoader/spiOverJtag_xc7s100.bit.gz +share/openFPGALoader/spiOverJtag_xc7s100fgga484.bit.gz +share/openFPGALoader/spiOverJtag_xc7s100fgga676.bit.gz +share/openFPGALoader/spiOverJtag_xc7s15.bit.gz +share/openFPGALoader/spiOverJtag_xc7s15cpga196.bit.gz +share/openFPGALoader/spiOverJtag_xc7s15csga225.bit.gz +share/openFPGALoader/spiOverJtag_xc7s15ftgb196.bit.gz +share/openFPGALoader/spiOverJtag_xc7s25.bit.gz +share/openFPGALoader/spiOverJtag_xc7s25csga225.bit.gz +share/openFPGALoader/spiOverJtag_xc7s25csga324.bit.gz +share/openFPGALoader/spiOverJtag_xc7s25ftgb196.bit.gz +share/openFPGALoader/spiOverJtag_xc7s50.bit.gz +share/openFPGALoader/spiOverJtag_xc7s50csga324.bit.gz +share/openFPGALoader/spiOverJtag_xc7s50fgga484.bit.gz +share/openFPGALoader/spiOverJtag_xc7s50ftgb196.bit.gz +share/openFPGALoader/spiOverJtag_xc7s6.bit.gz +share/openFPGALoader/spiOverJtag_xc7s6cpga196.bit.gz +share/openFPGALoader/spiOverJtag_xc7s6csga225.bit.gz +share/openFPGALoader/spiOverJtag_xc7s6ftgb196.bit.gz +share/openFPGALoader/spiOverJtag_xc7s75.bit.gz +share/openFPGALoader/spiOverJtag_xc7s75fgga484.bit.gz +share/openFPGALoader/spiOverJtag_xc7s75fgga676.bit.gz +share/openFPGALoader/spiOverJtag_xc7vx330tffg1157.bit.gz +share/openFPGALoader/spiOverJtag_xcau10p-ffvb676.bit.gz +share/openFPGALoader/spiOverJtag_xcau15p-ffvb676.bit.gz +share/openFPGALoader/spiOverJtag_xcku040-ffva1156.bit.gz +share/openFPGALoader/spiOverJtag_xcku060-ffva1156.bit.gz +share/openFPGALoader/spiOverJtag_xcku3p-ffva676.bit.gz +share/openFPGALoader/spiOverJtag_xcku5p-ffvb676.bit.gz +share/openFPGALoader/spiOverJtag_xcvu37p-fsvh2892.bit.gz +share/openFPGALoader/spiOverJtag_xcvu9p-flga2104.bit.gz diff --git a/cad/openfpgaloader/pkg/README b/cad/openfpgaloader/pkg/README new file mode 100644 index 00000000000..188ef10aec4 --- /dev/null +++ b/cad/openfpgaloader/pkg/README @@ -0,0 +1,70 @@ ++------------------------------------------------------------------------------- +| Running ${PKGSTEM} on OpenBSD ++------------------------------------------------------------------------------- + +Note about uftdi(4) +=================== + +Up until OpenBSD 7.9, using some FPGA devices with openFPGALoader is sligthly +problematic, resulting in error messages like this: + + fail to read data usb bulk read failed + JTAG init failed with: low level FTDI init failed + +This happens because of the FPGA devices being incorrectly attached to the +uftdi(4) module inside the kernel. There are two ways of preventing this: + + 1. By deactivating uftdi(4) completely + 2. By patching uftdi(4), so that it does not recognize the USB device. + +In both cases, the ugen(4) module will be attached as a fallback. + +Deactivating uftdi(4) with bsd.re-config(5) +------------------------------------------- +The following commands + + echo "disable uftdi" >>/etc/bsd.re-config + /usr/libexec/reorder_kernel + reboot + +are disabling the utfi(4) module and relinking the kernel. After the reboot, +the device can be used. + + + +Deactivating uftdi(4) with config +--------------------------------- +The following commands + + config -e -f -o /bsd.nouftdi /bsd + ukc> disable uftdi* + ukc> quit + reboot + +Are disabling the module inside the kernel binary. + + +Patching the kernel +------------------- +The most precise method is to patch the uftdi(4) module inside the kernel. +The list of devices uftdi(4) attaches itself to is the array uftdi_devs[] in +the file /usr/src/sys/dev/usb/uftdi.c. + +One single device can be deactived by commenting out the corresponding line: + + { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SEMC_DSS20 }, + //{ USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_2232C }, + { USB_VENDOR_FTDI, USB_PRODUCT_FTDI_SERIAL_2232L }, + +To find said line, the output of lsusb + + Bus 001 Device 006: ID 0403:6010 Future Technology Devices International + +can be mapped to the constant defines in /usr/src/sys/dev/usb/usbdevs.h +Afterwards, the kernel can be rebuild, as described in the OpenBSD FAQ5: + + https://www.openbsd.org/faq/faq5.html#Options + +This method is recommend for FPGA projects where an additional USB to UART +adapter is involved. +