For linux, the process is covered nicely in this mozilla sensorweb wiki page, although the explanations here might help to clarify some things. On Mac OS X, there are a few extra steps or changes, especially if you want to install libftdi using homebrew.
When built with the confuse library installed, libftdi also builds a utility called ftdi_eeprom, which can be used to read, flash and erase FT2xx IC’s configuration and EEPROM, much like the FT_PROG GUI utility can on Windows. I tried running FT_PROG in Wine with no success, and so tried installing libftdi. The current homebrew recipe for libftdi installs the library itself, but only one of the example programs and not the FTDI EEPROM utility.
To correct this, first run
brew edit libftdi
then edit the recipe to look something like this:
class Libftdi < Formula desc "Library to talk to FTDI chips" homepage "https://www.intra2net.com/en/developer/libftdi" url "https://www.intra2net.com/en/developer/libftdi/download/libftdi1-1.4.tar.bz2" sha256 "ec36fb49080f834690c24008328a5ef42d3cf584ef4060f3a35aa4681cb31b74" bottle do cellar :any rebuild 1 sha256 "7cc50de6d35d5c7dd6d73a9ff075696dfe82ce57db9464c37b0a35dc0cf8707f" => :mojave sha256 "a28c4f481c8174edfb845492c4155511cac868082fd65cce625b55a82f3b54c0" => :high_sierra sha256 "ef603f79c7791bac035bf1afe21dcea4b6323372140a246f9aa52031b3631f6b" => :sierra sha256 "c023c826c533fd60e664a8f604f54017f84b356e625bbbafb8e5365e4319fa7a" => :el_capitan sha256 "7fc5addb888f58fbbd2a2e2e414ead4819a48b7fff4f6b0ebed274b499a38a40" => :yosemite end depends_on "cmake" => :build depends_on "pkg-config" => :build depends_on "swig" => :build depends_on "libusb" depends_on "boost" => :optional depends_on "confuse" => :build def install mkdir "libftdi-build" do system "cmake", "..", "-DPYTHON_BINDINGS=OFF", *std_cmake_args system "make", "install" (libexec/"bin").install "examples/bitbang", "examples/bitbang_ft2232", "examples/find_all", "examples/simple", "examples/bitbang2", "examples/find_all_pp", "examples/stream_test", "examples/baud_test", "examples/bitbang_cbus", "examples/eeprom", "examples/serial_test", "ftdi_eeprom/ftdi_eeprom" bin.install_symlink libexec/"bin/ftdi_eeprom" end end test do system libexec/"bin/find_all" end end
The important changes are making
depends_on "confuse" no longer be optional, changing the
(libexec/"bin").install line to install the ftdi_eeprom binary and all of the examples (why not, they’re useful), and most importantly, creating a symlink to the ftdi_eeprom binary so that we can run it from anywhere without having to reference the whole path to the libftdi install location.
Having made these changes, install libftdi:
brew install libftdi --build-from-source
You should now be able to run
and see some nice usage text like this
FTDI eeprom generator v0.1 (c) Intra2net AG and the libftdi developers
Syntax: ftdi_eeprom [...options...] Valid Options: … …
Now you’ve successfully installed libftdi and the eeprom utility, you are able to read and program FTDI FT2xx series ICs plugged in to your computer over USB.
Firstly, you need to disable whatever FTDI kernel extension (“driver”) you have installed. You will probably have one or both of the FTDI drivers available installed, and may have to try unloading both of them:
sudo kextunload -b com.apple.driver.AppleUSBFTDI sudo kextunload -b com.FTDI.driver.FTDIUSBSerialDriver
Make a note of which one successfully unloaded so you can restore the same one once you’ve finished.
The behaviour of the
ftdi_eeprom utility is configured mainly from a .conf file, the path to which is provided as the first argument. I couldn’t find any documentation for these configuration files so based mine off this one referenced from the sensorweb repo mentioned above.
The same conf file is used for reading and writing to the FT2xx chip. Here’s my template, with comments explaining how it works (or at least how I think it seems to work…)
# The Vendor ID and Product ID seem to identify a particular chipset # to target. I used the libftdi utilities and OS X USB Prober app to # poke around and figure out what numbers to use. vendor_id=0x403 product_id=0x6001 # The rest of the fields are settings which can be written to the # FT2xx with the --flash-eeprom option. # Max. power consumption: value * 2 mA. Use 0 if self_powered = true. max_power=500 ########### # Strings # ########### manufacturer="YOUR MANUFACTURER ID HERE" product="YOUR PRODUCT NAME HERE" serial="YOUR SERIAL NUMBER HERE" ########### # Options # ########### self_powered=false # Turn this off for bus powered remote_wakeup=false # Turn this on for remote wakeup feature use_serial=true # Use the serial number string # Normally out don't have to change one of these flags in_is_isochronous=false # In Endpoint is Isochronous out_is_isochronous=false # Out Endpoint is Isochronous suspend_pull_downs=false # Enable suspend pull downs for lower power change_usb_version=false # Change USB Version usb_version=0x0200 # Only used when change_usb_version is enabled cha_vcp=false cha_type=FIFO chb_type=UART eeprom_type=0x46 ######## # Misc # ######## # This is the relative filename that EEPROM contents will either be # read from or written to, depending on whether ftdi_eeprom is run # with the --read-eeprom or --flash-eeprom option. filename="eeprom.bin"
As mentioned in the comments, first adjust the vendor_id and product_id to match the FT2xx you’re using, then try running
ftdi_eeprom --read-eeprom path/to/your/config_file.conf
You should now find an eeprom.bin file containing the bytes which were stored in the FT chip’s EEPROM. You can now edit that file, as well as changing the settings in the conf file, before running
ftdi_eeprom --flash-eeprom path/to/your/config_file.conf
to write your settings to the chip.
For my use case, writing a custom EEPROM file to the chip was not necessary, so I just left out the
filename="eeprom.bin" line, and everything worked fine.
Remember to reload your FTDI kernel extension after making the changes! Probably either
sudo kextload -b com.apple.driver.AppleUSBFTDI
sudo kextload -b com.FTDI.driver.FTDIUSBSerialDriver