Hello,

I try to scan every 5 seconds the usb bus for ftdi 2232 devices, to add or remove them from my list. And It works, but when I connect to devices I found and try again to look for 2232 devices
I get an "segmentation fault" at ftdi_init.

This is the code for that. At the first time this works, but If i have a connection to ftdi devices on bus it doesn't.
And I don't know why? Does someone else know why?

int scan_usb_heliosens()
{
 int num_devices = 0;
 struct ftdi_context ftdic;
 struct ftdi_device_list *devlist, *curdev;
 struct heliosens_usb *temp, *temp2;
 char tempmanu[128], tempdesc[128], tempserial[50];

 if(ftdi_init(&ftdic) < 0) {
   fprintf(stderr, "ftdi_init failed\n");
   return -1;
 }

 //USB Heliosens devices use all a FT2232 (VID=0x0403, PID=0x6010)
if((num_devices = ftdi_usb_find_all(&ftdic, &devlist, 0x0403, 0x6010)) < 0) { fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", num_devices, ftdi_get_error_string(&ftdic));
   goto return_error;
 }

 if(num_devices > 0) {
   for (curdev = devlist; curdev != NULL; curdev = curdev->next) {
if (ftdi_usb_get_strings(&ftdic, curdev->dev, tempmanu, sizeof(tempmanu)-1, tempdesc, sizeof(tempdesc)-1, tempserial, sizeof(tempserial)-1) < 0) { fprintf(stderr, "ftdi_usb_get_strings failed: (%s)\n", ftdi_get_error_string(&ftdic));
           goto return_error;
       }

       if(verbose) {
fprintf(stdout, "Found Device Manufacturer: %s\tDescription: %s\n", tempmanu, tempdesc);
       }

       // Check if ftdi devices is a usb heliosens
if(strncmp(MANUFACTURER,tempmanu, sizeof(tempmanu)-1)==0 && strncmp(DESCRIPTION,tempdesc, sizeof(tempdesc)-1)==0) {

         // Check if device is always known
         int device_known = FALSE;
         temp = devices;

         while(temp != NULL) {
           if( strncmp(temp->ident, tempserial, sizeof(tempserial)-1) == 0)
             device_known = TRUE;
           temp = temp->next;
         }

         if(device_known)
           continue;

         //Try to allocate ftdi_context's for found heliosens
         struct heliosens_usb *newdev;
if((newdev = (struct heliosens_usb *)malloc(sizeof(struct ftdi_context))) == NULL) {
           fprintf(stderr, "Can not allocate memory for ftdi device\n");
           goto return_error;
         }

         // init the ftdi_context structure
         if(ftdi_init(&newdev->ftdic) < 0) {
           fprintf(stderr, "Can not init ftid_context\n");
           free(newdev);
           continue;
         }

         // Now let open and initialise this devices
         if(open_and_initialise_mpsse(&newdev->ftdic, curdev) < 0) {
           fprintf(stderr, "Can not open and initialise device\n" );
           close_and_free(newdev);
           continue;
         }
// Calibrate and configure device if needed
         if(calibrate)
           run_calibrate(&newdev->ftdic);
else if(conversion_mode != CONVERSION_MODE_4) //Mode 4 is reset value of the HCPL-0872
           set_config(&newdev->ftdic);
// Add struct heliosens_usb (newdev) to list
         temp = devices;
fprintf(stderr, "ident: %s | tempserial: %s\n", newdev->ident, tempserial);
         strncpy(newdev->ident, tempserial, sizeof(newdev->ident)-1);

         if(temp ==  NULL) { // add as first entry
           newdev->prev = NULL;
           newdev->next = NULL;
           temp = newdev;
           devices = temp;
         }
         else {  // add entry to end
           for(; temp->next != NULL; temp = temp->next);
           temp->next = newdev;
           newdev->prev = temp;
           newdev->next = NULL;
         }

         if(verbose)
           fprintf(stdout, "Device %s added\n", newdev->ident);
     }
   }
 }


 // Check if all devices in list are really available
 unsigned short status;
 temp = devices;

 while(temp != NULL) {
   temp2 = temp;
   temp = temp->next;
   if(ftdi_poll_modem_status(&temp2->ftdic, &status) < 0 ) {
     if(verbose)
       fprintf(stderr, "Removing device %s\n", temp2->ident);

     // Let's remove device from list
     if(temp2->prev == NULL && temp2->next == NULL) {  //only one entry
       devices = NULL;
     }
     if(temp2->prev == NULL) { //first entry
       temp2->next->prev = NULL;
     }
     else if(temp2->next == NULL) { //last entry
       temp2->prev->next = NULL;
     }
     else {
       temp2->prev->next = temp2->next;
       temp2->next->prev = temp2->prev;
     }

     close_and_free(temp2);
   }
}
 if(num_devices > 0)
   ftdi_list_free(&devlist);

 ftdi_deinit(&ftdic);
 return 1;

return_error:
 ftdi_deinit(&ftdic);
 return -1;
}


Regards
Lars


--
libftdi - see http://www.intra2net.com/en/developer/libftdi for details.
To unsubscribe send a mail to [email protected]   

Reply via email to