• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *Copyright (C) 2015 The Android Open Source Project
3  *
4  *Licensed under the Apache License, Version 2.0 (the "License");
5  *you may not use this file except in compliance with the License.
6  *You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *Unless required by applicable law or agreed to in writing, software
11  *distributed under the License is distributed on an "AS IS" BASIS,
12  *WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *See the License for the specific language governing permissions and
14  *limitations under the License.
15  *
16  * This file was copied from https://github.com/devttys0/libmpsse.git (sha1
17  * f1a6744b), and modified to suite the Chromium OS project.
18  *
19  * Main libmpsse source file.
20  *
21  * Craig Heffner
22  * 27 December 2011
23  */
24 
25 #include <stdlib.h>
26 #include <string.h>
27 #include <stdint.h>
28 #include <unistd.h>
29 
30 #include "trunks/ftdi/support.h"
31 
32 /* List of known FT2232-based devices */
33 struct vid_pid supported_devices[] = {
34     {0x0403, 0x6010, "FT2232 Future Technology Devices International, Ltd"},
35     {0x0403, 0x6011, "FT4232 Future Technology Devices International, Ltd"},
36     {0x0403, 0x6014, "FT232H Future Technology Devices International, Ltd"},
37 
38     /* These devices are based on FT2232 chips, but have not been tested. */
39     {0x0403, 0x8878, "Bus Blaster v2 (channel A)"},
40     {0x0403, 0x8879, "Bus Blaster v2 (channel B)"},
41     {0x0403, 0xBDC8, "Turtelizer JTAG/RS232 Adapter A"},
42     {0x0403, 0xCFF8, "Amontec JTAGkey"},
43     {0x0403, 0x8A98, "TIAO Multi Protocol Adapter"},
44     {0x15BA, 0x0003, "Olimex Ltd. OpenOCD JTAG"},
45     {0x15BA, 0x0004, "Olimex Ltd. OpenOCD JTAG TINY"},
46 
47     {0, 0, NULL}};
48 
49 /*
50  * Opens and initializes the first FTDI device found.
51  *
52  * @mode      - Mode to open the device in. One of enum modes.
53  * @freq      - Clock frequency to use for the specified mode.
54  * @endianess - Specifies how data is clocked in/out (MSB, LSB).
55  *
56  * Returns a pointer to an MPSSE context structure if succeeded, NULL otherwise.
57  */
MPSSE(enum modes mode,int freq,int endianess)58 struct mpsse_context* MPSSE(enum modes mode, int freq, int endianess) {
59   int i = 0;
60   struct mpsse_context* mpsse = NULL;
61 
62   for (i = 0; supported_devices[i].vid != 0; i++) {
63     mpsse = Open(supported_devices[i].vid, supported_devices[i].pid, mode,
64                  freq, endianess, IFACE_A, NULL, NULL);
65     if (mpsse) {
66       mpsse->description = supported_devices[i].description;
67       return mpsse;
68     }
69   }
70 
71   return NULL;
72 }
73 
74 /*
75  * Open device by VID/PID
76  *
77  * @vid         - Device vendor ID.
78  * @pid         - Device product ID.
79  * @mode        - MPSSE mode, one of enum modes.
80  * @freq        - Clock frequency to use for the specified mode.
81  * @endianess   - Specifies how data is clocked in/out (MSB, LSB).
82  * @interface   - FTDI interface to use (IFACE_A - IFACE_D).
83  * @description - Device product description (set to NULL if not needed).
84  * @serial      - Device serial number (set to NULL if not needed).
85  *
86  * Returns a pointer to an MPSSE context structure on success.
87  */
Open(int vid,int pid,enum modes mode,int freq,int endianess,int interface,const char * description,const char * serial)88 struct mpsse_context* Open(int vid,
89                            int pid,
90                            enum modes mode,
91                            int freq,
92                            int endianess,
93                            int interface,
94                            const char* description,
95                            const char* serial) {
96   return OpenIndex(vid, pid, mode, freq, endianess, interface, description,
97                    serial, 0);
98 }
99 
100 /*
101  * Open device by VID/PID/index
102  *
103  * @vid         - Device vendor ID.
104  * @pid         - Device product ID.
105  * @mode        - MPSSE mode, one of enum modes.
106  * @freq        - Clock frequency to use for the specified mode.
107  * @endianess   - Specifies how data is clocked in/out (MSB, LSB).
108  * @interface   - FTDI interface to use (IFACE_A - IFACE_D).
109  * @description - Device product description (set to NULL if not needed).
110  * @serial      - Device serial number (set to NULL if not needed).
111  * @index       - Device index (set to 0 if not needed).
112  *
113  * Returns a pointer to an MPSSE context structure.
114  * On success, mpsse->open will be set to 1.
115  * On failure, mpsse->open will be set to 0.
116  */
OpenIndex(int vid,int pid,enum modes mode,int freq,int endianess,int interface,const char * description,const char * serial,int index)117 struct mpsse_context* OpenIndex(int vid,
118                                 int pid,
119                                 enum modes mode,
120                                 int freq,
121                                 int endianess,
122                                 int interface,
123                                 const char* description,
124                                 const char* serial,
125                                 int index) {
126   int status = 0;
127   struct mpsse_context* mpsse = NULL;
128 
129   mpsse = malloc(sizeof(struct mpsse_context));
130   if (!mpsse)
131     return NULL;
132 
133   memset(mpsse, 0, sizeof(struct mpsse_context));
134 
135   /* Legacy; flushing is no longer needed, so disable it by default. */
136   FlushAfterRead(mpsse, 0);
137 
138   /* ftdilib initialization */
139   if (ftdi_init(&mpsse->ftdi)) {
140     free(mpsse);
141     return NULL;
142   }
143 
144   /* Set the FTDI interface  */
145   ftdi_set_interface(&mpsse->ftdi, interface);
146 
147   /* Open the specified device */
148   if (!ftdi_usb_open_desc_index(&mpsse->ftdi, vid, pid, description, serial,
149                                 index)) {
150     mpsse->mode = mode;
151     mpsse->vid = vid;
152     mpsse->pid = pid;
153     mpsse->status = STOPPED;
154     mpsse->endianess = endianess;
155 
156     /* Set the appropriate transfer size for the requested protocol */
157     if (mpsse->mode == I2C)
158       mpsse->xsize = I2C_TRANSFER_SIZE;
159     else
160       mpsse->xsize = SPI_RW_SIZE;
161 
162     status |= ftdi_usb_reset(&mpsse->ftdi);
163     status |= ftdi_set_latency_timer(&mpsse->ftdi, LATENCY_MS);
164     status |= ftdi_write_data_set_chunksize(&mpsse->ftdi, CHUNK_SIZE);
165     status |= ftdi_read_data_set_chunksize(&mpsse->ftdi, CHUNK_SIZE);
166     status |= ftdi_set_bitmode(&mpsse->ftdi, 0, BITMODE_RESET);
167 
168     if (status == 0) {
169       /* Set the read and write timeout periods */
170       set_timeouts(mpsse, USB_TIMEOUT);
171 
172       if (mpsse->mode != BITBANG) {
173         ftdi_set_bitmode(&mpsse->ftdi, 0, BITMODE_MPSSE);
174 
175         if (SetClock(mpsse, freq) == MPSSE_OK) {
176           if (SetMode(mpsse, endianess) == MPSSE_OK) {
177             mpsse->opened = 1;
178 
179             /* Give the chip a few mS to initialize */
180             usleep(SETUP_DELAY);
181 
182             /*
183              * Not all FTDI chips support all the commands that SetMode may
184              * have sent.
185              * This clears out any errors from unsupported commands that
186              * might have been sent during set up.
187              */
188             ftdi_usb_purge_buffers(&mpsse->ftdi);
189           }
190         }
191       } else {
192         /* Skip the setup functions if we're just operating in BITBANG mode
193          */
194         if (!ftdi_set_bitmode(&mpsse->ftdi, 0xFF, BITMODE_BITBANG))
195           mpsse->opened = 1;
196       }
197     }
198   }
199 
200   if (mpsse && !mpsse->opened) {
201     Close(mpsse);
202     mpsse = NULL;
203   }
204 
205   return mpsse;
206 }
207 
208 /*
209  * Closes the device, deinitializes libftdi, and frees the MPSSE context
210  *pointer.
211  *
212  * @mpsse - MPSSE context pointer.
213  *
214  * Returns void.
215  */
Close(struct mpsse_context * mpsse)216 void Close(struct mpsse_context* mpsse) {
217   if (!mpsse)
218     return;
219 
220   if (mpsse->opened) {
221     /* Shut these down only if initialization succeeded before. */
222     ftdi_set_bitmode(&mpsse->ftdi, 0, BITMODE_RESET);
223     ftdi_usb_close(&mpsse->ftdi);
224   }
225   ftdi_deinit(&mpsse->ftdi);
226   free(mpsse);
227 }
228 
229 /* Enables bit-wise data transfers.
230  * Must be called after MPSSE() / Open() / OpenIndex().
231  *
232  * Returns void.
233  */
EnableBitmode(struct mpsse_context * mpsse,int tf)234 void EnableBitmode(struct mpsse_context* mpsse, int tf) {
235   if (is_valid_context(mpsse)) {
236     if (tf) {
237       mpsse->tx |= MPSSE_BITMODE;
238       mpsse->rx |= MPSSE_BITMODE;
239       mpsse->txrx |= MPSSE_BITMODE;
240     } else {
241       mpsse->tx &= ~MPSSE_BITMODE;
242       mpsse->rx &= ~MPSSE_BITMODE;
243       mpsse->txrx &= ~MPSSE_BITMODE;
244     }
245   }
246 }
247 
248 /*
249  * Sets the appropriate transmit and receive commands based on the requested
250  *mode and byte order.
251  *
252  * @mpsse     - MPSSE context pointer.
253  * @endianess - MPSSE_MSB or MPSSE_LSB.
254  *
255  * Returns MPSSE_OK on success.
256  * Returns MPSSE_FAIL on failure.
257  */
SetMode(struct mpsse_context * mpsse,int endianess)258 int SetMode(struct mpsse_context* mpsse, int endianess) {
259   int retval = MPSSE_OK, i = 0, setup_commands_size = 0;
260   uint8_t buf[CMD_SIZE] = {0};
261   uint8_t setup_commands[CMD_SIZE * MAX_SETUP_COMMANDS] = {0};
262 
263   /* Do not call is_valid_context() here, as the FTDI chip may not be completely
264    * configured when SetMode is called */
265   if (mpsse) {
266     /* Read and write commands need to include endianess */
267     mpsse->tx = MPSSE_DO_WRITE | endianess;
268     mpsse->rx = MPSSE_DO_READ | endianess;
269     mpsse->txrx = MPSSE_DO_WRITE | MPSSE_DO_READ | endianess;
270 
271     /* Clock, data out, chip select pins are outputs; all others are inputs. */
272     mpsse->tris = DEFAULT_TRIS;
273 
274     /* Clock and chip select pins idle high; all others are low */
275     mpsse->pidle = mpsse->pstart = mpsse->pstop = DEFAULT_PORT;
276 
277     /* During reads and writes the chip select pin is brought low */
278     mpsse->pstart &= ~CS;
279 
280     /* Disable FTDI internal loopback */
281     SetLoopback(mpsse, 0);
282 
283     /* Send ACKs by default */
284     SetAck(mpsse, ACK);
285 
286     /* Ensure adaptive clock is disabled */
287     setup_commands[setup_commands_size++] = DISABLE_ADAPTIVE_CLOCK;
288 
289     switch (mpsse->mode) {
290       case SPI0:
291         /* SPI mode 0 clock idles low */
292         mpsse->pidle &= ~SK;
293         mpsse->pstart &= ~SK;
294         mpsse->pstop &= ~SK;
295         /* SPI mode 0 propogates data on the falling edge and read data on the
296          * rising edge of the clock */
297         mpsse->tx |= MPSSE_WRITE_NEG;
298         mpsse->rx &= ~MPSSE_READ_NEG;
299         mpsse->txrx |= MPSSE_WRITE_NEG;
300         mpsse->txrx &= ~MPSSE_READ_NEG;
301         break;
302       case SPI3:
303         /* SPI mode 3 clock idles high */
304         mpsse->pidle |= SK;
305         mpsse->pstart |= SK;
306         /* Keep the clock low while the CS pin is brought high to ensure we
307          * don't accidentally clock out an extra bit */
308         mpsse->pstop &= ~SK;
309         /* SPI mode 3 propogates data on the falling edge and read data on the
310          * rising edge of the clock */
311         mpsse->tx |= MPSSE_WRITE_NEG;
312         mpsse->rx &= ~MPSSE_READ_NEG;
313         mpsse->txrx |= MPSSE_WRITE_NEG;
314         mpsse->txrx &= ~MPSSE_READ_NEG;
315         break;
316       case SPI1:
317         /* SPI mode 1 clock idles low */
318         mpsse->pidle &= ~SK;
319         /* Since this mode idles low, the start condition should ensure that the
320          * clock is low */
321         mpsse->pstart &= ~SK;
322         /* Even though we idle low in this mode, we need to keep the clock line
323          * high when we set the CS pin high to prevent
324          * an unintended clock cycle from being sent by the FT2232. This way,
325          * the clock goes high, but does not go low until
326          * after the CS pin goes high.
327          */
328         mpsse->pstop |= SK;
329         /* Data read on falling clock edge */
330         mpsse->rx |= MPSSE_READ_NEG;
331         mpsse->tx &= ~MPSSE_WRITE_NEG;
332         mpsse->txrx |= MPSSE_READ_NEG;
333         mpsse->txrx &= ~MPSSE_WRITE_NEG;
334         break;
335       case SPI2:
336         /* SPI 2 clock idles high */
337         mpsse->pidle |= SK;
338         mpsse->pstart |= SK;
339         mpsse->pstop |= SK;
340         /* Data read on falling clock edge */
341         mpsse->rx |= MPSSE_READ_NEG;
342         mpsse->tx &= ~MPSSE_WRITE_NEG;
343         mpsse->txrx |= MPSSE_READ_NEG;
344         mpsse->txrx &= ~MPSSE_WRITE_NEG;
345         break;
346       case I2C:
347         /* I2C propogates data on the falling clock edge and reads data on the
348          * falling (or rising) clock edge */
349         mpsse->tx |= MPSSE_WRITE_NEG;
350         mpsse->rx &= ~MPSSE_READ_NEG;
351         /* In I2C, both the clock and the data lines idle high */
352         mpsse->pidle |= DO | DI;
353         /* I2C start bit == data line goes from high to low while clock line is
354          * high */
355         mpsse->pstart &= ~DO & ~DI;
356         /* I2C stop bit == data line goes from low to high while clock line is
357          * high - set data line low here, so the transition to the idle state
358          * triggers the stop condition. */
359         mpsse->pstop &= ~DO & ~DI;
360         /* Enable three phase clock to ensure that I2C data is available on both
361          * the rising and falling clock edges */
362         setup_commands[setup_commands_size++] = ENABLE_3_PHASE_CLOCK;
363         break;
364       case GPIO:
365         break;
366       default:
367         retval = MPSSE_FAIL;
368     }
369 
370     /* Send any setup commands to the chip */
371     if (retval == MPSSE_OK && setup_commands_size > 0) {
372       retval = raw_write(mpsse, setup_commands, setup_commands_size);
373     }
374 
375     if (retval == MPSSE_OK) {
376       /* Set the idle pin states */
377       set_bits_low(mpsse, mpsse->pidle);
378 
379       /* All GPIO pins are outputs, set low */
380       mpsse->trish = 0xFF;
381       mpsse->gpioh = 0x00;
382 
383       buf[i++] = SET_BITS_HIGH;
384       buf[i++] = mpsse->gpioh;
385       buf[i++] = mpsse->trish;
386 
387       retval = raw_write(mpsse, buf, i);
388     }
389   } else {
390     retval = MPSSE_FAIL;
391   }
392 
393   return retval;
394 }
395 
396 /*
397  * Sets the appropriate divisor for the desired clock frequency.
398  *
399  * @mpsse - MPSSE context pointer.
400  * @freq  - Desired clock frequency in hertz.
401  *
402  * Returns MPSSE_OK on success.
403  * Returns MPSSE_FAIL on failure.
404  */
SetClock(struct mpsse_context * mpsse,uint32_t freq)405 int SetClock(struct mpsse_context* mpsse, uint32_t freq) {
406   int retval = MPSSE_FAIL;
407   uint32_t system_clock = 0;
408   uint16_t divisor = 0;
409   uint8_t buf[CMD_SIZE] = {0};
410 
411   /* Do not call is_valid_context() here, as the FTDI chip may not be completely
412    * configured when SetClock is called */
413   if (mpsse) {
414     if (freq > SIX_MHZ) {
415       buf[0] = TCK_X5;
416       system_clock = SIXTY_MHZ;
417     } else {
418       buf[0] = TCK_D5;
419       system_clock = TWELVE_MHZ;
420     }
421 
422     if (raw_write(mpsse, buf, 1) == MPSSE_OK) {
423       if (freq <= 0) {
424         divisor = 0xFFFF;
425       } else {
426         divisor = freq2div(system_clock, freq);
427       }
428 
429       buf[0] = TCK_DIVISOR;
430       buf[1] = (divisor & 0xFF);
431       buf[2] = ((divisor >> 8) & 0xFF);
432 
433       if (raw_write(mpsse, buf, 3) == MPSSE_OK) {
434         mpsse->clock = div2freq(system_clock, divisor);
435         retval = MPSSE_OK;
436       }
437     }
438   }
439 
440   return retval;
441 }
442 
443 /*
444  * Retrieves the last error string from libftdi.
445  *
446  * @mpsse - MPSSE context pointer.
447  *
448  * Returns a pointer to the last error string.
449  */
ErrorString(struct mpsse_context * mpsse)450 const char* ErrorString(struct mpsse_context* mpsse) {
451   if (mpsse != NULL) {
452     return ftdi_get_error_string(&mpsse->ftdi);
453   }
454 
455   return NULL_CONTEXT_ERROR_MSG;
456 }
457 
458 /*
459  * Gets the currently configured clock rate.
460  *
461  * @mpsse - MPSSE context pointer.
462  *
463  * Returns the existing clock rate in hertz.
464  */
GetClock(struct mpsse_context * mpsse)465 int GetClock(struct mpsse_context* mpsse) {
466   int clock = 0;
467 
468   if (is_valid_context(mpsse)) {
469     clock = mpsse->clock;
470   }
471 
472   return clock;
473 }
474 
475 /*
476  * Returns the vendor ID of the FTDI chip.
477  *
478  * @mpsse - MPSSE context pointer.
479  *
480  * Returns the integer value of the vendor ID.
481  */
GetVid(struct mpsse_context * mpsse)482 int GetVid(struct mpsse_context* mpsse) {
483   int vid = 0;
484 
485   if (is_valid_context(mpsse)) {
486     vid = mpsse->vid;
487   }
488 
489   return vid;
490 }
491 
492 /*
493  * Returns the product ID of the FTDI chip.
494  *
495  * @mpsse - MPSSE context pointer.
496  *
497  * Returns the integer value of the product ID.
498  */
GetPid(struct mpsse_context * mpsse)499 int GetPid(struct mpsse_context* mpsse) {
500   int pid = 0;
501 
502   if (is_valid_context(mpsse)) {
503     pid = mpsse->pid;
504   }
505 
506   return pid;
507 }
508 
509 /*
510  * Returns the description of the FTDI chip, if any.
511  *
512  * @mpsse - MPSSE context pointer.
513  *
514  * Returns the description of the FTDI chip.
515  */
GetDescription(struct mpsse_context * mpsse)516 const char* GetDescription(struct mpsse_context* mpsse) {
517   char* description = NULL;
518 
519   if (is_valid_context(mpsse)) {
520     description = mpsse->description;
521   }
522 
523   return description;
524 }
525 
526 /*
527  * Enable / disable internal loopback.
528  *
529  * @mpsse  - MPSSE context pointer.
530  * @enable - Zero to disable loopback, 1 to enable loopback.
531  *
532  * Returns MPSSE_OK on success.
533  * Returns MPSSE_FAIL on failure.
534  */
SetLoopback(struct mpsse_context * mpsse,int enable)535 int SetLoopback(struct mpsse_context* mpsse, int enable) {
536   uint8_t buf[1] = {0};
537   int retval = MPSSE_FAIL;
538 
539   if (is_valid_context(mpsse)) {
540     if (enable) {
541       buf[0] = LOOPBACK_START;
542     } else {
543       buf[0] = LOOPBACK_END;
544     }
545 
546     retval = raw_write(mpsse, buf, 1);
547   }
548 
549   return retval;
550 }
551 
552 /*
553  * Sets the idle state of the chip select pin. CS idles high by default.
554  *
555  * @mpsse - MPSSE context pointer.
556  * @idle  - Set to 1 to idle high, 0 to idle low.
557  *
558  * Returns void.
559  */
SetCSIdle(struct mpsse_context * mpsse,int idle)560 void SetCSIdle(struct mpsse_context* mpsse, int idle) {
561   if (is_valid_context(mpsse)) {
562     if (idle > 0) {
563       /* Chip select idles high, active low */
564       mpsse->pidle |= CS;
565       mpsse->pstop |= CS;
566       mpsse->pstart &= ~CS;
567     } else {
568       /* Chip select idles low, active high */
569       mpsse->pidle &= ~CS;
570       mpsse->pstop &= ~CS;
571       mpsse->pstart |= CS;
572     }
573   }
574 
575   return;
576 }
577 
578 /*
579  * Enables or disables flushing of the FTDI chip's RX buffers after each read
580  *operation.
581  * Flushing is disable by default.
582  *
583  * @mpsse - MPSSE context pointer.
584  * @tf    - Set to 1 to enable flushing, or 0 to disable flushing.
585  *
586  * Returns void.
587  */
FlushAfterRead(struct mpsse_context * mpsse,int tf)588 void FlushAfterRead(struct mpsse_context* mpsse, int tf) {
589   mpsse->flush_after_read = tf;
590   return;
591 }
592 
593 /*
594  * Send data start condition.
595  *
596  * @mpsse - MPSSE context pointer.
597  *
598  * Returns MPSSE_OK on success.
599  * Returns MPSSE_FAIL on failure.
600  */
Start(struct mpsse_context * mpsse)601 int Start(struct mpsse_context* mpsse) {
602   int status = MPSSE_OK;
603 
604   if (is_valid_context(mpsse)) {
605     if (mpsse->mode == I2C && mpsse->status == STARTED) {
606       /* Set the default pin states while the clock is low since this is an I2C
607        * repeated start condition */
608       status |= set_bits_low(mpsse, (mpsse->pidle & ~SK));
609 
610       /* Make sure the pins are in their default idle state */
611       status |= set_bits_low(mpsse, mpsse->pidle);
612     }
613 
614     /* Set the start condition */
615     status |= set_bits_low(mpsse, mpsse->pstart);
616 
617     /*
618      * Hackish work around to properly support SPI mode 3.
619      * SPI3 clock idles high, but needs to be set low before sending out
620      * data to prevent unintenteded clock glitches from the FT2232.
621      */
622     if (mpsse->mode == SPI3) {
623       status |= set_bits_low(mpsse, (mpsse->pstart & ~SK));
624     }
625     /*
626      * Hackish work around to properly support SPI mode 1.
627      * SPI1 clock idles low, but needs to be set high before sending out
628      * data to preven unintended clock glitches from the FT2232.
629      */
630     else if (mpsse->mode == SPI1) {
631       status |= set_bits_low(mpsse, (mpsse->pstart | SK));
632     }
633 
634     mpsse->status = STARTED;
635   } else {
636     status = MPSSE_FAIL;
637     mpsse->status = STOPPED;
638   }
639 
640   return status;
641 }
642 
643 /*
644  * Performs a bit-wise write of up to 8 bits at a time.
645  *
646  * @mpsse - MPSSE context pointer.
647  * @bits  - A byte containing the desired bits to write.
648  * @size  - The number of bits from the 'bits' byte to write.
649  *
650  * Returns MPSSE_OK on success, MPSSE_FAIL on failure.
651  */
WriteBits(struct mpsse_context * mpsse,char bits,size_t size)652 int WriteBits(struct mpsse_context* mpsse, char bits, size_t size) {
653   uint8_t data[8] = {0};
654   size_t i = 0;
655   int retval = MPSSE_OK;
656 
657   if (size > sizeof(data)) {
658     size = sizeof(data);
659   }
660 
661   /* Convert each bit in bits to an array of bytes */
662   for (i = 0; i < size; i++) {
663     if (bits & (1 << i)) {
664       /* Be sure to honor endianess */
665       if (mpsse->endianess == LSB) {
666         data[i] = '\xFF';
667       } else {
668         data[size - i - 1] = '\xFF';
669       }
670     }
671   }
672 
673   /* Enable bit mode before writing, then disable it afterwards. */
674   EnableBitmode(mpsse, 1);
675   retval = Write(mpsse, data, size);
676   EnableBitmode(mpsse, 0);
677 
678   return retval;
679 }
680 
681 /*
682  * Send data out via the selected serial protocol.
683  *
684  * @mpsse - MPSSE context pointer.
685  * @data  - Buffer of data to send.
686  * @size  - Size of data.
687  *
688  * Returns MPSSE_OK on success.
689  * Returns MPSSE_FAIL on failure.
690  */
Write(struct mpsse_context * mpsse,const void * vdata,int size)691 int Write(struct mpsse_context* mpsse, const void* vdata, int size) {
692   const uint8_t* data = vdata;
693   uint8_t* buf = NULL;
694   int retval = MPSSE_FAIL, buf_size = 0, txsize = 0, n = 0;
695 
696   if (is_valid_context(mpsse)) {
697     if (mpsse->mode) {
698       while (n < size) {
699         txsize = size - n;
700         if (txsize > mpsse->xsize) {
701           txsize = mpsse->xsize;
702         }
703 
704         /*
705          * For I2C we need to send each byte individually so that we can
706          * read back each individual ACK bit, so set the transmit size to 1.
707          */
708         if (mpsse->mode == I2C) {
709           txsize = 1;
710         }
711 
712         buf = build_block_buffer(mpsse, mpsse->tx, data + n, txsize, &buf_size);
713         if (buf) {
714           retval = raw_write(mpsse, buf, buf_size);
715           n += txsize;
716           free(buf);
717 
718           if (retval == MPSSE_FAIL) {
719             break;
720           }
721 
722           /* Read in the ACK bit and store it in mpsse->rack */
723           if (mpsse->mode == I2C) {
724             raw_read(mpsse, (uint8_t*)&mpsse->rack, 1);
725           }
726         } else {
727           break;
728         }
729       }
730     }
731 
732     if (retval == MPSSE_OK && n == size) {
733       retval = MPSSE_OK;
734     }
735   }
736 
737   return retval;
738 }
739 
740 /* Performs a read. For internal use only; see Read() and ReadBits(). */
InternalRead(struct mpsse_context * mpsse,int size)741 static uint8_t* InternalRead(struct mpsse_context* mpsse, int size) {
742   uint8_t *data = NULL, *buf = NULL;
743   uint8_t sbuf[SPI_RW_SIZE] = {0};
744   int n = 0, rxsize = 0, data_size = 0, retval = 0;
745 
746   if (is_valid_context(mpsse)) {
747     if (mpsse->mode) {
748       buf = malloc(size);
749       if (buf) {
750         memset(buf, 0, size);
751 
752         while (n < size) {
753           rxsize = size - n;
754           if (rxsize > mpsse->xsize) {
755             rxsize = mpsse->xsize;
756           }
757 
758           data = build_block_buffer(mpsse, mpsse->rx, sbuf, rxsize, &data_size);
759           if (data) {
760             retval = raw_write(mpsse, data, data_size);
761             free(data);
762 
763             if (retval == MPSSE_OK) {
764               n += raw_read(mpsse, buf + n, rxsize);
765             } else {
766               break;
767             }
768           } else {
769             break;
770           }
771         }
772       }
773     }
774   }
775 
776   return buf;
777 }
778 
779 /*
780  * Reads data over the selected serial protocol.
781  *
782  * @mpsse - MPSSE context pointer.
783  * @size  - Number of bytes to read.
784  *
785  * Returns a pointer to the read data on success.
786  * Returns NULL on failure.
787  */
788 #ifdef SWIGPYTHON
Read(struct mpsse_context * mpsse,int size)789 swig_string_data Read(struct mpsse_context* mpsse, int size)
790 #else
791 uint8_t* Read(struct mpsse_context* mpsse, int size)
792 #endif
793 {
794   uint8_t* buf = NULL;
795 
796   buf = InternalRead(mpsse, size);
797 
798 #ifdef SWIGPYTHON
799   swig_string_data sdata = {0};
800   sdata.size = size;
801   sdata.data = buf;
802   return sdata;
803 #else
804   return buf;
805 #endif
806 }
807 
808 /*
809  * Performs a bit-wise read of up to 8 bits.
810  *
811  * @mpsse - MPSSE context pointer.
812  * @size  - Number of bits to read.
813  *
814  * Returns an 8-bit byte containing the read bits.
815  */
ReadBits(struct mpsse_context * mpsse,int size)816 char ReadBits(struct mpsse_context* mpsse, int size) {
817   char bits = 0;
818   uint8_t* rdata = NULL;
819 
820   if (size > 8) {
821     size = 8;
822   }
823 
824   EnableBitmode(mpsse, 1);
825   rdata = InternalRead(mpsse, size);
826   EnableBitmode(mpsse, 0);
827 
828   if (rdata) {
829     /* The last byte in rdata will have all the read bits set or unset as
830      * needed. */
831     bits = rdata[size - 1];
832 
833     if (mpsse->endianess == MSB) {
834       /*
835        * In MSB mode, bits are sifted in from the left. If less than 8 bits were
836        * read, we need to shift them left accordingly.
837        */
838       bits = bits << (8 - size);
839     } else if (mpsse->endianess == LSB) {
840       /*
841        * In LSB mode, bits are shifted in from the right. If less than 8 bits
842        * were
843        * read, we need to shift them right accordingly.
844        */
845       bits = bits >> (8 - size);
846     }
847 
848     free(rdata);
849   }
850 
851   return bits;
852 }
853 
854 /*
855  * Reads and writes data over the selected serial protocol (SPI only).
856  *
857  * @mpsse - MPSSE context pointer.
858  * @data  - Buffer containing bytes to write.
859  * @size  - Number of bytes to transfer.
860  *
861  * Returns a pointer to the read data on success.
862  * Returns NULL on failure.
863  */
864 #ifdef SWIGPYTHON
Transfer(struct mpsse_context * mpsse,char * data,int size)865 swig_string_data Transfer(struct mpsse_context* mpsse, char* data, int size)
866 #else
867 uint8_t* Transfer(struct mpsse_context* mpsse, uint8_t* data, int size)
868 #endif
869 {
870   uint8_t *txdata = NULL, *buf = NULL;
871   int n = 0, data_size = 0, rxsize = 0, retval = 0;
872 
873   if (is_valid_context(mpsse)) {
874     /* Make sure we're configured for one of the SPI modes */
875     if (mpsse->mode >= SPI0 && mpsse->mode <= SPI3) {
876       buf = malloc(size);
877       if (buf) {
878         memset(buf, 0, size);
879 
880         while (n < size) {
881           /* When sending and recieving, FTDI chips don't seem to like large
882            * data blocks. Limit the size of each block to SPI_TRANSFER_SIZE */
883           rxsize = size - n;
884           if (rxsize > SPI_TRANSFER_SIZE) {
885             rxsize = SPI_TRANSFER_SIZE;
886           }
887 
888           txdata =
889               build_block_buffer(mpsse, mpsse->txrx, data + n,
890                                  rxsize, &data_size);
891           if (txdata) {
892             retval = raw_write(mpsse, txdata, data_size);
893             free(txdata);
894 
895             if (retval == MPSSE_OK) {
896               n += raw_read(mpsse, (buf + n), rxsize);
897             } else {
898               break;
899             }
900           } else {
901             break;
902           }
903         }
904       }
905     }
906   }
907 
908 #ifdef SWIGPYTHON
909   swig_string_data sdata = {0};
910   sdata.size = n;
911   sdata.data = (char*)buf;
912   return sdata;
913 #else
914   return buf;
915 #endif
916 }
917 
918 /*
919  * Returns the last received ACK bit.
920  *
921  * @mpsse - MPSSE context pointer.
922  *
923  * Returns either an ACK (0) or a NACK (1).
924  */
GetAck(struct mpsse_context * mpsse)925 int GetAck(struct mpsse_context* mpsse) {
926   int ack = 0;
927 
928   if (is_valid_context(mpsse)) {
929     ack = (mpsse->rack & 0x01);
930   }
931 
932   return ack;
933 }
934 
935 /*
936  * Sets the transmitted ACK bit.
937  *
938  * @mpsse - MPSSE context pointer.
939  * @ack   - 0 to send ACKs, 1 to send NACKs.
940  *
941  * Returns void.
942  */
SetAck(struct mpsse_context * mpsse,int ack)943 void SetAck(struct mpsse_context* mpsse, int ack) {
944   if (is_valid_context(mpsse)) {
945     if (ack == NACK) {
946       mpsse->tack = 0xFF;
947     } else {
948       mpsse->tack = 0x00;
949     }
950   }
951 
952   return;
953 }
954 
955 /*
956  * Causes libmpsse to send ACKs after each read byte in I2C mode.
957  *
958  * @mpsse - MPSSE context pointer.
959  *
960  * Returns void.
961  */
SendAcks(struct mpsse_context * mpsse)962 void SendAcks(struct mpsse_context* mpsse) {
963   return SetAck(mpsse, ACK);
964 }
965 
966 /*
967  * Causes libmpsse to send NACKs after each read byte in I2C mode.
968  *
969  * @mpsse - MPSSE context pointer.
970  *
971  * Returns void.
972  */
SendNacks(struct mpsse_context * mpsse)973 void SendNacks(struct mpsse_context* mpsse) {
974   return SetAck(mpsse, NACK);
975 }
976 
977 /*
978  * Send data stop condition.
979  *
980  * @mpsse - MPSSE context pointer.
981  *
982  * Returns MPSSE_OK on success.
983  * Returns MPSSE_FAIL on failure.
984  */
Stop(struct mpsse_context * mpsse)985 int Stop(struct mpsse_context* mpsse) {
986   int retval = MPSSE_OK;
987 
988   if (is_valid_context(mpsse)) {
989     /* In I2C mode, we need to ensure that the data line goes low while the
990      * clock line is low to avoid sending an inadvertent start condition */
991     if (mpsse->mode == I2C) {
992       retval |= set_bits_low(mpsse, (mpsse->pidle & ~DO & ~SK));
993     }
994 
995     /* Send the stop condition */
996     retval |= set_bits_low(mpsse, mpsse->pstop);
997 
998     if (retval == MPSSE_OK) {
999       /* Restore the pins to their idle states */
1000       retval |= set_bits_low(mpsse, mpsse->pidle);
1001     }
1002 
1003     mpsse->status = STOPPED;
1004   } else {
1005     retval = MPSSE_FAIL;
1006     mpsse->status = STOPPED;
1007   }
1008 
1009   return retval;
1010 }
1011 
1012 /*
1013  * Sets the specified pin high.
1014  *
1015  * @mpsse - MPSSE context pointer.
1016  * @pin   - Pin number to set high.
1017  *
1018  * Returns MPSSE_OK on success.
1019  * Returns MPSSE_FAIL on failure.
1020  */
PinHigh(struct mpsse_context * mpsse,int pin)1021 int PinHigh(struct mpsse_context* mpsse, int pin) {
1022   int retval = MPSSE_FAIL;
1023 
1024   if (is_valid_context(mpsse)) {
1025     retval = gpio_write(mpsse, pin, HIGH);
1026   }
1027 
1028   return retval;
1029 }
1030 
1031 /*
1032  * Sets the specified pin low.
1033  *
1034  * @mpsse - MPSSE context pointer.
1035  * @pin   - Pin number to set low.
1036  *
1037  * Returns MPSSE_OK on success.
1038  * Returns MPSSE_FAIL on failure.
1039  */
PinLow(struct mpsse_context * mpsse,int pin)1040 int PinLow(struct mpsse_context* mpsse, int pin) {
1041   int retval = MPSSE_FAIL;
1042 
1043   if (is_valid_context(mpsse)) {
1044     retval = gpio_write(mpsse, pin, LOW);
1045   }
1046 
1047   return retval;
1048 }
1049 
1050 /*
1051  * Sets the input/output direction of all pins. For use in BITBANG mode only.
1052  *
1053  * @mpsse     - MPSSE context pointer.
1054  * @direction - Byte indicating input/output direction of each bit.  1 is out.
1055  *
1056  * Returns MPSSE_OK if direction could be set, MPSSE_FAIL otherwise.
1057  */
SetDirection(struct mpsse_context * mpsse,uint8_t direction)1058 int SetDirection(struct mpsse_context* mpsse, uint8_t direction) {
1059   int retval = MPSSE_FAIL;
1060 
1061   if (is_valid_context(mpsse)) {
1062     if (mpsse->mode == BITBANG) {
1063       if (ftdi_set_bitmode(&mpsse->ftdi, direction, BITMODE_BITBANG) == 0) {
1064         retval = MPSSE_OK;
1065       }
1066     }
1067   }
1068 
1069   return retval;
1070 }
1071 
1072 /*
1073  * Sets the input/output value of all pins. For use in BITBANG mode only.
1074  *
1075  * @mpsse - MPSSE context pointer.
1076  * @data  - Byte indicating bit hi/low value of each bit.
1077  *
1078  * Returns MPSSE_OK if direction could be set, MPSSE_FAIL otherwise.
1079  */
WritePins(struct mpsse_context * mpsse,uint8_t data)1080 int WritePins(struct mpsse_context* mpsse, uint8_t data) {
1081   int retval = MPSSE_FAIL;
1082 
1083   if (is_valid_context(mpsse)) {
1084     if (mpsse->mode == BITBANG) {
1085       if (ftdi_write_data(&mpsse->ftdi, &data, 1) == 0) {
1086         retval = MPSSE_OK;
1087       }
1088     }
1089   }
1090 
1091   return retval;
1092 }
1093 
1094 /*
1095  * Reads the state of the chip's pins. For use in BITBANG mode only.
1096  *
1097  * @mpsse - MPSSE context pointer.
1098  *
1099  * Returns a byte with the corresponding pin's bits set to 1 or 0.
1100  */
ReadPins(struct mpsse_context * mpsse)1101 int ReadPins(struct mpsse_context* mpsse) {
1102   uint8_t val = 0;
1103 
1104   if (is_valid_context(mpsse)) {
1105     ftdi_read_pins((struct ftdi_context*)&mpsse->ftdi, (uint8_t*)&val);
1106   }
1107 
1108   return (int)val;
1109 }
1110 
1111 /*
1112  * Checks if a specific pin is high or low. For use in BITBANG mode only.
1113  *
1114  * @mpsse - MPSSE context pointer.
1115  * @pin   - The pin number.
1116  * @state - The state of the pins, as returned by ReadPins.
1117  *          If set to -1, ReadPins will automatically be called.
1118  *
1119  * Returns a 1 if the pin is high, 0 if the pin is low.
1120  */
PinState(struct mpsse_context * mpsse,int pin,int state)1121 int PinState(struct mpsse_context* mpsse, int pin, int state) {
1122   if (state == -1) {
1123     state = ReadPins(mpsse);
1124   }
1125 
1126   /* If not in bitbang mode, the specified pin should be one of GPIOLx. Convert
1127    * these defines into an absolute pin number. */
1128   if (mpsse->mode != BITBANG) {
1129     pin += NUM_GPIOL_PINS;
1130   }
1131 
1132   return ((state & (1 << pin)) >> pin);
1133 }
1134 
1135 /*
1136  * Places all I/O pins into a tristate mode.
1137  *
1138  * @mpsse - MPSSE context pointer.
1139  *
1140  * Returns MPSSE_OK on success, MPSSE_FAIL on failure.
1141  */
Tristate(struct mpsse_context * mpsse)1142 int Tristate(struct mpsse_context* mpsse) {
1143   uint8_t cmd[CMD_SIZE] = {0};
1144 
1145   /* Tristate the all I/O pins (FT232H only) */
1146   cmd[0] = TRISTATE_IO;
1147   cmd[1] = 0xFF;
1148   cmd[2] = 0xFF;
1149 
1150   return raw_write(mpsse, cmd, sizeof(cmd));
1151 }
1152