9cf425f5f1925d1e188844dd1b713ff5762e131c
[libftdi] / src / ftdi.c
1 /***************************************************************************
2                           ftdi.c  -  description
3                              -------------------
4     begin                : Fri Apr 4 2003
5     copyright            : (C) 2003-2010 by Intra2net AG
6     email                : opensource@intra2net.com
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
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;             *
14  *                                                                         *
15  ***************************************************************************/
16
17 /**
18     \mainpage libftdi API documentation
19
20     Library to talk to FTDI chips. You find the latest versions of libftdi at
21     http://www.intra2net.com/en/developer/libftdi/
22
23     The library is easy to use. Have a look at this short example:
24     \include simple.c
25
26     More examples can be found in the "examples" directory.
27 */
28 /** \addtogroup libftdi */
29 /* @{ */
30
31 #include <usb.h>
32 #include <string.h>
33 #include <errno.h>
34 #include <stdio.h>
35
36 #include "ftdi.h"
37
38 /* stuff needed for async write */
39 #ifdef LIBFTDI_LINUX_ASYNC_MODE
40 #include <sys/ioctl.h>
41 #include <sys/select.h>
42 #include <sys/types.h>
43 #include <unistd.h>
44 #include <linux/usbdevice_fs.h>
45 #endif
46
47 #define ftdi_error_return(code, str) do {  \
48         ftdi->error_str = str;             \
49         return code;                       \
50    } while(0);
51
52
53 #if defined( __WIN32__) && !defined(__MINGW32__)
54 #include <windows.h>
55 #define DELTA_EPOCH_IN_MICROSECS  11644473600000000Ui64
56 struct timeval {
57         long    tv_sec;
58         long    tv_usec;
59 };
60 int gettimeofday(  struct timeval *tv, void null)
61 {
62     FILETIME ft;
63     unsigned __int64 tmpres = 0;
64     if(tv)
65     {
66         GetSystemTimeAsFileTime(&ft);
67         tmpres |= ft.dwHighDateTime;
68         tmpres <<= 32;
69         tmpres |= ft.dwLowDateTime;
70
71         /*converting file time to unix epoch*/
72         tmpres /= 10;  /*convert into microseconds*/
73         tmpres -= DELTA_EPOCH_IN_MICROSECS; 
74         tv->tv_sec = (LONG)(tmpres / 1000000UL);
75         tv->tv_usec = (LONG)(tmpres % 1000000UL);
76     }
77     /* Warning: Timezone not handled (and not needed here) */
78     return 0;
79 }
80 #else
81     // Include sys/time.h on non-Windows platforms
82     // as gettimeofday() needs it.
83     #include <sys/time.h>
84 #endif
85
86 /**
87     Internal function to close usb device pointer.
88     Sets ftdi->usb_dev to NULL.
89     \internal
90
91     \param ftdi pointer to ftdi_context
92
93     \retval  zero if all is fine, otherwise error code from usb_close()
94 */
95 static int ftdi_usb_close_internal (struct ftdi_context *ftdi)
96 {
97     int ret = 0;
98
99     if (ftdi && ftdi->usb_dev)
100     {
101        ret = usb_close (ftdi->usb_dev);
102        ftdi->usb_dev = NULL;
103     }
104
105     return ret;
106 }
107
108 /**
109     Initializes a ftdi_context.
110
111     \param ftdi pointer to ftdi_context
112
113     \retval  0: all fine
114     \retval -1: couldn't allocate read buffer
115
116     \remark This should be called before all functions
117 */
118 int ftdi_init(struct ftdi_context *ftdi)
119 {
120     unsigned int i;
121
122     ftdi->usb_dev = NULL;
123     ftdi->usb_read_timeout = 5000;
124     ftdi->usb_write_timeout = 5000;
125
126     ftdi->type = TYPE_BM;    /* chip type */
127     ftdi->baudrate = -1;
128     ftdi->bitbang_enabled = 0;  /* 0: normal mode 1: any of the bitbang modes enabled */
129
130     ftdi->readbuffer = NULL;
131     ftdi->readbuffer_offset = 0;
132     ftdi->readbuffer_remaining = 0;
133     ftdi->writebuffer_chunksize = 4096;
134     ftdi->max_packet_size = 0;
135
136     ftdi->interface = 0;
137     ftdi->index = 0;
138     ftdi->in_ep = 0x02;
139     ftdi->out_ep = 0x81;
140     ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode  */
141
142     ftdi->error_str = NULL;
143
144 #ifdef LIBFTDI_LINUX_ASYNC_MODE
145     ftdi->async_usb_buffer_size=10;
146     if ((ftdi->async_usb_buffer=malloc(sizeof(struct usbdevfs_urb)*ftdi->async_usb_buffer_size)) == NULL)
147         ftdi_error_return(-1, "out of memory for async usb buffer");
148
149     /* initialize async usb buffer with unused-marker */
150     for (i=0; i < ftdi->async_usb_buffer_size; i++)
151         ((struct usbdevfs_urb*)ftdi->async_usb_buffer)[i].usercontext = FTDI_URB_USERCONTEXT_COOKIE;
152 #else
153     ftdi->async_usb_buffer_size=0;
154     ftdi->async_usb_buffer = NULL;
155 #endif
156
157     ftdi->eeprom_size = FTDI_DEFAULT_EEPROM_SIZE;
158
159     /* All fine. Now allocate the readbuffer */
160     return ftdi_read_data_set_chunksize(ftdi, 4096);
161 }
162
163 /**
164     Allocate and initialize a new ftdi_context
165
166     \return a pointer to a new ftdi_context, or NULL on failure
167 */
168 struct ftdi_context *ftdi_new(void)
169 {
170     struct ftdi_context * ftdi = (struct ftdi_context *)malloc(sizeof(struct ftdi_context));
171
172     if (ftdi == NULL)
173     {
174         return NULL;
175     }
176
177     if (ftdi_init(ftdi) != 0)
178     {
179         free(ftdi);
180         return NULL;
181     }
182
183     return ftdi;
184 }
185
186 /**
187     Open selected channels on a chip, otherwise use first channel.
188
189     \param ftdi pointer to ftdi_context
190     \param interface Interface to use for FT2232C/2232H/4232H chips.
191
192     \retval  0: all fine
193     \retval -1: unknown interface
194     \retval -2: USB device unavailable
195 */
196 int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)
197 {
198     if (ftdi == NULL)
199         ftdi_error_return(-2, "USB device unavailable");
200
201     switch (interface)
202     {
203         case INTERFACE_ANY:
204         case INTERFACE_A:
205             /* ftdi_usb_open_desc cares to set the right index, depending on the found chip */
206             break;
207         case INTERFACE_B:
208             ftdi->interface = 1;
209             ftdi->index     = INTERFACE_B;
210             ftdi->in_ep     = 0x04;
211             ftdi->out_ep    = 0x83;
212             break;
213         case INTERFACE_C:
214             ftdi->interface = 2;
215             ftdi->index     = INTERFACE_C;
216             ftdi->in_ep     = 0x06;
217             ftdi->out_ep    = 0x85;
218             break;
219         case INTERFACE_D:
220             ftdi->interface = 3;
221             ftdi->index     = INTERFACE_D;
222             ftdi->in_ep     = 0x08;
223             ftdi->out_ep    = 0x87;
224             break;
225         default:
226             ftdi_error_return(-1, "Unknown interface");
227     }
228     return 0;
229 }
230
231 /**
232     Deinitializes a ftdi_context.
233
234     \param ftdi pointer to ftdi_context
235 */
236 void ftdi_deinit(struct ftdi_context *ftdi)
237 {
238     if (ftdi == NULL)
239         return;
240
241     ftdi_usb_close_internal (ftdi);
242
243     if (ftdi->async_usb_buffer != NULL)
244     {
245         free(ftdi->async_usb_buffer);
246         ftdi->async_usb_buffer = NULL;
247     }
248
249     if (ftdi->readbuffer != NULL)
250     {
251         free(ftdi->readbuffer);
252         ftdi->readbuffer = NULL;
253     }
254 }
255
256 /**
257     Deinitialize and free an ftdi_context.
258
259     \param ftdi pointer to ftdi_context
260 */
261 void ftdi_free(struct ftdi_context *ftdi)
262 {
263     ftdi_deinit(ftdi);
264     free(ftdi);
265 }
266
267 /**
268     Use an already open libusb device.
269
270     \param ftdi pointer to ftdi_context
271     \param usb libusb usb_dev_handle to use
272 */
273 void ftdi_set_usbdev (struct ftdi_context *ftdi, usb_dev_handle *usb)
274 {
275     if (ftdi == NULL)
276         return;
277
278     ftdi->usb_dev = usb;
279 }
280
281
282 /**
283     Finds all ftdi devices on the usb bus. Creates a new ftdi_device_list which
284     needs to be deallocated by ftdi_list_free() after use.
285
286     \param ftdi pointer to ftdi_context
287     \param devlist Pointer where to store list of found devices
288     \param vendor Vendor ID to search for
289     \param product Product ID to search for
290
291     \retval >0: number of devices found
292     \retval -1: usb_find_busses() failed
293     \retval -2: usb_find_devices() failed
294     \retval -3: out of memory
295 */
296 int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product)
297 {
298     struct ftdi_device_list **curdev;
299     struct usb_bus *bus;
300     struct usb_device *dev;
301     int count = 0;
302
303     usb_init();
304     if (usb_find_busses() < 0)
305         ftdi_error_return(-1, "usb_find_busses() failed");
306     if (usb_find_devices() < 0)
307         ftdi_error_return(-2, "usb_find_devices() failed");
308
309     curdev = devlist;
310     *curdev = NULL;
311     for (bus = usb_get_busses(); bus; bus = bus->next)
312     {
313         for (dev = bus->devices; dev; dev = dev->next)
314         {
315             if (dev->descriptor.idVendor == vendor
316                     && dev->descriptor.idProduct == product)
317             {
318                 *curdev = (struct ftdi_device_list*)malloc(sizeof(struct ftdi_device_list));
319                 if (!*curdev)
320                     ftdi_error_return(-3, "out of memory");
321
322                 (*curdev)->next = NULL;
323                 (*curdev)->dev = dev;
324
325                 curdev = &(*curdev)->next;
326                 count++;
327             }
328         }
329     }
330
331     return count;
332 }
333
334 /**
335     Frees a usb device list.
336
337     \param devlist USB device list created by ftdi_usb_find_all()
338 */
339 void ftdi_list_free(struct ftdi_device_list **devlist)
340 {
341     struct ftdi_device_list *curdev, *next;
342
343     for (curdev = *devlist; curdev != NULL;)
344     {
345         next = curdev->next;
346         free(curdev);
347         curdev = next;
348     }
349
350     *devlist = NULL;
351 }
352
353 /**
354     Frees a usb device list.
355
356     \param devlist USB device list created by ftdi_usb_find_all()
357 */
358 void ftdi_list_free2(struct ftdi_device_list *devlist)
359 {
360     ftdi_list_free(&devlist);
361 }
362
363 /**
364     Return device ID strings from the usb device.
365
366     The parameters manufacturer, description and serial may be NULL
367     or pointer to buffers to store the fetched strings.
368
369     \note Use this function only in combination with ftdi_usb_find_all()
370           as it closes the internal "usb_dev" after use.
371
372     \param ftdi pointer to ftdi_context
373     \param dev libusb usb_dev to use
374     \param manufacturer Store manufacturer string here if not NULL
375     \param mnf_len Buffer size of manufacturer string
376     \param description Store product description string here if not NULL
377     \param desc_len Buffer size of product description string
378     \param serial Store serial string here if not NULL
379     \param serial_len Buffer size of serial string
380
381     \retval   0: all fine
382     \retval  -1: wrong arguments
383     \retval  -4: unable to open device
384     \retval  -7: get product manufacturer failed
385     \retval  -8: get product description failed
386     \retval  -9: get serial number failed
387     \retval -10: unable to close device
388 */
389 int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct usb_device * dev,
390                          char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len)
391 {
392     if ((ftdi==NULL) || (dev==NULL))
393         return -1;
394
395     if (!(ftdi->usb_dev = usb_open(dev)))
396         ftdi_error_return(-4, usb_strerror());
397
398     if (manufacturer != NULL)
399     {
400         if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iManufacturer, manufacturer, mnf_len) <= 0)
401         {
402             ftdi_usb_close_internal (ftdi);
403             ftdi_error_return(-7, usb_strerror());
404         }
405     }
406
407     if (description != NULL)
408     {
409         if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, description, desc_len) <= 0)
410         {
411             ftdi_usb_close_internal (ftdi);
412             ftdi_error_return(-8, usb_strerror());
413         }
414     }
415
416     if (serial != NULL)
417     {
418         if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, serial, serial_len) <= 0)
419         {
420             ftdi_usb_close_internal (ftdi);
421             ftdi_error_return(-9, usb_strerror());
422         }
423     }
424
425     if (ftdi_usb_close_internal (ftdi) != 0)
426         ftdi_error_return(-10, usb_strerror());
427
428     return 0;
429 }
430
431 /**
432  * Internal function to determine the maximum packet size.
433  * \param ftdi pointer to ftdi_context
434  * \param dev libusb usb_dev to use
435  * \retval Maximum packet size for this device
436  */
437 static unsigned int _ftdi_determine_max_packet_size(struct ftdi_context *ftdi, struct usb_device *dev)
438 {
439     unsigned int packet_size;
440
441     // Sanity check
442     if (ftdi == NULL || dev == NULL)
443         return 64;
444
445     // Determine maximum packet size. Init with default value.
446     // New hi-speed devices from FTDI use a packet size of 512 bytes
447     // but could be connected to a normal speed USB hub -> 64 bytes packet size.
448     if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H)
449         packet_size = 512;
450     else
451         packet_size = 64;
452
453     if (dev->descriptor.bNumConfigurations > 0 && dev->config)
454     {
455         struct usb_config_descriptor config = dev->config[0];
456
457         if (ftdi->interface < config.bNumInterfaces)
458         {
459             struct usb_interface interface = config.interface[ftdi->interface];
460             if (interface.num_altsetting > 0)
461             {
462                 struct usb_interface_descriptor descriptor = interface.altsetting[0];
463                 if (descriptor.bNumEndpoints > 0)
464                 {
465                     packet_size = descriptor.endpoint[0].wMaxPacketSize;
466                 }
467             }
468         }
469     }
470
471     return packet_size;
472 }
473
474 /**
475     Opens a ftdi device given by an usb_device.
476
477     \param ftdi pointer to ftdi_context
478     \param dev libusb usb_dev to use
479
480     \retval  0: all fine
481     \retval -3: unable to config device
482     \retval -4: unable to open device
483     \retval -5: unable to claim device
484     \retval -6: reset failed
485     \retval -7: set baudrate failed
486     \retval -8: ftdi context invalid
487 */
488 int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev)
489 {
490     int detach_errno = 0;
491     int config_val = 1;
492
493     if (ftdi == NULL)
494         ftdi_error_return(-8, "ftdi context invalid");
495
496     if (!(ftdi->usb_dev = usb_open(dev)))
497         ftdi_error_return(-4, "usb_open() failed");
498
499 #ifdef LIBUSB_HAS_GET_DRIVER_NP
500     // Try to detach ftdi_sio kernel module.
501     // Returns ENODATA if driver is not loaded.
502     //
503     // The return code is kept in a separate variable and only parsed
504     // if usb_set_configuration() or usb_claim_interface() fails as the
505     // detach operation might be denied and everything still works fine.
506     // Likely scenario is a static ftdi_sio kernel module.
507     if (usb_detach_kernel_driver_np(ftdi->usb_dev, ftdi->interface) != 0 && errno != ENODATA)
508         detach_errno = errno;
509 #endif
510
511 #ifdef __WIN32__
512     // set configuration (needed especially for windows)
513     // tolerate EBUSY: one device with one configuration, but two interfaces
514     //    and libftdi sessions to both interfaces (e.g. FT2232)
515
516     if (dev->descriptor.bNumConfigurations > 0)
517     {
518         // libusb-win32 on Windows 64 can return a null pointer for a valid device
519         if (dev->config)
520             config_val = dev->config[0].bConfigurationValue;
521
522         if (usb_set_configuration(ftdi->usb_dev, config_val) &&
523             errno != EBUSY)
524         {
525             ftdi_usb_close_internal (ftdi);
526             if (detach_errno == EPERM)
527             {
528                 ftdi_error_return(-8, "inappropriate permissions on device!");
529             }
530             else
531             {
532                 ftdi_error_return(-3, "unable to set usb configuration. Make sure the default FTDI driver is not in use");
533             }
534         }
535     }
536 #endif
537
538     if (usb_claim_interface(ftdi->usb_dev, ftdi->interface) != 0)
539     {
540         ftdi_usb_close_internal (ftdi);
541         if (detach_errno == EPERM)
542         {
543             ftdi_error_return(-8, "inappropriate permissions on device!");
544         }
545         else
546         {
547             ftdi_error_return(-5, "unable to claim usb device. Make sure the default FTDI driver is not in use");
548         }
549     }
550
551     if (ftdi_usb_reset (ftdi) != 0)
552     {
553         ftdi_usb_close_internal (ftdi);
554         ftdi_error_return(-6, "ftdi_usb_reset failed");
555     }
556
557     // Try to guess chip type
558     // Bug in the BM type chips: bcdDevice is 0x200 for serial == 0
559     if (dev->descriptor.bcdDevice == 0x400 || (dev->descriptor.bcdDevice == 0x200
560             && dev->descriptor.iSerialNumber == 0))
561         ftdi->type = TYPE_BM;
562     else if (dev->descriptor.bcdDevice == 0x200)
563         ftdi->type = TYPE_AM;
564     else if (dev->descriptor.bcdDevice == 0x500)
565         ftdi->type = TYPE_2232C;
566     else if (dev->descriptor.bcdDevice == 0x600)
567         ftdi->type = TYPE_R;
568     else if (dev->descriptor.bcdDevice == 0x700)
569         ftdi->type = TYPE_2232H;
570     else if (dev->descriptor.bcdDevice == 0x800)
571         ftdi->type = TYPE_4232H;
572
573     // Set default interface on dual/quad type chips
574     switch(ftdi->type)
575     {
576         case TYPE_2232C:
577         case TYPE_2232H:
578         case TYPE_4232H:
579             if (!ftdi->index)
580                 ftdi->index = INTERFACE_A;
581             break;
582         default:
583             break;
584     }
585
586     // Determine maximum packet size
587     ftdi->max_packet_size = _ftdi_determine_max_packet_size(ftdi, dev);
588
589     if (ftdi_set_baudrate (ftdi, 9600) != 0)
590     {
591         ftdi_usb_close_internal (ftdi);
592         ftdi_error_return(-7, "set baudrate failed");
593     }
594
595     ftdi_error_return(0, "all fine");
596 }
597
598 /**
599     Opens the first device with a given vendor and product ids.
600
601     \param ftdi pointer to ftdi_context
602     \param vendor Vendor ID
603     \param product Product ID
604
605     \retval same as ftdi_usb_open_desc()
606 */
607 int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
608 {
609     return ftdi_usb_open_desc(ftdi, vendor, product, NULL, NULL);
610 }
611
612 /**
613     Opens the first device with a given, vendor id, product id,
614     description and serial.
615
616     \param ftdi pointer to ftdi_context
617     \param vendor Vendor ID
618     \param product Product ID
619     \param description Description to search for. Use NULL if not needed.
620     \param serial Serial to search for. Use NULL if not needed.
621
622     \retval  0: all fine
623     \retval -1: usb_find_busses() failed
624     \retval -2: usb_find_devices() failed
625     \retval -3: usb device not found
626     \retval -4: unable to open device
627     \retval -5: unable to claim device
628     \retval -6: reset failed
629     \retval -7: set baudrate failed
630     \retval -8: get product description failed
631     \retval -9: get serial number failed
632     \retval -10: unable to close device
633 */
634 int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
635                        const char* description, const char* serial)
636 {
637     return ftdi_usb_open_desc_index(ftdi,vendor,product,description,serial,0);
638 }
639
640 /**
641     Opens the index-th device with a given, vendor id, product id,
642     description and serial.
643
644     \param ftdi pointer to ftdi_context
645     \param vendor Vendor ID
646     \param product Product ID
647     \param description Description to search for. Use NULL if not needed.
648     \param serial Serial to search for. Use NULL if not needed.
649     \param index Number of matching device to open if there are more than one, starts with 0.
650
651     \retval  0: all fine
652     \retval -1: usb_find_busses() failed
653     \retval -2: usb_find_devices() failed
654     \retval -3: usb device not found
655     \retval -4: unable to open device
656     \retval -5: unable to claim device
657     \retval -6: reset failed
658     \retval -7: set baudrate failed
659     \retval -8: get product description failed
660     \retval -9: get serial number failed
661     \retval -10: unable to close device
662     \retval -11: ftdi context invalid
663 */
664 int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,
665                        const char* description, const char* serial, unsigned int index)
666 {
667     struct usb_bus *bus;
668     struct usb_device *dev;
669     char string[256];
670
671     usb_init();
672
673     if (usb_find_busses() < 0)
674         ftdi_error_return(-1, "usb_find_busses() failed");
675     if (usb_find_devices() < 0)
676         ftdi_error_return(-2, "usb_find_devices() failed");
677
678     if (ftdi == NULL)
679         ftdi_error_return(-11, "ftdi context invalid");
680
681     for (bus = usb_get_busses(); bus; bus = bus->next)
682     {
683         for (dev = bus->devices; dev; dev = dev->next)
684         {
685             if (dev->descriptor.idVendor == vendor
686                     && dev->descriptor.idProduct == product)
687             {
688                 if (!(ftdi->usb_dev = usb_open(dev)))
689                     ftdi_error_return(-4, "usb_open() failed");
690
691                 if (description != NULL)
692                 {
693                     if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, string, sizeof(string)) <= 0)
694                     {
695                         ftdi_usb_close_internal (ftdi);
696                         ftdi_error_return(-8, "unable to fetch product description");
697                     }
698                     if (strncmp(string, description, sizeof(string)) != 0)
699                     {
700                         if (ftdi_usb_close_internal (ftdi) != 0)
701                             ftdi_error_return(-10, "unable to close device");
702                         continue;
703                     }
704                 }
705                 if (serial != NULL)
706                 {
707                     if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, string, sizeof(string)) <= 0)
708                     {
709                         ftdi_usb_close_internal (ftdi);
710                         ftdi_error_return(-9, "unable to fetch serial number");
711                     }
712                     if (strncmp(string, serial, sizeof(string)) != 0)
713                     {
714                         if (ftdi_usb_close_internal (ftdi) != 0)
715                             ftdi_error_return(-10, "unable to close device");
716                         continue;
717                     }
718                 }
719
720                 if (ftdi_usb_close_internal (ftdi) != 0)
721                     ftdi_error_return(-10, "unable to close device");
722
723                 if (index > 0)
724                 {
725                     index--;
726                     continue;
727                 }
728
729                 return ftdi_usb_open_dev(ftdi, dev);
730             }
731         }
732     }
733
734     // device not found
735     ftdi_error_return(-3, "device not found");
736 }
737
738 /**
739     Opens the ftdi-device described by a description-string.
740     Intended to be used for parsing a device-description given as commandline argument.
741
742     \param ftdi pointer to ftdi_context
743     \param description NULL-terminated description-string, using this format:
744         \li <tt>d:\<devicenode></tt> path of bus and device-node (e.g. "003/001") within usb device tree (usually at /proc/bus/usb/)
745         \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")
746         \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
747         \li <tt>s:\<vendor>:\<product>:\<serial></tt> first device with given vendor id, product id and serial string
748
749     \note The description format may be extended in later versions.
750
751     \retval  0: all fine
752     \retval -1: usb_find_busses() failed
753     \retval -2: usb_find_devices() failed
754     \retval -3: usb device not found
755     \retval -4: unable to open device
756     \retval -5: unable to claim device
757     \retval -6: reset failed
758     \retval -7: set baudrate failed
759     \retval -8: get product description failed
760     \retval -9: get serial number failed
761     \retval -10: unable to close device
762     \retval -11: illegal description format
763     \retval -12: ftdi context invalid
764 */
765 int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description)
766 {
767     if (ftdi == NULL)
768         ftdi_error_return(-12, "ftdi context invalid");
769
770     if (description[0] == 0 || description[1] != ':')
771         ftdi_error_return(-11, "illegal description format");
772
773     if (description[0] == 'd')
774     {
775         struct usb_bus *bus;
776         struct usb_device *dev;
777
778         usb_init();
779
780         if (usb_find_busses() < 0)
781             ftdi_error_return(-1, "usb_find_busses() failed");
782         if (usb_find_devices() < 0)
783             ftdi_error_return(-2, "usb_find_devices() failed");
784
785         for (bus = usb_get_busses(); bus; bus = bus->next)
786         {
787             for (dev = bus->devices; dev; dev = dev->next)
788             {
789                 /* XXX: This doesn't handle symlinks/odd paths/etc... */
790                 const char *desc = description + 2;
791                 size_t len = strlen(bus->dirname);
792                 if (strncmp(desc, bus->dirname, len))
793                     continue;
794                 desc += len;
795                 if (desc[0] != '/')
796                     continue;
797                 ++desc;
798                 if (strcmp(desc, dev->filename))
799                     continue;
800                 return ftdi_usb_open_dev(ftdi, dev);
801             }
802         }
803
804         // device not found
805         ftdi_error_return(-3, "device not found");
806     }
807     else if (description[0] == 'i' || description[0] == 's')
808     {
809         unsigned int vendor;
810         unsigned int product;
811         unsigned int index=0;
812         const char *serial=NULL;
813         const char *startp, *endp;
814
815         errno=0;
816         startp=description+2;
817         vendor=strtoul((char*)startp,(char**)&endp,0);
818         if (*endp != ':' || endp == startp || errno != 0)
819             ftdi_error_return(-11, "illegal description format");
820
821         startp=endp+1;
822         product=strtoul((char*)startp,(char**)&endp,0);
823         if (endp == startp || errno != 0)
824             ftdi_error_return(-11, "illegal description format");
825
826         if (description[0] == 'i' && *endp != 0)
827         {
828             /* optional index field in i-mode */
829             if (*endp != ':')
830                 ftdi_error_return(-11, "illegal description format");
831
832             startp=endp+1;
833             index=strtoul((char*)startp,(char**)&endp,0);
834             if (*endp != 0 || endp == startp || errno != 0)
835                 ftdi_error_return(-11, "illegal description format");
836         }
837         if (description[0] == 's')
838         {
839             if (*endp != ':')
840                 ftdi_error_return(-11, "illegal description format");
841
842             /* rest of the description is the serial */
843             serial=endp+1;
844         }
845
846         return ftdi_usb_open_desc_index(ftdi, vendor, product, NULL, serial, index);
847     }
848     else
849     {
850         ftdi_error_return(-11, "illegal description format");
851     }
852 }
853
854 /**
855     Resets the ftdi device.
856
857     \param ftdi pointer to ftdi_context
858
859     \retval  0: all fine
860     \retval -1: FTDI reset failed
861     \retval -2: USB device unavailable
862 */
863 int ftdi_usb_reset(struct ftdi_context *ftdi)
864 {
865     if (ftdi == NULL || ftdi->usb_dev == NULL)
866         ftdi_error_return(-2, "USB device unavailable");
867
868     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
869                         SIO_RESET_REQUEST, SIO_RESET_SIO,
870                         ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
871         ftdi_error_return(-1,"FTDI reset failed");
872
873     // Invalidate data in the readbuffer
874     ftdi->readbuffer_offset = 0;
875     ftdi->readbuffer_remaining = 0;
876
877     return 0;
878 }
879
880 /**
881     Clears the read buffer on the chip and the internal read buffer.
882
883     \param ftdi pointer to ftdi_context
884
885     \retval  0: all fine
886     \retval -1: read buffer purge failed
887     \retval -2: USB device unavailable
888 */
889 int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi)
890 {
891     if (ftdi == NULL || ftdi->usb_dev == NULL)
892         ftdi_error_return(-2, "USB device unavailable");
893
894     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
895                         SIO_RESET_REQUEST, SIO_RESET_PURGE_RX,
896                         ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
897         ftdi_error_return(-1, "FTDI purge of RX buffer failed");
898
899     // Invalidate data in the readbuffer
900     ftdi->readbuffer_offset = 0;
901     ftdi->readbuffer_remaining = 0;
902
903     return 0;
904 }
905
906 /**
907     Clears the write buffer on the chip.
908
909     \param ftdi pointer to ftdi_context
910
911     \retval  0: all fine
912     \retval -1: write buffer purge failed
913     \retval -2: USB device unavailable
914 */
915 int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi)
916 {
917     if (ftdi == NULL || ftdi->usb_dev == NULL)
918         ftdi_error_return(-2, "USB device unavailable");
919
920     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
921                         SIO_RESET_REQUEST, SIO_RESET_PURGE_TX,
922                         ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
923         ftdi_error_return(-1, "FTDI purge of TX buffer failed");
924
925     return 0;
926 }
927
928 /**
929     Clears the buffers on the chip and the internal read buffer.
930
931     \param ftdi pointer to ftdi_context
932
933     \retval  0: all fine
934     \retval -1: read buffer purge failed
935     \retval -2: write buffer purge failed
936     \retval -3: USB device unavailable
937 */
938 int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)
939 {
940     int result;
941
942     if (ftdi == NULL || ftdi->usb_dev == NULL)
943         ftdi_error_return(-3, "USB device unavailable");
944
945     result = ftdi_usb_purge_rx_buffer(ftdi);
946     if (result < 0)
947         return -1;
948
949     result = ftdi_usb_purge_tx_buffer(ftdi);
950     if (result < 0)
951         return -2;
952
953     return 0;
954 }
955
956
957
958 /**
959     Closes the ftdi device. Call ftdi_deinit() if you're cleaning up.
960
961     \param ftdi pointer to ftdi_context
962
963     \retval  0: all fine
964     \retval -1: usb_release failed
965     \retval -2: usb_close failed
966     \retval -3: ftdi context invalid
967 */
968 int ftdi_usb_close(struct ftdi_context *ftdi)
969 {
970     int rtn = 0;
971
972     if (ftdi == NULL)
973         ftdi_error_return(-3, "ftdi context invalid");
974
975 #ifdef LIBFTDI_LINUX_ASYNC_MODE
976     /* try to release some kernel resources */
977     ftdi_async_complete(ftdi,1);
978 #endif
979
980     if (ftdi->usb_dev != NULL)
981         if (usb_release_interface(ftdi->usb_dev, ftdi->interface) != 0)
982             rtn = -1;
983
984     if (ftdi_usb_close_internal (ftdi) != 0)
985         rtn = -2;
986
987     return rtn;
988 }
989
990 /**
991     ftdi_convert_baudrate returns nearest supported baud rate to that requested.
992     Function is only used internally
993     \internal
994 */
995 static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
996                                  unsigned short *value, unsigned short *index)
997 {
998     static const char am_adjust_up[8] = {0, 0, 0, 1, 0, 3, 2, 1};
999     static const char am_adjust_dn[8] = {0, 0, 0, 1, 0, 1, 2, 3};
1000     static const char frac_code[8] = {0, 3, 2, 4, 1, 5, 6, 7};
1001     int divisor, best_divisor, best_baud, best_baud_diff;
1002     unsigned long encoded_divisor;
1003     int i;
1004
1005     if (baudrate <= 0)
1006     {
1007         // Return error
1008         return -1;
1009     }
1010
1011     divisor = 24000000 / baudrate;
1012
1013     if (ftdi->type == TYPE_AM)
1014     {
1015         // Round down to supported fraction (AM only)
1016         divisor -= am_adjust_dn[divisor & 7];
1017     }
1018
1019     // Try this divisor and the one above it (because division rounds down)
1020     best_divisor = 0;
1021     best_baud = 0;
1022     best_baud_diff = 0;
1023     for (i = 0; i < 2; i++)
1024     {
1025         int try_divisor = divisor + i;
1026         int baud_estimate;
1027         int baud_diff;
1028
1029         // Round up to supported divisor value
1030         if (try_divisor <= 8)
1031         {
1032             // Round up to minimum supported divisor
1033             try_divisor = 8;
1034         }
1035         else if (ftdi->type != TYPE_AM && try_divisor < 12)
1036         {
1037             // BM doesn't support divisors 9 through 11 inclusive
1038             try_divisor = 12;
1039         }
1040         else if (divisor < 16)
1041         {
1042             // AM doesn't support divisors 9 through 15 inclusive
1043             try_divisor = 16;
1044         }
1045         else
1046         {
1047             if (ftdi->type == TYPE_AM)
1048             {
1049                 // Round up to supported fraction (AM only)
1050                 try_divisor += am_adjust_up[try_divisor & 7];
1051                 if (try_divisor > 0x1FFF8)
1052                 {
1053                     // Round down to maximum supported divisor value (for AM)
1054                     try_divisor = 0x1FFF8;
1055                 }
1056             }
1057             else
1058             {
1059                 if (try_divisor > 0x1FFFF)
1060                 {
1061                     // Round down to maximum supported divisor value (for BM)
1062                     try_divisor = 0x1FFFF;
1063                 }
1064             }
1065         }
1066         // Get estimated baud rate (to nearest integer)
1067         baud_estimate = (24000000 + (try_divisor / 2)) / try_divisor;
1068         // Get absolute difference from requested baud rate
1069         if (baud_estimate < baudrate)
1070         {
1071             baud_diff = baudrate - baud_estimate;
1072         }
1073         else
1074         {
1075             baud_diff = baud_estimate - baudrate;
1076         }
1077         if (i == 0 || baud_diff < best_baud_diff)
1078         {
1079             // Closest to requested baud rate so far
1080             best_divisor = try_divisor;
1081             best_baud = baud_estimate;
1082             best_baud_diff = baud_diff;
1083             if (baud_diff == 0)
1084             {
1085                 // Spot on! No point trying
1086                 break;
1087             }
1088         }
1089     }
1090     // Encode the best divisor value
1091     encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 7] << 14);
1092     // Deal with special cases for encoded value
1093     if (encoded_divisor == 1)
1094     {
1095         encoded_divisor = 0;    // 3000000 baud
1096     }
1097     else if (encoded_divisor == 0x4001)
1098     {
1099         encoded_divisor = 1;    // 2000000 baud (BM only)
1100     }
1101     // Split into "value" and "index" values
1102     *value = (unsigned short)(encoded_divisor & 0xFFFF);
1103     if (ftdi->type == TYPE_2232C || ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H)
1104     {
1105         *index = (unsigned short)(encoded_divisor >> 8);
1106         *index &= 0xFF00;
1107         *index |= ftdi->index;
1108     }
1109     else
1110         *index = (unsigned short)(encoded_divisor >> 16);
1111
1112     // Return the nearest baud rate
1113     return best_baud;
1114 }
1115
1116 /**
1117     Sets the chip baud rate
1118
1119     \param ftdi pointer to ftdi_context
1120     \param baudrate baud rate to set
1121
1122     \retval  0: all fine
1123     \retval -1: invalid baudrate
1124     \retval -2: setting baudrate failed
1125     \retval -3: USB device unavailable
1126 */
1127 int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
1128 {
1129     unsigned short value, index;
1130     int actual_baudrate;
1131
1132     if (ftdi == NULL || ftdi->usb_dev == NULL)
1133         ftdi_error_return(-3, "USB device unavailable");
1134
1135     if (ftdi->bitbang_enabled)
1136     {
1137         baudrate = baudrate*4;
1138     }
1139
1140     actual_baudrate = ftdi_convert_baudrate(baudrate, ftdi, &value, &index);
1141     if (actual_baudrate <= 0)
1142         ftdi_error_return (-1, "Silly baudrate <= 0.");
1143
1144     // Check within tolerance (about 5%)
1145     if ((actual_baudrate * 2 < baudrate /* Catch overflows */ )
1146             || ((actual_baudrate < baudrate)
1147                 ? (actual_baudrate * 21 < baudrate * 20)
1148                 : (baudrate * 21 < actual_baudrate * 20)))
1149         ftdi_error_return (-1, "Unsupported baudrate. Note: bitbang baudrates are automatically multiplied by 4");
1150
1151     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1152                         SIO_SET_BAUDRATE_REQUEST, value,
1153                         index, NULL, 0, ftdi->usb_write_timeout) != 0)
1154         ftdi_error_return (-2, "Setting new baudrate failed");
1155
1156     ftdi->baudrate = baudrate;
1157     return 0;
1158 }
1159
1160 /**
1161     Set (RS232) line characteristics.
1162     The break type can only be set via ftdi_set_line_property2()
1163     and defaults to "off".
1164
1165     \param ftdi pointer to ftdi_context
1166     \param bits Number of bits
1167     \param sbit Number of stop bits
1168     \param parity Parity mode
1169
1170     \retval  0: all fine
1171     \retval -1: Setting line property failed
1172 */
1173 int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
1174                            enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
1175 {
1176     return ftdi_set_line_property2(ftdi, bits, sbit, parity, BREAK_OFF);
1177 }
1178
1179 /**
1180     Set (RS232) line characteristics
1181
1182     \param ftdi pointer to ftdi_context
1183     \param bits Number of bits
1184     \param sbit Number of stop bits
1185     \param parity Parity mode
1186     \param break_type Break type
1187
1188     \retval  0: all fine
1189     \retval -1: Setting line property failed
1190     \retval -2: USB device unavailable
1191 */
1192 int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
1193                             enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
1194                             enum ftdi_break_type break_type)
1195 {
1196     unsigned short value = bits;
1197
1198     if (ftdi == NULL || ftdi->usb_dev == NULL)
1199         ftdi_error_return(-2, "USB device unavailable");
1200
1201     switch (parity)
1202     {
1203         case NONE:
1204             value |= (0x00 << 8);
1205             break;
1206         case ODD:
1207             value |= (0x01 << 8);
1208             break;
1209         case EVEN:
1210             value |= (0x02 << 8);
1211             break;
1212         case MARK:
1213             value |= (0x03 << 8);
1214             break;
1215         case SPACE:
1216             value |= (0x04 << 8);
1217             break;
1218     }
1219
1220     switch (sbit)
1221     {
1222         case STOP_BIT_1:
1223             value |= (0x00 << 11);
1224             break;
1225         case STOP_BIT_15:
1226             value |= (0x01 << 11);
1227             break;
1228         case STOP_BIT_2:
1229             value |= (0x02 << 11);
1230             break;
1231     }
1232
1233     switch (break_type)
1234     {
1235         case BREAK_OFF:
1236             value |= (0x00 << 14);
1237             break;
1238         case BREAK_ON:
1239             value |= (0x01 << 14);
1240             break;
1241     }
1242
1243     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1244                         SIO_SET_DATA_REQUEST, value,
1245                         ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1246         ftdi_error_return (-1, "Setting new line property failed");
1247
1248     return 0;
1249 }
1250
1251 /**
1252     Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip
1253
1254     \param ftdi pointer to ftdi_context
1255     \param buf Buffer with the data
1256     \param size Size of the buffer
1257
1258     \retval -666: USB device unavailable
1259     \retval <0: error code from usb_bulk_write()
1260     \retval >0: number of bytes written
1261 */
1262 int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1263 {
1264     int ret;
1265     int offset = 0;
1266     int total_written = 0;
1267
1268     if (ftdi == NULL || ftdi->usb_dev == NULL)
1269         ftdi_error_return(-666, "USB device unavailable");
1270
1271     while (offset < size)
1272     {
1273         int write_size = ftdi->writebuffer_chunksize;
1274
1275         if (offset+write_size > size)
1276             write_size = size-offset;
1277
1278         ret = usb_bulk_write(ftdi->usb_dev, ftdi->in_ep, buf+offset, write_size, ftdi->usb_write_timeout);
1279         if (ret < 0)
1280             ftdi_error_return(ret, "usb bulk write failed");
1281
1282         total_written += ret;
1283         offset += write_size;
1284     }
1285
1286     return total_written;
1287 }
1288
1289 #ifdef LIBFTDI_LINUX_ASYNC_MODE
1290 #ifdef USB_CLASS_PTP
1291 #error LIBFTDI_LINUX_ASYNC_MODE is not compatible with libusb-compat-0.1!
1292 #endif
1293 /* this is strongly dependent on libusb using the same struct layout. If libusb
1294    changes in some later version this may break horribly (this is for libusb 0.1.12) */
1295 struct usb_dev_handle
1296 {
1297     int fd;
1298     // some other stuff coming here we don't need
1299 };
1300
1301 /**
1302     Check for pending async urbs
1303     \internal
1304 */
1305 static int _usb_get_async_urbs_pending(struct ftdi_context *ftdi)
1306 {
1307     struct usbdevfs_urb *urb;
1308     int pending=0;
1309     unsigned int i;
1310
1311     for (i=0; i < ftdi->async_usb_buffer_size; i++)
1312     {
1313         urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
1314         if (urb->usercontext != FTDI_URB_USERCONTEXT_COOKIE)
1315             pending++;
1316     }
1317
1318     return pending;
1319 }
1320
1321 /**
1322     Wait until one or more async URBs are completed by the kernel and mark their
1323     positions in the async-buffer as unused
1324
1325     \param ftdi pointer to ftdi_context
1326     \param wait_for_more if != 0 wait for more than one write to complete
1327     \param timeout_msec max milliseconds to wait
1328
1329     \internal
1330 */
1331 static void _usb_async_cleanup(struct ftdi_context *ftdi, int wait_for_more, int timeout_msec)
1332 {
1333     struct timeval tv;
1334     struct usbdevfs_urb *urb;
1335     int ret;
1336     fd_set writefds;
1337     int keep_going=0;
1338
1339     FD_ZERO(&writefds);
1340     FD_SET(ftdi->usb_dev->fd, &writefds);
1341
1342     /* init timeout only once, select writes time left after call */
1343     tv.tv_sec = timeout_msec / 1000;
1344     tv.tv_usec = (timeout_msec % 1000) * 1000;
1345
1346     do
1347     {
1348         ret = -1;
1349         urb = NULL;
1350
1351         while (_usb_get_async_urbs_pending(ftdi)
1352                 && (ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_REAPURBNDELAY, &urb)) == -1
1353                 && errno == EAGAIN)
1354         {
1355             if (keep_going && !wait_for_more)
1356             {
1357                 /* don't wait if repeating only for keep_going */
1358                 keep_going=0;
1359                 break;
1360             }
1361
1362             /* wait for timeout msec or something written ready */
1363             select(ftdi->usb_dev->fd+1, NULL, &writefds, NULL, &tv);
1364         }
1365
1366         if (ret == 0 && urb != NULL)
1367         {
1368             /* got a free urb, mark it */
1369             urb->usercontext = FTDI_URB_USERCONTEXT_COOKIE;
1370
1371             /* try to get more urbs that are ready now, but don't wait anymore */
1372             keep_going=1;
1373         }
1374         else
1375         {
1376             /* no more urbs waiting */
1377             keep_going=0;
1378         }
1379     }
1380     while (keep_going);
1381 }
1382
1383 /**
1384     Wait until one or more async URBs are completed by the kernel and mark their
1385     positions in the async-buffer as unused.
1386
1387     \param ftdi pointer to ftdi_context
1388     \param wait_for_more if != 0 wait for more than one write to complete (until write timeout)
1389 */
1390 void ftdi_async_complete(struct ftdi_context *ftdi, int wait_for_more)
1391 {
1392     _usb_async_cleanup(ftdi,wait_for_more,ftdi->usb_write_timeout);
1393 }
1394
1395 /**
1396     Stupid libusb does not offer async writes nor does it allow
1397     access to its fd - so we need some hacks here.
1398     \internal
1399 */
1400 static int _usb_bulk_write_async(struct ftdi_context *ftdi, int ep, char *bytes, int size)
1401 {
1402     struct usbdevfs_urb *urb;
1403     int bytesdone = 0, requested;
1404     int ret, cleanup_count;
1405     unsigned int i;
1406
1407     do
1408     {
1409         /* find a free urb buffer we can use */
1410         i = 0;
1411         urb=NULL;
1412         for (cleanup_count=0; urb==NULL && cleanup_count <= 1; cleanup_count++)
1413         {
1414             if (i==ftdi->async_usb_buffer_size)
1415             {
1416                 /* wait until some buffers are free */
1417                 _usb_async_cleanup(ftdi,0,ftdi->usb_write_timeout);
1418             }
1419
1420             for (i=0; i < ftdi->async_usb_buffer_size; i++)
1421             {
1422                 urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
1423                 if (urb->usercontext == FTDI_URB_USERCONTEXT_COOKIE)
1424                     break;  /* found a free urb position */
1425                 urb=NULL;
1426             }
1427         }
1428
1429         /* no free urb position found */
1430         if (urb==NULL)
1431             return -1;
1432
1433         requested = size - bytesdone;
1434         if (requested > 4096)
1435             requested = 4096;
1436
1437         memset(urb,0,sizeof(urb));
1438
1439         urb->type = USBDEVFS_URB_TYPE_BULK;
1440         urb->endpoint = ep;
1441         urb->flags = 0;
1442         urb->buffer = bytes + bytesdone;
1443         urb->buffer_length = requested;
1444         urb->signr = 0;
1445         urb->actual_length = 0;
1446         urb->number_of_packets = 0;
1447         urb->usercontext = 0;
1448
1449         do
1450         {
1451             ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_SUBMITURB, urb);
1452         }
1453         while (ret < 0 && errno == EINTR);
1454         if (ret < 0)
1455             return ret;       /* the caller can read errno to get more info */
1456
1457         bytesdone += requested;
1458     }
1459     while (bytesdone < size);
1460     return bytesdone;
1461 }
1462
1463 /**
1464     Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip.
1465     Does not wait for completion of the transfer nor does it make sure that
1466     the transfer was successful.
1467
1468     This function could be extended to use signals and callbacks to inform the
1469     caller of completion or error - but this is not done yet, volunteers welcome.
1470
1471     Works around libusb and directly accesses functions only available on Linux.
1472     Only available if compiled with --with-async-mode.
1473
1474     \param ftdi pointer to ftdi_context
1475     \param buf Buffer with the data
1476     \param size Size of the buffer
1477
1478     \retval -666: USB device unavailable
1479     \retval <0: error code from usb_bulk_write()
1480     \retval >0: number of bytes written
1481 */
1482 int ftdi_write_data_async(struct ftdi_context *ftdi, unsigned char *buf, int size)
1483 {
1484     int ret;
1485     int offset = 0;
1486     int total_written = 0;
1487
1488     if (ftdi == NULL || ftdi->usb_dev == NULL)
1489         ftdi_error_return(-666, "USB device unavailable");
1490
1491     while (offset < size)
1492     {
1493         int write_size = ftdi->writebuffer_chunksize;
1494
1495         if (offset+write_size > size)
1496             write_size = size-offset;
1497
1498         ret = _usb_bulk_write_async(ftdi, ftdi->in_ep, buf+offset, write_size);
1499         if (ret < 0)
1500             ftdi_error_return(ret, "usb bulk write async failed");
1501
1502         total_written += ret;
1503         offset += write_size;
1504     }
1505
1506     return total_written;
1507 }
1508 #endif // LIBFTDI_LINUX_ASYNC_MODE
1509
1510 /**
1511     Configure write buffer chunk size.
1512     Default is 4096.
1513
1514     \param ftdi pointer to ftdi_context
1515     \param chunksize Chunk size
1516
1517     \retval 0: all fine
1518     \retval -1: ftdi context invalid
1519 */
1520 int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1521 {
1522     if (ftdi == NULL)
1523         ftdi_error_return(-1, "ftdi context invalid");
1524
1525     ftdi->writebuffer_chunksize = chunksize;
1526     return 0;
1527 }
1528
1529 /**
1530     Get write buffer chunk size.
1531
1532     \param ftdi pointer to ftdi_context
1533     \param chunksize Pointer to store chunk size in
1534
1535     \retval 0: all fine
1536     \retval -1: ftdi context invalid
1537 */
1538 int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1539 {
1540     if (ftdi == NULL)
1541         ftdi_error_return(-1, "ftdi context invalid");
1542
1543     *chunksize = ftdi->writebuffer_chunksize;
1544     return 0;
1545 }
1546
1547 /**
1548     Reads data in chunks (see ftdi_read_data_set_chunksize()) from the chip.
1549
1550     Automatically strips the two modem status bytes transfered during every read.
1551
1552     \param ftdi pointer to ftdi_context
1553     \param buf Buffer to store data in
1554     \param size Size of the buffer
1555
1556     \retval -666: USB device unavailable
1557     \retval <0: error code from usb_bulk_read()
1558     \retval  0: no data was available
1559     \retval >0: number of bytes read
1560
1561 */
1562 int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1563 {
1564     int offset = 0, ret = 1, i, num_of_chunks, chunk_remains;
1565     int packet_size;
1566     struct timeval tv_start, tv_current;
1567
1568     if (ftdi == NULL || ftdi->usb_dev == NULL)
1569         ftdi_error_return(-666, "USB device unavailable");
1570
1571     packet_size = ftdi->max_packet_size;
1572     // Packet size sanity check (avoid division by zero)
1573     if (packet_size == 0)
1574         ftdi_error_return(-1, "max_packet_size is bogus (zero)");
1575
1576     // everything we want is still in the readbuffer?
1577     if (size <= ftdi->readbuffer_remaining)
1578     {
1579         memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1580
1581         // Fix offsets
1582         ftdi->readbuffer_remaining -= size;
1583         ftdi->readbuffer_offset += size;
1584
1585         /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
1586
1587         return size;
1588     }
1589     // something still in the readbuffer, but not enough to satisfy 'size'?
1590     if (ftdi->readbuffer_remaining != 0)
1591     {
1592         memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
1593
1594         // Fix offset
1595         offset += ftdi->readbuffer_remaining;
1596     }
1597     // do the actual USB read
1598     gettimeofday(&tv_start,NULL);
1599     while (offset < size && ret > 0)
1600     {
1601         ftdi->readbuffer_remaining = 0;
1602         ftdi->readbuffer_offset = 0;
1603         /* returns how much received */
1604         ret = usb_bulk_read (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, ftdi->usb_read_timeout);
1605         if (ret < 0)
1606             ftdi_error_return(ret, "usb bulk read failed");
1607
1608         if (ret > 2)
1609         {
1610             // skip FTDI status bytes.
1611             // Maybe stored in the future to enable modem use
1612             num_of_chunks = ret / packet_size;
1613             chunk_remains = ret % packet_size;
1614             //printf("ret = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", ret, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1615
1616             ftdi->readbuffer_offset += 2;
1617             ret -= 2;
1618
1619             if (ret > packet_size - 2)
1620             {
1621                 for (i = 1; i < num_of_chunks; i++)
1622                     memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1623                              ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1624                              packet_size - 2);
1625                 if (chunk_remains > 2)
1626                 {
1627                     memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1628                              ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1629                              chunk_remains-2);
1630                     ret -= 2*num_of_chunks;
1631                 }
1632                 else
1633                     ret -= 2*(num_of_chunks-1)+chunk_remains;
1634             }
1635             // data still fits in buf?
1636             if (offset+ret <= size)
1637             {
1638                 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, ret);
1639                 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
1640                 offset += ret;
1641
1642                 /* Did we read exactly the right amount of bytes? */
1643                 if (offset == size)
1644                     //printf("read_data exact rem %d offset %d\n",
1645                     //ftdi->readbuffer_remaining, offset);
1646                     return offset;
1647             }
1648             else
1649             {
1650                 // only copy part of the data or size <= readbuffer_chunksize
1651                 int part_size = size-offset;
1652                 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, part_size);
1653
1654                 ftdi->readbuffer_offset += part_size;
1655                 ftdi->readbuffer_remaining = ret-part_size;
1656                 offset += part_size;
1657
1658                 /* printf("Returning part: %d - size: %d - offset: %d - ret: %d - remaining: %d\n",
1659                 part_size, size, offset, ret, ftdi->readbuffer_remaining); */
1660
1661                 return offset;
1662             }
1663         }
1664         gettimeofday(&tv_current,NULL);
1665         if(((tv_current.tv_sec - tv_start.tv_sec)*1000000+(tv_current.tv_usec - tv_start.tv_usec)) 
1666            > ftdi->usb_read_timeout)
1667             return offset;
1668     }
1669     // never reached
1670     return -127;
1671 }
1672
1673 /**
1674     Configure read buffer chunk size.
1675     Default is 4096.
1676
1677     Automatically reallocates the buffer.
1678
1679     \param ftdi pointer to ftdi_context
1680     \param chunksize Chunk size
1681
1682     \retval 0: all fine
1683     \retval -1: ftdi context invalid
1684 */
1685 int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1686 {
1687     unsigned char *new_buf;
1688
1689     if (ftdi == NULL)
1690         ftdi_error_return(-1, "ftdi context invalid");
1691
1692     // Invalidate all remaining data
1693     ftdi->readbuffer_offset = 0;
1694     ftdi->readbuffer_remaining = 0;
1695
1696     if ((new_buf = (unsigned char *)realloc(ftdi->readbuffer, chunksize)) == NULL)
1697         ftdi_error_return(-1, "out of memory for readbuffer");
1698
1699     ftdi->readbuffer = new_buf;
1700     ftdi->readbuffer_chunksize = chunksize;
1701
1702     return 0;
1703 }
1704
1705 /**
1706     Get read buffer chunk size.
1707
1708     \param ftdi pointer to ftdi_context
1709     \param chunksize Pointer to store chunk size in
1710
1711     \retval 0: all fine
1712     \retval -1: FTDI context invalid
1713 */
1714 int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1715 {
1716     if (ftdi == NULL)
1717         ftdi_error_return(-1, "FTDI context invalid");
1718
1719     *chunksize = ftdi->readbuffer_chunksize;
1720     return 0;
1721 }
1722
1723
1724 /**
1725     Enable bitbang mode.
1726
1727     \deprecated use \ref ftdi_set_bitmode with mode BITMODE_BITBANG instead
1728
1729     \param ftdi pointer to ftdi_context
1730     \param bitmask Bitmask to configure lines.
1731            HIGH/ON value configures a line as output.
1732
1733     \retval  0: all fine
1734     \retval -1: can't enable bitbang mode
1735     \retval -2: USB device unavailable
1736 */
1737 int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
1738 {
1739     unsigned short usb_val;
1740
1741     if (ftdi == NULL || ftdi->usb_dev == NULL)
1742         ftdi_error_return(-2, "USB device unavailable");
1743
1744     usb_val = bitmask; // low byte: bitmask
1745     /* FT2232C: Set bitbang_mode to 2 to enable SPI */
1746     usb_val |= (ftdi->bitbang_mode << 8);
1747
1748     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1749                         SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index,
1750                         NULL, 0, ftdi->usb_write_timeout) != 0)
1751         ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
1752
1753     ftdi->bitbang_enabled = 1;
1754     return 0;
1755 }
1756
1757 /**
1758     Disable bitbang mode.
1759
1760     \param ftdi pointer to ftdi_context
1761
1762     \retval  0: all fine
1763     \retval -1: can't disable bitbang mode
1764     \retval -2: USB device unavailable
1765 */
1766 int ftdi_disable_bitbang(struct ftdi_context *ftdi)
1767 {
1768     if (ftdi == NULL || ftdi->usb_dev == NULL)
1769         ftdi_error_return(-2, "USB device unavailable");
1770
1771     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1772         ftdi_error_return(-1, "unable to leave bitbang mode. Perhaps not a BM type chip?");
1773
1774     ftdi->bitbang_enabled = 0;
1775     return 0;
1776 }
1777
1778 /**
1779     Enable/disable bitbang modes.
1780
1781     \param ftdi pointer to ftdi_context
1782     \param bitmask Bitmask to configure lines.
1783            HIGH/ON value configures a line as output.
1784     \param mode Bitbang mode: use the values defined in \ref ftdi_mpsse_mode
1785
1786     \retval  0: all fine
1787     \retval -1: can't enable bitbang mode
1788     \retval -2: USB device unavailable
1789 */
1790 int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
1791 {
1792     unsigned short usb_val;
1793
1794     if (ftdi == NULL || ftdi->usb_dev == NULL)
1795         ftdi_error_return(-2, "USB device unavailable");
1796
1797     usb_val = bitmask; // low byte: bitmask
1798     usb_val |= (mode << 8);
1799     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1800         ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps selected mode not supported on your chip?");
1801
1802     ftdi->bitbang_mode = mode;
1803     ftdi->bitbang_enabled = (mode == BITMODE_RESET) ? 0 : 1;
1804     return 0;
1805 }
1806
1807 /**
1808     Directly read pin state, circumventing the read buffer. Useful for bitbang mode.
1809
1810     \param ftdi pointer to ftdi_context
1811     \param pins Pointer to store pins into
1812
1813     \retval  0: all fine
1814     \retval -1: read pins failed
1815     \retval -2: USB device unavailable
1816 */
1817 int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins)
1818 {
1819     if (ftdi == NULL || ftdi->usb_dev == NULL)
1820         ftdi_error_return(-2, "USB device unavailable");
1821
1822     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_PINS_REQUEST, 0, ftdi->index, (char *)pins, 1, ftdi->usb_read_timeout) != 1)
1823         ftdi_error_return(-1, "read pins failed");
1824
1825     return 0;
1826 }
1827
1828 /**
1829     Set latency timer
1830
1831     The FTDI chip keeps data in the internal buffer for a specific
1832     amount of time if the buffer is not full yet to decrease
1833     load on the usb bus.
1834
1835     \param ftdi pointer to ftdi_context
1836     \param latency Value between 1 and 255
1837
1838     \retval  0: all fine
1839     \retval -1: latency out of range
1840     \retval -2: unable to set latency timer
1841     \retval -3: USB device unavailable
1842 */
1843 int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
1844 {
1845     unsigned short usb_val;
1846
1847     if (latency < 1)
1848         ftdi_error_return(-1, "latency out of range. Only valid for 1-255");
1849
1850     if (ftdi == NULL || ftdi->usb_dev == NULL)
1851         ftdi_error_return(-3, "USB device unavailable");
1852
1853     usb_val = latency;
1854     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_LATENCY_TIMER_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1855         ftdi_error_return(-2, "unable to set latency timer");
1856
1857     return 0;
1858 }
1859
1860 /**
1861     Get latency timer
1862
1863     \param ftdi pointer to ftdi_context
1864     \param latency Pointer to store latency value in
1865
1866     \retval  0: all fine
1867     \retval -1: unable to get latency timer
1868     \retval -2: USB device unavailable
1869 */
1870 int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency)
1871 {
1872     unsigned short usb_val;
1873
1874     if (ftdi == NULL || ftdi->usb_dev == NULL)
1875         ftdi_error_return(-2, "USB device unavailable");
1876
1877     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_GET_LATENCY_TIMER_REQUEST, 0, ftdi->index, (char *)&usb_val, 1, ftdi->usb_read_timeout) != 1)
1878         ftdi_error_return(-1, "reading latency timer failed");
1879
1880     *latency = (unsigned char)usb_val;
1881     return 0;
1882 }
1883
1884 /**
1885     Poll modem status information
1886
1887     This function allows the retrieve the two status bytes of the device.
1888     The device sends these bytes also as a header for each read access
1889     where they are discarded by ftdi_read_data(). The chip generates
1890     the two stripped status bytes in the absence of data every 40 ms.
1891
1892     Layout of the first byte:
1893     - B0..B3 - must be 0
1894     - B4       Clear to send (CTS)
1895                  0 = inactive
1896                  1 = active
1897     - B5       Data set ready (DTS)
1898                  0 = inactive
1899                  1 = active
1900     - B6       Ring indicator (RI)
1901                  0 = inactive
1902                  1 = active
1903     - B7       Receive line signal detect (RLSD)
1904                  0 = inactive
1905                  1 = active
1906
1907     Layout of the second byte:
1908     - B0       Data ready (DR)
1909     - B1       Overrun error (OE)
1910     - B2       Parity error (PE)
1911     - B3       Framing error (FE)
1912     - B4       Break interrupt (BI)
1913     - B5       Transmitter holding register (THRE)
1914     - B6       Transmitter empty (TEMT)
1915     - B7       Error in RCVR FIFO
1916
1917     \param ftdi pointer to ftdi_context
1918     \param status Pointer to store status information in. Must be two bytes.
1919
1920     \retval  0: all fine
1921     \retval -1: unable to retrieve status information
1922     \retval -2: USB device unavailable
1923 */
1924 int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status)
1925 {
1926     char usb_val[2];
1927
1928     if (ftdi == NULL || ftdi->usb_dev == NULL)
1929         ftdi_error_return(-2, "USB device unavailable");
1930
1931     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_POLL_MODEM_STATUS_REQUEST, 0, ftdi->index, usb_val, 2, ftdi->usb_read_timeout) != 2)
1932         ftdi_error_return(-1, "getting modem status failed");
1933
1934     *status = (usb_val[1] << 8) | usb_val[0];
1935
1936     return 0;
1937 }
1938
1939 /**
1940     Set flowcontrol for ftdi chip
1941
1942     \param ftdi pointer to ftdi_context
1943     \param flowctrl flow control to use. should be
1944            SIO_DISABLE_FLOW_CTRL, SIO_RTS_CTS_HS, SIO_DTR_DSR_HS or SIO_XON_XOFF_HS
1945
1946     \retval  0: all fine
1947     \retval -1: set flow control failed
1948     \retval -2: USB device unavailable
1949 */
1950 int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl)
1951 {
1952     if (ftdi == NULL || ftdi->usb_dev == NULL)
1953         ftdi_error_return(-2, "USB device unavailable");
1954
1955     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1956                         SIO_SET_FLOW_CTRL_REQUEST, 0, (flowctrl | ftdi->index),
1957                         NULL, 0, ftdi->usb_write_timeout) != 0)
1958         ftdi_error_return(-1, "set flow control failed");
1959
1960     return 0;
1961 }
1962
1963 /**
1964     Set dtr line
1965
1966     \param ftdi pointer to ftdi_context
1967     \param state state to set line to (1 or 0)
1968
1969     \retval  0: all fine
1970     \retval -1: set dtr failed
1971     \retval -2: USB device unavailable
1972 */
1973 int ftdi_setdtr(struct ftdi_context *ftdi, int state)
1974 {
1975     unsigned short usb_val;
1976
1977     if (ftdi == NULL || ftdi->usb_dev == NULL)
1978         ftdi_error_return(-2, "USB device unavailable");
1979
1980     if (state)
1981         usb_val = SIO_SET_DTR_HIGH;
1982     else
1983         usb_val = SIO_SET_DTR_LOW;
1984
1985     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1986                         SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
1987                         NULL, 0, ftdi->usb_write_timeout) != 0)
1988         ftdi_error_return(-1, "set dtr failed");
1989
1990     return 0;
1991 }
1992
1993 /**
1994     Set rts line
1995
1996     \param ftdi pointer to ftdi_context
1997     \param state state to set line to (1 or 0)
1998
1999     \retval  0: all fine
2000     \retval -1: set rts failed
2001     \retval -2: USB device unavailable
2002 */
2003 int ftdi_setrts(struct ftdi_context *ftdi, int state)
2004 {
2005     unsigned short usb_val;
2006
2007     if (ftdi == NULL || ftdi->usb_dev == NULL)
2008         ftdi_error_return(-2, "USB device unavailable");
2009
2010     if (state)
2011         usb_val = SIO_SET_RTS_HIGH;
2012     else
2013         usb_val = SIO_SET_RTS_LOW;
2014
2015     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2016                         SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2017                         NULL, 0, ftdi->usb_write_timeout) != 0)
2018         ftdi_error_return(-1, "set of rts failed");
2019
2020     return 0;
2021 }
2022
2023 /**
2024     Set dtr and rts line in one pass
2025
2026     \param ftdi pointer to ftdi_context
2027     \param dtr  DTR state to set line to (1 or 0)
2028     \param rts  RTS state to set line to (1 or 0)
2029
2030     \retval  0: all fine
2031     \retval -1: set dtr/rts failed
2032     \retval -2: USB device unavailable
2033  */
2034 int ftdi_setdtr_rts(struct ftdi_context *ftdi, int dtr, int rts)
2035 {
2036     unsigned short usb_val;
2037
2038     if (ftdi == NULL || ftdi->usb_dev == NULL)
2039         ftdi_error_return(-2, "USB device unavailable");
2040
2041     if (dtr)
2042         usb_val = SIO_SET_DTR_HIGH;
2043     else
2044         usb_val = SIO_SET_DTR_LOW;
2045
2046     if (rts)
2047         usb_val |= SIO_SET_RTS_HIGH;
2048     else
2049         usb_val |= SIO_SET_RTS_LOW;
2050
2051     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2052                         SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2053                         NULL, 0, ftdi->usb_write_timeout) != 0)
2054         ftdi_error_return(-1, "set of rts/dtr failed");
2055
2056     return 0;
2057 }
2058
2059 /**
2060     Set the special event character
2061
2062     \param ftdi pointer to ftdi_context
2063     \param eventch Event character
2064     \param enable 0 to disable the event character, non-zero otherwise
2065
2066     \retval  0: all fine
2067     \retval -1: unable to set event character
2068     \retval -2: USB device unavailable
2069 */
2070 int ftdi_set_event_char(struct ftdi_context *ftdi,
2071                         unsigned char eventch, unsigned char enable)
2072 {
2073     unsigned short usb_val;
2074
2075     if (ftdi == NULL || ftdi->usb_dev == NULL)
2076         ftdi_error_return(-2, "USB device unavailable");
2077
2078     usb_val = eventch;
2079     if (enable)
2080         usb_val |= 1 << 8;
2081
2082     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_EVENT_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
2083         ftdi_error_return(-1, "setting event character failed");
2084
2085     return 0;
2086 }
2087
2088 /**
2089     Set error character
2090
2091     \param ftdi pointer to ftdi_context
2092     \param errorch Error character
2093     \param enable 0 to disable the error character, non-zero otherwise
2094
2095     \retval  0: all fine
2096     \retval -1: unable to set error character
2097     \retval -2: USB device unavailable
2098 */
2099 int ftdi_set_error_char(struct ftdi_context *ftdi,
2100                         unsigned char errorch, unsigned char enable)
2101 {
2102     unsigned short usb_val;
2103
2104     if (ftdi == NULL || ftdi->usb_dev == NULL)
2105         ftdi_error_return(-2, "USB device unavailable");
2106
2107     usb_val = errorch;
2108     if (enable)
2109         usb_val |= 1 << 8;
2110
2111     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_ERROR_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
2112         ftdi_error_return(-1, "setting error character failed");
2113
2114     return 0;
2115 }
2116
2117 /**
2118    Set the eeprom size
2119
2120    \param ftdi pointer to ftdi_context
2121    \param eeprom Pointer to ftdi_eeprom
2122    \param size
2123
2124 */
2125 void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size)
2126 {
2127     if (ftdi == NULL)
2128         return;
2129
2130     ftdi->eeprom_size=size;
2131     eeprom->size=size;
2132 }
2133
2134 /**
2135     Init eeprom with default values.
2136
2137     \param eeprom Pointer to ftdi_eeprom
2138 */
2139 void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
2140 {
2141     int i;
2142
2143     if (eeprom == NULL)
2144         return;
2145
2146     eeprom->vendor_id = 0x0403;
2147     eeprom->product_id = 0x6001;
2148
2149     eeprom->self_powered = 1;
2150     eeprom->remote_wakeup = 1;
2151     eeprom->chip_type = TYPE_BM;
2152
2153     eeprom->in_is_isochronous = 0;
2154     eeprom->out_is_isochronous = 0;
2155     eeprom->suspend_pull_downs = 0;
2156
2157     eeprom->use_serial = 0;
2158     eeprom->change_usb_version = 0;
2159     eeprom->usb_version = 0x0200;
2160     eeprom->max_power = 0;
2161
2162     eeprom->manufacturer = NULL;
2163     eeprom->product = NULL;
2164     eeprom->serial = NULL;
2165     for (i=0; i < 5; i++)
2166     {
2167         eeprom->cbus_function[i] = 0;
2168     }
2169     eeprom->high_current = 0;
2170     eeprom->invert = 0;
2171
2172     eeprom->size = FTDI_DEFAULT_EEPROM_SIZE;
2173 }
2174
2175 /**
2176     Frees allocated memory in eeprom.
2177
2178     \param eeprom Pointer to ftdi_eeprom
2179 */
2180 void ftdi_eeprom_free(struct ftdi_eeprom *eeprom)
2181 {
2182     if (!eeprom)
2183         return;
2184
2185     if (eeprom->manufacturer != 0) {
2186         free(eeprom->manufacturer);
2187         eeprom->manufacturer = 0;
2188     }
2189     if (eeprom->product != 0) {
2190         free(eeprom->product);
2191         eeprom->product = 0;
2192     }
2193     if (eeprom->serial != 0) {
2194         free(eeprom->serial);
2195         eeprom->serial = 0;
2196     }
2197 }
2198
2199 /**
2200     Build binary output from ftdi_eeprom structure.
2201     Output is suitable for ftdi_write_eeprom().
2202
2203     \note This function doesn't handle FT2232x devices. Only FT232x.
2204     \param eeprom Pointer to ftdi_eeprom
2205     \param output Buffer of 128 bytes to store eeprom image to
2206
2207     \retval >0: free eeprom size
2208     \retval -1: eeprom size (128 bytes) exceeded by custom strings
2209     \retval -2: Invalid eeprom pointer
2210     \retval -3: Invalid cbus function setting
2211     \retval -4: Chip doesn't support invert
2212     \retval -5: Chip doesn't support high current drive
2213 */
2214 int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
2215 {
2216     unsigned char i, j;
2217     unsigned short checksum, value;
2218     unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2219     int size_check;
2220     const int cbus_max[5] = {13, 13, 13, 13, 9};
2221
2222     if (eeprom == NULL)
2223         return -2;
2224
2225     if (eeprom->manufacturer != NULL)
2226         manufacturer_size = strlen(eeprom->manufacturer);
2227     if (eeprom->product != NULL)
2228         product_size = strlen(eeprom->product);
2229     if (eeprom->serial != NULL)
2230         serial_size = strlen(eeprom->serial);
2231
2232     // highest allowed cbus value
2233     for (i = 0; i < 5; i++)
2234     {
2235         if ((eeprom->cbus_function[i] > cbus_max[i]) ||
2236             (eeprom->cbus_function[i] && eeprom->chip_type != TYPE_R)) return -3;
2237     }
2238     if (eeprom->chip_type != TYPE_R)
2239     {
2240         if (eeprom->invert) return -4;
2241         if (eeprom->high_current) return -5;
2242     }
2243
2244     size_check = eeprom->size;
2245     size_check -= 28; // 28 are always in use (fixed)
2246
2247     // Top half of a 256byte eeprom is used just for strings and checksum
2248     // it seems that the FTDI chip will not read these strings from the lower half
2249     // Each string starts with two bytes; offset and type (0x03 for string)
2250     // the checksum needs two bytes, so without the string data that 8 bytes from the top half
2251     if (eeprom->size>=256) size_check = 120;
2252     size_check -= manufacturer_size*2;
2253     size_check -= product_size*2;
2254     size_check -= serial_size*2;
2255
2256     // eeprom size exceeded?
2257     if (size_check < 0)
2258         return (-1);
2259
2260     // empty eeprom
2261     memset (output, 0, eeprom->size);
2262
2263     // Addr 00: High current IO
2264     output[0x00] = eeprom->high_current ? HIGH_CURRENT_DRIVE : 0;
2265     // Addr 01: IN endpoint size (for R type devices, different for FT2232)
2266     if (eeprom->chip_type == TYPE_R) {
2267         output[0x01] = 0x40;
2268     }
2269     // Addr 02: Vendor ID
2270     output[0x02] = eeprom->vendor_id;
2271     output[0x03] = eeprom->vendor_id >> 8;
2272
2273     // Addr 04: Product ID
2274     output[0x04] = eeprom->product_id;
2275     output[0x05] = eeprom->product_id >> 8;
2276
2277     // Addr 06: Device release number (0400h for BM features)
2278     output[0x06] = 0x00;
2279     switch (eeprom->chip_type) {
2280         case TYPE_AM:
2281             output[0x07] = 0x02;
2282             break;
2283         case TYPE_BM:
2284             output[0x07] = 0x04;
2285             break;
2286         case TYPE_2232C:
2287             output[0x07] = 0x05;
2288             break;
2289         case TYPE_R:
2290             output[0x07] = 0x06;
2291             break;
2292         default:
2293             output[0x07] = 0x00;
2294     }
2295
2296     // Addr 08: Config descriptor
2297     // Bit 7: always 1
2298     // Bit 6: 1 if this device is self powered, 0 if bus powered
2299     // Bit 5: 1 if this device uses remote wakeup
2300     // Bit 4: 1 if this device is battery powered
2301     j = 0x80;
2302     if (eeprom->self_powered == 1)
2303         j |= 0x40;
2304     if (eeprom->remote_wakeup == 1)
2305         j |= 0x20;
2306     output[0x08] = j;
2307
2308     // Addr 09: Max power consumption: max power = value * 2 mA
2309     output[0x09] = eeprom->max_power;
2310
2311     // Addr 0A: Chip configuration
2312     // Bit 7: 0 - reserved
2313     // Bit 6: 0 - reserved
2314     // Bit 5: 0 - reserved
2315     // Bit 4: 1 - Change USB version
2316     // Bit 3: 1 - Use the serial number string
2317     // Bit 2: 1 - Enable suspend pull downs for lower power
2318     // Bit 1: 1 - Out EndPoint is Isochronous
2319     // Bit 0: 1 - In EndPoint is Isochronous
2320     //
2321     j = 0;
2322     if (eeprom->in_is_isochronous == 1)
2323         j = j | 1;
2324     if (eeprom->out_is_isochronous == 1)
2325         j = j | 2;
2326     if (eeprom->suspend_pull_downs == 1)
2327         j = j | 4;
2328     if (eeprom->use_serial == 1)
2329         j = j | 8;
2330     if (eeprom->change_usb_version == 1)
2331         j = j | 16;
2332     output[0x0A] = j;
2333
2334     // Addr 0B: Invert data lines
2335     output[0x0B] = eeprom->invert & 0xff;
2336
2337     // Addr 0C: USB version low byte when 0x0A bit 4 is set
2338     // Addr 0D: USB version high byte when 0x0A bit 4 is set
2339     if (eeprom->change_usb_version == 1)
2340     {
2341         output[0x0C] = eeprom->usb_version;
2342         output[0x0D] = eeprom->usb_version >> 8;
2343     }
2344
2345
2346     // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2347     // Addr 0F: Length of manufacturer string
2348     output[0x0F] = manufacturer_size*2 + 2;
2349
2350     // Addr 10: Offset of the product string + 0x80, calculated later
2351     // Addr 11: Length of product string
2352     output[0x11] = product_size*2 + 2;
2353
2354     // Addr 12: Offset of the serial string + 0x80, calculated later
2355     // Addr 13: Length of serial string
2356     output[0x13] = serial_size*2 + 2;
2357
2358     // Addr 14: CBUS function: CBUS0, CBUS1
2359     // Addr 15: CBUS function: CBUS2, CBUS3
2360     // Addr 16: CBUS function: CBUS5
2361     output[0x14] = eeprom->cbus_function[0] | (eeprom->cbus_function[1] << 4);
2362     output[0x15] = eeprom->cbus_function[2] | (eeprom->cbus_function[3] << 4);
2363     output[0x16] = eeprom->cbus_function[4];
2364     // Addr 17: Unknown
2365
2366     // Dynamic content
2367     // In images produced by FTDI's FT_Prog for FT232R strings start at 0x18
2368     // Space till 0x18 should be considered as reserved.
2369     if (eeprom->chip_type >= TYPE_R) {
2370         i = 0x18;
2371     } else {
2372         i = 0x14;
2373     }
2374     if (eeprom->size >= 256) i = 0x80;
2375
2376
2377     // Output manufacturer
2378     output[0x0E] = i | 0x80;  // calculate offset
2379     output[i++] = manufacturer_size*2 + 2;
2380     output[i++] = 0x03; // type: string
2381     for (j = 0; j < manufacturer_size; j++)
2382     {
2383         output[i] = eeprom->manufacturer[j], i++;
2384         output[i] = 0x00, i++;
2385     }
2386
2387     // Output product name
2388     output[0x10] = i | 0x80;  // calculate offset
2389     output[i] = product_size*2 + 2, i++;
2390     output[i] = 0x03, i++;
2391     for (j = 0; j < product_size; j++)
2392     {
2393         output[i] = eeprom->product[j], i++;
2394         output[i] = 0x00, i++;
2395     }
2396
2397     // Output serial
2398     output[0x12] = i | 0x80; // calculate offset
2399     output[i] = serial_size*2 + 2, i++;
2400     output[i] = 0x03, i++;
2401     for (j = 0; j < serial_size; j++)
2402     {
2403         output[i] = eeprom->serial[j], i++;
2404         output[i] = 0x00, i++;
2405     }
2406
2407     // calculate checksum
2408     checksum = 0xAAAA;
2409
2410     for (i = 0; i < eeprom->size/2-1; i++)
2411     {
2412         value = output[i*2];
2413         value += output[(i*2)+1] << 8;
2414
2415         checksum = value^checksum;
2416         checksum = (checksum << 1) | (checksum >> 15);
2417     }
2418
2419     output[eeprom->size-2] = checksum;
2420     output[eeprom->size-1] = checksum >> 8;
2421
2422     return size_check;
2423 }
2424
2425 /**
2426    Decode binary EEPROM image into an ftdi_eeprom structure.
2427
2428    \param eeprom Pointer to ftdi_eeprom which will be filled in.
2429    \param buf Buffer of \a size bytes of raw eeprom data
2430    \param size size size of eeprom data in bytes
2431
2432    \retval 0: all fine
2433    \retval -1: something went wrong
2434
2435    FIXME: How to pass size? How to handle size field in ftdi_eeprom?
2436    FIXME: Strings are malloc'ed here and should be freed somewhere
2437 */
2438 int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *buf, int size)
2439 {
2440     unsigned char i, j;
2441     unsigned short checksum, eeprom_checksum, value;
2442     unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2443     int size_check;
2444     int eeprom_size = 128;
2445
2446     if (eeprom == NULL)
2447         return -1;
2448 #if 0
2449     size_check = eeprom->size;
2450     size_check -= 28; // 28 are always in use (fixed)
2451
2452     // Top half of a 256byte eeprom is used just for strings and checksum
2453     // it seems that the FTDI chip will not read these strings from the lower half
2454     // Each string starts with two bytes; offset and type (0x03 for string)
2455     // the checksum needs two bytes, so without the string data that 8 bytes from the top half
2456     if (eeprom->size>=256)size_check = 120;
2457     size_check -= manufacturer_size*2;
2458     size_check -= product_size*2;
2459     size_check -= serial_size*2;
2460
2461     // eeprom size exceeded?
2462     if (size_check < 0)
2463         return (-1);
2464 #endif
2465
2466     // empty eeprom struct
2467     memset(eeprom, 0, sizeof(struct ftdi_eeprom));
2468
2469     // Addr 00: High current IO
2470     eeprom->high_current = (buf[0x02] & HIGH_CURRENT_DRIVE);
2471
2472     // Addr 02: Vendor ID
2473     eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8);
2474
2475     // Addr 04: Product ID
2476     eeprom->product_id = buf[0x04] + (buf[0x05] << 8);
2477
2478     value = buf[0x06] + (buf[0x07]<<8);
2479     switch (value)
2480     {
2481         case 0x0600:
2482             eeprom->chip_type = TYPE_R;
2483             break;
2484         case 0x0400:
2485             eeprom->chip_type = TYPE_BM;
2486             break;
2487         case 0x0200:
2488             eeprom->chip_type = TYPE_AM;
2489             break;
2490         default: // Unknown device
2491             eeprom->chip_type = 0;
2492             break;
2493     }
2494
2495     // Addr 08: Config descriptor
2496     // Bit 7: always 1
2497     // Bit 6: 1 if this device is self powered, 0 if bus powered
2498     // Bit 5: 1 if this device uses remote wakeup
2499     // Bit 4: 1 if this device is battery powered
2500     j = buf[0x08];
2501     if (j&0x40) eeprom->self_powered = 1;
2502     if (j&0x20) eeprom->remote_wakeup = 1;
2503
2504     // Addr 09: Max power consumption: max power = value * 2 mA
2505     eeprom->max_power = buf[0x09];
2506
2507     // Addr 0A: Chip configuration
2508     // Bit 7: 0 - reserved
2509     // Bit 6: 0 - reserved
2510     // Bit 5: 0 - reserved
2511     // Bit 4: 1 - Change USB version
2512     // Bit 3: 1 - Use the serial number string
2513     // Bit 2: 1 - Enable suspend pull downs for lower power
2514     // Bit 1: 1 - Out EndPoint is Isochronous
2515     // Bit 0: 1 - In EndPoint is Isochronous
2516     //
2517     j = buf[0x0A];
2518     if (j&0x01) eeprom->in_is_isochronous = 1;
2519     if (j&0x02) eeprom->out_is_isochronous = 1;
2520     if (j&0x04) eeprom->suspend_pull_downs = 1;
2521     if (j&0x08) eeprom->use_serial = 1;
2522     if (j&0x10) eeprom->change_usb_version = 1;
2523
2524     // Addr 0B: Invert data lines
2525     eeprom->invert = buf[0x0B];
2526
2527     // Addr 0C: USB version low byte when 0x0A bit 4 is set
2528     // Addr 0D: USB version high byte when 0x0A bit 4 is set
2529     if (eeprom->change_usb_version == 1)
2530     {
2531         eeprom->usb_version = buf[0x0C] + (buf[0x0D] << 8);
2532     }
2533
2534     // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2535     // Addr 0F: Length of manufacturer string
2536     manufacturer_size = buf[0x0F]/2;
2537     if (manufacturer_size > 0) eeprom->manufacturer = malloc(manufacturer_size);
2538     else eeprom->manufacturer = NULL;
2539
2540     // Addr 10: Offset of the product string + 0x80, calculated later
2541     // Addr 11: Length of product string
2542     product_size = buf[0x11]/2;
2543     if (product_size > 0) eeprom->product = malloc(product_size);
2544     else eeprom->product = NULL;
2545
2546     // Addr 12: Offset of the serial string + 0x80, calculated later
2547     // Addr 13: Length of serial string
2548     serial_size = buf[0x13]/2;
2549     if (serial_size > 0) eeprom->serial = malloc(serial_size);
2550     else eeprom->serial = NULL;
2551
2552     // Addr 14: CBUS function: CBUS0, CBUS1
2553     // Addr 15: CBUS function: CBUS2, CBUS3
2554     // Addr 16: CBUS function: CBUS5
2555     if (eeprom->chip_type == TYPE_R) {
2556         eeprom->cbus_function[0] = buf[0x14] & 0x0f;
2557         eeprom->cbus_function[1] = (buf[0x14] >> 4) & 0x0f;
2558         eeprom->cbus_function[2] = buf[0x15] & 0x0f;
2559         eeprom->cbus_function[3] = (buf[0x15] >> 4) & 0x0f;
2560         eeprom->cbus_function[4] = buf[0x16] & 0x0f;
2561     } else {
2562         for (j=0; j<5; j++) eeprom->cbus_function[j] = 0;
2563     }
2564
2565     // Decode manufacturer
2566     i = buf[0x0E] & 0x7f; // offset
2567     for (j=0;j<manufacturer_size-1;j++)
2568     {
2569         eeprom->manufacturer[j] = buf[2*j+i+2];
2570     }
2571     eeprom->manufacturer[j] = '\0';
2572
2573     // Decode product name
2574     i = buf[0x10] & 0x7f; // offset
2575     for (j=0;j<product_size-1;j++)
2576     {
2577         eeprom->product[j] = buf[2*j+i+2];
2578     }
2579     eeprom->product[j] = '\0';
2580
2581     // Decode serial
2582     i = buf[0x12] & 0x7f; // offset
2583     for (j=0;j<serial_size-1;j++)
2584     {
2585         eeprom->serial[j] = buf[2*j+i+2];
2586     }
2587     eeprom->serial[j] = '\0';
2588
2589     // verify checksum
2590     checksum = 0xAAAA;
2591
2592     for (i = 0; i < eeprom_size/2-1; i++)
2593     {
2594         value = buf[i*2];
2595         value += buf[(i*2)+1] << 8;
2596
2597         checksum = value^checksum;
2598         checksum = (checksum << 1) | (checksum >> 15);
2599     }
2600
2601     eeprom_checksum = buf[eeprom_size-2] + (buf[eeprom_size-1] << 8);
2602
2603     if (eeprom_checksum != checksum)
2604     {
2605         fprintf(stderr, "Checksum Error: %04x %04x\n", checksum, eeprom_checksum);
2606         return -1;
2607     }
2608
2609     return 0;
2610 }
2611
2612 /**
2613     Read eeprom location
2614
2615     \param ftdi pointer to ftdi_context
2616     \param eeprom_addr Address of eeprom location to be read
2617     \param eeprom_val Pointer to store read eeprom location
2618
2619     \retval  0: all fine
2620     \retval -1: read failed
2621     \retval -2: USB device unavailable
2622 */
2623 int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val)
2624 {
2625     if (ftdi == NULL || ftdi->usb_dev == NULL)
2626         ftdi_error_return(-2, "USB device unavailable");
2627
2628     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, eeprom_addr, (char *)eeprom_val, 2, ftdi->usb_read_timeout) != 2)
2629         ftdi_error_return(-1, "reading eeprom failed");
2630
2631     return 0;
2632 }
2633
2634 /**
2635     Read eeprom
2636
2637     \param ftdi pointer to ftdi_context
2638     \param eeprom Pointer to store eeprom into
2639
2640     \retval  0: all fine
2641     \retval -1: read failed
2642     \retval -2: USB device unavailable
2643 */
2644 int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2645 {
2646     int i;
2647
2648     if (ftdi == NULL || ftdi->usb_dev == NULL)
2649         ftdi_error_return(-2, "USB device unavailable");
2650
2651     for (i = 0; i < ftdi->eeprom_size/2; i++)
2652     {
2653         if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
2654             ftdi_error_return(-1, "reading eeprom failed");
2655     }
2656
2657     return 0;
2658 }
2659
2660 /*
2661     ftdi_read_chipid_shift does the bitshift operation needed for the FTDIChip-ID
2662     Function is only used internally
2663     \internal
2664 */
2665 static unsigned char ftdi_read_chipid_shift(unsigned char value)
2666 {
2667     return ((value & 1) << 1) |
2668            ((value & 2) << 5) |
2669            ((value & 4) >> 2) |
2670            ((value & 8) << 4) |
2671            ((value & 16) >> 1) |
2672            ((value & 32) >> 1) |
2673            ((value & 64) >> 4) |
2674            ((value & 128) >> 2);
2675 }
2676
2677 /**
2678     Read the FTDIChip-ID from R-type devices
2679
2680     \param ftdi pointer to ftdi_context
2681     \param chipid Pointer to store FTDIChip-ID
2682
2683     \retval  0: all fine
2684     \retval -1: read failed
2685     \retval -2: USB device unavailable
2686 */
2687 int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid)
2688 {
2689     unsigned int a = 0, b = 0;
2690
2691     if (ftdi == NULL || ftdi->usb_dev == NULL)
2692         ftdi_error_return(-2, "USB device unavailable");
2693
2694     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x43, (char *)&a, 2, ftdi->usb_read_timeout) == 2)
2695     {
2696         a = a << 8 | a >> 8;
2697         if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x44, (char *)&b, 2, ftdi->usb_read_timeout) == 2)
2698         {
2699             b = b << 8 | b >> 8;
2700             a = (a << 16) | (b & 0xFFFF);
2701             a = ftdi_read_chipid_shift(a) | ftdi_read_chipid_shift(a>>8)<<8
2702                 | ftdi_read_chipid_shift(a>>16)<<16 | ftdi_read_chipid_shift(a>>24)<<24;
2703             *chipid = a ^ 0xa5f0f7d1;
2704             return 0;
2705         }
2706     }
2707
2708     ftdi_error_return(-1, "read of FTDIChip-ID failed");
2709 }
2710
2711 /**
2712     Guesses size of eeprom by reading eeprom and comparing halves - will not work with blank eeprom
2713     Call this function then do a write then call again to see if size changes, if so write again.
2714
2715     \param ftdi pointer to ftdi_context
2716     \param eeprom Pointer to store eeprom into
2717     \param maxsize the size of the buffer to read into
2718
2719     \retval -1: eeprom read failed
2720     \retval -2: USB device unavailable
2721     \retval >=0: size of eeprom
2722 */
2723 int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize)
2724 {
2725     int i=0,j,minsize=32;
2726     int size=minsize;
2727
2728     if (ftdi == NULL || ftdi->usb_dev == NULL)
2729         ftdi_error_return(-2, "USB device unavailable");
2730
2731     do
2732     {
2733         for (j = 0; i < maxsize/2 && j<size; j++)
2734         {
2735             if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE,
2736                                 SIO_READ_EEPROM_REQUEST, 0, i,
2737                                 eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
2738                 ftdi_error_return(-1, "eeprom read failed");
2739             i++;
2740         }
2741         size*=2;
2742     }
2743     while (size<=maxsize && memcmp(eeprom,&eeprom[size/2],size/2)!=0);
2744
2745     return size/2;
2746 }
2747
2748 /**
2749     Write eeprom location
2750
2751     \param ftdi pointer to ftdi_context
2752     \param eeprom_addr Address of eeprom location to be written
2753     \param eeprom_val Value to be written
2754
2755     \retval  0: all fine
2756     \retval -1: read failed
2757     \retval -2: USB device unavailable
2758 */
2759 int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, unsigned short eeprom_val)
2760 {
2761     if (ftdi == NULL || ftdi->usb_dev == NULL)
2762         ftdi_error_return(-2, "USB device unavailable");
2763
2764     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2765                                     SIO_WRITE_EEPROM_REQUEST, eeprom_val, eeprom_addr,
2766                                     NULL, 0, ftdi->usb_write_timeout) != 0)
2767         ftdi_error_return(-1, "unable to write eeprom");
2768
2769     return 0;
2770 }
2771
2772 /**
2773     Write eeprom
2774
2775     \param ftdi pointer to ftdi_context
2776     \param eeprom Pointer to read eeprom from
2777
2778     \retval  0: all fine
2779     \retval -1: read failed
2780     \retval -2: USB device unavailable
2781 */
2782 int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2783 {
2784     unsigned short usb_val, status;
2785     int i, ret;
2786
2787     if (ftdi == NULL || ftdi->usb_dev == NULL)
2788         ftdi_error_return(-2, "USB device unavailable");
2789
2790     /* These commands were traced while running MProg */
2791     if ((ret = ftdi_usb_reset(ftdi)) != 0)
2792         return ret;
2793     if ((ret = ftdi_poll_modem_status(ftdi, &status)) != 0)
2794         return ret;
2795     if ((ret = ftdi_set_latency_timer(ftdi, 0x77)) != 0)
2796         return ret;
2797
2798     for (i = 0; i < ftdi->eeprom_size/2; i++)
2799     {
2800         usb_val = eeprom[i*2];
2801         usb_val += eeprom[(i*2)+1] << 8;
2802         if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2803                             SIO_WRITE_EEPROM_REQUEST, usb_val, i,
2804                             NULL, 0, ftdi->usb_write_timeout) != 0)
2805             ftdi_error_return(-1, "unable to write eeprom");
2806     }
2807
2808     return 0;
2809 }
2810
2811 /**
2812     Erase eeprom
2813
2814     This is not supported on FT232R/FT245R according to the MProg manual from FTDI.
2815
2816     \param ftdi pointer to ftdi_context
2817
2818     \retval  0: all fine
2819     \retval -1: erase failed
2820     \retval -2: USB device unavailable
2821 */
2822 int ftdi_erase_eeprom(struct ftdi_context *ftdi)
2823 {
2824     if (ftdi == NULL || ftdi->usb_dev == NULL)
2825         ftdi_error_return(-2, "USB device unavailable");
2826
2827     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_ERASE_EEPROM_REQUEST, 0, 0, NULL, 0, ftdi->usb_write_timeout) != 0)
2828         ftdi_error_return(-1, "unable to erase eeprom");
2829
2830     return 0;
2831 }
2832
2833 /**
2834     Get string representation for last error code
2835
2836     \param ftdi pointer to ftdi_context
2837
2838     \retval Pointer to error string
2839 */
2840 char *ftdi_get_error_string (struct ftdi_context *ftdi)
2841 {
2842     if (ftdi == NULL)
2843         return "";
2844
2845     return ftdi->error_str;
2846 }
2847
2848 /* @} end of doxygen libftdi group */