From: Thomas Dettbarn Subject: New port 3/4: cad/openfpgaloader-1.1.1pl20260604 To: ports@openbsd.org Date: Sat, 13 Jun 2026 23:07:53 +0200 Please find new port cad/nextpnr attached to this email. (In the form of a git diff). Please disregard the attachments to my previous emails, this is the one I would like to release to the ports tree of OpenBSD. Thus far, the only thing I can say with confidence is that ItWorksOnMyMachine(tm). In response to Stuarts comments, which you can find in this email:  https://marc.info/?l=openbsd-ports&m=178096049470406&w=2 There is a chance that people have gotten a board, which will cause problems with the uftdi(4) module. Sadly, patching the kernel is the most precise method of dealing with it, so I have decided to devote the package README to it. You can find my reasoning for it inside said file. In total, I plan on sending four ports over this email list: cad/prjpeppercorn-1.13 cad/nextpnr-0.10pl20260613 cad/openfpgaloader-1.1.1pl20260604 cad/yosys-takeover-0.66pl20260612 ... this one needs a better name. (See its accompanying email for details). In lieu of a proper method of checking, I have set up a website with a simple helloworld style example: https://dettus.net/fpga_stuff/1.html. Even if you do not have a physical FPGA board at home, the instructions might give you an idea about how the tools are supposed to work together. So, please have another review. Thank you so so much! 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. +