X-Git-Url: http://developer.intra2net.com/git/?a=blobdiff_plain;f=src%2Fftdi.c;h=b22a55b755a35da96227ed431d98797bf2c709f0;hb=249888c8bdc8907bb664f8e3af674a630533eff8;hp=8bddd42532d7498fe427f2ee8c5cacd1766711bd;hpb=ddfa995d1cd57cebfcc785ba4ed626aaafe6f1b6;p=libftdi diff --git a/src/ftdi.c b/src/ftdi.c index 8bddd42..b22a55b 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -78,6 +78,7 @@ static void ftdi_usb_close_internal (struct ftdi_context *ftdi) */ int ftdi_init(struct ftdi_context *ftdi) { + ftdi->usb_ctx = NULL; ftdi->usb_dev = NULL; ftdi->usb_read_timeout = 5000; ftdi->usb_write_timeout = 5000; @@ -191,7 +192,7 @@ void ftdi_deinit(struct ftdi_context *ftdi) free(ftdi->readbuffer); ftdi->readbuffer = NULL; } - libusb_exit(NULL); + libusb_exit(ftdi->usb_ctx); } /** @@ -243,10 +244,10 @@ int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devli int count = 0; int i = 0; - if (libusb_init(NULL) < 0) + if (libusb_init(&ftdi->usb_ctx) < 0) ftdi_error_return(-4, "libusb_init() failed"); - if (libusb_get_device_list(NULL, &devs) < 0) + if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0) ftdi_error_return(-5, "libusb_get_device_list() failed"); curdev = devlist; @@ -490,7 +491,7 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev) } else { - ftdi_error_return(-3, "unable to set usb configuration. Make sure the default FTDI kernel side driver is unloaded."); + ftdi_error_return(-3, "unable to set usb configuration. Make sure the default FTDI driver is not in use"); } } } @@ -504,7 +505,7 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev) } else { - ftdi_error_return(-5, "unable to claim usb device. Make sure the default FTDI kernel side driver is unloaded."); + ftdi_error_return(-5, "unable to claim usb device. Make sure the default FTDI driver is not in use"); } } @@ -629,13 +630,13 @@ int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product, char string[256]; int i = 0; - if (libusb_init(NULL) < 0) + if (libusb_init(&ftdi->usb_ctx) < 0) ftdi_error_return(-11, "libusb_init() failed"); if (ftdi == NULL) ftdi_error_return(-11, "ftdi context invalid"); - if (libusb_get_device_list(NULL, &devs) < 0) + if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0) ftdi_error_return(-12, "libusb_get_device_list() failed"); while ((dev = devs[i++]) != NULL) @@ -738,10 +739,10 @@ int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description) unsigned int bus_number, device_address; int i = 0; - if (libusb_init (NULL) < 0) + if (libusb_init (&ftdi->usb_ctx) < 0) ftdi_error_return(-1, "libusb_init() failed"); - if (libusb_get_device_list(NULL, &devs) < 0) + if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0) ftdi_error_return(-2, "libusb_get_device_list() failed"); /* XXX: This doesn't handle symlinks/odd paths/etc... */ @@ -1235,10 +1236,6 @@ int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size) return offset; } -#ifdef LIBFTDI_LINUX_ASYNC_MODE -#ifdef USB_CLASS_PTP -#error LIBFTDI_LINUX_ASYNC_MODE is not compatible with libusb-compat-0.1! -#endif static void ftdi_read_data_cb(struct libusb_transfer *transfer) { struct ftdi_transfer_control *tc = (struct ftdi_transfer_control *) transfer->user_data; @@ -1353,8 +1350,7 @@ static void ftdi_write_data_cb(struct libusb_transfer *transfer) Writes data to the chip. Does not wait for completion of the transfer nor does it make sure that the transfer was successful. - Use libusb 1.0 Asynchronous API. - Only available if compiled with --with-async-mode. + Use libusb 1.0 asynchronous API. \param ftdi pointer to ftdi_context \param buf Buffer with the data @@ -1412,8 +1408,7 @@ struct ftdi_transfer_control *ftdi_write_data_submit(struct ftdi_context *ftdi, Reads data from the chip. Does not wait for completion of the transfer nor does it make sure that the transfer was successful. - Use libusb 1.0 Asynchronous API. - Only available if compiled with --with-async-mode. + Use libusb 1.0 asynchronous API. \param ftdi pointer to ftdi_context \param buf Buffer with the data @@ -1494,8 +1489,7 @@ struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, u /** Wait for completion of the transfer. - Use libusb 1.0 Asynchronous API. - Only available if compiled with --with-async-mode. + Use libusb 1.0 asynchronous API. \param tc pointer to ftdi_transfer_control @@ -1509,14 +1503,14 @@ int ftdi_transfer_data_done(struct ftdi_transfer_control *tc) while (!tc->completed) { - ret = libusb_handle_events(NULL); + ret = libusb_handle_events(tc->ftdi->usb_ctx); if (ret < 0) { if (ret == LIBUSB_ERROR_INTERRUPTED) continue; libusb_cancel_transfer(tc->transfer); while (!tc->completed) - if (libusb_handle_events(NULL) < 0) + if (libusb_handle_events(tc->ftdi->usb_ctx) < 0) break; libusb_free_transfer(tc->transfer); free (tc); @@ -1535,8 +1529,6 @@ int ftdi_transfer_data_done(struct ftdi_transfer_control *tc) return ret; } -#endif // LIBFTDI_LINUX_ASYNC_MODE - /** Configure write buffer chunk size. Default is 4096. @@ -2205,6 +2197,27 @@ void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom) } /** + Frees allocated memory in eeprom. + + \param eeprom Pointer to ftdi_eeprom +*/ +void ftdi_eeprom_free(struct ftdi_eeprom *eeprom) +{ + if (eeprom->manufacturer != 0) { + free(eeprom->manufacturer); + eeprom->manufacturer = 0; + } + if (eeprom->product != 0) { + free(eeprom->product); + eeprom->product = 0; + } + if (eeprom->serial != 0) { + free(eeprom->serial); + eeprom->serial = 0; + } +} + +/** Build binary output from ftdi_eeprom structure. Output is suitable for ftdi_write_eeprom().