06f62935b8f6954902e6d347015cff9c75c7b974
[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         urb=NULL;
1411         for (cleanup_count=0; urb==NULL && cleanup_count <= 1; cleanup_count++)
1412         {
1413             if (i==ftdi->async_usb_buffer_size)
1414             {
1415                 /* wait until some buffers are free */
1416                 _usb_async_cleanup(ftdi,0,ftdi->usb_write_timeout);
1417             }
1418
1419             for (i=0; i < ftdi->async_usb_buffer_size; i++)
1420             {
1421                 urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
1422                 if (urb->usercontext == FTDI_URB_USERCONTEXT_COOKIE)
1423                     break;  /* found a free urb position */
1424                 urb=NULL;
1425             }
1426         }
1427
1428         /* no free urb position found */
1429         if (urb==NULL)
1430             return -1;
1431
1432         requested = size - bytesdone;
1433         if (requested > 4096)
1434             requested = 4096;
1435
1436         memset(urb,0,sizeof(urb));
1437
1438         urb->type = USBDEVFS_URB_TYPE_BULK;
1439         urb->endpoint = ep;
1440         urb->flags = 0;
1441         urb->buffer = bytes + bytesdone;
1442         urb->buffer_length = requested;
1443         urb->signr = 0;
1444         urb->actual_length = 0;
1445         urb->number_of_packets = 0;
1446         urb->usercontext = 0;
1447
1448         do
1449         {
1450             ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_SUBMITURB, urb);
1451         }
1452         while (ret < 0 && errno == EINTR);
1453         if (ret < 0)
1454             return ret;       /* the caller can read errno to get more info */
1455
1456         bytesdone += requested;
1457     }
1458     while (bytesdone < size);
1459     return bytesdone;
1460 }
1461
1462 /**
1463     Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip.
1464     Does not wait for completion of the transfer nor does it make sure that
1465     the transfer was successful.
1466
1467     This function could be extended to use signals and callbacks to inform the
1468     caller of completion or error - but this is not done yet, volunteers welcome.
1469
1470     Works around libusb and directly accesses functions only available on Linux.
1471     Only available if compiled with --with-async-mode.
1472
1473     \param ftdi pointer to ftdi_context
1474     \param buf Buffer with the data
1475     \param size Size of the buffer
1476
1477     \retval -666: USB device unavailable
1478     \retval <0: error code from usb_bulk_write()
1479     \retval >0: number of bytes written
1480 */
1481 int ftdi_write_data_async(struct ftdi_context *ftdi, unsigned char *buf, int size)
1482 {
1483     int ret;
1484     int offset = 0;
1485     int total_written = 0;
1486
1487     if (ftdi == NULL || ftdi->usb_dev == NULL)
1488         ftdi_error_return(-666, "USB device unavailable");
1489
1490     while (offset < size)
1491     {
1492         int write_size = ftdi->writebuffer_chunksize;
1493
1494         if (offset+write_size > size)
1495             write_size = size-offset;
1496
1497         ret = _usb_bulk_write_async(ftdi, ftdi->in_ep, buf+offset, write_size);
1498         if (ret < 0)
1499             ftdi_error_return(ret, "usb bulk write async failed");
1500
1501         total_written += ret;
1502         offset += write_size;
1503     }
1504
1505     return total_written;
1506 }
1507 #endif // LIBFTDI_LINUX_ASYNC_MODE
1508
1509 /**
1510     Configure write buffer chunk size.
1511     Default is 4096.
1512
1513     \param ftdi pointer to ftdi_context
1514     \param chunksize Chunk size
1515
1516     \retval 0: all fine
1517     \retval -1: ftdi context invalid
1518 */
1519 int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1520 {
1521     if (ftdi == NULL)
1522         ftdi_error_return(-1, "ftdi context invalid");
1523
1524     ftdi->writebuffer_chunksize = chunksize;
1525     return 0;
1526 }
1527
1528 /**
1529     Get write buffer chunk size.
1530
1531     \param ftdi pointer to ftdi_context
1532     \param chunksize Pointer to store chunk size in
1533
1534     \retval 0: all fine
1535     \retval -1: ftdi context invalid
1536 */
1537 int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1538 {
1539     if (ftdi == NULL)
1540         ftdi_error_return(-1, "ftdi context invalid");
1541
1542     *chunksize = ftdi->writebuffer_chunksize;
1543     return 0;
1544 }
1545
1546 /**
1547     Reads data in chunks (see ftdi_read_data_set_chunksize()) from the chip.
1548
1549     Automatically strips the two modem status bytes transfered during every read.
1550
1551     \param ftdi pointer to ftdi_context
1552     \param buf Buffer to store data in
1553     \param size Size of the buffer
1554
1555     \retval -666: USB device unavailable
1556     \retval <0: error code from usb_bulk_read()
1557     \retval  0: no data was available
1558     \retval >0: number of bytes read
1559
1560 */
1561 int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1562 {
1563     int offset = 0, ret = 1, i, num_of_chunks, chunk_remains;
1564     int packet_size;
1565     struct timeval tv_start, tv_current;
1566
1567     if (ftdi == NULL || ftdi->usb_dev == NULL)
1568         ftdi_error_return(-666, "USB device unavailable");
1569
1570     packet_size = ftdi->max_packet_size;
1571     // Packet size sanity check (avoid division by zero)
1572     if (packet_size == 0)
1573         ftdi_error_return(-1, "max_packet_size is bogus (zero)");
1574
1575     // everything we want is still in the readbuffer?
1576     if (size <= ftdi->readbuffer_remaining)
1577     {
1578         memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1579
1580         // Fix offsets
1581         ftdi->readbuffer_remaining -= size;
1582         ftdi->readbuffer_offset += size;
1583
1584         /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
1585
1586         return size;
1587     }
1588     // something still in the readbuffer, but not enough to satisfy 'size'?
1589     if (ftdi->readbuffer_remaining != 0)
1590     {
1591         memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
1592
1593         // Fix offset
1594         offset += ftdi->readbuffer_remaining;
1595     }
1596     // do the actual USB read
1597     gettimeofday(&tv_start,NULL);
1598     while (offset < size && ret > 0)
1599     {
1600         ftdi->readbuffer_remaining = 0;
1601         ftdi->readbuffer_offset = 0;
1602         /* returns how much received */
1603         ret = usb_bulk_read (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, ftdi->usb_read_timeout);
1604         if (ret < 0)
1605             ftdi_error_return(ret, "usb bulk read failed");
1606
1607         if (ret > 2)
1608         {
1609             // skip FTDI status bytes.
1610             // Maybe stored in the future to enable modem use
1611             num_of_chunks = ret / packet_size;
1612             chunk_remains = ret % packet_size;
1613             //printf("ret = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", ret, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1614
1615             ftdi->readbuffer_offset += 2;
1616             ret -= 2;
1617
1618             if (ret > packet_size - 2)
1619             {
1620                 for (i = 1; i < num_of_chunks; i++)
1621                     memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1622                              ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1623                              packet_size - 2);
1624                 if (chunk_remains > 2)
1625                 {
1626                     memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1627                              ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1628                              chunk_remains-2);
1629                     ret -= 2*num_of_chunks;
1630                 }
1631                 else
1632                     ret -= 2*(num_of_chunks-1)+chunk_remains;
1633             }
1634             // data still fits in buf?
1635             if (offset+ret <= size)
1636             {
1637                 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, ret);
1638                 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
1639                 offset += ret;
1640
1641                 /* Did we read exactly the right amount of bytes? */
1642                 if (offset == size)
1643                     //printf("read_data exact rem %d offset %d\n",
1644                     //ftdi->readbuffer_remaining, offset);
1645                     return offset;
1646             }
1647             else
1648             {
1649                 // only copy part of the data or size <= readbuffer_chunksize
1650                 int part_size = size-offset;
1651                 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, part_size);
1652
1653                 ftdi->readbuffer_offset += part_size;
1654                 ftdi->readbuffer_remaining = ret-part_size;
1655                 offset += part_size;
1656
1657                 /* printf("Returning part: %d - size: %d - offset: %d - ret: %d - remaining: %d\n",
1658                 part_size, size, offset, ret, ftdi->readbuffer_remaining); */
1659
1660                 return offset;
1661             }
1662         }
1663         gettimeofday(&tv_current,NULL);
1664         if(((tv_current.tv_sec - tv_start.tv_sec)*1000000+(tv_current.tv_usec - tv_start.tv_usec)) 
1665            > ftdi->usb_read_timeout)
1666             return offset;
1667     }
1668     // never reached
1669     return -127;
1670 }
1671
1672 /**
1673     Configure read buffer chunk size.
1674     Default is 4096.
1675
1676     Automatically reallocates the buffer.
1677
1678     \param ftdi pointer to ftdi_context
1679     \param chunksize Chunk size
1680
1681     \retval 0: all fine
1682     \retval -1: ftdi context invalid
1683 */
1684 int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1685 {
1686     unsigned char *new_buf;
1687
1688     if (ftdi == NULL)
1689         ftdi_error_return(-1, "ftdi context invalid");
1690
1691     // Invalidate all remaining data
1692     ftdi->readbuffer_offset = 0;
1693     ftdi->readbuffer_remaining = 0;
1694
1695     if ((new_buf = (unsigned char *)realloc(ftdi->readbuffer, chunksize)) == NULL)
1696         ftdi_error_return(-1, "out of memory for readbuffer");
1697
1698     ftdi->readbuffer = new_buf;
1699     ftdi->readbuffer_chunksize = chunksize;
1700
1701     return 0;
1702 }
1703
1704 /**
1705     Get read buffer chunk size.
1706
1707     \param ftdi pointer to ftdi_context
1708     \param chunksize Pointer to store chunk size in
1709
1710     \retval 0: all fine
1711     \retval -1: FTDI context invalid
1712 */
1713 int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1714 {
1715     if (ftdi == NULL)
1716         ftdi_error_return(-1, "FTDI context invalid");
1717
1718     *chunksize = ftdi->readbuffer_chunksize;
1719     return 0;
1720 }
1721
1722
1723 /**
1724     Enable bitbang mode.
1725
1726     \deprecated use \ref ftdi_set_bitmode with mode BITMODE_BITBANG instead
1727
1728     \param ftdi pointer to ftdi_context
1729     \param bitmask Bitmask to configure lines.
1730            HIGH/ON value configures a line as output.
1731
1732     \retval  0: all fine
1733     \retval -1: can't enable bitbang mode
1734     \retval -2: USB device unavailable
1735 */
1736 int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
1737 {
1738     unsigned short usb_val;
1739
1740     if (ftdi == NULL || ftdi->usb_dev == NULL)
1741         ftdi_error_return(-2, "USB device unavailable");
1742
1743     usb_val = bitmask; // low byte: bitmask
1744     /* FT2232C: Set bitbang_mode to 2 to enable SPI */
1745     usb_val |= (ftdi->bitbang_mode << 8);
1746
1747     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1748                         SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index,
1749                         NULL, 0, ftdi->usb_write_timeout) != 0)
1750         ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
1751
1752     ftdi->bitbang_enabled = 1;
1753     return 0;
1754 }
1755
1756 /**
1757     Disable bitbang mode.
1758
1759     \param ftdi pointer to ftdi_context
1760
1761     \retval  0: all fine
1762     \retval -1: can't disable bitbang mode
1763     \retval -2: USB device unavailable
1764 */
1765 int ftdi_disable_bitbang(struct ftdi_context *ftdi)
1766 {
1767     if (ftdi == NULL || ftdi->usb_dev == NULL)
1768         ftdi_error_return(-2, "USB device unavailable");
1769
1770     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)
1771         ftdi_error_return(-1, "unable to leave bitbang mode. Perhaps not a BM type chip?");
1772
1773     ftdi->bitbang_enabled = 0;
1774     return 0;
1775 }
1776
1777 /**
1778     Enable/disable bitbang modes.
1779
1780     \param ftdi pointer to ftdi_context
1781     \param bitmask Bitmask to configure lines.
1782            HIGH/ON value configures a line as output.
1783     \param mode Bitbang mode: use the values defined in \ref ftdi_mpsse_mode
1784
1785     \retval  0: all fine
1786     \retval -1: can't enable bitbang mode
1787     \retval -2: USB device unavailable
1788 */
1789 int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
1790 {
1791     unsigned short usb_val;
1792
1793     if (ftdi == NULL || ftdi->usb_dev == NULL)
1794         ftdi_error_return(-2, "USB device unavailable");
1795
1796     usb_val = bitmask; // low byte: bitmask
1797     usb_val |= (mode << 8);
1798     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)
1799         ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps selected mode not supported on your chip?");
1800
1801     ftdi->bitbang_mode = mode;
1802     ftdi->bitbang_enabled = (mode == BITMODE_RESET) ? 0 : 1;
1803     return 0;
1804 }
1805
1806 /**
1807     Directly read pin state, circumventing the read buffer. Useful for bitbang mode.
1808
1809     \param ftdi pointer to ftdi_context
1810     \param pins Pointer to store pins into
1811
1812     \retval  0: all fine
1813     \retval -1: read pins failed
1814     \retval -2: USB device unavailable
1815 */
1816 int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins)
1817 {
1818     if (ftdi == NULL || ftdi->usb_dev == NULL)
1819         ftdi_error_return(-2, "USB device unavailable");
1820
1821     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)
1822         ftdi_error_return(-1, "read pins failed");
1823
1824     return 0;
1825 }
1826
1827 /**
1828     Set latency timer
1829
1830     The FTDI chip keeps data in the internal buffer for a specific
1831     amount of time if the buffer is not full yet to decrease
1832     load on the usb bus.
1833
1834     \param ftdi pointer to ftdi_context
1835     \param latency Value between 1 and 255
1836
1837     \retval  0: all fine
1838     \retval -1: latency out of range
1839     \retval -2: unable to set latency timer
1840     \retval -3: USB device unavailable
1841 */
1842 int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
1843 {
1844     unsigned short usb_val;
1845
1846     if (latency < 1)
1847         ftdi_error_return(-1, "latency out of range. Only valid for 1-255");
1848
1849     if (ftdi == NULL || ftdi->usb_dev == NULL)
1850         ftdi_error_return(-3, "USB device unavailable");
1851
1852     usb_val = latency;
1853     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)
1854         ftdi_error_return(-2, "unable to set latency timer");
1855
1856     return 0;
1857 }
1858
1859 /**
1860     Get latency timer
1861
1862     \param ftdi pointer to ftdi_context
1863     \param latency Pointer to store latency value in
1864
1865     \retval  0: all fine
1866     \retval -1: unable to get latency timer
1867     \retval -2: USB device unavailable
1868 */
1869 int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency)
1870 {
1871     unsigned short usb_val;
1872
1873     if (ftdi == NULL || ftdi->usb_dev == NULL)
1874         ftdi_error_return(-2, "USB device unavailable");
1875
1876     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)
1877         ftdi_error_return(-1, "reading latency timer failed");
1878
1879     *latency = (unsigned char)usb_val;
1880     return 0;
1881 }
1882
1883 /**
1884     Poll modem status information
1885
1886     This function allows the retrieve the two status bytes of the device.
1887     The device sends these bytes also as a header for each read access
1888     where they are discarded by ftdi_read_data(). The chip generates
1889     the two stripped status bytes in the absence of data every 40 ms.
1890
1891     Layout of the first byte:
1892     - B0..B3 - must be 0
1893     - B4       Clear to send (CTS)
1894                  0 = inactive
1895                  1 = active
1896     - B5       Data set ready (DTS)
1897                  0 = inactive
1898                  1 = active
1899     - B6       Ring indicator (RI)
1900                  0 = inactive
1901                  1 = active
1902     - B7       Receive line signal detect (RLSD)
1903                  0 = inactive
1904                  1 = active
1905
1906     Layout of the second byte:
1907     - B0       Data ready (DR)
1908     - B1       Overrun error (OE)
1909     - B2       Parity error (PE)
1910     - B3       Framing error (FE)
1911     - B4       Break interrupt (BI)
1912     - B5       Transmitter holding register (THRE)
1913     - B6       Transmitter empty (TEMT)
1914     - B7       Error in RCVR FIFO
1915
1916     \param ftdi pointer to ftdi_context
1917     \param status Pointer to store status information in. Must be two bytes.
1918
1919     \retval  0: all fine
1920     \retval -1: unable to retrieve status information
1921     \retval -2: USB device unavailable
1922 */
1923 int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status)
1924 {
1925     char usb_val[2];
1926
1927     if (ftdi == NULL || ftdi->usb_dev == NULL)
1928         ftdi_error_return(-2, "USB device unavailable");
1929
1930     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)
1931         ftdi_error_return(-1, "getting modem status failed");
1932
1933     *status = (usb_val[1] << 8) | usb_val[0];
1934
1935     return 0;
1936 }
1937
1938 /**
1939     Set flowcontrol for ftdi chip
1940
1941     \param ftdi pointer to ftdi_context
1942     \param flowctrl flow control to use. should be
1943            SIO_DISABLE_FLOW_CTRL, SIO_RTS_CTS_HS, SIO_DTR_DSR_HS or SIO_XON_XOFF_HS
1944
1945     \retval  0: all fine
1946     \retval -1: set flow control failed
1947     \retval -2: USB device unavailable
1948 */
1949 int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl)
1950 {
1951     if (ftdi == NULL || ftdi->usb_dev == NULL)
1952         ftdi_error_return(-2, "USB device unavailable");
1953
1954     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1955                         SIO_SET_FLOW_CTRL_REQUEST, 0, (flowctrl | ftdi->index),
1956                         NULL, 0, ftdi->usb_write_timeout) != 0)
1957         ftdi_error_return(-1, "set flow control failed");
1958
1959     return 0;
1960 }
1961
1962 /**
1963     Set dtr line
1964
1965     \param ftdi pointer to ftdi_context
1966     \param state state to set line to (1 or 0)
1967
1968     \retval  0: all fine
1969     \retval -1: set dtr failed
1970     \retval -2: USB device unavailable
1971 */
1972 int ftdi_setdtr(struct ftdi_context *ftdi, int state)
1973 {
1974     unsigned short usb_val;
1975
1976     if (ftdi == NULL || ftdi->usb_dev == NULL)
1977         ftdi_error_return(-2, "USB device unavailable");
1978
1979     if (state)
1980         usb_val = SIO_SET_DTR_HIGH;
1981     else
1982         usb_val = SIO_SET_DTR_LOW;
1983
1984     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1985                         SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
1986                         NULL, 0, ftdi->usb_write_timeout) != 0)
1987         ftdi_error_return(-1, "set dtr failed");
1988
1989     return 0;
1990 }
1991
1992 /**
1993     Set rts line
1994
1995     \param ftdi pointer to ftdi_context
1996     \param state state to set line to (1 or 0)
1997
1998     \retval  0: all fine
1999     \retval -1: set rts failed
2000     \retval -2: USB device unavailable
2001 */
2002 int ftdi_setrts(struct ftdi_context *ftdi, int state)
2003 {
2004     unsigned short usb_val;
2005
2006     if (ftdi == NULL || ftdi->usb_dev == NULL)
2007         ftdi_error_return(-2, "USB device unavailable");
2008
2009     if (state)
2010         usb_val = SIO_SET_RTS_HIGH;
2011     else
2012         usb_val = SIO_SET_RTS_LOW;
2013
2014     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2015                         SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2016                         NULL, 0, ftdi->usb_write_timeout) != 0)
2017         ftdi_error_return(-1, "set of rts failed");
2018
2019     return 0;
2020 }
2021
2022 /**
2023     Set dtr and rts line in one pass
2024
2025     \param ftdi pointer to ftdi_context
2026     \param dtr  DTR state to set line to (1 or 0)
2027     \param rts  RTS state to set line to (1 or 0)
2028
2029     \retval  0: all fine
2030     \retval -1: set dtr/rts failed
2031     \retval -2: USB device unavailable
2032  */
2033 int ftdi_setdtr_rts(struct ftdi_context *ftdi, int dtr, int rts)
2034 {
2035     unsigned short usb_val;
2036
2037     if (ftdi == NULL || ftdi->usb_dev == NULL)
2038         ftdi_error_return(-2, "USB device unavailable");
2039
2040     if (dtr)
2041         usb_val = SIO_SET_DTR_HIGH;
2042     else
2043         usb_val = SIO_SET_DTR_LOW;
2044
2045     if (rts)
2046         usb_val |= SIO_SET_RTS_HIGH;
2047     else
2048         usb_val |= SIO_SET_RTS_LOW;
2049
2050     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2051                         SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2052                         NULL, 0, ftdi->usb_write_timeout) != 0)
2053         ftdi_error_return(-1, "set of rts/dtr failed");
2054
2055     return 0;
2056 }
2057
2058 /**
2059     Set the special event character
2060
2061     \param ftdi pointer to ftdi_context
2062     \param eventch Event character
2063     \param enable 0 to disable the event character, non-zero otherwise
2064
2065     \retval  0: all fine
2066     \retval -1: unable to set event character
2067     \retval -2: USB device unavailable
2068 */
2069 int ftdi_set_event_char(struct ftdi_context *ftdi,
2070                         unsigned char eventch, unsigned char enable)
2071 {
2072     unsigned short usb_val;
2073
2074     if (ftdi == NULL || ftdi->usb_dev == NULL)
2075         ftdi_error_return(-2, "USB device unavailable");
2076
2077     usb_val = eventch;
2078     if (enable)
2079         usb_val |= 1 << 8;
2080
2081     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)
2082         ftdi_error_return(-1, "setting event character failed");
2083
2084     return 0;
2085 }
2086
2087 /**
2088     Set error character
2089
2090     \param ftdi pointer to ftdi_context
2091     \param errorch Error character
2092     \param enable 0 to disable the error character, non-zero otherwise
2093
2094     \retval  0: all fine
2095     \retval -1: unable to set error character
2096     \retval -2: USB device unavailable
2097 */
2098 int ftdi_set_error_char(struct ftdi_context *ftdi,
2099                         unsigned char errorch, unsigned char enable)
2100 {
2101     unsigned short usb_val;
2102
2103     if (ftdi == NULL || ftdi->usb_dev == NULL)
2104         ftdi_error_return(-2, "USB device unavailable");
2105
2106     usb_val = errorch;
2107     if (enable)
2108         usb_val |= 1 << 8;
2109
2110     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)
2111         ftdi_error_return(-1, "setting error character failed");
2112
2113     return 0;
2114 }
2115
2116 /**
2117    Set the eeprom size
2118
2119    \param ftdi pointer to ftdi_context
2120    \param eeprom Pointer to ftdi_eeprom
2121    \param size
2122
2123 */
2124 void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size)
2125 {
2126     if (ftdi == NULL)
2127         return;
2128
2129     ftdi->eeprom_size=size;
2130     eeprom->size=size;
2131 }
2132
2133 /**
2134     Init eeprom with default values.
2135
2136     \param eeprom Pointer to ftdi_eeprom
2137 */
2138 void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
2139 {
2140     int i;
2141
2142     if (eeprom == NULL)
2143         return;
2144
2145     eeprom->vendor_id = 0x0403;
2146     eeprom->product_id = 0x6001;
2147
2148     eeprom->self_powered = 1;
2149     eeprom->remote_wakeup = 1;
2150     eeprom->chip_type = TYPE_BM;
2151
2152     eeprom->in_is_isochronous = 0;
2153     eeprom->out_is_isochronous = 0;
2154     eeprom->suspend_pull_downs = 0;
2155
2156     eeprom->use_serial = 0;
2157     eeprom->change_usb_version = 0;
2158     eeprom->usb_version = 0x0200;
2159     eeprom->max_power = 0;
2160
2161     eeprom->manufacturer = NULL;
2162     eeprom->product = NULL;
2163     eeprom->serial = NULL;
2164     for (i=0; i < 5; i++)
2165     {
2166         eeprom->cbus_function[i] = 0;
2167     }
2168     eeprom->high_current = 0;
2169     eeprom->invert = 0;
2170
2171     eeprom->size = FTDI_DEFAULT_EEPROM_SIZE;
2172 }
2173
2174 /**
2175     Frees allocated memory in eeprom.
2176
2177     \param eeprom Pointer to ftdi_eeprom
2178 */
2179 void ftdi_eeprom_free(struct ftdi_eeprom *eeprom)
2180 {
2181     if (!eeprom)
2182         return;
2183
2184     if (eeprom->manufacturer != 0) {
2185         free(eeprom->manufacturer);
2186         eeprom->manufacturer = 0;
2187     }
2188     if (eeprom->product != 0) {
2189         free(eeprom->product);
2190         eeprom->product = 0;
2191     }
2192     if (eeprom->serial != 0) {
2193         free(eeprom->serial);
2194         eeprom->serial = 0;
2195     }
2196 }
2197
2198 /**
2199     Build binary output from ftdi_eeprom structure.
2200     Output is suitable for ftdi_write_eeprom().
2201
2202     \note This function doesn't handle FT2232x devices. Only FT232x.
2203     \param eeprom Pointer to ftdi_eeprom
2204     \param output Buffer of 128 bytes to store eeprom image to
2205
2206     \retval >0: free eeprom size
2207     \retval -1: eeprom size (128 bytes) exceeded by custom strings
2208     \retval -2: Invalid eeprom pointer
2209     \retval -3: Invalid cbus function setting
2210     \retval -4: Chip doesn't support invert
2211     \retval -5: Chip doesn't support high current drive
2212 */
2213 int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
2214 {
2215     unsigned char i, j;
2216     unsigned short checksum, value;
2217     unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2218     int size_check;
2219     const int cbus_max[5] = {13, 13, 13, 13, 9};
2220
2221     if (eeprom == NULL)
2222         return -2;
2223
2224     if (eeprom->manufacturer != NULL)
2225         manufacturer_size = strlen(eeprom->manufacturer);
2226     if (eeprom->product != NULL)
2227         product_size = strlen(eeprom->product);
2228     if (eeprom->serial != NULL)
2229         serial_size = strlen(eeprom->serial);
2230
2231     // highest allowed cbus value
2232     for (i = 0; i < 5; i++)
2233     {
2234         if ((eeprom->cbus_function[i] > cbus_max[i]) ||
2235             (eeprom->cbus_function[i] && eeprom->chip_type != TYPE_R)) return -3;
2236     }
2237     if (eeprom->chip_type != TYPE_R)
2238     {
2239         if (eeprom->invert) return -4;
2240         if (eeprom->high_current) return -5;
2241     }
2242
2243     size_check = eeprom->size;
2244     size_check -= 28; // 28 are always in use (fixed)
2245
2246     // Top half of a 256byte eeprom is used just for strings and checksum
2247     // it seems that the FTDI chip will not read these strings from the lower half
2248     // Each string starts with two bytes; offset and type (0x03 for string)
2249     // the checksum needs two bytes, so without the string data that 8 bytes from the top half
2250     if (eeprom->size>=256) size_check = 120;
2251     size_check -= manufacturer_size*2;
2252     size_check -= product_size*2;
2253     size_check -= serial_size*2;
2254
2255     // eeprom size exceeded?
2256     if (size_check < 0)
2257         return (-1);
2258
2259     // empty eeprom
2260     memset (output, 0, eeprom->size);
2261
2262     // Addr 00: High current IO
2263     output[0x00] = eeprom->high_current ? HIGH_CURRENT_DRIVE : 0;
2264     // Addr 01: IN endpoint size (for R type devices, different for FT2232)
2265     if (eeprom->chip_type == TYPE_R) {
2266         output[0x01] = 0x40;
2267     }
2268     // Addr 02: Vendor ID
2269     output[0x02] = eeprom->vendor_id;
2270     output[0x03] = eeprom->vendor_id >> 8;
2271
2272     // Addr 04: Product ID
2273     output[0x04] = eeprom->product_id;
2274     output[0x05] = eeprom->product_id >> 8;
2275
2276     // Addr 06: Device release number (0400h for BM features)
2277     output[0x06] = 0x00;
2278     switch (eeprom->chip_type) {
2279         case TYPE_AM:
2280             output[0x07] = 0x02;
2281             break;
2282         case TYPE_BM:
2283             output[0x07] = 0x04;
2284             break;
2285         case TYPE_2232C:
2286             output[0x07] = 0x05;
2287             break;
2288         case TYPE_R:
2289             output[0x07] = 0x06;
2290             break;
2291         default:
2292             output[0x07] = 0x00;
2293     }
2294
2295     // Addr 08: Config descriptor
2296     // Bit 7: always 1
2297     // Bit 6: 1 if this device is self powered, 0 if bus powered
2298     // Bit 5: 1 if this device uses remote wakeup
2299     // Bit 4: 1 if this device is battery powered
2300     j = 0x80;
2301     if (eeprom->self_powered == 1)
2302         j |= 0x40;
2303     if (eeprom->remote_wakeup == 1)
2304         j |= 0x20;
2305     output[0x08] = j;
2306
2307     // Addr 09: Max power consumption: max power = value * 2 mA
2308     output[0x09] = eeprom->max_power;
2309
2310     // Addr 0A: Chip configuration
2311     // Bit 7: 0 - reserved
2312     // Bit 6: 0 - reserved
2313     // Bit 5: 0 - reserved
2314     // Bit 4: 1 - Change USB version
2315     // Bit 3: 1 - Use the serial number string
2316     // Bit 2: 1 - Enable suspend pull downs for lower power
2317     // Bit 1: 1 - Out EndPoint is Isochronous
2318     // Bit 0: 1 - In EndPoint is Isochronous
2319     //
2320     j = 0;
2321     if (eeprom->in_is_isochronous == 1)
2322         j = j | 1;
2323     if (eeprom->out_is_isochronous == 1)
2324         j = j | 2;
2325     if (eeprom->suspend_pull_downs == 1)
2326         j = j | 4;
2327     if (eeprom->use_serial == 1)
2328         j = j | 8;
2329     if (eeprom->change_usb_version == 1)
2330         j = j | 16;
2331     output[0x0A] = j;
2332
2333     // Addr 0B: Invert data lines
2334     output[0x0B] = eeprom->invert & 0xff;
2335
2336     // Addr 0C: USB version low byte when 0x0A bit 4 is set
2337     // Addr 0D: USB version high byte when 0x0A bit 4 is set
2338     if (eeprom->change_usb_version == 1)
2339     {
2340         output[0x0C] = eeprom->usb_version;
2341         output[0x0D] = eeprom->usb_version >> 8;
2342     }
2343
2344
2345     // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2346     // Addr 0F: Length of manufacturer string
2347     output[0x0F] = manufacturer_size*2 + 2;
2348
2349     // Addr 10: Offset of the product string + 0x80, calculated later
2350     // Addr 11: Length of product string
2351     output[0x11] = product_size*2 + 2;
2352
2353     // Addr 12: Offset of the serial string + 0x80, calculated later
2354     // Addr 13: Length of serial string
2355     output[0x13] = serial_size*2 + 2;
2356
2357     // Addr 14: CBUS function: CBUS0, CBUS1
2358     // Addr 15: CBUS function: CBUS2, CBUS3
2359     // Addr 16: CBUS function: CBUS5
2360     output[0x14] = eeprom->cbus_function[0] | (eeprom->cbus_function[1] << 4);
2361     output[0x15] = eeprom->cbus_function[2] | (eeprom->cbus_function[3] << 4);
2362     output[0x16] = eeprom->cbus_function[4];
2363     // Addr 17: Unknown
2364
2365     // Dynamic content
2366     // In images produced by FTDI's FT_Prog for FT232R strings start at 0x18
2367     // Space till 0x18 should be considered as reserved.
2368     if (eeprom->chip_type >= TYPE_R) {
2369         i = 0x18;
2370     } else {
2371         i = 0x14;
2372     }
2373     if (eeprom->size >= 256) i = 0x80;
2374
2375
2376     // Output manufacturer
2377     output[0x0E] = i | 0x80;  // calculate offset
2378     output[i++] = manufacturer_size*2 + 2;
2379     output[i++] = 0x03; // type: string
2380     for (j = 0; j < manufacturer_size; j++)
2381     {
2382         output[i] = eeprom->manufacturer[j], i++;
2383         output[i] = 0x00, i++;
2384     }
2385
2386     // Output product name
2387     output[0x10] = i | 0x80;  // calculate offset
2388     output[i] = product_size*2 + 2, i++;
2389     output[i] = 0x03, i++;
2390     for (j = 0; j < product_size; j++)
2391     {
2392         output[i] = eeprom->product[j], i++;
2393         output[i] = 0x00, i++;
2394     }
2395
2396     // Output serial
2397     output[0x12] = i | 0x80; // calculate offset
2398     output[i] = serial_size*2 + 2, i++;
2399     output[i] = 0x03, i++;
2400     for (j = 0; j < serial_size; j++)
2401     {
2402         output[i] = eeprom->serial[j], i++;
2403         output[i] = 0x00, i++;
2404     }
2405
2406     // calculate checksum
2407     checksum = 0xAAAA;
2408
2409     for (i = 0; i < eeprom->size/2-1; i++)
2410     {
2411         value = output[i*2];
2412         value += output[(i*2)+1] << 8;
2413
2414         checksum = value^checksum;
2415         checksum = (checksum << 1) | (checksum >> 15);
2416     }
2417
2418     output[eeprom->size-2] = checksum;
2419     output[eeprom->size-1] = checksum >> 8;
2420
2421     return size_check;
2422 }
2423
2424 /**
2425    Decode binary EEPROM image into an ftdi_eeprom structure.
2426
2427    \param eeprom Pointer to ftdi_eeprom which will be filled in.
2428    \param buf Buffer of \a size bytes of raw eeprom data
2429    \param size size size of eeprom data in bytes
2430
2431    \retval 0: all fine
2432    \retval -1: something went wrong
2433
2434    FIXME: How to pass size? How to handle size field in ftdi_eeprom?
2435    FIXME: Strings are malloc'ed here and should be freed somewhere
2436 */
2437 int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *buf, int size)
2438 {
2439     unsigned char i, j;
2440     unsigned short checksum, eeprom_checksum, value;
2441     unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2442     int size_check;
2443     int eeprom_size = 128;
2444
2445     if (eeprom == NULL)
2446         return -1;
2447 #if 0
2448     size_check = eeprom->size;
2449     size_check -= 28; // 28 are always in use (fixed)
2450
2451     // Top half of a 256byte eeprom is used just for strings and checksum
2452     // it seems that the FTDI chip will not read these strings from the lower half
2453     // Each string starts with two bytes; offset and type (0x03 for string)
2454     // the checksum needs two bytes, so without the string data that 8 bytes from the top half
2455     if (eeprom->size>=256)size_check = 120;
2456     size_check -= manufacturer_size*2;
2457     size_check -= product_size*2;
2458     size_check -= serial_size*2;
2459
2460     // eeprom size exceeded?
2461     if (size_check < 0)
2462         return (-1);
2463 #endif
2464
2465     // empty eeprom struct
2466     memset(eeprom, 0, sizeof(struct ftdi_eeprom));
2467
2468     // Addr 00: High current IO
2469     eeprom->high_current = (buf[0x02] & HIGH_CURRENT_DRIVE);
2470
2471     // Addr 02: Vendor ID
2472     eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8);
2473
2474     // Addr 04: Product ID
2475     eeprom->product_id = buf[0x04] + (buf[0x05] << 8);
2476
2477     value = buf[0x06] + (buf[0x07]<<8);
2478     switch (value)
2479     {
2480         case 0x0600:
2481             eeprom->chip_type = TYPE_R;
2482             break;
2483         case 0x0400:
2484             eeprom->chip_type = TYPE_BM;
2485             break;
2486         case 0x0200:
2487             eeprom->chip_type = TYPE_AM;
2488             break;
2489         default: // Unknown device
2490             eeprom->chip_type = 0;
2491             break;
2492     }
2493
2494     // Addr 08: Config descriptor
2495     // Bit 7: always 1
2496     // Bit 6: 1 if this device is self powered, 0 if bus powered
2497     // Bit 5: 1 if this device uses remote wakeup
2498     // Bit 4: 1 if this device is battery powered
2499     j = buf[0x08];
2500     if (j&0x40) eeprom->self_powered = 1;
2501     if (j&0x20) eeprom->remote_wakeup = 1;
2502
2503     // Addr 09: Max power consumption: max power = value * 2 mA
2504     eeprom->max_power = buf[0x09];
2505
2506     // Addr 0A: Chip configuration
2507     // Bit 7: 0 - reserved
2508     // Bit 6: 0 - reserved
2509     // Bit 5: 0 - reserved
2510     // Bit 4: 1 - Change USB version
2511     // Bit 3: 1 - Use the serial number string
2512     // Bit 2: 1 - Enable suspend pull downs for lower power
2513     // Bit 1: 1 - Out EndPoint is Isochronous
2514     // Bit 0: 1 - In EndPoint is Isochronous
2515     //
2516     j = buf[0x0A];
2517     if (j&0x01) eeprom->in_is_isochronous = 1;
2518     if (j&0x02) eeprom->out_is_isochronous = 1;
2519     if (j&0x04) eeprom->suspend_pull_downs = 1;
2520     if (j&0x08) eeprom->use_serial = 1;
2521     if (j&0x10) eeprom->change_usb_version = 1;
2522
2523     // Addr 0B: Invert data lines
2524     eeprom->invert = buf[0x0B];
2525
2526     // Addr 0C: USB version low byte when 0x0A bit 4 is set
2527     // Addr 0D: USB version high byte when 0x0A bit 4 is set
2528     if (eeprom->change_usb_version == 1)
2529     {
2530         eeprom->usb_version = buf[0x0C] + (buf[0x0D] << 8);
2531     }
2532
2533     // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2534     // Addr 0F: Length of manufacturer string
2535     manufacturer_size = buf[0x0F]/2;
2536     if (manufacturer_size > 0) eeprom->manufacturer = malloc(manufacturer_size);
2537     else eeprom->manufacturer = NULL;
2538
2539     // Addr 10: Offset of the product string + 0x80, calculated later
2540     // Addr 11: Length of product string
2541     product_size = buf[0x11]/2;
2542     if (product_size > 0) eeprom->product = malloc(product_size);
2543     else eeprom->product = NULL;
2544
2545     // Addr 12: Offset of the serial string + 0x80, calculated later
2546     // Addr 13: Length of serial string
2547     serial_size = buf[0x13]/2;
2548     if (serial_size > 0) eeprom->serial = malloc(serial_size);
2549     else eeprom->serial = NULL;
2550
2551     // Addr 14: CBUS function: CBUS0, CBUS1
2552     // Addr 15: CBUS function: CBUS2, CBUS3
2553     // Addr 16: CBUS function: CBUS5
2554     if (eeprom->chip_type == TYPE_R) {
2555         eeprom->cbus_function[0] = buf[0x14] & 0x0f;
2556         eeprom->cbus_function[1] = (buf[0x14] >> 4) & 0x0f;
2557         eeprom->cbus_function[2] = buf[0x15] & 0x0f;
2558         eeprom->cbus_function[3] = (buf[0x15] >> 4) & 0x0f;
2559         eeprom->cbus_function[4] = buf[0x16] & 0x0f;
2560     } else {
2561         for (j=0; j<5; j++) eeprom->cbus_function[j] = 0;
2562     }
2563
2564     // Decode manufacturer
2565     i = buf[0x0E] & 0x7f; // offset
2566     for (j=0;j<manufacturer_size-1;j++)
2567     {
2568         eeprom->manufacturer[j] = buf[2*j+i+2];
2569     }
2570     eeprom->manufacturer[j] = '\0';
2571
2572     // Decode product name
2573     i = buf[0x10] & 0x7f; // offset
2574     for (j=0;j<product_size-1;j++)
2575     {
2576         eeprom->product[j] = buf[2*j+i+2];
2577     }
2578     eeprom->product[j] = '\0';
2579
2580     // Decode serial
2581     i = buf[0x12] & 0x7f; // offset
2582     for (j=0;j<serial_size-1;j++)
2583     {
2584         eeprom->serial[j] = buf[2*j+i+2];
2585     }
2586     eeprom->serial[j] = '\0';
2587
2588     // verify checksum
2589     checksum = 0xAAAA;
2590
2591     for (i = 0; i < eeprom_size/2-1; i++)
2592     {
2593         value = buf[i*2];
2594         value += buf[(i*2)+1] << 8;
2595
2596         checksum = value^checksum;
2597         checksum = (checksum << 1) | (checksum >> 15);
2598     }
2599
2600     eeprom_checksum = buf[eeprom_size-2] + (buf[eeprom_size-1] << 8);
2601
2602     if (eeprom_checksum != checksum)
2603     {
2604         fprintf(stderr, "Checksum Error: %04x %04x\n", checksum, eeprom_checksum);
2605         return -1;
2606     }
2607
2608     return 0;
2609 }
2610
2611 /**
2612     Read eeprom location
2613
2614     \param ftdi pointer to ftdi_context
2615     \param eeprom_addr Address of eeprom location to be read
2616     \param eeprom_val Pointer to store read eeprom location
2617
2618     \retval  0: all fine
2619     \retval -1: read failed
2620     \retval -2: USB device unavailable
2621 */
2622 int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val)
2623 {
2624     if (ftdi == NULL || ftdi->usb_dev == NULL)
2625         ftdi_error_return(-2, "USB device unavailable");
2626
2627     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)
2628         ftdi_error_return(-1, "reading eeprom failed");
2629
2630     return 0;
2631 }
2632
2633 /**
2634     Read eeprom
2635
2636     \param ftdi pointer to ftdi_context
2637     \param eeprom Pointer to store eeprom into
2638
2639     \retval  0: all fine
2640     \retval -1: read failed
2641     \retval -2: USB device unavailable
2642 */
2643 int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2644 {
2645     int i;
2646
2647     if (ftdi == NULL || ftdi->usb_dev == NULL)
2648         ftdi_error_return(-2, "USB device unavailable");
2649
2650     for (i = 0; i < ftdi->eeprom_size/2; i++)
2651     {
2652         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)
2653             ftdi_error_return(-1, "reading eeprom failed");
2654     }
2655
2656     return 0;
2657 }
2658
2659 /*
2660     ftdi_read_chipid_shift does the bitshift operation needed for the FTDIChip-ID
2661     Function is only used internally
2662     \internal
2663 */
2664 static unsigned char ftdi_read_chipid_shift(unsigned char value)
2665 {
2666     return ((value & 1) << 1) |
2667            ((value & 2) << 5) |
2668            ((value & 4) >> 2) |
2669            ((value & 8) << 4) |
2670            ((value & 16) >> 1) |
2671            ((value & 32) >> 1) |
2672            ((value & 64) >> 4) |
2673            ((value & 128) >> 2);
2674 }
2675
2676 /**
2677     Read the FTDIChip-ID from R-type devices
2678
2679     \param ftdi pointer to ftdi_context
2680     \param chipid Pointer to store FTDIChip-ID
2681
2682     \retval  0: all fine
2683     \retval -1: read failed
2684     \retval -2: USB device unavailable
2685 */
2686 int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid)
2687 {
2688     unsigned int a = 0, b = 0;
2689
2690     if (ftdi == NULL || ftdi->usb_dev == NULL)
2691         ftdi_error_return(-2, "USB device unavailable");
2692
2693     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)
2694     {
2695         a = a << 8 | a >> 8;
2696         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)
2697         {
2698             b = b << 8 | b >> 8;
2699             a = (a << 16) | (b & 0xFFFF);
2700             a = ftdi_read_chipid_shift(a) | ftdi_read_chipid_shift(a>>8)<<8
2701                 | ftdi_read_chipid_shift(a>>16)<<16 | ftdi_read_chipid_shift(a>>24)<<24;
2702             *chipid = a ^ 0xa5f0f7d1;
2703             return 0;
2704         }
2705     }
2706
2707     ftdi_error_return(-1, "read of FTDIChip-ID failed");
2708 }
2709
2710 /**
2711     Guesses size of eeprom by reading eeprom and comparing halves - will not work with blank eeprom
2712     Call this function then do a write then call again to see if size changes, if so write again.
2713
2714     \param ftdi pointer to ftdi_context
2715     \param eeprom Pointer to store eeprom into
2716     \param maxsize the size of the buffer to read into
2717
2718     \retval -1: eeprom read failed
2719     \retval -2: USB device unavailable
2720     \retval >=0: size of eeprom
2721 */
2722 int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize)
2723 {
2724     int i=0,j,minsize=32;
2725     int size=minsize;
2726
2727     if (ftdi == NULL || ftdi->usb_dev == NULL)
2728         ftdi_error_return(-2, "USB device unavailable");
2729
2730     do
2731     {
2732         for (j = 0; i < maxsize/2 && j<size; j++)
2733         {
2734             if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE,
2735                                 SIO_READ_EEPROM_REQUEST, 0, i,
2736                                 eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
2737                 ftdi_error_return(-1, "eeprom read failed");
2738             i++;
2739         }
2740         size*=2;
2741     }
2742     while (size<=maxsize && memcmp(eeprom,&eeprom[size/2],size/2)!=0);
2743
2744     return size/2;
2745 }
2746
2747 /**
2748     Write eeprom location
2749
2750     \param ftdi pointer to ftdi_context
2751     \param eeprom_addr Address of eeprom location to be written
2752     \param eeprom_val Value to be written
2753
2754     \retval  0: all fine
2755     \retval -1: read failed
2756     \retval -2: USB device unavailable
2757 */
2758 int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, unsigned short eeprom_val)
2759 {
2760     if (ftdi == NULL || ftdi->usb_dev == NULL)
2761         ftdi_error_return(-2, "USB device unavailable");
2762
2763     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2764                                     SIO_WRITE_EEPROM_REQUEST, eeprom_val, eeprom_addr,
2765                                     NULL, 0, ftdi->usb_write_timeout) != 0)
2766         ftdi_error_return(-1, "unable to write eeprom");
2767
2768     return 0;
2769 }
2770
2771 /**
2772     Write eeprom
2773
2774     \param ftdi pointer to ftdi_context
2775     \param eeprom Pointer to read eeprom from
2776
2777     \retval  0: all fine
2778     \retval -1: read failed
2779     \retval -2: USB device unavailable
2780 */
2781 int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2782 {
2783     unsigned short usb_val, status;
2784     int i, ret;
2785
2786     if (ftdi == NULL || ftdi->usb_dev == NULL)
2787         ftdi_error_return(-2, "USB device unavailable");
2788
2789     /* These commands were traced while running MProg */
2790     if ((ret = ftdi_usb_reset(ftdi)) != 0)
2791         return ret;
2792     if ((ret = ftdi_poll_modem_status(ftdi, &status)) != 0)
2793         return ret;
2794     if ((ret = ftdi_set_latency_timer(ftdi, 0x77)) != 0)
2795         return ret;
2796
2797     for (i = 0; i < ftdi->eeprom_size/2; i++)
2798     {
2799         usb_val = eeprom[i*2];
2800         usb_val += eeprom[(i*2)+1] << 8;
2801         if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2802                             SIO_WRITE_EEPROM_REQUEST, usb_val, i,
2803                             NULL, 0, ftdi->usb_write_timeout) != 0)
2804             ftdi_error_return(-1, "unable to write eeprom");
2805     }
2806
2807     return 0;
2808 }
2809
2810 /**
2811     Erase eeprom
2812
2813     This is not supported on FT232R/FT245R according to the MProg manual from FTDI.
2814
2815     \param ftdi pointer to ftdi_context
2816
2817     \retval  0: all fine
2818     \retval -1: erase failed
2819     \retval -2: USB device unavailable
2820 */
2821 int ftdi_erase_eeprom(struct ftdi_context *ftdi)
2822 {
2823     if (ftdi == NULL || ftdi->usb_dev == NULL)
2824         ftdi_error_return(-2, "USB device unavailable");
2825
2826     if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_ERASE_EEPROM_REQUEST, 0, 0, NULL, 0, ftdi->usb_write_timeout) != 0)
2827         ftdi_error_return(-1, "unable to erase eeprom");
2828
2829     return 0;
2830 }
2831
2832 /**
2833     Get string representation for last error code
2834
2835     \param ftdi pointer to ftdi_context
2836
2837     \retval Pointer to error string
2838 */
2839 char *ftdi_get_error_string (struct ftdi_context *ftdi)
2840 {
2841     if (ftdi == NULL)
2842         return "";
2843
2844     return ftdi->error_str;
2845 }
2846
2847 /* @} end of doxygen libftdi group */