1 /***************************************************************************
5 copyright : (C) 2003-2010 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/en/developer/libftdi/
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 */
39 #define ftdi_error_return(code, str) do { \
40 ftdi->error_str = str; \
46 Internal function to close usb device pointer.
47 Sets ftdi->usb_dev to NULL.
50 \param ftdi pointer to ftdi_context
54 static void ftdi_usb_close_internal (struct ftdi_context *ftdi)
56 if (ftdi && ftdi->usb_dev)
58 libusb_close (ftdi->usb_dev);
64 Initializes a ftdi_context.
66 \param ftdi pointer to ftdi_context
69 \retval -1: couldn't allocate read buffer
71 \remark This should be called before all functions
73 int ftdi_init(struct ftdi_context *ftdi)
76 ftdi->usb_read_timeout = 5000;
77 ftdi->usb_write_timeout = 5000;
79 ftdi->type = TYPE_BM; /* chip type */
81 ftdi->bitbang_enabled = 0; /* 0: normal mode 1: any of the bitbang modes enabled */
83 ftdi->readbuffer = NULL;
84 ftdi->readbuffer_offset = 0;
85 ftdi->readbuffer_remaining = 0;
86 ftdi->writebuffer_chunksize = 4096;
87 ftdi->max_packet_size = 0;
93 ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode */
95 ftdi->error_str = NULL;
97 ftdi->eeprom_size = FTDI_DEFAULT_EEPROM_SIZE;
99 /* All fine. Now allocate the readbuffer */
100 return ftdi_read_data_set_chunksize(ftdi, 4096);
104 Allocate and initialize a new ftdi_context
106 \return a pointer to a new ftdi_context, or NULL on failure
108 struct ftdi_context *ftdi_new(void)
110 struct ftdi_context * ftdi = (struct ftdi_context *)malloc(sizeof(struct ftdi_context));
117 if (ftdi_init(ftdi) != 0)
127 Open selected channels on a chip, otherwise use first channel.
129 \param ftdi pointer to ftdi_context
130 \param interface Interface to use for FT2232C/2232H/4232H chips.
133 \retval -1: unknown interface
134 \retval -2: USB device unavailable
136 int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)
139 ftdi_error_return(-2, "USB device unavailable");
145 /* ftdi_usb_open_desc cares to set the right index, depending on the found chip */
149 ftdi->index = INTERFACE_B;
155 ftdi->index = INTERFACE_C;
161 ftdi->index = INTERFACE_D;
166 ftdi_error_return(-1, "Unknown interface");
172 Deinitializes a ftdi_context.
174 \param ftdi pointer to ftdi_context
176 void ftdi_deinit(struct ftdi_context *ftdi)
181 ftdi_usb_close_internal (ftdi);
183 if (ftdi->readbuffer != NULL)
185 free(ftdi->readbuffer);
186 ftdi->readbuffer = NULL;
192 Deinitialize and free an ftdi_context.
194 \param ftdi pointer to ftdi_context
196 void ftdi_free(struct ftdi_context *ftdi)
203 Use an already open libusb device.
205 \param ftdi pointer to ftdi_context
206 \param usb libusb libusb_device_handle to use
208 void ftdi_set_usbdev (struct ftdi_context *ftdi, libusb_device_handle *usb)
218 Finds all ftdi devices on the usb bus. Creates a new ftdi_device_list which
219 needs to be deallocated by ftdi_list_free() after use.
221 \param ftdi pointer to ftdi_context
222 \param devlist Pointer where to store list of found devices
223 \param vendor Vendor ID to search for
224 \param product Product ID to search for
226 \retval >0: number of devices found
227 \retval -3: out of memory
228 \retval -4: libusb_init() failed
229 \retval -5: libusb_get_device_list() failed
230 \retval -6: libusb_get_device_descriptor() failed
232 int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product)
234 struct ftdi_device_list **curdev;
236 libusb_device **devs;
240 if (libusb_init(NULL) < 0)
241 ftdi_error_return(-4, "libusb_init() failed");
243 if (libusb_get_device_list(NULL, &devs) < 0)
244 ftdi_error_return(-5, "libusb_get_device_list() failed");
249 while ((dev = devs[i++]) != NULL)
251 struct libusb_device_descriptor desc;
253 if (libusb_get_device_descriptor(dev, &desc) < 0)
254 ftdi_error_return(-6, "libusb_get_device_descriptor() failed");
256 if (desc.idVendor == vendor && desc.idProduct == product)
258 *curdev = (struct ftdi_device_list*)malloc(sizeof(struct ftdi_device_list));
260 ftdi_error_return(-3, "out of memory");
262 (*curdev)->next = NULL;
263 (*curdev)->dev = dev;
265 curdev = &(*curdev)->next;
274 Frees a usb device list.
276 \param devlist USB device list created by ftdi_usb_find_all()
278 void ftdi_list_free(struct ftdi_device_list **devlist)
280 struct ftdi_device_list *curdev, *next;
282 for (curdev = *devlist; curdev != NULL;)
293 Frees a usb device list.
295 \param devlist USB device list created by ftdi_usb_find_all()
297 void ftdi_list_free2(struct ftdi_device_list *devlist)
299 ftdi_list_free(&devlist);
303 Return device ID strings from the usb device.
305 The parameters manufacturer, description and serial may be NULL
306 or pointer to buffers to store the fetched strings.
308 \note Use this function only in combination with ftdi_usb_find_all()
309 as it closes the internal "usb_dev" after use.
311 \param ftdi pointer to ftdi_context
312 \param dev libusb usb_dev to use
313 \param manufacturer Store manufacturer string here if not NULL
314 \param mnf_len Buffer size of manufacturer string
315 \param description Store product description string here if not NULL
316 \param desc_len Buffer size of product description string
317 \param serial Store serial string here if not NULL
318 \param serial_len Buffer size of serial string
321 \retval -1: wrong arguments
322 \retval -4: unable to open device
323 \retval -7: get product manufacturer failed
324 \retval -8: get product description failed
325 \retval -9: get serial number failed
326 \retval -11: libusb_get_device_descriptor() failed
328 int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct libusb_device * dev,
329 char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len)
331 struct libusb_device_descriptor desc;
333 if ((ftdi==NULL) || (dev==NULL))
336 if (libusb_open(dev, &ftdi->usb_dev) < 0)
337 ftdi_error_return(-4, "libusb_open() failed");
339 if (libusb_get_device_descriptor(dev, &desc) < 0)
340 ftdi_error_return(-11, "libusb_get_device_descriptor() failed");
342 if (manufacturer != NULL)
344 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iManufacturer, (unsigned char *)manufacturer, mnf_len) < 0)
346 ftdi_usb_close_internal (ftdi);
347 ftdi_error_return(-7, "libusb_get_string_descriptor_ascii() failed");
351 if (description != NULL)
353 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)description, desc_len) < 0)
355 ftdi_usb_close_internal (ftdi);
356 ftdi_error_return(-8, "libusb_get_string_descriptor_ascii() failed");
362 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)serial, serial_len) < 0)
364 ftdi_usb_close_internal (ftdi);
365 ftdi_error_return(-9, "libusb_get_string_descriptor_ascii() failed");
369 ftdi_usb_close_internal (ftdi);
375 * Internal function to determine the maximum packet size.
376 * \param ftdi pointer to ftdi_context
377 * \param dev libusb usb_dev to use
378 * \retval Maximum packet size for this device
380 static unsigned int _ftdi_determine_max_packet_size(struct ftdi_context *ftdi, libusb_device *dev)
382 struct libusb_device_descriptor desc;
383 struct libusb_config_descriptor *config0;
384 unsigned int packet_size;
387 if (ftdi == NULL || dev == NULL)
390 // Determine maximum packet size. Init with default value.
391 // New hi-speed devices from FTDI use a packet size of 512 bytes
392 // but could be connected to a normal speed USB hub -> 64 bytes packet size.
393 if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H)
398 if (libusb_get_device_descriptor(dev, &desc) < 0)
401 if (libusb_get_config_descriptor(dev, 0, &config0) < 0)
404 if (desc.bNumConfigurations > 0)
406 if (ftdi->interface < config0->bNumInterfaces)
408 struct libusb_interface interface = config0->interface[ftdi->interface];
409 if (interface.num_altsetting > 0)
411 struct libusb_interface_descriptor descriptor = interface.altsetting[0];
412 if (descriptor.bNumEndpoints > 0)
414 packet_size = descriptor.endpoint[0].wMaxPacketSize;
420 libusb_free_config_descriptor (config0);
425 Opens a ftdi device given by an usb_device.
427 \param ftdi pointer to ftdi_context
428 \param dev libusb usb_dev to use
431 \retval -3: unable to config device
432 \retval -4: unable to open device
433 \retval -5: unable to claim device
434 \retval -6: reset failed
435 \retval -7: set baudrate failed
436 \retval -8: ftdi context invalid
437 \retval -9: libusb_get_device_descriptor() failed
438 \retval -10: libusb_get_config_descriptor() failed
439 \retval -11: libusb_etach_kernel_driver() failed
440 \retval -12: libusb_get_configuration() failed
442 int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev)
444 struct libusb_device_descriptor desc;
445 struct libusb_config_descriptor *config0;
446 int cfg, cfg0, detach_errno = 0;
449 ftdi_error_return(-8, "ftdi context invalid");
451 if (libusb_open(dev, &ftdi->usb_dev) < 0)
452 ftdi_error_return(-4, "libusb_open() failed");
454 if (libusb_get_device_descriptor(dev, &desc) < 0)
455 ftdi_error_return(-9, "libusb_get_device_descriptor() failed");
457 if (libusb_get_config_descriptor(dev, 0, &config0) < 0)
458 ftdi_error_return(-10, "libusb_get_config_descriptor() failed");
459 cfg0 = config0->bConfigurationValue;
460 libusb_free_config_descriptor (config0);
462 // Try to detach ftdi_sio kernel module.
464 // The return code is kept in a separate variable and only parsed
465 // if usb_set_configuration() or usb_claim_interface() fails as the
466 // detach operation might be denied and everything still works fine.
467 // Likely scenario is a static ftdi_sio kernel module.
468 if (libusb_detach_kernel_driver(ftdi->usb_dev, ftdi->interface) !=0)
469 detach_errno = errno;
471 if (libusb_get_configuration (ftdi->usb_dev, &cfg) < 0)
472 ftdi_error_return(-12, "libusb_get_configuration () failed");
473 // set configuration (needed especially for windows)
474 // tolerate EBUSY: one device with one configuration, but two interfaces
475 // and libftdi sessions to both interfaces (e.g. FT2232)
476 if (desc.bNumConfigurations > 0 && cfg != cfg0)
478 if (libusb_set_configuration(ftdi->usb_dev, cfg0) < 0)
480 ftdi_usb_close_internal (ftdi);
481 if(detach_errno == EPERM)
483 ftdi_error_return(-8, "inappropriate permissions on device!");
487 ftdi_error_return(-3, "unable to set usb configuration. Make sure ftdi_sio is unloaded!");
492 if (libusb_claim_interface(ftdi->usb_dev, ftdi->interface) < 0)
494 ftdi_usb_close_internal (ftdi);
495 if(detach_errno == EPERM)
497 ftdi_error_return(-8, "inappropriate permissions on device!");
501 ftdi_error_return(-5, "unable to claim usb device. Make sure ftdi_sio is unloaded!");
505 if (ftdi_usb_reset (ftdi) != 0)
507 ftdi_usb_close_internal (ftdi);
508 ftdi_error_return(-6, "ftdi_usb_reset failed");
511 // Try to guess chip type
512 // Bug in the BM type chips: bcdDevice is 0x200 for serial == 0
513 if (desc.bcdDevice == 0x400 || (desc.bcdDevice == 0x200
514 && desc.iSerialNumber == 0))
515 ftdi->type = TYPE_BM;
516 else if (desc.bcdDevice == 0x200)
517 ftdi->type = TYPE_AM;
518 else if (desc.bcdDevice == 0x500)
519 ftdi->type = TYPE_2232C;
520 else if (desc.bcdDevice == 0x600)
522 else if (desc.bcdDevice == 0x700)
523 ftdi->type = TYPE_2232H;
524 else if (desc.bcdDevice == 0x800)
525 ftdi->type = TYPE_4232H;
527 // Set default interface on dual/quad type chips
534 ftdi->index = INTERFACE_A;
540 // Determine maximum packet size
541 ftdi->max_packet_size = _ftdi_determine_max_packet_size(ftdi, dev);
543 if (ftdi_set_baudrate (ftdi, 9600) != 0)
545 ftdi_usb_close_internal (ftdi);
546 ftdi_error_return(-7, "set baudrate failed");
549 ftdi_error_return(0, "all fine");
553 Opens the first device with a given vendor and product ids.
555 \param ftdi pointer to ftdi_context
556 \param vendor Vendor ID
557 \param product Product ID
559 \retval same as ftdi_usb_open_desc()
561 int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
563 return ftdi_usb_open_desc(ftdi, vendor, product, NULL, NULL);
567 Opens the first device with a given, vendor id, product id,
568 description and serial.
570 \param ftdi pointer to ftdi_context
571 \param vendor Vendor ID
572 \param product Product ID
573 \param description Description to search for. Use NULL if not needed.
574 \param serial Serial to search for. Use NULL if not needed.
577 \retval -3: usb device not found
578 \retval -4: unable to open device
579 \retval -5: unable to claim device
580 \retval -6: reset failed
581 \retval -7: set baudrate failed
582 \retval -8: get product description failed
583 \retval -9: get serial number failed
584 \retval -11: libusb_init() failed
585 \retval -12: libusb_get_device_list() failed
586 \retval -13: libusb_get_device_descriptor() failed
588 int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
589 const char* description, const char* serial)
591 return ftdi_usb_open_desc_index(ftdi,vendor,product,description,serial,0);
595 Opens the index-th device with a given, vendor id, product id,
596 description and serial.
598 \param ftdi pointer to ftdi_context
599 \param vendor Vendor ID
600 \param product Product ID
601 \param description Description to search for. Use NULL if not needed.
602 \param serial Serial to search for. Use NULL if not needed.
603 \param index Number of matching device to open if there are more than one, starts with 0.
606 \retval -1: usb_find_busses() failed
607 \retval -2: usb_find_devices() failed
608 \retval -3: usb device not found
609 \retval -4: unable to open device
610 \retval -5: unable to claim device
611 \retval -6: reset failed
612 \retval -7: set baudrate failed
613 \retval -8: get product description failed
614 \retval -9: get serial number failed
615 \retval -10: unable to close device
616 \retval -11: ftdi context invalid
618 int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,
619 const char* description, const char* serial, unsigned int index)
622 libusb_device **devs;
626 if (libusb_init(NULL) < 0)
627 ftdi_error_return(-11, "libusb_init() failed");
629 if (libusb_get_device_list(NULL, &devs) < 0)
630 ftdi_error_return(-12, "libusb_get_device_list() failed");
633 ftdi_error_return(-11, "ftdi context invalid");
635 while ((dev = devs[i++]) != NULL)
637 struct libusb_device_descriptor desc;
639 if (libusb_get_device_descriptor(dev, &desc) < 0)
640 ftdi_error_return(-13, "libusb_get_device_descriptor() failed");
642 if (desc.idVendor == vendor && desc.idProduct == product)
644 if (libusb_open(dev, &ftdi->usb_dev) < 0)
645 ftdi_error_return(-4, "usb_open() failed");
647 if (description != NULL)
649 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)string, sizeof(string)) < 0)
651 libusb_close (ftdi->usb_dev);
652 ftdi_error_return(-8, "unable to fetch product description");
654 if (strncmp(string, description, sizeof(string)) != 0)
656 libusb_close (ftdi->usb_dev);
662 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)string, sizeof(string)) < 0)
664 ftdi_usb_close_internal (ftdi);
665 ftdi_error_return(-9, "unable to fetch serial number");
667 if (strncmp(string, serial, sizeof(string)) != 0)
669 ftdi_usb_close_internal (ftdi);
674 ftdi_usb_close_internal (ftdi);
682 return ftdi_usb_open_dev(ftdi, dev);
687 ftdi_error_return(-3, "device not found");
691 Opens the ftdi-device described by a description-string.
692 Intended to be used for parsing a device-description given as commandline argument.
694 \param ftdi pointer to ftdi_context
695 \param description NULL-terminated description-string, using this format:
696 \li <tt>d:\<devicenode></tt> path of bus and device-node (e.g. "003/001") within usb device tree (usually at /proc/bus/usb/)
697 \li <tt>i:\<vendor>:\<product></tt> first device with given vendor and product id, ids can be decimal, octal (preceded by "0") or hex (preceded by "0x")
698 \li <tt>i:\<vendor>:\<product>:\<index></tt> as above with index being the number of the device (starting with 0) if there are more than one
699 \li <tt>s:\<vendor>:\<product>:\<serial></tt> first device with given vendor id, product id and serial string
701 \note The description format may be extended in later versions.
704 \retval -1: libusb_init() failed
705 \retval -2: libusb_get_device_list() failed
706 \retval -3: usb device not found
707 \retval -4: unable to open device
708 \retval -5: unable to claim device
709 \retval -6: reset failed
710 \retval -7: set baudrate failed
711 \retval -8: get product description failed
712 \retval -9: get serial number failed
713 \retval -10: unable to close device
714 \retval -11: illegal description format
715 \retval -12: ftdi context invalid
717 int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description)
720 ftdi_error_return(-12, "ftdi context invalid");
722 if (description[0] == 0 || description[1] != ':')
723 ftdi_error_return(-11, "illegal description format");
725 if (description[0] == 'd')
728 libusb_device **devs;
729 unsigned int bus_number, device_address;
732 if (libusb_init (NULL) < 0)
733 ftdi_error_return(-1, "libusb_init() failed");
735 if (libusb_get_device_list(NULL, &devs) < 0)
736 ftdi_error_return(-2, "libusb_get_device_list() failed");
738 /* XXX: This doesn't handle symlinks/odd paths/etc... */
739 if (sscanf (description + 2, "%u/%u", &bus_number, &device_address) != 2)
740 ftdi_error_return(-11, "illegal description format");
742 while ((dev = devs[i++]) != NULL)
744 if (bus_number == libusb_get_bus_number (dev)
745 && device_address == libusb_get_device_address (dev))
746 return ftdi_usb_open_dev(ftdi, dev);
750 ftdi_error_return(-3, "device not found");
752 else if (description[0] == 'i' || description[0] == 's')
755 unsigned int product;
756 unsigned int index=0;
757 const char *serial=NULL;
758 const char *startp, *endp;
761 startp=description+2;
762 vendor=strtoul((char*)startp,(char**)&endp,0);
763 if (*endp != ':' || endp == startp || errno != 0)
764 ftdi_error_return(-11, "illegal description format");
767 product=strtoul((char*)startp,(char**)&endp,0);
768 if (endp == startp || errno != 0)
769 ftdi_error_return(-11, "illegal description format");
771 if (description[0] == 'i' && *endp != 0)
773 /* optional index field in i-mode */
775 ftdi_error_return(-11, "illegal description format");
778 index=strtoul((char*)startp,(char**)&endp,0);
779 if (*endp != 0 || endp == startp || errno != 0)
780 ftdi_error_return(-11, "illegal description format");
782 if (description[0] == 's')
785 ftdi_error_return(-11, "illegal description format");
787 /* rest of the description is the serial */
791 return ftdi_usb_open_desc_index(ftdi, vendor, product, NULL, serial, index);
795 ftdi_error_return(-11, "illegal description format");
800 Resets the ftdi device.
802 \param ftdi pointer to ftdi_context
805 \retval -1: FTDI reset failed
806 \retval -2: USB device unavailable
808 int ftdi_usb_reset(struct ftdi_context *ftdi)
810 if (ftdi == NULL || ftdi->usb_dev == NULL)
811 ftdi_error_return(-2, "USB device unavailable");
813 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
814 SIO_RESET_REQUEST, SIO_RESET_SIO,
815 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
816 ftdi_error_return(-1,"FTDI reset failed");
818 // Invalidate data in the readbuffer
819 ftdi->readbuffer_offset = 0;
820 ftdi->readbuffer_remaining = 0;
826 Clears the read buffer on the chip and the internal read buffer.
828 \param ftdi pointer to ftdi_context
831 \retval -1: read buffer purge failed
832 \retval -2: USB device unavailable
834 int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi)
836 if (ftdi == NULL || ftdi->usb_dev == NULL)
837 ftdi_error_return(-2, "USB device unavailable");
839 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
840 SIO_RESET_REQUEST, SIO_RESET_PURGE_RX,
841 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
842 ftdi_error_return(-1, "FTDI purge of RX buffer failed");
844 // Invalidate data in the readbuffer
845 ftdi->readbuffer_offset = 0;
846 ftdi->readbuffer_remaining = 0;
852 Clears the write buffer on the chip.
854 \param ftdi pointer to ftdi_context
857 \retval -1: write buffer purge failed
858 \retval -2: USB device unavailable
860 int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi)
862 if (ftdi == NULL || ftdi->usb_dev == NULL)
863 ftdi_error_return(-2, "USB device unavailable");
865 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
866 SIO_RESET_REQUEST, SIO_RESET_PURGE_TX,
867 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
868 ftdi_error_return(-1, "FTDI purge of TX buffer failed");
874 Clears the buffers on the chip and the internal read buffer.
876 \param ftdi pointer to ftdi_context
879 \retval -1: read buffer purge failed
880 \retval -2: write buffer purge failed
881 \retval -3: USB device unavailable
883 int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)
887 if (ftdi == NULL || ftdi->usb_dev == NULL)
888 ftdi_error_return(-3, "USB device unavailable");
890 result = ftdi_usb_purge_rx_buffer(ftdi);
894 result = ftdi_usb_purge_tx_buffer(ftdi);
904 Closes the ftdi device. Call ftdi_deinit() if you're cleaning up.
906 \param ftdi pointer to ftdi_context
909 \retval -1: usb_release failed
910 \retval -3: ftdi context invalid
912 int ftdi_usb_close(struct ftdi_context *ftdi)
917 ftdi_error_return(-3, "ftdi context invalid");
919 if (ftdi->usb_dev != NULL)
920 if (libusb_release_interface(ftdi->usb_dev, ftdi->interface) < 0)
923 ftdi_usb_close_internal (ftdi);
929 ftdi_convert_baudrate returns nearest supported baud rate to that requested.
930 Function is only used internally
933 static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
934 unsigned short *value, unsigned short *index)
936 static const char am_adjust_up[8] = {0, 0, 0, 1, 0, 3, 2, 1};
937 static const char am_adjust_dn[8] = {0, 0, 0, 1, 0, 1, 2, 3};
938 static const char frac_code[8] = {0, 3, 2, 4, 1, 5, 6, 7};
939 int divisor, best_divisor, best_baud, best_baud_diff;
940 unsigned long encoded_divisor;
949 divisor = 24000000 / baudrate;
951 if (ftdi->type == TYPE_AM)
953 // Round down to supported fraction (AM only)
954 divisor -= am_adjust_dn[divisor & 7];
957 // Try this divisor and the one above it (because division rounds down)
961 for (i = 0; i < 2; i++)
963 int try_divisor = divisor + i;
967 // Round up to supported divisor value
968 if (try_divisor <= 8)
970 // Round up to minimum supported divisor
973 else if (ftdi->type != TYPE_AM && try_divisor < 12)
975 // BM doesn't support divisors 9 through 11 inclusive
978 else if (divisor < 16)
980 // AM doesn't support divisors 9 through 15 inclusive
985 if (ftdi->type == TYPE_AM)
987 // Round up to supported fraction (AM only)
988 try_divisor += am_adjust_up[try_divisor & 7];
989 if (try_divisor > 0x1FFF8)
991 // Round down to maximum supported divisor value (for AM)
992 try_divisor = 0x1FFF8;
997 if (try_divisor > 0x1FFFF)
999 // Round down to maximum supported divisor value (for BM)
1000 try_divisor = 0x1FFFF;
1004 // Get estimated baud rate (to nearest integer)
1005 baud_estimate = (24000000 + (try_divisor / 2)) / try_divisor;
1006 // Get absolute difference from requested baud rate
1007 if (baud_estimate < baudrate)
1009 baud_diff = baudrate - baud_estimate;
1013 baud_diff = baud_estimate - baudrate;
1015 if (i == 0 || baud_diff < best_baud_diff)
1017 // Closest to requested baud rate so far
1018 best_divisor = try_divisor;
1019 best_baud = baud_estimate;
1020 best_baud_diff = baud_diff;
1023 // Spot on! No point trying
1028 // Encode the best divisor value
1029 encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 7] << 14);
1030 // Deal with special cases for encoded value
1031 if (encoded_divisor == 1)
1033 encoded_divisor = 0; // 3000000 baud
1035 else if (encoded_divisor == 0x4001)
1037 encoded_divisor = 1; // 2000000 baud (BM only)
1039 // Split into "value" and "index" values
1040 *value = (unsigned short)(encoded_divisor & 0xFFFF);
1041 if (ftdi->type == TYPE_2232C || ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H)
1043 *index = (unsigned short)(encoded_divisor >> 8);
1045 *index |= ftdi->index;
1048 *index = (unsigned short)(encoded_divisor >> 16);
1050 // Return the nearest baud rate
1055 Sets the chip baud rate
1057 \param ftdi pointer to ftdi_context
1058 \param baudrate baud rate to set
1061 \retval -1: invalid baudrate
1062 \retval -2: setting baudrate failed
1063 \retval -3: USB device unavailable
1065 int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
1067 unsigned short value, index;
1068 int actual_baudrate;
1070 if (ftdi == NULL || ftdi->usb_dev == NULL)
1071 ftdi_error_return(-3, "USB device unavailable");
1073 if (ftdi->bitbang_enabled)
1075 baudrate = baudrate*4;
1078 actual_baudrate = ftdi_convert_baudrate(baudrate, ftdi, &value, &index);
1079 if (actual_baudrate <= 0)
1080 ftdi_error_return (-1, "Silly baudrate <= 0.");
1082 // Check within tolerance (about 5%)
1083 if ((actual_baudrate * 2 < baudrate /* Catch overflows */ )
1084 || ((actual_baudrate < baudrate)
1085 ? (actual_baudrate * 21 < baudrate * 20)
1086 : (baudrate * 21 < actual_baudrate * 20)))
1087 ftdi_error_return (-1, "Unsupported baudrate. Note: bitbang baudrates are automatically multiplied by 4");
1089 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1090 SIO_SET_BAUDRATE_REQUEST, value,
1091 index, NULL, 0, ftdi->usb_write_timeout) < 0)
1092 ftdi_error_return (-2, "Setting new baudrate failed");
1094 ftdi->baudrate = baudrate;
1099 Set (RS232) line characteristics.
1100 The break type can only be set via ftdi_set_line_property2()
1101 and defaults to "off".
1103 \param ftdi pointer to ftdi_context
1104 \param bits Number of bits
1105 \param sbit Number of stop bits
1106 \param parity Parity mode
1109 \retval -1: Setting line property failed
1111 int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
1112 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
1114 return ftdi_set_line_property2(ftdi, bits, sbit, parity, BREAK_OFF);
1118 Set (RS232) line characteristics
1120 \param ftdi pointer to ftdi_context
1121 \param bits Number of bits
1122 \param sbit Number of stop bits
1123 \param parity Parity mode
1124 \param break_type Break type
1127 \retval -1: Setting line property failed
1128 \retval -2: USB device unavailable
1130 int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
1131 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
1132 enum ftdi_break_type break_type)
1134 unsigned short value = bits;
1136 if (ftdi == NULL || ftdi->usb_dev == NULL)
1137 ftdi_error_return(-2, "USB device unavailable");
1142 value |= (0x00 << 8);
1145 value |= (0x01 << 8);
1148 value |= (0x02 << 8);
1151 value |= (0x03 << 8);
1154 value |= (0x04 << 8);
1161 value |= (0x00 << 11);
1164 value |= (0x01 << 11);
1167 value |= (0x02 << 11);
1174 value |= (0x00 << 14);
1177 value |= (0x01 << 14);
1181 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1182 SIO_SET_DATA_REQUEST, value,
1183 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1184 ftdi_error_return (-1, "Setting new line property failed");
1190 Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip
1192 \param ftdi pointer to ftdi_context
1193 \param buf Buffer with the data
1194 \param size Size of the buffer
1196 \retval -666: USB device unavailable
1197 \retval <0: error code from usb_bulk_write()
1198 \retval >0: number of bytes written
1200 int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1205 if (ftdi == NULL || ftdi->usb_dev == NULL)
1206 ftdi_error_return(-666, "USB device unavailable");
1208 while (offset < size)
1210 int write_size = ftdi->writebuffer_chunksize;
1212 if (offset+write_size > size)
1213 write_size = size-offset;
1215 if (libusb_bulk_transfer(ftdi->usb_dev, ftdi->in_ep, buf+offset, write_size, &actual_length, ftdi->usb_write_timeout) < 0)
1216 ftdi_error_return(-1, "usb bulk write failed");
1218 offset += actual_length;
1224 #ifdef LIBFTDI_LINUX_ASYNC_MODE
1225 #ifdef USB_CLASS_PTP
1226 #error LIBFTDI_LINUX_ASYNC_MODE is not compatible with libusb-compat-0.1!
1228 static void ftdi_read_data_cb(struct libusb_transfer *transfer)
1230 struct ftdi_transfer_control *tc = (struct ftdi_transfer_control *) transfer->user_data;
1231 struct ftdi_context *ftdi = tc->ftdi;
1232 int packet_size, actual_length, num_of_chunks, chunk_remains, i, ret;
1234 packet_size = ftdi->max_packet_size;
1236 actual_length = transfer->actual_length;
1238 if (actual_length > 2)
1240 // skip FTDI status bytes.
1241 // Maybe stored in the future to enable modem use
1242 num_of_chunks = actual_length / packet_size;
1243 chunk_remains = actual_length % packet_size;
1244 //printf("actual_length = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", actual_length, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1246 ftdi->readbuffer_offset += 2;
1249 if (actual_length > packet_size - 2)
1251 for (i = 1; i < num_of_chunks; i++)
1252 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1253 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1255 if (chunk_remains > 2)
1257 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1258 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1260 actual_length -= 2*num_of_chunks;
1263 actual_length -= 2*(num_of_chunks-1)+chunk_remains;
1266 if (actual_length > 0)
1268 // data still fits in buf?
1269 if (tc->offset + actual_length <= tc->size)
1271 memcpy (tc->buf + tc->offset, ftdi->readbuffer + ftdi->readbuffer_offset, actual_length);
1272 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
1273 tc->offset += actual_length;
1275 ftdi->readbuffer_offset = 0;
1276 ftdi->readbuffer_remaining = 0;
1278 /* Did we read exactly the right amount of bytes? */
1279 if (tc->offset == tc->size)
1281 //printf("read_data exact rem %d offset %d\n",
1282 //ftdi->readbuffer_remaining, offset);
1289 // only copy part of the data or size <= readbuffer_chunksize
1290 int part_size = tc->size - tc->offset;
1291 memcpy (tc->buf + tc->offset, ftdi->readbuffer + ftdi->readbuffer_offset, part_size);
1292 tc->offset += part_size;
1294 ftdi->readbuffer_offset += part_size;
1295 ftdi->readbuffer_remaining = actual_length - part_size;
1297 /* printf("Returning part: %d - size: %d - offset: %d - actual_length: %d - remaining: %d\n",
1298 part_size, size, offset, actual_length, ftdi->readbuffer_remaining); */
1304 ret = libusb_submit_transfer (transfer);
1310 static void ftdi_write_data_cb(struct libusb_transfer *transfer)
1312 struct ftdi_transfer_control *tc = (struct ftdi_transfer_control *) transfer->user_data;
1313 struct ftdi_context *ftdi = tc->ftdi;
1315 tc->offset = transfer->actual_length;
1317 if (tc->offset == tc->size)
1323 int write_size = ftdi->writebuffer_chunksize;
1326 if (tc->offset + write_size > tc->size)
1327 write_size = tc->size - tc->offset;
1329 transfer->length = write_size;
1330 transfer->buffer = tc->buf + tc->offset;
1331 ret = libusb_submit_transfer (transfer);
1339 Writes data to the chip. Does not wait for completion of the transfer
1340 nor does it make sure that the transfer was successful.
1342 Use libusb 1.0 Asynchronous API.
1343 Only available if compiled with --with-async-mode.
1345 \param ftdi pointer to ftdi_context
1346 \param buf Buffer with the data
1347 \param size Size of the buffer
1349 \retval NULL: Some error happens when submit transfer
1350 \retval !NULL: Pointer to a ftdi_transfer_control
1353 struct ftdi_transfer_control *ftdi_write_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size)
1355 struct ftdi_transfer_control *tc;
1356 struct libusb_transfer *transfer = libusb_alloc_transfer(0);
1357 int write_size, ret;
1359 if (ftdi == NULL || ftdi->usb_dev == NULL)
1361 libusb_free_transfer(transfer);
1365 tc = (struct ftdi_transfer_control *) malloc (sizeof (*tc));
1367 if (!tc || !transfer)
1376 if (size < ftdi->writebuffer_chunksize)
1379 write_size = ftdi->writebuffer_chunksize;
1381 libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->in_ep, buf, write_size, ftdi_write_data_cb, tc, ftdi->usb_write_timeout);
1382 transfer->type = LIBUSB_TRANSFER_TYPE_BULK;
1384 ret = libusb_submit_transfer(transfer);
1387 libusb_free_transfer(transfer);
1389 tc->transfer = NULL;
1392 tc->transfer = transfer;
1398 Reads data from the chip. Does not wait for completion of the transfer
1399 nor does it make sure that the transfer was successful.
1401 Use libusb 1.0 Asynchronous API.
1402 Only available if compiled with --with-async-mode.
1404 \param ftdi pointer to ftdi_context
1405 \param buf Buffer with the data
1406 \param size Size of the buffer
1408 \retval NULL: Some error happens when submit transfer
1409 \retval !NULL: Pointer to a ftdi_transfer_control
1412 struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size)
1414 struct ftdi_transfer_control *tc;
1415 struct libusb_transfer *transfer;
1418 if (ftdi == NULL || ftdi->usb_dev == NULL)
1421 tc = (struct ftdi_transfer_control *) malloc (sizeof (*tc));
1429 if (size <= ftdi->readbuffer_remaining)
1431 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1434 ftdi->readbuffer_remaining -= size;
1435 ftdi->readbuffer_offset += size;
1437 /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
1441 tc->transfer = NULL;
1446 if (ftdi->readbuffer_remaining != 0)
1448 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
1450 tc->offset = ftdi->readbuffer_remaining;
1455 transfer = libusb_alloc_transfer(0);
1462 ftdi->readbuffer_remaining = 0;
1463 ftdi->readbuffer_offset = 0;
1465 libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, ftdi_read_data_cb, tc, ftdi->usb_read_timeout);
1466 transfer->type = LIBUSB_TRANSFER_TYPE_BULK;
1468 ret = libusb_submit_transfer(transfer);
1471 libusb_free_transfer(transfer);
1475 tc->transfer = transfer;
1481 Wait for completion of the transfer.
1483 Use libusb 1.0 Asynchronous API.
1484 Only available if compiled with --with-async-mode.
1486 \param tc pointer to ftdi_transfer_control
1488 \retval < 0: Some error happens
1489 \retval >= 0: Data size transferred
1492 int ftdi_transfer_data_done(struct ftdi_transfer_control *tc)
1496 while (!tc->completed)
1498 ret = libusb_handle_events(NULL);
1501 if (ret == LIBUSB_ERROR_INTERRUPTED)
1503 libusb_cancel_transfer(tc->transfer);
1504 while (!tc->completed)
1505 if (libusb_handle_events(NULL) < 0)
1507 libusb_free_transfer(tc->transfer);
1514 if (tc->transfer->status == LIBUSB_TRANSFER_COMPLETED)
1519 libusb_free_transfer(tc->transfer);
1524 #endif // LIBFTDI_LINUX_ASYNC_MODE
1527 Configure write buffer chunk size.
1530 \param ftdi pointer to ftdi_context
1531 \param chunksize Chunk size
1534 \retval -1: ftdi context invalid
1536 int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1539 ftdi_error_return(-1, "ftdi context invalid");
1541 ftdi->writebuffer_chunksize = chunksize;
1546 Get write buffer chunk size.
1548 \param ftdi pointer to ftdi_context
1549 \param chunksize Pointer to store chunk size in
1552 \retval -1: ftdi context invalid
1554 int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1557 ftdi_error_return(-1, "ftdi context invalid");
1559 *chunksize = ftdi->writebuffer_chunksize;
1564 Reads data in chunks (see ftdi_read_data_set_chunksize()) from the chip.
1566 Automatically strips the two modem status bytes transfered during every read.
1568 \param ftdi pointer to ftdi_context
1569 \param buf Buffer to store data in
1570 \param size Size of the buffer
1572 \retval -666: USB device unavailable
1573 \retval <0: error code from libusb_bulk_transfer()
1574 \retval 0: no data was available
1575 \retval >0: number of bytes read
1578 int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1580 int offset = 0, ret, i, num_of_chunks, chunk_remains;
1581 int packet_size = ftdi->max_packet_size;
1582 int actual_length = 1;
1584 if (ftdi == NULL || ftdi->usb_dev == NULL)
1585 ftdi_error_return(-666, "USB device unavailable");
1587 // Packet size sanity check (avoid division by zero)
1588 if (packet_size == 0)
1589 ftdi_error_return(-1, "max_packet_size is bogus (zero)");
1591 // everything we want is still in the readbuffer?
1592 if (size <= ftdi->readbuffer_remaining)
1594 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1597 ftdi->readbuffer_remaining -= size;
1598 ftdi->readbuffer_offset += size;
1600 /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
1604 // something still in the readbuffer, but not enough to satisfy 'size'?
1605 if (ftdi->readbuffer_remaining != 0)
1607 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
1610 offset += ftdi->readbuffer_remaining;
1612 // do the actual USB read
1613 while (offset < size && actual_length > 0)
1615 ftdi->readbuffer_remaining = 0;
1616 ftdi->readbuffer_offset = 0;
1617 /* returns how much received */
1618 ret = libusb_bulk_transfer (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, &actual_length, ftdi->usb_read_timeout);
1620 ftdi_error_return(ret, "usb bulk read failed");
1622 if (actual_length > 2)
1624 // skip FTDI status bytes.
1625 // Maybe stored in the future to enable modem use
1626 num_of_chunks = actual_length / packet_size;
1627 chunk_remains = actual_length % packet_size;
1628 //printf("actual_length = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", actual_length, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1630 ftdi->readbuffer_offset += 2;
1633 if (actual_length > packet_size - 2)
1635 for (i = 1; i < num_of_chunks; i++)
1636 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1637 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1639 if (chunk_remains > 2)
1641 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1642 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1644 actual_length -= 2*num_of_chunks;
1647 actual_length -= 2*(num_of_chunks-1)+chunk_remains;
1650 else if (actual_length <= 2)
1652 // no more data to read?
1655 if (actual_length > 0)
1657 // data still fits in buf?
1658 if (offset+actual_length <= size)
1660 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, actual_length);
1661 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
1662 offset += actual_length;
1664 /* Did we read exactly the right amount of bytes? */
1666 //printf("read_data exact rem %d offset %d\n",
1667 //ftdi->readbuffer_remaining, offset);
1672 // only copy part of the data or size <= readbuffer_chunksize
1673 int part_size = size-offset;
1674 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, part_size);
1676 ftdi->readbuffer_offset += part_size;
1677 ftdi->readbuffer_remaining = actual_length-part_size;
1678 offset += part_size;
1680 /* printf("Returning part: %d - size: %d - offset: %d - actual_length: %d - remaining: %d\n",
1681 part_size, size, offset, actual_length, ftdi->readbuffer_remaining); */
1692 Configure read buffer chunk size.
1695 Automatically reallocates the buffer.
1697 \param ftdi pointer to ftdi_context
1698 \param chunksize Chunk size
1701 \retval -1: ftdi context invalid
1703 int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1705 unsigned char *new_buf;
1708 ftdi_error_return(-1, "ftdi context invalid");
1710 // Invalidate all remaining data
1711 ftdi->readbuffer_offset = 0;
1712 ftdi->readbuffer_remaining = 0;
1714 /* We can't set readbuffer_chunksize larger than MAX_BULK_BUFFER_LENGTH,
1715 which is defined in libusb-1.0. Otherwise, each USB read request will
1716 be divided into multiple URBs. This will cause issues on Linux kernel
1717 older than 2.6.32. */
1718 if (chunksize > 16384)
1722 if ((new_buf = (unsigned char *)realloc(ftdi->readbuffer, chunksize)) == NULL)
1723 ftdi_error_return(-1, "out of memory for readbuffer");
1725 ftdi->readbuffer = new_buf;
1726 ftdi->readbuffer_chunksize = chunksize;
1732 Get read buffer chunk size.
1734 \param ftdi pointer to ftdi_context
1735 \param chunksize Pointer to store chunk size in
1738 \retval -1: FTDI context invalid
1740 int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1743 ftdi_error_return(-1, "FTDI context invalid");
1745 *chunksize = ftdi->readbuffer_chunksize;
1751 Enable bitbang mode.
1753 \deprecated use \ref ftdi_set_bitmode with mode BITMODE_BITBANG instead
1755 \param ftdi pointer to ftdi_context
1756 \param bitmask Bitmask to configure lines.
1757 HIGH/ON value configures a line as output.
1760 \retval -1: can't enable bitbang mode
1761 \retval -2: USB device unavailable
1763 int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
1765 unsigned short usb_val;
1767 if (ftdi == NULL || ftdi->usb_dev == NULL)
1768 ftdi_error_return(-2, "USB device unavailable");
1770 usb_val = bitmask; // low byte: bitmask
1771 /* FT2232C: Set bitbang_mode to 2 to enable SPI */
1772 usb_val |= (ftdi->bitbang_mode << 8);
1774 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1775 SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index,
1776 NULL, 0, ftdi->usb_write_timeout) < 0)
1777 ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
1779 ftdi->bitbang_enabled = 1;
1784 Disable bitbang mode.
1786 \param ftdi pointer to ftdi_context
1789 \retval -1: can't disable bitbang mode
1790 \retval -2: USB device unavailable
1792 int ftdi_disable_bitbang(struct ftdi_context *ftdi)
1794 if (ftdi == NULL || ftdi->usb_dev == NULL)
1795 ftdi_error_return(-2, "USB device unavailable");
1797 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1798 ftdi_error_return(-1, "unable to leave bitbang mode. Perhaps not a BM type chip?");
1800 ftdi->bitbang_enabled = 0;
1805 Enable/disable bitbang modes.
1807 \param ftdi pointer to ftdi_context
1808 \param bitmask Bitmask to configure lines.
1809 HIGH/ON value configures a line as output.
1810 \param mode Bitbang mode: use the values defined in \ref ftdi_mpsse_mode
1813 \retval -1: can't enable bitbang mode
1814 \retval -2: USB device unavailable
1816 int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
1818 unsigned short usb_val;
1820 if (ftdi == NULL || ftdi->usb_dev == NULL)
1821 ftdi_error_return(-2, "USB device unavailable");
1823 usb_val = bitmask; // low byte: bitmask
1824 usb_val |= (mode << 8);
1825 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1826 ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps not a 2232C type chip?");
1828 ftdi->bitbang_mode = mode;
1829 ftdi->bitbang_enabled = (mode == BITMODE_RESET) ? 0 : 1;
1834 Directly read pin state, circumventing the read buffer. Useful for bitbang mode.
1836 \param ftdi pointer to ftdi_context
1837 \param pins Pointer to store pins into
1840 \retval -1: read pins failed
1841 \retval -2: USB device unavailable
1843 int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins)
1845 if (ftdi == NULL || ftdi->usb_dev == NULL)
1846 ftdi_error_return(-2, "USB device unavailable");
1848 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_PINS_REQUEST, 0, ftdi->index, (unsigned char *)pins, 1, ftdi->usb_read_timeout) != 1)
1849 ftdi_error_return(-1, "read pins failed");
1857 The FTDI chip keeps data in the internal buffer for a specific
1858 amount of time if the buffer is not full yet to decrease
1859 load on the usb bus.
1861 \param ftdi pointer to ftdi_context
1862 \param latency Value between 1 and 255
1865 \retval -1: latency out of range
1866 \retval -2: unable to set latency timer
1867 \retval -3: USB device unavailable
1869 int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
1871 unsigned short usb_val;
1874 ftdi_error_return(-1, "latency out of range. Only valid for 1-255");
1876 if (ftdi == NULL || ftdi->usb_dev == NULL)
1877 ftdi_error_return(-3, "USB device unavailable");
1880 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_LATENCY_TIMER_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1881 ftdi_error_return(-2, "unable to set latency timer");
1889 \param ftdi pointer to ftdi_context
1890 \param latency Pointer to store latency value in
1893 \retval -1: unable to get latency timer
1894 \retval -2: USB device unavailable
1896 int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency)
1898 unsigned short usb_val;
1900 if (ftdi == NULL || ftdi->usb_dev == NULL)
1901 ftdi_error_return(-2, "USB device unavailable");
1903 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_GET_LATENCY_TIMER_REQUEST, 0, ftdi->index, (unsigned char *)&usb_val, 1, ftdi->usb_read_timeout) != 1)
1904 ftdi_error_return(-1, "reading latency timer failed");
1906 *latency = (unsigned char)usb_val;
1911 Poll modem status information
1913 This function allows the retrieve the two status bytes of the device.
1914 The device sends these bytes also as a header for each read access
1915 where they are discarded by ftdi_read_data(). The chip generates
1916 the two stripped status bytes in the absence of data every 40 ms.
1918 Layout of the first byte:
1919 - B0..B3 - must be 0
1920 - B4 Clear to send (CTS)
1923 - B5 Data set ready (DTS)
1926 - B6 Ring indicator (RI)
1929 - B7 Receive line signal detect (RLSD)
1933 Layout of the second byte:
1934 - B0 Data ready (DR)
1935 - B1 Overrun error (OE)
1936 - B2 Parity error (PE)
1937 - B3 Framing error (FE)
1938 - B4 Break interrupt (BI)
1939 - B5 Transmitter holding register (THRE)
1940 - B6 Transmitter empty (TEMT)
1941 - B7 Error in RCVR FIFO
1943 \param ftdi pointer to ftdi_context
1944 \param status Pointer to store status information in. Must be two bytes.
1947 \retval -1: unable to retrieve status information
1948 \retval -2: USB device unavailable
1950 int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status)
1954 if (ftdi == NULL || ftdi->usb_dev == NULL)
1955 ftdi_error_return(-2, "USB device unavailable");
1957 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_POLL_MODEM_STATUS_REQUEST, 0, ftdi->index, (unsigned char *)usb_val, 2, ftdi->usb_read_timeout) != 2)
1958 ftdi_error_return(-1, "getting modem status failed");
1960 *status = (usb_val[1] << 8) | usb_val[0];
1966 Set flowcontrol for ftdi chip
1968 \param ftdi pointer to ftdi_context
1969 \param flowctrl flow control to use. should be
1970 SIO_DISABLE_FLOW_CTRL, SIO_RTS_CTS_HS, SIO_DTR_DSR_HS or SIO_XON_XOFF_HS
1973 \retval -1: set flow control failed
1974 \retval -2: USB device unavailable
1976 int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl)
1978 if (ftdi == NULL || ftdi->usb_dev == NULL)
1979 ftdi_error_return(-2, "USB device unavailable");
1981 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1982 SIO_SET_FLOW_CTRL_REQUEST, 0, (flowctrl | ftdi->index),
1983 NULL, 0, ftdi->usb_write_timeout) < 0)
1984 ftdi_error_return(-1, "set flow control failed");
1992 \param ftdi pointer to ftdi_context
1993 \param state state to set line to (1 or 0)
1996 \retval -1: set dtr failed
1997 \retval -2: USB device unavailable
1999 int ftdi_setdtr(struct ftdi_context *ftdi, int state)
2001 unsigned short usb_val;
2003 if (ftdi == NULL || ftdi->usb_dev == NULL)
2004 ftdi_error_return(-2, "USB device unavailable");
2007 usb_val = SIO_SET_DTR_HIGH;
2009 usb_val = SIO_SET_DTR_LOW;
2011 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2012 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2013 NULL, 0, ftdi->usb_write_timeout) < 0)
2014 ftdi_error_return(-1, "set dtr failed");
2022 \param ftdi pointer to ftdi_context
2023 \param state state to set line to (1 or 0)
2026 \retval -1: set rts failed
2027 \retval -2: USB device unavailable
2029 int ftdi_setrts(struct ftdi_context *ftdi, int state)
2031 unsigned short usb_val;
2033 if (ftdi == NULL || ftdi->usb_dev == NULL)
2034 ftdi_error_return(-2, "USB device unavailable");
2037 usb_val = SIO_SET_RTS_HIGH;
2039 usb_val = SIO_SET_RTS_LOW;
2041 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2042 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2043 NULL, 0, ftdi->usb_write_timeout) < 0)
2044 ftdi_error_return(-1, "set of rts failed");
2050 Set dtr and rts line in one pass
2052 \param ftdi pointer to ftdi_context
2053 \param dtr DTR state to set line to (1 or 0)
2054 \param rts RTS state to set line to (1 or 0)
2057 \retval -1: set dtr/rts failed
2058 \retval -2: USB device unavailable
2060 int ftdi_setdtr_rts(struct ftdi_context *ftdi, int dtr, int rts)
2062 unsigned short usb_val;
2064 if (ftdi == NULL || ftdi->usb_dev == NULL)
2065 ftdi_error_return(-2, "USB device unavailable");
2068 usb_val = SIO_SET_DTR_HIGH;
2070 usb_val = SIO_SET_DTR_LOW;
2073 usb_val |= SIO_SET_RTS_HIGH;
2075 usb_val |= SIO_SET_RTS_LOW;
2077 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2078 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2079 NULL, 0, ftdi->usb_write_timeout) < 0)
2080 ftdi_error_return(-1, "set of rts/dtr failed");
2086 Set the special event character
2088 \param ftdi pointer to ftdi_context
2089 \param eventch Event character
2090 \param enable 0 to disable the event character, non-zero otherwise
2093 \retval -1: unable to set event character
2094 \retval -2: USB device unavailable
2096 int ftdi_set_event_char(struct ftdi_context *ftdi,
2097 unsigned char eventch, unsigned char enable)
2099 unsigned short usb_val;
2101 if (ftdi == NULL || ftdi->usb_dev == NULL)
2102 ftdi_error_return(-2, "USB device unavailable");
2108 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_EVENT_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
2109 ftdi_error_return(-1, "setting event character failed");
2117 \param ftdi pointer to ftdi_context
2118 \param errorch Error character
2119 \param enable 0 to disable the error character, non-zero otherwise
2122 \retval -1: unable to set error character
2123 \retval -2: USB device unavailable
2125 int ftdi_set_error_char(struct ftdi_context *ftdi,
2126 unsigned char errorch, unsigned char enable)
2128 unsigned short usb_val;
2130 if (ftdi == NULL || ftdi->usb_dev == NULL)
2131 ftdi_error_return(-2, "USB device unavailable");
2137 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_ERROR_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
2138 ftdi_error_return(-1, "setting error character failed");
2146 \param ftdi pointer to ftdi_context
2147 \param eeprom Pointer to ftdi_eeprom
2151 void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size)
2156 ftdi->eeprom_size=size;
2161 Init eeprom with default values.
2163 \param eeprom Pointer to ftdi_eeprom
2165 void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
2170 eeprom->vendor_id = 0x0403;
2171 eeprom->product_id = 0x6001;
2173 eeprom->self_powered = 1;
2174 eeprom->remote_wakeup = 1;
2175 eeprom->BM_type_chip = 1;
2177 eeprom->in_is_isochronous = 0;
2178 eeprom->out_is_isochronous = 0;
2179 eeprom->suspend_pull_downs = 0;
2181 eeprom->use_serial = 0;
2182 eeprom->change_usb_version = 0;
2183 eeprom->usb_version = 0x0200;
2184 eeprom->max_power = 0;
2186 eeprom->manufacturer = NULL;
2187 eeprom->product = NULL;
2188 eeprom->serial = NULL;
2190 eeprom->size = FTDI_DEFAULT_EEPROM_SIZE;
2194 Build binary output from ftdi_eeprom structure.
2195 Output is suitable for ftdi_write_eeprom().
2197 \param eeprom Pointer to ftdi_eeprom
2198 \param output Buffer of 128 bytes to store eeprom image to
2200 \retval >0: used eeprom size
2201 \retval -1: eeprom size (128 bytes) exceeded by custom strings
2202 \retval -2: Invalid eeprom pointer
2204 int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
2207 unsigned short checksum, value;
2208 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2214 if (eeprom->manufacturer != NULL)
2215 manufacturer_size = strlen(eeprom->manufacturer);
2216 if (eeprom->product != NULL)
2217 product_size = strlen(eeprom->product);
2218 if (eeprom->serial != NULL)
2219 serial_size = strlen(eeprom->serial);
2221 size_check = eeprom->size;
2222 size_check -= 28; // 28 are always in use (fixed)
2224 // Top half of a 256byte eeprom is used just for strings and checksum
2225 // it seems that the FTDI chip will not read these strings from the lower half
2226 // Each string starts with two bytes; offset and type (0x03 for string)
2227 // the checksum needs two bytes, so without the string data that 8 bytes from the top half
2228 if (eeprom->size>=256)size_check = 120;
2229 size_check -= manufacturer_size*2;
2230 size_check -= product_size*2;
2231 size_check -= serial_size*2;
2233 // eeprom size exceeded?
2238 memset (output, 0, eeprom->size);
2240 // Addr 00: Stay 00 00
2241 // Addr 02: Vendor ID
2242 output[0x02] = eeprom->vendor_id;
2243 output[0x03] = eeprom->vendor_id >> 8;
2245 // Addr 04: Product ID
2246 output[0x04] = eeprom->product_id;
2247 output[0x05] = eeprom->product_id >> 8;
2249 // Addr 06: Device release number (0400h for BM features)
2250 output[0x06] = 0x00;
2252 if (eeprom->BM_type_chip == 1)
2253 output[0x07] = 0x04;
2255 output[0x07] = 0x02;
2257 // Addr 08: Config descriptor
2259 // Bit 6: 1 if this device is self powered, 0 if bus powered
2260 // Bit 5: 1 if this device uses remote wakeup
2261 // Bit 4: 1 if this device is battery powered
2263 if (eeprom->self_powered == 1)
2265 if (eeprom->remote_wakeup == 1)
2269 // Addr 09: Max power consumption: max power = value * 2 mA
2270 output[0x09] = eeprom->max_power;
2272 // Addr 0A: Chip configuration
2273 // Bit 7: 0 - reserved
2274 // Bit 6: 0 - reserved
2275 // Bit 5: 0 - reserved
2276 // Bit 4: 1 - Change USB version
2277 // Bit 3: 1 - Use the serial number string
2278 // Bit 2: 1 - Enable suspend pull downs for lower power
2279 // Bit 1: 1 - Out EndPoint is Isochronous
2280 // Bit 0: 1 - In EndPoint is Isochronous
2283 if (eeprom->in_is_isochronous == 1)
2285 if (eeprom->out_is_isochronous == 1)
2287 if (eeprom->suspend_pull_downs == 1)
2289 if (eeprom->use_serial == 1)
2291 if (eeprom->change_usb_version == 1)
2295 // Addr 0B: reserved
2296 output[0x0B] = 0x00;
2298 // Addr 0C: USB version low byte when 0x0A bit 4 is set
2299 // Addr 0D: USB version high byte when 0x0A bit 4 is set
2300 if (eeprom->change_usb_version == 1)
2302 output[0x0C] = eeprom->usb_version;
2303 output[0x0D] = eeprom->usb_version >> 8;
2307 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2308 // Addr 0F: Length of manufacturer string
2309 output[0x0F] = manufacturer_size*2 + 2;
2311 // Addr 10: Offset of the product string + 0x80, calculated later
2312 // Addr 11: Length of product string
2313 output[0x11] = product_size*2 + 2;
2315 // Addr 12: Offset of the serial string + 0x80, calculated later
2316 // Addr 13: Length of serial string
2317 output[0x13] = serial_size*2 + 2;
2321 if (eeprom->size>=256) i = 0x80;
2324 // Output manufacturer
2325 output[0x0E] = i | 0x80; // calculate offset
2326 output[i++] = manufacturer_size*2 + 2;
2327 output[i++] = 0x03; // type: string
2328 for (j = 0; j < manufacturer_size; j++)
2330 output[i] = eeprom->manufacturer[j], i++;
2331 output[i] = 0x00, i++;
2334 // Output product name
2335 output[0x10] = i | 0x80; // calculate offset
2336 output[i] = product_size*2 + 2, i++;
2337 output[i] = 0x03, i++;
2338 for (j = 0; j < product_size; j++)
2340 output[i] = eeprom->product[j], i++;
2341 output[i] = 0x00, i++;
2345 output[0x12] = i | 0x80; // calculate offset
2346 output[i] = serial_size*2 + 2, i++;
2347 output[i] = 0x03, i++;
2348 for (j = 0; j < serial_size; j++)
2350 output[i] = eeprom->serial[j], i++;
2351 output[i] = 0x00, i++;
2354 // calculate checksum
2357 for (i = 0; i < eeprom->size/2-1; i++)
2359 value = output[i*2];
2360 value += output[(i*2)+1] << 8;
2362 checksum = value^checksum;
2363 checksum = (checksum << 1) | (checksum >> 15);
2366 output[eeprom->size-2] = checksum;
2367 output[eeprom->size-1] = checksum >> 8;
2373 Decode binary EEPROM image into an ftdi_eeprom structure.
2375 \param eeprom Pointer to ftdi_eeprom which will be filled in.
2376 \param buf Buffer of \a size bytes of raw eeprom data
2377 \param size size size of eeprom data in bytes
2380 \retval -1: something went wrong
2382 FIXME: How to pass size? How to handle size field in ftdi_eeprom?
2383 FIXME: Strings are malloc'ed here and should be freed somewhere
2385 int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *buf, int size)
2388 unsigned short checksum, eeprom_checksum, value;
2389 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2390 int eeprom_size = 128;
2395 size_check = eeprom->size;
2396 size_check -= 28; // 28 are always in use (fixed)
2398 // Top half of a 256byte eeprom is used just for strings and checksum
2399 // it seems that the FTDI chip will not read these strings from the lower half
2400 // Each string starts with two bytes; offset and type (0x03 for string)
2401 // the checksum needs two bytes, so without the string data that 8 bytes from the top half
2402 if (eeprom->size>=256)size_check = 120;
2403 size_check -= manufacturer_size*2;
2404 size_check -= product_size*2;
2405 size_check -= serial_size*2;
2407 // eeprom size exceeded?
2412 // empty eeprom struct
2413 memset(eeprom, 0, sizeof(struct ftdi_eeprom));
2415 // Addr 00: Stay 00 00
2417 // Addr 02: Vendor ID
2418 eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8);
2420 // Addr 04: Product ID
2421 eeprom->product_id = buf[0x04] + (buf[0x05] << 8);
2423 value = buf[0x06] + (buf[0x07]<<8);
2427 eeprom->BM_type_chip = 1;
2430 eeprom->BM_type_chip = 0;
2432 default: // Unknown device
2433 eeprom->BM_type_chip = 0;
2437 // Addr 08: Config descriptor
2439 // Bit 6: 1 if this device is self powered, 0 if bus powered
2440 // Bit 5: 1 if this device uses remote wakeup
2441 // Bit 4: 1 if this device is battery powered
2443 if (j&0x40) eeprom->self_powered = 1;
2444 if (j&0x20) eeprom->remote_wakeup = 1;
2446 // Addr 09: Max power consumption: max power = value * 2 mA
2447 eeprom->max_power = buf[0x09];
2449 // Addr 0A: Chip configuration
2450 // Bit 7: 0 - reserved
2451 // Bit 6: 0 - reserved
2452 // Bit 5: 0 - reserved
2453 // Bit 4: 1 - Change USB version
2454 // Bit 3: 1 - Use the serial number string
2455 // Bit 2: 1 - Enable suspend pull downs for lower power
2456 // Bit 1: 1 - Out EndPoint is Isochronous
2457 // Bit 0: 1 - In EndPoint is Isochronous
2460 if (j&0x01) eeprom->in_is_isochronous = 1;
2461 if (j&0x02) eeprom->out_is_isochronous = 1;
2462 if (j&0x04) eeprom->suspend_pull_downs = 1;
2463 if (j&0x08) eeprom->use_serial = 1;
2464 if (j&0x10) eeprom->change_usb_version = 1;
2466 // Addr 0B: reserved
2468 // Addr 0C: USB version low byte when 0x0A bit 4 is set
2469 // Addr 0D: USB version high byte when 0x0A bit 4 is set
2470 if (eeprom->change_usb_version == 1)
2472 eeprom->usb_version = buf[0x0C] + (buf[0x0D] << 8);
2475 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2476 // Addr 0F: Length of manufacturer string
2477 manufacturer_size = buf[0x0F]/2;
2478 if (manufacturer_size > 0) eeprom->manufacturer = malloc(manufacturer_size);
2479 else eeprom->manufacturer = NULL;
2481 // Addr 10: Offset of the product string + 0x80, calculated later
2482 // Addr 11: Length of product string
2483 product_size = buf[0x11]/2;
2484 if (product_size > 0) eeprom->product = malloc(product_size);
2485 else eeprom->product = NULL;
2487 // Addr 12: Offset of the serial string + 0x80, calculated later
2488 // Addr 13: Length of serial string
2489 serial_size = buf[0x13]/2;
2490 if (serial_size > 0) eeprom->serial = malloc(serial_size);
2491 else eeprom->serial = NULL;
2493 // Decode manufacturer
2494 i = buf[0x0E] & 0x7f; // offset
2495 for (j=0;j<manufacturer_size-1;j++)
2497 eeprom->manufacturer[j] = buf[2*j+i+2];
2499 eeprom->manufacturer[j] = '\0';
2501 // Decode product name
2502 i = buf[0x10] & 0x7f; // offset
2503 for (j=0;j<product_size-1;j++)
2505 eeprom->product[j] = buf[2*j+i+2];
2507 eeprom->product[j] = '\0';
2510 i = buf[0x12] & 0x7f; // offset
2511 for (j=0;j<serial_size-1;j++)
2513 eeprom->serial[j] = buf[2*j+i+2];
2515 eeprom->serial[j] = '\0';
2520 for (i = 0; i < eeprom_size/2-1; i++)
2523 value += buf[(i*2)+1] << 8;
2525 checksum = value^checksum;
2526 checksum = (checksum << 1) | (checksum >> 15);
2529 eeprom_checksum = buf[eeprom_size-2] + (buf[eeprom_size-1] << 8);
2531 if (eeprom_checksum != checksum)
2533 fprintf(stderr, "Checksum Error: %04x %04x\n", checksum, eeprom_checksum);
2541 Read eeprom location
2543 \param ftdi pointer to ftdi_context
2544 \param eeprom_addr Address of eeprom location to be read
2545 \param eeprom_val Pointer to store read eeprom location
2548 \retval -1: read failed
2549 \retval -2: USB device unavailable
2551 int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val)
2553 if (ftdi == NULL || ftdi->usb_dev == NULL)
2554 ftdi_error_return(-2, "USB device unavailable");
2556 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, eeprom_addr, (char *)eeprom_val, 2, ftdi->usb_read_timeout) != 2)
2557 ftdi_error_return(-1, "reading eeprom failed");
2565 \param ftdi pointer to ftdi_context
2566 \param eeprom Pointer to store eeprom into
2569 \retval -1: read failed
2570 \retval -2: USB device unavailable
2572 int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2576 if (ftdi == NULL || ftdi->usb_dev == NULL)
2577 ftdi_error_return(-2, "USB device unavailable");
2579 for (i = 0; i < ftdi->eeprom_size/2; i++)
2581 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
2582 ftdi_error_return(-1, "reading eeprom failed");
2589 ftdi_read_chipid_shift does the bitshift operation needed for the FTDIChip-ID
2590 Function is only used internally
2593 static unsigned char ftdi_read_chipid_shift(unsigned char value)
2595 return ((value & 1) << 1) |
2596 ((value & 2) << 5) |
2597 ((value & 4) >> 2) |
2598 ((value & 8) << 4) |
2599 ((value & 16) >> 1) |
2600 ((value & 32) >> 1) |
2601 ((value & 64) >> 4) |
2602 ((value & 128) >> 2);
2606 Read the FTDIChip-ID from R-type devices
2608 \param ftdi pointer to ftdi_context
2609 \param chipid Pointer to store FTDIChip-ID
2612 \retval -1: read failed
2613 \retval -2: USB device unavailable
2615 int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid)
2617 unsigned int a = 0, b = 0;
2619 if (ftdi == NULL || ftdi->usb_dev == NULL)
2620 ftdi_error_return(-2, "USB device unavailable");
2622 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x43, (unsigned char *)&a, 2, ftdi->usb_read_timeout) == 2)
2624 a = a << 8 | a >> 8;
2625 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x44, (unsigned char *)&b, 2, ftdi->usb_read_timeout) == 2)
2627 b = b << 8 | b >> 8;
2628 a = (a << 16) | (b & 0xFFFF);
2629 a = ftdi_read_chipid_shift(a) | ftdi_read_chipid_shift(a>>8)<<8
2630 | ftdi_read_chipid_shift(a>>16)<<16 | ftdi_read_chipid_shift(a>>24)<<24;
2631 *chipid = a ^ 0xa5f0f7d1;
2636 ftdi_error_return(-1, "read of FTDIChip-ID failed");
2640 Guesses size of eeprom by reading eeprom and comparing halves - will not work with blank eeprom
2641 Call this function then do a write then call again to see if size changes, if so write again.
2643 \param ftdi pointer to ftdi_context
2644 \param eeprom Pointer to store eeprom into
2645 \param maxsize the size of the buffer to read into
2647 \retval -1: eeprom read failed
2648 \retval -2: USB device unavailable
2649 \retval >=0: size of eeprom
2651 int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize)
2653 int i=0,j,minsize=32;
2656 if (ftdi == NULL || ftdi->usb_dev == NULL)
2657 ftdi_error_return(-2, "USB device unavailable");
2661 for (j = 0; i < maxsize/2 && j<size; j++)
2663 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE,
2664 SIO_READ_EEPROM_REQUEST, 0, i,
2665 eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
2666 ftdi_error_return(-1, "eeprom read failed");
2671 while (size<=maxsize && memcmp(eeprom,&eeprom[size/2],size/2)!=0);
2677 Write eeprom location
2679 \param ftdi pointer to ftdi_context
2680 \param eeprom_addr Address of eeprom location to be written
2681 \param eeprom_val Value to be written
2684 \retval -1: read failed
2685 \retval -2: USB device unavailable
2687 int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, unsigned short eeprom_val)
2689 if (ftdi == NULL || ftdi->usb_dev == NULL)
2690 ftdi_error_return(-2, "USB device unavailable");
2692 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2693 SIO_WRITE_EEPROM_REQUEST, eeprom_val, eeprom_addr,
2694 NULL, 0, ftdi->usb_write_timeout) != 0)
2695 ftdi_error_return(-1, "unable to write eeprom");
2703 \param ftdi pointer to ftdi_context
2704 \param eeprom Pointer to read eeprom from
2707 \retval -1: read failed
2708 \retval -2: USB device unavailable
2710 int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2712 unsigned short usb_val, status;
2715 if (ftdi == NULL || ftdi->usb_dev == NULL)
2716 ftdi_error_return(-2, "USB device unavailable");
2718 /* These commands were traced while running MProg */
2719 if ((ret = ftdi_usb_reset(ftdi)) != 0)
2721 if ((ret = ftdi_poll_modem_status(ftdi, &status)) != 0)
2723 if ((ret = ftdi_set_latency_timer(ftdi, 0x77)) != 0)
2726 for (i = 0; i < ftdi->eeprom_size/2; i++)
2728 usb_val = eeprom[i*2];
2729 usb_val += eeprom[(i*2)+1] << 8;
2730 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2731 SIO_WRITE_EEPROM_REQUEST, usb_val, i,
2732 NULL, 0, ftdi->usb_write_timeout) < 0)
2733 ftdi_error_return(-1, "unable to write eeprom");
2742 This is not supported on FT232R/FT245R according to the MProg manual from FTDI.
2744 \param ftdi pointer to ftdi_context
2747 \retval -1: erase failed
2748 \retval -2: USB device unavailable
2750 int ftdi_erase_eeprom(struct ftdi_context *ftdi)
2752 if (ftdi == NULL || ftdi->usb_dev == NULL)
2753 ftdi_error_return(-2, "USB device unavailable");
2755 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_ERASE_EEPROM_REQUEST, 0, 0, NULL, 0, ftdi->usb_write_timeout) < 0)
2756 ftdi_error_return(-1, "unable to erase eeprom");
2762 Get string representation for last error code
2764 \param ftdi pointer to ftdi_context
2766 \retval Pointer to error string
2768 char *ftdi_get_error_string (struct ftdi_context *ftdi)
2773 return ftdi->error_str;
2776 /* @} end of doxygen libftdi group */