Fix clean up code path in _usb_bulk_write_async (uninitialized memory)
[libftdi] / src / ftdi.c
CommitLineData
a3da1d95
GE
1/***************************************************************************
2 ftdi.c - description
3 -------------------
4 begin : Fri Apr 4 2003
8970ed7e 5 copyright : (C) 2003-2010 by Intra2net AG
5fdb1cb1 6 email : opensource@intra2net.com
a3da1d95
GE
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 ***************************************************************************/
d9f0cce7 16
b5ec1820
TJ
17/**
18 \mainpage libftdi API documentation
19
ad397a4b 20 Library to talk to FTDI chips. You find the latest versions of libftdi at
1bfc403c 21 http://www.intra2net.com/en/developer/libftdi/
b5ec1820 22
ad397a4b
TJ
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.
b5ec1820
TJ
27*/
28/** \addtogroup libftdi */
29/* @{ */
30
98452d97 31#include <usb.h>
a8f46ddc 32#include <string.h>
d2f10023 33#include <errno.h>
b56d5a64 34#include <stdio.h>
0e302db6 35
98452d97 36#include "ftdi.h"
a3da1d95 37
7cc9950e 38/* stuff needed for async write */
f01d7ca6 39#ifdef LIBFTDI_LINUX_ASYNC_MODE
22d12cda 40#include <sys/ioctl.h>
22d12cda
TJ
41#include <sys/select.h>
42#include <sys/types.h>
43#include <unistd.h>
44#include <linux/usbdevice_fs.h>
f01d7ca6 45#endif
7cc9950e 46
21abaf2e 47#define ftdi_error_return(code, str) do { \
2f73e59f 48 ftdi->error_str = str; \
21abaf2e 49 return code; \
d2f10023 50 } while(0);
c3d95b87 51
418aaa72 52
3b92d479
UB
53#if defined( __WIN32__) && !defined(__MINGW32__)
54#include <windows.h>
55#define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
56struct timeval {
57 long tv_sec;
58 long tv_usec;
59};
60int 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}
1884225d
TJ
80#else
81 // Include sys/time.h on non-Windows platforms
82 // as gettimeofday() needs it.
83 #include <sys/time.h>
3b92d479
UB
84#endif
85
f3f81007
TJ
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*/
95static int ftdi_usb_close_internal (struct ftdi_context *ftdi)
dff4fdb0
NF
96{
97 int ret = 0;
98
8970ed7e 99 if (ftdi && ftdi->usb_dev)
dff4fdb0
NF
100 {
101 ret = usb_close (ftdi->usb_dev);
102 ftdi->usb_dev = NULL;
103 }
f3f81007 104
dff4fdb0
NF
105 return ret;
106}
c3d95b87 107
1941414d
TJ
108/**
109 Initializes a ftdi_context.
4837f98a 110
1941414d 111 \param ftdi pointer to ftdi_context
4837f98a 112
1941414d
TJ
113 \retval 0: all fine
114 \retval -1: couldn't allocate read buffer
115
116 \remark This should be called before all functions
948f9ada 117*/
a8f46ddc
TJ
118int ftdi_init(struct ftdi_context *ftdi)
119{
bf35baa0 120 unsigned int i;
7cc9950e 121
98452d97 122 ftdi->usb_dev = NULL;
545820ce
TJ
123 ftdi->usb_read_timeout = 5000;
124 ftdi->usb_write_timeout = 5000;
a3da1d95 125
53ad271d 126 ftdi->type = TYPE_BM; /* chip type */
a3da1d95 127 ftdi->baudrate = -1;
418aaa72 128 ftdi->bitbang_enabled = 0; /* 0: normal mode 1: any of the bitbang modes enabled */
a3da1d95 129
948f9ada
TJ
130 ftdi->readbuffer = NULL;
131 ftdi->readbuffer_offset = 0;
132 ftdi->readbuffer_remaining = 0;
133 ftdi->writebuffer_chunksize = 4096;
e2f12a4f 134 ftdi->max_packet_size = 0;
948f9ada 135
545820ce
TJ
136 ftdi->interface = 0;
137 ftdi->index = 0;
138 ftdi->in_ep = 0x02;
139 ftdi->out_ep = 0x81;
418aaa72 140 ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode */
53ad271d 141
a3da1d95
GE
142 ftdi->error_str = NULL;
143
f01d7ca6 144#ifdef LIBFTDI_LINUX_ASYNC_MODE
7cc9950e
GE
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;
f01d7ca6
TJ
152#else
153 ftdi->async_usb_buffer_size=0;
154 ftdi->async_usb_buffer = NULL;
155#endif
7cc9950e 156
c201f80f
TJ
157 ftdi->eeprom_size = FTDI_DEFAULT_EEPROM_SIZE;
158
1c733d33
TJ
159 /* All fine. Now allocate the readbuffer */
160 return ftdi_read_data_set_chunksize(ftdi, 4096);
948f9ada 161}
4837f98a 162
1941414d 163/**
cef378aa
TJ
164 Allocate and initialize a new ftdi_context
165
166 \return a pointer to a new ftdi_context, or NULL on failure
167*/
672ac008 168struct ftdi_context *ftdi_new(void)
cef378aa
TJ
169{
170 struct ftdi_context * ftdi = (struct ftdi_context *)malloc(sizeof(struct ftdi_context));
171
22d12cda
TJ
172 if (ftdi == NULL)
173 {
cef378aa
TJ
174 return NULL;
175 }
176
22d12cda
TJ
177 if (ftdi_init(ftdi) != 0)
178 {
cef378aa 179 free(ftdi);
cdf448f6 180 return NULL;
cef378aa
TJ
181 }
182
183 return ftdi;
184}
185
186/**
1941414d
TJ
187 Open selected channels on a chip, otherwise use first channel.
188
189 \param ftdi pointer to ftdi_context
f9d69895 190 \param interface Interface to use for FT2232C/2232H/4232H chips.
1941414d
TJ
191
192 \retval 0: all fine
193 \retval -1: unknown interface
8970ed7e 194 \retval -2: USB device unavailable
c4446c36 195*/
0ce2f5fa 196int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)
c4446c36 197{
6b11b482 198 if (ftdi == NULL)
8970ed7e
TJ
199 ftdi_error_return(-2, "USB device unavailable");
200
22d12cda
TJ
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;
f9d69895
AH
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;
22d12cda
TJ
225 default:
226 ftdi_error_return(-1, "Unknown interface");
c4446c36
TJ
227 }
228 return 0;
229}
948f9ada 230
1941414d
TJ
231/**
232 Deinitializes a ftdi_context.
4837f98a 233
1941414d 234 \param ftdi pointer to ftdi_context
4837f98a 235*/
a8f46ddc
TJ
236void ftdi_deinit(struct ftdi_context *ftdi)
237{
8970ed7e
TJ
238 if (ftdi == NULL)
239 return;
240
f3f81007 241 ftdi_usb_close_internal (ftdi);
dff4fdb0 242
22d12cda
TJ
243 if (ftdi->async_usb_buffer != NULL)
244 {
7cc9950e
GE
245 free(ftdi->async_usb_buffer);
246 ftdi->async_usb_buffer = NULL;
247 }
248
22d12cda
TJ
249 if (ftdi->readbuffer != NULL)
250 {
d9f0cce7
TJ
251 free(ftdi->readbuffer);
252 ftdi->readbuffer = NULL;
948f9ada 253 }
a3da1d95
GE
254}
255
1941414d 256/**
cef378aa
TJ
257 Deinitialize and free an ftdi_context.
258
259 \param ftdi pointer to ftdi_context
260*/
261void ftdi_free(struct ftdi_context *ftdi)
262{
263 ftdi_deinit(ftdi);
264 free(ftdi);
265}
266
267/**
1941414d
TJ
268 Use an already open libusb device.
269
270 \param ftdi pointer to ftdi_context
271 \param usb libusb usb_dev_handle to use
4837f98a 272*/
a8f46ddc
TJ
273void ftdi_set_usbdev (struct ftdi_context *ftdi, usb_dev_handle *usb)
274{
8970ed7e
TJ
275 if (ftdi == NULL)
276 return;
277
98452d97
TJ
278 ftdi->usb_dev = usb;
279}
280
281
1941414d
TJ
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
edb82cbf 290
1941414d
TJ
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
edb82cbf 295*/
d2f10023 296int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product)
edb82cbf
TJ
297{
298 struct ftdi_device_list **curdev;
299 struct usb_bus *bus;
300 struct usb_device *dev;
301 int count = 0;
d2f10023 302
edb82cbf
TJ
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;
6db32169 310 *curdev = NULL;
22d12cda
TJ
311 for (bus = usb_get_busses(); bus; bus = bus->next)
312 {
313 for (dev = bus->devices; dev; dev = dev->next)
314 {
edb82cbf
TJ
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");
d2f10023 321
edb82cbf
TJ
322 (*curdev)->next = NULL;
323 (*curdev)->dev = dev;
324
325 curdev = &(*curdev)->next;
326 count++;
327 }
328 }
329 }
d2f10023 330
edb82cbf
TJ
331 return count;
332}
333
1941414d
TJ
334/**
335 Frees a usb device list.
edb82cbf 336
1941414d 337 \param devlist USB device list created by ftdi_usb_find_all()
edb82cbf 338*/
d2f10023 339void ftdi_list_free(struct ftdi_device_list **devlist)
edb82cbf 340{
6db32169
TJ
341 struct ftdi_device_list *curdev, *next;
342
22d12cda
TJ
343 for (curdev = *devlist; curdev != NULL;)
344 {
6db32169
TJ
345 next = curdev->next;
346 free(curdev);
347 curdev = next;
edb82cbf
TJ
348 }
349
6db32169 350 *devlist = NULL;
edb82cbf
TJ
351}
352
1941414d 353/**
cef378aa
TJ
354 Frees a usb device list.
355
356 \param devlist USB device list created by ftdi_usb_find_all()
357*/
358void ftdi_list_free2(struct ftdi_device_list *devlist)
359{
360 ftdi_list_free(&devlist);
361}
362
363/**
474786c0
TJ
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
898c34dd
TJ
369 \note Use this function only in combination with ftdi_usb_find_all()
370 as it closes the internal "usb_dev" after use.
371
474786c0
TJ
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*/
389int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct usb_device * dev,
22d12cda 390 char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len)
474786c0
TJ
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
22d12cda
TJ
398 if (manufacturer != NULL)
399 {
400 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iManufacturer, manufacturer, mnf_len) <= 0)
401 {
f3f81007 402 ftdi_usb_close_internal (ftdi);
474786c0
TJ
403 ftdi_error_return(-7, usb_strerror());
404 }
405 }
406
22d12cda
TJ
407 if (description != NULL)
408 {
409 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, description, desc_len) <= 0)
410 {
f3f81007 411 ftdi_usb_close_internal (ftdi);
474786c0
TJ
412 ftdi_error_return(-8, usb_strerror());
413 }
414 }
415
22d12cda
TJ
416 if (serial != NULL)
417 {
418 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, serial, serial_len) <= 0)
419 {
f3f81007 420 ftdi_usb_close_internal (ftdi);
474786c0
TJ
421 ftdi_error_return(-9, usb_strerror());
422 }
423 }
424
f3f81007 425 if (ftdi_usb_close_internal (ftdi) != 0)
474786c0
TJ
426 ftdi_error_return(-10, usb_strerror());
427
428 return 0;
429}
430
431/**
e2f12a4f
TJ
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 */
437static unsigned int _ftdi_determine_max_packet_size(struct ftdi_context *ftdi, struct usb_device *dev)
438{
439 unsigned int packet_size;
440
8970ed7e
TJ
441 // Sanity check
442 if (ftdi == NULL || dev == NULL)
443 return 64;
444
e2f12a4f
TJ
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/**
418aaa72 475 Opens a ftdi device given by an usb_device.
7b18bef6 476
1941414d
TJ
477 \param ftdi pointer to ftdi_context
478 \param dev libusb usb_dev to use
479
480 \retval 0: all fine
23b1798d 481 \retval -3: unable to config device
1941414d
TJ
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
8970ed7e 486 \retval -8: ftdi context invalid
7b18bef6
TJ
487*/
488int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev)
489{
d2f10023 490 int detach_errno = 0;
a56ba2bd 491 int config_val = 1;
8970ed7e
TJ
492
493 if (ftdi == NULL)
494 ftdi_error_return(-8, "ftdi context invalid");
495
7b18bef6
TJ
496 if (!(ftdi->usb_dev = usb_open(dev)))
497 ftdi_error_return(-4, "usb_open() failed");
d2f10023
TJ
498
499#ifdef LIBUSB_HAS_GET_DRIVER_NP
22592e17
TJ
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.
d2f10023
TJ
507 if (usb_detach_kernel_driver_np(ftdi->usb_dev, ftdi->interface) != 0 && errno != ENODATA)
508 detach_errno = errno;
509#endif
510
8af5bbc7 511#ifdef __WIN32__
b57aedfd
GE
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)
a56ba2bd
TJ
515
516 if (dev->descriptor.bNumConfigurations > 0)
b57aedfd 517 {
a56ba2bd
TJ
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)
22d12cda 524 {
a56ba2bd
TJ
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 {
8cb36628 532 ftdi_error_return(-3, "unable to set usb configuration. Make sure the default FTDI driver is not in use");
a56ba2bd 533 }
23b1798d
TJ
534 }
535 }
8af5bbc7 536#endif
23b1798d 537
22d12cda
TJ
538 if (usb_claim_interface(ftdi->usb_dev, ftdi->interface) != 0)
539 {
f3f81007 540 ftdi_usb_close_internal (ftdi);
22d12cda
TJ
541 if (detach_errno == EPERM)
542 {
d2f10023 543 ftdi_error_return(-8, "inappropriate permissions on device!");
22d12cda
TJ
544 }
545 else
546 {
8cb36628 547 ftdi_error_return(-5, "unable to claim usb device. Make sure the default FTDI driver is not in use");
d2f10023 548 }
7b18bef6
TJ
549 }
550
22d12cda
TJ
551 if (ftdi_usb_reset (ftdi) != 0)
552 {
f3f81007 553 ftdi_usb_close_internal (ftdi);
7b18bef6
TJ
554 ftdi_error_return(-6, "ftdi_usb_reset failed");
555 }
556
7b18bef6
TJ
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;
22d12cda 564 else if (dev->descriptor.bcdDevice == 0x500)
7b18bef6 565 ftdi->type = TYPE_2232C;
22d12cda 566 else if (dev->descriptor.bcdDevice == 0x600)
cb6250fa 567 ftdi->type = TYPE_R;
0beb9686
TJ
568 else if (dev->descriptor.bcdDevice == 0x700)
569 ftdi->type = TYPE_2232H;
570 else if (dev->descriptor.bcdDevice == 0x800)
571 ftdi->type = TYPE_4232H;
7b18bef6 572
f9d69895
AH
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
e2f12a4f
TJ
586 // Determine maximum packet size
587 ftdi->max_packet_size = _ftdi_determine_max_packet_size(ftdi, dev);
588
ef6f4838
TE
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
7b18bef6
TJ
595 ftdi_error_return(0, "all fine");
596}
597
1941414d
TJ
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
9bec2387 605 \retval same as ftdi_usb_open_desc()
1941414d 606*/
edb82cbf
TJ
607int 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
1941414d
TJ
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
a3da1d95 633*/
04e1ea0a 634int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
a8f46ddc
TJ
635 const char* description, const char* serial)
636{
5ebbdab9
GE
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
8970ed7e 662 \retval -11: ftdi context invalid
5ebbdab9
GE
663*/
664int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,
665 const char* description, const char* serial, unsigned int index)
666{
98452d97
TJ
667 struct usb_bus *bus;
668 struct usb_device *dev;
c3d95b87 669 char string[256];
98452d97
TJ
670
671 usb_init();
672
c3d95b87
TJ
673 if (usb_find_busses() < 0)
674 ftdi_error_return(-1, "usb_find_busses() failed");
c3d95b87 675 if (usb_find_devices() < 0)
edb82cbf 676 ftdi_error_return(-2, "usb_find_devices() failed");
a3da1d95 677
8970ed7e
TJ
678 if (ftdi == NULL)
679 ftdi_error_return(-11, "ftdi context invalid");
680
22d12cda
TJ
681 for (bus = usb_get_busses(); bus; bus = bus->next)
682 {
683 for (dev = bus->devices; dev; dev = dev->next)
684 {
a8f46ddc 685 if (dev->descriptor.idVendor == vendor
22d12cda
TJ
686 && dev->descriptor.idProduct == product)
687 {
c3d95b87
TJ
688 if (!(ftdi->usb_dev = usb_open(dev)))
689 ftdi_error_return(-4, "usb_open() failed");
690
22d12cda
TJ
691 if (description != NULL)
692 {
693 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, string, sizeof(string)) <= 0)
694 {
f3f81007 695 ftdi_usb_close_internal (ftdi);
c3d95b87 696 ftdi_error_return(-8, "unable to fetch product description");
98452d97 697 }
22d12cda
TJ
698 if (strncmp(string, description, sizeof(string)) != 0)
699 {
f3f81007 700 if (ftdi_usb_close_internal (ftdi) != 0)
edb82cbf 701 ftdi_error_return(-10, "unable to close device");
a8f46ddc
TJ
702 continue;
703 }
704 }
22d12cda
TJ
705 if (serial != NULL)
706 {
707 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, string, sizeof(string)) <= 0)
708 {
f3f81007 709 ftdi_usb_close_internal (ftdi);
c3d95b87 710 ftdi_error_return(-9, "unable to fetch serial number");
a8f46ddc 711 }
22d12cda
TJ
712 if (strncmp(string, serial, sizeof(string)) != 0)
713 {
f3f81007 714 if (ftdi_usb_close_internal (ftdi) != 0)
edb82cbf 715 ftdi_error_return(-10, "unable to close device");
a8f46ddc
TJ
716 continue;
717 }
718 }
98452d97 719
f3f81007 720 if (ftdi_usb_close_internal (ftdi) != 0)
edb82cbf 721 ftdi_error_return(-10, "unable to close device");
d2f10023 722
5ebbdab9
GE
723 if (index > 0)
724 {
725 index--;
726 continue;
727 }
728
edb82cbf 729 return ftdi_usb_open_dev(ftdi, dev);
98452d97
TJ
730 }
731 }
98452d97 732 }
a3da1d95 733
98452d97 734 // device not found
c3d95b87 735 ftdi_error_return(-3, "device not found");
a3da1d95
GE
736}
737
1941414d 738/**
5ebbdab9
GE
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
8970ed7e 763 \retval -12: ftdi context invalid
5ebbdab9
GE
764*/
765int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description)
766{
8970ed7e
TJ
767 if (ftdi == NULL)
768 ftdi_error_return(-12, "ftdi context invalid");
769
5ebbdab9
GE
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;
5ebbdab9
GE
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 {
3d0099ee
MF
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);
5ebbdab9
GE
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;
0e6cf62b 812 const char *serial=NULL;
5ebbdab9
GE
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/**
1941414d 855 Resets the ftdi device.
a3da1d95 856
1941414d
TJ
857 \param ftdi pointer to ftdi_context
858
859 \retval 0: all fine
860 \retval -1: FTDI reset failed
8970ed7e 861 \retval -2: USB device unavailable
4837f98a 862*/
edb82cbf 863int ftdi_usb_reset(struct ftdi_context *ftdi)
a8f46ddc 864{
8970ed7e
TJ
865 if (ftdi == NULL || ftdi->usb_dev == NULL)
866 ftdi_error_return(-2, "USB device unavailable");
867
a5e1bd8c
MK
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)
22d12cda 871 ftdi_error_return(-1,"FTDI reset failed");
c3d95b87 872
545820ce 873 // Invalidate data in the readbuffer
bfcee05b
TJ
874 ftdi->readbuffer_offset = 0;
875 ftdi->readbuffer_remaining = 0;
876
a3da1d95
GE
877 return 0;
878}
879
1941414d 880/**
1189b11a 881 Clears the read buffer on the chip and the internal read buffer.
1941414d
TJ
882
883 \param ftdi pointer to ftdi_context
4837f98a 884
1941414d 885 \retval 0: all fine
1189b11a 886 \retval -1: read buffer purge failed
8970ed7e 887 \retval -2: USB device unavailable
4837f98a 888*/
1189b11a 889int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi)
a8f46ddc 890{
8970ed7e
TJ
891 if (ftdi == NULL || ftdi->usb_dev == NULL)
892 ftdi_error_return(-2, "USB device unavailable");
893
22d12cda
TJ
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)
c3d95b87
TJ
897 ftdi_error_return(-1, "FTDI purge of RX buffer failed");
898
545820ce 899 // Invalidate data in the readbuffer
bfcee05b
TJ
900 ftdi->readbuffer_offset = 0;
901 ftdi->readbuffer_remaining = 0;
a60be878 902
1189b11a
TJ
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
8970ed7e 913 \retval -2: USB device unavailable
1189b11a
TJ
914*/
915int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi)
916{
8970ed7e
TJ
917 if (ftdi == NULL || ftdi->usb_dev == NULL)
918 ftdi_error_return(-2, "USB device unavailable");
919
22d12cda
TJ
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)
1189b11a
TJ
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
8970ed7e 936 \retval -3: USB device unavailable
1189b11a
TJ
937*/
938int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)
939{
940 int result;
941
8970ed7e
TJ
942 if (ftdi == NULL || ftdi->usb_dev == NULL)
943 ftdi_error_return(-3, "USB device unavailable");
944
1189b11a 945 result = ftdi_usb_purge_rx_buffer(ftdi);
5a2b51cb 946 if (result < 0)
1189b11a
TJ
947 return -1;
948
949 result = ftdi_usb_purge_tx_buffer(ftdi);
5a2b51cb 950 if (result < 0)
1189b11a 951 return -2;
545820ce 952
a60be878
TJ
953 return 0;
954}
a3da1d95 955
f3f81007
TJ
956
957
1941414d
TJ
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
8970ed7e 966 \retval -3: ftdi context invalid
a3da1d95 967*/
a8f46ddc
TJ
968int ftdi_usb_close(struct ftdi_context *ftdi)
969{
a3da1d95
GE
970 int rtn = 0;
971
8970ed7e
TJ
972 if (ftdi == NULL)
973 ftdi_error_return(-3, "ftdi context invalid");
974
f01d7ca6 975#ifdef LIBFTDI_LINUX_ASYNC_MODE
7cc9950e
GE
976 /* try to release some kernel resources */
977 ftdi_async_complete(ftdi,1);
f01d7ca6 978#endif
7cc9950e 979
dff4fdb0
NF
980 if (ftdi->usb_dev != NULL)
981 if (usb_release_interface(ftdi->usb_dev, ftdi->interface) != 0)
982 rtn = -1;
98452d97 983
f3f81007 984 if (ftdi_usb_close_internal (ftdi) != 0)
a3da1d95 985 rtn = -2;
98452d97 986
a3da1d95
GE
987 return rtn;
988}
989
418aaa72 990/**
53ad271d
TJ
991 ftdi_convert_baudrate returns nearest supported baud rate to that requested.
992 Function is only used internally
b5ec1820 993 \internal
53ad271d 994*/
0126d22e 995static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
a8f46ddc
TJ
996 unsigned short *value, unsigned short *index)
997{
53ad271d
TJ
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
22d12cda
TJ
1005 if (baudrate <= 0)
1006 {
53ad271d
TJ
1007 // Return error
1008 return -1;
1009 }
1010
1011 divisor = 24000000 / baudrate;
1012
22d12cda
TJ
1013 if (ftdi->type == TYPE_AM)
1014 {
53ad271d
TJ
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;
22d12cda
TJ
1023 for (i = 0; i < 2; i++)
1024 {
53ad271d
TJ
1025 int try_divisor = divisor + i;
1026 int baud_estimate;
1027 int baud_diff;
1028
1029 // Round up to supported divisor value
22d12cda
TJ
1030 if (try_divisor <= 8)
1031 {
53ad271d
TJ
1032 // Round up to minimum supported divisor
1033 try_divisor = 8;
22d12cda
TJ
1034 }
1035 else if (ftdi->type != TYPE_AM && try_divisor < 12)
1036 {
53ad271d
TJ
1037 // BM doesn't support divisors 9 through 11 inclusive
1038 try_divisor = 12;
22d12cda
TJ
1039 }
1040 else if (divisor < 16)
1041 {
53ad271d
TJ
1042 // AM doesn't support divisors 9 through 15 inclusive
1043 try_divisor = 16;
22d12cda
TJ
1044 }
1045 else
1046 {
1047 if (ftdi->type == TYPE_AM)
1048 {
53ad271d
TJ
1049 // Round up to supported fraction (AM only)
1050 try_divisor += am_adjust_up[try_divisor & 7];
22d12cda
TJ
1051 if (try_divisor > 0x1FFF8)
1052 {
53ad271d
TJ
1053 // Round down to maximum supported divisor value (for AM)
1054 try_divisor = 0x1FFF8;
1055 }
22d12cda
TJ
1056 }
1057 else
1058 {
1059 if (try_divisor > 0x1FFFF)
1060 {
53ad271d
TJ
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
22d12cda
TJ
1069 if (baud_estimate < baudrate)
1070 {
53ad271d 1071 baud_diff = baudrate - baud_estimate;
22d12cda
TJ
1072 }
1073 else
1074 {
53ad271d
TJ
1075 baud_diff = baud_estimate - baudrate;
1076 }
22d12cda
TJ
1077 if (i == 0 || baud_diff < best_baud_diff)
1078 {
53ad271d
TJ
1079 // Closest to requested baud rate so far
1080 best_divisor = try_divisor;
1081 best_baud = baud_estimate;
1082 best_baud_diff = baud_diff;
22d12cda
TJ
1083 if (baud_diff == 0)
1084 {
53ad271d
TJ
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
22d12cda
TJ
1093 if (encoded_divisor == 1)
1094 {
4837f98a 1095 encoded_divisor = 0; // 3000000 baud
22d12cda
TJ
1096 }
1097 else if (encoded_divisor == 0x4001)
1098 {
4837f98a 1099 encoded_divisor = 1; // 2000000 baud (BM only)
53ad271d
TJ
1100 }
1101 // Split into "value" and "index" values
1102 *value = (unsigned short)(encoded_divisor & 0xFFFF);
1416eb14 1103 if (ftdi->type == TYPE_2232C || ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H)
22d12cda 1104 {
0126d22e
TJ
1105 *index = (unsigned short)(encoded_divisor >> 8);
1106 *index &= 0xFF00;
a9c57c05 1107 *index |= ftdi->index;
0126d22e
TJ
1108 }
1109 else
1110 *index = (unsigned short)(encoded_divisor >> 16);
c3d95b87 1111
53ad271d
TJ
1112 // Return the nearest baud rate
1113 return best_baud;
1114}
1115
1941414d 1116/**
9bec2387 1117 Sets the chip baud rate
1941414d
TJ
1118
1119 \param ftdi pointer to ftdi_context
9bec2387 1120 \param baudrate baud rate to set
1941414d
TJ
1121
1122 \retval 0: all fine
1123 \retval -1: invalid baudrate
1124 \retval -2: setting baudrate failed
8970ed7e 1125 \retval -3: USB device unavailable
a3da1d95 1126*/
a8f46ddc
TJ
1127int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
1128{
53ad271d
TJ
1129 unsigned short value, index;
1130 int actual_baudrate;
a3da1d95 1131
8970ed7e
TJ
1132 if (ftdi == NULL || ftdi->usb_dev == NULL)
1133 ftdi_error_return(-3, "USB device unavailable");
1134
22d12cda
TJ
1135 if (ftdi->bitbang_enabled)
1136 {
a3da1d95
GE
1137 baudrate = baudrate*4;
1138 }
1139
25707904 1140 actual_baudrate = ftdi_convert_baudrate(baudrate, ftdi, &value, &index);
c3d95b87
TJ
1141 if (actual_baudrate <= 0)
1142 ftdi_error_return (-1, "Silly baudrate <= 0.");
a3da1d95 1143
53ad271d
TJ
1144 // Check within tolerance (about 5%)
1145 if ((actual_baudrate * 2 < baudrate /* Catch overflows */ )
1146 || ((actual_baudrate < baudrate)
1147 ? (actual_baudrate * 21 < baudrate * 20)
c3d95b87
TJ
1148 : (baudrate * 21 < actual_baudrate * 20)))
1149 ftdi_error_return (-1, "Unsupported baudrate. Note: bitbang baudrates are automatically multiplied by 4");
545820ce 1150
a5e1bd8c 1151 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
9ecfef2a
TJ
1152 SIO_SET_BAUDRATE_REQUEST, value,
1153 index, NULL, 0, ftdi->usb_write_timeout) != 0)
c3d95b87 1154 ftdi_error_return (-2, "Setting new baudrate failed");
a3da1d95
GE
1155
1156 ftdi->baudrate = baudrate;
1157 return 0;
1158}
1159
1941414d 1160/**
6c32e222
TJ
1161 Set (RS232) line characteristics.
1162 The break type can only be set via ftdi_set_line_property2()
1163 and defaults to "off".
4837f98a 1164
1941414d
TJ
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
2f73e59f
TJ
1172*/
1173int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
d2f10023 1174 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
2f73e59f 1175{
6c32e222
TJ
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
8970ed7e 1190 \retval -2: USB device unavailable
6c32e222
TJ
1191*/
1192int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
22d12cda
TJ
1193 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
1194 enum ftdi_break_type break_type)
6c32e222 1195{
2f73e59f
TJ
1196 unsigned short value = bits;
1197
8970ed7e
TJ
1198 if (ftdi == NULL || ftdi->usb_dev == NULL)
1199 ftdi_error_return(-2, "USB device unavailable");
1200
22d12cda
TJ
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;
2f73e59f 1218 }
d2f10023 1219
22d12cda
TJ
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;
2f73e59f 1231 }
d2f10023 1232
22d12cda
TJ
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;
6c32e222
TJ
1241 }
1242
a5e1bd8c 1243 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
9ecfef2a
TJ
1244 SIO_SET_DATA_REQUEST, value,
1245 ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
2f73e59f 1246 ftdi_error_return (-1, "Setting new line property failed");
d2f10023 1247
2f73e59f
TJ
1248 return 0;
1249}
a3da1d95 1250
1941414d
TJ
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
8970ed7e 1258 \retval -666: USB device unavailable
1941414d
TJ
1259 \retval <0: error code from usb_bulk_write()
1260 \retval >0: number of bytes written
1261*/
a8f46ddc
TJ
1262int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1263{
a3da1d95
GE
1264 int ret;
1265 int offset = 0;
545820ce 1266 int total_written = 0;
c3d95b87 1267
8970ed7e
TJ
1268 if (ftdi == NULL || ftdi->usb_dev == NULL)
1269 ftdi_error_return(-666, "USB device unavailable");
1270
22d12cda
TJ
1271 while (offset < size)
1272 {
948f9ada 1273 int write_size = ftdi->writebuffer_chunksize;
a3da1d95
GE
1274
1275 if (offset+write_size > size)
1276 write_size = size-offset;
1277
98452d97 1278 ret = usb_bulk_write(ftdi->usb_dev, ftdi->in_ep, buf+offset, write_size, ftdi->usb_write_timeout);
c3d95b87
TJ
1279 if (ret < 0)
1280 ftdi_error_return(ret, "usb bulk write failed");
a3da1d95 1281
c3d95b87 1282 total_written += ret;
a3da1d95
GE
1283 offset += write_size;
1284 }
1285
545820ce 1286 return total_written;
a3da1d95
GE
1287}
1288
f01d7ca6 1289#ifdef LIBFTDI_LINUX_ASYNC_MODE
e59bc450
CW
1290#ifdef USB_CLASS_PTP
1291#error LIBFTDI_LINUX_ASYNC_MODE is not compatible with libusb-compat-0.1!
1292#endif
4c9e3812
GE
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) */
22d12cda
TJ
1295struct usb_dev_handle
1296{
1297 int fd;
1298 // some other stuff coming here we don't need
4c9e3812
GE
1299};
1300
84f85aaa 1301/**
c201f80f
TJ
1302 Check for pending async urbs
1303 \internal
1304*/
1305static int _usb_get_async_urbs_pending(struct ftdi_context *ftdi)
7cc9950e
GE
1306{
1307 struct usbdevfs_urb *urb;
1308 int pending=0;
bf35baa0 1309 unsigned int i;
7cc9950e 1310
22d12cda
TJ
1311 for (i=0; i < ftdi->async_usb_buffer_size; i++)
1312 {
7cc9950e
GE
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
84f85aaa
GE
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
c201f80f
TJ
1329 \internal
1330*/
1331static void _usb_async_cleanup(struct ftdi_context *ftdi, int wait_for_more, int timeout_msec)
7cc9950e 1332{
22d12cda 1333 struct timeval tv;
236e16d1 1334 struct usbdevfs_urb *urb;
22d12cda
TJ
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
7cc9950e 1347 {
236e16d1
TJ
1348 ret = -1;
1349 urb = NULL;
1350
22d12cda
TJ
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 }
7cc9950e 1361
22d12cda
TJ
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;
7cc9950e 1370
22d12cda 1371 /* try to get more urbs that are ready now, but don't wait anymore */
22d12cda
TJ
1372 keep_going=1;
1373 }
1374 else
1375 {
1376 /* no more urbs waiting */
1377 keep_going=0;
1378 }
7cc9950e 1379 }
22d12cda 1380 while (keep_going);
7cc9950e
GE
1381}
1382
1383/**
84f85aaa
GE
1384 Wait until one or more async URBs are completed by the kernel and mark their
1385 positions in the async-buffer as unused.
7cc9950e
GE
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*/
1390void ftdi_async_complete(struct ftdi_context *ftdi, int wait_for_more)
1391{
22d12cda 1392 _usb_async_cleanup(ftdi,wait_for_more,ftdi->usb_write_timeout);
7cc9950e 1393}
4c9e3812
GE
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.
c201f80f 1398 \internal
4c9e3812 1399*/
c201f80f 1400static int _usb_bulk_write_async(struct ftdi_context *ftdi, int ep, char *bytes, int size)
4c9e3812 1401{
22d12cda
TJ
1402 struct usbdevfs_urb *urb;
1403 int bytesdone = 0, requested;
bf35baa0
TJ
1404 int ret, cleanup_count;
1405 unsigned int i;
22d12cda
TJ
1406
1407 do
7cc9950e 1408 {
22d12cda 1409 /* find a free urb buffer we can use */
3af1ac09 1410 i = 0;
22d12cda
TJ
1411 urb=NULL;
1412 for (cleanup_count=0; urb==NULL && cleanup_count <= 1; cleanup_count++)
1413 {
1414 if (i==ftdi->async_usb_buffer_size)
1415 {
1416 /* wait until some buffers are free */
1417 _usb_async_cleanup(ftdi,0,ftdi->usb_write_timeout);
1418 }
7cc9950e 1419
22d12cda
TJ
1420 for (i=0; i < ftdi->async_usb_buffer_size; i++)
1421 {
1422 urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
1423 if (urb->usercontext == FTDI_URB_USERCONTEXT_COOKIE)
1424 break; /* found a free urb position */
1425 urb=NULL;
1426 }
7cc9950e 1427 }
7cc9950e 1428
22d12cda
TJ
1429 /* no free urb position found */
1430 if (urb==NULL)
1431 return -1;
1432
1433 requested = size - bytesdone;
1434 if (requested > 4096)
1435 requested = 4096;
4c9e3812 1436
22d12cda
TJ
1437 memset(urb,0,sizeof(urb));
1438
1439 urb->type = USBDEVFS_URB_TYPE_BULK;
1440 urb->endpoint = ep;
1441 urb->flags = 0;
1442 urb->buffer = bytes + bytesdone;
1443 urb->buffer_length = requested;
1444 urb->signr = 0;
1445 urb->actual_length = 0;
1446 urb->number_of_packets = 0;
1447 urb->usercontext = 0;
1448
1449 do
1450 {
1451 ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_SUBMITURB, urb);
1452 }
1453 while (ret < 0 && errno == EINTR);
1454 if (ret < 0)
1455 return ret; /* the caller can read errno to get more info */
1456
1457 bytesdone += requested;
1458 }
1459 while (bytesdone < size);
1460 return bytesdone;
4c9e3812
GE
1461}
1462
1463/**
1464 Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip.
1465 Does not wait for completion of the transfer nor does it make sure that
1466 the transfer was successful.
1467
1468 This function could be extended to use signals and callbacks to inform the
1469 caller of completion or error - but this is not done yet, volunteers welcome.
1470
1471 Works around libusb and directly accesses functions only available on Linux.
cef378aa 1472 Only available if compiled with --with-async-mode.
4c9e3812
GE
1473
1474 \param ftdi pointer to ftdi_context
1475 \param buf Buffer with the data
1476 \param size Size of the buffer
1477
8970ed7e 1478 \retval -666: USB device unavailable
4c9e3812
GE
1479 \retval <0: error code from usb_bulk_write()
1480 \retval >0: number of bytes written
1481*/
1482int ftdi_write_data_async(struct ftdi_context *ftdi, unsigned char *buf, int size)
1483{
1484 int ret;
1485 int offset = 0;
1486 int total_written = 0;
1487
8970ed7e
TJ
1488 if (ftdi == NULL || ftdi->usb_dev == NULL)
1489 ftdi_error_return(-666, "USB device unavailable");
1490
22d12cda
TJ
1491 while (offset < size)
1492 {
4c9e3812
GE
1493 int write_size = ftdi->writebuffer_chunksize;
1494
1495 if (offset+write_size > size)
1496 write_size = size-offset;
1497
c201f80f 1498 ret = _usb_bulk_write_async(ftdi, ftdi->in_ep, buf+offset, write_size);
4c9e3812
GE
1499 if (ret < 0)
1500 ftdi_error_return(ret, "usb bulk write async failed");
1501
1502 total_written += ret;
1503 offset += write_size;
1504 }
1505
1506 return total_written;
1507}
f01d7ca6 1508#endif // LIBFTDI_LINUX_ASYNC_MODE
4c9e3812 1509
1941414d
TJ
1510/**
1511 Configure write buffer chunk size.
1512 Default is 4096.
1513
1514 \param ftdi pointer to ftdi_context
1515 \param chunksize Chunk size
a3da1d95 1516
1941414d 1517 \retval 0: all fine
8970ed7e 1518 \retval -1: ftdi context invalid
1941414d 1519*/
a8f46ddc
TJ
1520int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1521{
8970ed7e
TJ
1522 if (ftdi == NULL)
1523 ftdi_error_return(-1, "ftdi context invalid");
1524
948f9ada
TJ
1525 ftdi->writebuffer_chunksize = chunksize;
1526 return 0;
1527}
1528
1941414d
TJ
1529/**
1530 Get write buffer chunk size.
1531
1532 \param ftdi pointer to ftdi_context
1533 \param chunksize Pointer to store chunk size in
948f9ada 1534
1941414d 1535 \retval 0: all fine
8970ed7e 1536 \retval -1: ftdi context invalid
1941414d 1537*/
a8f46ddc
TJ
1538int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1539{
8970ed7e
TJ
1540 if (ftdi == NULL)
1541 ftdi_error_return(-1, "ftdi context invalid");
1542
948f9ada
TJ
1543 *chunksize = ftdi->writebuffer_chunksize;
1544 return 0;
1545}
cbabb7d3 1546
1941414d
TJ
1547/**
1548 Reads data in chunks (see ftdi_read_data_set_chunksize()) from the chip.
1549
1550 Automatically strips the two modem status bytes transfered during every read.
948f9ada 1551
1941414d
TJ
1552 \param ftdi pointer to ftdi_context
1553 \param buf Buffer to store data in
1554 \param size Size of the buffer
1555
8970ed7e 1556 \retval -666: USB device unavailable
1941414d 1557 \retval <0: error code from usb_bulk_read()
d77b0e94 1558 \retval 0: no data was available
1941414d
TJ
1559 \retval >0: number of bytes read
1560
1941414d 1561*/
a8f46ddc
TJ
1562int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1563{
1c733d33 1564 int offset = 0, ret = 1, i, num_of_chunks, chunk_remains;
8970ed7e 1565 int packet_size;
3b92d479 1566 struct timeval tv_start, tv_current;
f2f00cb5 1567
8970ed7e
TJ
1568 if (ftdi == NULL || ftdi->usb_dev == NULL)
1569 ftdi_error_return(-666, "USB device unavailable");
1570
1571 packet_size = ftdi->max_packet_size;
e2f12a4f
TJ
1572 // Packet size sanity check (avoid division by zero)
1573 if (packet_size == 0)
1574 ftdi_error_return(-1, "max_packet_size is bogus (zero)");
d9f0cce7 1575
948f9ada 1576 // everything we want is still in the readbuffer?
22d12cda
TJ
1577 if (size <= ftdi->readbuffer_remaining)
1578 {
d9f0cce7
TJ
1579 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1580
1581 // Fix offsets
1582 ftdi->readbuffer_remaining -= size;
1583 ftdi->readbuffer_offset += size;
1584
545820ce 1585 /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
d9f0cce7
TJ
1586
1587 return size;
979a145c 1588 }
948f9ada 1589 // something still in the readbuffer, but not enough to satisfy 'size'?
22d12cda
TJ
1590 if (ftdi->readbuffer_remaining != 0)
1591 {
d9f0cce7 1592 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
979a145c 1593
d9f0cce7
TJ
1594 // Fix offset
1595 offset += ftdi->readbuffer_remaining;
948f9ada 1596 }
948f9ada 1597 // do the actual USB read
3b92d479 1598 gettimeofday(&tv_start,NULL);
22d12cda
TJ
1599 while (offset < size && ret > 0)
1600 {
d9f0cce7
TJ
1601 ftdi->readbuffer_remaining = 0;
1602 ftdi->readbuffer_offset = 0;
98452d97
TJ
1603 /* returns how much received */
1604 ret = usb_bulk_read (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, ftdi->usb_read_timeout);
c3d95b87
TJ
1605 if (ret < 0)
1606 ftdi_error_return(ret, "usb bulk read failed");
98452d97 1607
22d12cda
TJ
1608 if (ret > 2)
1609 {
d9f0cce7
TJ
1610 // skip FTDI status bytes.
1611 // Maybe stored in the future to enable modem use
f2f00cb5
DC
1612 num_of_chunks = ret / packet_size;
1613 chunk_remains = ret % packet_size;
1c733d33
TJ
1614 //printf("ret = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", ret, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1615
d9f0cce7
TJ
1616 ftdi->readbuffer_offset += 2;
1617 ret -= 2;
1c733d33 1618
f2f00cb5 1619 if (ret > packet_size - 2)
22d12cda 1620 {
1c733d33 1621 for (i = 1; i < num_of_chunks; i++)
f2f00cb5
DC
1622 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1623 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1624 packet_size - 2);
22d12cda
TJ
1625 if (chunk_remains > 2)
1626 {
f2f00cb5
DC
1627 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1628 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1c733d33
TJ
1629 chunk_remains-2);
1630 ret -= 2*num_of_chunks;
22d12cda
TJ
1631 }
1632 else
1c733d33
TJ
1633 ret -= 2*(num_of_chunks-1)+chunk_remains;
1634 }
d9f0cce7 1635 // data still fits in buf?
22d12cda
TJ
1636 if (offset+ret <= size)
1637 {
d9f0cce7 1638 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, ret);
545820ce 1639 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
d9f0cce7
TJ
1640 offset += ret;
1641
53ad271d 1642 /* Did we read exactly the right amount of bytes? */
d9f0cce7 1643 if (offset == size)
c4446c36
TJ
1644 //printf("read_data exact rem %d offset %d\n",
1645 //ftdi->readbuffer_remaining, offset);
d9f0cce7 1646 return offset;
22d12cda
TJ
1647 }
1648 else
1649 {
d9f0cce7
TJ
1650 // only copy part of the data or size <= readbuffer_chunksize
1651 int part_size = size-offset;
1652 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, part_size);
98452d97 1653
d9f0cce7
TJ
1654 ftdi->readbuffer_offset += part_size;
1655 ftdi->readbuffer_remaining = ret-part_size;
1656 offset += part_size;
1657
53ad271d
TJ
1658 /* printf("Returning part: %d - size: %d - offset: %d - ret: %d - remaining: %d\n",
1659 part_size, size, offset, ret, ftdi->readbuffer_remaining); */
d9f0cce7 1660
3094872b 1661 return offset;
d9f0cce7
TJ
1662 }
1663 }
3b92d479
UB
1664 gettimeofday(&tv_current,NULL);
1665 if(((tv_current.tv_sec - tv_start.tv_sec)*1000000+(tv_current.tv_usec - tv_start.tv_usec))
1666 > ftdi->usb_read_timeout)
1667 return offset;
cbabb7d3 1668 }
948f9ada 1669 // never reached
29c4af7f 1670 return -127;
a3da1d95
GE
1671}
1672
1941414d
TJ
1673/**
1674 Configure read buffer chunk size.
1675 Default is 4096.
1676
1677 Automatically reallocates the buffer.
a3da1d95 1678
1941414d
TJ
1679 \param ftdi pointer to ftdi_context
1680 \param chunksize Chunk size
1681
1682 \retval 0: all fine
8970ed7e 1683 \retval -1: ftdi context invalid
1941414d 1684*/
a8f46ddc
TJ
1685int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1686{
29c4af7f
TJ
1687 unsigned char *new_buf;
1688
8970ed7e
TJ
1689 if (ftdi == NULL)
1690 ftdi_error_return(-1, "ftdi context invalid");
1691
948f9ada
TJ
1692 // Invalidate all remaining data
1693 ftdi->readbuffer_offset = 0;
1694 ftdi->readbuffer_remaining = 0;
1695
c3d95b87
TJ
1696 if ((new_buf = (unsigned char *)realloc(ftdi->readbuffer, chunksize)) == NULL)
1697 ftdi_error_return(-1, "out of memory for readbuffer");
d9f0cce7 1698
948f9ada
TJ
1699 ftdi->readbuffer = new_buf;
1700 ftdi->readbuffer_chunksize = chunksize;
1701
1702 return 0;
1703}
1704
1941414d
TJ
1705/**
1706 Get read buffer chunk size.
948f9ada 1707
1941414d
TJ
1708 \param ftdi pointer to ftdi_context
1709 \param chunksize Pointer to store chunk size in
1710
1711 \retval 0: all fine
8970ed7e 1712 \retval -1: FTDI context invalid
1941414d 1713*/
a8f46ddc
TJ
1714int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1715{
8970ed7e
TJ
1716 if (ftdi == NULL)
1717 ftdi_error_return(-1, "FTDI context invalid");
1718
948f9ada
TJ
1719 *chunksize = ftdi->readbuffer_chunksize;
1720 return 0;
1721}
1722
1723
1941414d
TJ
1724/**
1725 Enable bitbang mode.
948f9ada 1726
fd282db3 1727 \deprecated use \ref ftdi_set_bitmode with mode BITMODE_BITBANG instead
1941414d
TJ
1728
1729 \param ftdi pointer to ftdi_context
1730 \param bitmask Bitmask to configure lines.
1731 HIGH/ON value configures a line as output.
1732
1733 \retval 0: all fine
1734 \retval -1: can't enable bitbang mode
8970ed7e 1735 \retval -2: USB device unavailable
1941414d 1736*/
a8f46ddc
TJ
1737int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
1738{
a3da1d95
GE
1739 unsigned short usb_val;
1740
8970ed7e
TJ
1741 if (ftdi == NULL || ftdi->usb_dev == NULL)
1742 ftdi_error_return(-2, "USB device unavailable");
1743
d9f0cce7 1744 usb_val = bitmask; // low byte: bitmask
3119537f
TJ
1745 /* FT2232C: Set bitbang_mode to 2 to enable SPI */
1746 usb_val |= (ftdi->bitbang_mode << 8);
1747
22d12cda
TJ
1748 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1749 SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index,
a5e1bd8c 1750 NULL, 0, ftdi->usb_write_timeout) != 0)
c3d95b87
TJ
1751 ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
1752
a3da1d95
GE
1753 ftdi->bitbang_enabled = 1;
1754 return 0;
1755}
1756
1941414d
TJ
1757/**
1758 Disable bitbang mode.
a3da1d95 1759
1941414d
TJ
1760 \param ftdi pointer to ftdi_context
1761
1762 \retval 0: all fine
1763 \retval -1: can't disable bitbang mode
8970ed7e 1764 \retval -2: USB device unavailable
1941414d 1765*/
a8f46ddc
TJ
1766int ftdi_disable_bitbang(struct ftdi_context *ftdi)
1767{
8970ed7e
TJ
1768 if (ftdi == NULL || ftdi->usb_dev == NULL)
1769 ftdi_error_return(-2, "USB device unavailable");
1770
a5e1bd8c 1771 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
c3d95b87 1772 ftdi_error_return(-1, "unable to leave bitbang mode. Perhaps not a BM type chip?");
a3da1d95
GE
1773
1774 ftdi->bitbang_enabled = 0;
1775 return 0;
1776}
1777
1941414d 1778/**
418aaa72 1779 Enable/disable bitbang modes.
a3da1d95 1780
1941414d
TJ
1781 \param ftdi pointer to ftdi_context
1782 \param bitmask Bitmask to configure lines.
1783 HIGH/ON value configures a line as output.
fd282db3 1784 \param mode Bitbang mode: use the values defined in \ref ftdi_mpsse_mode
1941414d
TJ
1785
1786 \retval 0: all fine
1787 \retval -1: can't enable bitbang mode
8970ed7e 1788 \retval -2: USB device unavailable
1941414d 1789*/
c4446c36
TJ
1790int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
1791{
1792 unsigned short usb_val;
1793
8970ed7e
TJ
1794 if (ftdi == NULL || ftdi->usb_dev == NULL)
1795 ftdi_error_return(-2, "USB device unavailable");
1796
c4446c36
TJ
1797 usb_val = bitmask; // low byte: bitmask
1798 usb_val |= (mode << 8);
a5e1bd8c 1799 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
418aaa72 1800 ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps selected mode not supported on your chip?");
c4446c36
TJ
1801
1802 ftdi->bitbang_mode = mode;
418aaa72 1803 ftdi->bitbang_enabled = (mode == BITMODE_RESET) ? 0 : 1;
c4446c36
TJ
1804 return 0;
1805}
1806
1941414d 1807/**
418aaa72 1808 Directly read pin state, circumventing the read buffer. Useful for bitbang mode.
1941414d
TJ
1809
1810 \param ftdi pointer to ftdi_context
1811 \param pins Pointer to store pins into
1812
1813 \retval 0: all fine
1814 \retval -1: read pins failed
8970ed7e 1815 \retval -2: USB device unavailable
1941414d 1816*/
a8f46ddc
TJ
1817int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins)
1818{
8970ed7e
TJ
1819 if (ftdi == NULL || ftdi->usb_dev == NULL)
1820 ftdi_error_return(-2, "USB device unavailable");
1821
a5e1bd8c 1822 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_PINS_REQUEST, 0, ftdi->index, (char *)pins, 1, ftdi->usb_read_timeout) != 1)
c3d95b87 1823 ftdi_error_return(-1, "read pins failed");
a3da1d95 1824
a3da1d95
GE
1825 return 0;
1826}
1827
1941414d
TJ
1828/**
1829 Set latency timer
1830
1831 The FTDI chip keeps data in the internal buffer for a specific
1832 amount of time if the buffer is not full yet to decrease
1833 load on the usb bus.
a3da1d95 1834
1941414d
TJ
1835 \param ftdi pointer to ftdi_context
1836 \param latency Value between 1 and 255
1837
1838 \retval 0: all fine
1839 \retval -1: latency out of range
1840 \retval -2: unable to set latency timer
8970ed7e 1841 \retval -3: USB device unavailable
1941414d 1842*/
a8f46ddc
TJ
1843int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
1844{
a3da1d95
GE
1845 unsigned short usb_val;
1846
c3d95b87
TJ
1847 if (latency < 1)
1848 ftdi_error_return(-1, "latency out of range. Only valid for 1-255");
a3da1d95 1849
8970ed7e
TJ
1850 if (ftdi == NULL || ftdi->usb_dev == NULL)
1851 ftdi_error_return(-3, "USB device unavailable");
1852
d79d2e68 1853 usb_val = latency;
a5e1bd8c 1854 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_LATENCY_TIMER_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
c3d95b87
TJ
1855 ftdi_error_return(-2, "unable to set latency timer");
1856
a3da1d95
GE
1857 return 0;
1858}
1859
1941414d
TJ
1860/**
1861 Get latency timer
a3da1d95 1862
1941414d
TJ
1863 \param ftdi pointer to ftdi_context
1864 \param latency Pointer to store latency value in
1865
1866 \retval 0: all fine
1867 \retval -1: unable to get latency timer
8970ed7e 1868 \retval -2: USB device unavailable
1941414d 1869*/
a8f46ddc
TJ
1870int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency)
1871{
a3da1d95 1872 unsigned short usb_val;
8970ed7e
TJ
1873
1874 if (ftdi == NULL || ftdi->usb_dev == NULL)
1875 ftdi_error_return(-2, "USB device unavailable");
1876
a5e1bd8c 1877 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_GET_LATENCY_TIMER_REQUEST, 0, ftdi->index, (char *)&usb_val, 1, ftdi->usb_read_timeout) != 1)
c3d95b87 1878 ftdi_error_return(-1, "reading latency timer failed");
a3da1d95
GE
1879
1880 *latency = (unsigned char)usb_val;
1881 return 0;
1882}
1883
1941414d 1884/**
1189b11a
TJ
1885 Poll modem status information
1886
1887 This function allows the retrieve the two status bytes of the device.
1888 The device sends these bytes also as a header for each read access
1889 where they are discarded by ftdi_read_data(). The chip generates
1890 the two stripped status bytes in the absence of data every 40 ms.
1891
1892 Layout of the first byte:
1893 - B0..B3 - must be 0
1894 - B4 Clear to send (CTS)
1895 0 = inactive
1896 1 = active
1897 - B5 Data set ready (DTS)
1898 0 = inactive
1899 1 = active
1900 - B6 Ring indicator (RI)
1901 0 = inactive
1902 1 = active
1903 - B7 Receive line signal detect (RLSD)
1904 0 = inactive
1905 1 = active
1906
1907 Layout of the second byte:
1908 - B0 Data ready (DR)
1909 - B1 Overrun error (OE)
1910 - B2 Parity error (PE)
1911 - B3 Framing error (FE)
1912 - B4 Break interrupt (BI)
1913 - B5 Transmitter holding register (THRE)
1914 - B6 Transmitter empty (TEMT)
1915 - B7 Error in RCVR FIFO
1916
1917 \param ftdi pointer to ftdi_context
1918 \param status Pointer to store status information in. Must be two bytes.
1919
1920 \retval 0: all fine
1921 \retval -1: unable to retrieve status information
8970ed7e 1922 \retval -2: USB device unavailable
1189b11a
TJ
1923*/
1924int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status)
1925{
1926 char usb_val[2];
1927
8970ed7e
TJ
1928 if (ftdi == NULL || ftdi->usb_dev == NULL)
1929 ftdi_error_return(-2, "USB device unavailable");
1930
a5e1bd8c 1931 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_POLL_MODEM_STATUS_REQUEST, 0, ftdi->index, usb_val, 2, ftdi->usb_read_timeout) != 2)
1189b11a
TJ
1932 ftdi_error_return(-1, "getting modem status failed");
1933
1934 *status = (usb_val[1] << 8) | usb_val[0];
1935
1936 return 0;
1937}
1938
a7fb8440
TJ
1939/**
1940 Set flowcontrol for ftdi chip
1941
1942 \param ftdi pointer to ftdi_context
22d12cda
TJ
1943 \param flowctrl flow control to use. should be
1944 SIO_DISABLE_FLOW_CTRL, SIO_RTS_CTS_HS, SIO_DTR_DSR_HS or SIO_XON_XOFF_HS
a7fb8440
TJ
1945
1946 \retval 0: all fine
1947 \retval -1: set flow control failed
8970ed7e 1948 \retval -2: USB device unavailable
a7fb8440
TJ
1949*/
1950int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl)
1951{
8970ed7e
TJ
1952 if (ftdi == NULL || ftdi->usb_dev == NULL)
1953 ftdi_error_return(-2, "USB device unavailable");
1954
a5e1bd8c 1955 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
9ecfef2a 1956 SIO_SET_FLOW_CTRL_REQUEST, 0, (flowctrl | ftdi->index),
a7fb8440
TJ
1957 NULL, 0, ftdi->usb_write_timeout) != 0)
1958 ftdi_error_return(-1, "set flow control failed");
1959
1960 return 0;
1961}
1962
1963/**
1964 Set dtr line
1965
1966 \param ftdi pointer to ftdi_context
1967 \param state state to set line to (1 or 0)
1968
1969 \retval 0: all fine
1970 \retval -1: set dtr failed
8970ed7e 1971 \retval -2: USB device unavailable
a7fb8440
TJ
1972*/
1973int ftdi_setdtr(struct ftdi_context *ftdi, int state)
1974{
1975 unsigned short usb_val;
1976
8970ed7e
TJ
1977 if (ftdi == NULL || ftdi->usb_dev == NULL)
1978 ftdi_error_return(-2, "USB device unavailable");
1979
a7fb8440
TJ
1980 if (state)
1981 usb_val = SIO_SET_DTR_HIGH;
1982 else
1983 usb_val = SIO_SET_DTR_LOW;
1984
a5e1bd8c 1985 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
9ecfef2a 1986 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
a7fb8440
TJ
1987 NULL, 0, ftdi->usb_write_timeout) != 0)
1988 ftdi_error_return(-1, "set dtr failed");
1989
1990 return 0;
1991}
1992
1993/**
1994 Set rts line
1995
1996 \param ftdi pointer to ftdi_context
1997 \param state state to set line to (1 or 0)
1998
1999 \retval 0: all fine
8970ed7e
TJ
2000 \retval -1: set rts failed
2001 \retval -2: USB device unavailable
a7fb8440
TJ
2002*/
2003int ftdi_setrts(struct ftdi_context *ftdi, int state)
2004{
2005 unsigned short usb_val;
2006
8970ed7e
TJ
2007 if (ftdi == NULL || ftdi->usb_dev == NULL)
2008 ftdi_error_return(-2, "USB device unavailable");
2009
a7fb8440
TJ
2010 if (state)
2011 usb_val = SIO_SET_RTS_HIGH;
2012 else
2013 usb_val = SIO_SET_RTS_LOW;
2014
a5e1bd8c 2015 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
9ecfef2a 2016 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
a7fb8440
TJ
2017 NULL, 0, ftdi->usb_write_timeout) != 0)
2018 ftdi_error_return(-1, "set of rts failed");
2019
2020 return 0;
2021}
2022
1189b11a 2023/**
8970ed7e 2024 Set dtr and rts line in one pass
9ecfef2a 2025
8970ed7e
TJ
2026 \param ftdi pointer to ftdi_context
2027 \param dtr DTR state to set line to (1 or 0)
2028 \param rts RTS state to set line to (1 or 0)
9ecfef2a 2029
8970ed7e
TJ
2030 \retval 0: all fine
2031 \retval -1: set dtr/rts failed
2032 \retval -2: USB device unavailable
9ecfef2a
TJ
2033 */
2034int ftdi_setdtr_rts(struct ftdi_context *ftdi, int dtr, int rts)
2035{
2036 unsigned short usb_val;
2037
8970ed7e
TJ
2038 if (ftdi == NULL || ftdi->usb_dev == NULL)
2039 ftdi_error_return(-2, "USB device unavailable");
2040
9ecfef2a 2041 if (dtr)
22d12cda 2042 usb_val = SIO_SET_DTR_HIGH;
9ecfef2a 2043 else
22d12cda 2044 usb_val = SIO_SET_DTR_LOW;
9ecfef2a
TJ
2045
2046 if (rts)
22d12cda 2047 usb_val |= SIO_SET_RTS_HIGH;
9ecfef2a 2048 else
22d12cda 2049 usb_val |= SIO_SET_RTS_LOW;
9ecfef2a 2050
a5e1bd8c 2051 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
9ecfef2a
TJ
2052 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2053 NULL, 0, ftdi->usb_write_timeout) != 0)
22d12cda 2054 ftdi_error_return(-1, "set of rts/dtr failed");
9ecfef2a
TJ
2055
2056 return 0;
2057}
2058
2059/**
1189b11a
TJ
2060 Set the special event character
2061
2062 \param ftdi pointer to ftdi_context
2063 \param eventch Event character
2064 \param enable 0 to disable the event character, non-zero otherwise
2065
2066 \retval 0: all fine
2067 \retval -1: unable to set event character
8970ed7e 2068 \retval -2: USB device unavailable
1189b11a
TJ
2069*/
2070int ftdi_set_event_char(struct ftdi_context *ftdi,
22d12cda 2071 unsigned char eventch, unsigned char enable)
1189b11a
TJ
2072{
2073 unsigned short usb_val;
2074
8970ed7e
TJ
2075 if (ftdi == NULL || ftdi->usb_dev == NULL)
2076 ftdi_error_return(-2, "USB device unavailable");
2077
1189b11a
TJ
2078 usb_val = eventch;
2079 if (enable)
2080 usb_val |= 1 << 8;
2081
a5e1bd8c 2082 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_EVENT_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1189b11a
TJ
2083 ftdi_error_return(-1, "setting event character failed");
2084
2085 return 0;
2086}
2087
2088/**
2089 Set error character
2090
2091 \param ftdi pointer to ftdi_context
2092 \param errorch Error character
2093 \param enable 0 to disable the error character, non-zero otherwise
2094
2095 \retval 0: all fine
2096 \retval -1: unable to set error character
8970ed7e 2097 \retval -2: USB device unavailable
1189b11a
TJ
2098*/
2099int ftdi_set_error_char(struct ftdi_context *ftdi,
22d12cda 2100 unsigned char errorch, unsigned char enable)
1189b11a
TJ
2101{
2102 unsigned short usb_val;
2103
8970ed7e
TJ
2104 if (ftdi == NULL || ftdi->usb_dev == NULL)
2105 ftdi_error_return(-2, "USB device unavailable");
2106
1189b11a
TJ
2107 usb_val = errorch;
2108 if (enable)
2109 usb_val |= 1 << 8;
2110
a5e1bd8c 2111 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_ERROR_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1189b11a
TJ
2112 ftdi_error_return(-1, "setting error character failed");
2113
2114 return 0;
2115}
2116
2117/**
c201f80f
TJ
2118 Set the eeprom size
2119
2120 \param ftdi pointer to ftdi_context
2121 \param eeprom Pointer to ftdi_eeprom
2122 \param size
2123
2124*/
2125void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size)
2126{
8970ed7e
TJ
2127 if (ftdi == NULL)
2128 return;
2129
22d12cda
TJ
2130 ftdi->eeprom_size=size;
2131 eeprom->size=size;
c201f80f
TJ
2132}
2133
2134/**
1941414d 2135 Init eeprom with default values.
a3da1d95 2136
1941414d
TJ
2137 \param eeprom Pointer to ftdi_eeprom
2138*/
a8f46ddc
TJ
2139void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
2140{
2ff8b87c
HK
2141 int i;
2142
8970ed7e
TJ
2143 if (eeprom == NULL)
2144 return;
2145
f396dbad
TJ
2146 eeprom->vendor_id = 0x0403;
2147 eeprom->product_id = 0x6001;
d9f0cce7 2148
b8aa7b35
TJ
2149 eeprom->self_powered = 1;
2150 eeprom->remote_wakeup = 1;
2ff8b87c 2151 eeprom->chip_type = TYPE_BM;
d9f0cce7 2152
b8aa7b35
TJ
2153 eeprom->in_is_isochronous = 0;
2154 eeprom->out_is_isochronous = 0;
2155 eeprom->suspend_pull_downs = 0;
d9f0cce7 2156
b8aa7b35
TJ
2157 eeprom->use_serial = 0;
2158 eeprom->change_usb_version = 0;
f396dbad 2159 eeprom->usb_version = 0x0200;
b8aa7b35 2160 eeprom->max_power = 0;
d9f0cce7 2161
b8aa7b35
TJ
2162 eeprom->manufacturer = NULL;
2163 eeprom->product = NULL;
2164 eeprom->serial = NULL;
2ff8b87c
HK
2165 for (i=0; i < 5; i++)
2166 {
2167 eeprom->cbus_function[i] = 0;
2168 }
2169 eeprom->high_current = 0;
2170 eeprom->invert = 0;
c201f80f
TJ
2171
2172 eeprom->size = FTDI_DEFAULT_EEPROM_SIZE;
b8aa7b35
TJ
2173}
2174
1941414d 2175/**
4aee4ad2
WH
2176 Frees allocated memory in eeprom.
2177
2178 \param eeprom Pointer to ftdi_eeprom
2179*/
2180void ftdi_eeprom_free(struct ftdi_eeprom *eeprom)
2181{
c2909fee
TJ
2182 if (!eeprom)
2183 return;
2184
4aee4ad2
WH
2185 if (eeprom->manufacturer != 0) {
2186 free(eeprom->manufacturer);
2187 eeprom->manufacturer = 0;
2188 }
2189 if (eeprom->product != 0) {
2190 free(eeprom->product);
2191 eeprom->product = 0;
2192 }
2193 if (eeprom->serial != 0) {
2194 free(eeprom->serial);
2195 eeprom->serial = 0;
2196 }
2197}
2198
2199/**
8970ed7e
TJ
2200 Build binary output from ftdi_eeprom structure.
2201 Output is suitable for ftdi_write_eeprom().
b8aa7b35 2202
2ff8b87c 2203 \note This function doesn't handle FT2232x devices. Only FT232x.
8970ed7e
TJ
2204 \param eeprom Pointer to ftdi_eeprom
2205 \param output Buffer of 128 bytes to store eeprom image to
1941414d 2206
2ff8b87c 2207 \retval >0: free eeprom size
8970ed7e
TJ
2208 \retval -1: eeprom size (128 bytes) exceeded by custom strings
2209 \retval -2: Invalid eeprom pointer
2ff8b87c
HK
2210 \retval -3: Invalid cbus function setting
2211 \retval -4: Chip doesn't support invert
2212 \retval -5: Chip doesn't support high current drive
b8aa7b35 2213*/
a8f46ddc
TJ
2214int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
2215{
b8aa7b35
TJ
2216 unsigned char i, j;
2217 unsigned short checksum, value;
2218 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2219 int size_check;
2ff8b87c 2220 const int cbus_max[5] = {13, 13, 13, 13, 9};
b8aa7b35 2221
8970ed7e
TJ
2222 if (eeprom == NULL)
2223 return -2;
2224
b8aa7b35 2225 if (eeprom->manufacturer != NULL)
d9f0cce7 2226 manufacturer_size = strlen(eeprom->manufacturer);
b8aa7b35 2227 if (eeprom->product != NULL)
d9f0cce7 2228 product_size = strlen(eeprom->product);
b8aa7b35 2229 if (eeprom->serial != NULL)
d9f0cce7 2230 serial_size = strlen(eeprom->serial);
b8aa7b35 2231
2ff8b87c
HK
2232 // highest allowed cbus value
2233 for (i = 0; i < 5; i++)
2234 {
2235 if ((eeprom->cbus_function[i] > cbus_max[i]) ||
2236 (eeprom->cbus_function[i] && eeprom->chip_type != TYPE_R)) return -3;
2237 }
2238 if (eeprom->chip_type != TYPE_R)
2239 {
2240 if (eeprom->invert) return -4;
2241 if (eeprom->high_current) return -5;
2242 }
2243
c201f80f 2244 size_check = eeprom->size;
d9f0cce7 2245 size_check -= 28; // 28 are always in use (fixed)
c201f80f 2246
22d12cda 2247 // Top half of a 256byte eeprom is used just for strings and checksum
c201f80f
TJ
2248 // it seems that the FTDI chip will not read these strings from the lower half
2249 // Each string starts with two bytes; offset and type (0x03 for string)
2250 // the checksum needs two bytes, so without the string data that 8 bytes from the top half
2ff8b87c 2251 if (eeprom->size>=256) size_check = 120;
b8aa7b35
TJ
2252 size_check -= manufacturer_size*2;
2253 size_check -= product_size*2;
2254 size_check -= serial_size*2;
2255
2256 // eeprom size exceeded?
2257 if (size_check < 0)
d9f0cce7 2258 return (-1);
b8aa7b35
TJ
2259
2260 // empty eeprom
c201f80f 2261 memset (output, 0, eeprom->size);
b8aa7b35 2262
2ff8b87c
HK
2263 // Addr 00: High current IO
2264 output[0x00] = eeprom->high_current ? HIGH_CURRENT_DRIVE : 0;
2265 // Addr 01: IN endpoint size (for R type devices, different for FT2232)
2266 if (eeprom->chip_type == TYPE_R) {
2267 output[0x01] = 0x40;
2268 }
b8aa7b35
TJ
2269 // Addr 02: Vendor ID
2270 output[0x02] = eeprom->vendor_id;
2271 output[0x03] = eeprom->vendor_id >> 8;
2272
2273 // Addr 04: Product ID
2274 output[0x04] = eeprom->product_id;
2275 output[0x05] = eeprom->product_id >> 8;
2276
2277 // Addr 06: Device release number (0400h for BM features)
2278 output[0x06] = 0x00;
2ff8b87c
HK
2279 switch (eeprom->chip_type) {
2280 case TYPE_AM:
2281 output[0x07] = 0x02;
2282 break;
2283 case TYPE_BM:
2284 output[0x07] = 0x04;
2285 break;
2286 case TYPE_2232C:
2287 output[0x07] = 0x05;
2288 break;
2289 case TYPE_R:
2290 output[0x07] = 0x06;
2291 break;
2292 default:
2293 output[0x07] = 0x00;
2294 }
b8aa7b35
TJ
2295
2296 // Addr 08: Config descriptor
8fae3e8e
TJ
2297 // Bit 7: always 1
2298 // Bit 6: 1 if this device is self powered, 0 if bus powered
2299 // Bit 5: 1 if this device uses remote wakeup
2300 // Bit 4: 1 if this device is battery powered
5a1dcd55 2301 j = 0x80;
b8aa7b35 2302 if (eeprom->self_powered == 1)
5a1dcd55 2303 j |= 0x40;
b8aa7b35 2304 if (eeprom->remote_wakeup == 1)
5a1dcd55 2305 j |= 0x20;
b8aa7b35
TJ
2306 output[0x08] = j;
2307
2308 // Addr 09: Max power consumption: max power = value * 2 mA
d9f0cce7 2309 output[0x09] = eeprom->max_power;
d9f0cce7 2310
b8aa7b35
TJ
2311 // Addr 0A: Chip configuration
2312 // Bit 7: 0 - reserved
2313 // Bit 6: 0 - reserved
2314 // Bit 5: 0 - reserved
2315 // Bit 4: 1 - Change USB version
2316 // Bit 3: 1 - Use the serial number string
2317 // Bit 2: 1 - Enable suspend pull downs for lower power
2318 // Bit 1: 1 - Out EndPoint is Isochronous
2319 // Bit 0: 1 - In EndPoint is Isochronous
2320 //
2321 j = 0;
2322 if (eeprom->in_is_isochronous == 1)
d9f0cce7 2323 j = j | 1;
b8aa7b35 2324 if (eeprom->out_is_isochronous == 1)
d9f0cce7 2325 j = j | 2;
b8aa7b35 2326 if (eeprom->suspend_pull_downs == 1)
d9f0cce7 2327 j = j | 4;
b8aa7b35 2328 if (eeprom->use_serial == 1)
d9f0cce7 2329 j = j | 8;
b8aa7b35 2330 if (eeprom->change_usb_version == 1)
d9f0cce7 2331 j = j | 16;
b8aa7b35 2332 output[0x0A] = j;
d9f0cce7 2333
2ff8b87c
HK
2334 // Addr 0B: Invert data lines
2335 output[0x0B] = eeprom->invert & 0xff;
d9f0cce7 2336
b8aa7b35
TJ
2337 // Addr 0C: USB version low byte when 0x0A bit 4 is set
2338 // Addr 0D: USB version high byte when 0x0A bit 4 is set
22d12cda
TJ
2339 if (eeprom->change_usb_version == 1)
2340 {
b8aa7b35 2341 output[0x0C] = eeprom->usb_version;
d9f0cce7 2342 output[0x0D] = eeprom->usb_version >> 8;
b8aa7b35
TJ
2343 }
2344
2345
c201f80f 2346 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
b8aa7b35
TJ
2347 // Addr 0F: Length of manufacturer string
2348 output[0x0F] = manufacturer_size*2 + 2;
2349
2350 // Addr 10: Offset of the product string + 0x80, calculated later
2351 // Addr 11: Length of product string
2352 output[0x11] = product_size*2 + 2;
2353
2354 // Addr 12: Offset of the serial string + 0x80, calculated later
2355 // Addr 13: Length of serial string
2356 output[0x13] = serial_size*2 + 2;
2357
2ff8b87c
HK
2358 // Addr 14: CBUS function: CBUS0, CBUS1
2359 // Addr 15: CBUS function: CBUS2, CBUS3
2360 // Addr 16: CBUS function: CBUS5
2361 output[0x14] = eeprom->cbus_function[0] | (eeprom->cbus_function[1] << 4);
2362 output[0x15] = eeprom->cbus_function[2] | (eeprom->cbus_function[3] << 4);
2363 output[0x16] = eeprom->cbus_function[4];
2364 // Addr 17: Unknown
2365
b8aa7b35 2366 // Dynamic content
2ff8b87c
HK
2367 // In images produced by FTDI's FT_Prog for FT232R strings start at 0x18
2368 // Space till 0x18 should be considered as reserved.
2369 if (eeprom->chip_type >= TYPE_R) {
2370 i = 0x18;
2371 } else {
2372 i = 0x14;
2373 }
2374 if (eeprom->size >= 256) i = 0x80;
f01d7ca6 2375
c201f80f 2376
22d12cda 2377 // Output manufacturer
c201f80f
TJ
2378 output[0x0E] = i | 0x80; // calculate offset
2379 output[i++] = manufacturer_size*2 + 2;
2380 output[i++] = 0x03; // type: string
22d12cda
TJ
2381 for (j = 0; j < manufacturer_size; j++)
2382 {
d9f0cce7
TJ
2383 output[i] = eeprom->manufacturer[j], i++;
2384 output[i] = 0x00, i++;
b8aa7b35
TJ
2385 }
2386
2387 // Output product name
c201f80f 2388 output[0x10] = i | 0x80; // calculate offset
b8aa7b35
TJ
2389 output[i] = product_size*2 + 2, i++;
2390 output[i] = 0x03, i++;
22d12cda
TJ
2391 for (j = 0; j < product_size; j++)
2392 {
d9f0cce7
TJ
2393 output[i] = eeprom->product[j], i++;
2394 output[i] = 0x00, i++;
b8aa7b35 2395 }
d9f0cce7 2396
b8aa7b35 2397 // Output serial
c201f80f 2398 output[0x12] = i | 0x80; // calculate offset
b8aa7b35
TJ
2399 output[i] = serial_size*2 + 2, i++;
2400 output[i] = 0x03, i++;
22d12cda
TJ
2401 for (j = 0; j < serial_size; j++)
2402 {
d9f0cce7
TJ
2403 output[i] = eeprom->serial[j], i++;
2404 output[i] = 0x00, i++;
b8aa7b35
TJ
2405 }
2406
2407 // calculate checksum
2408 checksum = 0xAAAA;
d9f0cce7 2409
22d12cda
TJ
2410 for (i = 0; i < eeprom->size/2-1; i++)
2411 {
d9f0cce7
TJ
2412 value = output[i*2];
2413 value += output[(i*2)+1] << 8;
b8aa7b35 2414
d9f0cce7
TJ
2415 checksum = value^checksum;
2416 checksum = (checksum << 1) | (checksum >> 15);
b8aa7b35
TJ
2417 }
2418
c201f80f
TJ
2419 output[eeprom->size-2] = checksum;
2420 output[eeprom->size-1] = checksum >> 8;
b8aa7b35 2421
8ed61121 2422 return size_check;
b8aa7b35
TJ
2423}
2424
4af1d1bb
MK
2425/**
2426 Decode binary EEPROM image into an ftdi_eeprom structure.
2427
2428 \param eeprom Pointer to ftdi_eeprom which will be filled in.
1bbaf1ce 2429 \param buf Buffer of \a size bytes of raw eeprom data
4af1d1bb
MK
2430 \param size size size of eeprom data in bytes
2431
2432 \retval 0: all fine
2433 \retval -1: something went wrong
2434
2435 FIXME: How to pass size? How to handle size field in ftdi_eeprom?
2436 FIXME: Strings are malloc'ed here and should be freed somewhere
2437*/
49c5ac72 2438int ftdi_eeprom_decode(struct ftdi_eeprom *eeprom, unsigned char *buf, int size)
b56d5a64
MK
2439{
2440 unsigned char i, j;
2441 unsigned short checksum, eeprom_checksum, value;
2442 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
2443 int size_check;
2444 int eeprom_size = 128;
8970ed7e
TJ
2445
2446 if (eeprom == NULL)
2447 return -1;
b56d5a64
MK
2448#if 0
2449 size_check = eeprom->size;
2450 size_check -= 28; // 28 are always in use (fixed)
2451
22d12cda 2452 // Top half of a 256byte eeprom is used just for strings and checksum
b56d5a64
MK
2453 // it seems that the FTDI chip will not read these strings from the lower half
2454 // Each string starts with two bytes; offset and type (0x03 for string)
2455 // the checksum needs two bytes, so without the string data that 8 bytes from the top half
22d12cda 2456 if (eeprom->size>=256)size_check = 120;
b56d5a64
MK
2457 size_check -= manufacturer_size*2;
2458 size_check -= product_size*2;
2459 size_check -= serial_size*2;
2460
2461 // eeprom size exceeded?
2462 if (size_check < 0)
2463 return (-1);
2464#endif
2465
2466 // empty eeprom struct
4af1d1bb 2467 memset(eeprom, 0, sizeof(struct ftdi_eeprom));
b56d5a64 2468
2ff8b87c
HK
2469 // Addr 00: High current IO
2470 eeprom->high_current = (buf[0x02] & HIGH_CURRENT_DRIVE);
b56d5a64
MK
2471
2472 // Addr 02: Vendor ID
2473 eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8);
2474
2475 // Addr 04: Product ID
2476 eeprom->product_id = buf[0x04] + (buf[0x05] << 8);
22d12cda 2477
6335545d
TJ
2478 value = buf[0x06] + (buf[0x07]<<8);
2479 switch (value)
22d12cda 2480 {
2ff8b87c
HK
2481 case 0x0600:
2482 eeprom->chip_type = TYPE_R;
2483 break;
22d12cda 2484 case 0x0400:
2ff8b87c 2485 eeprom->chip_type = TYPE_BM;
22d12cda
TJ
2486 break;
2487 case 0x0200:
2ff8b87c 2488 eeprom->chip_type = TYPE_AM;
22d12cda
TJ
2489 break;
2490 default: // Unknown device
2ff8b87c 2491 eeprom->chip_type = 0;
22d12cda 2492 break;
4af1d1bb 2493 }
b56d5a64
MK
2494
2495 // Addr 08: Config descriptor
2496 // Bit 7: always 1
2497 // Bit 6: 1 if this device is self powered, 0 if bus powered
2498 // Bit 5: 1 if this device uses remote wakeup
2499 // Bit 4: 1 if this device is battery powered
2500 j = buf[0x08];
b56d5a64
MK
2501 if (j&0x40) eeprom->self_powered = 1;
2502 if (j&0x20) eeprom->remote_wakeup = 1;
2503
2504 // Addr 09: Max power consumption: max power = value * 2 mA
2505 eeprom->max_power = buf[0x09];
2506
2507 // Addr 0A: Chip configuration
2508 // Bit 7: 0 - reserved
2509 // Bit 6: 0 - reserved
2510 // Bit 5: 0 - reserved
2511 // Bit 4: 1 - Change USB version
2512 // Bit 3: 1 - Use the serial number string
2513 // Bit 2: 1 - Enable suspend pull downs for lower power
2514 // Bit 1: 1 - Out EndPoint is Isochronous
2515 // Bit 0: 1 - In EndPoint is Isochronous
2516 //
2517 j = buf[0x0A];
4af1d1bb
MK
2518 if (j&0x01) eeprom->in_is_isochronous = 1;
2519 if (j&0x02) eeprom->out_is_isochronous = 1;
2520 if (j&0x04) eeprom->suspend_pull_downs = 1;
2521 if (j&0x08) eeprom->use_serial = 1;
2522 if (j&0x10) eeprom->change_usb_version = 1;
b56d5a64 2523
2ff8b87c
HK
2524 // Addr 0B: Invert data lines
2525 eeprom->invert = buf[0x0B];
b56d5a64
MK
2526
2527 // Addr 0C: USB version low byte when 0x0A bit 4 is set
2528 // Addr 0D: USB version high byte when 0x0A bit 4 is set
22d12cda
TJ
2529 if (eeprom->change_usb_version == 1)
2530 {
2531 eeprom->usb_version = buf[0x0C] + (buf[0x0D] << 8);
b56d5a64
MK
2532 }
2533
2534 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2535 // Addr 0F: Length of manufacturer string
2536 manufacturer_size = buf[0x0F]/2;
2537 if (manufacturer_size > 0) eeprom->manufacturer = malloc(manufacturer_size);
2538 else eeprom->manufacturer = NULL;
2539
2540 // Addr 10: Offset of the product string + 0x80, calculated later
2541 // Addr 11: Length of product string
2542 product_size = buf[0x11]/2;
2543 if (product_size > 0) eeprom->product = malloc(product_size);
2544 else eeprom->product = NULL;
2545
2546 // Addr 12: Offset of the serial string + 0x80, calculated later
2547 // Addr 13: Length of serial string
2548 serial_size = buf[0x13]/2;
2549 if (serial_size > 0) eeprom->serial = malloc(serial_size);
2550 else eeprom->serial = NULL;
2551
2ff8b87c
HK
2552 // Addr 14: CBUS function: CBUS0, CBUS1
2553 // Addr 15: CBUS function: CBUS2, CBUS3
2554 // Addr 16: CBUS function: CBUS5
2555 if (eeprom->chip_type == TYPE_R) {
2556 eeprom->cbus_function[0] = buf[0x14] & 0x0f;
2557 eeprom->cbus_function[1] = (buf[0x14] >> 4) & 0x0f;
2558 eeprom->cbus_function[2] = buf[0x15] & 0x0f;
2559 eeprom->cbus_function[3] = (buf[0x15] >> 4) & 0x0f;
2560 eeprom->cbus_function[4] = buf[0x16] & 0x0f;
2561 } else {
2562 for (j=0; j<5; j++) eeprom->cbus_function[j] = 0;
2563 }
2564
22d12cda 2565 // Decode manufacturer
b56d5a64 2566 i = buf[0x0E] & 0x7f; // offset
22d12cda
TJ
2567 for (j=0;j<manufacturer_size-1;j++)
2568 {
2569 eeprom->manufacturer[j] = buf[2*j+i+2];
b56d5a64
MK
2570 }
2571 eeprom->manufacturer[j] = '\0';
2572
2573 // Decode product name
2574 i = buf[0x10] & 0x7f; // offset
22d12cda
TJ
2575 for (j=0;j<product_size-1;j++)
2576 {
2577 eeprom->product[j] = buf[2*j+i+2];
b56d5a64
MK
2578 }
2579 eeprom->product[j] = '\0';
2580
2581 // Decode serial
2582 i = buf[0x12] & 0x7f; // offset
22d12cda
TJ
2583 for (j=0;j<serial_size-1;j++)
2584 {
2585 eeprom->serial[j] = buf[2*j+i+2];
b56d5a64
MK
2586 }
2587 eeprom->serial[j] = '\0';
2588
2589 // verify checksum
2590 checksum = 0xAAAA;
2591
22d12cda
TJ
2592 for (i = 0; i < eeprom_size/2-1; i++)
2593 {
b56d5a64
MK
2594 value = buf[i*2];
2595 value += buf[(i*2)+1] << 8;
2596
2597 checksum = value^checksum;
2598 checksum = (checksum << 1) | (checksum >> 15);
2599 }
2600
2601 eeprom_checksum = buf[eeprom_size-2] + (buf[eeprom_size-1] << 8);
2602
22d12cda
TJ
2603 if (eeprom_checksum != checksum)
2604 {
2605 fprintf(stderr, "Checksum Error: %04x %04x\n", checksum, eeprom_checksum);
2606 return -1;
4af1d1bb
MK
2607 }
2608
2609 return 0;
b56d5a64
MK
2610}
2611
1941414d 2612/**
c1c70e13
OS
2613 Read eeprom location
2614
2615 \param ftdi pointer to ftdi_context
2616 \param eeprom_addr Address of eeprom location to be read
2617 \param eeprom_val Pointer to store read eeprom location
2618
2619 \retval 0: all fine
2620 \retval -1: read failed
8970ed7e 2621 \retval -2: USB device unavailable
c1c70e13
OS
2622*/
2623int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val)
2624{
8970ed7e
TJ
2625 if (ftdi == NULL || ftdi->usb_dev == NULL)
2626 ftdi_error_return(-2, "USB device unavailable");
2627
c1c70e13
OS
2628 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, eeprom_addr, (char *)eeprom_val, 2, ftdi->usb_read_timeout) != 2)
2629 ftdi_error_return(-1, "reading eeprom failed");
2630
2631 return 0;
2632}
2633
2634/**
1941414d
TJ
2635 Read eeprom
2636
2637 \param ftdi pointer to ftdi_context
2638 \param eeprom Pointer to store eeprom into
b8aa7b35 2639
1941414d
TJ
2640 \retval 0: all fine
2641 \retval -1: read failed
8970ed7e 2642 \retval -2: USB device unavailable
1941414d 2643*/
a8f46ddc
TJ
2644int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2645{
a3da1d95
GE
2646 int i;
2647
8970ed7e
TJ
2648 if (ftdi == NULL || ftdi->usb_dev == NULL)
2649 ftdi_error_return(-2, "USB device unavailable");
2650
22d12cda
TJ
2651 for (i = 0; i < ftdi->eeprom_size/2; i++)
2652 {
a5e1bd8c 2653 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
c3d95b87 2654 ftdi_error_return(-1, "reading eeprom failed");
a3da1d95
GE
2655 }
2656
2657 return 0;
2658}
2659
cb6250fa
TJ
2660/*
2661 ftdi_read_chipid_shift does the bitshift operation needed for the FTDIChip-ID
2662 Function is only used internally
2663 \internal
2664*/
2665static unsigned char ftdi_read_chipid_shift(unsigned char value)
2666{
2667 return ((value & 1) << 1) |
22d12cda
TJ
2668 ((value & 2) << 5) |
2669 ((value & 4) >> 2) |
2670 ((value & 8) << 4) |
2671 ((value & 16) >> 1) |
2672 ((value & 32) >> 1) |
2673 ((value & 64) >> 4) |
2674 ((value & 128) >> 2);
cb6250fa
TJ
2675}
2676
2677/**
2678 Read the FTDIChip-ID from R-type devices
2679
2680 \param ftdi pointer to ftdi_context
2681 \param chipid Pointer to store FTDIChip-ID
2682
2683 \retval 0: all fine
2684 \retval -1: read failed
8970ed7e 2685 \retval -2: USB device unavailable
cb6250fa
TJ
2686*/
2687int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid)
2688{
c7eb3112 2689 unsigned int a = 0, b = 0;
cb6250fa 2690
8970ed7e
TJ
2691 if (ftdi == NULL || ftdi->usb_dev == NULL)
2692 ftdi_error_return(-2, "USB device unavailable");
2693
a5e1bd8c 2694 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x43, (char *)&a, 2, ftdi->usb_read_timeout) == 2)
cb6250fa
TJ
2695 {
2696 a = a << 8 | a >> 8;
a5e1bd8c 2697 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x44, (char *)&b, 2, ftdi->usb_read_timeout) == 2)
cb6250fa
TJ
2698 {
2699 b = b << 8 | b >> 8;
5230676f 2700 a = (a << 16) | (b & 0xFFFF);
912d50ca
TJ
2701 a = ftdi_read_chipid_shift(a) | ftdi_read_chipid_shift(a>>8)<<8
2702 | ftdi_read_chipid_shift(a>>16)<<16 | ftdi_read_chipid_shift(a>>24)<<24;
cb6250fa 2703 *chipid = a ^ 0xa5f0f7d1;
c7eb3112 2704 return 0;
cb6250fa
TJ
2705 }
2706 }
2707
c7eb3112 2708 ftdi_error_return(-1, "read of FTDIChip-ID failed");
cb6250fa
TJ
2709}
2710
1941414d 2711/**
8970ed7e
TJ
2712 Guesses size of eeprom by reading eeprom and comparing halves - will not work with blank eeprom
2713 Call this function then do a write then call again to see if size changes, if so write again.
c201f80f 2714
8970ed7e
TJ
2715 \param ftdi pointer to ftdi_context
2716 \param eeprom Pointer to store eeprom into
2717 \param maxsize the size of the buffer to read into
c201f80f 2718
8970ed7e
TJ
2719 \retval -1: eeprom read failed
2720 \retval -2: USB device unavailable
2721 \retval >=0: size of eeprom
c201f80f
TJ
2722*/
2723int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize)
2724{
2725 int i=0,j,minsize=32;
2726 int size=minsize;
2727
8970ed7e
TJ
2728 if (ftdi == NULL || ftdi->usb_dev == NULL)
2729 ftdi_error_return(-2, "USB device unavailable");
2730
22d12cda
TJ
2731 do
2732 {
2733 for (j = 0; i < maxsize/2 && j<size; j++)
2734 {
2735 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE,
2736 SIO_READ_EEPROM_REQUEST, 0, i,
2737 eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
8970ed7e 2738 ftdi_error_return(-1, "eeprom read failed");
22d12cda
TJ
2739 i++;
2740 }
2741 size*=2;
2742 }
2743 while (size<=maxsize && memcmp(eeprom,&eeprom[size/2],size/2)!=0);
c201f80f
TJ
2744
2745 return size/2;
2746}
2747
2748/**
c1c70e13
OS
2749 Write eeprom location
2750
2751 \param ftdi pointer to ftdi_context
2752 \param eeprom_addr Address of eeprom location to be written
2753 \param eeprom_val Value to be written
2754
2755 \retval 0: all fine
2756 \retval -1: read failed
8970ed7e 2757 \retval -2: USB device unavailable
c1c70e13
OS
2758*/
2759int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr, unsigned short eeprom_val)
2760{
8970ed7e
TJ
2761 if (ftdi == NULL || ftdi->usb_dev == NULL)
2762 ftdi_error_return(-2, "USB device unavailable");
2763
c1c70e13
OS
2764 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2765 SIO_WRITE_EEPROM_REQUEST, eeprom_val, eeprom_addr,
2766 NULL, 0, ftdi->usb_write_timeout) != 0)
2767 ftdi_error_return(-1, "unable to write eeprom");
2768
2769 return 0;
2770}
2771
2772/**
1941414d 2773 Write eeprom
a3da1d95 2774
1941414d
TJ
2775 \param ftdi pointer to ftdi_context
2776 \param eeprom Pointer to read eeprom from
2777
2778 \retval 0: all fine
2779 \retval -1: read failed
8970ed7e 2780 \retval -2: USB device unavailable
1941414d 2781*/
a8f46ddc
TJ
2782int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
2783{
ba5329be 2784 unsigned short usb_val, status;
e30da501 2785 int i, ret;
a3da1d95 2786
8970ed7e
TJ
2787 if (ftdi == NULL || ftdi->usb_dev == NULL)
2788 ftdi_error_return(-2, "USB device unavailable");
2789
ba5329be 2790 /* These commands were traced while running MProg */
e30da501
TJ
2791 if ((ret = ftdi_usb_reset(ftdi)) != 0)
2792 return ret;
2793 if ((ret = ftdi_poll_modem_status(ftdi, &status)) != 0)
2794 return ret;
2795 if ((ret = ftdi_set_latency_timer(ftdi, 0x77)) != 0)
2796 return ret;
ba5329be 2797
22d12cda
TJ
2798 for (i = 0; i < ftdi->eeprom_size/2; i++)
2799 {
d9f0cce7
TJ
2800 usb_val = eeprom[i*2];
2801 usb_val += eeprom[(i*2)+1] << 8;
a5e1bd8c 2802 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
22d12cda 2803 SIO_WRITE_EEPROM_REQUEST, usb_val, i,
a5e1bd8c 2804 NULL, 0, ftdi->usb_write_timeout) != 0)
c3d95b87 2805 ftdi_error_return(-1, "unable to write eeprom");
a3da1d95
GE
2806 }
2807
2808 return 0;
2809}
2810
1941414d
TJ
2811/**
2812 Erase eeprom
a3da1d95 2813
a5e1bd8c
MK
2814 This is not supported on FT232R/FT245R according to the MProg manual from FTDI.
2815
1941414d
TJ
2816 \param ftdi pointer to ftdi_context
2817
2818 \retval 0: all fine
2819 \retval -1: erase failed
8970ed7e 2820 \retval -2: USB device unavailable
1941414d 2821*/
a8f46ddc
TJ
2822int ftdi_erase_eeprom(struct ftdi_context *ftdi)
2823{
8970ed7e
TJ
2824 if (ftdi == NULL || ftdi->usb_dev == NULL)
2825 ftdi_error_return(-2, "USB device unavailable");
2826
a5e1bd8c 2827 if (usb_control_msg(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_ERASE_EEPROM_REQUEST, 0, 0, NULL, 0, ftdi->usb_write_timeout) != 0)
c3d95b87 2828 ftdi_error_return(-1, "unable to erase eeprom");
a3da1d95
GE
2829
2830 return 0;
2831}
c3d95b87 2832
1941414d
TJ
2833/**
2834 Get string representation for last error code
c3d95b87 2835
1941414d
TJ
2836 \param ftdi pointer to ftdi_context
2837
2838 \retval Pointer to error string
2839*/
c3d95b87
TJ
2840char *ftdi_get_error_string (struct ftdi_context *ftdi)
2841{
8970ed7e
TJ
2842 if (ftdi == NULL)
2843 return "";
2844
c3d95b87
TJ
2845 return ftdi->error_str;
2846}
a01d31e2 2847
b5ec1820 2848/* @} end of doxygen libftdi group */