Add (optional) unit test infrastructure
[libftdi] / src / ftdi.c
CommitLineData
a3da1d95
GE
1/***************************************************************************
2 ftdi.c - description
3 -------------------
4 begin : Fri Apr 4 2003
8a987aa2 5 copyright : (C) 2003-2011 by Intra2net AG and the libftdi developers
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
579b006f 31#include <libusb.h>
a8f46ddc 32#include <string.h>
d2f10023 33#include <errno.h>
b56d5a64 34#include <stdio.h>
579b006f 35#include <stdlib.h>
0e302db6 36
98452d97 37#include "ftdi.h"
a3da1d95 38
21abaf2e 39#define ftdi_error_return(code, str) do { \
2f73e59f 40 ftdi->error_str = str; \
21abaf2e 41 return code; \
d2f10023 42 } while(0);
c3d95b87 43
99650502
UB
44#define ftdi_error_return_free_device_list(code, str, devs) do { \
45 libusb_free_device_list(devs,1); \
46 ftdi->error_str = str; \
47 return code; \
48 } while(0);
49
418aaa72 50
f3f81007
TJ
51/**
52 Internal function to close usb device pointer.
53 Sets ftdi->usb_dev to NULL.
54 \internal
55
56 \param ftdi pointer to ftdi_context
57
579b006f 58 \retval none
f3f81007 59*/
579b006f 60static void ftdi_usb_close_internal (struct ftdi_context *ftdi)
dff4fdb0 61{
22a1b5c1 62 if (ftdi && ftdi->usb_dev)
dff4fdb0 63 {
56ac0383
TJ
64 libusb_close (ftdi->usb_dev);
65 ftdi->usb_dev = NULL;
44f41f11
UB
66 if(ftdi->eeprom)
67 ftdi->eeprom->initialized_for_connected_device = 0;
dff4fdb0 68 }
dff4fdb0 69}
c3d95b87 70
1941414d
TJ
71/**
72 Initializes a ftdi_context.
4837f98a 73
1941414d 74 \param ftdi pointer to ftdi_context
4837f98a 75
1941414d
TJ
76 \retval 0: all fine
77 \retval -1: couldn't allocate read buffer
a35aa9bd 78 \retval -2: couldn't allocate struct buffer
3a284749 79 \retval -3: libusb_init() failed
1941414d
TJ
80
81 \remark This should be called before all functions
948f9ada 82*/
a8f46ddc
TJ
83int ftdi_init(struct ftdi_context *ftdi)
84{
a35aa9bd 85 struct ftdi_eeprom* eeprom = (struct ftdi_eeprom *)malloc(sizeof(struct ftdi_eeprom));
02212d8e 86 ftdi->usb_ctx = NULL;
98452d97 87 ftdi->usb_dev = NULL;
545820ce
TJ
88 ftdi->usb_read_timeout = 5000;
89 ftdi->usb_write_timeout = 5000;
a3da1d95 90
53ad271d 91 ftdi->type = TYPE_BM; /* chip type */
a3da1d95 92 ftdi->baudrate = -1;
418aaa72 93 ftdi->bitbang_enabled = 0; /* 0: normal mode 1: any of the bitbang modes enabled */
a3da1d95 94
948f9ada
TJ
95 ftdi->readbuffer = NULL;
96 ftdi->readbuffer_offset = 0;
97 ftdi->readbuffer_remaining = 0;
98 ftdi->writebuffer_chunksize = 4096;
e2f12a4f 99 ftdi->max_packet_size = 0;
3a284749
TJ
100 ftdi->error_str = NULL;
101 ftdi->module_detach_mode = AUTO_DETACH_SIO_MODULE;
102
103 if (libusb_init(&ftdi->usb_ctx) < 0)
104 ftdi_error_return(-3, "libusb_init() failed");
948f9ada 105
ac0af8ec 106 ftdi_set_interface(ftdi, INTERFACE_ANY);
418aaa72 107 ftdi->bitbang_mode = 1; /* when bitbang is enabled this holds the number of the mode */
53ad271d 108
a35aa9bd
UB
109 if (eeprom == 0)
110 ftdi_error_return(-2, "Can't malloc struct ftdi_eeprom");
b4d19dea 111 memset(eeprom, 0, sizeof(struct ftdi_eeprom));
a35aa9bd 112 ftdi->eeprom = eeprom;
c201f80f 113
1c733d33
TJ
114 /* All fine. Now allocate the readbuffer */
115 return ftdi_read_data_set_chunksize(ftdi, 4096);
948f9ada 116}
4837f98a 117
1941414d 118/**
cef378aa
TJ
119 Allocate and initialize a new ftdi_context
120
121 \return a pointer to a new ftdi_context, or NULL on failure
122*/
672ac008 123struct ftdi_context *ftdi_new(void)
cef378aa
TJ
124{
125 struct ftdi_context * ftdi = (struct ftdi_context *)malloc(sizeof(struct ftdi_context));
126
22d12cda
TJ
127 if (ftdi == NULL)
128 {
cef378aa
TJ
129 return NULL;
130 }
131
22d12cda
TJ
132 if (ftdi_init(ftdi) != 0)
133 {
cef378aa 134 free(ftdi);
cdf448f6 135 return NULL;
cef378aa
TJ
136 }
137
138 return ftdi;
139}
140
141/**
1941414d
TJ
142 Open selected channels on a chip, otherwise use first channel.
143
144 \param ftdi pointer to ftdi_context
f9d69895 145 \param interface Interface to use for FT2232C/2232H/4232H chips.
1941414d
TJ
146
147 \retval 0: all fine
148 \retval -1: unknown interface
22a1b5c1 149 \retval -2: USB device unavailable
c4446c36 150*/
0ce2f5fa 151int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)
c4446c36 152{
1971c26d 153 if (ftdi == NULL)
22a1b5c1
TJ
154 ftdi_error_return(-2, "USB device unavailable");
155
22d12cda
TJ
156 switch (interface)
157 {
158 case INTERFACE_ANY:
159 case INTERFACE_A:
ac0af8ec
VY
160 ftdi->interface = 0;
161 ftdi->index = INTERFACE_A;
162 ftdi->in_ep = 0x02;
163 ftdi->out_ep = 0x81;
22d12cda
TJ
164 break;
165 case INTERFACE_B:
166 ftdi->interface = 1;
167 ftdi->index = INTERFACE_B;
168 ftdi->in_ep = 0x04;
169 ftdi->out_ep = 0x83;
170 break;
f9d69895
AH
171 case INTERFACE_C:
172 ftdi->interface = 2;
173 ftdi->index = INTERFACE_C;
174 ftdi->in_ep = 0x06;
175 ftdi->out_ep = 0x85;
176 break;
177 case INTERFACE_D:
178 ftdi->interface = 3;
179 ftdi->index = INTERFACE_D;
180 ftdi->in_ep = 0x08;
181 ftdi->out_ep = 0x87;
182 break;
22d12cda
TJ
183 default:
184 ftdi_error_return(-1, "Unknown interface");
c4446c36
TJ
185 }
186 return 0;
187}
948f9ada 188
1941414d
TJ
189/**
190 Deinitializes a ftdi_context.
4837f98a 191
1941414d 192 \param ftdi pointer to ftdi_context
4837f98a 193*/
a8f46ddc
TJ
194void ftdi_deinit(struct ftdi_context *ftdi)
195{
22a1b5c1
TJ
196 if (ftdi == NULL)
197 return;
198
f3f81007 199 ftdi_usb_close_internal (ftdi);
dff4fdb0 200
22d12cda
TJ
201 if (ftdi->readbuffer != NULL)
202 {
d9f0cce7
TJ
203 free(ftdi->readbuffer);
204 ftdi->readbuffer = NULL;
948f9ada 205 }
a35aa9bd
UB
206
207 if (ftdi->eeprom != NULL)
208 {
74e8e79d
UB
209 if (ftdi->eeprom->manufacturer != 0)
210 {
211 free(ftdi->eeprom->manufacturer);
212 ftdi->eeprom->manufacturer = 0;
213 }
214 if (ftdi->eeprom->product != 0)
215 {
216 free(ftdi->eeprom->product);
217 ftdi->eeprom->product = 0;
218 }
219 if (ftdi->eeprom->serial != 0)
220 {
221 free(ftdi->eeprom->serial);
222 ftdi->eeprom->serial = 0;
223 }
a35aa9bd
UB
224 free(ftdi->eeprom);
225 ftdi->eeprom = NULL;
226 }
3a284749
TJ
227
228 if (ftdi->usb_ctx)
229 {
230 libusb_exit(ftdi->usb_ctx);
231 ftdi->usb_ctx = NULL;
232 }
a3da1d95
GE
233}
234
1941414d 235/**
cef378aa
TJ
236 Deinitialize and free an ftdi_context.
237
238 \param ftdi pointer to ftdi_context
239*/
240void ftdi_free(struct ftdi_context *ftdi)
241{
242 ftdi_deinit(ftdi);
243 free(ftdi);
244}
245
246/**
1941414d
TJ
247 Use an already open libusb device.
248
249 \param ftdi pointer to ftdi_context
579b006f 250 \param usb libusb libusb_device_handle to use
4837f98a 251*/
579b006f 252void ftdi_set_usbdev (struct ftdi_context *ftdi, libusb_device_handle *usb)
a8f46ddc 253{
22a1b5c1
TJ
254 if (ftdi == NULL)
255 return;
256
98452d97
TJ
257 ftdi->usb_dev = usb;
258}
259
260
1941414d 261/**
7879216a
UB
262 Finds all ftdi devices with given VID:PID on the usb bus. Creates a new
263 ftdi_device_list which needs to be deallocated by ftdi_list_free() after
264 use. With VID:PID 0:0, search for the default devices
265 (0x403:0x6001, 0x403:0x6010, 0x403:0x6011, 0x403:0x6014)
1941414d
TJ
266
267 \param ftdi pointer to ftdi_context
268 \param devlist Pointer where to store list of found devices
269 \param vendor Vendor ID to search for
270 \param product Product ID to search for
edb82cbf 271
1941414d 272 \retval >0: number of devices found
1941414d 273 \retval -3: out of memory
579b006f
JZ
274 \retval -5: libusb_get_device_list() failed
275 \retval -6: libusb_get_device_descriptor() failed
edb82cbf 276*/
d2f10023 277int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product)
edb82cbf
TJ
278{
279 struct ftdi_device_list **curdev;
579b006f
JZ
280 libusb_device *dev;
281 libusb_device **devs;
edb82cbf 282 int count = 0;
579b006f
JZ
283 int i = 0;
284
02212d8e 285 if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
579b006f 286 ftdi_error_return(-5, "libusb_get_device_list() failed");
edb82cbf
TJ
287
288 curdev = devlist;
6db32169 289 *curdev = NULL;
579b006f
JZ
290
291 while ((dev = devs[i++]) != NULL)
22d12cda 292 {
579b006f 293 struct libusb_device_descriptor desc;
d2f10023 294
579b006f 295 if (libusb_get_device_descriptor(dev, &desc) < 0)
77377af7 296 ftdi_error_return_free_device_list(-6, "libusb_get_device_descriptor() failed", devs);
edb82cbf 297
56631bed
UB
298 if (((vendor != 0 && product != 0) &&
299 desc.idVendor == vendor && desc.idProduct == product) ||
300 ((vendor == 0 && product == 0) &&
301 (desc.idVendor == 0x403) && (desc.idProduct == 0x6001 || desc.idProduct == 0x6010
7879216a 302 || desc.idProduct == 0x6011 || desc.idProduct == 0x6014)))
579b006f
JZ
303 {
304 *curdev = (struct ftdi_device_list*)malloc(sizeof(struct ftdi_device_list));
305 if (!*curdev)
77377af7 306 ftdi_error_return_free_device_list(-3, "out of memory", devs);
56ac0383 307
579b006f
JZ
308 (*curdev)->next = NULL;
309 (*curdev)->dev = dev;
0c33162c 310 libusb_ref_device(dev);
579b006f
JZ
311 curdev = &(*curdev)->next;
312 count++;
edb82cbf
TJ
313 }
314 }
77377af7 315 libusb_free_device_list(devs,1);
edb82cbf
TJ
316 return count;
317}
318
1941414d
TJ
319/**
320 Frees a usb device list.
edb82cbf 321
1941414d 322 \param devlist USB device list created by ftdi_usb_find_all()
edb82cbf 323*/
d2f10023 324void ftdi_list_free(struct ftdi_device_list **devlist)
edb82cbf 325{
6db32169
TJ
326 struct ftdi_device_list *curdev, *next;
327
22d12cda
TJ
328 for (curdev = *devlist; curdev != NULL;)
329 {
6db32169 330 next = curdev->next;
0c33162c 331 libusb_unref_device(curdev->dev);
6db32169
TJ
332 free(curdev);
333 curdev = next;
edb82cbf
TJ
334 }
335
6db32169 336 *devlist = NULL;
edb82cbf
TJ
337}
338
1941414d 339/**
cef378aa
TJ
340 Frees a usb device list.
341
342 \param devlist USB device list created by ftdi_usb_find_all()
343*/
344void ftdi_list_free2(struct ftdi_device_list *devlist)
345{
346 ftdi_list_free(&devlist);
347}
348
349/**
474786c0
TJ
350 Return device ID strings from the usb device.
351
352 The parameters manufacturer, description and serial may be NULL
353 or pointer to buffers to store the fetched strings.
354
898c34dd
TJ
355 \note Use this function only in combination with ftdi_usb_find_all()
356 as it closes the internal "usb_dev" after use.
357
474786c0
TJ
358 \param ftdi pointer to ftdi_context
359 \param dev libusb usb_dev to use
360 \param manufacturer Store manufacturer string here if not NULL
361 \param mnf_len Buffer size of manufacturer string
362 \param description Store product description string here if not NULL
363 \param desc_len Buffer size of product description string
364 \param serial Store serial string here if not NULL
365 \param serial_len Buffer size of serial string
366
367 \retval 0: all fine
368 \retval -1: wrong arguments
369 \retval -4: unable to open device
370 \retval -7: get product manufacturer failed
371 \retval -8: get product description failed
372 \retval -9: get serial number failed
579b006f 373 \retval -11: libusb_get_device_descriptor() failed
474786c0 374*/
579b006f 375int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct libusb_device * dev,
22d12cda 376 char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len)
474786c0 377{
579b006f
JZ
378 struct libusb_device_descriptor desc;
379
474786c0
TJ
380 if ((ftdi==NULL) || (dev==NULL))
381 return -1;
382
579b006f
JZ
383 if (libusb_open(dev, &ftdi->usb_dev) < 0)
384 ftdi_error_return(-4, "libusb_open() failed");
385
386 if (libusb_get_device_descriptor(dev, &desc) < 0)
387 ftdi_error_return(-11, "libusb_get_device_descriptor() failed");
474786c0 388
22d12cda
TJ
389 if (manufacturer != NULL)
390 {
579b006f 391 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iManufacturer, (unsigned char *)manufacturer, mnf_len) < 0)
22d12cda 392 {
f3f81007 393 ftdi_usb_close_internal (ftdi);
579b006f 394 ftdi_error_return(-7, "libusb_get_string_descriptor_ascii() failed");
474786c0
TJ
395 }
396 }
397
22d12cda
TJ
398 if (description != NULL)
399 {
579b006f 400 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)description, desc_len) < 0)
22d12cda 401 {
f3f81007 402 ftdi_usb_close_internal (ftdi);
579b006f 403 ftdi_error_return(-8, "libusb_get_string_descriptor_ascii() failed");
474786c0
TJ
404 }
405 }
406
22d12cda
TJ
407 if (serial != NULL)
408 {
579b006f 409 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)serial, serial_len) < 0)
22d12cda 410 {
f3f81007 411 ftdi_usb_close_internal (ftdi);
579b006f 412 ftdi_error_return(-9, "libusb_get_string_descriptor_ascii() failed");
474786c0
TJ
413 }
414 }
415
579b006f 416 ftdi_usb_close_internal (ftdi);
474786c0
TJ
417
418 return 0;
419}
420
421/**
e2f12a4f
TJ
422 * Internal function to determine the maximum packet size.
423 * \param ftdi pointer to ftdi_context
424 * \param dev libusb usb_dev to use
425 * \retval Maximum packet size for this device
426 */
579b006f 427static unsigned int _ftdi_determine_max_packet_size(struct ftdi_context *ftdi, libusb_device *dev)
e2f12a4f 428{
579b006f
JZ
429 struct libusb_device_descriptor desc;
430 struct libusb_config_descriptor *config0;
e2f12a4f
TJ
431 unsigned int packet_size;
432
22a1b5c1
TJ
433 // Sanity check
434 if (ftdi == NULL || dev == NULL)
435 return 64;
436
e2f12a4f
TJ
437 // Determine maximum packet size. Init with default value.
438 // New hi-speed devices from FTDI use a packet size of 512 bytes
439 // but could be connected to a normal speed USB hub -> 64 bytes packet size.
c7e4c09e 440 if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H || ftdi->type == TYPE_232H )
e2f12a4f
TJ
441 packet_size = 512;
442 else
443 packet_size = 64;
444
579b006f
JZ
445 if (libusb_get_device_descriptor(dev, &desc) < 0)
446 return packet_size;
447
448 if (libusb_get_config_descriptor(dev, 0, &config0) < 0)
449 return packet_size;
e2f12a4f 450
579b006f
JZ
451 if (desc.bNumConfigurations > 0)
452 {
453 if (ftdi->interface < config0->bNumInterfaces)
e2f12a4f 454 {
579b006f 455 struct libusb_interface interface = config0->interface[ftdi->interface];
e2f12a4f
TJ
456 if (interface.num_altsetting > 0)
457 {
579b006f 458 struct libusb_interface_descriptor descriptor = interface.altsetting[0];
e2f12a4f
TJ
459 if (descriptor.bNumEndpoints > 0)
460 {
461 packet_size = descriptor.endpoint[0].wMaxPacketSize;
462 }
463 }
464 }
465 }
466
579b006f 467 libusb_free_config_descriptor (config0);
e2f12a4f
TJ
468 return packet_size;
469}
470
471/**
418aaa72 472 Opens a ftdi device given by an usb_device.
7b18bef6 473
1941414d
TJ
474 \param ftdi pointer to ftdi_context
475 \param dev libusb usb_dev to use
476
477 \retval 0: all fine
23b1798d 478 \retval -3: unable to config device
1941414d
TJ
479 \retval -4: unable to open device
480 \retval -5: unable to claim device
481 \retval -6: reset failed
482 \retval -7: set baudrate failed
22a1b5c1 483 \retval -8: ftdi context invalid
579b006f
JZ
484 \retval -9: libusb_get_device_descriptor() failed
485 \retval -10: libusb_get_config_descriptor() failed
e375e6cb 486 \retval -11: libusb_detach_kernel_driver() failed
579b006f 487 \retval -12: libusb_get_configuration() failed
7b18bef6 488*/
579b006f 489int ftdi_usb_open_dev(struct ftdi_context *ftdi, libusb_device *dev)
7b18bef6 490{
579b006f
JZ
491 struct libusb_device_descriptor desc;
492 struct libusb_config_descriptor *config0;
43aee24f 493 int cfg, cfg0, detach_errno = 0;
579b006f 494
22a1b5c1
TJ
495 if (ftdi == NULL)
496 ftdi_error_return(-8, "ftdi context invalid");
497
579b006f
JZ
498 if (libusb_open(dev, &ftdi->usb_dev) < 0)
499 ftdi_error_return(-4, "libusb_open() failed");
500
501 if (libusb_get_device_descriptor(dev, &desc) < 0)
502 ftdi_error_return(-9, "libusb_get_device_descriptor() failed");
503
504 if (libusb_get_config_descriptor(dev, 0, &config0) < 0)
505 ftdi_error_return(-10, "libusb_get_config_descriptor() failed");
506 cfg0 = config0->bConfigurationValue;
507 libusb_free_config_descriptor (config0);
d2f10023 508
22592e17 509 // Try to detach ftdi_sio kernel module.
22592e17
TJ
510 //
511 // The return code is kept in a separate variable and only parsed
512 // if usb_set_configuration() or usb_claim_interface() fails as the
513 // detach operation might be denied and everything still works fine.
514 // Likely scenario is a static ftdi_sio kernel module.
a3d86bdb
TJ
515 if (ftdi->module_detach_mode == AUTO_DETACH_SIO_MODULE)
516 {
517 if (libusb_detach_kernel_driver(ftdi->usb_dev, ftdi->interface) !=0)
518 detach_errno = errno;
519 }
d2f10023 520
579b006f
JZ
521 if (libusb_get_configuration (ftdi->usb_dev, &cfg) < 0)
522 ftdi_error_return(-12, "libusb_get_configuration () failed");
b57aedfd
GE
523 // set configuration (needed especially for windows)
524 // tolerate EBUSY: one device with one configuration, but two interfaces
525 // and libftdi sessions to both interfaces (e.g. FT2232)
579b006f 526 if (desc.bNumConfigurations > 0 && cfg != cfg0)
b57aedfd 527 {
579b006f 528 if (libusb_set_configuration(ftdi->usb_dev, cfg0) < 0)
22d12cda 529 {
a56ba2bd 530 ftdi_usb_close_internal (ftdi);
56ac0383 531 if (detach_errno == EPERM)
43aee24f
UB
532 {
533 ftdi_error_return(-8, "inappropriate permissions on device!");
534 }
535 else
536 {
c16b162d 537 ftdi_error_return(-3, "unable to set usb configuration. Make sure the default FTDI driver is not in use");
43aee24f 538 }
23b1798d
TJ
539 }
540 }
541
579b006f 542 if (libusb_claim_interface(ftdi->usb_dev, ftdi->interface) < 0)
22d12cda 543 {
f3f81007 544 ftdi_usb_close_internal (ftdi);
56ac0383 545 if (detach_errno == EPERM)
43aee24f
UB
546 {
547 ftdi_error_return(-8, "inappropriate permissions on device!");
548 }
549 else
550 {
c16b162d 551 ftdi_error_return(-5, "unable to claim usb device. Make sure the default FTDI driver is not in use");
43aee24f 552 }
7b18bef6
TJ
553 }
554
22d12cda
TJ
555 if (ftdi_usb_reset (ftdi) != 0)
556 {
f3f81007 557 ftdi_usb_close_internal (ftdi);
7b18bef6
TJ
558 ftdi_error_return(-6, "ftdi_usb_reset failed");
559 }
560
7b18bef6
TJ
561 // Try to guess chip type
562 // Bug in the BM type chips: bcdDevice is 0x200 for serial == 0
579b006f 563 if (desc.bcdDevice == 0x400 || (desc.bcdDevice == 0x200
56ac0383 564 && desc.iSerialNumber == 0))
7b18bef6 565 ftdi->type = TYPE_BM;
579b006f 566 else if (desc.bcdDevice == 0x200)
7b18bef6 567 ftdi->type = TYPE_AM;
579b006f 568 else if (desc.bcdDevice == 0x500)
7b18bef6 569 ftdi->type = TYPE_2232C;
579b006f 570 else if (desc.bcdDevice == 0x600)
cb6250fa 571 ftdi->type = TYPE_R;
579b006f 572 else if (desc.bcdDevice == 0x700)
0beb9686 573 ftdi->type = TYPE_2232H;
579b006f 574 else if (desc.bcdDevice == 0x800)
0beb9686 575 ftdi->type = TYPE_4232H;
c7e4c09e
UB
576 else if (desc.bcdDevice == 0x900)
577 ftdi->type = TYPE_232H;
7b18bef6 578
e2f12a4f
TJ
579 // Determine maximum packet size
580 ftdi->max_packet_size = _ftdi_determine_max_packet_size(ftdi, dev);
581
ef6f4838
TE
582 if (ftdi_set_baudrate (ftdi, 9600) != 0)
583 {
584 ftdi_usb_close_internal (ftdi);
585 ftdi_error_return(-7, "set baudrate failed");
586 }
587
7b18bef6
TJ
588 ftdi_error_return(0, "all fine");
589}
590
1941414d
TJ
591/**
592 Opens the first device with a given vendor and product ids.
593
594 \param ftdi pointer to ftdi_context
595 \param vendor Vendor ID
596 \param product Product ID
597
9bec2387 598 \retval same as ftdi_usb_open_desc()
1941414d 599*/
edb82cbf
TJ
600int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
601{
602 return ftdi_usb_open_desc(ftdi, vendor, product, NULL, NULL);
603}
604
1941414d
TJ
605/**
606 Opens the first device with a given, vendor id, product id,
607 description and serial.
608
609 \param ftdi pointer to ftdi_context
610 \param vendor Vendor ID
611 \param product Product ID
612 \param description Description to search for. Use NULL if not needed.
613 \param serial Serial to search for. Use NULL if not needed.
614
615 \retval 0: all fine
1941414d
TJ
616 \retval -3: usb device not found
617 \retval -4: unable to open device
618 \retval -5: unable to claim device
619 \retval -6: reset failed
620 \retval -7: set baudrate failed
621 \retval -8: get product description failed
622 \retval -9: get serial number failed
579b006f
JZ
623 \retval -12: libusb_get_device_list() failed
624 \retval -13: libusb_get_device_descriptor() failed
a3da1d95 625*/
04e1ea0a 626int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
a8f46ddc
TJ
627 const char* description, const char* serial)
628{
5ebbdab9
GE
629 return ftdi_usb_open_desc_index(ftdi,vendor,product,description,serial,0);
630}
631
632/**
633 Opens the index-th device with a given, vendor id, product id,
634 description and serial.
635
636 \param ftdi pointer to ftdi_context
637 \param vendor Vendor ID
638 \param product Product ID
639 \param description Description to search for. Use NULL if not needed.
640 \param serial Serial to search for. Use NULL if not needed.
641 \param index Number of matching device to open if there are more than one, starts with 0.
642
643 \retval 0: all fine
644 \retval -1: usb_find_busses() failed
645 \retval -2: usb_find_devices() failed
646 \retval -3: usb device not found
647 \retval -4: unable to open device
648 \retval -5: unable to claim device
649 \retval -6: reset failed
650 \retval -7: set baudrate failed
651 \retval -8: get product description failed
652 \retval -9: get serial number failed
653 \retval -10: unable to close device
22a1b5c1 654 \retval -11: ftdi context invalid
5ebbdab9
GE
655*/
656int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product,
56ac0383 657 const char* description, const char* serial, unsigned int index)
5ebbdab9 658{
579b006f
JZ
659 libusb_device *dev;
660 libusb_device **devs;
c3d95b87 661 char string[256];
579b006f 662 int i = 0;
98452d97 663
22a1b5c1
TJ
664 if (ftdi == NULL)
665 ftdi_error_return(-11, "ftdi context invalid");
666
02212d8e 667 if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
99650502
UB
668 ftdi_error_return(-12, "libusb_get_device_list() failed");
669
579b006f 670 while ((dev = devs[i++]) != NULL)
22d12cda 671 {
579b006f 672 struct libusb_device_descriptor desc;
99650502 673 int res;
579b006f
JZ
674
675 if (libusb_get_device_descriptor(dev, &desc) < 0)
99650502 676 ftdi_error_return_free_device_list(-13, "libusb_get_device_descriptor() failed", devs);
579b006f
JZ
677
678 if (desc.idVendor == vendor && desc.idProduct == product)
22d12cda 679 {
579b006f 680 if (libusb_open(dev, &ftdi->usb_dev) < 0)
99650502 681 ftdi_error_return_free_device_list(-4, "usb_open() failed", devs);
c3d95b87 682
579b006f
JZ
683 if (description != NULL)
684 {
685 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iProduct, (unsigned char *)string, sizeof(string)) < 0)
22d12cda 686 {
d4afae5f 687 ftdi_usb_close_internal (ftdi);
99650502 688 ftdi_error_return_free_device_list(-8, "unable to fetch product description", devs);
a8f46ddc 689 }
579b006f 690 if (strncmp(string, description, sizeof(string)) != 0)
22d12cda 691 {
d4afae5f 692 ftdi_usb_close_internal (ftdi);
579b006f 693 continue;
a8f46ddc 694 }
579b006f
JZ
695 }
696 if (serial != NULL)
697 {
698 if (libusb_get_string_descriptor_ascii(ftdi->usb_dev, desc.iSerialNumber, (unsigned char *)string, sizeof(string)) < 0)
699 {
700 ftdi_usb_close_internal (ftdi);
99650502 701 ftdi_error_return_free_device_list(-9, "unable to fetch serial number", devs);
579b006f
JZ
702 }
703 if (strncmp(string, serial, sizeof(string)) != 0)
704 {
705 ftdi_usb_close_internal (ftdi);
706 continue;
707 }
708 }
98452d97 709
579b006f 710 ftdi_usb_close_internal (ftdi);
d2f10023 711
56ac0383
TJ
712 if (index > 0)
713 {
714 index--;
715 continue;
716 }
5ebbdab9 717
99650502
UB
718 res = ftdi_usb_open_dev(ftdi, dev);
719 libusb_free_device_list(devs,1);
720 return res;
98452d97 721 }
98452d97 722 }
a3da1d95 723
98452d97 724 // device not found
99650502 725 ftdi_error_return_free_device_list(-3, "device not found", devs);
a3da1d95
GE
726}
727
1941414d 728/**
5ebbdab9
GE
729 Opens the ftdi-device described by a description-string.
730 Intended to be used for parsing a device-description given as commandline argument.
731
732 \param ftdi pointer to ftdi_context
733 \param description NULL-terminated description-string, using this format:
734 \li <tt>d:\<devicenode></tt> path of bus and device-node (e.g. "003/001") within usb device tree (usually at /proc/bus/usb/)
735 \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")
736 \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
737 \li <tt>s:\<vendor>:\<product>:\<serial></tt> first device with given vendor id, product id and serial string
738
739 \note The description format may be extended in later versions.
740
741 \retval 0: all fine
579b006f 742 \retval -2: libusb_get_device_list() failed
5ebbdab9
GE
743 \retval -3: usb device not found
744 \retval -4: unable to open device
745 \retval -5: unable to claim device
746 \retval -6: reset failed
747 \retval -7: set baudrate failed
748 \retval -8: get product description failed
749 \retval -9: get serial number failed
750 \retval -10: unable to close device
751 \retval -11: illegal description format
22a1b5c1 752 \retval -12: ftdi context invalid
5ebbdab9
GE
753*/
754int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description)
755{
22a1b5c1
TJ
756 if (ftdi == NULL)
757 ftdi_error_return(-12, "ftdi context invalid");
758
5ebbdab9
GE
759 if (description[0] == 0 || description[1] != ':')
760 ftdi_error_return(-11, "illegal description format");
761
762 if (description[0] == 'd')
763 {
579b006f
JZ
764 libusb_device *dev;
765 libusb_device **devs;
56ac0383
TJ
766 unsigned int bus_number, device_address;
767 int i = 0;
579b006f 768
56ac0383
TJ
769 if (libusb_get_device_list(ftdi->usb_ctx, &devs) < 0)
770 ftdi_error_return(-2, "libusb_get_device_list() failed");
5ebbdab9 771
579b006f
JZ
772 /* XXX: This doesn't handle symlinks/odd paths/etc... */
773 if (sscanf (description + 2, "%u/%u", &bus_number, &device_address) != 2)
56ac0383 774 ftdi_error_return_free_device_list(-11, "illegal description format", devs);
5ebbdab9 775
56ac0383 776 while ((dev = devs[i++]) != NULL)
5ebbdab9 777 {
99650502 778 int ret;
56ac0383
TJ
779 if (bus_number == libusb_get_bus_number (dev)
780 && device_address == libusb_get_device_address (dev))
99650502
UB
781 {
782 ret = ftdi_usb_open_dev(ftdi, dev);
783 libusb_free_device_list(devs,1);
784 return ret;
785 }
5ebbdab9
GE
786 }
787
788 // device not found
99650502 789 ftdi_error_return_free_device_list(-3, "device not found", devs);
5ebbdab9
GE
790 }
791 else if (description[0] == 'i' || description[0] == 's')
792 {
793 unsigned int vendor;
794 unsigned int product;
795 unsigned int index=0;
0e6cf62b 796 const char *serial=NULL;
5ebbdab9
GE
797 const char *startp, *endp;
798
799 errno=0;
800 startp=description+2;
801 vendor=strtoul((char*)startp,(char**)&endp,0);
802 if (*endp != ':' || endp == startp || errno != 0)
803 ftdi_error_return(-11, "illegal description format");
804
805 startp=endp+1;
806 product=strtoul((char*)startp,(char**)&endp,0);
807 if (endp == startp || errno != 0)
808 ftdi_error_return(-11, "illegal description format");
809
810 if (description[0] == 'i' && *endp != 0)
811 {
812 /* optional index field in i-mode */
813 if (*endp != ':')
814 ftdi_error_return(-11, "illegal description format");
815
816 startp=endp+1;
817 index=strtoul((char*)startp,(char**)&endp,0);
818 if (*endp != 0 || endp == startp || errno != 0)
819 ftdi_error_return(-11, "illegal description format");
820 }
821 if (description[0] == 's')
822 {
823 if (*endp != ':')
824 ftdi_error_return(-11, "illegal description format");
825
826 /* rest of the description is the serial */
827 serial=endp+1;
828 }
829
830 return ftdi_usb_open_desc_index(ftdi, vendor, product, NULL, serial, index);
831 }
832 else
833 {
834 ftdi_error_return(-11, "illegal description format");
835 }
836}
837
838/**
1941414d 839 Resets the ftdi device.
a3da1d95 840
1941414d
TJ
841 \param ftdi pointer to ftdi_context
842
843 \retval 0: all fine
844 \retval -1: FTDI reset failed
22a1b5c1 845 \retval -2: USB device unavailable
4837f98a 846*/
edb82cbf 847int ftdi_usb_reset(struct ftdi_context *ftdi)
a8f46ddc 848{
22a1b5c1
TJ
849 if (ftdi == NULL || ftdi->usb_dev == NULL)
850 ftdi_error_return(-2, "USB device unavailable");
851
579b006f
JZ
852 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
853 SIO_RESET_REQUEST, SIO_RESET_SIO,
854 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
22d12cda 855 ftdi_error_return(-1,"FTDI reset failed");
c3d95b87 856
545820ce 857 // Invalidate data in the readbuffer
bfcee05b
TJ
858 ftdi->readbuffer_offset = 0;
859 ftdi->readbuffer_remaining = 0;
860
a3da1d95
GE
861 return 0;
862}
863
1941414d 864/**
1189b11a 865 Clears the read buffer on the chip and the internal read buffer.
1941414d
TJ
866
867 \param ftdi pointer to ftdi_context
4837f98a 868
1941414d 869 \retval 0: all fine
1189b11a 870 \retval -1: read buffer purge failed
22a1b5c1 871 \retval -2: USB device unavailable
4837f98a 872*/
1189b11a 873int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi)
a8f46ddc 874{
22a1b5c1
TJ
875 if (ftdi == NULL || ftdi->usb_dev == NULL)
876 ftdi_error_return(-2, "USB device unavailable");
877
579b006f
JZ
878 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
879 SIO_RESET_REQUEST, SIO_RESET_PURGE_RX,
880 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
c3d95b87
TJ
881 ftdi_error_return(-1, "FTDI purge of RX buffer failed");
882
545820ce 883 // Invalidate data in the readbuffer
bfcee05b
TJ
884 ftdi->readbuffer_offset = 0;
885 ftdi->readbuffer_remaining = 0;
a60be878 886
1189b11a
TJ
887 return 0;
888}
889
890/**
891 Clears the write buffer on the chip.
892
893 \param ftdi pointer to ftdi_context
894
895 \retval 0: all fine
896 \retval -1: write buffer purge failed
22a1b5c1 897 \retval -2: USB device unavailable
1189b11a
TJ
898*/
899int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi)
900{
22a1b5c1
TJ
901 if (ftdi == NULL || ftdi->usb_dev == NULL)
902 ftdi_error_return(-2, "USB device unavailable");
903
579b006f
JZ
904 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
905 SIO_RESET_REQUEST, SIO_RESET_PURGE_TX,
906 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1189b11a
TJ
907 ftdi_error_return(-1, "FTDI purge of TX buffer failed");
908
909 return 0;
910}
911
912/**
913 Clears the buffers on the chip and the internal read buffer.
914
915 \param ftdi pointer to ftdi_context
916
917 \retval 0: all fine
918 \retval -1: read buffer purge failed
919 \retval -2: write buffer purge failed
22a1b5c1 920 \retval -3: USB device unavailable
1189b11a
TJ
921*/
922int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)
923{
924 int result;
925
22a1b5c1
TJ
926 if (ftdi == NULL || ftdi->usb_dev == NULL)
927 ftdi_error_return(-3, "USB device unavailable");
928
1189b11a 929 result = ftdi_usb_purge_rx_buffer(ftdi);
5a2b51cb 930 if (result < 0)
1189b11a
TJ
931 return -1;
932
933 result = ftdi_usb_purge_tx_buffer(ftdi);
5a2b51cb 934 if (result < 0)
1189b11a 935 return -2;
545820ce 936
a60be878
TJ
937 return 0;
938}
a3da1d95 939
f3f81007
TJ
940
941
1941414d
TJ
942/**
943 Closes the ftdi device. Call ftdi_deinit() if you're cleaning up.
944
945 \param ftdi pointer to ftdi_context
946
947 \retval 0: all fine
948 \retval -1: usb_release failed
22a1b5c1 949 \retval -3: ftdi context invalid
a3da1d95 950*/
a8f46ddc
TJ
951int ftdi_usb_close(struct ftdi_context *ftdi)
952{
a3da1d95
GE
953 int rtn = 0;
954
22a1b5c1
TJ
955 if (ftdi == NULL)
956 ftdi_error_return(-3, "ftdi context invalid");
957
dff4fdb0 958 if (ftdi->usb_dev != NULL)
579b006f 959 if (libusb_release_interface(ftdi->usb_dev, ftdi->interface) < 0)
dff4fdb0 960 rtn = -1;
98452d97 961
579b006f 962 ftdi_usb_close_internal (ftdi);
98452d97 963
a3da1d95
GE
964 return rtn;
965}
966
418aaa72 967/**
53ad271d
TJ
968 ftdi_convert_baudrate returns nearest supported baud rate to that requested.
969 Function is only used internally
b5ec1820 970 \internal
53ad271d 971*/
0126d22e 972static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
a8f46ddc
TJ
973 unsigned short *value, unsigned short *index)
974{
53ad271d
TJ
975 static const char am_adjust_up[8] = {0, 0, 0, 1, 0, 3, 2, 1};
976 static const char am_adjust_dn[8] = {0, 0, 0, 1, 0, 1, 2, 3};
977 static const char frac_code[8] = {0, 3, 2, 4, 1, 5, 6, 7};
978 int divisor, best_divisor, best_baud, best_baud_diff;
979 unsigned long encoded_divisor;
980 int i;
981
22d12cda
TJ
982 if (baudrate <= 0)
983 {
53ad271d
TJ
984 // Return error
985 return -1;
986 }
987
988 divisor = 24000000 / baudrate;
989
22d12cda
TJ
990 if (ftdi->type == TYPE_AM)
991 {
53ad271d
TJ
992 // Round down to supported fraction (AM only)
993 divisor -= am_adjust_dn[divisor & 7];
994 }
995
996 // Try this divisor and the one above it (because division rounds down)
997 best_divisor = 0;
998 best_baud = 0;
999 best_baud_diff = 0;
22d12cda
TJ
1000 for (i = 0; i < 2; i++)
1001 {
53ad271d
TJ
1002 int try_divisor = divisor + i;
1003 int baud_estimate;
1004 int baud_diff;
1005
1006 // Round up to supported divisor value
22d12cda
TJ
1007 if (try_divisor <= 8)
1008 {
53ad271d
TJ
1009 // Round up to minimum supported divisor
1010 try_divisor = 8;
22d12cda
TJ
1011 }
1012 else if (ftdi->type != TYPE_AM && try_divisor < 12)
1013 {
53ad271d
TJ
1014 // BM doesn't support divisors 9 through 11 inclusive
1015 try_divisor = 12;
22d12cda
TJ
1016 }
1017 else if (divisor < 16)
1018 {
53ad271d
TJ
1019 // AM doesn't support divisors 9 through 15 inclusive
1020 try_divisor = 16;
22d12cda
TJ
1021 }
1022 else
1023 {
1024 if (ftdi->type == TYPE_AM)
1025 {
53ad271d
TJ
1026 // Round up to supported fraction (AM only)
1027 try_divisor += am_adjust_up[try_divisor & 7];
22d12cda
TJ
1028 if (try_divisor > 0x1FFF8)
1029 {
53ad271d
TJ
1030 // Round down to maximum supported divisor value (for AM)
1031 try_divisor = 0x1FFF8;
1032 }
22d12cda
TJ
1033 }
1034 else
1035 {
1036 if (try_divisor > 0x1FFFF)
1037 {
53ad271d
TJ
1038 // Round down to maximum supported divisor value (for BM)
1039 try_divisor = 0x1FFFF;
1040 }
1041 }
1042 }
1043 // Get estimated baud rate (to nearest integer)
1044 baud_estimate = (24000000 + (try_divisor / 2)) / try_divisor;
1045 // Get absolute difference from requested baud rate
22d12cda
TJ
1046 if (baud_estimate < baudrate)
1047 {
53ad271d 1048 baud_diff = baudrate - baud_estimate;
22d12cda
TJ
1049 }
1050 else
1051 {
53ad271d
TJ
1052 baud_diff = baud_estimate - baudrate;
1053 }
22d12cda
TJ
1054 if (i == 0 || baud_diff < best_baud_diff)
1055 {
53ad271d
TJ
1056 // Closest to requested baud rate so far
1057 best_divisor = try_divisor;
1058 best_baud = baud_estimate;
1059 best_baud_diff = baud_diff;
22d12cda
TJ
1060 if (baud_diff == 0)
1061 {
53ad271d
TJ
1062 // Spot on! No point trying
1063 break;
1064 }
1065 }
1066 }
1067 // Encode the best divisor value
1068 encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 7] << 14);
1069 // Deal with special cases for encoded value
22d12cda
TJ
1070 if (encoded_divisor == 1)
1071 {
4837f98a 1072 encoded_divisor = 0; // 3000000 baud
22d12cda
TJ
1073 }
1074 else if (encoded_divisor == 0x4001)
1075 {
4837f98a 1076 encoded_divisor = 1; // 2000000 baud (BM only)
53ad271d
TJ
1077 }
1078 // Split into "value" and "index" values
1079 *value = (unsigned short)(encoded_divisor & 0xFFFF);
bb104e5b 1080 if (ftdi->type == TYPE_2232C || ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H || ftdi->type == TYPE_232H )
22d12cda 1081 {
0126d22e
TJ
1082 *index = (unsigned short)(encoded_divisor >> 8);
1083 *index &= 0xFF00;
a9c57c05 1084 *index |= ftdi->index;
0126d22e
TJ
1085 }
1086 else
1087 *index = (unsigned short)(encoded_divisor >> 16);
c3d95b87 1088
53ad271d
TJ
1089 // Return the nearest baud rate
1090 return best_baud;
1091}
1092
1941414d 1093/**
9bec2387 1094 Sets the chip baud rate
1941414d
TJ
1095
1096 \param ftdi pointer to ftdi_context
9bec2387 1097 \param baudrate baud rate to set
1941414d
TJ
1098
1099 \retval 0: all fine
1100 \retval -1: invalid baudrate
1101 \retval -2: setting baudrate failed
22a1b5c1 1102 \retval -3: USB device unavailable
a3da1d95 1103*/
a8f46ddc
TJ
1104int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
1105{
53ad271d
TJ
1106 unsigned short value, index;
1107 int actual_baudrate;
a3da1d95 1108
22a1b5c1
TJ
1109 if (ftdi == NULL || ftdi->usb_dev == NULL)
1110 ftdi_error_return(-3, "USB device unavailable");
1111
22d12cda
TJ
1112 if (ftdi->bitbang_enabled)
1113 {
a3da1d95
GE
1114 baudrate = baudrate*4;
1115 }
1116
25707904 1117 actual_baudrate = ftdi_convert_baudrate(baudrate, ftdi, &value, &index);
c3d95b87
TJ
1118 if (actual_baudrate <= 0)
1119 ftdi_error_return (-1, "Silly baudrate <= 0.");
a3da1d95 1120
53ad271d
TJ
1121 // Check within tolerance (about 5%)
1122 if ((actual_baudrate * 2 < baudrate /* Catch overflows */ )
1123 || ((actual_baudrate < baudrate)
1124 ? (actual_baudrate * 21 < baudrate * 20)
c3d95b87
TJ
1125 : (baudrate * 21 < actual_baudrate * 20)))
1126 ftdi_error_return (-1, "Unsupported baudrate. Note: bitbang baudrates are automatically multiplied by 4");
545820ce 1127
579b006f
JZ
1128 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1129 SIO_SET_BAUDRATE_REQUEST, value,
1130 index, NULL, 0, ftdi->usb_write_timeout) < 0)
c3d95b87 1131 ftdi_error_return (-2, "Setting new baudrate failed");
a3da1d95
GE
1132
1133 ftdi->baudrate = baudrate;
1134 return 0;
1135}
1136
1941414d 1137/**
6c32e222
TJ
1138 Set (RS232) line characteristics.
1139 The break type can only be set via ftdi_set_line_property2()
1140 and defaults to "off".
4837f98a 1141
1941414d
TJ
1142 \param ftdi pointer to ftdi_context
1143 \param bits Number of bits
1144 \param sbit Number of stop bits
1145 \param parity Parity mode
1146
1147 \retval 0: all fine
1148 \retval -1: Setting line property failed
2f73e59f
TJ
1149*/
1150int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
d2f10023 1151 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
2f73e59f 1152{
6c32e222
TJ
1153 return ftdi_set_line_property2(ftdi, bits, sbit, parity, BREAK_OFF);
1154}
1155
1156/**
1157 Set (RS232) line characteristics
1158
1159 \param ftdi pointer to ftdi_context
1160 \param bits Number of bits
1161 \param sbit Number of stop bits
1162 \param parity Parity mode
1163 \param break_type Break type
1164
1165 \retval 0: all fine
1166 \retval -1: Setting line property failed
22a1b5c1 1167 \retval -2: USB device unavailable
6c32e222
TJ
1168*/
1169int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
22d12cda
TJ
1170 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
1171 enum ftdi_break_type break_type)
6c32e222 1172{
2f73e59f
TJ
1173 unsigned short value = bits;
1174
22a1b5c1
TJ
1175 if (ftdi == NULL || ftdi->usb_dev == NULL)
1176 ftdi_error_return(-2, "USB device unavailable");
1177
22d12cda
TJ
1178 switch (parity)
1179 {
1180 case NONE:
1181 value |= (0x00 << 8);
1182 break;
1183 case ODD:
1184 value |= (0x01 << 8);
1185 break;
1186 case EVEN:
1187 value |= (0x02 << 8);
1188 break;
1189 case MARK:
1190 value |= (0x03 << 8);
1191 break;
1192 case SPACE:
1193 value |= (0x04 << 8);
1194 break;
2f73e59f 1195 }
d2f10023 1196
22d12cda
TJ
1197 switch (sbit)
1198 {
1199 case STOP_BIT_1:
1200 value |= (0x00 << 11);
1201 break;
1202 case STOP_BIT_15:
1203 value |= (0x01 << 11);
1204 break;
1205 case STOP_BIT_2:
1206 value |= (0x02 << 11);
1207 break;
2f73e59f 1208 }
d2f10023 1209
22d12cda
TJ
1210 switch (break_type)
1211 {
1212 case BREAK_OFF:
1213 value |= (0x00 << 14);
1214 break;
1215 case BREAK_ON:
1216 value |= (0x01 << 14);
1217 break;
6c32e222
TJ
1218 }
1219
579b006f
JZ
1220 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1221 SIO_SET_DATA_REQUEST, value,
1222 ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
2f73e59f 1223 ftdi_error_return (-1, "Setting new line property failed");
d2f10023 1224
2f73e59f
TJ
1225 return 0;
1226}
a3da1d95 1227
1941414d
TJ
1228/**
1229 Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip
1230
1231 \param ftdi pointer to ftdi_context
1232 \param buf Buffer with the data
1233 \param size Size of the buffer
1234
22a1b5c1 1235 \retval -666: USB device unavailable
1941414d
TJ
1236 \retval <0: error code from usb_bulk_write()
1237 \retval >0: number of bytes written
1238*/
a8f46ddc
TJ
1239int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1240{
a3da1d95 1241 int offset = 0;
579b006f 1242 int actual_length;
c3d95b87 1243
22a1b5c1
TJ
1244 if (ftdi == NULL || ftdi->usb_dev == NULL)
1245 ftdi_error_return(-666, "USB device unavailable");
1246
22d12cda
TJ
1247 while (offset < size)
1248 {
948f9ada 1249 int write_size = ftdi->writebuffer_chunksize;
a3da1d95
GE
1250
1251 if (offset+write_size > size)
1252 write_size = size-offset;
1253
579b006f
JZ
1254 if (libusb_bulk_transfer(ftdi->usb_dev, ftdi->in_ep, buf+offset, write_size, &actual_length, ftdi->usb_write_timeout) < 0)
1255 ftdi_error_return(-1, "usb bulk write failed");
a3da1d95 1256
579b006f 1257 offset += actual_length;
a3da1d95
GE
1258 }
1259
579b006f 1260 return offset;
a3da1d95
GE
1261}
1262
579b006f 1263static void ftdi_read_data_cb(struct libusb_transfer *transfer)
22d12cda 1264{
579b006f
JZ
1265 struct ftdi_transfer_control *tc = (struct ftdi_transfer_control *) transfer->user_data;
1266 struct ftdi_context *ftdi = tc->ftdi;
1267 int packet_size, actual_length, num_of_chunks, chunk_remains, i, ret;
4c9e3812 1268
b1139150 1269 packet_size = ftdi->max_packet_size;
579b006f
JZ
1270
1271 actual_length = transfer->actual_length;
1272
1273 if (actual_length > 2)
1274 {
1275 // skip FTDI status bytes.
1276 // Maybe stored in the future to enable modem use
1277 num_of_chunks = actual_length / packet_size;
1278 chunk_remains = actual_length % packet_size;
1279 //printf("actual_length = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", actual_length, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1280
1281 ftdi->readbuffer_offset += 2;
1282 actual_length -= 2;
1283
1284 if (actual_length > packet_size - 2)
1285 {
1286 for (i = 1; i < num_of_chunks; i++)
56ac0383
TJ
1287 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1288 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1289 packet_size - 2);
579b006f
JZ
1290 if (chunk_remains > 2)
1291 {
1292 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1293 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1294 chunk_remains-2);
1295 actual_length -= 2*num_of_chunks;
1296 }
1297 else
56ac0383 1298 actual_length -= 2*(num_of_chunks-1)+chunk_remains;
579b006f
JZ
1299 }
1300
1301 if (actual_length > 0)
1302 {
1303 // data still fits in buf?
1304 if (tc->offset + actual_length <= tc->size)
1305 {
1306 memcpy (tc->buf + tc->offset, ftdi->readbuffer + ftdi->readbuffer_offset, actual_length);
1307 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
1308 tc->offset += actual_length;
1309
1310 ftdi->readbuffer_offset = 0;
1311 ftdi->readbuffer_remaining = 0;
1312
1313 /* Did we read exactly the right amount of bytes? */
1314 if (tc->offset == tc->size)
1315 {
1316 //printf("read_data exact rem %d offset %d\n",
1317 //ftdi->readbuffer_remaining, offset);
1318 tc->completed = 1;
1319 return;
1320 }
1321 }
1322 else
1323 {
1324 // only copy part of the data or size <= readbuffer_chunksize
1325 int part_size = tc->size - tc->offset;
1326 memcpy (tc->buf + tc->offset, ftdi->readbuffer + ftdi->readbuffer_offset, part_size);
1327 tc->offset += part_size;
1328
1329 ftdi->readbuffer_offset += part_size;
1330 ftdi->readbuffer_remaining = actual_length - part_size;
1331
1332 /* printf("Returning part: %d - size: %d - offset: %d - actual_length: %d - remaining: %d\n",
1333 part_size, size, offset, actual_length, ftdi->readbuffer_remaining); */
1334 tc->completed = 1;
1335 return;
1336 }
1337 }
1338 }
1339 ret = libusb_submit_transfer (transfer);
1340 if (ret < 0)
1341 tc->completed = 1;
1342}
1343
1344
1345static void ftdi_write_data_cb(struct libusb_transfer *transfer)
7cc9950e 1346{
579b006f
JZ
1347 struct ftdi_transfer_control *tc = (struct ftdi_transfer_control *) transfer->user_data;
1348 struct ftdi_context *ftdi = tc->ftdi;
56ac0383 1349
90ef163e 1350 tc->offset += transfer->actual_length;
56ac0383 1351
579b006f 1352 if (tc->offset == tc->size)
22d12cda 1353 {
579b006f 1354 tc->completed = 1;
7cc9950e 1355 }
579b006f
JZ
1356 else
1357 {
1358 int write_size = ftdi->writebuffer_chunksize;
1359 int ret;
7cc9950e 1360
579b006f
JZ
1361 if (tc->offset + write_size > tc->size)
1362 write_size = tc->size - tc->offset;
1363
1364 transfer->length = write_size;
1365 transfer->buffer = tc->buf + tc->offset;
1366 ret = libusb_submit_transfer (transfer);
1367 if (ret < 0)
1368 tc->completed = 1;
1369 }
7cc9950e
GE
1370}
1371
579b006f 1372
84f85aaa 1373/**
579b006f
JZ
1374 Writes data to the chip. Does not wait for completion of the transfer
1375 nor does it make sure that the transfer was successful.
1376
249888c8 1377 Use libusb 1.0 asynchronous API.
84f85aaa
GE
1378
1379 \param ftdi pointer to ftdi_context
579b006f
JZ
1380 \param buf Buffer with the data
1381 \param size Size of the buffer
84f85aaa 1382
579b006f
JZ
1383 \retval NULL: Some error happens when submit transfer
1384 \retval !NULL: Pointer to a ftdi_transfer_control
c201f80f 1385*/
579b006f
JZ
1386
1387struct ftdi_transfer_control *ftdi_write_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size)
7cc9950e 1388{
579b006f 1389 struct ftdi_transfer_control *tc;
5e77e870 1390 struct libusb_transfer *transfer;
579b006f 1391 int write_size, ret;
22d12cda 1392
22a1b5c1 1393 if (ftdi == NULL || ftdi->usb_dev == NULL)
22a1b5c1 1394 return NULL;
22a1b5c1 1395
579b006f 1396 tc = (struct ftdi_transfer_control *) malloc (sizeof (*tc));
5e77e870
TJ
1397 if (!tc)
1398 return NULL;
22d12cda 1399
5e77e870
TJ
1400 transfer = libusb_alloc_transfer(0);
1401 if (!transfer)
1402 {
1403 free(tc);
579b006f 1404 return NULL;
5e77e870 1405 }
22d12cda 1406
579b006f
JZ
1407 tc->ftdi = ftdi;
1408 tc->completed = 0;
1409 tc->buf = buf;
1410 tc->size = size;
1411 tc->offset = 0;
7cc9950e 1412
579b006f 1413 if (size < ftdi->writebuffer_chunksize)
56ac0383 1414 write_size = size;
579b006f 1415 else
56ac0383 1416 write_size = ftdi->writebuffer_chunksize;
22d12cda 1417
90ef163e
YSL
1418 libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->in_ep, buf,
1419 write_size, ftdi_write_data_cb, tc,
1420 ftdi->usb_write_timeout);
579b006f 1421 transfer->type = LIBUSB_TRANSFER_TYPE_BULK;
7cc9950e 1422
579b006f
JZ
1423 ret = libusb_submit_transfer(transfer);
1424 if (ret < 0)
1425 {
1426 libusb_free_transfer(transfer);
5e77e870 1427 free(tc);
579b006f 1428 return NULL;
7cc9950e 1429 }
579b006f
JZ
1430 tc->transfer = transfer;
1431
1432 return tc;
7cc9950e
GE
1433}
1434
1435/**
579b006f
JZ
1436 Reads data from the chip. Does not wait for completion of the transfer
1437 nor does it make sure that the transfer was successful.
1438
249888c8 1439 Use libusb 1.0 asynchronous API.
7cc9950e
GE
1440
1441 \param ftdi pointer to ftdi_context
579b006f
JZ
1442 \param buf Buffer with the data
1443 \param size Size of the buffer
4c9e3812 1444
579b006f
JZ
1445 \retval NULL: Some error happens when submit transfer
1446 \retval !NULL: Pointer to a ftdi_transfer_control
4c9e3812 1447*/
579b006f
JZ
1448
1449struct ftdi_transfer_control *ftdi_read_data_submit(struct ftdi_context *ftdi, unsigned char *buf, int size)
4c9e3812 1450{
579b006f
JZ
1451 struct ftdi_transfer_control *tc;
1452 struct libusb_transfer *transfer;
1453 int ret;
22d12cda 1454
22a1b5c1
TJ
1455 if (ftdi == NULL || ftdi->usb_dev == NULL)
1456 return NULL;
1457
579b006f
JZ
1458 tc = (struct ftdi_transfer_control *) malloc (sizeof (*tc));
1459 if (!tc)
1460 return NULL;
1461
1462 tc->ftdi = ftdi;
1463 tc->buf = buf;
1464 tc->size = size;
1465
1466 if (size <= ftdi->readbuffer_remaining)
7cc9950e 1467 {
579b006f 1468 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
7cc9950e 1469
579b006f
JZ
1470 // Fix offsets
1471 ftdi->readbuffer_remaining -= size;
1472 ftdi->readbuffer_offset += size;
7cc9950e 1473
579b006f 1474 /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
22d12cda 1475
579b006f
JZ
1476 tc->completed = 1;
1477 tc->offset = size;
1478 tc->transfer = NULL;
1479 return tc;
1480 }
4c9e3812 1481
579b006f
JZ
1482 tc->completed = 0;
1483 if (ftdi->readbuffer_remaining != 0)
1484 {
1485 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
22d12cda 1486
579b006f
JZ
1487 tc->offset = ftdi->readbuffer_remaining;
1488 }
1489 else
1490 tc->offset = 0;
22d12cda 1491
579b006f
JZ
1492 transfer = libusb_alloc_transfer(0);
1493 if (!transfer)
1494 {
1495 free (tc);
1496 return NULL;
1497 }
22d12cda 1498
579b006f
JZ
1499 ftdi->readbuffer_remaining = 0;
1500 ftdi->readbuffer_offset = 0;
1501
1502 libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, ftdi_read_data_cb, tc, ftdi->usb_read_timeout);
1503 transfer->type = LIBUSB_TRANSFER_TYPE_BULK;
1504
1505 ret = libusb_submit_transfer(transfer);
1506 if (ret < 0)
1507 {
1508 libusb_free_transfer(transfer);
1509 free (tc);
1510 return NULL;
22d12cda 1511 }
579b006f
JZ
1512 tc->transfer = transfer;
1513
1514 return tc;
4c9e3812
GE
1515}
1516
1517/**
579b006f 1518 Wait for completion of the transfer.
4c9e3812 1519
249888c8 1520 Use libusb 1.0 asynchronous API.
4c9e3812 1521
579b006f 1522 \param tc pointer to ftdi_transfer_control
4c9e3812 1523
579b006f
JZ
1524 \retval < 0: Some error happens
1525 \retval >= 0: Data size transferred
4c9e3812 1526*/
579b006f
JZ
1527
1528int ftdi_transfer_data_done(struct ftdi_transfer_control *tc)
4c9e3812
GE
1529{
1530 int ret;
4c9e3812 1531
579b006f 1532 while (!tc->completed)
22d12cda 1533 {
29b1dfd9 1534 ret = libusb_handle_events(tc->ftdi->usb_ctx);
4c9e3812 1535 if (ret < 0)
579b006f
JZ
1536 {
1537 if (ret == LIBUSB_ERROR_INTERRUPTED)
1538 continue;
1539 libusb_cancel_transfer(tc->transfer);
1540 while (!tc->completed)
29b1dfd9 1541 if (libusb_handle_events(tc->ftdi->usb_ctx) < 0)
579b006f
JZ
1542 break;
1543 libusb_free_transfer(tc->transfer);
1544 free (tc);
579b006f
JZ
1545 return ret;
1546 }
4c9e3812
GE
1547 }
1548
90ef163e
YSL
1549 ret = tc->offset;
1550 /**
1551 * tc->transfer could be NULL if "(size <= ftdi->readbuffer_remaining)"
ef15fab5 1552 * at ftdi_read_data_submit(). Therefore, we need to check it here.
90ef163e 1553 **/
ef15fab5
TJ
1554 if (tc->transfer)
1555 {
1556 if (tc->transfer->status != LIBUSB_TRANSFER_COMPLETED)
1557 ret = -1;
1558 libusb_free_transfer(tc->transfer);
90ef163e 1559 }
579b006f
JZ
1560 free(tc);
1561 return ret;
4c9e3812 1562}
579b006f 1563
1941414d
TJ
1564/**
1565 Configure write buffer chunk size.
1566 Default is 4096.
1567
1568 \param ftdi pointer to ftdi_context
1569 \param chunksize Chunk size
a3da1d95 1570
1941414d 1571 \retval 0: all fine
22a1b5c1 1572 \retval -1: ftdi context invalid
1941414d 1573*/
a8f46ddc
TJ
1574int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1575{
22a1b5c1
TJ
1576 if (ftdi == NULL)
1577 ftdi_error_return(-1, "ftdi context invalid");
1578
948f9ada
TJ
1579 ftdi->writebuffer_chunksize = chunksize;
1580 return 0;
1581}
1582
1941414d
TJ
1583/**
1584 Get write buffer chunk size.
1585
1586 \param ftdi pointer to ftdi_context
1587 \param chunksize Pointer to store chunk size in
948f9ada 1588
1941414d 1589 \retval 0: all fine
22a1b5c1 1590 \retval -1: ftdi context invalid
1941414d 1591*/
a8f46ddc
TJ
1592int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1593{
22a1b5c1
TJ
1594 if (ftdi == NULL)
1595 ftdi_error_return(-1, "ftdi context invalid");
1596
948f9ada
TJ
1597 *chunksize = ftdi->writebuffer_chunksize;
1598 return 0;
1599}
cbabb7d3 1600
1941414d
TJ
1601/**
1602 Reads data in chunks (see ftdi_read_data_set_chunksize()) from the chip.
1603
1604 Automatically strips the two modem status bytes transfered during every read.
948f9ada 1605
1941414d
TJ
1606 \param ftdi pointer to ftdi_context
1607 \param buf Buffer to store data in
1608 \param size Size of the buffer
1609
22a1b5c1 1610 \retval -666: USB device unavailable
579b006f 1611 \retval <0: error code from libusb_bulk_transfer()
d77b0e94 1612 \retval 0: no data was available
1941414d
TJ
1613 \retval >0: number of bytes read
1614
1941414d 1615*/
a8f46ddc
TJ
1616int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1617{
579b006f 1618 int offset = 0, ret, i, num_of_chunks, chunk_remains;
e2f12a4f 1619 int packet_size = ftdi->max_packet_size;
579b006f 1620 int actual_length = 1;
f2f00cb5 1621
22a1b5c1
TJ
1622 if (ftdi == NULL || ftdi->usb_dev == NULL)
1623 ftdi_error_return(-666, "USB device unavailable");
1624
e2f12a4f
TJ
1625 // Packet size sanity check (avoid division by zero)
1626 if (packet_size == 0)
1627 ftdi_error_return(-1, "max_packet_size is bogus (zero)");
d9f0cce7 1628
948f9ada 1629 // everything we want is still in the readbuffer?
22d12cda
TJ
1630 if (size <= ftdi->readbuffer_remaining)
1631 {
d9f0cce7
TJ
1632 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1633
1634 // Fix offsets
1635 ftdi->readbuffer_remaining -= size;
1636 ftdi->readbuffer_offset += size;
1637
545820ce 1638 /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
d9f0cce7
TJ
1639
1640 return size;
979a145c 1641 }
948f9ada 1642 // something still in the readbuffer, but not enough to satisfy 'size'?
22d12cda
TJ
1643 if (ftdi->readbuffer_remaining != 0)
1644 {
d9f0cce7 1645 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
979a145c 1646
d9f0cce7
TJ
1647 // Fix offset
1648 offset += ftdi->readbuffer_remaining;
948f9ada 1649 }
948f9ada 1650 // do the actual USB read
579b006f 1651 while (offset < size && actual_length > 0)
22d12cda 1652 {
d9f0cce7
TJ
1653 ftdi->readbuffer_remaining = 0;
1654 ftdi->readbuffer_offset = 0;
98452d97 1655 /* returns how much received */
579b006f 1656 ret = libusb_bulk_transfer (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, &actual_length, ftdi->usb_read_timeout);
c3d95b87
TJ
1657 if (ret < 0)
1658 ftdi_error_return(ret, "usb bulk read failed");
98452d97 1659
579b006f 1660 if (actual_length > 2)
22d12cda 1661 {
d9f0cce7
TJ
1662 // skip FTDI status bytes.
1663 // Maybe stored in the future to enable modem use
579b006f
JZ
1664 num_of_chunks = actual_length / packet_size;
1665 chunk_remains = actual_length % packet_size;
1666 //printf("actual_length = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", actual_length, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1c733d33 1667
d9f0cce7 1668 ftdi->readbuffer_offset += 2;
579b006f 1669 actual_length -= 2;
1c733d33 1670
579b006f 1671 if (actual_length > packet_size - 2)
22d12cda 1672 {
1c733d33 1673 for (i = 1; i < num_of_chunks; i++)
f2f00cb5
DC
1674 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1675 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1676 packet_size - 2);
22d12cda
TJ
1677 if (chunk_remains > 2)
1678 {
f2f00cb5
DC
1679 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+(packet_size - 2)*i,
1680 ftdi->readbuffer+ftdi->readbuffer_offset+packet_size*i,
1c733d33 1681 chunk_remains-2);
579b006f 1682 actual_length -= 2*num_of_chunks;
22d12cda
TJ
1683 }
1684 else
579b006f 1685 actual_length -= 2*(num_of_chunks-1)+chunk_remains;
1c733d33 1686 }
22d12cda 1687 }
579b006f 1688 else if (actual_length <= 2)
22d12cda 1689 {
d9f0cce7
TJ
1690 // no more data to read?
1691 return offset;
1692 }
579b006f 1693 if (actual_length > 0)
22d12cda 1694 {
d9f0cce7 1695 // data still fits in buf?
579b006f 1696 if (offset+actual_length <= size)
22d12cda 1697 {
579b006f 1698 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, actual_length);
545820ce 1699 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
579b006f 1700 offset += actual_length;
d9f0cce7 1701
53ad271d 1702 /* Did we read exactly the right amount of bytes? */
d9f0cce7 1703 if (offset == size)
c4446c36
TJ
1704 //printf("read_data exact rem %d offset %d\n",
1705 //ftdi->readbuffer_remaining, offset);
d9f0cce7 1706 return offset;
22d12cda
TJ
1707 }
1708 else
1709 {
d9f0cce7
TJ
1710 // only copy part of the data or size <= readbuffer_chunksize
1711 int part_size = size-offset;
1712 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, part_size);
98452d97 1713
d9f0cce7 1714 ftdi->readbuffer_offset += part_size;
579b006f 1715 ftdi->readbuffer_remaining = actual_length-part_size;
d9f0cce7
TJ
1716 offset += part_size;
1717
579b006f
JZ
1718 /* printf("Returning part: %d - size: %d - offset: %d - actual_length: %d - remaining: %d\n",
1719 part_size, size, offset, actual_length, ftdi->readbuffer_remaining); */
d9f0cce7
TJ
1720
1721 return offset;
1722 }
1723 }
cbabb7d3 1724 }
948f9ada 1725 // never reached
29c4af7f 1726 return -127;
a3da1d95
GE
1727}
1728
1941414d
TJ
1729/**
1730 Configure read buffer chunk size.
1731 Default is 4096.
1732
1733 Automatically reallocates the buffer.
a3da1d95 1734
1941414d
TJ
1735 \param ftdi pointer to ftdi_context
1736 \param chunksize Chunk size
1737
1738 \retval 0: all fine
22a1b5c1 1739 \retval -1: ftdi context invalid
1941414d 1740*/
a8f46ddc
TJ
1741int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1742{
29c4af7f
TJ
1743 unsigned char *new_buf;
1744
22a1b5c1
TJ
1745 if (ftdi == NULL)
1746 ftdi_error_return(-1, "ftdi context invalid");
1747
948f9ada
TJ
1748 // Invalidate all remaining data
1749 ftdi->readbuffer_offset = 0;
1750 ftdi->readbuffer_remaining = 0;
8de6eea4
JZ
1751#ifdef __linux__
1752 /* We can't set readbuffer_chunksize larger than MAX_BULK_BUFFER_LENGTH,
1753 which is defined in libusb-1.0. Otherwise, each USB read request will
2e685a1f 1754 be divided into multiple URBs. This will cause issues on Linux kernel
8de6eea4
JZ
1755 older than 2.6.32. */
1756 if (chunksize > 16384)
1757 chunksize = 16384;
1758#endif
948f9ada 1759
c3d95b87
TJ
1760 if ((new_buf = (unsigned char *)realloc(ftdi->readbuffer, chunksize)) == NULL)
1761 ftdi_error_return(-1, "out of memory for readbuffer");
d9f0cce7 1762
948f9ada
TJ
1763 ftdi->readbuffer = new_buf;
1764 ftdi->readbuffer_chunksize = chunksize;
1765
1766 return 0;
1767}
1768
1941414d
TJ
1769/**
1770 Get read buffer chunk size.
948f9ada 1771
1941414d
TJ
1772 \param ftdi pointer to ftdi_context
1773 \param chunksize Pointer to store chunk size in
1774
1775 \retval 0: all fine
22a1b5c1 1776 \retval -1: FTDI context invalid
1941414d 1777*/
a8f46ddc
TJ
1778int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1779{
22a1b5c1
TJ
1780 if (ftdi == NULL)
1781 ftdi_error_return(-1, "FTDI context invalid");
1782
948f9ada
TJ
1783 *chunksize = ftdi->readbuffer_chunksize;
1784 return 0;
1785}
1786
1787
1941414d
TJ
1788/**
1789 Enable bitbang mode.
948f9ada 1790
fd282db3 1791 \deprecated use \ref ftdi_set_bitmode with mode BITMODE_BITBANG instead
1941414d
TJ
1792
1793 \param ftdi pointer to ftdi_context
1794 \param bitmask Bitmask to configure lines.
1795 HIGH/ON value configures a line as output.
1796
1797 \retval 0: all fine
1798 \retval -1: can't enable bitbang mode
22a1b5c1 1799 \retval -2: USB device unavailable
1941414d 1800*/
a8f46ddc
TJ
1801int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
1802{
a3da1d95
GE
1803 unsigned short usb_val;
1804
22a1b5c1
TJ
1805 if (ftdi == NULL || ftdi->usb_dev == NULL)
1806 ftdi_error_return(-2, "USB device unavailable");
1807
d9f0cce7 1808 usb_val = bitmask; // low byte: bitmask
3119537f
TJ
1809 /* FT2232C: Set bitbang_mode to 2 to enable SPI */
1810 usb_val |= (ftdi->bitbang_mode << 8);
1811
579b006f
JZ
1812 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
1813 SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index,
1814 NULL, 0, ftdi->usb_write_timeout) < 0)
c3d95b87
TJ
1815 ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
1816
a3da1d95
GE
1817 ftdi->bitbang_enabled = 1;
1818 return 0;
1819}
1820
1941414d
TJ
1821/**
1822 Disable bitbang mode.
a3da1d95 1823
1941414d
TJ
1824 \param ftdi pointer to ftdi_context
1825
1826 \retval 0: all fine
1827 \retval -1: can't disable bitbang mode
22a1b5c1 1828 \retval -2: USB device unavailable
1941414d 1829*/
a8f46ddc
TJ
1830int ftdi_disable_bitbang(struct ftdi_context *ftdi)
1831{
22a1b5c1
TJ
1832 if (ftdi == NULL || ftdi->usb_dev == NULL)
1833 ftdi_error_return(-2, "USB device unavailable");
1834
579b006f 1835 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
c3d95b87 1836 ftdi_error_return(-1, "unable to leave bitbang mode. Perhaps not a BM type chip?");
a3da1d95
GE
1837
1838 ftdi->bitbang_enabled = 0;
1839 return 0;
1840}
1841
1941414d 1842/**
418aaa72 1843 Enable/disable bitbang modes.
a3da1d95 1844
1941414d
TJ
1845 \param ftdi pointer to ftdi_context
1846 \param bitmask Bitmask to configure lines.
1847 HIGH/ON value configures a line as output.
fd282db3 1848 \param mode Bitbang mode: use the values defined in \ref ftdi_mpsse_mode
1941414d
TJ
1849
1850 \retval 0: all fine
1851 \retval -1: can't enable bitbang mode
22a1b5c1 1852 \retval -2: USB device unavailable
1941414d 1853*/
c4446c36
TJ
1854int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
1855{
1856 unsigned short usb_val;
1857
22a1b5c1
TJ
1858 if (ftdi == NULL || ftdi->usb_dev == NULL)
1859 ftdi_error_return(-2, "USB device unavailable");
1860
c4446c36
TJ
1861 usb_val = bitmask; // low byte: bitmask
1862 usb_val |= (mode << 8);
579b006f
JZ
1863 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_BITMODE_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1864 ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps not a 2232C type chip?");
c4446c36
TJ
1865
1866 ftdi->bitbang_mode = mode;
418aaa72 1867 ftdi->bitbang_enabled = (mode == BITMODE_RESET) ? 0 : 1;
c4446c36
TJ
1868 return 0;
1869}
1870
1941414d 1871/**
418aaa72 1872 Directly read pin state, circumventing the read buffer. Useful for bitbang mode.
1941414d
TJ
1873
1874 \param ftdi pointer to ftdi_context
1875 \param pins Pointer to store pins into
1876
1877 \retval 0: all fine
1878 \retval -1: read pins failed
22a1b5c1 1879 \retval -2: USB device unavailable
1941414d 1880*/
a8f46ddc
TJ
1881int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins)
1882{
22a1b5c1
TJ
1883 if (ftdi == NULL || ftdi->usb_dev == NULL)
1884 ftdi_error_return(-2, "USB device unavailable");
1885
579b006f 1886 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_PINS_REQUEST, 0, ftdi->index, (unsigned char *)pins, 1, ftdi->usb_read_timeout) != 1)
c3d95b87 1887 ftdi_error_return(-1, "read pins failed");
a3da1d95 1888
a3da1d95
GE
1889 return 0;
1890}
1891
1941414d
TJ
1892/**
1893 Set latency timer
1894
1895 The FTDI chip keeps data in the internal buffer for a specific
1896 amount of time if the buffer is not full yet to decrease
1897 load on the usb bus.
a3da1d95 1898
1941414d
TJ
1899 \param ftdi pointer to ftdi_context
1900 \param latency Value between 1 and 255
1901
1902 \retval 0: all fine
1903 \retval -1: latency out of range
1904 \retval -2: unable to set latency timer
22a1b5c1 1905 \retval -3: USB device unavailable
1941414d 1906*/
a8f46ddc
TJ
1907int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
1908{
a3da1d95
GE
1909 unsigned short usb_val;
1910
c3d95b87
TJ
1911 if (latency < 1)
1912 ftdi_error_return(-1, "latency out of range. Only valid for 1-255");
a3da1d95 1913
22a1b5c1
TJ
1914 if (ftdi == NULL || ftdi->usb_dev == NULL)
1915 ftdi_error_return(-3, "USB device unavailable");
1916
d79d2e68 1917 usb_val = latency;
579b006f 1918 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_LATENCY_TIMER_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
c3d95b87
TJ
1919 ftdi_error_return(-2, "unable to set latency timer");
1920
a3da1d95
GE
1921 return 0;
1922}
1923
1941414d
TJ
1924/**
1925 Get latency timer
a3da1d95 1926
1941414d
TJ
1927 \param ftdi pointer to ftdi_context
1928 \param latency Pointer to store latency value in
1929
1930 \retval 0: all fine
1931 \retval -1: unable to get latency timer
22a1b5c1 1932 \retval -2: USB device unavailable
1941414d 1933*/
a8f46ddc
TJ
1934int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency)
1935{
a3da1d95 1936 unsigned short usb_val;
22a1b5c1
TJ
1937
1938 if (ftdi == NULL || ftdi->usb_dev == NULL)
1939 ftdi_error_return(-2, "USB device unavailable");
1940
579b006f 1941 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_GET_LATENCY_TIMER_REQUEST, 0, ftdi->index, (unsigned char *)&usb_val, 1, ftdi->usb_read_timeout) != 1)
c3d95b87 1942 ftdi_error_return(-1, "reading latency timer failed");
a3da1d95
GE
1943
1944 *latency = (unsigned char)usb_val;
1945 return 0;
1946}
1947
1941414d 1948/**
1189b11a
TJ
1949 Poll modem status information
1950
1951 This function allows the retrieve the two status bytes of the device.
1952 The device sends these bytes also as a header for each read access
1953 where they are discarded by ftdi_read_data(). The chip generates
1954 the two stripped status bytes in the absence of data every 40 ms.
1955
1956 Layout of the first byte:
1957 - B0..B3 - must be 0
1958 - B4 Clear to send (CTS)
1959 0 = inactive
1960 1 = active
1961 - B5 Data set ready (DTS)
1962 0 = inactive
1963 1 = active
1964 - B6 Ring indicator (RI)
1965 0 = inactive
1966 1 = active
1967 - B7 Receive line signal detect (RLSD)
1968 0 = inactive
1969 1 = active
1970
1971 Layout of the second byte:
1972 - B0 Data ready (DR)
1973 - B1 Overrun error (OE)
1974 - B2 Parity error (PE)
1975 - B3 Framing error (FE)
1976 - B4 Break interrupt (BI)
1977 - B5 Transmitter holding register (THRE)
1978 - B6 Transmitter empty (TEMT)
1979 - B7 Error in RCVR FIFO
1980
1981 \param ftdi pointer to ftdi_context
1982 \param status Pointer to store status information in. Must be two bytes.
1983
1984 \retval 0: all fine
1985 \retval -1: unable to retrieve status information
22a1b5c1 1986 \retval -2: USB device unavailable
1189b11a
TJ
1987*/
1988int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status)
1989{
1990 char usb_val[2];
1991
22a1b5c1
TJ
1992 if (ftdi == NULL || ftdi->usb_dev == NULL)
1993 ftdi_error_return(-2, "USB device unavailable");
1994
579b006f 1995 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_POLL_MODEM_STATUS_REQUEST, 0, ftdi->index, (unsigned char *)usb_val, 2, ftdi->usb_read_timeout) != 2)
1189b11a
TJ
1996 ftdi_error_return(-1, "getting modem status failed");
1997
dc09eaa8 1998 *status = (usb_val[1] << 8) | (usb_val[0] & 0xFF);
1189b11a
TJ
1999
2000 return 0;
2001}
2002
a7fb8440
TJ
2003/**
2004 Set flowcontrol for ftdi chip
2005
2006 \param ftdi pointer to ftdi_context
22d12cda
TJ
2007 \param flowctrl flow control to use. should be
2008 SIO_DISABLE_FLOW_CTRL, SIO_RTS_CTS_HS, SIO_DTR_DSR_HS or SIO_XON_XOFF_HS
a7fb8440
TJ
2009
2010 \retval 0: all fine
2011 \retval -1: set flow control failed
22a1b5c1 2012 \retval -2: USB device unavailable
a7fb8440
TJ
2013*/
2014int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl)
2015{
22a1b5c1
TJ
2016 if (ftdi == NULL || ftdi->usb_dev == NULL)
2017 ftdi_error_return(-2, "USB device unavailable");
2018
579b006f
JZ
2019 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2020 SIO_SET_FLOW_CTRL_REQUEST, 0, (flowctrl | ftdi->index),
2021 NULL, 0, ftdi->usb_write_timeout) < 0)
a7fb8440
TJ
2022 ftdi_error_return(-1, "set flow control failed");
2023
2024 return 0;
2025}
2026
2027/**
2028 Set dtr line
2029
2030 \param ftdi pointer to ftdi_context
2031 \param state state to set line to (1 or 0)
2032
2033 \retval 0: all fine
2034 \retval -1: set dtr failed
22a1b5c1 2035 \retval -2: USB device unavailable
a7fb8440
TJ
2036*/
2037int ftdi_setdtr(struct ftdi_context *ftdi, int state)
2038{
2039 unsigned short usb_val;
2040
22a1b5c1
TJ
2041 if (ftdi == NULL || ftdi->usb_dev == NULL)
2042 ftdi_error_return(-2, "USB device unavailable");
2043
a7fb8440
TJ
2044 if (state)
2045 usb_val = SIO_SET_DTR_HIGH;
2046 else
2047 usb_val = SIO_SET_DTR_LOW;
2048
579b006f
JZ
2049 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2050 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2051 NULL, 0, ftdi->usb_write_timeout) < 0)
a7fb8440
TJ
2052 ftdi_error_return(-1, "set dtr failed");
2053
2054 return 0;
2055}
2056
2057/**
2058 Set rts line
2059
2060 \param ftdi pointer to ftdi_context
2061 \param state state to set line to (1 or 0)
2062
2063 \retval 0: all fine
22a1b5c1
TJ
2064 \retval -1: set rts failed
2065 \retval -2: USB device unavailable
a7fb8440
TJ
2066*/
2067int ftdi_setrts(struct ftdi_context *ftdi, int state)
2068{
2069 unsigned short usb_val;
2070
22a1b5c1
TJ
2071 if (ftdi == NULL || ftdi->usb_dev == NULL)
2072 ftdi_error_return(-2, "USB device unavailable");
2073
a7fb8440
TJ
2074 if (state)
2075 usb_val = SIO_SET_RTS_HIGH;
2076 else
2077 usb_val = SIO_SET_RTS_LOW;
2078
579b006f
JZ
2079 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2080 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2081 NULL, 0, ftdi->usb_write_timeout) < 0)
a7fb8440
TJ
2082 ftdi_error_return(-1, "set of rts failed");
2083
2084 return 0;
2085}
2086
1189b11a 2087/**
22a1b5c1 2088 Set dtr and rts line in one pass
9ecfef2a 2089
22a1b5c1
TJ
2090 \param ftdi pointer to ftdi_context
2091 \param dtr DTR state to set line to (1 or 0)
2092 \param rts RTS state to set line to (1 or 0)
9ecfef2a 2093
22a1b5c1
TJ
2094 \retval 0: all fine
2095 \retval -1: set dtr/rts failed
2096 \retval -2: USB device unavailable
9ecfef2a
TJ
2097 */
2098int ftdi_setdtr_rts(struct ftdi_context *ftdi, int dtr, int rts)
2099{
2100 unsigned short usb_val;
2101
22a1b5c1
TJ
2102 if (ftdi == NULL || ftdi->usb_dev == NULL)
2103 ftdi_error_return(-2, "USB device unavailable");
2104
9ecfef2a 2105 if (dtr)
22d12cda 2106 usb_val = SIO_SET_DTR_HIGH;
9ecfef2a 2107 else
22d12cda 2108 usb_val = SIO_SET_DTR_LOW;
9ecfef2a
TJ
2109
2110 if (rts)
22d12cda 2111 usb_val |= SIO_SET_RTS_HIGH;
9ecfef2a 2112 else
22d12cda 2113 usb_val |= SIO_SET_RTS_LOW;
9ecfef2a 2114
579b006f
JZ
2115 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
2116 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->index,
2117 NULL, 0, ftdi->usb_write_timeout) < 0)
22d12cda 2118 ftdi_error_return(-1, "set of rts/dtr failed");
9ecfef2a
TJ
2119
2120 return 0;
2121}
2122
2123/**
1189b11a
TJ
2124 Set the special event character
2125
2126 \param ftdi pointer to ftdi_context
2127 \param eventch Event character
2128 \param enable 0 to disable the event character, non-zero otherwise
2129
2130 \retval 0: all fine
2131 \retval -1: unable to set event character
22a1b5c1 2132 \retval -2: USB device unavailable
1189b11a
TJ
2133*/
2134int ftdi_set_event_char(struct ftdi_context *ftdi,
22d12cda 2135 unsigned char eventch, unsigned char enable)
1189b11a
TJ
2136{
2137 unsigned short usb_val;
2138
22a1b5c1
TJ
2139 if (ftdi == NULL || ftdi->usb_dev == NULL)
2140 ftdi_error_return(-2, "USB device unavailable");
2141
1189b11a
TJ
2142 usb_val = eventch;
2143 if (enable)
2144 usb_val |= 1 << 8;
2145
579b006f 2146 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_EVENT_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1189b11a
TJ
2147 ftdi_error_return(-1, "setting event character failed");
2148
2149 return 0;
2150}
2151
2152/**
2153 Set error character
2154
2155 \param ftdi pointer to ftdi_context
2156 \param errorch Error character
2157 \param enable 0 to disable the error character, non-zero otherwise
2158
2159 \retval 0: all fine
2160 \retval -1: unable to set error character
22a1b5c1 2161 \retval -2: USB device unavailable
1189b11a
TJ
2162*/
2163int ftdi_set_error_char(struct ftdi_context *ftdi,
22d12cda 2164 unsigned char errorch, unsigned char enable)
1189b11a
TJ
2165{
2166 unsigned short usb_val;
2167
22a1b5c1
TJ
2168 if (ftdi == NULL || ftdi->usb_dev == NULL)
2169 ftdi_error_return(-2, "USB device unavailable");
2170
1189b11a
TJ
2171 usb_val = errorch;
2172 if (enable)
2173 usb_val |= 1 << 8;
2174
579b006f 2175 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_SET_ERROR_CHAR_REQUEST, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) < 0)
1189b11a
TJ
2176 ftdi_error_return(-1, "setting error character failed");
2177
2178 return 0;
2179}
2180
2181/**
44f41f11 2182 Init eeprom with default values for the connected device
a35aa9bd 2183 \param ftdi pointer to ftdi_context
f14f84d3
UB
2184 \param manufacturer String to use as Manufacturer
2185 \param product String to use as Product description
2186 \param serial String to use as Serial number description
4e74064b 2187
f14f84d3
UB
2188 \retval 0: all fine
2189 \retval -1: No struct ftdi_context
2190 \retval -2: No struct ftdi_eeprom
44f41f11 2191 \retval -3: No connected device or device not yet opened
1941414d 2192*/
f14f84d3 2193int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, char * manufacturer,
56ac0383 2194 char * product, char * serial)
a8f46ddc 2195{
c0a96aed 2196 struct ftdi_eeprom *eeprom;
f505134f 2197
c0a96aed 2198 if (ftdi == NULL)
f14f84d3 2199 ftdi_error_return(-1, "No struct ftdi_context");
c0a96aed
UB
2200
2201 if (ftdi->eeprom == NULL)
56ac0383 2202 ftdi_error_return(-2,"No struct ftdi_eeprom");
22a1b5c1 2203
c0a96aed 2204 eeprom = ftdi->eeprom;
a02587d5 2205 memset(eeprom, 0, sizeof(struct ftdi_eeprom));
c0a96aed 2206
44f41f11
UB
2207 if (ftdi->usb_dev == NULL)
2208 ftdi_error_return(-3, "No connected device or device not yet opened");
2209
f396dbad 2210 eeprom->vendor_id = 0x0403;
a02587d5 2211 eeprom->use_serial = USE_SERIAL_NUM;
56ac0383
TJ
2212 if ((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM) ||
2213 (ftdi->type == TYPE_R))
a02587d5 2214 eeprom->product_id = 0x6001;
c7e4c09e
UB
2215 else if (ftdi->type == TYPE_4232H)
2216 eeprom->product_id = 0x6011;
2217 else if (ftdi->type == TYPE_232H)
2218 eeprom->product_id = 0x6014;
a02587d5
UB
2219 else
2220 eeprom->product_id = 0x6010;
b1859923
UB
2221 if (ftdi->type == TYPE_AM)
2222 eeprom->usb_version = 0x0101;
2223 else
2224 eeprom->usb_version = 0x0200;
a886436a 2225 eeprom->max_power = 100;
d9f0cce7 2226
74e8e79d
UB
2227 if (eeprom->manufacturer)
2228 free (eeprom->manufacturer);
b8aa7b35 2229 eeprom->manufacturer = NULL;
74e8e79d
UB
2230 if (manufacturer)
2231 {
2232 eeprom->manufacturer = malloc(strlen(manufacturer)+1);
2233 if (eeprom->manufacturer)
2234 strcpy(eeprom->manufacturer, manufacturer);
2235 }
2236
2237 if (eeprom->product)
2238 free (eeprom->product);
b8aa7b35 2239 eeprom->product = NULL;
10771971 2240 if(product)
74e8e79d
UB
2241 {
2242 eeprom->product = malloc(strlen(product)+1);
2243 if (eeprom->product)
2244 strcpy(eeprom->product, product);
2245 }
2246
2247 if (eeprom->serial)
2248 free (eeprom->serial);
b8aa7b35 2249 eeprom->serial = NULL;
74e8e79d
UB
2250 if (serial)
2251 {
2252 eeprom->serial = malloc(strlen(serial)+1);
2253 if (eeprom->serial)
2254 strcpy(eeprom->serial, serial);
2255 }
2256
c201f80f 2257
56ac0383 2258 if (ftdi->type == TYPE_R)
a4980043 2259 {
a886436a 2260 eeprom->max_power = 90;
a02587d5 2261 eeprom->size = 0x80;
a4980043
UB
2262 eeprom->cbus_function[0] = CBUS_TXLED;
2263 eeprom->cbus_function[1] = CBUS_RXLED;
2264 eeprom->cbus_function[2] = CBUS_TXDEN;
2265 eeprom->cbus_function[3] = CBUS_PWREN;
2266 eeprom->cbus_function[4] = CBUS_SLEEP;
2267 }
a02587d5 2268 else
263d3ba0
UB
2269 {
2270 if(ftdi->type == TYPE_232H)
2271 {
2272 int i;
2273 for (i=0; i<10; i++)
2274 eeprom->cbus_function[i] = CBUSH_TRISTATE;
2275 }
a02587d5 2276 eeprom->size = -1;
263d3ba0 2277 }
44f41f11 2278 eeprom->initialized_for_connected_device = 1;
f14f84d3 2279 return 0;
b8aa7b35 2280}
263d3ba0
UB
2281/*FTD2XX doesn't check for values not fitting in the ACBUS Signal oprtions*/
2282void set_ft232h_cbus(struct ftdi_eeprom *eeprom, unsigned char * output)
2283{
2284 int i;
2285 for(i=0; i<5;i++)
2286 {
2287 int mode_low, mode_high;
2288 if (eeprom->cbus_function[2*i]> CBUSH_CLK7_5)
2289 mode_low = CBUSH_TRISTATE;
2290 else
2291 mode_low = eeprom->cbus_function[2*i];
2292 if (eeprom->cbus_function[2*i+1]> CBUSH_CLK7_5)
2293 mode_high = CBUSH_TRISTATE;
2294 else
2295 mode_high = eeprom->cbus_function[2*i];
b8aa7b35 2296
263d3ba0
UB
2297 output[0x18+i] = mode_high <<4 | mode_low;
2298 }
2299}
c8f69686
UB
2300/* Return the bits for the encoded EEPROM Structure of a requested Mode
2301 *
2302 */
2303static unsigned char type2bit(unsigned char type, enum ftdi_chip_type chip)
2304{
2305 switch (chip)
2306 {
2307 case TYPE_2232H:
2308 case TYPE_2232C:
2309 {
2310 switch (type)
2311 {
2312 case CHANNEL_IS_UART: return 0;
2313 case CHANNEL_IS_FIFO: return 0x01;
2314 case CHANNEL_IS_OPTO: return 0x02;
2315 case CHANNEL_IS_CPU : return 0x04;
2316 default: return 0;
2317 }
2318 }
2319 case TYPE_232H:
2320 {
2321 switch (type)
2322 {
2323 case CHANNEL_IS_UART : return 0;
2324 case CHANNEL_IS_FIFO : return 0x01;
2325 case CHANNEL_IS_OPTO : return 0x02;
2326 case CHANNEL_IS_CPU : return 0x04;
2327 case CHANNEL_IS_FT1284 : return 0x08;
2328 default: return 0;
2329 }
2330 }
2331 default: return 0;
2332 }
2333 return 0;
2334}
2335
1941414d 2336/**
a35aa9bd 2337 Build binary buffer from ftdi_eeprom structure.
22a1b5c1 2338 Output is suitable for ftdi_write_eeprom().
b8aa7b35 2339
a35aa9bd 2340 \param ftdi pointer to ftdi_context
1941414d 2341
516ebfb1 2342 \retval >=0: size of eeprom user area in bytes
22a1b5c1 2343 \retval -1: eeprom size (128 bytes) exceeded by custom strings
2c1e2bde
TJ
2344 \retval -2: Invalid eeprom or ftdi pointer
2345 \retval -3: Invalid cbus function setting (FIXME: Not in the code?)
2346 \retval -4: Chip doesn't support invert (FIXME: Not in the code?)
2347 \retval -5: Chip doesn't support high current drive (FIXME: Not in the code?)
2b9a3c82 2348 \retval -6: No connected EEPROM or EEPROM Type unknown
b8aa7b35 2349*/
a35aa9bd 2350int ftdi_eeprom_build(struct ftdi_context *ftdi)
a8f46ddc 2351{
e2bbd9af 2352 unsigned char i, j, eeprom_size_mask;
b8aa7b35
TJ
2353 unsigned short checksum, value;
2354 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
516ebfb1 2355 int user_area_size;
c0a96aed 2356 struct ftdi_eeprom *eeprom;
a35aa9bd 2357 unsigned char * output;
b8aa7b35 2358
c0a96aed 2359 if (ftdi == NULL)
cc9c9d58 2360 ftdi_error_return(-2,"No context");
c0a96aed 2361 if (ftdi->eeprom == NULL)
cc9c9d58 2362 ftdi_error_return(-2,"No eeprom structure");
c0a96aed
UB
2363
2364 eeprom= ftdi->eeprom;
a35aa9bd 2365 output = eeprom->buf;
22a1b5c1 2366
56ac0383 2367 if (eeprom->chip == -1)
2c1e2bde 2368 ftdi_error_return(-6,"No connected EEPROM or EEPROM type unknown");
2b9a3c82 2369
f75bf139
UB
2370 if ((eeprom->chip == 0x56) || (eeprom->chip == 0x66))
2371 eeprom->size = 0x100;
2372 else
2373 eeprom->size = 0x80;
2374
b8aa7b35 2375 if (eeprom->manufacturer != NULL)
d9f0cce7 2376 manufacturer_size = strlen(eeprom->manufacturer);
b8aa7b35 2377 if (eeprom->product != NULL)
d9f0cce7 2378 product_size = strlen(eeprom->product);
b8aa7b35 2379 if (eeprom->serial != NULL)
d9f0cce7 2380 serial_size = strlen(eeprom->serial);
b8aa7b35 2381
814710ba
TJ
2382 // eeprom size check
2383 switch (ftdi->type)
2384 {
2385 case TYPE_AM:
2386 case TYPE_BM:
2387 user_area_size = 96; // base size for strings (total of 48 characters)
2388 break;
2389 case TYPE_2232C:
56ac0383
TJ
2390 user_area_size = 90; // two extra config bytes and 4 bytes PnP stuff
2391 break;
814710ba 2392 case TYPE_R:
56ac0383
TJ
2393 user_area_size = 88; // four extra config bytes + 4 bytes PnP stuff
2394 break;
814710ba
TJ
2395 case TYPE_2232H: // six extra config bytes + 4 bytes PnP stuff
2396 case TYPE_4232H:
56ac0383 2397 user_area_size = 86;
118c4561 2398 break;
c1c3d564
UB
2399 case TYPE_232H:
2400 user_area_size = 80;
2401 break;
2c1e2bde
TJ
2402 default:
2403 user_area_size = 0;
56ac0383 2404 break;
665cda04
UB
2405 }
2406 user_area_size -= (manufacturer_size + product_size + serial_size) * 2;
814710ba 2407
516ebfb1
TJ
2408 if (user_area_size < 0)
2409 ftdi_error_return(-1,"eeprom size exceeded");
b8aa7b35
TJ
2410
2411 // empty eeprom
a35aa9bd 2412 memset (ftdi->eeprom->buf, 0, FTDI_MAX_EEPROM_SIZE);
b8aa7b35 2413
93738c79
UB
2414 // Bytes and Bits set for all Types
2415
b8aa7b35
TJ
2416 // Addr 02: Vendor ID
2417 output[0x02] = eeprom->vendor_id;
2418 output[0x03] = eeprom->vendor_id >> 8;
2419
2420 // Addr 04: Product ID
2421 output[0x04] = eeprom->product_id;
2422 output[0x05] = eeprom->product_id >> 8;
2423
2424 // Addr 06: Device release number (0400h for BM features)
2425 output[0x06] = 0x00;
814710ba
TJ
2426 switch (ftdi->type)
2427 {
f505134f
HK
2428 case TYPE_AM:
2429 output[0x07] = 0x02;
2430 break;
2431 case TYPE_BM:
2432 output[0x07] = 0x04;
2433 break;
2434 case TYPE_2232C:
2435 output[0x07] = 0x05;
2436 break;
2437 case TYPE_R:
2438 output[0x07] = 0x06;
2439 break;
56ac0383 2440 case TYPE_2232H:
6123f7ab
UB
2441 output[0x07] = 0x07;
2442 break;
56ac0383 2443 case TYPE_4232H:
6123f7ab
UB
2444 output[0x07] = 0x08;
2445 break;
c7e4c09e
UB
2446 case TYPE_232H:
2447 output[0x07] = 0x09;
2448 break;
f505134f
HK
2449 default:
2450 output[0x07] = 0x00;
2451 }
b8aa7b35
TJ
2452
2453 // Addr 08: Config descriptor
8fae3e8e
TJ
2454 // Bit 7: always 1
2455 // Bit 6: 1 if this device is self powered, 0 if bus powered
2456 // Bit 5: 1 if this device uses remote wakeup
37186e34 2457 // Bit 4-0: reserved - 0
5a1dcd55 2458 j = 0x80;
b8aa7b35 2459 if (eeprom->self_powered == 1)
5a1dcd55 2460 j |= 0x40;
b8aa7b35 2461 if (eeprom->remote_wakeup == 1)
5a1dcd55 2462 j |= 0x20;
b8aa7b35
TJ
2463 output[0x08] = j;
2464
2465 // Addr 09: Max power consumption: max power = value * 2 mA
bb5ec68a 2466 output[0x09] = eeprom->max_power>>1;
d9f0cce7 2467
56ac0383 2468 if (ftdi->type != TYPE_AM)
93738c79
UB
2469 {
2470 // Addr 0A: Chip configuration
2471 // Bit 7: 0 - reserved
2472 // Bit 6: 0 - reserved
2473 // Bit 5: 0 - reserved
56ac0383 2474 // Bit 4: 1 - Change USB version
93738c79
UB
2475 // Bit 3: 1 - Use the serial number string
2476 // Bit 2: 1 - Enable suspend pull downs for lower power
2477 // Bit 1: 1 - Out EndPoint is Isochronous
2478 // Bit 0: 1 - In EndPoint is Isochronous
2479 //
2480 j = 0;
2481 if (eeprom->in_is_isochronous == 1)
2482 j = j | 1;
2483 if (eeprom->out_is_isochronous == 1)
2484 j = j | 2;
2485 output[0x0A] = j;
2486 }
f505134f 2487
b8aa7b35 2488 // Dynamic content
93738c79
UB
2489 // Strings start at 0x94 (TYPE_AM, TYPE_BM)
2490 // 0x96 (TYPE_2232C), 0x98 (TYPE_R) and 0x9a (TYPE_x232H)
c7e4c09e 2491 // 0xa0 (TYPE_232H)
93738c79 2492 i = 0;
56ac0383
TJ
2493 switch (ftdi->type)
2494 {
c7e4c09e
UB
2495 case TYPE_232H:
2496 i += 2;
56ac0383
TJ
2497 case TYPE_2232H:
2498 case TYPE_4232H:
2499 i += 2;
2500 case TYPE_R:
2501 i += 2;
2502 case TYPE_2232C:
2503 i += 2;
2504 case TYPE_AM:
2505 case TYPE_BM:
2506 i += 0x94;
f505134f 2507 }
93738c79 2508 /* Wrap around 0x80 for 128 byte EEPROMS (Internale and 93x46) */
e2bbd9af 2509 eeprom_size_mask = eeprom->size -1;
c201f80f 2510
93738c79
UB
2511 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2512 // Addr 0F: Length of manufacturer string
22d12cda 2513 // Output manufacturer
93738c79 2514 output[0x0E] = i; // calculate offset
e2bbd9af
TJ
2515 output[i & eeprom_size_mask] = manufacturer_size*2 + 2, i++;
2516 output[i & eeprom_size_mask] = 0x03, i++; // type: string
22d12cda
TJ
2517 for (j = 0; j < manufacturer_size; j++)
2518 {
e2bbd9af
TJ
2519 output[i & eeprom_size_mask] = eeprom->manufacturer[j], i++;
2520 output[i & eeprom_size_mask] = 0x00, i++;
b8aa7b35 2521 }
93738c79 2522 output[0x0F] = manufacturer_size*2 + 2;
b8aa7b35 2523
93738c79
UB
2524 // Addr 10: Offset of the product string + 0x80, calculated later
2525 // Addr 11: Length of product string
c201f80f 2526 output[0x10] = i | 0x80; // calculate offset
e2bbd9af
TJ
2527 output[i & eeprom_size_mask] = product_size*2 + 2, i++;
2528 output[i & eeprom_size_mask] = 0x03, i++;
22d12cda
TJ
2529 for (j = 0; j < product_size; j++)
2530 {
e2bbd9af
TJ
2531 output[i & eeprom_size_mask] = eeprom->product[j], i++;
2532 output[i & eeprom_size_mask] = 0x00, i++;
b8aa7b35 2533 }
93738c79 2534 output[0x11] = product_size*2 + 2;
37186e34 2535
93738c79
UB
2536 // Addr 12: Offset of the serial string + 0x80, calculated later
2537 // Addr 13: Length of serial string
c201f80f 2538 output[0x12] = i | 0x80; // calculate offset
e2bbd9af
TJ
2539 output[i & eeprom_size_mask] = serial_size*2 + 2, i++;
2540 output[i & eeprom_size_mask] = 0x03, i++;
22d12cda
TJ
2541 for (j = 0; j < serial_size; j++)
2542 {
e2bbd9af
TJ
2543 output[i & eeprom_size_mask] = eeprom->serial[j], i++;
2544 output[i & eeprom_size_mask] = 0x00, i++;
b8aa7b35 2545 }
c2700d6d
TJ
2546
2547 // Legacy port name and PnP fields for FT2232 and newer chips
2548 if (ftdi->type > TYPE_BM)
2549 {
2550 output[i & eeprom_size_mask] = 0x02; /* as seen when written with FTD2XX */
2551 i++;
2552 output[i & eeprom_size_mask] = 0x03; /* as seen when written with FTD2XX */
2553 i++;
2554 output[i & eeprom_size_mask] = eeprom->is_not_pnp; /* as seen when written with FTD2XX */
2555 i++;
2556 }
802a949e 2557
93738c79 2558 output[0x13] = serial_size*2 + 2;
b8aa7b35 2559
56ac0383 2560 if (ftdi->type > TYPE_AM) /* use_serial not used in AM devices */
bf2f6ef7
UB
2561 {
2562 if (eeprom->use_serial == USE_SERIAL_NUM )
2563 output[0x0A] |= USE_SERIAL_NUM;
2564 else
2565 output[0x0A] &= ~USE_SERIAL_NUM;
2566 }
3802140c
UB
2567
2568 /* Bytes and Bits specific to (some) types
2569 Write linear, as this allows easier fixing*/
56ac0383
TJ
2570 switch (ftdi->type)
2571 {
2572 case TYPE_AM:
2573 break;
2574 case TYPE_BM:
2575 output[0x0C] = eeprom->usb_version & 0xff;
2576 output[0x0D] = (eeprom->usb_version>>8) & 0xff;
2577 if (eeprom->use_usb_version == USE_USB_VERSION_BIT)
2578 output[0x0A] |= USE_USB_VERSION_BIT;
2579 else
2580 output[0x0A] &= ~USE_USB_VERSION_BIT;
caec1294 2581
56ac0383
TJ
2582 break;
2583 case TYPE_2232C:
3802140c 2584
c8f69686 2585 output[0x00] = type2bit(eeprom->channel_a_type, TYPE_2232C);
56ac0383
TJ
2586 if ( eeprom->channel_a_driver == DRIVER_VCP)
2587 output[0x00] |= DRIVER_VCP;
2588 else
2589 output[0x00] &= ~DRIVER_VCP;
4e74064b 2590
56ac0383
TJ
2591 if ( eeprom->high_current_a == HIGH_CURRENT_DRIVE)
2592 output[0x00] |= HIGH_CURRENT_DRIVE;
2593 else
2594 output[0x00] &= ~HIGH_CURRENT_DRIVE;
3802140c 2595
c8f69686 2596 output[0x01] = type2bit(eeprom->channel_b_type, TYPE_2232C);
56ac0383
TJ
2597 if ( eeprom->channel_b_driver == DRIVER_VCP)
2598 output[0x01] |= DRIVER_VCP;
2599 else
2600 output[0x01] &= ~DRIVER_VCP;
4e74064b 2601
56ac0383
TJ
2602 if ( eeprom->high_current_b == HIGH_CURRENT_DRIVE)
2603 output[0x01] |= HIGH_CURRENT_DRIVE;
2604 else
2605 output[0x01] &= ~HIGH_CURRENT_DRIVE;
3802140c 2606
56ac0383
TJ
2607 if (eeprom->in_is_isochronous == 1)
2608 output[0x0A] |= 0x1;
2609 else
2610 output[0x0A] &= ~0x1;
2611 if (eeprom->out_is_isochronous == 1)
2612 output[0x0A] |= 0x2;
2613 else
2614 output[0x0A] &= ~0x2;
2615 if (eeprom->suspend_pull_downs == 1)
2616 output[0x0A] |= 0x4;
2617 else
2618 output[0x0A] &= ~0x4;
2619 if (eeprom->use_usb_version == USE_USB_VERSION_BIT)
2620 output[0x0A] |= USE_USB_VERSION_BIT;
2621 else
2622 output[0x0A] &= ~USE_USB_VERSION_BIT;
4e74064b 2623
56ac0383
TJ
2624 output[0x0C] = eeprom->usb_version & 0xff;
2625 output[0x0D] = (eeprom->usb_version>>8) & 0xff;
2626 output[0x14] = eeprom->chip;
2627 break;
2628 case TYPE_R:
2629 if (eeprom->high_current == HIGH_CURRENT_DRIVE_R)
2630 output[0x00] |= HIGH_CURRENT_DRIVE_R;
2631 output[0x01] = 0x40; /* Hard coded Endpoint Size*/
4e74064b 2632
56ac0383
TJ
2633 if (eeprom->suspend_pull_downs == 1)
2634 output[0x0A] |= 0x4;
2635 else
2636 output[0x0A] &= ~0x4;
2637 output[0x0B] = eeprom->invert;
2638 output[0x0C] = eeprom->usb_version & 0xff;
2639 output[0x0D] = (eeprom->usb_version>>8) & 0xff;
4e74064b 2640
56ac0383
TJ
2641 if (eeprom->cbus_function[0] > CBUS_BB)
2642 output[0x14] = CBUS_TXLED;
2643 else
2644 output[0x14] = eeprom->cbus_function[0];
4e74064b 2645
56ac0383
TJ
2646 if (eeprom->cbus_function[1] > CBUS_BB)
2647 output[0x14] |= CBUS_RXLED<<4;
2648 else
2649 output[0x14] |= eeprom->cbus_function[1]<<4;
4e74064b 2650
56ac0383
TJ
2651 if (eeprom->cbus_function[2] > CBUS_BB)
2652 output[0x15] = CBUS_TXDEN;
2653 else
2654 output[0x15] = eeprom->cbus_function[2];
4e74064b 2655
56ac0383
TJ
2656 if (eeprom->cbus_function[3] > CBUS_BB)
2657 output[0x15] |= CBUS_PWREN<<4;
2658 else
2659 output[0x15] |= eeprom->cbus_function[3]<<4;
4e74064b 2660
56ac0383
TJ
2661 if (eeprom->cbus_function[4] > CBUS_CLK6)
2662 output[0x16] = CBUS_SLEEP;
2663 else
2664 output[0x16] = eeprom->cbus_function[4];
2665 break;
2666 case TYPE_2232H:
c8f69686 2667 output[0x00] = type2bit(eeprom->channel_a_type, TYPE_2232H);
56ac0383
TJ
2668 if ( eeprom->channel_a_driver == DRIVER_VCP)
2669 output[0x00] |= DRIVER_VCP;
2670 else
2671 output[0x00] &= ~DRIVER_VCP;
6e6a1c3f 2672
c8f69686 2673 output[0x01] = type2bit(eeprom->channel_b_type, TYPE_2232H);
56ac0383
TJ
2674 if ( eeprom->channel_b_driver == DRIVER_VCP)
2675 output[0x01] |= DRIVER_VCP;
2676 else
2677 output[0x01] &= ~DRIVER_VCP;
2678 if (eeprom->suspend_dbus7 == SUSPEND_DBUS7_BIT)
2679 output[0x01] |= SUSPEND_DBUS7_BIT;
2680 else
2681 output[0x01] &= ~SUSPEND_DBUS7_BIT;
2682
2683 if (eeprom->suspend_pull_downs == 1)
2684 output[0x0A] |= 0x4;
2685 else
2686 output[0x0A] &= ~0x4;
2687
2688 if (eeprom->group0_drive > DRIVE_16MA)
2689 output[0x0c] |= DRIVE_16MA;
2690 else
2691 output[0x0c] |= eeprom->group0_drive;
2692 if (eeprom->group0_schmitt == IS_SCHMITT)
2693 output[0x0c] |= IS_SCHMITT;
2694 if (eeprom->group0_slew == SLOW_SLEW)
2695 output[0x0c] |= SLOW_SLEW;
2696
2697 if (eeprom->group1_drive > DRIVE_16MA)
2698 output[0x0c] |= DRIVE_16MA<<4;
2699 else
2700 output[0x0c] |= eeprom->group1_drive<<4;
2701 if (eeprom->group1_schmitt == IS_SCHMITT)
2702 output[0x0c] |= IS_SCHMITT<<4;
2703 if (eeprom->group1_slew == SLOW_SLEW)
2704 output[0x0c] |= SLOW_SLEW<<4;
2705
2706 if (eeprom->group2_drive > DRIVE_16MA)
2707 output[0x0d] |= DRIVE_16MA;
2708 else
2709 output[0x0d] |= eeprom->group2_drive;
2710 if (eeprom->group2_schmitt == IS_SCHMITT)
2711 output[0x0d] |= IS_SCHMITT;
2712 if (eeprom->group2_slew == SLOW_SLEW)
2713 output[0x0d] |= SLOW_SLEW;
2714
2715 if (eeprom->group3_drive > DRIVE_16MA)
2716 output[0x0d] |= DRIVE_16MA<<4;
2717 else
2718 output[0x0d] |= eeprom->group3_drive<<4;
2719 if (eeprom->group3_schmitt == IS_SCHMITT)
2720 output[0x0d] |= IS_SCHMITT<<4;
2721 if (eeprom->group3_slew == SLOW_SLEW)
2722 output[0x0d] |= SLOW_SLEW<<4;
3802140c 2723
56ac0383 2724 output[0x18] = eeprom->chip;
3802140c 2725
56ac0383
TJ
2726 break;
2727 case TYPE_4232H:
c7e4c09e 2728 output[0x18] = eeprom->chip;
56ac0383 2729 fprintf(stderr,"FIXME: Build FT4232H specific EEPROM settings\n");
c7e4c09e
UB
2730 break;
2731 case TYPE_232H:
c8f69686 2732 output[0x00] = type2bit(eeprom->channel_a_type, TYPE_232H);
ac4a82a5
UB
2733 if ( eeprom->channel_a_driver == DRIVER_VCP)
2734 output[0x00] |= DRIVER_VCPH;
2735 else
2736 output[0x00] &= ~DRIVER_VCPH;
837a71d6
UB
2737 if (eeprom->powersave)
2738 output[0x01] |= POWER_SAVE_DISABLE_H;
2739 else
2740 output[0x01] &= ~POWER_SAVE_DISABLE_H;
18199b76
UB
2741 if (eeprom->clock_polarity)
2742 output[0x01] |= FT1284_CLK_IDLE_STATE;
2743 else
2744 output[0x01] &= ~FT1284_CLK_IDLE_STATE;
2745 if (eeprom->data_order)
2746 output[0x01] |= FT1284_DATA_LSB;
2747 else
2748 output[0x01] &= ~FT1284_DATA_LSB;
2749 if (eeprom->flow_control)
2750 output[0x01] |= FT1284_FLOW_CONTROL;
2751 else
2752 output[0x01] &= ~FT1284_FLOW_CONTROL;
91d7a201
UB
2753 if (eeprom->group0_drive > DRIVE_16MA)
2754 output[0x0c] |= DRIVE_16MA;
2755 else
2756 output[0x0c] |= eeprom->group0_drive;
2757 if (eeprom->group0_schmitt == IS_SCHMITT)
2758 output[0x0c] |= IS_SCHMITT;
2759 if (eeprom->group0_slew == SLOW_SLEW)
2760 output[0x0c] |= SLOW_SLEW;
2761
2762 if (eeprom->group1_drive > DRIVE_16MA)
2763 output[0x0d] |= DRIVE_16MA;
2764 else
2765 output[0x0d] |= eeprom->group1_drive;
2766 if (eeprom->group1_schmitt == IS_SCHMITT)
2767 output[0x0d] |= IS_SCHMITT;
2768 if (eeprom->group1_slew == SLOW_SLEW)
2769 output[0x0d] |= SLOW_SLEW;
2770
263d3ba0
UB
2771 set_ft232h_cbus(eeprom, output);
2772
c7e4c09e
UB
2773 output[0x1e] = eeprom->chip;
2774 fprintf(stderr,"FIXME: Build FT232H specific EEPROM settings\n");
2775 break;
2776
3802140c
UB
2777 }
2778
cbf65673 2779 // calculate checksum
b8aa7b35 2780 checksum = 0xAAAA;
d9f0cce7 2781
22d12cda
TJ
2782 for (i = 0; i < eeprom->size/2-1; i++)
2783 {
d9f0cce7
TJ
2784 value = output[i*2];
2785 value += output[(i*2)+1] << 8;
b8aa7b35 2786
d9f0cce7
TJ
2787 checksum = value^checksum;
2788 checksum = (checksum << 1) | (checksum >> 15);
b8aa7b35
TJ
2789 }
2790
c201f80f
TJ
2791 output[eeprom->size-2] = checksum;
2792 output[eeprom->size-1] = checksum >> 8;
b8aa7b35 2793
516ebfb1 2794 return user_area_size;
b8aa7b35 2795}
c8f69686
UB
2796/* Decode the encoded EEPROM field for the FTDI Mode into a value for the abstracted
2797 * EEPROM structure
2798 *
2799 * FTD2XX doesn't allow to set multiple bits in the interface mode bitfield, and so do we
2800 */
2801static unsigned char bit2type(unsigned char bits)
0fc2170c
UB
2802{
2803 switch (bits)
2804 {
c8f69686
UB
2805 case 0: return CHANNEL_IS_UART;
2806 case 1: return CHANNEL_IS_FIFO;
2807 case 2: return CHANNEL_IS_OPTO;
2808 case 4: return CHANNEL_IS_CPU;
2809 case 8: return CHANNEL_IS_FT1284;
0fc2170c
UB
2810 default:
2811 fprintf(stderr," Unexpected value %d for Hardware Interface type\n",
2812 bits);
2813 }
2814 return 0;
2815}
4af1d1bb
MK
2816/**
2817 Decode binary EEPROM image into an ftdi_eeprom structure.
2818
a35aa9bd
UB
2819 \param ftdi pointer to ftdi_context
2820 \param verbose Decode EEPROM on stdout
56ac0383 2821
4af1d1bb
MK
2822 \retval 0: all fine
2823 \retval -1: something went wrong
2824
2825 FIXME: How to pass size? How to handle size field in ftdi_eeprom?
2826 FIXME: Strings are malloc'ed here and should be freed somewhere
2827*/
a35aa9bd 2828int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose)
b56d5a64
MK
2829{
2830 unsigned char i, j;
2831 unsigned short checksum, eeprom_checksum, value;
2832 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
f2cd9fd5 2833 int eeprom_size;
c0a96aed 2834 struct ftdi_eeprom *eeprom;
a35aa9bd 2835 unsigned char *buf = ftdi->eeprom->buf;
38801bf8 2836 int release;
22a1b5c1 2837
c0a96aed 2838 if (ftdi == NULL)
cc9c9d58 2839 ftdi_error_return(-1,"No context");
c0a96aed 2840 if (ftdi->eeprom == NULL)
6cd4f922 2841 ftdi_error_return(-1,"No eeprom structure");
56ac0383 2842
c0a96aed 2843 eeprom = ftdi->eeprom;
a35aa9bd 2844 eeprom_size = eeprom->size;
b56d5a64 2845
b56d5a64
MK
2846 // Addr 02: Vendor ID
2847 eeprom->vendor_id = buf[0x02] + (buf[0x03] << 8);
2848
2849 // Addr 04: Product ID
2850 eeprom->product_id = buf[0x04] + (buf[0x05] << 8);
22d12cda 2851
38801bf8 2852 release = buf[0x06] + (buf[0x07]<<8);
b56d5a64
MK
2853
2854 // Addr 08: Config descriptor
2855 // Bit 7: always 1
2856 // Bit 6: 1 if this device is self powered, 0 if bus powered
2857 // Bit 5: 1 if this device uses remote wakeup
f6ef2983 2858 eeprom->self_powered = buf[0x08] & 0x40;
814710ba 2859 eeprom->remote_wakeup = buf[0x08] & 0x20;
b56d5a64
MK
2860
2861 // Addr 09: Max power consumption: max power = value * 2 mA
2862 eeprom->max_power = buf[0x09];
2863
2864 // Addr 0A: Chip configuration
2865 // Bit 7: 0 - reserved
2866 // Bit 6: 0 - reserved
2867 // Bit 5: 0 - reserved
caec1294 2868 // Bit 4: 1 - Change USB version on BM and 2232C
b56d5a64
MK
2869 // Bit 3: 1 - Use the serial number string
2870 // Bit 2: 1 - Enable suspend pull downs for lower power
2871 // Bit 1: 1 - Out EndPoint is Isochronous
2872 // Bit 0: 1 - In EndPoint is Isochronous
2873 //
8d3fe5c9
UB
2874 eeprom->in_is_isochronous = buf[0x0A]&0x01;
2875 eeprom->out_is_isochronous = buf[0x0A]&0x02;
2876 eeprom->suspend_pull_downs = buf[0x0A]&0x04;
a02587d5 2877 eeprom->use_serial = buf[0x0A] & USE_SERIAL_NUM;
caec1294 2878 eeprom->use_usb_version = buf[0x0A] & USE_USB_VERSION_BIT;
b56d5a64 2879
b1859923 2880 // Addr 0C: USB version low byte when 0x0A
56ac0383 2881 // Addr 0D: USB version high byte when 0x0A
b1859923 2882 eeprom->usb_version = buf[0x0C] + (buf[0x0D] << 8);
b56d5a64
MK
2883
2884 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
2885 // Addr 0F: Length of manufacturer string
2886 manufacturer_size = buf[0x0F]/2;
56ac0383 2887 if (eeprom->manufacturer)
74e8e79d 2888 free(eeprom->manufacturer);
56ac0383 2889 if (manufacturer_size > 0)
acc1fa05
UB
2890 {
2891 eeprom->manufacturer = malloc(manufacturer_size);
2892 if (eeprom->manufacturer)
2893 {
2894 // Decode manufacturer
84ec032f 2895 i = buf[0x0E] & (eeprom_size -1); // offset
acc1fa05
UB
2896 for (j=0;j<manufacturer_size-1;j++)
2897 {
2898 eeprom->manufacturer[j] = buf[2*j+i+2];
2899 }
2900 eeprom->manufacturer[j] = '\0';
2901 }
2902 }
b56d5a64
MK
2903 else eeprom->manufacturer = NULL;
2904
2905 // Addr 10: Offset of the product string + 0x80, calculated later
2906 // Addr 11: Length of product string
56ac0383 2907 if (eeprom->product)
74e8e79d 2908 free(eeprom->product);
b56d5a64 2909 product_size = buf[0x11]/2;
acc1fa05
UB
2910 if (product_size > 0)
2911 {
2912 eeprom->product = malloc(product_size);
56ac0383 2913 if (eeprom->product)
acc1fa05
UB
2914 {
2915 // Decode product name
84ec032f 2916 i = buf[0x10] & (eeprom_size -1); // offset
acc1fa05
UB
2917 for (j=0;j<product_size-1;j++)
2918 {
2919 eeprom->product[j] = buf[2*j+i+2];
2920 }
2921 eeprom->product[j] = '\0';
2922 }
2923 }
b56d5a64
MK
2924 else eeprom->product = NULL;
2925
2926 // Addr 12: Offset of the serial string + 0x80, calculated later
2927 // Addr 13: Length of serial string
56ac0383 2928 if (eeprom->serial)
74e8e79d 2929 free(eeprom->serial);
b56d5a64 2930 serial_size = buf[0x13]/2;
acc1fa05
UB
2931 if (serial_size > 0)
2932 {
2933 eeprom->serial = malloc(serial_size);
56ac0383 2934 if (eeprom->serial)
acc1fa05
UB
2935 {
2936 // Decode serial
84ec032f 2937 i = buf[0x12] & (eeprom_size -1); // offset
acc1fa05
UB
2938 for (j=0;j<serial_size-1;j++)
2939 {
2940 eeprom->serial[j] = buf[2*j+i+2];
2941 }
2942 eeprom->serial[j] = '\0';
2943 }
2944 }
b56d5a64
MK
2945 else eeprom->serial = NULL;
2946
b56d5a64
MK
2947 // verify checksum
2948 checksum = 0xAAAA;
2949
22d12cda
TJ
2950 for (i = 0; i < eeprom_size/2-1; i++)
2951 {
b56d5a64
MK
2952 value = buf[i*2];
2953 value += buf[(i*2)+1] << 8;
2954
2955 checksum = value^checksum;
2956 checksum = (checksum << 1) | (checksum >> 15);
2957 }
2958
2959 eeprom_checksum = buf[eeprom_size-2] + (buf[eeprom_size-1] << 8);
2960
22d12cda
TJ
2961 if (eeprom_checksum != checksum)
2962 {
2963 fprintf(stderr, "Checksum Error: %04x %04x\n", checksum, eeprom_checksum);
cc9c9d58 2964 ftdi_error_return(-1,"EEPROM checksum error");
4af1d1bb
MK
2965 }
2966
eb498cff 2967 eeprom->channel_a_type = 0;
aa099f46 2968 if ((ftdi->type == TYPE_AM) || (ftdi->type == TYPE_BM))
f6ef2983 2969 {
6cd4f922 2970 eeprom->chip = -1;
f6ef2983 2971 }
56ac0383 2972 else if (ftdi->type == TYPE_2232C)
f6ef2983 2973 {
0fc2170c 2974 eeprom->channel_a_type = bit2type(buf[0x00] & 0x7);
2cde7c52
UB
2975 eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP;
2976 eeprom->high_current_a = buf[0x00] & HIGH_CURRENT_DRIVE;
2977 eeprom->channel_b_type = buf[0x01] & 0x7;
2978 eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP;
2979 eeprom->high_current_b = buf[0x01] & HIGH_CURRENT_DRIVE;
6cd4f922 2980 eeprom->chip = buf[0x14];
065edc58 2981 }
56ac0383 2982 else if (ftdi->type == TYPE_R)
564b2716 2983 {
2cde7c52
UB
2984 /* TYPE_R flags D2XX, not VCP as all others*/
2985 eeprom->channel_a_driver = (~buf[0x00]) & DRIVER_VCP;
2986 eeprom->high_current = buf[0x00] & HIGH_CURRENT_DRIVE_R;
56ac0383
TJ
2987 if ( (buf[0x01]&0x40) != 0x40)
2988 fprintf(stderr,
2989 "TYPE_R EEPROM byte[0x01] Bit 6 unexpected Endpoint size."
2990 " If this happened with the\n"
2991 " EEPROM programmed by FTDI tools, please report "
2992 "to libftdi@developer.intra2net.com\n");
2cde7c52 2993
6cd4f922 2994 eeprom->chip = buf[0x16];
cecb9cb2
UB
2995 // Addr 0B: Invert data lines
2996 // Works only on FT232R, not FT245R, but no way to distinguish
07851949
UB
2997 eeprom->invert = buf[0x0B];
2998 // Addr 14: CBUS function: CBUS0, CBUS1
2999 // Addr 15: CBUS function: CBUS2, CBUS3
3000 // Addr 16: CBUS function: CBUS5
3001 eeprom->cbus_function[0] = buf[0x14] & 0x0f;
3002 eeprom->cbus_function[1] = (buf[0x14] >> 4) & 0x0f;
3003 eeprom->cbus_function[2] = buf[0x15] & 0x0f;
3004 eeprom->cbus_function[3] = (buf[0x15] >> 4) & 0x0f;
3005 eeprom->cbus_function[4] = buf[0x16] & 0x0f;
564b2716 3006 }
56ac0383 3007 else if ((ftdi->type == TYPE_2232H) ||(ftdi->type == TYPE_4232H))
db099ec5 3008 {
0fc2170c 3009 eeprom->channel_a_type = bit2type(buf[0x00] & 0x7);
2cde7c52 3010 eeprom->channel_a_driver = buf[0x00] & DRIVER_VCP;
c8f69686 3011 eeprom->channel_b_type = bit2type(buf[0x01] & 0x7);
2cde7c52
UB
3012 eeprom->channel_b_driver = buf[0x01] & DRIVER_VCP;
3013
56ac0383 3014 if (ftdi->type == TYPE_2232H)
ec0dcd3f 3015 eeprom->suspend_dbus7 = buf[0x01] & SUSPEND_DBUS7_BIT;
2cde7c52 3016
6cd4f922 3017 eeprom->chip = buf[0x18];
db099ec5
UB
3018 eeprom->group0_drive = buf[0x0c] & DRIVE_16MA;
3019 eeprom->group0_schmitt = buf[0x0c] & IS_SCHMITT;
3020 eeprom->group0_slew = buf[0x0c] & SLOW_SLEW;
3021 eeprom->group1_drive = (buf[0x0c] >> 4) & 0x3;
3022 eeprom->group1_schmitt = (buf[0x0c] >> 4) & IS_SCHMITT;
3023 eeprom->group1_slew = (buf[0x0c] >> 4) & SLOW_SLEW;
3024 eeprom->group2_drive = buf[0x0d] & DRIVE_16MA;
3025 eeprom->group2_schmitt = buf[0x0d] & IS_SCHMITT;
3026 eeprom->group2_slew = buf[0x0d] & SLOW_SLEW;
3027 eeprom->group3_drive = (buf[0x0d] >> 4) & DRIVE_16MA;
3028 eeprom->group3_schmitt = (buf[0x0d] >> 4) & IS_SCHMITT;
3029 eeprom->group3_slew = (buf[0x0d] >> 4) & SLOW_SLEW;
947d9552 3030 }
c7e4c09e
UB
3031 else if (ftdi->type == TYPE_232H)
3032 {
263d3ba0
UB
3033 int i;
3034
ac4a82a5
UB
3035 eeprom->channel_a_type = buf[0x00] & 0xf;
3036 eeprom->channel_a_driver = (buf[0x00] & DRIVER_VCPH)?DRIVER_VCP:0;
18199b76
UB
3037 eeprom->clock_polarity = buf[0x01] & FT1284_CLK_IDLE_STATE;
3038 eeprom->data_order = buf[0x01] & FT1284_DATA_LSB;
3039 eeprom->flow_control = buf[0x01] & FT1284_FLOW_CONTROL;
837a71d6 3040 eeprom->powersave = buf[0x01] & POWER_SAVE_DISABLE_H;
91d7a201
UB
3041 eeprom->group0_drive = buf[0x0c] & DRIVE_16MA;
3042 eeprom->group0_schmitt = buf[0x0c] & IS_SCHMITT;
3043 eeprom->group0_slew = buf[0x0c] & SLOW_SLEW;
3044 eeprom->group1_drive = buf[0x0d] & DRIVE_16MA;
3045 eeprom->group1_schmitt = buf[0x0d] & IS_SCHMITT;
3046 eeprom->group1_slew = buf[0x0d] & SLOW_SLEW;
3047
263d3ba0
UB
3048 for(i=0; i<5; i++)
3049 {
3050 eeprom->cbus_function[2*i ] = buf[0x18+i] & 0x0f;
3051 eeprom->cbus_function[2*i+1] = (buf[0x18+i] >> 4) & 0x0f;
3052 }
c7e4c09e
UB
3053 eeprom->chip = buf[0x1e];
3054 /*FIXME: Decipher more values*/
3055 }
56ac0383
TJ
3056
3057 if (verbose)
f6ef2983 3058 {
c8f69686 3059 char *channel_mode[] = {"UART", "FIFO", "CPU", "OPTO", "FT1284"};
f6ef2983
UB
3060 fprintf(stdout, "VID: 0x%04x\n",eeprom->vendor_id);
3061 fprintf(stdout, "PID: 0x%04x\n",eeprom->product_id);
38801bf8 3062 fprintf(stdout, "Release: 0x%04x\n",release);
f6ef2983 3063
56ac0383 3064 if (eeprom->self_powered)
f6ef2983
UB
3065 fprintf(stdout, "Self-Powered%s", (eeprom->remote_wakeup)?", USB Remote Wake Up\n":"\n");
3066 else
1cd815ad 3067 fprintf(stdout, "Bus Powered: %3d mA%s", eeprom->max_power * 2,
f6ef2983 3068 (eeprom->remote_wakeup)?" USB Remote Wake Up\n":"\n");
56ac0383 3069 if (eeprom->manufacturer)
f6ef2983 3070 fprintf(stdout, "Manufacturer: %s\n",eeprom->manufacturer);
56ac0383 3071 if (eeprom->product)
f6ef2983 3072 fprintf(stdout, "Product: %s\n",eeprom->product);
56ac0383 3073 if (eeprom->serial)
f6ef2983 3074 fprintf(stdout, "Serial: %s\n",eeprom->serial);
e107f509 3075 fprintf(stdout, "Checksum : %04x\n", checksum);
6cd4f922
UB
3076 if (ftdi->type == TYPE_R)
3077 fprintf(stdout, "Internal EEPROM\n");
3078 else if (eeprom->chip >= 0x46)
3079 fprintf(stdout, "Attached EEPROM: 93x%02x\n", eeprom->chip);
56ac0383
TJ
3080 if (eeprom->suspend_dbus7)
3081 fprintf(stdout, "Suspend on DBUS7\n");
3082 if (eeprom->suspend_pull_downs)
fb9bfdd1 3083 fprintf(stdout, "Pull IO pins low during suspend\n");
837a71d6
UB
3084 if(eeprom->powersave)
3085 {
3086 if(ftdi->type >= TYPE_232H)
3087 fprintf(stdout,"Enter low power state on ACBUS7\n");
3088 }
56ac0383 3089 if (eeprom->remote_wakeup)
fb9bfdd1 3090 fprintf(stdout, "Enable Remote Wake Up\n");
802a949e 3091 fprintf(stdout, "PNP: %d\n",(eeprom->is_not_pnp)?0:1);
db099ec5 3092 if (ftdi->type >= TYPE_2232C)
56ac0383 3093 fprintf(stdout,"Channel A has Mode %s%s%s\n",
e107f509 3094 channel_mode[eeprom->channel_a_type],
2cde7c52
UB
3095 (eeprom->channel_a_driver)?" VCP":"",
3096 (eeprom->high_current_a)?" High Current IO":"");
18199b76
UB
3097 if (ftdi->type >= TYPE_232H)
3098 {
3099 fprintf(stdout,"FT1284 Mode Clock is idle %s, %s first, %sFlow Control\n",
3100 (eeprom->clock_polarity)?"HIGH":"LOW",
3101 (eeprom->data_order)?"LSB":"MSB",
3102 (eeprom->flow_control)?"":"No ");
3103 }
c7e4c09e 3104 if ((ftdi->type >= TYPE_2232C) && (ftdi->type != TYPE_R) && (ftdi->type != TYPE_232H))
56ac0383 3105 fprintf(stdout,"Channel B has Mode %s%s%s\n",
e107f509 3106 channel_mode[eeprom->channel_b_type],
2cde7c52
UB
3107 (eeprom->channel_b_driver)?" VCP":"",
3108 (eeprom->high_current_b)?" High Current IO":"");
caec1294 3109 if (((ftdi->type == TYPE_BM) || (ftdi->type == TYPE_2232C)) &&
56ac0383 3110 eeprom->use_usb_version == USE_USB_VERSION_BIT)
caec1294
UB
3111 fprintf(stdout,"Use explicit USB Version %04x\n",eeprom->usb_version);
3112
56ac0383 3113 if ((ftdi->type == TYPE_2232H) || (ftdi->type == TYPE_4232H))
db099ec5
UB
3114 {
3115 fprintf(stdout,"%s has %d mA drive%s%s\n",
3116 (ftdi->type == TYPE_2232H)?"AL":"A",
3117 (eeprom->group0_drive+1) *4,
3118 (eeprom->group0_schmitt)?" Schmitt Input":"",
3119 (eeprom->group0_slew)?" Slow Slew":"");
3120 fprintf(stdout,"%s has %d mA drive%s%s\n",
3121 (ftdi->type == TYPE_2232H)?"AH":"B",
3122 (eeprom->group1_drive+1) *4,
3123 (eeprom->group1_schmitt)?" Schmitt Input":"",
3124 (eeprom->group1_slew)?" Slow Slew":"");
3125 fprintf(stdout,"%s has %d mA drive%s%s\n",
3126 (ftdi->type == TYPE_2232H)?"BL":"C",
3127 (eeprom->group2_drive+1) *4,
3128 (eeprom->group2_schmitt)?" Schmitt Input":"",
3129 (eeprom->group2_slew)?" Slow Slew":"");
3130 fprintf(stdout,"%s has %d mA drive%s%s\n",
3131 (ftdi->type == TYPE_2232H)?"BH":"D",
3132 (eeprom->group3_drive+1) *4,
3133 (eeprom->group3_schmitt)?" Schmitt Input":"",
3134 (eeprom->group3_slew)?" Slow Slew":"");
3135 }
91d7a201
UB
3136 else if (ftdi->type == TYPE_232H)
3137 {
263d3ba0
UB
3138 int i;
3139 char *cbush_mux[] = {"TRISTATE","RXLED","TXLED", "TXRXLED","PWREN",
3140 "SLEEP","DRIVE_0","DRIVE_1","IOMODE","TXDEN",
3141 "CLK30","CLK15","CLK7_5"
3142 };
91d7a201
UB
3143 fprintf(stdout,"ACBUS has %d mA drive%s%s\n",
3144 (eeprom->group0_drive+1) *4,
3145 (eeprom->group0_schmitt)?" Schmitt Input":"",
3146 (eeprom->group0_slew)?" Slow Slew":"");
3147 fprintf(stdout,"ADBUS has %d mA drive%s%s\n",
3148 (eeprom->group1_drive+1) *4,
3149 (eeprom->group1_schmitt)?" Schmitt Input":"",
3150 (eeprom->group1_slew)?" Slow Slew":"");
263d3ba0
UB
3151 for (i=0; i<10; i++)
3152 {
3153 if (eeprom->cbus_function[i]<= CBUSH_CLK7_5 )
3154 fprintf(stdout,"C%d Function: %s\n", i,
3155 cbush_mux[eeprom->cbus_function[i]]);
3156 }
3157
91d7a201
UB
3158 }
3159
a4980043
UB
3160 if (ftdi->type == TYPE_R)
3161 {
3162 char *cbus_mux[] = {"TXDEN","PWREN","RXLED", "TXLED","TX+RXLED",
13f00d3c 3163 "SLEEP","CLK48","CLK24","CLK12","CLK6",
56ac0383
TJ
3164 "IOMODE","BB_WR","BB_RD"
3165 };
13f00d3c 3166 char *cbus_BB[] = {"RXF","TXE","RD", "WR"};
56ac0383
TJ
3167
3168 if (eeprom->invert)
3169 {
a4980043
UB
3170 char *r_bits[] = {"TXD","RXD","RTS", "CTS","DTR","DSR","DCD","RI"};
3171 fprintf(stdout,"Inverted bits:");
3172 for (i=0; i<8; i++)
56ac0383 3173 if ((eeprom->invert & (1<<i)) == (1<<i))
a4980043
UB
3174 fprintf(stdout," %s",r_bits[i]);
3175 fprintf(stdout,"\n");
3176 }
56ac0383 3177 for (i=0; i<5; i++)
a4980043 3178 {
56ac0383 3179 if (eeprom->cbus_function[i]<CBUS_BB)
a4980043
UB
3180 fprintf(stdout,"C%d Function: %s\n", i,
3181 cbus_mux[eeprom->cbus_function[i]]);
3182 else
17431287 3183 {
598b2334
UB
3184 if (i < 4)
3185 /* Running MPROG show that C0..3 have fixed function Synchronous
3186 Bit Bang mode */
3187 fprintf(stdout,"C%d BB Function: %s\n", i,
3188 cbus_BB[i]);
3189 else
3190 fprintf(stdout, "Unknown CBUS mode. Might be special mode?\n");
17431287 3191 }
a4980043
UB
3192 }
3193 }
f6ef2983 3194 }
4af1d1bb 3195 return 0;
b56d5a64
MK
3196}
3197
1941414d 3198/**
44ef02bd
UB
3199 Get a value from the decoded EEPROM structure
3200
735e81ea
TJ
3201 \param ftdi pointer to ftdi_context
3202 \param value_name Enum of the value to query
3203 \param value Pointer to store read value
44ef02bd 3204
735e81ea
TJ
3205 \retval 0: all fine
3206 \retval -1: Value doesn't exist
44ef02bd
UB
3207*/
3208int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int* value)
3209{
3210 switch (value_name)
3211 {
56ac0383
TJ
3212 case VENDOR_ID:
3213 *value = ftdi->eeprom->vendor_id;
3214 break;
3215 case PRODUCT_ID:
3216 *value = ftdi->eeprom->product_id;
3217 break;
3218 case SELF_POWERED:
3219 *value = ftdi->eeprom->self_powered;
3220 break;
3221 case REMOTE_WAKEUP:
3222 *value = ftdi->eeprom->remote_wakeup;
3223 break;
3224 case IS_NOT_PNP:
3225 *value = ftdi->eeprom->is_not_pnp;
3226 break;
3227 case SUSPEND_DBUS7:
3228 *value = ftdi->eeprom->suspend_dbus7;
3229 break;
3230 case IN_IS_ISOCHRONOUS:
3231 *value = ftdi->eeprom->in_is_isochronous;
3232 break;
cffed9f5
UB
3233 case OUT_IS_ISOCHRONOUS:
3234 *value = ftdi->eeprom->out_is_isochronous;
3235 break;
56ac0383
TJ
3236 case SUSPEND_PULL_DOWNS:
3237 *value = ftdi->eeprom->suspend_pull_downs;
3238 break;
3239 case USE_SERIAL:
3240 *value = ftdi->eeprom->use_serial;
3241 break;
3242 case USB_VERSION:
3243 *value = ftdi->eeprom->usb_version;
3244 break;
cffed9f5
UB
3245 case USE_USB_VERSION:
3246 *value = ftdi->eeprom->use_usb_version;
3247 break;
56ac0383
TJ
3248 case MAX_POWER:
3249 *value = ftdi->eeprom->max_power;
3250 break;
3251 case CHANNEL_A_TYPE:
3252 *value = ftdi->eeprom->channel_a_type;
3253 break;
3254 case CHANNEL_B_TYPE:
3255 *value = ftdi->eeprom->channel_b_type;
3256 break;
3257 case CHANNEL_A_DRIVER:
3258 *value = ftdi->eeprom->channel_a_driver;
3259 break;
3260 case CHANNEL_B_DRIVER:
3261 *value = ftdi->eeprom->channel_b_driver;
3262 break;
3263 case CBUS_FUNCTION_0:
3264 *value = ftdi->eeprom->cbus_function[0];
3265 break;
3266 case CBUS_FUNCTION_1:
3267 *value = ftdi->eeprom->cbus_function[1];
3268 break;
3269 case CBUS_FUNCTION_2:
3270 *value = ftdi->eeprom->cbus_function[2];
3271 break;
3272 case CBUS_FUNCTION_3:
3273 *value = ftdi->eeprom->cbus_function[3];
3274 break;
3275 case CBUS_FUNCTION_4:
3276 *value = ftdi->eeprom->cbus_function[4];
3277 break;
263d3ba0
UB
3278 case CBUS_FUNCTION_5:
3279 *value = ftdi->eeprom->cbus_function[5];
3280 break;
3281 case CBUS_FUNCTION_6:
3282 *value = ftdi->eeprom->cbus_function[6];
3283 break;
3284 case CBUS_FUNCTION_7:
3285 *value = ftdi->eeprom->cbus_function[7];
3286 break;
3287 case CBUS_FUNCTION_8:
3288 *value = ftdi->eeprom->cbus_function[8];
3289 break;
3290 case CBUS_FUNCTION_9:
3291 *value = ftdi->eeprom->cbus_function[8];
3292 break;
56ac0383
TJ
3293 case HIGH_CURRENT:
3294 *value = ftdi->eeprom->high_current;
3295 break;
3296 case HIGH_CURRENT_A:
3297 *value = ftdi->eeprom->high_current_a;
3298 break;
3299 case HIGH_CURRENT_B:
3300 *value = ftdi->eeprom->high_current_b;
3301 break;
3302 case INVERT:
3303 *value = ftdi->eeprom->invert;
3304 break;
3305 case GROUP0_DRIVE:
3306 *value = ftdi->eeprom->group0_drive;
3307 break;
3308 case GROUP0_SCHMITT:
3309 *value = ftdi->eeprom->group0_schmitt;
3310 break;
3311 case GROUP0_SLEW:
3312 *value = ftdi->eeprom->group0_slew;
3313 break;
3314 case GROUP1_DRIVE:
3315 *value = ftdi->eeprom->group1_drive;
3316 break;
3317 case GROUP1_SCHMITT:
3318 *value = ftdi->eeprom->group1_schmitt;
3319 break;
3320 case GROUP1_SLEW:
3321 *value = ftdi->eeprom->group1_slew;
3322 break;
3323 case GROUP2_DRIVE:
3324 *value = ftdi->eeprom->group2_drive;
3325 break;
3326 case GROUP2_SCHMITT:
3327 *value = ftdi->eeprom->group2_schmitt;
3328 break;
3329 case GROUP2_SLEW:
3330 *value = ftdi->eeprom->group2_slew;
3331 break;
3332 case GROUP3_DRIVE:
3333 *value = ftdi->eeprom->group3_drive;
3334 break;
3335 case GROUP3_SCHMITT:
3336 *value = ftdi->eeprom->group3_schmitt;
3337 break;
3338 case GROUP3_SLEW:
3339 *value = ftdi->eeprom->group3_slew;
3340 break;
837a71d6
UB
3341 case POWER_SAVE:
3342 *value = ftdi->eeprom->powersave;
3343 break;
18199b76
UB
3344 case CLOCK_POLARITY:
3345 *value = ftdi->eeprom->clock_polarity;
3346 break;
3347 case DATA_ORDER:
3348 *value = ftdi->eeprom->data_order;
3349 break;
3350 case FLOW_CONTROL:
3351 *value = ftdi->eeprom->flow_control;
3352 break;
3353 case CHIP_TYPE:
56ac0383
TJ
3354 *value = ftdi->eeprom->chip;
3355 break;
3356 case CHIP_SIZE:
3357 *value = ftdi->eeprom->size;
3358 break;
3359 default:
3360 ftdi_error_return(-1, "Request for unknown EEPROM value");
44ef02bd
UB
3361 }
3362 return 0;
3363}
3364
3365/**
3366 Set a value in the decoded EEPROM Structure
3367 No parameter checking is performed
3368
735e81ea 3369 \param ftdi pointer to ftdi_context
545f9df9 3370 \param value_name Enum of the value to set
735e81ea 3371 \param value to set
44ef02bd 3372
735e81ea
TJ
3373 \retval 0: all fine
3374 \retval -1: Value doesn't exist
3375 \retval -2: Value not user settable
44ef02bd
UB
3376*/
3377int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value value_name, int value)
3378{
3379 switch (value_name)
3380 {
56ac0383
TJ
3381 case VENDOR_ID:
3382 ftdi->eeprom->vendor_id = value;
3383 break;
3384 case PRODUCT_ID:
3385 ftdi->eeprom->product_id = value;
3386 break;
3387 case SELF_POWERED:
3388 ftdi->eeprom->self_powered = value;
3389 break;
3390 case REMOTE_WAKEUP:
3391 ftdi->eeprom->remote_wakeup = value;
3392 break;
3393 case IS_NOT_PNP:
3394 ftdi->eeprom->is_not_pnp = value;
3395 break;
3396 case SUSPEND_DBUS7:
3397 ftdi->eeprom->suspend_dbus7 = value;
3398 break;
3399 case IN_IS_ISOCHRONOUS:
3400 ftdi->eeprom->in_is_isochronous = value;
3401 break;
cffed9f5
UB
3402 case OUT_IS_ISOCHRONOUS:
3403 ftdi->eeprom->out_is_isochronous = value;
3404 break;
56ac0383
TJ
3405 case SUSPEND_PULL_DOWNS:
3406 ftdi->eeprom->suspend_pull_downs = value;
3407 break;
3408 case USE_SERIAL:
3409 ftdi->eeprom->use_serial = value;
3410 break;
3411 case USB_VERSION:
3412 ftdi->eeprom->usb_version = value;
3413 break;
cffed9f5
UB
3414 case USE_USB_VERSION:
3415 ftdi->eeprom->use_usb_version = value;
3416 break;
56ac0383
TJ
3417 case MAX_POWER:
3418 ftdi->eeprom->max_power = value;
3419 break;
3420 case CHANNEL_A_TYPE:
3421 ftdi->eeprom->channel_a_type = value;
3422 break;
3423 case CHANNEL_B_TYPE:
3424 ftdi->eeprom->channel_b_type = value;
3425 break;
3426 case CHANNEL_A_DRIVER:
3427 ftdi->eeprom->channel_a_driver = value;
3428 break;
3429 case CHANNEL_B_DRIVER:
3430 ftdi->eeprom->channel_b_driver = value;
3431 break;
3432 case CBUS_FUNCTION_0:
3433 ftdi->eeprom->cbus_function[0] = value;
3434 break;
3435 case CBUS_FUNCTION_1:
3436 ftdi->eeprom->cbus_function[1] = value;
3437 break;
3438 case CBUS_FUNCTION_2:
3439 ftdi->eeprom->cbus_function[2] = value;
3440 break;
3441 case CBUS_FUNCTION_3:
3442 ftdi->eeprom->cbus_function[3] = value;
3443 break;
3444 case CBUS_FUNCTION_4:
3445 ftdi->eeprom->cbus_function[4] = value;
3446 break;
263d3ba0
UB
3447 case CBUS_FUNCTION_5:
3448 ftdi->eeprom->cbus_function[5] = value;
3449 break;
3450 case CBUS_FUNCTION_6:
3451 ftdi->eeprom->cbus_function[6] = value;
3452 break;
3453 case CBUS_FUNCTION_7:
3454 ftdi->eeprom->cbus_function[7] = value;
3455 break;
3456 case CBUS_FUNCTION_8:
3457 ftdi->eeprom->cbus_function[8] = value;
3458 break;
3459 case CBUS_FUNCTION_9:
3460 ftdi->eeprom->cbus_function[9] = value;
3461 break;
56ac0383
TJ
3462 case HIGH_CURRENT:
3463 ftdi->eeprom->high_current = value;
3464 break;
3465 case HIGH_CURRENT_A:
3466 ftdi->eeprom->high_current_a = value;
3467 break;
3468 case HIGH_CURRENT_B:
3469 ftdi->eeprom->high_current_b = value;
3470 break;
3471 case INVERT:
3472 ftdi->eeprom->invert = value;
3473 break;
3474 case GROUP0_DRIVE:
3475 ftdi->eeprom->group0_drive = value;
3476 break;
3477 case GROUP0_SCHMITT:
3478 ftdi->eeprom->group0_schmitt = value;
3479 break;
3480 case GROUP0_SLEW:
3481 ftdi->eeprom->group0_slew = value;
3482 break;
3483 case GROUP1_DRIVE:
3484 ftdi->eeprom->group1_drive = value;
3485 break;
3486 case GROUP1_SCHMITT:
3487 ftdi->eeprom->group1_schmitt = value;
3488 break;
3489 case GROUP1_SLEW:
3490 ftdi->eeprom->group1_slew = value;
3491 break;
3492 case GROUP2_DRIVE:
3493 ftdi->eeprom->group2_drive = value;
3494 break;
3495 case GROUP2_SCHMITT:
3496 ftdi->eeprom->group2_schmitt = value;
3497 break;
3498 case GROUP2_SLEW:
3499 ftdi->eeprom->group2_slew = value;
3500 break;
3501 case GROUP3_DRIVE:
3502 ftdi->eeprom->group3_drive = value;
3503 break;
3504 case GROUP3_SCHMITT:
3505 ftdi->eeprom->group3_schmitt = value;
3506 break;
3507 case GROUP3_SLEW:
3508 ftdi->eeprom->group3_slew = value;
3509 break;
3510 case CHIP_TYPE:
3511 ftdi->eeprom->chip = value;
3512 break;
837a71d6
UB
3513 case POWER_SAVE:
3514 ftdi->eeprom->powersave = value;
3515 break;
18199b76
UB
3516 case CLOCK_POLARITY:
3517 ftdi->eeprom->clock_polarity = value;
3518 break;
3519 case DATA_ORDER:
3520 ftdi->eeprom->data_order = value;
3521 break;
3522 case FLOW_CONTROL:
3523 ftdi->eeprom->flow_control = value;
3524 break;
56ac0383
TJ
3525 case CHIP_SIZE:
3526 ftdi_error_return(-2, "EEPROM Value can't be changed");
3527 default :
3528 ftdi_error_return(-1, "Request to unknown EEPROM value");
44ef02bd
UB
3529 }
3530 return 0;
3531}
3532
3533/** Get the read-only buffer to the binary EEPROM content
3534
3535 \param ftdi pointer to ftdi_context
735e81ea 3536 \param buf buffer to receive EEPROM content
44ef02bd
UB
3537 \param size Size of receiving buffer
3538
3539 \retval 0: All fine
3540 \retval -1: struct ftdi_contxt or ftdi_eeprom missing
200bd3ed 3541 \retval -2: Not enough room to store eeprom
44ef02bd 3542*/
56ac0383
TJ
3543int ftdi_get_eeprom_buf(struct ftdi_context *ftdi, unsigned char * buf, int size)
3544{
3545 if (!ftdi || !(ftdi->eeprom))
3546 ftdi_error_return(-1, "No appropriate structure");
b95e4654 3547
200bd3ed
TJ
3548 if (!buf || size < ftdi->eeprom->size)
3549 ftdi_error_return(-1, "Not enough room to store eeprom");
3550
b95e4654
TJ
3551 // Only copy up to FTDI_MAX_EEPROM_SIZE bytes
3552 if (size > FTDI_MAX_EEPROM_SIZE)
3553 size = FTDI_MAX_EEPROM_SIZE;
3554
56ac0383 3555 memcpy(buf, ftdi->eeprom->buf, size);
b95e4654 3556
56ac0383
TJ
3557 return 0;
3558}
44ef02bd 3559
672fd368
UB
3560/** Set the EEPROM content from the user-supplied prefilled buffer
3561
3562 \param ftdi pointer to ftdi_context
3563 \param buf buffer to read EEPROM content
3564 \param size Size of buffer
3565
3566 \retval 0: All fine
3567 \retval -1: struct ftdi_contxt or ftdi_eeprom of buf missing
3568*/
3569int ftdi_set_eeprom_buf(struct ftdi_context *ftdi, const unsigned char * buf, int size)
3570{
3571 if (!ftdi || !(ftdi->eeprom) || !buf)
3572 ftdi_error_return(-1, "No appropriate structure");
3573
3574 // Only copy up to FTDI_MAX_EEPROM_SIZE bytes
3575 if (size > FTDI_MAX_EEPROM_SIZE)
3576 size = FTDI_MAX_EEPROM_SIZE;
3577
3578 memcpy(ftdi->eeprom->buf, buf, size);
3579
3580 return 0;
3581}
3582
44ef02bd 3583/**
c1c70e13
OS
3584 Read eeprom location
3585
3586 \param ftdi pointer to ftdi_context
3587 \param eeprom_addr Address of eeprom location to be read
3588 \param eeprom_val Pointer to store read eeprom location
3589
3590 \retval 0: all fine
3591 \retval -1: read failed
22a1b5c1 3592 \retval -2: USB device unavailable
c1c70e13
OS
3593*/
3594int ftdi_read_eeprom_location (struct ftdi_context *ftdi, int eeprom_addr, unsigned short *eeprom_val)
3595{
22a1b5c1
TJ
3596 if (ftdi == NULL || ftdi->usb_dev == NULL)
3597 ftdi_error_return(-2, "USB device unavailable");
3598
97c6b5f6 3599 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, eeprom_addr, (unsigned char *)eeprom_val, 2, ftdi->usb_read_timeout) != 2)
c1c70e13
OS
3600 ftdi_error_return(-1, "reading eeprom failed");
3601
3602 return 0;
3603}
3604
3605/**
1941414d
TJ
3606 Read eeprom
3607
3608 \param ftdi pointer to ftdi_context
b8aa7b35 3609
1941414d
TJ
3610 \retval 0: all fine
3611 \retval -1: read failed
22a1b5c1 3612 \retval -2: USB device unavailable
1941414d 3613*/
a35aa9bd 3614int ftdi_read_eeprom(struct ftdi_context *ftdi)
a8f46ddc 3615{
a3da1d95 3616 int i;
a35aa9bd 3617 unsigned char *buf;
a3da1d95 3618
22a1b5c1
TJ
3619 if (ftdi == NULL || ftdi->usb_dev == NULL)
3620 ftdi_error_return(-2, "USB device unavailable");
a35aa9bd 3621 buf = ftdi->eeprom->buf;
22a1b5c1 3622
2d543486 3623 for (i = 0; i < FTDI_MAX_EEPROM_SIZE/2; i++)
22d12cda 3624 {
a35aa9bd 3625 if (libusb_control_transfer(
56ac0383
TJ
3626 ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE,SIO_READ_EEPROM_REQUEST, 0, i,
3627 buf+(i*2), 2, ftdi->usb_read_timeout) != 2)
c3d95b87 3628 ftdi_error_return(-1, "reading eeprom failed");
a3da1d95
GE
3629 }
3630
2d543486 3631 if (ftdi->type == TYPE_R)
a35aa9bd 3632 ftdi->eeprom->size = 0x80;
56ac0383 3633 /* Guesses size of eeprom by comparing halves
2d543486 3634 - will not work with blank eeprom */
a35aa9bd 3635 else if (strrchr((const char *)buf, 0xff) == ((const char *)buf +FTDI_MAX_EEPROM_SIZE -1))
2d543486 3636 ftdi->eeprom->size = -1;
56ac0383 3637 else if (memcmp(buf,&buf[0x80],0x80) == 0)
2d543486 3638 ftdi->eeprom->size = 0x80;
56ac0383 3639 else if (memcmp(buf,&buf[0x40],0x40) == 0)
2d543486
UB
3640 ftdi->eeprom->size = 0x40;
3641 else
3642 ftdi->eeprom->size = 0x100;
a3da1d95
GE
3643 return 0;
3644}
3645
cb6250fa
TJ
3646/*
3647 ftdi_read_chipid_shift does the bitshift operation needed for the FTDIChip-ID
3648 Function is only used internally
3649 \internal
3650*/
3651static unsigned char ftdi_read_chipid_shift(unsigned char value)
3652{
3653 return ((value & 1) << 1) |
22d12cda
TJ
3654 ((value & 2) << 5) |
3655 ((value & 4) >> 2) |
3656 ((value & 8) << 4) |
3657 ((value & 16) >> 1) |
3658 ((value & 32) >> 1) |
3659 ((value & 64) >> 4) |
3660 ((value & 128) >> 2);
cb6250fa
TJ
3661}
3662
3663/**
3664 Read the FTDIChip-ID from R-type devices
3665
3666 \param ftdi pointer to ftdi_context
3667 \param chipid Pointer to store FTDIChip-ID
3668
3669 \retval 0: all fine
3670 \retval -1: read failed
22a1b5c1 3671 \retval -2: USB device unavailable
cb6250fa
TJ
3672*/
3673int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid)
3674{
c7eb3112 3675 unsigned int a = 0, b = 0;
cb6250fa 3676
22a1b5c1
TJ
3677 if (ftdi == NULL || ftdi->usb_dev == NULL)
3678 ftdi_error_return(-2, "USB device unavailable");
3679
579b006f 3680 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x43, (unsigned char *)&a, 2, ftdi->usb_read_timeout) == 2)
cb6250fa
TJ
3681 {
3682 a = a << 8 | a >> 8;
579b006f 3683 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_IN_REQTYPE, SIO_READ_EEPROM_REQUEST, 0, 0x44, (unsigned char *)&b, 2, ftdi->usb_read_timeout) == 2)
cb6250fa
TJ
3684 {
3685 b = b << 8 | b >> 8;
5230676f 3686 a = (a << 16) | (b & 0xFFFF);
912d50ca
TJ
3687 a = ftdi_read_chipid_shift(a) | ftdi_read_chipid_shift(a>>8)<<8
3688 | ftdi_read_chipid_shift(a>>16)<<16 | ftdi_read_chipid_shift(a>>24)<<24;
cb6250fa 3689 *chipid = a ^ 0xa5f0f7d1;
c7eb3112 3690 return 0;
cb6250fa
TJ
3691 }
3692 }
3693
c7eb3112 3694 ftdi_error_return(-1, "read of FTDIChip-ID failed");
cb6250fa
TJ
3695}
3696
1941414d 3697/**
c1c70e13
OS
3698 Write eeprom location
3699
3700 \param ftdi pointer to ftdi_context
3701 \param eeprom_addr Address of eeprom location to be written
3702 \param eeprom_val Value to be written
3703
3704 \retval 0: all fine
a661e3e4 3705 \retval -1: write failed
22a1b5c1 3706 \retval -2: USB device unavailable
a661e3e4
UB
3707 \retval -3: Invalid access to checksum protected area below 0x80
3708 \retval -4: Device can't access unprotected area
3709 \retval -5: Reading chip type failed
c1c70e13 3710*/
56ac0383 3711int ftdi_write_eeprom_location(struct ftdi_context *ftdi, int eeprom_addr,
a661e3e4 3712 unsigned short eeprom_val)
c1c70e13 3713{
a661e3e4
UB
3714 int chip_type_location;
3715 unsigned short chip_type;
3716
22a1b5c1
TJ
3717 if (ftdi == NULL || ftdi->usb_dev == NULL)
3718 ftdi_error_return(-2, "USB device unavailable");
3719
56ac0383 3720 if (eeprom_addr <0x80)
a661e3e4
UB
3721 ftdi_error_return(-2, "Invalid access to checksum protected area below 0x80");
3722
3723
3724 switch (ftdi->type)
3725 {
56ac0383
TJ
3726 case TYPE_BM:
3727 case TYPE_2232C:
3728 chip_type_location = 0x14;
3729 break;
3730 case TYPE_2232H:
3731 case TYPE_4232H:
3732 chip_type_location = 0x18;
3733 break;
c7e4c09e
UB
3734 case TYPE_232H:
3735 chip_type_location = 0x1e;
3736 break;
56ac0383
TJ
3737 default:
3738 ftdi_error_return(-4, "Device can't access unprotected area");
a661e3e4
UB
3739 }
3740
56ac0383 3741 if (ftdi_read_eeprom_location( ftdi, chip_type_location>>1, &chip_type))
a661e3e4 3742 ftdi_error_return(-5, "Reading failed failed");
56ac0383
TJ
3743 fprintf(stderr," loc 0x%04x val 0x%04x\n", chip_type_location,chip_type);
3744 if ((chip_type & 0xff) != 0x66)
a661e3e4
UB
3745 {
3746 ftdi_error_return(-6, "EEPROM is not of 93x66");
3747 }
3748
579b006f 3749 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
56ac0383
TJ
3750 SIO_WRITE_EEPROM_REQUEST, eeprom_val, eeprom_addr,
3751 NULL, 0, ftdi->usb_write_timeout) != 0)
c1c70e13
OS
3752 ftdi_error_return(-1, "unable to write eeprom");
3753
3754 return 0;
3755}
3756
3757/**
1941414d 3758 Write eeprom
a3da1d95 3759
1941414d 3760 \param ftdi pointer to ftdi_context
56ac0383 3761
1941414d
TJ
3762 \retval 0: all fine
3763 \retval -1: read failed
22a1b5c1 3764 \retval -2: USB device unavailable
44f41f11 3765 \retval -3: EEPROM not initialized for the connected device;
1941414d 3766*/
a35aa9bd 3767int ftdi_write_eeprom(struct ftdi_context *ftdi)
a8f46ddc 3768{
ba5329be 3769 unsigned short usb_val, status;
e30da501 3770 int i, ret;
a35aa9bd 3771 unsigned char *eeprom;
a3da1d95 3772
22a1b5c1
TJ
3773 if (ftdi == NULL || ftdi->usb_dev == NULL)
3774 ftdi_error_return(-2, "USB device unavailable");
44f41f11
UB
3775
3776 if(ftdi->eeprom->initialized_for_connected_device == 0)
3777 ftdi_error_return(-3, "EEPROM not initialized for the connected device");
3778
a35aa9bd 3779 eeprom = ftdi->eeprom->buf;
22a1b5c1 3780
ba5329be 3781 /* These commands were traced while running MProg */
e30da501
TJ
3782 if ((ret = ftdi_usb_reset(ftdi)) != 0)
3783 return ret;
3784 if ((ret = ftdi_poll_modem_status(ftdi, &status)) != 0)
3785 return ret;
3786 if ((ret = ftdi_set_latency_timer(ftdi, 0x77)) != 0)
3787 return ret;
ba5329be 3788
c0a96aed 3789 for (i = 0; i < ftdi->eeprom->size/2; i++)
22d12cda 3790 {
d9f0cce7
TJ
3791 usb_val = eeprom[i*2];
3792 usb_val += eeprom[(i*2)+1] << 8;
579b006f
JZ
3793 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
3794 SIO_WRITE_EEPROM_REQUEST, usb_val, i,
3795 NULL, 0, ftdi->usb_write_timeout) < 0)
c3d95b87 3796 ftdi_error_return(-1, "unable to write eeprom");
a3da1d95
GE
3797 }
3798
3799 return 0;
3800}
3801
1941414d
TJ
3802/**
3803 Erase eeprom
a3da1d95 3804
a5e1bd8c
MK
3805 This is not supported on FT232R/FT245R according to the MProg manual from FTDI.
3806
1941414d
TJ
3807 \param ftdi pointer to ftdi_context
3808
3809 \retval 0: all fine
3810 \retval -1: erase failed
22a1b5c1 3811 \retval -2: USB device unavailable
99404ad5
UB
3812 \retval -3: Writing magic failed
3813 \retval -4: Read EEPROM failed
3814 \retval -5: Unexpected EEPROM value
1941414d 3815*/
99404ad5 3816#define MAGIC 0x55aa
a8f46ddc
TJ
3817int ftdi_erase_eeprom(struct ftdi_context *ftdi)
3818{
99404ad5 3819 unsigned short eeprom_value;
22a1b5c1
TJ
3820 if (ftdi == NULL || ftdi->usb_dev == NULL)
3821 ftdi_error_return(-2, "USB device unavailable");
3822
56ac0383 3823 if (ftdi->type == TYPE_R)
99404ad5
UB
3824 {
3825 ftdi->eeprom->chip = 0;
3826 return 0;
3827 }
3828
56ac0383 3829 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_ERASE_EEPROM_REQUEST,
99404ad5 3830 0, 0, NULL, 0, ftdi->usb_write_timeout) < 0)
c3d95b87 3831 ftdi_error_return(-1, "unable to erase eeprom");
a3da1d95 3832
56ac0383 3833
99404ad5
UB
3834 /* detect chip type by writing 0x55AA as magic at word position 0xc0
3835 Chip is 93x46 if magic is read at word position 0x00, as wraparound happens around 0x40
3836 Chip is 93x56 if magic is read at word position 0x40, as wraparound happens around 0x80
3837 Chip is 93x66 if magic is only read at word position 0xc0*/
10186c1f 3838 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE,
56ac0383
TJ
3839 SIO_WRITE_EEPROM_REQUEST, MAGIC, 0xc0,
3840 NULL, 0, ftdi->usb_write_timeout) != 0)
99404ad5 3841 ftdi_error_return(-3, "Writing magic failed");
56ac0383 3842 if (ftdi_read_eeprom_location( ftdi, 0x00, &eeprom_value))
99404ad5 3843 ftdi_error_return(-4, "Reading failed failed");
56ac0383 3844 if (eeprom_value == MAGIC)
99404ad5
UB
3845 {
3846 ftdi->eeprom->chip = 0x46;
3847 }
56ac0383 3848 else
99404ad5 3849 {
56ac0383 3850 if (ftdi_read_eeprom_location( ftdi, 0x40, &eeprom_value))
99404ad5 3851 ftdi_error_return(-4, "Reading failed failed");
56ac0383 3852 if (eeprom_value == MAGIC)
99404ad5 3853 ftdi->eeprom->chip = 0x56;
56ac0383 3854 else
99404ad5 3855 {
56ac0383 3856 if (ftdi_read_eeprom_location( ftdi, 0xc0, &eeprom_value))
99404ad5 3857 ftdi_error_return(-4, "Reading failed failed");
56ac0383 3858 if (eeprom_value == MAGIC)
99404ad5
UB
3859 ftdi->eeprom->chip = 0x66;
3860 else
3861 {
3862 ftdi->eeprom->chip = -1;
3863 }
3864 }
3865 }
56ac0383 3866 if (libusb_control_transfer(ftdi->usb_dev, FTDI_DEVICE_OUT_REQTYPE, SIO_ERASE_EEPROM_REQUEST,
99404ad5
UB
3867 0, 0, NULL, 0, ftdi->usb_write_timeout) < 0)
3868 ftdi_error_return(-1, "unable to erase eeprom");
a3da1d95
GE
3869 return 0;
3870}
c3d95b87 3871
1941414d
TJ
3872/**
3873 Get string representation for last error code
c3d95b87 3874
1941414d
TJ
3875 \param ftdi pointer to ftdi_context
3876
3877 \retval Pointer to error string
3878*/
c3d95b87
TJ
3879char *ftdi_get_error_string (struct ftdi_context *ftdi)
3880{
22a1b5c1
TJ
3881 if (ftdi == NULL)
3882 return "";
3883
c3d95b87
TJ
3884 return ftdi->error_str;
3885}
a01d31e2 3886
b5ec1820 3887/* @} end of doxygen libftdi group */