X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=src%2Fftdi.c;h=9414c2d4f63ebc7d8723222f5caae5865f6c8370;hp=e7904b3d37c7d96d68c6f8550e00a03586cad71f;hb=280bea1940219c74688527e18118956112b08391;hpb=5193cc2344f13828c0f280135718eb741ec85237 diff --git a/src/ftdi.c b/src/ftdi.c index e7904b3..9414c2d 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -35,6 +35,8 @@ #include #include "ftdi_i.h" +/* Prevent deprecated messages when building library */ +#define _FTDI_DISABLE_DEPRECATED #include "ftdi.h" #include "ftdi_version_i.h" @@ -614,6 +616,11 @@ int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev) if (libusb_detach_kernel_driver(ftdi->usb_dev, ftdi->interface) !=0) detach_errno = errno; } + else if (ftdi->module_detach_mode == AUTO_DETACH_REATACH_SIO_MODULE) + { + if (libusb_set_auto_detach_kernel_driver(ftdi->usb_dev, 1) != LIBUSB_SUCCESS) + detach_errno = errno; + } if (libusb_get_configuration (ftdi->usb_dev, &cfg) < 0) ftdi_error_return(-12, "libusb_get_configuration () failed"); @@ -1011,6 +1018,7 @@ int ftdi_usb_reset(struct ftdi_context *ftdi) /** Clears the read buffer on the chip and the internal read buffer. + This is the correct behavior for an RX flush. \param ftdi pointer to ftdi_context @@ -1018,6 +1026,36 @@ int ftdi_usb_reset(struct ftdi_context *ftdi) \retval -1: read buffer purge failed \retval -2: USB device unavailable */ +int ftdi_tciflush(struct ftdi_context *ftdi) +{ + if (ftdi == NULL || ftdi->usb_dev == NULL) + ftdi_error_return(-2, "USB device unavailable"); + + if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, + SIO_RESET_REQUEST, SIO_TCIFLUSH, + ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0) + ftdi_error_return(-1, "FTDI purge of RX buffer failed"); + + // Invalidate data in the readbuffer + ftdi->readbuffer_offset = 0; + ftdi->readbuffer_remaining = 0; + + return 0; +} + + +/** + Clears the write buffer on the chip and the internal read buffer. + This is incorrect behavior for an RX flush. + + \param ftdi pointer to ftdi_context + + \retval 0: all fine + \retval -1: write buffer purge failed + \retval -2: USB device unavailable + + \deprecated Use \ref ftdi_tciflush(struct ftdi_context *ftdi) +*/ int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi) { if (ftdi == NULL || ftdi->usb_dev == NULL) @@ -1037,6 +1075,7 @@ int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi) /** Clears the write buffer on the chip. + This is correct behavior for a TX flush. \param ftdi pointer to ftdi_context @@ -1044,6 +1083,32 @@ int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi) \retval -1: write buffer purge failed \retval -2: USB device unavailable */ +int ftdi_tcoflush(struct ftdi_context *ftdi) +{ + if (ftdi == NULL || ftdi->usb_dev == NULL) + ftdi_error_return(-2, "USB device unavailable"); + + if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, + SIO_RESET_REQUEST, SIO_TCOFLUSH, + ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0) + ftdi_error_return(-1, "FTDI purge of TX buffer failed"); + + return 0; +} + + +/** + Clears the read buffer on the chip. + This is incorrect behavior for a TX flush. + + \param ftdi pointer to ftdi_context + + \retval 0: all fine + \retval -1: read buffer purge failed + \retval -2: USB device unavailable + + \deprecated Use \ref ftdi_tcoflush(struct ftdi_context *ftdi) +*/ int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi) { if (ftdi == NULL || ftdi->usb_dev == NULL) @@ -1058,7 +1123,37 @@ int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi) } /** + Clears the RX and TX FIFOs on the chip and the internal read buffer. + This is correct behavior for both RX and TX flush. + + \param ftdi pointer to ftdi_context + + \retval 0: all fine + \retval -1: read buffer purge failed + \retval -2: write buffer purge failed + \retval -3: USB device unavailable +*/ +int ftdi_tcioflush(struct ftdi_context *ftdi) +{ + int result; + + if (ftdi == NULL || ftdi->usb_dev == NULL) + ftdi_error_return(-3, "USB device unavailable"); + + result = ftdi_tcoflush(ftdi); + if (result < 0) + return -1; + + result = ftdi_tciflush(ftdi); + if (result < 0) + return -2; + + return 0; +} + +/** Clears the buffers on the chip and the internal read buffer. + While coded incorrectly, the result is satisfactory. \param ftdi pointer to ftdi_context @@ -1066,6 +1161,8 @@ int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi) \retval -1: read buffer purge failed \retval -2: write buffer purge failed \retval -3: USB device unavailable + + \deprecated Use \ref ftdi_tcioflush(struct ftdi_context *ftdi) */ int ftdi_usb_purge_buffers(struct ftdi_context *ftdi) {