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