How to use FTDI D2XX library on OSX?

I'm trying to talk to a USB device connected to an EasySync USB2-H-5004-M USB adapter to RS485 at a speed of 370,000 bits, but on OSX.

I have C ++ code running on Windows and I just managed to compile it on OSX (using DylX dylib instead of dll), but I have a communication problem somewhere and I'm not sure where to start and how to solve this problem.

I am using openFrameworks / C ++, and the method for displaying devices is as follows:

int FTDI::enumerateDevices(){ DWORD numDevs; FT_STATUS ftStatus = FT_CreateDeviceInfoList(&numDevs); numPortsFound = 0; if (ftStatus == FT_OK) { ofLog(OF_LOG_NOTICE, "Number of FTDI devices is %d",numDevs); devicesList = (FT_DEVICE_LIST_INFO_NODE*)malloc(sizeof(FT_DEVICE_LIST_INFO_NODE)*numDevs); ftStatus = FT_GetDeviceInfoList(devicesList, &numDevs); if (ftStatus == FT_OK) { printf("\n"); for (int i = 0; i < numDevs; i++) { ofLog(OF_LOG_VERBOSE, "Dev %d:",i); ofLog(OF_LOG_VERBOSE, " Flags=0x%x",devicesList[i].Flags); ofLog(OF_LOG_VERBOSE, " Type=0x%x",devicesList[i].Type); ofLog(OF_LOG_VERBOSE, " ID=0x%x",devicesList[i].ID); ofLog(OF_LOG_VERBOSE, " LocId=0x%x",devicesList[i].LocId); ofLog(OF_LOG_VERBOSE, " SerialNumber=%s",devicesList[i].SerialNumber); ofLog(OF_LOG_VERBOSE, " Description=%s",devicesList[i].Description); ofLog(OF_LOG_VERBOSE, " ftHandle=0x%x\n",devicesList[i].ftHandle); } numPortsFound = numDevs; } else { ofLog(OF_LOG_ERROR, "FTD2XX::FT_GetDeviceInfoList() failed"); } } else { ofLog(OF_LOG_ERROR, "FTD2XX::FT_CreateDeviceInfoList() failed"); } return numPortsFound; } 

Problem in OSX I get this output:

 [notice ] Number of FTDI devices is 4 [verbose] Dev 0: [verbose] Flags=0x1 [verbose] Type=0x3 [verbose] ID=0x0 [verbose] LocId=0x0 [verbose] SerialNumber= [verbose] Description= [verbose] ftHandle=0x0 [verbose] Dev 1: [verbose] Flags=0x1 [verbose] Type=0x3 [verbose] ID=0x0 [verbose] LocId=0x0 [verbose] SerialNumber= [verbose] Description= [verbose] ftHandle=0x0 [verbose] Dev 2: [verbose] Flags=0x1 [verbose] Type=0x3 [verbose] ID=0x0 [verbose] LocId=0x0 [verbose] SerialNumber= [verbose] Description= [verbose] ftHandle=0x0 [verbose] Dev 3: [verbose] Flags=0x1 [verbose] Type=0x3 [verbose] ID=0x0 [verbose] LocId=0x0 [verbose] SerialNumber= [verbose] Description= [verbose] ftHandle=0x0 [ error ] failed to register FTDI device with serial FTWVZVEBA in internal register [ error ] error opening port with serial: FTWVZVEBA 

which looks wrong. For example, on Windows, on port A / channel 1 / device index 0, I see the following:

 [verbose] Dev 0: [verbose] Flags=0x2 [verbose] Type=0x7 [verbose] ID=0x4036011 [verbose] LocId=0x02111 [verbose] SerialNumber=FTWVZVEBA [verbose] Description=USB2-H-5004-MA [verbose] ftHandle=0x0 

A quick look at / dev things looks fine:

 ls /dev/tty.* /dev/tty.Bluetooth-Incoming-Port /dev/tty.usbserial-FTWVZVEBB /dev/tty.Bluetooth-Modem /dev/tty.usbserial-FTWVZVEBC /dev/tty.usbmodemfa131 /dev/tty.usbserial-FTWVZVEBD 

and through System Information I get:

 USB2-H-5004-M: Product ID: 0x6011 Vendor ID: 0x0403 (Future Technology Devices International Limited) Version: 8.00 Serial Number: FTWVZVEB Speed: Up to 480 Mb/sec Manufacturer: FTDI Location ID: 0xfd120000 / 4 Current Available (mA): 500 Current Required (mA): 200 

I installed the D2XX driver according to the FTDI OSX Installation Guide (pdf link) instruction, but I'm not sure what I am missing / doing wrong.

How can I correctly contact the device using the FTDI D2XX library?

+1
source share
1 answer

To spell out my comment, since it seems to have answered the main question: Mac OS 10.9 (Mavericks) now comes with a kernel extension that acts as FTDI VCP drivers. It creates a virtual communication port for the FTDI USB-to-serial devices that it detects, and means that you no longer need to install the VCP driver if you need it before.

This has an unfortunate side effect, although in this it crashes any application using the FTDI D2XX library . This indicates that D2XX functions cannot connect to the FTDI device, even if they see it. In the process, you can manually unload kext:

 sudo kextunload -b com.apple.driver.AppleUSBFTDI 

but it will reboot at the next boot.

As a more permanent solution, I found that my applications detect if this kext is loaded (trying to connect via D2XX functions and see if they work), and using more traditional open() calls, etc. to connect to the serial port as a backup.

I'm not sure that using kext in the VCP style that they use allows the same flexibility in terms of data transfer speed as D2XX.

+9
source

All Articles