libftdi: (tomj) ability to set RS232 break type
[libftdi] / src / ftdi.c
CommitLineData
a3da1d95
GE
1/***************************************************************************
2 ftdi.c - description
3 -------------------
4 begin : Fri Apr 4 2003
c201f80f 5 copyright : (C) 2003-2008 by Intra2net AG
5fdb1cb1 6 email : opensource@intra2net.com
a3da1d95
GE
7 ***************************************************************************/
8
9/***************************************************************************
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU Lesser General Public License *
13 * version 2.1 as published by the Free Software Foundation; *
14 * *
15 ***************************************************************************/
d9f0cce7 16
b5ec1820
TJ
17/**
18 \mainpage libftdi API documentation
19
ad397a4b 20 Library to talk to FTDI chips. You find the latest versions of libftdi at
b5ec1820
TJ
21 http://www.intra2net.com/de/produkte/opensource/ftdi/
22
ad397a4b
TJ
23 The library is easy to use. Have a look at this short example:
24 \include simple.c
25
26 More examples can be found in the "examples" directory.
b5ec1820
TJ
27*/
28/** \addtogroup libftdi */
29/* @{ */
30
98452d97 31#include <usb.h>
a8f46ddc 32#include <string.h>
d2f10023 33#include <errno.h>
0e302db6 34
98452d97 35#include "ftdi.h"
a3da1d95 36
7cc9950e 37/* stuff needed for async write */
f01d7ca6
TJ
38#ifdef LIBFTDI_LINUX_ASYNC_MODE
39 #include <sys/ioctl.h>
40 #include <sys/time.h>
41 #include <sys/select.h>
42 #include <sys/types.h>
43 #include <unistd.h>
44 #include <linux/usbdevice_fs.h>
45#endif
7cc9950e 46
21abaf2e 47#define ftdi_error_return(code, str) do { \
2f73e59f 48 ftdi->error_str = str; \
21abaf2e 49 return code; \
d2f10023 50 } while(0);
c3d95b87
TJ
51
52
1941414d
TJ
53/**
54 Initializes a ftdi_context.
4837f98a 55
1941414d 56 \param ftdi pointer to ftdi_context
4837f98a 57
1941414d
TJ
58 \retval 0: all fine
59 \retval -1: couldn't allocate read buffer
60
61 \remark This should be called before all functions
948f9ada 62*/
a8f46ddc
TJ
63int ftdi_init(struct ftdi_context *ftdi)
64{
7cc9950e
GE
65 int i;
66
98452d97 67 ftdi->usb_dev = NULL;
545820ce
TJ
68 ftdi->usb_read_timeout = 5000;
69 ftdi->usb_write_timeout = 5000;
a3da1d95 70
53ad271d 71 ftdi->type = TYPE_BM; /* chip type */
a3da1d95
GE
72 ftdi->baudrate = -1;
73 ftdi->bitbang_enabled = 0;
74
948f9ada
TJ
75 ftdi->readbuffer = NULL;
76 ftdi->readbuffer_offset = 0;
77 ftdi->readbuffer_remaining = 0;
78 ftdi->writebuffer_chunksize = 4096;
79
545820ce
TJ
80 ftdi->interface = 0;
81 ftdi->index = 0;
82 ftdi->in_ep = 0x02;
83 ftdi->out_ep = 0x81;
3119537f 84 ftdi->bitbang_mode = 1; /* 1: Normal bitbang mode, 2: SPI bitbang mode */
53ad271d 85
a3da1d95
GE
86 ftdi->error_str = NULL;
87
f01d7ca6 88#ifdef LIBFTDI_LINUX_ASYNC_MODE
7cc9950e
GE
89 ftdi->async_usb_buffer_size=10;
90 if ((ftdi->async_usb_buffer=malloc(sizeof(struct usbdevfs_urb)*ftdi->async_usb_buffer_size)) == NULL)
91 ftdi_error_return(-1, "out of memory for async usb buffer");
92
93 /* initialize async usb buffer with unused-marker */
94 for (i=0; i < ftdi->async_usb_buffer_size; i++)
95 ((struct usbdevfs_urb*)ftdi->async_usb_buffer)[i].usercontext = FTDI_URB_USERCONTEXT_COOKIE;
f01d7ca6
TJ
96#else
97 ftdi->async_usb_buffer_size=0;
98 ftdi->async_usb_buffer = NULL;
99#endif
7cc9950e 100
c201f80f
TJ
101 ftdi->eeprom_size = FTDI_DEFAULT_EEPROM_SIZE;
102
1c733d33
TJ
103 /* All fine. Now allocate the readbuffer */
104 return ftdi_read_data_set_chunksize(ftdi, 4096);
948f9ada 105}
4837f98a 106
1941414d 107/**
cef378aa
TJ
108 Allocate and initialize a new ftdi_context
109
110 \return a pointer to a new ftdi_context, or NULL on failure
111*/
112struct ftdi_context *ftdi_new()
113{
114 struct ftdi_context * ftdi = (struct ftdi_context *)malloc(sizeof(struct ftdi_context));
115
116 if (ftdi == NULL) {
117 return NULL;
118 }
119
120 if (ftdi_init(ftdi) != 0) {
121 free(ftdi);
122 return NULL;
123 }
124
125 return ftdi;
126}
127
128/**
1941414d
TJ
129 Open selected channels on a chip, otherwise use first channel.
130
131 \param ftdi pointer to ftdi_context
132 \param interface Interface to use for FT2232C chips.
133
134 \retval 0: all fine
135 \retval -1: unknown interface
c4446c36 136*/
0ce2f5fa 137int ftdi_set_interface(struct ftdi_context *ftdi, enum ftdi_interface interface)
c4446c36
TJ
138{
139 switch (interface) {
140 case INTERFACE_ANY:
141 case INTERFACE_A:
0ce2f5fa 142 /* ftdi_usb_open_desc cares to set the right index, depending on the found chip */
c4446c36
TJ
143 break;
144 case INTERFACE_B:
145 ftdi->interface = 1;
146 ftdi->index = INTERFACE_B;
147 ftdi->in_ep = 0x04;
148 ftdi->out_ep = 0x83;
149 break;
150 default:
151 ftdi_error_return(-1, "Unknown interface");
152 }
153 return 0;
154}
948f9ada 155
1941414d
TJ
156/**
157 Deinitializes a ftdi_context.
4837f98a 158
1941414d 159 \param ftdi pointer to ftdi_context
4837f98a 160*/
a8f46ddc
TJ
161void ftdi_deinit(struct ftdi_context *ftdi)
162{
7cc9950e
GE
163 if (ftdi->async_usb_buffer != NULL) {
164 free(ftdi->async_usb_buffer);
165 ftdi->async_usb_buffer = NULL;
166 }
167
948f9ada 168 if (ftdi->readbuffer != NULL) {
d9f0cce7
TJ
169 free(ftdi->readbuffer);
170 ftdi->readbuffer = NULL;
948f9ada 171 }
a3da1d95
GE
172}
173
1941414d 174/**
cef378aa
TJ
175 Deinitialize and free an ftdi_context.
176
177 \param ftdi pointer to ftdi_context
178*/
179void ftdi_free(struct ftdi_context *ftdi)
180{
181 ftdi_deinit(ftdi);
182 free(ftdi);
183}
184
185/**
1941414d
TJ
186 Use an already open libusb device.
187
188 \param ftdi pointer to ftdi_context
189 \param usb libusb usb_dev_handle to use
4837f98a 190*/
a8f46ddc
TJ
191void ftdi_set_usbdev (struct ftdi_context *ftdi, usb_dev_handle *usb)
192{
98452d97
TJ
193 ftdi->usb_dev = usb;
194}
195
196
1941414d
TJ
197/**
198 Finds all ftdi devices on the usb bus. Creates a new ftdi_device_list which
199 needs to be deallocated by ftdi_list_free() after use.
200
201 \param ftdi pointer to ftdi_context
202 \param devlist Pointer where to store list of found devices
203 \param vendor Vendor ID to search for
204 \param product Product ID to search for
edb82cbf 205
1941414d
TJ
206 \retval >0: number of devices found
207 \retval -1: usb_find_busses() failed
208 \retval -2: usb_find_devices() failed
209 \retval -3: out of memory
edb82cbf 210*/
d2f10023 211int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devlist, int vendor, int product)
edb82cbf
TJ
212{
213 struct ftdi_device_list **curdev;
214 struct usb_bus *bus;
215 struct usb_device *dev;
216 int count = 0;
d2f10023 217
edb82cbf
TJ
218 usb_init();
219 if (usb_find_busses() < 0)
220 ftdi_error_return(-1, "usb_find_busses() failed");
221 if (usb_find_devices() < 0)
222 ftdi_error_return(-2, "usb_find_devices() failed");
223
224 curdev = devlist;
6db32169 225 *curdev = NULL;
c3034a16 226 for (bus = usb_get_busses(); bus; bus = bus->next) {
edb82cbf
TJ
227 for (dev = bus->devices; dev; dev = dev->next) {
228 if (dev->descriptor.idVendor == vendor
229 && dev->descriptor.idProduct == product)
230 {
231 *curdev = (struct ftdi_device_list*)malloc(sizeof(struct ftdi_device_list));
232 if (!*curdev)
233 ftdi_error_return(-3, "out of memory");
d2f10023 234
edb82cbf
TJ
235 (*curdev)->next = NULL;
236 (*curdev)->dev = dev;
237
238 curdev = &(*curdev)->next;
239 count++;
240 }
241 }
242 }
d2f10023 243
edb82cbf
TJ
244 return count;
245}
246
1941414d
TJ
247/**
248 Frees a usb device list.
edb82cbf 249
1941414d 250 \param devlist USB device list created by ftdi_usb_find_all()
edb82cbf 251*/
d2f10023 252void ftdi_list_free(struct ftdi_device_list **devlist)
edb82cbf 253{
6db32169
TJ
254 struct ftdi_device_list *curdev, *next;
255
256 for (curdev = *devlist; curdev != NULL;) {
257 next = curdev->next;
258 free(curdev);
259 curdev = next;
edb82cbf
TJ
260 }
261
6db32169 262 *devlist = NULL;
edb82cbf
TJ
263}
264
1941414d 265/**
cef378aa
TJ
266 Frees a usb device list.
267
268 \param devlist USB device list created by ftdi_usb_find_all()
269*/
270void ftdi_list_free2(struct ftdi_device_list *devlist)
271{
272 ftdi_list_free(&devlist);
273}
274
275/**
474786c0
TJ
276 Return device ID strings from the usb device.
277
278 The parameters manufacturer, description and serial may be NULL
279 or pointer to buffers to store the fetched strings.
280
898c34dd
TJ
281 \note Use this function only in combination with ftdi_usb_find_all()
282 as it closes the internal "usb_dev" after use.
283
474786c0
TJ
284 \param ftdi pointer to ftdi_context
285 \param dev libusb usb_dev to use
286 \param manufacturer Store manufacturer string here if not NULL
287 \param mnf_len Buffer size of manufacturer string
288 \param description Store product description string here if not NULL
289 \param desc_len Buffer size of product description string
290 \param serial Store serial string here if not NULL
291 \param serial_len Buffer size of serial string
292
293 \retval 0: all fine
294 \retval -1: wrong arguments
295 \retval -4: unable to open device
296 \retval -7: get product manufacturer failed
297 \retval -8: get product description failed
298 \retval -9: get serial number failed
299 \retval -10: unable to close device
300*/
301int ftdi_usb_get_strings(struct ftdi_context * ftdi, struct usb_device * dev,
302 char * manufacturer, int mnf_len, char * description, int desc_len, char * serial, int serial_len)
303{
304 if ((ftdi==NULL) || (dev==NULL))
305 return -1;
306
307 if (!(ftdi->usb_dev = usb_open(dev)))
308 ftdi_error_return(-4, usb_strerror());
309
310 if (manufacturer != NULL) {
311 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iManufacturer, manufacturer, mnf_len) <= 0) {
312 usb_close (ftdi->usb_dev);
313 ftdi_error_return(-7, usb_strerror());
314 }
315 }
316
317 if (description != NULL) {
318 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, description, desc_len) <= 0) {
319 usb_close (ftdi->usb_dev);
320 ftdi_error_return(-8, usb_strerror());
321 }
322 }
323
324 if (serial != NULL) {
325 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, serial, serial_len) <= 0) {
326 usb_close (ftdi->usb_dev);
327 ftdi_error_return(-9, usb_strerror());
328 }
329 }
330
331 if (usb_close (ftdi->usb_dev) != 0)
332 ftdi_error_return(-10, usb_strerror());
333
334 return 0;
335}
336
337/**
1941414d 338 Opens a ftdi device given by a usb_device.
7b18bef6 339
1941414d
TJ
340 \param ftdi pointer to ftdi_context
341 \param dev libusb usb_dev to use
342
343 \retval 0: all fine
23b1798d 344 \retval -3: unable to config device
1941414d
TJ
345 \retval -4: unable to open device
346 \retval -5: unable to claim device
347 \retval -6: reset failed
348 \retval -7: set baudrate failed
7b18bef6
TJ
349*/
350int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct usb_device *dev)
351{
d2f10023 352 int detach_errno = 0;
7b18bef6
TJ
353 if (!(ftdi->usb_dev = usb_open(dev)))
354 ftdi_error_return(-4, "usb_open() failed");
d2f10023
TJ
355
356#ifdef LIBUSB_HAS_GET_DRIVER_NP
22592e17
TJ
357 // Try to detach ftdi_sio kernel module.
358 // Returns ENODATA if driver is not loaded.
359 //
360 // The return code is kept in a separate variable and only parsed
361 // if usb_set_configuration() or usb_claim_interface() fails as the
362 // detach operation might be denied and everything still works fine.
363 // Likely scenario is a static ftdi_sio kernel module.
d2f10023
TJ
364 if (usb_detach_kernel_driver_np(ftdi->usb_dev, ftdi->interface) != 0 && errno != ENODATA)
365 detach_errno = errno;
366#endif
367
b57aedfd
GE
368 // set configuration (needed especially for windows)
369 // tolerate EBUSY: one device with one configuration, but two interfaces
370 // and libftdi sessions to both interfaces (e.g. FT2232)
371 if (dev->descriptor.bNumConfigurations > 0 &&
372 usb_set_configuration(ftdi->usb_dev, dev->config[0].bConfigurationValue) &&
373 errno != EBUSY)
374 {
23b1798d
TJ
375 usb_close (ftdi->usb_dev);
376 if (detach_errno == EPERM) {
377 ftdi_error_return(-8, "inappropriate permissions on device!");
378 } else {
379 ftdi_error_return(-3, "unable to set usb configuration. Make sure ftdi_sio is unloaded!");
380 }
381 }
382
7b18bef6
TJ
383 if (usb_claim_interface(ftdi->usb_dev, ftdi->interface) != 0) {
384 usb_close (ftdi->usb_dev);
d2f10023
TJ
385 if (detach_errno == EPERM) {
386 ftdi_error_return(-8, "inappropriate permissions on device!");
387 } else {
388 ftdi_error_return(-5, "unable to claim usb device. Make sure ftdi_sio is unloaded!");
389 }
7b18bef6
TJ
390 }
391
392 if (ftdi_usb_reset (ftdi) != 0) {
393 usb_close (ftdi->usb_dev);
394 ftdi_error_return(-6, "ftdi_usb_reset failed");
395 }
396
397 if (ftdi_set_baudrate (ftdi, 9600) != 0) {
398 usb_close (ftdi->usb_dev);
399 ftdi_error_return(-7, "set baudrate failed");
400 }
401
402 // Try to guess chip type
403 // Bug in the BM type chips: bcdDevice is 0x200 for serial == 0
404 if (dev->descriptor.bcdDevice == 0x400 || (dev->descriptor.bcdDevice == 0x200
405 && dev->descriptor.iSerialNumber == 0))
406 ftdi->type = TYPE_BM;
407 else if (dev->descriptor.bcdDevice == 0x200)
408 ftdi->type = TYPE_AM;
409 else if (dev->descriptor.bcdDevice == 0x500) {
410 ftdi->type = TYPE_2232C;
411 if (!ftdi->index)
412 ftdi->index = INTERFACE_A;
cb6250fa
TJ
413 } else if (dev->descriptor.bcdDevice == 0x600)
414 ftdi->type = TYPE_R;
7b18bef6
TJ
415
416 ftdi_error_return(0, "all fine");
417}
418
1941414d
TJ
419/**
420 Opens the first device with a given vendor and product ids.
421
422 \param ftdi pointer to ftdi_context
423 \param vendor Vendor ID
424 \param product Product ID
425
9bec2387 426 \retval same as ftdi_usb_open_desc()
1941414d 427*/
edb82cbf
TJ
428int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product)
429{
430 return ftdi_usb_open_desc(ftdi, vendor, product, NULL, NULL);
431}
432
1941414d
TJ
433/**
434 Opens the first device with a given, vendor id, product id,
435 description and serial.
436
437 \param ftdi pointer to ftdi_context
438 \param vendor Vendor ID
439 \param product Product ID
440 \param description Description to search for. Use NULL if not needed.
441 \param serial Serial to search for. Use NULL if not needed.
442
443 \retval 0: all fine
444 \retval -1: usb_find_busses() failed
445 \retval -2: usb_find_devices() failed
446 \retval -3: usb device not found
447 \retval -4: unable to open device
448 \retval -5: unable to claim device
449 \retval -6: reset failed
450 \retval -7: set baudrate failed
451 \retval -8: get product description failed
452 \retval -9: get serial number failed
453 \retval -10: unable to close device
a3da1d95 454*/
04e1ea0a 455int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product,
a8f46ddc
TJ
456 const char* description, const char* serial)
457{
98452d97
TJ
458 struct usb_bus *bus;
459 struct usb_device *dev;
c3d95b87 460 char string[256];
98452d97
TJ
461
462 usb_init();
463
c3d95b87
TJ
464 if (usb_find_busses() < 0)
465 ftdi_error_return(-1, "usb_find_busses() failed");
c3d95b87 466 if (usb_find_devices() < 0)
edb82cbf 467 ftdi_error_return(-2, "usb_find_devices() failed");
a3da1d95 468
c3034a16 469 for (bus = usb_get_busses(); bus; bus = bus->next) {
98452d97 470 for (dev = bus->devices; dev; dev = dev->next) {
a8f46ddc 471 if (dev->descriptor.idVendor == vendor
c3d95b87
TJ
472 && dev->descriptor.idProduct == product) {
473 if (!(ftdi->usb_dev = usb_open(dev)))
474 ftdi_error_return(-4, "usb_open() failed");
475
a8f46ddc
TJ
476 if (description != NULL) {
477 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iProduct, string, sizeof(string)) <= 0) {
c3d95b87
TJ
478 usb_close (ftdi->usb_dev);
479 ftdi_error_return(-8, "unable to fetch product description");
98452d97 480 }
a8f46ddc 481 if (strncmp(string, description, sizeof(string)) != 0) {
edb82cbf
TJ
482 if (usb_close (ftdi->usb_dev) != 0)
483 ftdi_error_return(-10, "unable to close device");
a8f46ddc
TJ
484 continue;
485 }
486 }
487 if (serial != NULL) {
488 if (usb_get_string_simple(ftdi->usb_dev, dev->descriptor.iSerialNumber, string, sizeof(string)) <= 0) {
c3d95b87
TJ
489 usb_close (ftdi->usb_dev);
490 ftdi_error_return(-9, "unable to fetch serial number");
a8f46ddc
TJ
491 }
492 if (strncmp(string, serial, sizeof(string)) != 0) {
a8f46ddc 493 if (usb_close (ftdi->usb_dev) != 0)
edb82cbf 494 ftdi_error_return(-10, "unable to close device");
a8f46ddc
TJ
495 continue;
496 }
497 }
98452d97 498
edb82cbf
TJ
499 if (usb_close (ftdi->usb_dev) != 0)
500 ftdi_error_return(-10, "unable to close device");
d2f10023 501
edb82cbf 502 return ftdi_usb_open_dev(ftdi, dev);
98452d97
TJ
503 }
504 }
98452d97 505 }
a3da1d95 506
98452d97 507 // device not found
c3d95b87 508 ftdi_error_return(-3, "device not found");
a3da1d95
GE
509}
510
1941414d
TJ
511/**
512 Resets the ftdi device.
a3da1d95 513
1941414d
TJ
514 \param ftdi pointer to ftdi_context
515
516 \retval 0: all fine
517 \retval -1: FTDI reset failed
4837f98a 518*/
edb82cbf 519int ftdi_usb_reset(struct ftdi_context *ftdi)
a8f46ddc 520{
c3d95b87
TJ
521 if (usb_control_msg(ftdi->usb_dev, 0x40, 0, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
522 ftdi_error_return(-1,"FTDI reset failed");
523
545820ce 524 // Invalidate data in the readbuffer
bfcee05b
TJ
525 ftdi->readbuffer_offset = 0;
526 ftdi->readbuffer_remaining = 0;
527
a3da1d95
GE
528 return 0;
529}
530
1941414d 531/**
1189b11a 532 Clears the read buffer on the chip and the internal read buffer.
1941414d
TJ
533
534 \param ftdi pointer to ftdi_context
4837f98a 535
1941414d 536 \retval 0: all fine
1189b11a 537 \retval -1: read buffer purge failed
4837f98a 538*/
1189b11a 539int ftdi_usb_purge_rx_buffer(struct ftdi_context *ftdi)
a8f46ddc 540{
c3d95b87
TJ
541 if (usb_control_msg(ftdi->usb_dev, 0x40, 0, 1, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
542 ftdi_error_return(-1, "FTDI purge of RX buffer failed");
543
545820ce 544 // Invalidate data in the readbuffer
bfcee05b
TJ
545 ftdi->readbuffer_offset = 0;
546 ftdi->readbuffer_remaining = 0;
a60be878 547
1189b11a
TJ
548 return 0;
549}
550
551/**
552 Clears the write buffer on the chip.
553
554 \param ftdi pointer to ftdi_context
555
556 \retval 0: all fine
557 \retval -1: write buffer purge failed
558*/
559int ftdi_usb_purge_tx_buffer(struct ftdi_context *ftdi)
560{
c3d95b87 561 if (usb_control_msg(ftdi->usb_dev, 0x40, 0, 2, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1189b11a
TJ
562 ftdi_error_return(-1, "FTDI purge of TX buffer failed");
563
564 return 0;
565}
566
567/**
568 Clears the buffers on the chip and the internal read buffer.
569
570 \param ftdi pointer to ftdi_context
571
572 \retval 0: all fine
573 \retval -1: read buffer purge failed
574 \retval -2: write buffer purge failed
575*/
576int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)
577{
578 int result;
579
580 result = ftdi_usb_purge_rx_buffer(ftdi);
5a2b51cb 581 if (result < 0)
1189b11a
TJ
582 return -1;
583
584 result = ftdi_usb_purge_tx_buffer(ftdi);
5a2b51cb 585 if (result < 0)
1189b11a 586 return -2;
545820ce 587
a60be878
TJ
588 return 0;
589}
a3da1d95 590
1941414d
TJ
591/**
592 Closes the ftdi device. Call ftdi_deinit() if you're cleaning up.
593
594 \param ftdi pointer to ftdi_context
595
596 \retval 0: all fine
597 \retval -1: usb_release failed
598 \retval -2: usb_close failed
a3da1d95 599*/
a8f46ddc
TJ
600int ftdi_usb_close(struct ftdi_context *ftdi)
601{
a3da1d95
GE
602 int rtn = 0;
603
f01d7ca6 604#ifdef LIBFTDI_LINUX_ASYNC_MODE
7cc9950e
GE
605 /* try to release some kernel resources */
606 ftdi_async_complete(ftdi,1);
f01d7ca6 607#endif
7cc9950e 608
98452d97 609 if (usb_release_interface(ftdi->usb_dev, ftdi->interface) != 0)
a3da1d95 610 rtn = -1;
98452d97
TJ
611
612 if (usb_close (ftdi->usb_dev) != 0)
a3da1d95 613 rtn = -2;
98452d97 614
a3da1d95
GE
615 return rtn;
616}
617
a3da1d95 618/*
53ad271d
TJ
619 ftdi_convert_baudrate returns nearest supported baud rate to that requested.
620 Function is only used internally
b5ec1820 621 \internal
53ad271d 622*/
0126d22e 623static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi,
a8f46ddc
TJ
624 unsigned short *value, unsigned short *index)
625{
53ad271d
TJ
626 static const char am_adjust_up[8] = {0, 0, 0, 1, 0, 3, 2, 1};
627 static const char am_adjust_dn[8] = {0, 0, 0, 1, 0, 1, 2, 3};
628 static const char frac_code[8] = {0, 3, 2, 4, 1, 5, 6, 7};
629 int divisor, best_divisor, best_baud, best_baud_diff;
630 unsigned long encoded_divisor;
631 int i;
632
633 if (baudrate <= 0) {
634 // Return error
635 return -1;
636 }
637
638 divisor = 24000000 / baudrate;
639
0126d22e 640 if (ftdi->type == TYPE_AM) {
53ad271d
TJ
641 // Round down to supported fraction (AM only)
642 divisor -= am_adjust_dn[divisor & 7];
643 }
644
645 // Try this divisor and the one above it (because division rounds down)
646 best_divisor = 0;
647 best_baud = 0;
648 best_baud_diff = 0;
649 for (i = 0; i < 2; i++) {
650 int try_divisor = divisor + i;
651 int baud_estimate;
652 int baud_diff;
653
654 // Round up to supported divisor value
df612d35 655 if (try_divisor <= 8) {
53ad271d
TJ
656 // Round up to minimum supported divisor
657 try_divisor = 8;
0126d22e 658 } else if (ftdi->type != TYPE_AM && try_divisor < 12) {
53ad271d
TJ
659 // BM doesn't support divisors 9 through 11 inclusive
660 try_divisor = 12;
661 } else if (divisor < 16) {
662 // AM doesn't support divisors 9 through 15 inclusive
663 try_divisor = 16;
664 } else {
0126d22e 665 if (ftdi->type == TYPE_AM) {
53ad271d
TJ
666 // Round up to supported fraction (AM only)
667 try_divisor += am_adjust_up[try_divisor & 7];
668 if (try_divisor > 0x1FFF8) {
669 // Round down to maximum supported divisor value (for AM)
670 try_divisor = 0x1FFF8;
671 }
672 } else {
673 if (try_divisor > 0x1FFFF) {
674 // Round down to maximum supported divisor value (for BM)
675 try_divisor = 0x1FFFF;
676 }
677 }
678 }
679 // Get estimated baud rate (to nearest integer)
680 baud_estimate = (24000000 + (try_divisor / 2)) / try_divisor;
681 // Get absolute difference from requested baud rate
682 if (baud_estimate < baudrate) {
683 baud_diff = baudrate - baud_estimate;
684 } else {
685 baud_diff = baud_estimate - baudrate;
686 }
687 if (i == 0 || baud_diff < best_baud_diff) {
688 // Closest to requested baud rate so far
689 best_divisor = try_divisor;
690 best_baud = baud_estimate;
691 best_baud_diff = baud_diff;
692 if (baud_diff == 0) {
693 // Spot on! No point trying
694 break;
695 }
696 }
697 }
698 // Encode the best divisor value
699 encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 7] << 14);
700 // Deal with special cases for encoded value
701 if (encoded_divisor == 1) {
4837f98a 702 encoded_divisor = 0; // 3000000 baud
53ad271d 703 } else if (encoded_divisor == 0x4001) {
4837f98a 704 encoded_divisor = 1; // 2000000 baud (BM only)
53ad271d
TJ
705 }
706 // Split into "value" and "index" values
707 *value = (unsigned short)(encoded_divisor & 0xFFFF);
de22df10 708 if(ftdi->type == TYPE_2232C) {
0126d22e
TJ
709 *index = (unsigned short)(encoded_divisor >> 8);
710 *index &= 0xFF00;
a9c57c05 711 *index |= ftdi->index;
0126d22e
TJ
712 }
713 else
714 *index = (unsigned short)(encoded_divisor >> 16);
c3d95b87 715
53ad271d
TJ
716 // Return the nearest baud rate
717 return best_baud;
718}
719
1941414d 720/**
9bec2387 721 Sets the chip baud rate
1941414d
TJ
722
723 \param ftdi pointer to ftdi_context
9bec2387 724 \param baudrate baud rate to set
1941414d
TJ
725
726 \retval 0: all fine
727 \retval -1: invalid baudrate
728 \retval -2: setting baudrate failed
a3da1d95 729*/
a8f46ddc
TJ
730int ftdi_set_baudrate(struct ftdi_context *ftdi, int baudrate)
731{
53ad271d
TJ
732 unsigned short value, index;
733 int actual_baudrate;
a3da1d95
GE
734
735 if (ftdi->bitbang_enabled) {
736 baudrate = baudrate*4;
737 }
738
25707904 739 actual_baudrate = ftdi_convert_baudrate(baudrate, ftdi, &value, &index);
c3d95b87
TJ
740 if (actual_baudrate <= 0)
741 ftdi_error_return (-1, "Silly baudrate <= 0.");
a3da1d95 742
53ad271d
TJ
743 // Check within tolerance (about 5%)
744 if ((actual_baudrate * 2 < baudrate /* Catch overflows */ )
745 || ((actual_baudrate < baudrate)
746 ? (actual_baudrate * 21 < baudrate * 20)
c3d95b87
TJ
747 : (baudrate * 21 < actual_baudrate * 20)))
748 ftdi_error_return (-1, "Unsupported baudrate. Note: bitbang baudrates are automatically multiplied by 4");
545820ce 749
c3d95b87
TJ
750 if (usb_control_msg(ftdi->usb_dev, 0x40, 3, value, index, NULL, 0, ftdi->usb_write_timeout) != 0)
751 ftdi_error_return (-2, "Setting new baudrate failed");
a3da1d95
GE
752
753 ftdi->baudrate = baudrate;
754 return 0;
755}
756
1941414d 757/**
6c32e222
TJ
758 Set (RS232) line characteristics.
759 The break type can only be set via ftdi_set_line_property2()
760 and defaults to "off".
4837f98a 761
1941414d
TJ
762 \param ftdi pointer to ftdi_context
763 \param bits Number of bits
764 \param sbit Number of stop bits
765 \param parity Parity mode
766
767 \retval 0: all fine
768 \retval -1: Setting line property failed
2f73e59f
TJ
769*/
770int ftdi_set_line_property(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
d2f10023 771 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity)
2f73e59f 772{
6c32e222
TJ
773 return ftdi_set_line_property2(ftdi, bits, sbit, parity, BREAK_OFF);
774}
775
776/**
777 Set (RS232) line characteristics
778
779 \param ftdi pointer to ftdi_context
780 \param bits Number of bits
781 \param sbit Number of stop bits
782 \param parity Parity mode
783 \param break_type Break type
784
785 \retval 0: all fine
786 \retval -1: Setting line property failed
787*/
788int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,
789 enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,
790 enum ftdi_break_type break_type)
791{
2f73e59f
TJ
792 unsigned short value = bits;
793
794 switch(parity) {
795 case NONE:
796 value |= (0x00 << 8);
797 break;
798 case ODD:
799 value |= (0x01 << 8);
800 break;
801 case EVEN:
802 value |= (0x02 << 8);
803 break;
804 case MARK:
805 value |= (0x03 << 8);
806 break;
807 case SPACE:
808 value |= (0x04 << 8);
809 break;
810 }
d2f10023 811
2f73e59f
TJ
812 switch(sbit) {
813 case STOP_BIT_1:
814 value |= (0x00 << 11);
815 break;
816 case STOP_BIT_15:
817 value |= (0x01 << 11);
818 break;
819 case STOP_BIT_2:
820 value |= (0x02 << 11);
821 break;
822 }
d2f10023 823
6c32e222
TJ
824 switch(break_type) {
825 case BREAK_OFF:
826 value |= (0x00 << 14);
827 break;
828 case BREAK_ON:
829 value |= (0x01 << 14);
830 break;
831 }
832
2f73e59f
TJ
833 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x04, value, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
834 ftdi_error_return (-1, "Setting new line property failed");
d2f10023 835
2f73e59f
TJ
836 return 0;
837}
a3da1d95 838
1941414d
TJ
839/**
840 Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip
841
842 \param ftdi pointer to ftdi_context
843 \param buf Buffer with the data
844 \param size Size of the buffer
845
846 \retval <0: error code from usb_bulk_write()
847 \retval >0: number of bytes written
848*/
a8f46ddc
TJ
849int ftdi_write_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
850{
a3da1d95
GE
851 int ret;
852 int offset = 0;
545820ce 853 int total_written = 0;
c3d95b87 854
a3da1d95 855 while (offset < size) {
948f9ada 856 int write_size = ftdi->writebuffer_chunksize;
a3da1d95
GE
857
858 if (offset+write_size > size)
859 write_size = size-offset;
860
98452d97 861 ret = usb_bulk_write(ftdi->usb_dev, ftdi->in_ep, buf+offset, write_size, ftdi->usb_write_timeout);
c3d95b87
TJ
862 if (ret < 0)
863 ftdi_error_return(ret, "usb bulk write failed");
a3da1d95 864
c3d95b87 865 total_written += ret;
a3da1d95
GE
866 offset += write_size;
867 }
868
545820ce 869 return total_written;
a3da1d95
GE
870}
871
f01d7ca6 872#ifdef LIBFTDI_LINUX_ASYNC_MODE
4c9e3812
GE
873/* this is strongly dependent on libusb using the same struct layout. If libusb
874 changes in some later version this may break horribly (this is for libusb 0.1.12) */
875struct usb_dev_handle {
876 int fd;
877 // some other stuff coming here we don't need
878};
879
84f85aaa 880/**
c201f80f
TJ
881 Check for pending async urbs
882 \internal
883*/
884static int _usb_get_async_urbs_pending(struct ftdi_context *ftdi)
7cc9950e
GE
885{
886 struct usbdevfs_urb *urb;
887 int pending=0;
888 int i;
889
890 for (i=0; i < ftdi->async_usb_buffer_size; i++) {
891 urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
892 if (urb->usercontext != FTDI_URB_USERCONTEXT_COOKIE)
893 pending++;
894 }
895
896 return pending;
897}
898
84f85aaa
GE
899/**
900 Wait until one or more async URBs are completed by the kernel and mark their
901 positions in the async-buffer as unused
902
903 \param ftdi pointer to ftdi_context
904 \param wait_for_more if != 0 wait for more than one write to complete
905 \param timeout_msec max milliseconds to wait
906
c201f80f
TJ
907 \internal
908*/
909static void _usb_async_cleanup(struct ftdi_context *ftdi, int wait_for_more, int timeout_msec)
7cc9950e
GE
910{
911 struct timeval tv;
912 struct usbdevfs_urb *urb=NULL;
913 int ret;
914 fd_set writefds;
915 int keep_going=0;
916
917 FD_ZERO(&writefds);
918 FD_SET(ftdi->usb_dev->fd, &writefds);
919
920 /* init timeout only once, select writes time left after call */
921 tv.tv_sec = timeout_msec / 1000;
922 tv.tv_usec = (timeout_msec % 1000) * 1000;
923
924 do {
c201f80f 925 while (_usb_get_async_urbs_pending(ftdi)
7cc9950e
GE
926 && (ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_REAPURBNDELAY, &urb)) == -1
927 && errno == EAGAIN)
928 {
929 if (keep_going && !wait_for_more) {
930 /* don't wait if repeating only for keep_going */
931 keep_going=0;
932 break;
933 }
934
935 /* wait for timeout msec or something written ready */
936 select(ftdi->usb_dev->fd+1, NULL, &writefds, NULL, &tv);
937 }
938
939 if (ret == 0 && urb != NULL) {
940 /* got a free urb, mark it */
941 urb->usercontext = FTDI_URB_USERCONTEXT_COOKIE;
942
943 /* try to get more urbs that are ready now, but don't wait anymore */
944 urb=NULL;
945 keep_going=1;
946 } else {
947 /* no more urbs waiting */
948 keep_going=0;
949 }
950 } while (keep_going);
951}
952
953/**
84f85aaa
GE
954 Wait until one or more async URBs are completed by the kernel and mark their
955 positions in the async-buffer as unused.
7cc9950e
GE
956
957 \param ftdi pointer to ftdi_context
958 \param wait_for_more if != 0 wait for more than one write to complete (until write timeout)
959*/
960void ftdi_async_complete(struct ftdi_context *ftdi, int wait_for_more)
961{
c201f80f 962 _usb_async_cleanup(ftdi,wait_for_more,ftdi->usb_write_timeout);
7cc9950e 963}
4c9e3812
GE
964
965/**
966 Stupid libusb does not offer async writes nor does it allow
967 access to its fd - so we need some hacks here.
c201f80f 968 \internal
4c9e3812 969*/
c201f80f 970static int _usb_bulk_write_async(struct ftdi_context *ftdi, int ep, char *bytes, int size)
4c9e3812 971{
7cc9950e 972 struct usbdevfs_urb *urb;
4c9e3812 973 int bytesdone = 0, requested;
7cc9950e
GE
974 int ret, i;
975 int cleanup_count;
4c9e3812
GE
976
977 do {
7cc9950e
GE
978 /* find a free urb buffer we can use */
979 urb=NULL;
980 for (cleanup_count=0; urb==NULL && cleanup_count <= 1; cleanup_count++)
981 {
982 if (i==ftdi->async_usb_buffer_size) {
983 /* wait until some buffers are free */
c201f80f 984 _usb_async_cleanup(ftdi,0,ftdi->usb_write_timeout);
7cc9950e
GE
985 }
986
987 for (i=0; i < ftdi->async_usb_buffer_size; i++) {
988 urb=&((struct usbdevfs_urb *)(ftdi->async_usb_buffer))[i];
989 if (urb->usercontext == FTDI_URB_USERCONTEXT_COOKIE)
990 break; /* found a free urb position */
991 urb=NULL;
992 }
993 }
994
995 /* no free urb position found */
996 if (urb==NULL)
997 return -1;
4c9e3812
GE
998
999 requested = size - bytesdone;
7cc9950e
GE
1000 if (requested > 4096)
1001 requested = 4096;
1002
1003 memset(urb,0,sizeof(urb));
1004
1005 urb->type = USBDEVFS_URB_TYPE_BULK;
1006 urb->endpoint = ep;
1007 urb->flags = 0;
1008 urb->buffer = bytes + bytesdone;
1009 urb->buffer_length = requested;
1010 urb->signr = 0;
1011 urb->actual_length = 0;
1012 urb->number_of_packets = 0;
1013 urb->usercontext = 0;
1014
1015 do {
1016 ret = ioctl(ftdi->usb_dev->fd, USBDEVFS_SUBMITURB, urb);
1017 } while (ret < 0 && errno == EINTR);
4c9e3812
GE
1018 if (ret < 0)
1019 return ret; /* the caller can read errno to get more info */
1020
1021 bytesdone += requested;
1022 } while (bytesdone < size);
1023 return bytesdone;
1024}
1025
1026/**
1027 Writes data in chunks (see ftdi_write_data_set_chunksize()) to the chip.
1028 Does not wait for completion of the transfer nor does it make sure that
1029 the transfer was successful.
1030
1031 This function could be extended to use signals and callbacks to inform the
1032 caller of completion or error - but this is not done yet, volunteers welcome.
1033
1034 Works around libusb and directly accesses functions only available on Linux.
cef378aa 1035 Only available if compiled with --with-async-mode.
4c9e3812
GE
1036
1037 \param ftdi pointer to ftdi_context
1038 \param buf Buffer with the data
1039 \param size Size of the buffer
1040
1041 \retval <0: error code from usb_bulk_write()
1042 \retval >0: number of bytes written
1043*/
1044int ftdi_write_data_async(struct ftdi_context *ftdi, unsigned char *buf, int size)
1045{
1046 int ret;
1047 int offset = 0;
1048 int total_written = 0;
1049
1050 while (offset < size) {
1051 int write_size = ftdi->writebuffer_chunksize;
1052
1053 if (offset+write_size > size)
1054 write_size = size-offset;
1055
c201f80f 1056 ret = _usb_bulk_write_async(ftdi, ftdi->in_ep, buf+offset, write_size);
4c9e3812
GE
1057 if (ret < 0)
1058 ftdi_error_return(ret, "usb bulk write async failed");
1059
1060 total_written += ret;
1061 offset += write_size;
1062 }
1063
1064 return total_written;
1065}
f01d7ca6 1066#endif // LIBFTDI_LINUX_ASYNC_MODE
4c9e3812 1067
1941414d
TJ
1068/**
1069 Configure write buffer chunk size.
1070 Default is 4096.
1071
1072 \param ftdi pointer to ftdi_context
1073 \param chunksize Chunk size
a3da1d95 1074
1941414d
TJ
1075 \retval 0: all fine
1076*/
a8f46ddc
TJ
1077int ftdi_write_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1078{
948f9ada
TJ
1079 ftdi->writebuffer_chunksize = chunksize;
1080 return 0;
1081}
1082
1941414d
TJ
1083/**
1084 Get write buffer chunk size.
1085
1086 \param ftdi pointer to ftdi_context
1087 \param chunksize Pointer to store chunk size in
948f9ada 1088
1941414d
TJ
1089 \retval 0: all fine
1090*/
a8f46ddc
TJ
1091int ftdi_write_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1092{
948f9ada
TJ
1093 *chunksize = ftdi->writebuffer_chunksize;
1094 return 0;
1095}
cbabb7d3 1096
1941414d
TJ
1097/**
1098 Reads data in chunks (see ftdi_read_data_set_chunksize()) from the chip.
1099
1100 Automatically strips the two modem status bytes transfered during every read.
948f9ada 1101
1941414d
TJ
1102 \param ftdi pointer to ftdi_context
1103 \param buf Buffer to store data in
1104 \param size Size of the buffer
1105
1106 \retval <0: error code from usb_bulk_read()
d77b0e94 1107 \retval 0: no data was available
1941414d
TJ
1108 \retval >0: number of bytes read
1109
1110 \remark This function is not useful in bitbang mode.
1111 Use ftdi_read_pins() to get the current state of the pins.
1112*/
a8f46ddc
TJ
1113int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size)
1114{
1c733d33 1115 int offset = 0, ret = 1, i, num_of_chunks, chunk_remains;
d9f0cce7 1116
948f9ada
TJ
1117 // everything we want is still in the readbuffer?
1118 if (size <= ftdi->readbuffer_remaining) {
d9f0cce7
TJ
1119 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, size);
1120
1121 // Fix offsets
1122 ftdi->readbuffer_remaining -= size;
1123 ftdi->readbuffer_offset += size;
1124
545820ce 1125 /* printf("Returning bytes from buffer: %d - remaining: %d\n", size, ftdi->readbuffer_remaining); */
d9f0cce7
TJ
1126
1127 return size;
979a145c 1128 }
948f9ada
TJ
1129 // something still in the readbuffer, but not enough to satisfy 'size'?
1130 if (ftdi->readbuffer_remaining != 0) {
d9f0cce7 1131 memcpy (buf, ftdi->readbuffer+ftdi->readbuffer_offset, ftdi->readbuffer_remaining);
979a145c 1132
d9f0cce7
TJ
1133 // Fix offset
1134 offset += ftdi->readbuffer_remaining;
948f9ada 1135 }
948f9ada 1136 // do the actual USB read
cbabb7d3 1137 while (offset < size && ret > 0) {
d9f0cce7
TJ
1138 ftdi->readbuffer_remaining = 0;
1139 ftdi->readbuffer_offset = 0;
98452d97
TJ
1140 /* returns how much received */
1141 ret = usb_bulk_read (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, ftdi->usb_read_timeout);
c3d95b87
TJ
1142 if (ret < 0)
1143 ftdi_error_return(ret, "usb bulk read failed");
98452d97 1144
d9f0cce7
TJ
1145 if (ret > 2) {
1146 // skip FTDI status bytes.
1147 // Maybe stored in the future to enable modem use
1c733d33
TJ
1148 num_of_chunks = ret / 64;
1149 chunk_remains = ret % 64;
1150 //printf("ret = %X, num_of_chunks = %X, chunk_remains = %X, readbuffer_offset = %X\n", ret, num_of_chunks, chunk_remains, ftdi->readbuffer_offset);
1151
d9f0cce7
TJ
1152 ftdi->readbuffer_offset += 2;
1153 ret -= 2;
1c733d33 1154
fde0a89e 1155 if (ret > 62) {
1c733d33
TJ
1156 for (i = 1; i < num_of_chunks; i++)
1157 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,
1158 ftdi->readbuffer+ftdi->readbuffer_offset+64*i,
1159 62);
1160 if (chunk_remains > 2) {
1161 memmove (ftdi->readbuffer+ftdi->readbuffer_offset+62*i,
1162 ftdi->readbuffer+ftdi->readbuffer_offset+64*i,
1163 chunk_remains-2);
1164 ret -= 2*num_of_chunks;
1165 } else
1166 ret -= 2*(num_of_chunks-1)+chunk_remains;
1167 }
d9f0cce7
TJ
1168 } else if (ret <= 2) {
1169 // no more data to read?
1170 return offset;
1171 }
d9f0cce7
TJ
1172 if (ret > 0) {
1173 // data still fits in buf?
1174 if (offset+ret <= size) {
1175 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, ret);
545820ce 1176 //printf("buf[0] = %X, buf[1] = %X\n", buf[0], buf[1]);
d9f0cce7
TJ
1177 offset += ret;
1178
53ad271d 1179 /* Did we read exactly the right amount of bytes? */
d9f0cce7 1180 if (offset == size)
c4446c36
TJ
1181 //printf("read_data exact rem %d offset %d\n",
1182 //ftdi->readbuffer_remaining, offset);
d9f0cce7
TJ
1183 return offset;
1184 } else {
1185 // only copy part of the data or size <= readbuffer_chunksize
1186 int part_size = size-offset;
1187 memcpy (buf+offset, ftdi->readbuffer+ftdi->readbuffer_offset, part_size);
98452d97 1188
d9f0cce7
TJ
1189 ftdi->readbuffer_offset += part_size;
1190 ftdi->readbuffer_remaining = ret-part_size;
1191 offset += part_size;
1192
53ad271d
TJ
1193 /* printf("Returning part: %d - size: %d - offset: %d - ret: %d - remaining: %d\n",
1194 part_size, size, offset, ret, ftdi->readbuffer_remaining); */
d9f0cce7
TJ
1195
1196 return offset;
1197 }
1198 }
cbabb7d3 1199 }
948f9ada 1200 // never reached
29c4af7f 1201 return -127;
a3da1d95
GE
1202}
1203
1941414d
TJ
1204/**
1205 Configure read buffer chunk size.
1206 Default is 4096.
1207
1208 Automatically reallocates the buffer.
a3da1d95 1209
1941414d
TJ
1210 \param ftdi pointer to ftdi_context
1211 \param chunksize Chunk size
1212
1213 \retval 0: all fine
1214*/
a8f46ddc
TJ
1215int ftdi_read_data_set_chunksize(struct ftdi_context *ftdi, unsigned int chunksize)
1216{
29c4af7f
TJ
1217 unsigned char *new_buf;
1218
948f9ada
TJ
1219 // Invalidate all remaining data
1220 ftdi->readbuffer_offset = 0;
1221 ftdi->readbuffer_remaining = 0;
1222
c3d95b87
TJ
1223 if ((new_buf = (unsigned char *)realloc(ftdi->readbuffer, chunksize)) == NULL)
1224 ftdi_error_return(-1, "out of memory for readbuffer");
d9f0cce7 1225
948f9ada
TJ
1226 ftdi->readbuffer = new_buf;
1227 ftdi->readbuffer_chunksize = chunksize;
1228
1229 return 0;
1230}
1231
1941414d
TJ
1232/**
1233 Get read buffer chunk size.
948f9ada 1234
1941414d
TJ
1235 \param ftdi pointer to ftdi_context
1236 \param chunksize Pointer to store chunk size in
1237
1238 \retval 0: all fine
1239*/
a8f46ddc
TJ
1240int ftdi_read_data_get_chunksize(struct ftdi_context *ftdi, unsigned int *chunksize)
1241{
948f9ada
TJ
1242 *chunksize = ftdi->readbuffer_chunksize;
1243 return 0;
1244}
1245
1246
1941414d
TJ
1247/**
1248 Enable bitbang mode.
948f9ada 1249
1941414d
TJ
1250 For advanced bitbang modes of the FT2232C chip use ftdi_set_bitmode().
1251
1252 \param ftdi pointer to ftdi_context
1253 \param bitmask Bitmask to configure lines.
1254 HIGH/ON value configures a line as output.
1255
1256 \retval 0: all fine
1257 \retval -1: can't enable bitbang mode
1258*/
a8f46ddc
TJ
1259int ftdi_enable_bitbang(struct ftdi_context *ftdi, unsigned char bitmask)
1260{
a3da1d95
GE
1261 unsigned short usb_val;
1262
d9f0cce7 1263 usb_val = bitmask; // low byte: bitmask
3119537f
TJ
1264 /* FT2232C: Set bitbang_mode to 2 to enable SPI */
1265 usb_val |= (ftdi->bitbang_mode << 8);
1266
c3d95b87
TJ
1267 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1268 ftdi_error_return(-1, "unable to enter bitbang mode. Perhaps not a BM type chip?");
1269
a3da1d95
GE
1270 ftdi->bitbang_enabled = 1;
1271 return 0;
1272}
1273
1941414d
TJ
1274/**
1275 Disable bitbang mode.
a3da1d95 1276
1941414d
TJ
1277 \param ftdi pointer to ftdi_context
1278
1279 \retval 0: all fine
1280 \retval -1: can't disable bitbang mode
1281*/
a8f46ddc
TJ
1282int ftdi_disable_bitbang(struct ftdi_context *ftdi)
1283{
c3d95b87
TJ
1284 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, 0, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1285 ftdi_error_return(-1, "unable to leave bitbang mode. Perhaps not a BM type chip?");
a3da1d95
GE
1286
1287 ftdi->bitbang_enabled = 0;
1288 return 0;
1289}
1290
1941414d
TJ
1291/**
1292 Enable advanced bitbang mode for FT2232C chips.
a3da1d95 1293
1941414d
TJ
1294 \param ftdi pointer to ftdi_context
1295 \param bitmask Bitmask to configure lines.
1296 HIGH/ON value configures a line as output.
1297 \param mode Bitbang mode: 1 for normal mode, 2 for SPI mode
1298
1299 \retval 0: all fine
1300 \retval -1: can't enable bitbang mode
1301*/
c4446c36
TJ
1302int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
1303{
1304 unsigned short usb_val;
1305
1306 usb_val = bitmask; // low byte: bitmask
1307 usb_val |= (mode << 8);
1308 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x0B, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1309 ftdi_error_return(-1, "unable to configure bitbang mode. Perhaps not a 2232C type chip?");
1310
1311 ftdi->bitbang_mode = mode;
1312 ftdi->bitbang_enabled = (mode == BITMODE_BITBANG || mode == BITMODE_SYNCBB)?1:0;
1313 return 0;
1314}
1315
1941414d
TJ
1316/**
1317 Directly read pin state. Useful for bitbang mode.
1318
1319 \param ftdi pointer to ftdi_context
1320 \param pins Pointer to store pins into
1321
1322 \retval 0: all fine
1323 \retval -1: read pins failed
1324*/
a8f46ddc
TJ
1325int ftdi_read_pins(struct ftdi_context *ftdi, unsigned char *pins)
1326{
85f3c596 1327 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x0C, 0, ftdi->index, (char *)pins, 1, ftdi->usb_read_timeout) != 1)
c3d95b87 1328 ftdi_error_return(-1, "read pins failed");
a3da1d95 1329
a3da1d95
GE
1330 return 0;
1331}
1332
1941414d
TJ
1333/**
1334 Set latency timer
1335
1336 The FTDI chip keeps data in the internal buffer for a specific
1337 amount of time if the buffer is not full yet to decrease
1338 load on the usb bus.
a3da1d95 1339
1941414d
TJ
1340 \param ftdi pointer to ftdi_context
1341 \param latency Value between 1 and 255
1342
1343 \retval 0: all fine
1344 \retval -1: latency out of range
1345 \retval -2: unable to set latency timer
1346*/
a8f46ddc
TJ
1347int ftdi_set_latency_timer(struct ftdi_context *ftdi, unsigned char latency)
1348{
a3da1d95
GE
1349 unsigned short usb_val;
1350
c3d95b87
TJ
1351 if (latency < 1)
1352 ftdi_error_return(-1, "latency out of range. Only valid for 1-255");
a3da1d95 1353
d79d2e68 1354 usb_val = latency;
c3d95b87
TJ
1355 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x09, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1356 ftdi_error_return(-2, "unable to set latency timer");
1357
a3da1d95
GE
1358 return 0;
1359}
1360
1941414d
TJ
1361/**
1362 Get latency timer
a3da1d95 1363
1941414d
TJ
1364 \param ftdi pointer to ftdi_context
1365 \param latency Pointer to store latency value in
1366
1367 \retval 0: all fine
1368 \retval -1: unable to get latency timer
1369*/
a8f46ddc
TJ
1370int ftdi_get_latency_timer(struct ftdi_context *ftdi, unsigned char *latency)
1371{
a3da1d95 1372 unsigned short usb_val;
c3d95b87
TJ
1373 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x0A, 0, ftdi->index, (char *)&usb_val, 1, ftdi->usb_read_timeout) != 1)
1374 ftdi_error_return(-1, "reading latency timer failed");
a3da1d95
GE
1375
1376 *latency = (unsigned char)usb_val;
1377 return 0;
1378}
1379
1941414d 1380/**
1189b11a
TJ
1381 Poll modem status information
1382
1383 This function allows the retrieve the two status bytes of the device.
1384 The device sends these bytes also as a header for each read access
1385 where they are discarded by ftdi_read_data(). The chip generates
1386 the two stripped status bytes in the absence of data every 40 ms.
1387
1388 Layout of the first byte:
1389 - B0..B3 - must be 0
1390 - B4 Clear to send (CTS)
1391 0 = inactive
1392 1 = active
1393 - B5 Data set ready (DTS)
1394 0 = inactive
1395 1 = active
1396 - B6 Ring indicator (RI)
1397 0 = inactive
1398 1 = active
1399 - B7 Receive line signal detect (RLSD)
1400 0 = inactive
1401 1 = active
1402
1403 Layout of the second byte:
1404 - B0 Data ready (DR)
1405 - B1 Overrun error (OE)
1406 - B2 Parity error (PE)
1407 - B3 Framing error (FE)
1408 - B4 Break interrupt (BI)
1409 - B5 Transmitter holding register (THRE)
1410 - B6 Transmitter empty (TEMT)
1411 - B7 Error in RCVR FIFO
1412
1413 \param ftdi pointer to ftdi_context
1414 \param status Pointer to store status information in. Must be two bytes.
1415
1416 \retval 0: all fine
1417 \retval -1: unable to retrieve status information
1418*/
1419int ftdi_poll_modem_status(struct ftdi_context *ftdi, unsigned short *status)
1420{
1421 char usb_val[2];
1422
1423 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x05, 0, ftdi->index, usb_val, 2, ftdi->usb_read_timeout) != 2)
1424 ftdi_error_return(-1, "getting modem status failed");
1425
1426 *status = (usb_val[1] << 8) | usb_val[0];
1427
1428 return 0;
1429}
1430
a7fb8440
TJ
1431
1432/*
1433 Flow control code by Lorenz Moesenlechner (lorenz@hcilab.org)
1434 and Matthias Kranz (matthias@hcilab.org)
1435*/
1436/**
1437 Set flowcontrol for ftdi chip
1438
1439 \param ftdi pointer to ftdi_context
1440 \param flowctrl flow control to use. should be
1441 SIO_DISABLE_FLOW_CTRL, SIO_RTS_CTS_HS, SIO_DTR_DSR_HS or SIO_XON_XOFF_HS
1442
1443 \retval 0: all fine
1444 \retval -1: set flow control failed
1445*/
1446int ftdi_setflowctrl(struct ftdi_context *ftdi, int flowctrl)
1447{
1448 if (usb_control_msg(ftdi->usb_dev, SIO_SET_FLOW_CTRL_REQUEST_TYPE,
1449 SIO_SET_FLOW_CTRL_REQUEST, 0, (flowctrl | ftdi->interface),
1450 NULL, 0, ftdi->usb_write_timeout) != 0)
1451 ftdi_error_return(-1, "set flow control failed");
1452
1453 return 0;
1454}
1455
1456/**
1457 Set dtr line
1458
1459 \param ftdi pointer to ftdi_context
1460 \param state state to set line to (1 or 0)
1461
1462 \retval 0: all fine
1463 \retval -1: set dtr failed
1464*/
1465int ftdi_setdtr(struct ftdi_context *ftdi, int state)
1466{
1467 unsigned short usb_val;
1468
1469 if (state)
1470 usb_val = SIO_SET_DTR_HIGH;
1471 else
1472 usb_val = SIO_SET_DTR_LOW;
1473
1474 if (usb_control_msg(ftdi->usb_dev, SIO_SET_MODEM_CTRL_REQUEST_TYPE,
1475 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->interface,
1476 NULL, 0, ftdi->usb_write_timeout) != 0)
1477 ftdi_error_return(-1, "set dtr failed");
1478
1479 return 0;
1480}
1481
1482/**
1483 Set rts line
1484
1485 \param ftdi pointer to ftdi_context
1486 \param state state to set line to (1 or 0)
1487
1488 \retval 0: all fine
1489 \retval -1 set rts failed
1490*/
1491int ftdi_setrts(struct ftdi_context *ftdi, int state)
1492{
1493 unsigned short usb_val;
1494
1495 if (state)
1496 usb_val = SIO_SET_RTS_HIGH;
1497 else
1498 usb_val = SIO_SET_RTS_LOW;
1499
1500 if (usb_control_msg(ftdi->usb_dev, SIO_SET_MODEM_CTRL_REQUEST_TYPE,
1501 SIO_SET_MODEM_CTRL_REQUEST, usb_val, ftdi->interface,
1502 NULL, 0, ftdi->usb_write_timeout) != 0)
1503 ftdi_error_return(-1, "set of rts failed");
1504
1505 return 0;
1506}
1507
1189b11a
TJ
1508/**
1509 Set the special event character
1510
1511 \param ftdi pointer to ftdi_context
1512 \param eventch Event character
1513 \param enable 0 to disable the event character, non-zero otherwise
1514
1515 \retval 0: all fine
1516 \retval -1: unable to set event character
1517*/
1518int ftdi_set_event_char(struct ftdi_context *ftdi,
1519 unsigned char eventch, unsigned char enable)
1520{
1521 unsigned short usb_val;
1522
1523 usb_val = eventch;
1524 if (enable)
1525 usb_val |= 1 << 8;
1526
1527 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x06, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1528 ftdi_error_return(-1, "setting event character failed");
1529
1530 return 0;
1531}
1532
1533/**
1534 Set error character
1535
1536 \param ftdi pointer to ftdi_context
1537 \param errorch Error character
1538 \param enable 0 to disable the error character, non-zero otherwise
1539
1540 \retval 0: all fine
1541 \retval -1: unable to set error character
1542*/
1543int ftdi_set_error_char(struct ftdi_context *ftdi,
1544 unsigned char errorch, unsigned char enable)
1545{
1546 unsigned short usb_val;
1547
1548 usb_val = errorch;
1549 if (enable)
1550 usb_val |= 1 << 8;
1551
1552 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x07, usb_val, ftdi->index, NULL, 0, ftdi->usb_write_timeout) != 0)
1553 ftdi_error_return(-1, "setting error character failed");
1554
1555 return 0;
1556}
1557
1558/**
c201f80f
TJ
1559 Set the eeprom size
1560
1561 \param ftdi pointer to ftdi_context
1562 \param eeprom Pointer to ftdi_eeprom
1563 \param size
1564
1565*/
1566void ftdi_eeprom_setsize(struct ftdi_context *ftdi, struct ftdi_eeprom *eeprom, int size)
1567{
1568 ftdi->eeprom_size=size;
1569 eeprom->size=size;
1570}
1571
1572/**
1941414d 1573 Init eeprom with default values.
a3da1d95 1574
1941414d
TJ
1575 \param eeprom Pointer to ftdi_eeprom
1576*/
a8f46ddc
TJ
1577void ftdi_eeprom_initdefaults(struct ftdi_eeprom *eeprom)
1578{
f396dbad
TJ
1579 eeprom->vendor_id = 0x0403;
1580 eeprom->product_id = 0x6001;
d9f0cce7 1581
b8aa7b35
TJ
1582 eeprom->self_powered = 1;
1583 eeprom->remote_wakeup = 1;
1584 eeprom->BM_type_chip = 1;
d9f0cce7 1585
b8aa7b35
TJ
1586 eeprom->in_is_isochronous = 0;
1587 eeprom->out_is_isochronous = 0;
1588 eeprom->suspend_pull_downs = 0;
d9f0cce7 1589
b8aa7b35
TJ
1590 eeprom->use_serial = 0;
1591 eeprom->change_usb_version = 0;
f396dbad 1592 eeprom->usb_version = 0x0200;
b8aa7b35 1593 eeprom->max_power = 0;
d9f0cce7 1594
b8aa7b35
TJ
1595 eeprom->manufacturer = NULL;
1596 eeprom->product = NULL;
1597 eeprom->serial = NULL;
c201f80f
TJ
1598
1599 eeprom->size = FTDI_DEFAULT_EEPROM_SIZE;
b8aa7b35
TJ
1600}
1601
1941414d
TJ
1602/**
1603 Build binary output from ftdi_eeprom structure.
1604 Output is suitable for ftdi_write_eeprom().
b8aa7b35 1605
1941414d
TJ
1606 \param eeprom Pointer to ftdi_eeprom
1607 \param output Buffer of 128 bytes to store eeprom image to
1608
1609 \retval >0: used eeprom size
1610 \retval -1: eeprom size (128 bytes) exceeded by custom strings
b8aa7b35 1611*/
a8f46ddc
TJ
1612int ftdi_eeprom_build(struct ftdi_eeprom *eeprom, unsigned char *output)
1613{
b8aa7b35
TJ
1614 unsigned char i, j;
1615 unsigned short checksum, value;
1616 unsigned char manufacturer_size = 0, product_size = 0, serial_size = 0;
1617 int size_check;
1618
1619 if (eeprom->manufacturer != NULL)
d9f0cce7 1620 manufacturer_size = strlen(eeprom->manufacturer);
b8aa7b35 1621 if (eeprom->product != NULL)
d9f0cce7 1622 product_size = strlen(eeprom->product);
b8aa7b35 1623 if (eeprom->serial != NULL)
d9f0cce7 1624 serial_size = strlen(eeprom->serial);
b8aa7b35 1625
c201f80f 1626 size_check = eeprom->size;
d9f0cce7 1627 size_check -= 28; // 28 are always in use (fixed)
c201f80f
TJ
1628
1629 // Top half of a 256byte eeprom is used just for strings and checksum
1630 // it seems that the FTDI chip will not read these strings from the lower half
1631 // Each string starts with two bytes; offset and type (0x03 for string)
1632 // the checksum needs two bytes, so without the string data that 8 bytes from the top half
1633 if(eeprom->size>=256)size_check = 120;
b8aa7b35
TJ
1634 size_check -= manufacturer_size*2;
1635 size_check -= product_size*2;
1636 size_check -= serial_size*2;
1637
1638 // eeprom size exceeded?
1639 if (size_check < 0)
d9f0cce7 1640 return (-1);
b8aa7b35
TJ
1641
1642 // empty eeprom
c201f80f 1643 memset (output, 0, eeprom->size);
b8aa7b35
TJ
1644
1645 // Addr 00: Stay 00 00
1646 // Addr 02: Vendor ID
1647 output[0x02] = eeprom->vendor_id;
1648 output[0x03] = eeprom->vendor_id >> 8;
1649
1650 // Addr 04: Product ID
1651 output[0x04] = eeprom->product_id;
1652 output[0x05] = eeprom->product_id >> 8;
1653
1654 // Addr 06: Device release number (0400h for BM features)
1655 output[0x06] = 0x00;
d9f0cce7 1656
b8aa7b35 1657 if (eeprom->BM_type_chip == 1)
d9f0cce7 1658 output[0x07] = 0x04;
b8aa7b35 1659 else
d9f0cce7 1660 output[0x07] = 0x02;
b8aa7b35
TJ
1661
1662 // Addr 08: Config descriptor
8fae3e8e
TJ
1663 // Bit 7: always 1
1664 // Bit 6: 1 if this device is self powered, 0 if bus powered
1665 // Bit 5: 1 if this device uses remote wakeup
1666 // Bit 4: 1 if this device is battery powered
5a1dcd55 1667 j = 0x80;
b8aa7b35 1668 if (eeprom->self_powered == 1)
5a1dcd55 1669 j |= 0x40;
b8aa7b35 1670 if (eeprom->remote_wakeup == 1)
5a1dcd55 1671 j |= 0x20;
b8aa7b35
TJ
1672 output[0x08] = j;
1673
1674 // Addr 09: Max power consumption: max power = value * 2 mA
d9f0cce7 1675 output[0x09] = eeprom->max_power;
d9f0cce7 1676
b8aa7b35
TJ
1677 // Addr 0A: Chip configuration
1678 // Bit 7: 0 - reserved
1679 // Bit 6: 0 - reserved
1680 // Bit 5: 0 - reserved
1681 // Bit 4: 1 - Change USB version
1682 // Bit 3: 1 - Use the serial number string
1683 // Bit 2: 1 - Enable suspend pull downs for lower power
1684 // Bit 1: 1 - Out EndPoint is Isochronous
1685 // Bit 0: 1 - In EndPoint is Isochronous
1686 //
1687 j = 0;
1688 if (eeprom->in_is_isochronous == 1)
d9f0cce7 1689 j = j | 1;
b8aa7b35 1690 if (eeprom->out_is_isochronous == 1)
d9f0cce7 1691 j = j | 2;
b8aa7b35 1692 if (eeprom->suspend_pull_downs == 1)
d9f0cce7 1693 j = j | 4;
b8aa7b35 1694 if (eeprom->use_serial == 1)
d9f0cce7 1695 j = j | 8;
b8aa7b35 1696 if (eeprom->change_usb_version == 1)
d9f0cce7 1697 j = j | 16;
b8aa7b35 1698 output[0x0A] = j;
d9f0cce7 1699
b8aa7b35
TJ
1700 // Addr 0B: reserved
1701 output[0x0B] = 0x00;
d9f0cce7 1702
b8aa7b35
TJ
1703 // Addr 0C: USB version low byte when 0x0A bit 4 is set
1704 // Addr 0D: USB version high byte when 0x0A bit 4 is set
1705 if (eeprom->change_usb_version == 1) {
1706 output[0x0C] = eeprom->usb_version;
d9f0cce7 1707 output[0x0D] = eeprom->usb_version >> 8;
b8aa7b35
TJ
1708 }
1709
1710
c201f80f 1711 // Addr 0E: Offset of the manufacturer string + 0x80, calculated later
b8aa7b35
TJ
1712 // Addr 0F: Length of manufacturer string
1713 output[0x0F] = manufacturer_size*2 + 2;
1714
1715 // Addr 10: Offset of the product string + 0x80, calculated later
1716 // Addr 11: Length of product string
1717 output[0x11] = product_size*2 + 2;
1718
1719 // Addr 12: Offset of the serial string + 0x80, calculated later
1720 // Addr 13: Length of serial string
1721 output[0x13] = serial_size*2 + 2;
1722
1723 // Dynamic content
c201f80f
TJ
1724 i=0x14;
1725 if(eeprom->size>=256) i = 0x80;
f01d7ca6 1726
c201f80f
TJ
1727
1728 // Output manufacturer
1729 output[0x0E] = i | 0x80; // calculate offset
1730 output[i++] = manufacturer_size*2 + 2;
1731 output[i++] = 0x03; // type: string
b8aa7b35 1732 for (j = 0; j < manufacturer_size; j++) {
d9f0cce7
TJ
1733 output[i] = eeprom->manufacturer[j], i++;
1734 output[i] = 0x00, i++;
b8aa7b35
TJ
1735 }
1736
1737 // Output product name
c201f80f 1738 output[0x10] = i | 0x80; // calculate offset
b8aa7b35
TJ
1739 output[i] = product_size*2 + 2, i++;
1740 output[i] = 0x03, i++;
1741 for (j = 0; j < product_size; j++) {
d9f0cce7
TJ
1742 output[i] = eeprom->product[j], i++;
1743 output[i] = 0x00, i++;
b8aa7b35 1744 }
d9f0cce7 1745
b8aa7b35 1746 // Output serial
c201f80f 1747 output[0x12] = i | 0x80; // calculate offset
b8aa7b35
TJ
1748 output[i] = serial_size*2 + 2, i++;
1749 output[i] = 0x03, i++;
1750 for (j = 0; j < serial_size; j++) {
d9f0cce7
TJ
1751 output[i] = eeprom->serial[j], i++;
1752 output[i] = 0x00, i++;
b8aa7b35
TJ
1753 }
1754
1755 // calculate checksum
1756 checksum = 0xAAAA;
d9f0cce7 1757
c201f80f 1758 for (i = 0; i < eeprom->size/2-1; i++) {
d9f0cce7
TJ
1759 value = output[i*2];
1760 value += output[(i*2)+1] << 8;
b8aa7b35 1761
d9f0cce7
TJ
1762 checksum = value^checksum;
1763 checksum = (checksum << 1) | (checksum >> 15);
b8aa7b35
TJ
1764 }
1765
c201f80f
TJ
1766 output[eeprom->size-2] = checksum;
1767 output[eeprom->size-1] = checksum >> 8;
b8aa7b35 1768
8ed61121 1769 return size_check;
b8aa7b35
TJ
1770}
1771
1941414d
TJ
1772/**
1773 Read eeprom
1774
1775 \param ftdi pointer to ftdi_context
1776 \param eeprom Pointer to store eeprom into
b8aa7b35 1777
1941414d
TJ
1778 \retval 0: all fine
1779 \retval -1: read failed
1780*/
a8f46ddc
TJ
1781int ftdi_read_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
1782{
a3da1d95
GE
1783 int i;
1784
c201f80f 1785 for (i = 0; i < ftdi->eeprom_size/2; i++) {
c3d95b87
TJ
1786 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
1787 ftdi_error_return(-1, "reading eeprom failed");
a3da1d95
GE
1788 }
1789
1790 return 0;
1791}
1792
cb6250fa
TJ
1793/*
1794 ftdi_read_chipid_shift does the bitshift operation needed for the FTDIChip-ID
1795 Function is only used internally
1796 \internal
1797*/
1798static unsigned char ftdi_read_chipid_shift(unsigned char value)
1799{
1800 return ((value & 1) << 1) |
1801 ((value & 2) << 5) |
1802 ((value & 4) >> 2) |
1803 ((value & 8) << 4) |
1804 ((value & 16) >> 1) |
1805 ((value & 32) >> 1) |
1806 ((value & 64) >> 4) |
1807 ((value & 128) >> 2);
1808}
1809
1810/**
1811 Read the FTDIChip-ID from R-type devices
1812
1813 \param ftdi pointer to ftdi_context
1814 \param chipid Pointer to store FTDIChip-ID
1815
1816 \retval 0: all fine
1817 \retval -1: read failed
1818*/
1819int ftdi_read_chipid(struct ftdi_context *ftdi, unsigned int *chipid)
1820{
c7eb3112 1821 unsigned int a = 0, b = 0;
cb6250fa
TJ
1822
1823 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, 0x43, (char *)&a, 2, ftdi->usb_read_timeout) == 2)
1824 {
1825 a = a << 8 | a >> 8;
1826 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, 0x44, (char *)&b, 2, ftdi->usb_read_timeout) == 2)
1827 {
1828 b = b << 8 | b >> 8;
1829 a = (a << 16) | b;
912d50ca
TJ
1830 a = ftdi_read_chipid_shift(a) | ftdi_read_chipid_shift(a>>8)<<8
1831 | ftdi_read_chipid_shift(a>>16)<<16 | ftdi_read_chipid_shift(a>>24)<<24;
cb6250fa 1832 *chipid = a ^ 0xa5f0f7d1;
c7eb3112 1833 return 0;
cb6250fa
TJ
1834 }
1835 }
1836
c7eb3112 1837 ftdi_error_return(-1, "read of FTDIChip-ID failed");
cb6250fa
TJ
1838}
1839
1941414d 1840/**
c201f80f
TJ
1841 Guesses size of eeprom by reading eeprom and comparing halves - will not work with blank eeprom
1842 Call this function then do a write then call again to see if size changes, if so write again.
1843
1844 \param ftdi pointer to ftdi_context
1845 \param eeprom Pointer to store eeprom into
1846 \param maxsize the size of the buffer to read into
1847
1848 \retval size of eeprom
1849*/
1850int ftdi_read_eeprom_getsize(struct ftdi_context *ftdi, unsigned char *eeprom, int maxsize)
1851{
1852 int i=0,j,minsize=32;
1853 int size=minsize;
1854
1855 do{
1856 for (j = 0; i < maxsize/2 && j<size; j++) {
1857 if (usb_control_msg(ftdi->usb_dev, 0xC0, 0x90, 0, i, eeprom+(i*2), 2, ftdi->usb_read_timeout) != 2)
1858 ftdi_error_return(-1, "reading eeprom failed");
1859 i++;
1860 }
1861 size*=2;
1862 }while(size<=maxsize && memcmp(eeprom,&eeprom[size/2],size/2)!=0);
1863
1864 return size/2;
1865}
1866
1867/**
1941414d 1868 Write eeprom
a3da1d95 1869
1941414d
TJ
1870 \param ftdi pointer to ftdi_context
1871 \param eeprom Pointer to read eeprom from
1872
1873 \retval 0: all fine
1874 \retval -1: read failed
1875*/
a8f46ddc
TJ
1876int ftdi_write_eeprom(struct ftdi_context *ftdi, unsigned char *eeprom)
1877{
a3da1d95
GE
1878 unsigned short usb_val;
1879 int i;
1880
c201f80f 1881 for (i = 0; i < ftdi->eeprom_size/2; i++) {
d9f0cce7
TJ
1882 usb_val = eeprom[i*2];
1883 usb_val += eeprom[(i*2)+1] << 8;
c3d95b87
TJ
1884 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x91, usb_val, i, NULL, 0, ftdi->usb_write_timeout) != 0)
1885 ftdi_error_return(-1, "unable to write eeprom");
a3da1d95
GE
1886 }
1887
1888 return 0;
1889}
1890
1941414d
TJ
1891/**
1892 Erase eeprom
a3da1d95 1893
1941414d
TJ
1894 \param ftdi pointer to ftdi_context
1895
1896 \retval 0: all fine
1897 \retval -1: erase failed
1898*/
a8f46ddc
TJ
1899int ftdi_erase_eeprom(struct ftdi_context *ftdi)
1900{
c3d95b87
TJ
1901 if (usb_control_msg(ftdi->usb_dev, 0x40, 0x92, 0, 0, NULL, 0, ftdi->usb_write_timeout) != 0)
1902 ftdi_error_return(-1, "unable to erase eeprom");
a3da1d95
GE
1903
1904 return 0;
1905}
c3d95b87 1906
1941414d
TJ
1907/**
1908 Get string representation for last error code
c3d95b87 1909
1941414d
TJ
1910 \param ftdi pointer to ftdi_context
1911
1912 \retval Pointer to error string
1913*/
c3d95b87
TJ
1914char *ftdi_get_error_string (struct ftdi_context *ftdi)
1915{
1916 return ftdi->error_str;
1917}
a01d31e2 1918
b5ec1820 1919/* @} end of doxygen libftdi group */