On Wed, 2012-09-12 at 18:54 -0500, Ryan Tennill wrote: > On Wed, 2012-09-12 at 16:15 -0500, Ryan Tennill wrote: > > I need to open and monitor LOTS (> 50) of FTDI devices on a single > > computer as serial ports with CBUS GPIO. We're using one of the FT232R's > > CBUS pins as power enable and UART activity for now. > > > > Is there a standard way for opening and controlling multiple devices > > simultaneously and independently? Even when I only create one child > > process and open one device, the call to ftdi_set_bitmode() is sent to > > ALL DEVICES even ones not explicitly opened! > > > > I am using libftdi 0.20 and libusb0.1 which may not be thread-safe... > > http://developer.intra2net.com/mailarchive/html/libftdi/2012/msg00118.html > > > > If libftdi-1.0 / libusb-1.0 thread-safe then I should probably consider > > switching over but I still don't understand why my set_bitmode() goes to > > all attached FT232's... > > > > Pseudocode: > > - ftdi_new() > > - ftdi_init() > > - ftdi_usb_find_all() > > - for all found devices > > - ftdi_usb_open_desc_index(ftdi,DEVICE_VID,DEVICE_PID,NULL,NULL,i) > > - read chipID and get serial from EEPROM > > - ftdi_usb_close(ftdi) after reads > > - fork() and child execl()'s another program to manage UART > > and CBUS after parent exits > > - parent sets process group ID of child to new group shared > > by all children (** this might be a problem too ? **) > > - once all children processes created and running, parent > > cleans up eeprom, ftdi_dev_list, ftdi_deinit, and exits > > > > > > The child process opens devices by serial using the following call: > > ftdi_usb_open_desc(ftdi, DEVICE_VID, DEVICE_PID,NULL,ftdi_serial) > > > > > > -- > > libftdi - see http://www.intra2net.com/en/developer/libftdi for details. > > To unsubscribe send a mail to [email protected] > > > > Here's a modified version of the bitbang example that eliminates the > possible issues from fork()'ing. If anyone has multiple devices of the > same type can they give this a shot? > > //CODE > /*************************************************************************** > main.c - description > ------------------- > begin : Mon Apr 7 12:05:22 CEST 2003 > copyright : (C) 2003,2008 by Intra2net AG > email : [email protected] > > ***************************************************************************/ > > /*************************************************************************** > * > * > * This program is free software; you can redistribute it and/or > modify * > * it under the terms of the GNU General Public License version 2 as > * > * published by the Free Software Foundation. > * > * > * > > ***************************************************************************/ > > //Modified by Ryan Tennill @ Distant Focus Corp 2012 > //Goal: test CBUS I/O control using libFTDI with FT232R and Ubuntu 10.04 > //Note: Requires CBUS configured as I/O in EEPROM > //Note: Requires RXD, TXD inverted in EEPROM > //Note: Driving CBUS HIGH=ON, LOW=OFF > > #include <stdlib.h> > #include <stdio.h> > #include <string.h> > #include "ftdi.h" > > //my constants > #define MCCM_ON 0xFF > #define MCCM_OFF 0xF0 > > //ftdi defaults > #define DEFAULT_PID 0x6001 > #define DEFAULT_VID 0x0403 > > //easily change initial device VID and PID > #define DEVICE_VID DEFAULT_VID > #define DEVICE_PID DEFAULT_PID > //#define DEVICE_PID 0x6015 //FT230X > > //debug defines > #define PRINT_RAW_EEPROM 0 > #define PRINT_EEPROM_STRUCT 1 > > > void cleanup(struct ftdi_context *ftdi){ > printf("FTDI close: %d\n", ftdi_usb_close(ftdi)); > if(ftdi != NULL) ftdi_deinit(ftdi); > printf("\n"); > } > > int main(int argc, char *argv[]) { > > struct ftdi_context *ftdi; > unsigned char mychar; > int f = 0; > > if ((ftdi = ftdi_new()) == 0) { > printf("ftdi_new failed\n"); > return EXIT_FAILURE; > } > > if (ftdi_usb_open(ftdi, DEVICE_VID, DEVICE_PID)) { > printf("Unable to find FTDI devices under given vendor/product > id: 0x%X/0x%X\n", \ > DEVICE_VID, DEVICE_PID); > printf("Retrying with default FTDI id.\n"); > > if (ftdi_usb_open(ftdi, DEFAULT_VID, DEFAULT_PID)) { > printf("Error: %s\n", ftdi->error_str); > exit (-1); > }else{ > printf("device opened with default VID, PID\n"); > } > > }else{ > printf("sucessfully opened device with VID, PID: 0x%04X | 0x%04X > \n",DEVICE_VID,DEVICE_PID); > } > > mychar = MCCM_OFF; > printf("driving LOW\n"); > if ((f=ftdi_set_bitmode(ftdi, mychar, BITMODE_CBUS)<0)) { > printf("write failed for 0x%x, error %d (%s)\n",mychar,f, > ftdi_get_error_string(ftdi)); > } > printf("set_bitmode returned: %d\n",f); > sleep(3); > > > mychar = MCCM_ON; > printf("driving HIGH\n"); > if ((f=ftdi_set_bitmode(ftdi, mychar, BITMODE_CBUS)<0)) { > printf("write failed for 0x%x, error %d (%s)\n",mychar,f, > ftdi_get_error_string(ftdi)); > } > printf("set_bitmode returned: %d\n",f); > sleep(3); > > mychar = MCCM_OFF; > printf("driving LOW\n"); > if ((f=ftdi_set_bitmode(ftdi, mychar, BITMODE_CBUS)<0)) { > printf("write failed for 0x%x, error %d (%s)\n",mychar,f, > ftdi_get_error_string(ftdi)); > } > printf("set_bitmode returned: %d\n",f); > > printf("test completed\n"); > > cleanup(ftdi); > return 0; > } > > > > > > > -- > libftdi - see http://www.intra2net.com/en/developer/libftdi for details. > To unsubscribe send a mail to [email protected] >
Please disregard this issue. There was a wiring error on my testbed that was allowing a single CBUS pin to be distributed to all the hardware! -- libftdi - see http://www.intra2net.com/en/developer/libftdi for details. To unsubscribe send a mail to [email protected]
