1 /***************************************************************************
5 copyright : (C) 2003-2008 by Intra2net AG
6 email : opensource@intra2net.com
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU Lesser General Public License *
13 * version 2.1 as published by the Free Software Foundation; *
15 ***************************************************************************/
18 \mainpage libftdi API documentation
20 Library to talk to FTDI chips. You find the latest versions of libftdi at
21 http://www.intra2net.com/de/produkte/opensource/ftdi/
23 The library is easy to use. Have a look at this short example:
26 More examples can be found in the "examples" directory.
28 /** \addtogroup libftdi */
37 /* stuff needed for async write */
38 #ifdef LIBFTDI_LINUX_ASYNC_MODE
39 #include <sys/ioctl.h>
41 #include <sys/select.h>
42 #include <sys/types.h>
44 #include <linux/usbdevice_fs.h>
47 #define ftdi_error_return(code, str) do { \
48 ftdi->error_str = str; \
54 Initializes a ftdi_context.
56 \param ftdi pointer to ftdi_context
59 \retval -1: couldn't allocate read buffer
61 \remark This should be called before all functions
63 int ftdi_init(struct ftdi_context *ftdi)
68 ftdi->usb_read_timeout = 5000;
69 ftdi->usb_write_timeout = 5000;
71 ftdi->type = TYPE_BM; /* chip type */
73 ftdi->bitbang_enabled = 0;
75 ftdi->readbuffer = NULL;
76 ftdi->readbuffer_offset = 0;
77 ftdi->readbuffer_remaining = 0;
78 ftdi->writebuffer_chunksize = 4096;
84 ftdi->bitbang_mode = 1; /* 1: Normal bitbang mode, 2: SPI bitbang mode */
86 ftdi->error_str = NULL;
88 #ifdef LIBFTDI_LINUX_ASYNC_MODE
89 ftdi->async_usb_buffer_size=10;
90 if ((ftdi->async_usb_buffer=malloc(sizeof(struct usbdevfs_urb)*ftdi->async_usb_buffer_size)) == NULL)
91 ftdi_error_return(-1, "out of memory for async usb buffer");
93 /* initialize async usb buffer with unused-marker */
94 for (i=0; i < ftdi->async_usb_buffer_size; i++)
95 ((struct usbdevfs_urb*)ftdi->async_usb_buffer)[i].usercontext = FTDI_URB_USERCONTEXT_COOKIE;
97 ftdi->async_usb_buffer_size=0;
98 ftdi->async_usb_buffer = NULL;
101 ftdi->eeprom_size = FTDI_DEFAULT_EEPROM_SIZE;
103 /* All fine. Now allocate the readbuffer */
104 return ftdi_read_data_set_chunksize(ftdi, 4096);
108 Allocate and initialize a new ftdi_context
110 \return a pointer to a new ftdi_context, or NULL on failure
112 struct ftdi_context *ftdi_new()
114 struct ftdi_context * ftdi = (struct ftdi_context *)malloc(sizeof(struct ftdi_context));
120 if (ftdi_init(ftdi) != 0) {
129 Open selected channels on a chip, otherwise use first channel.
131 \param ftdi pointer to ftdi_context
132 \param interface Interface to use for FT2232C chips.
135 \retval -1: unknown interface
137 int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)
142 /* ftdi_usb_open_desc cares to set the right index, depending on the found chip */
146 ftdi->index = INTERFACE_B;
151 ftdi_error_return(-1, "Unknown interface");
157 Deinitializes a ftdi_context.
159 \param ftdi pointer to ftdi_context
161 void ftdi_deinit(struct ftdi_context *ftdi)
163 if (ftdi->async_usb_buffer != NULL) {
164 free(ftdi->async_usb_buffer);
165 ftdi->async_usb_buffer = NULL;
168 if (ftdi->readbuffer != NULL) {
169 free(ftdi->readbuffer);
170 ftdi->readbuffer = NULL;
175 Deinitialize and free an ftdi_context.
177 \param ftdi pointer to ftdi_context
179 void ftdi_free(struct ftdi_context *ftdi)
186 Use an already open libusb device.
188 \param ftdi pointer to ftdi_context
189 \param usb libusb usb_dev_handle to use
191 void ftdi_set_usbdev (struct ftdi_context *ftdi, usb_dev_handle *usb)
198 Finds all ftdi devices on the usb bus. Creates a new ftdi_device_list which
199 needs to be deallocated by ftdi_list_free() after use.
201 \param ftdi pointer to ftdi_context
202 \param devlist Pointer where to store list of found devices
203 \param vendor Vendor ID to search for
204 \param product Product ID to search for
206 \retval >0: number of devices found
207 \retval -1: usb_find_busses() failed
208 \retval -2: usb_find_devices() failed
209 \retval -3: out of memory
211 int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product)
213 struct ftdi_device_list **curdev;
215 struct usb_device *dev;
219 if (usb_find_busses() < 0)
220 ftdi_error_return(-1, "usb_find_busses() failed");
221 if (usb_find_devices() < 0)
222 ftdi_error_return(-2, "usb_find_devices() failed");
226 for (bus = usb_busses; bus; bus = bus->next) {
227 for (dev = bus->devices; dev; dev = dev->next) {
228 if (dev->descriptor.idVendor == vendor
229 && dev->descriptor.idProduct == product)
231 *curdev = (struct ftdi_device_list*)malloc(sizeof(struct ftdi_device_list));
233 ftdi_error_return(-3, "out of memory");
235 (*curdev)->next = NULL;
236 (*curdev)->dev = dev;
238 curdev = &(*curdev)->next;
248 Frees a usb device list.
250 \param devlist USB device list created by ftdi_usb_find_all()
252 void ftdi_list_free(struct ftdi_device_list **devlist)
254 struct ftdi_device_list *curdev, *next;
256 for (curdev = *devlist; curdev != NULL;) {
266 Frees a usb device list.
268 \param devlist USB device list created by ftdi_usb_find_all()
270 void ftdi_list_free2(struct ftdi_device_list *devlist)
272 ftdi_list_free(&devlist);
276 Return device ID strings from the usb device.
278 The parameters manufacturer, description and serial may be NULL
279 or pointer to buffers to store the fetched strings.
281 \note Use this function only in combination with ftdi_usb_find_all()
282 as it closes the internal "usb_dev" after use.
284 \param ftdi pointer to ftdi_context
285 \param dev libusb usb_dev to use
286 \param manufacturer Store manufacturer string here if not NULL
287 \param mnf_len Buffer size of manufacturer string
288 \param description Store product description string here if not NULL
289 \param desc_len Buffer size of product description string
290 \param serial Store serial string here if not NULL
291 \param serial_len Buffer size of serial string
294 \retval -1: wrong arguments
295 \retval -4: unable to open device
296 \retval -7: get product manufacturer failed
297 \retval -8: get product description failed
298 \retval -9: get serial number failed
299 \retval -10: unable to close device
301 int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct usb_device * dev,
302 char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len)
304 if ((ftdi==NULL) || (dev==NULL))
307 if (!(ftdi->usb_dev = usb_open(dev)))
308 ftdi_error_return(-4, usb_strerror());
310 if (manufacturer != NULL) {
311 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iManufacturer, manufacturer, mnf_len) <= 0) {
312 usb_close (ftdi->usb_dev);
313 ftdi_error_return(-7, usb_strerror());
317 if (description != NULL) {
318 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, description, desc_len) <= 0) {
319 usb_close (ftdi->usb_dev);
320 ftdi_error_return(-8, usb_strerror());
324 if (serial != NULL) {
325 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, serial, serial_len) <= 0) {
326 usb_close (ftdi->usb_dev);
327 ftdi_error_return(-9, usb_strerror());
331 if (usb_close (ftdi->usb_dev) != 0)
332 ftdi_error_return(-10, usb_strerror());
338 Opens a ftdi device given by a usb_device.
340 \param ftdi pointer to ftdi_context
341 \param dev libusb usb_dev to use
344 \retval -4: unable to open device
345 \retval -5: unable to claim device
346 \retval -6: reset failed
347 \retval -7: set baudrate failed
349 int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev)
351 int detach_errno = 0;
352 if (!(ftdi->usb_dev = usb_open(dev)))
353 ftdi_error_return(-4, "usb_open() failed");
355 #ifdef LIBUSB_HAS_GET_DRIVER_NP
356 // Try to detach ftdi_sio kernel module
357 // Returns ENODATA if driver is not loaded
358 if (usb_detach_kernel_driver_np(ftdi->usb_dev, ftdi->interface) != 0 && errno != ENODATA)
359 detach_errno = errno;
362 if (usb_claim_interface(ftdi->usb_dev, ftdi->interface) != 0) {
363 usb_close (ftdi->usb_dev);
364 if (detach_errno == EPERM) {
365 ftdi_error_return(-8, "inappropriate permissions on device!");
367 ftdi_error_return(-5, "unable to claim usb device. Make sure ftdi_sio is unloaded!");
371 if (ftdi_usb_reset (ftdi) != 0) {
372 usb_close (ftdi->usb_dev);
373 ftdi_error_return(-6, "ftdi_usb_reset failed");
376 if (ftdi_set_baudrate (ftdi, 9600) != 0) {
377 usb_close (ftdi->usb_dev);
378 ftdi_error_return(-7, "set baudrate failed");
381 // Try to guess chip type
382 // Bug in the BM type chips: bcdDevice is 0x200 for serial == 0
383 if (dev->descriptor.bcdDevice == 0x400 || (dev->descriptor.bcdDevice == 0x200
384 && dev->descriptor.iSerialNumber == 0))
385 ftdi->type = TYPE_BM;
386 else if (dev->descriptor.bcdDevice == 0x200)
387 ftdi->type = TYPE_AM;
388 else if (dev->descriptor.bcdDevice == 0x500) {
389 ftdi->type = TYPE_2232C;
391 ftdi->index = INTERFACE_A;
392 } else if (dev->descriptor.bcdDevice == 0x600)
395 ftdi_error_return(0, "all fine");
399 Opens the first device with a given vendor and product ids.
401 \param ftdi pointer to ftdi_context
402 \param vendor Vendor ID
403 \param product Product ID
405 \retval same as ftdi_usb_open_desc()
407 int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
409 return ftdi_usb_open_desc(ftdi, vendor, product, NULL, NULL);
413 Opens the first device with a given, vendor id, product id,
414 description and serial.
416 \param ftdi pointer to ftdi_context
417 \param vendor Vendor ID
418 \param product Product ID
419 \param description Description to search for. Use NULL if not needed.
420 \param serial Serial to search for. Use NULL if not needed.
423 \retval -1: usb_find_busses() failed
424 \retval -2: usb_find_devices() failed
425 \retval -3: usb device not found
426 \retval -4: unable to open device
427 \retval -5: unable to claim device
428 \retval -6: reset failed
429 \retval -7: set baudrate failed
430 \retval -8: get product description failed
431 \retval -9: get serial number failed
432 \retval -10: unable to close device
434 int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
435 const char* description, const char* serial)
438 struct usb_device *dev;
443 if (usb_find_busses() < 0)
444 ftdi_error_return(-1, "usb_find_busses() failed");
445 if (usb_find_devices() < 0)
446 ftdi_error_return(-2, "usb_find_devices() failed");
448 for (bus = usb_busses; bus; bus = bus->next) {
449 for (dev = bus->devices; dev; dev = dev->next) {
450 if (dev->descriptor.idVendor == vendor
451 && dev->descriptor.idProduct == product) {
452 if (!(ftdi->usb_dev = usb_open(dev)))
453 ftdi_error_return(-4, "usb_open() failed");
455 if (description != NULL) {
456 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, string, sizeof(string)) <= 0) {
457 usb_close (ftdi->usb_dev);
458 ftdi_error_return(-8, "unable to fetch product description");
460 if (strncmp(string, description, sizeof(string)) != 0) {
461 if (usb_close (ftdi->usb_dev) != 0)
462 ftdi_error_return(-10, "unable to close device");
466 if (serial != NULL) {
467 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, string, sizeof(string)) <= 0) {
468 usb_close (ftdi->usb_dev);
469 ftdi_error_return(-9, "unable to fetch serial number");
471 if (strncmp(string, serial, sizeof(string)) != 0) {
472 if (usb_close (ftdi->usb_dev) != 0)
473 ftdi_error_return(-10, "unable to close device");
478 if (usb_close (ftdi->usb_dev) != 0)
479 ftdi_error_return(-10, "unable to close device");
481 return ftdi_usb_open_dev(ftdi, dev);
487 ftdi_error_return(-3, "device not found");
491 Resets the ftdi device.
493 \param ftdi pointer to ftdi_context
496 \retval -1: FTDI reset failed
498 int ftdi_usb_reset(struct ftdi_context *ftdi)
500 if (usb_control_msg(ftdi->usb_dev, 0x40, 0, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
501 ftdi_error_return(-1,"FTDI reset failed");
503 // Invalidate data in the readbuffer
504 ftdi->readbuffer_offset = 0;
505 ftdi->readbuffer_remaining = 0;
511 Clears the buffers on the chip.
513 \param ftdi pointer to ftdi_context
516 \retval -1: write buffer purge failed
517 \retval -2: read buffer purge failed
519 int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)
521 if (usb_control_msg(ftdi->usb_dev, 0x40, 0, 1, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
522 ftdi_error_return(-1, "FTDI purge of RX buffer failed");
524 // Invalidate data in the readbuffer
525 ftdi->readbuffer_offset = 0;
526 ftdi->readbuffer_remaining = 0;
528 if (usb_control_msg(ftdi->usb_dev, 0x40, 0, 2, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
529 ftdi_error_return(-2, "FTDI purge of TX buffer failed");
535 Closes the ftdi device. Call ftdi_deinit() if you're cleaning up.
537 \param ftdi pointer to ftdi_context
540 \retval -1: usb_release failed
541 \retval -2: usb_close failed
543 int ftdi_usb_close(struct ftdi_context *ftdi)
547 #ifdef LIBFTDI_LINUX_ASYNC_MODE
548 /* try to release some kernel resources */
549 ftdi_async_complete(ftdi,1);
552 if (usb_release_interface(ftdi->usb_dev, ftdi->interface) != 0)
555 if (usb_close (ftdi->usb_dev) != 0)
562 ftdi_convert_baudrate returns nearest supported baud rate to that requested.
563 Function is only used internally
566 static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
567 unsigned short *value, unsigned short *index)
569 static const char am_adjust_up[8] = {0, 0, 0, 1, 0, 3, 2, 1};
570 static const char am_adjust_dn[8] = {0, 0, 0, 1, 0, 1, 2, 3};
571 static const char frac_code[8] = {0, 3, 2, 4, 1, 5, 6, 7};
572 int divisor, best_divisor, best_baud, best_baud_diff;
573 unsigned long encoded_divisor;
581 divisor = 24000000 / baudrate;
583 if (ftdi->type == TYPE_AM) {
584 // Round down to supported fraction (AM only)
585 divisor -= am_adjust_dn[divisor & 7];
588 // Try this divisor and the one above it (because division rounds down)
592 for (i = 0; i < 2; i++) {
593 int try_divisor = divisor + i;
597 // Round up to supported divisor value
598 if (try_divisor <= 8) {
599 // Round up to minimum supported divisor
601 } else if (ftdi->type != TYPE_AM && try_divisor < 12) {
602 // BM doesn't support divisors 9 through 11 inclusive
604 } else if (divisor < 16) {
605 // AM doesn't support divisors 9 through 15 inclusive
608 if (ftdi->type == TYPE_AM) {
609 // Round up to supported fraction (AM only)
610 try_divisor += am_adjust_up[try_divisor & 7];
611 if (try_divisor > 0x1FFF8) {
612 // Round down to maximum supported divisor value (for AM)
613 try_divisor = 0x1FFF8;
616 if (try_divisor > 0x1FFFF) {
617 // Round down to maximum supported divisor value (for BM)
618 try_divisor = 0x1FFFF;
622 // Get estimated baud rate (to nearest integer)
623 baud_estimate = (24000000 + (try_divisor / 2)) / try_divisor;
624 // Get absolute difference from requested baud rate
625 if (baud_estimate < baudrate) {
626 baud_diff = baudrate - baud_estimate;
628 baud_diff = baud_estimate - baudrate;
630 if (i == 0 || baud_diff < best_baud_diff) {
631 // Closest to requested baud rate so far
632 best_divisor = try_divisor;
633 best_baud = baud_estimate;
634 best_baud_diff = baud_diff;
635 if (baud_diff == 0) {
636 // Spot on! No point trying
641 // Encode the best divisor value
642 encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 7] << 14);
643 // Deal with special cases for encoded value
644 if (encoded_divisor == 1) {
645 encoded_divisor = 0; // 3000000 baud
646 } else if (encoded_divisor == 0x4001) {
647 encoded_divisor = 1; // 2000000 baud (BM only)
649 // Split into "value" and "index" values
650 *value = (unsigned short)(encoded_divisor & 0xFFFF);
651 if(ftdi->type == TYPE_2232C) {
652 *index = (unsigned short)(encoded_divisor >> 8);
654 *index |= ftdi->index;
657 *index = (unsigned short)(encoded_divisor >> 16);
659 // Return the nearest baud rate
664 Sets the chip baud rate
666 \param ftdi pointer to ftdi_context
667 \param baudrate baud rate to set
670 \retval -1: invalid baudrate
671 \retval -2: setting baudrate failed
673 int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
675 unsigned short value, index;
678 if (ftdi->bitbang_enabled) {
679 baudrate = baudrate*4;
682 actual_baudrate = ftdi_convert_baudrate(baudrate, ftdi, &value, &index);
683 if (actual_baudrate <= 0)
684 ftdi_error_return (-1, "Silly baudrate <= 0.");
686 // Check within tolerance (about 5%)
687 if ((actual_baudrate * 2 < baudrate /* Catch overflows */ )
688 || ((actual_baudrate < baudrate)
689 ? (actual_baudrate * 21 < baudrate * 20)
690 : (baudrate * 21 < actual_baudrate * 20)))
691 ftdi_error_return (-1, "Unsupported baudrate. Note: bitbang baudrates are automatically multiplied by 4");
693 if (usb_control_msg(ftdi->usb_dev, 0x40, 3, value, index, NULL, 0, ftdi->usb_write_timeout) != 0)
694 ftdi_error_return (-2, "Setting new baudrate failed");
696 ftdi->baudrate = baudrate;
701 Set (RS232) line characteristics by Alain Abbas
703 \param ftdi pointer to ftdi_context
704 \param bits Number of bits
705 \param sbit Number of stop bits
706 \param parity Parity mode
709 \retval -1: Setting line property failed
711 int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
712 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
714 unsigned short value = bits;
718 value |= (0x00 << 8);
721 value |= (0x01 << 8);
724 value |= (0x02 << 8);
727 value |= (0x03 << 8);
730 value |= (0x04 << 8);
736 value |= (0x00 << 11);
739 value |= (0x01 << 11);
742 value |= (0x02 << 11);
746 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x04, value, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
747 ftdi_error_return (-1, "Setting new line property failed");
753 Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip
755 \param ftdi pointer to ftdi_context
756 \param buf Buffer with the data
757 \param size Size of the buffer
759 \retval <0: error code from usb_bulk_write()
760 \retval >0: number of bytes written
762 int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
766 int total_written = 0;
768 while (offset < size) {
769 int write_size = ftdi->writebuffer_chunksize;
771 if (offset+write_size > size)
772 write_size = size-offset;
774 ret = usb_bulk_write(ftdi->usb_dev, ftdi->in_ep, buf+offset, write_size, ftdi->usb_write_timeout);
776 ftdi_error_return(ret, "usb bulk write failed");
778 total_written += ret;
779 offset += write_size;
782 return total_written;
785 #ifdef LIBFTDI_LINUX_ASYNC_MODE
786 /* this is strongly dependent on libusb using the same struct layout. If libusb
787 changes in some later version this may break horribly (this is for libusb 0.1.12) */
788 struct usb_dev_handle {
790 // some other stuff coming here we don't need
794 Check for pending async urbs
797 static int _usb_get_async_urbs_pending(struct ftdi_context *ftdi)
799 struct usbdevfs_urb *urb;
803 for (i=0; i < ftdi->async_usb_buffer_size; i++) {
804 urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
805 if (urb->usercontext != FTDI_URB_USERCONTEXT_COOKIE)
813 Wait until one or more async URBs are completed by the kernel and mark their
814 positions in the async-buffer as unused
816 \param ftdi pointer to ftdi_context
817 \param wait_for_more if != 0 wait for more than one write to complete
818 \param timeout_msec max milliseconds to wait
822 static void _usb_async_cleanup(struct ftdi_context *ftdi, int wait_for_more, int timeout_msec)
825 struct usbdevfs_urb *urb=NULL;
831 FD_SET(ftdi->usb_dev->fd, &writefds);
833 /* init timeout only once, select writes time left after call */
834 tv.tv_sec = timeout_msec / 1000;
835 tv.tv_usec = (timeout_msec % 1000) * 1000;
838 while (_usb_get_async_urbs_pending(ftdi)
839 && (ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_REAPURBNDELAY, &urb)) == -1
842 if (keep_going && !wait_for_more) {
843 /* don't wait if repeating only for keep_going */
848 /* wait for timeout msec or something written ready */
849 select(ftdi->usb_dev->fd+1, NULL, &writefds, NULL, &tv);
852 if (ret == 0 && urb != NULL) {
853 /* got a free urb, mark it */
854 urb->usercontext = FTDI_URB_USERCONTEXT_COOKIE;
856 /* try to get more urbs that are ready now, but don't wait anymore */
860 /* no more urbs waiting */
863 } while (keep_going);
867 Wait until one or more async URBs are completed by the kernel and mark their
868 positions in the async-buffer as unused.
870 \param ftdi pointer to ftdi_context
871 \param wait_for_more if != 0 wait for more than one write to complete (until write timeout)
873 void ftdi_async_complete(struct ftdi_context *ftdi, int wait_for_more)
875 _usb_async_cleanup(ftdi,wait_for_more,ftdi->usb_write_timeout);
879 Stupid libusb does not offer async writes nor does it allow
880 access to its fd - so we need some hacks here.
883 static int _usb_bulk_write_async(struct ftdi_context *ftdi, int ep, char *bytes, int size)
885 struct usbdevfs_urb *urb;
886 int bytesdone = 0, requested;
891 /* find a free urb buffer we can use */
893 for (cleanup_count=0; urb==NULL && cleanup_count <= 1; cleanup_count++)
895 if (i==ftdi->async_usb_buffer_size) {
896 /* wait until some buffers are free */
897 _usb_async_cleanup(ftdi,0,ftdi->usb_write_timeout);
900 for (i=0; i < ftdi->async_usb_buffer_size; i++) {
901 urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
902 if (urb->usercontext == FTDI_URB_USERCONTEXT_COOKIE)
903 break; /* found a free urb position */
908 /* no free urb position found */
912 requested = size - bytesdone;
913 if (requested > 4096)
916 memset(urb,0,sizeof(urb));
918 urb->type = USBDEVFS_URB_TYPE_BULK;
921 urb->buffer = bytes + bytesdone;
922 urb->buffer_length = requested;
924 urb->actual_length = 0;
925 urb->number_of_packets = 0;
926 urb->usercontext = 0;
929 ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_SUBMITURB, urb);
930 } while (ret < 0 && errno == EINTR);
932 return ret; /* the caller can read errno to get more info */
934 bytesdone += requested;
935 } while (bytesdone < size);
940 Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip.
941 Does not wait for completion of the transfer nor does it make sure that
942 the transfer was successful.
944 This function could be extended to use signals and callbacks to inform the
945 caller of completion or error - but this is not done yet, volunteers welcome.
947 Works around libusb and directly accesses functions only available on Linux.
948 Only available if compiled with --with-async-mode.
950 \param ftdi pointer to ftdi_context
951 \param buf Buffer with the data
952 \param size Size of the buffer
954 \retval <0: error code from usb_bulk_write()
955 \retval >0: number of bytes written
957 int ftdi_write_data_async(struct ftdi_context *ftdi, unsigned char *buf, int size)
961 int total_written = 0;
963 while (offset < size) {
964 int write_size = ftdi->writebuffer_chunksize;
966 if (offset+write_size > size)
967 write_size = size-offset;
969 ret = _usb_bulk_write_async(ftdi, ftdi->in_ep, buf+offset, write_size);
971 ftdi_error_return(ret, "usb bulk write async failed");
973 total_written += ret;
974 offset += write_size;
977 return total_written;
979 #endif // LIBFTDI_LINUX_ASYNC_MODE
982 Configure write buffer chunk size.
985 \param ftdi pointer to ftdi_context
986 \param chunksize Chunk size
990 int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
992 ftdi->writebuffer_chunksize = chunksize;
997 Get write buffer chunk size.
999 \param ftdi pointer to ftdi_context
1000 \param chunksize Pointer to store chunk size in
1004 int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1006 *chunksize = ftdi->writebuffer_chunksize;
1011 Reads data in chunks (see ftdi_read_data_set_chunksize()) from the chip.
1013 Automatically strips the two modem status bytes transfered during every read.
1015 \param ftdi pointer to ftdi_context
1016 \param buf Buffer to store data in
1017 \param size Size of the buffer
1019 \retval <0: error code from usb_bulk_read()
1020 \retval 0: no data was available
1021 \retval >0: number of bytes read
1023 \remark This function is not useful in bitbang mode.
1024 Use ftdi_read_pins() to get the current state of the pins.
1026 int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1028 int offset = 0, ret = 1, i, num_of_chunks, chunk_remains;
1030 // everything we want is still in the readbuffer?
1031 if (size <= ftdi->readbuffer_remaining) {
1032 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1035 ftdi->readbuffer_remaining -= size;
1036 ftdi->readbuffer_offset += size;
1038 /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
1042 // something still in the readbuffer, but not enough to satisfy 'size'?
1043 if (ftdi->readbuffer_remaining != 0) {
1044 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
1047 offset += ftdi->readbuffer_remaining;
1049 // do the actual USB read
1050 while (offset < size && ret > 0) {
1051 ftdi->readbuffer_remaining = 0;
1052 ftdi->readbuffer_offset = 0;
1053 /* returns how much received */
1054 ret = usb_bulk_read (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, ftdi->usb_read_timeout);
1056 ftdi_error_return(ret, "usb bulk read failed");
1059 // skip FTDI status bytes.
1060 // Maybe stored in the future to enable modem use
1061 num_of_chunks = ret / 64;
1062 chunk_remains = ret % 64;
1063 //printf("ret = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", ret, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1065 ftdi->readbuffer_offset += 2;
1069 for (i = 1; i < num_of_chunks; i++)
1070 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,
1071 ftdi->readbuffer+ftdi->readbuffer_offset+64*i,
1073 if (chunk_remains > 2) {
1074 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,
1075 ftdi->readbuffer+ftdi->readbuffer_offset+64*i,
1077 ret -= 2*num_of_chunks;
1079 ret -= 2*(num_of_chunks-1)+chunk_remains;
1081 } else if (ret <= 2) {
1082 // no more data to read?
1086 // data still fits in buf?
1087 if (offset+ret <= size) {
1088 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, ret);
1089 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
1092 /* Did we read exactly the right amount of bytes? */
1094 //printf("read_data exact rem %d offset %d\n",
1095 //ftdi->readbuffer_remaining, offset);
1098 // only copy part of the data or size <= readbuffer_chunksize
1099 int part_size = size-offset;
1100 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, part_size);
1102 ftdi->readbuffer_offset += part_size;
1103 ftdi->readbuffer_remaining = ret-part_size;
1104 offset += part_size;
1106 /* printf("Returning part: %d - size: %d - offset: %d - ret: %d - remaining: %d\n",
1107 part_size, size, offset, ret, ftdi->readbuffer_remaining); */
1118 Configure read buffer chunk size.
1121 Automatically reallocates the buffer.
1123 \param ftdi pointer to ftdi_context
1124 \param chunksize Chunk size
1128 int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1130 unsigned char *new_buf;
1132 // Invalidate all remaining data
1133 ftdi->readbuffer_offset = 0;
1134 ftdi->readbuffer_remaining = 0;
1136 if ((new_buf = (unsigned char *)realloc(ftdi->readbuffer, chunksize)) == NULL)
1137 ftdi_error_return(-1, "out of memory for readbuffer");
1139 ftdi->readbuffer = new_buf;
1140 ftdi->readbuffer_chunksize = chunksize;
1146 Get read buffer chunk size.
1148 \param ftdi pointer to ftdi_context
1149 \param chunksize Pointer to store chunk size in
1153 int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1155 *chunksize = ftdi->readbuffer_chunksize;
1161 Enable bitbang mode.
1163 For advanced bitbang modes of the FT2232C chip use ftdi_set_bitmode().
1165 \param ftdi pointer to ftdi_context
1166 \param bitmask Bitmask to configure lines.
1167 HIGH/ON value configures a line as output.
1170 \retval -1: can't enable bitbang mode
1172 int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
1174 unsigned short usb_val;
1176 usb_val = bitmask; // low byte: bitmask
1177 /* FT2232C: Set bitbang_mode to 2 to enable SPI */
1178 usb_val |= (ftdi->bitbang_mode << 8);
1180 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1181 ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
1183 ftdi->bitbang_enabled = 1;
1188 Disable bitbang mode.
1190 \param ftdi pointer to ftdi_context
1193 \retval -1: can't disable bitbang mode
1195 int ftdi_disable_bitbang(struct ftdi_context *ftdi)
1197 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1198 ftdi_error_return(-1, "unable to leave bitbang mode. Perhaps not a BM type chip?");
1200 ftdi->bitbang_enabled = 0;
1205 Enable advanced bitbang mode for FT2232C chips.
1207 \param ftdi pointer to ftdi_context
1208 \param bitmask Bitmask to configure lines.
1209 HIGH/ON value configures a line as output.
1210 \param mode Bitbang mode: 1 for normal mode, 2 for SPI mode
1213 \retval -1: can't enable bitbang mode
1215 int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
1217 unsigned short usb_val;
1219 usb_val = bitmask; // low byte: bitmask
1220 usb_val |= (mode << 8);
1221 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1222 ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps not a 2232C type chip?");
1224 ftdi->bitbang_mode = mode;
1225 ftdi->bitbang_enabled = (mode == BITMODE_BITBANG || mode == BITMODE_SYNCBB)?1:0;
1230 Directly read pin state. Useful for bitbang mode.
1232 \param ftdi pointer to ftdi_context
1233 \param pins Pointer to store pins into
1236 \retval -1: read pins failed
1238 int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins)
1240 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x0C, 0, ftdi->index, (char *)pins, 1, ftdi->usb_read_timeout) != 1)
1241 ftdi_error_return(-1, "read pins failed");
1249 The FTDI chip keeps data in the internal buffer for a specific
1250 amount of time if the buffer is not full yet to decrease
1251 load on the usb bus.
1253 \param ftdi pointer to ftdi_context
1254 \param latency Value between 1 and 255
1257 \retval -1: latency out of range
1258 \retval -2: unable to set latency timer
1260 int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
1262 unsigned short usb_val;
1265 ftdi_error_return(-1, "latency out of range. Only valid for 1-255");
1268 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x09, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1269 ftdi_error_return(-2, "unable to set latency timer");
1277 \param ftdi pointer to ftdi_context
1278 \param latency Pointer to store latency value in
1281 \retval -1: unable to get latency timer
1283 int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency)
1285 unsigned short usb_val;
1286 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x0A, 0, ftdi->index, (char *)&usb_val, 1, ftdi->usb_read_timeout) != 1)
1287 ftdi_error_return(-1, "reading latency timer failed");
1289 *latency = (unsigned char)usb_val;
1296 \param ftdi pointer to ftdi_context
1297 \param eeprom Pointer to ftdi_eeprom
1301 void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size)
1303 ftdi->eeprom_size=size;
1308 Init eeprom with default values.
1310 \param eeprom Pointer to ftdi_eeprom
1312 void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
1314 eeprom->vendor_id = 0x0403;
1315 eeprom->product_id = 0x6001;
1317 eeprom->self_powered = 1;
1318 eeprom->remote_wakeup = 1;
1319 eeprom->BM_type_chip = 1;
1321 eeprom->in_is_isochronous = 0;
1322 eeprom->out_is_isochronous = 0;
1323 eeprom->suspend_pull_downs = 0;
1325 eeprom->use_serial = 0;
1326 eeprom->change_usb_version = 0;
1327 eeprom->usb_version = 0x0200;
1328 eeprom->max_power = 0;
1330 eeprom->manufacturer = NULL;
1331 eeprom->product = NULL;
1332 eeprom->serial = NULL;
1334 eeprom->size = FTDI_DEFAULT_EEPROM_SIZE;
1338 Build binary output from ftdi_eeprom structure.
1339 Output is suitable for ftdi_write_eeprom().
1341 \param eeprom Pointer to ftdi_eeprom
1342 \param output Buffer of 128 bytes to store eeprom image to
1344 \retval >0: used eeprom size
1345 \retval -1: eeprom size (128 bytes) exceeded by custom strings
1347 int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
1350 unsigned short checksum, value;
1351 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
1354 if (eeprom->manufacturer != NULL)
1355 manufacturer_size = strlen(eeprom->manufacturer);
1356 if (eeprom->product != NULL)
1357 product_size = strlen(eeprom->product);
1358 if (eeprom->serial != NULL)
1359 serial_size = strlen(eeprom->serial);
1361 size_check = eeprom->size;
1362 size_check -= 28; // 28 are always in use (fixed)
1364 // Top half of a 256byte eeprom is used just for strings and checksum
1365 // it seems that the FTDI chip will not read these strings from the lower half
1366 // Each string starts with two bytes; offset and type (0x03 for string)
1367 // the checksum needs two bytes, so without the string data that 8 bytes from the top half
1368 if(eeprom->size>=256)size_check = 120;
1369 size_check -= manufacturer_size*2;
1370 size_check -= product_size*2;
1371 size_check -= serial_size*2;
1373 // eeprom size exceeded?
1378 memset (output, 0, eeprom->size);
1380 // Addr 00: Stay 00 00
1381 // Addr 02: Vendor ID
1382 output[0x02] = eeprom->vendor_id;
1383 output[0x03] = eeprom->vendor_id >> 8;
1385 // Addr 04: Product ID
1386 output[0x04] = eeprom->product_id;
1387 output[0x05] = eeprom->product_id >> 8;
1389 // Addr 06: Device release number (0400h for BM features)
1390 output[0x06] = 0x00;
1392 if (eeprom->BM_type_chip == 1)
1393 output[0x07] = 0x04;
1395 output[0x07] = 0x02;
1397 // Addr 08: Config descriptor
1398 // Bit 1: remote wakeup if 1
1399 // Bit 0: self powered if 1
1402 if (eeprom->self_powered == 1)
1404 if (eeprom->remote_wakeup == 1)
1408 // Addr 09: Max power consumption: max power = value * 2 mA
1409 output[0x09] = eeprom->max_power;
1412 // Addr 0A: Chip configuration
1413 // Bit 7: 0 - reserved
1414 // Bit 6: 0 - reserved
1415 // Bit 5: 0 - reserved
1416 // Bit 4: 1 - Change USB version
1417 // Bit 3: 1 - Use the serial number string
1418 // Bit 2: 1 - Enable suspend pull downs for lower power
1419 // Bit 1: 1 - Out EndPoint is Isochronous
1420 // Bit 0: 1 - In EndPoint is Isochronous
1423 if (eeprom->in_is_isochronous == 1)
1425 if (eeprom->out_is_isochronous == 1)
1427 if (eeprom->suspend_pull_downs == 1)
1429 if (eeprom->use_serial == 1)
1431 if (eeprom->change_usb_version == 1)
1435 // Addr 0B: reserved
1436 output[0x0B] = 0x00;
1438 // Addr 0C: USB version low byte when 0x0A bit 4 is set
1439 // Addr 0D: USB version high byte when 0x0A bit 4 is set
1440 if (eeprom->change_usb_version == 1) {
1441 output[0x0C] = eeprom->usb_version;
1442 output[0x0D] = eeprom->usb_version >> 8;
1446 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
1447 // Addr 0F: Length of manufacturer string
1448 output[0x0F] = manufacturer_size*2 + 2;
1450 // Addr 10: Offset of the product string + 0x80, calculated later
1451 // Addr 11: Length of product string
1452 output[0x11] = product_size*2 + 2;
1454 // Addr 12: Offset of the serial string + 0x80, calculated later
1455 // Addr 13: Length of serial string
1456 output[0x13] = serial_size*2 + 2;
1460 if(eeprom->size>=256) i = 0x80;
1463 // Output manufacturer
1464 output[0x0E] = i | 0x80; // calculate offset
1465 output[i++] = manufacturer_size*2 + 2;
1466 output[i++] = 0x03; // type: string
1467 for (j = 0; j < manufacturer_size; j++) {
1468 output[i] = eeprom->manufacturer[j], i++;
1469 output[i] = 0x00, i++;
1472 // Output product name
1473 output[0x10] = i | 0x80; // calculate offset
1474 output[i] = product_size*2 + 2, i++;
1475 output[i] = 0x03, i++;
1476 for (j = 0; j < product_size; j++) {
1477 output[i] = eeprom->product[j], i++;
1478 output[i] = 0x00, i++;
1482 output[0x12] = i | 0x80; // calculate offset
1483 output[i] = serial_size*2 + 2, i++;
1484 output[i] = 0x03, i++;
1485 for (j = 0; j < serial_size; j++) {
1486 output[i] = eeprom->serial[j], i++;
1487 output[i] = 0x00, i++;
1490 // calculate checksum
1493 for (i = 0; i < eeprom->size/2-1; i++) {
1494 value = output[i*2];
1495 value += output[(i*2)+1] << 8;
1497 checksum = value^checksum;
1498 checksum = (checksum << 1) | (checksum >> 15);
1501 output[eeprom->size-2] = checksum;
1502 output[eeprom->size-1] = checksum >> 8;
1510 \param ftdi pointer to ftdi_context
1511 \param eeprom Pointer to store eeprom into
1514 \retval -1: read failed
1516 int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
1520 for (i = 0; i < ftdi->eeprom_size/2; i++) {
1521 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
1522 ftdi_error_return(-1, "reading eeprom failed");
1529 ftdi_read_chipid_shift does the bitshift operation needed for the FTDIChip-ID
1530 Function is only used internally
1533 static unsigned char ftdi_read_chipid_shift(unsigned char value)
1535 return ((value & 1) << 1) |
1536 ((value & 2) << 5) |
1537 ((value & 4) >> 2) |
1538 ((value & 8) << 4) |
1539 ((value & 16) >> 1) |
1540 ((value & 32) >> 1) |
1541 ((value & 64) >> 4) |
1542 ((value & 128) >> 2);
1546 Read the FTDIChip-ID from R-type devices
1548 \param ftdi pointer to ftdi_context
1549 \param chipid Pointer to store FTDIChip-ID
1552 \retval -1: read failed
1554 int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid)
1556 unsigned int a = 0, b = 0;
1558 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, 0x43, (char *)&a, 2, ftdi->usb_read_timeout) == 2)
1560 a = a << 8 | a >> 8;
1561 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, 0x44, (char *)&b, 2, ftdi->usb_read_timeout) == 2)
1563 b = b << 8 | b >> 8;
1565 a = ftdi_read_chipid_shift(a) | ftdi_read_chipid_shift(a>>8)<<8
1566 | ftdi_read_chipid_shift(a>>16)<<16 | ftdi_read_chipid_shift(a>>24)<<24;
1567 *chipid = a ^ 0xa5f0f7d1;
1572 ftdi_error_return(-1, "read of FTDIChip-ID failed");
1576 Guesses size of eeprom by reading eeprom and comparing halves - will not work with blank eeprom
1577 Call this function then do a write then call again to see if size changes, if so write again.
1579 \param ftdi pointer to ftdi_context
1580 \param eeprom Pointer to store eeprom into
1581 \param maxsize the size of the buffer to read into
1583 \retval size of eeprom
1585 int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize)
1587 int i=0,j,minsize=32;
1591 for (j = 0; i < maxsize/2 && j<size; j++) {
1592 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
1593 ftdi_error_return(-1, "reading eeprom failed");
1597 }while(size<=maxsize && memcmp(eeprom,&eeprom[size/2],size/2)!=0);
1605 \param ftdi pointer to ftdi_context
1606 \param eeprom Pointer to read eeprom from
1609 \retval -1: read failed
1611 int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
1613 unsigned short usb_val;
1616 for (i = 0; i < ftdi->eeprom_size/2; i++) {
1617 usb_val = eeprom[i*2];
1618 usb_val += eeprom[(i*2)+1] << 8;
1619 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x91, usb_val, i, NULL, 0, ftdi->usb_write_timeout) != 0)
1620 ftdi_error_return(-1, "unable to write eeprom");
1629 \param ftdi pointer to ftdi_context
1632 \retval -1: erase failed
1634 int ftdi_erase_eeprom(struct ftdi_context *ftdi)
1636 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x92, 0, 0, NULL, 0, ftdi->usb_write_timeout) != 0)
1637 ftdi_error_return(-1, "unable to erase eeprom");
1643 Get string representation for last error code
1645 \param ftdi pointer to ftdi_context
1647 \retval Pointer to error string
1649 char *ftdi_get_error_string (struct ftdi_context *ftdi)
1651 return ftdi->error_str;
1655 Flow control code by Lorenz Moesenlechner (lorenz@hcilab.org)
1656 and Matthias Kranz (matthias@hcilab.org)
1659 Set flowcontrol for ftdi chip
1661 \param ftdi pointer to ftdi_context
1662 \param flowctrl flow control to use. should be
1663 SIO_DISABLE_FLOW_CTRL, SIO_RTS_CTS_HS, SIO_DTR_DSR_HS or SIO_XON_XOFF_HS
1666 \retval -1: set flow control failed
1668 int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl)
1670 if (usb_control_msg(ftdi->usb_dev, SIO_SET_FLOW_CTRL_REQUEST_TYPE,
1671 SIO_SET_FLOW_CTRL_REQUEST, 0, (flowctrl | ftdi->interface),
1672 NULL, 0, ftdi->usb_write_timeout) != 0)
1673 ftdi_error_return(-1, "set flow control failed");
1681 \param ftdi pointer to ftdi_context
1682 \param state state to set line to (1 or 0)
1685 \retval -1: set dtr failed
1687 int ftdi_setdtr(struct ftdi_context *ftdi, int state)
1689 unsigned short usb_val;
1692 usb_val = SIO_SET_DTR_HIGH;
1694 usb_val = SIO_SET_DTR_LOW;
1696 if (usb_control_msg(ftdi->usb_dev, SIO_SET_MODEM_CTRL_REQUEST_TYPE,
1697 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->interface,
1698 NULL, 0, ftdi->usb_write_timeout) != 0)
1699 ftdi_error_return(-1, "set dtr failed");
1707 \param ftdi pointer to ftdi_context
1708 \param state state to set line to (1 or 0)
1711 \retval -1 set rts failed
1713 int ftdi_setrts(struct ftdi_context *ftdi, int state)
1715 unsigned short usb_val;
1718 usb_val = SIO_SET_RTS_HIGH;
1720 usb_val = SIO_SET_RTS_LOW;
1722 if (usb_control_msg(ftdi->usb_dev, SIO_SET_MODEM_CTRL_REQUEST_TYPE,
1723 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->interface,
1724 NULL, 0, ftdi->usb_write_timeout) != 0)
1725 ftdi_error_return(-1, "set of rts failed");
1730 /* @} end of doxygen libftdi group */