From 74387f27647e7123e233d31d36daedc6b485650a Mon Sep 17 00:00:00 2001 From: Thomas Jarosch Date: Wed, 10 Apr 2013 10:42:43 +0200 Subject: [PATCH] Unify style of the main source code With all the contributions flowing in, the code style varied here and there. Also add the script I use to format the source code. --- doc/astyle_reformat.sh | 5 + src/ftdi.c | 191 +++++++++++++++++++++++++---------------------- src/ftdi.h | 39 ++++++---- src/ftdi_i.h | 4 +- src/ftdi_stream.c | 179 +++++++++++++++++++++++---------------------- 5 files changed, 222 insertions(+), 196 deletions(-) create mode 100755 doc/astyle_reformat.sh diff --git a/doc/astyle_reformat.sh b/doc/astyle_reformat.sh new file mode 100755 index 0000000..1bb445a --- /dev/null +++ b/doc/astyle_reformat.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# Astyle settings used to format our source code +/usr/bin/astyle --indent=spaces=4 --indent-switches --brackets=break \ + --convert-tabs --keep-one-line-statements --keep-one-line-blocks \ + $* diff --git a/src/ftdi.c b/src/ftdi.c index e2c4009..3c86456 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -295,7 +295,7 @@ struct ftdi_version_info ftdi_get_library_version() Finds all ftdi devices with given VID:PID on the usb bus. Creates a new ftdi_device_list which needs to be deallocated by ftdi_list_free() after use. With VID:PID 0:0, search for the default devices - (0x403:0x6001, 0x403:0x6010, 0x403:0x6011, 0x403:0x6014) + (0x403:0x6001, 0x403:0x6010, 0x403:0x6011, 0x403:0x6014) \param ftdi pointer to ftdi_context \param devlist Pointer where to store list of found devices @@ -328,11 +328,11 @@ int ftdi_usb_find_all(struct ftdi_context *ftdi, struct ftdi_device_list **devli if (libusb_get_device_descriptor(dev, &desc) < 0) ftdi_error_return_free_device_list(-6, "libusb_get_device_descriptor() failed", devs); - if (((vendor != 0 && product != 0) && - desc.idVendor == vendor && desc.idProduct == product) || - ((vendor == 0 && product == 0) && - (desc.idVendor == 0x403) && (desc.idProduct == 0x6001 || desc.idProduct == 0x6010 - || desc.idProduct == 0x6011 || desc.idProduct == 0x6014))) + if (((vendor != 0 && product != 0) && + desc.idVendor == vendor && desc.idProduct == product) || + ((vendor == 0 && product == 0) && + (desc.idVendor == 0x403) && (desc.idProduct == 0x6001 || desc.idProduct == 0x6010 + || desc.idProduct == 0x6011 || desc.idProduct == 0x6014))) { *curdev = (struct ftdi_device_list*)malloc(sizeof(struct ftdi_device_list)); if (!*curdev) @@ -999,7 +999,7 @@ int ftdi_usb_close(struct ftdi_context *ftdi) return rtn; } -/* ftdi_to_clkbits_AM For the AM device, convert a requested baudrate +/* ftdi_to_clkbits_AM For the AM device, convert a requested baudrate to encoded divisor and the achievable baudrate Function is only used internally \internal @@ -1111,7 +1111,7 @@ static int ftdi_to_clkbits_AM(int baudrate, unsigned long *encoded_divisor) H Type have all features above with {index[8],value[15:14]} is the encoded subdivisor - FT232R, FT2232 and FT232BM have no option for 12 MHz and with + FT232R, FT2232 and FT232BM have no option for 12 MHz and with {index[0],value[15:14]} is the encoded subdivisor AM Type chips have only four fractional subdivisors at value[15:14] @@ -1155,7 +1155,7 @@ static int ftdi_to_clkbits(int baudrate, unsigned int clk, int clk_div, unsigned *encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 0x7] << 14); } return best_baud; -} +} /** ftdi_convert_baudrate returns nearest supported baud rate to that requested. Function is only used internally @@ -1180,7 +1180,7 @@ static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi, if(baudrate*10 > H_CLK /0x3fff) { /* On H Devices, use 12 000 000 Baudrate when possible - We have a 14 bit divisor, a 1 bit divisor switch (10 or 16) + We have a 14 bit divisor, a 1 bit divisor switch (10 or 16) three fractional bits and a 120 MHz clock Assume AN_120 "Sub-integer divisors between 0 and 2 are not allowed" holds for DIV/10 CLK too, so /1, /1.5 and /2 can be handled the same*/ @@ -1218,7 +1218,7 @@ static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi, * Do not use, it's only for the unit test framework **/ int convert_baudrate_UT_export(int baudrate, struct ftdi_context *ftdi, - unsigned short *value, unsigned short *index) + unsigned short *value, unsigned short *index) { return ftdi_convert_baudrate(baudrate, ftdi, value, index); } @@ -2351,16 +2351,16 @@ int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, char * manufacturer, const char* default_product; switch(ftdi->type) { - case TYPE_AM: default_product = "AM"; break; - case TYPE_BM: default_product = "BM"; break; - case TYPE_2232C: default_product = "Dual RS232"; break; - case TYPE_R: default_product = "FT232R USB UART"; break; - case TYPE_2232H: default_product = "Dual RS232-HS"; break; - case TYPE_4232H: default_product = "FT4232H"; break; - case TYPE_232H: default_product = "Single-RS232-HS"; break; - case TYPE_230X: default_product = "FT230X Basic UART"; break; - default: - ftdi_error_return(-3, "Unknown chip type"); + case TYPE_AM: default_product = "AM"; break; + case TYPE_BM: default_product = "BM"; break; + case TYPE_2232C: default_product = "Dual RS232"; break; + case TYPE_R: default_product = "FT232R USB UART"; break; + case TYPE_2232H: default_product = "Dual RS232-HS"; break; + case TYPE_4232H: default_product = "FT4232H"; break; + case TYPE_232H: default_product = "Single-RS232-HS"; break; + case TYPE_230X: default_product = "FT230X Basic UART"; break; + default: + ftdi_error_return(-3, "Unknown chip type"); } eeprom->product = malloc(strlen(default_product) +1); if (eeprom->product) @@ -2439,7 +2439,7 @@ int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, char * manufacturer, } int ftdi_eeprom_set_strings(struct ftdi_context *ftdi, char * manufacturer, - char * product, char * serial) + char * product, char * serial) { struct ftdi_eeprom *eeprom; @@ -2454,7 +2454,8 @@ int ftdi_eeprom_set_strings(struct ftdi_context *ftdi, char * manufacturer, if (ftdi->usb_dev == NULL) ftdi_error_return(-3, "No connected device or device not yet opened"); - if (manufacturer) { + if (manufacturer) + { if (eeprom->manufacturer) free (eeprom->manufacturer); eeprom->manufacturer = malloc(strlen(manufacturer)+1); @@ -2462,7 +2463,8 @@ int ftdi_eeprom_set_strings(struct ftdi_context *ftdi, char * manufacturer, strcpy(eeprom->manufacturer, manufacturer); } - if(product) { + if(product) + { if (eeprom->product) free (eeprom->product); eeprom->product = malloc(strlen(product)+1); @@ -2470,11 +2472,13 @@ int ftdi_eeprom_set_strings(struct ftdi_context *ftdi, char * manufacturer, strcpy(eeprom->product, product); } - if (serial) { + if (serial) + { if (eeprom->serial) free (eeprom->serial); eeprom->serial = malloc(strlen(serial)+1); - if (eeprom->serial) { + if (eeprom->serial) + { strcpy(eeprom->serial, serial); eeprom->use_serial = 1; } @@ -2487,7 +2491,7 @@ int ftdi_eeprom_set_strings(struct ftdi_context *ftdi, char * manufacturer, void set_ft232h_cbus(struct ftdi_eeprom *eeprom, unsigned char * output) { int i; - for(i=0; i<5;i++) + for(i=0; i<5; i++) { int mode_low, mode_high; if (eeprom->cbus_function[2*i]> CBUSH_CLK7_5) @@ -2509,35 +2513,35 @@ static unsigned char type2bit(unsigned char type, enum ftdi_chip_type chip) { switch (chip) { - case TYPE_2232H: - case TYPE_2232C: - { - switch (type) + case TYPE_2232H: + case TYPE_2232C: { - case CHANNEL_IS_UART: return 0; - case CHANNEL_IS_FIFO: return 0x01; - case CHANNEL_IS_OPTO: return 0x02; - case CHANNEL_IS_CPU : return 0x04; - default: return 0; + switch (type) + { + case CHANNEL_IS_UART: return 0; + case CHANNEL_IS_FIFO: return 0x01; + case CHANNEL_IS_OPTO: return 0x02; + case CHANNEL_IS_CPU : return 0x04; + default: return 0; + } } - } - case TYPE_232H: - { - switch (type) + case TYPE_232H: { - case CHANNEL_IS_UART : return 0; - case CHANNEL_IS_FIFO : return 0x01; - case CHANNEL_IS_OPTO : return 0x02; - case CHANNEL_IS_CPU : return 0x04; - case CHANNEL_IS_FT1284 : return 0x08; - default: return 0; + switch (type) + { + case CHANNEL_IS_UART : return 0; + case CHANNEL_IS_FIFO : return 0x01; + case CHANNEL_IS_OPTO : return 0x02; + case CHANNEL_IS_CPU : return 0x04; + case CHANNEL_IS_FT1284 : return 0x08; + default: return 0; + } } - } - case TYPE_230X: /* FT230X is only UART */ - default: return 0; + case TYPE_230X: /* FT230X is only UART */ + default: return 0; } return 0; -} +} /** Build binary buffer from ftdi_eeprom structure. @@ -2573,7 +2577,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) if (eeprom->chip == -1) ftdi_error_return(-6,"No connected EEPROM or EEPROM type unknown"); - if (eeprom->size == -1) { + if (eeprom->size == -1) + { if ((eeprom->chip == 0x56) || (eeprom->chip == 0x66)) eeprom->size = 0x100; else @@ -2618,12 +2623,15 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) ftdi_error_return(-1,"eeprom size exceeded"); // empty eeprom - if (ftdi->type == TYPE_230X) { + if (ftdi->type == TYPE_230X) + { /* FT230X have a reserved section in the middle of the MTP, which cannot be written to, but must be included in the checksum */ memset(ftdi->eeprom->buf, 0, 0x80); memset((ftdi->eeprom->buf + 0xa0), 0, (FTDI_MAX_EEPROM_SIZE - 0xa0)); - } else { + } + else + { memset(ftdi->eeprom->buf, 0, FTDI_MAX_EEPROM_SIZE); } @@ -3047,7 +3055,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) output[0x00] = 0x80; /* Actually, leave the default value */ output[0x0a] = 0x08; /* Enable USB Serial Number */ output[0x0c] = (0x01) | (0x3 << 4); /* DBUS drive 4mA, CBUS drive 16mA */ - for (j = 0; j <= 6; j++) { + for (j = 0; j <= 6; j++) + { output[0x1a + j] = eeprom->cbus_function[j]; } break; @@ -3058,7 +3067,8 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) for (i = 0; i < eeprom->size/2-1; i++) { - if ((ftdi->type == TYPE_230X) && (i == 0x12)) { + if ((ftdi->type == TYPE_230X) && (i == 0x12)) + { /* FT230X has a user section in the MTP which is not part of the checksum */ i = 0x40; } @@ -3075,7 +3085,7 @@ int ftdi_eeprom_build(struct ftdi_context *ftdi) eeprom->initialized_for_connected_device = 1; return user_area_size; } -/* Decode the encoded EEPROM field for the FTDI Mode into a value for the abstracted +/* Decode the encoded EEPROM field for the FTDI Mode into a value for the abstracted * EEPROM structure * * FTD2XX doesn't allow to set multiple bits in the interface mode bitfield, and so do we @@ -3084,14 +3094,14 @@ static unsigned char bit2type(unsigned char bits) { switch (bits) { - case 0: return CHANNEL_IS_UART; - case 1: return CHANNEL_IS_FIFO; - case 2: return CHANNEL_IS_OPTO; - case 4: return CHANNEL_IS_CPU; - case 8: return CHANNEL_IS_FT1284; - default: - fprintf(stderr," Unexpected value %d for Hardware Interface type\n", - bits); + case 0: return CHANNEL_IS_UART; + case 1: return CHANNEL_IS_FIFO; + case 2: return CHANNEL_IS_OPTO; + case 4: return CHANNEL_IS_CPU; + case 8: return CHANNEL_IS_FT1284; + default: + fprintf(stderr," Unexpected value %d for Hardware Interface type\n", + bits); } return 0; } @@ -3176,7 +3186,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) { // Decode manufacturer i = buf[0x0E] & (eeprom_size -1); // offset - for (j=0;jmanufacturer[j] = buf[2*j+i+2]; } @@ -3197,7 +3207,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) { // Decode product name i = buf[0x10] & (eeprom_size -1); // offset - for (j=0;jproduct[j] = buf[2*j+i+2]; } @@ -3218,7 +3228,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) { // Decode serial i = buf[0x12] & (eeprom_size -1); // offset - for (j=0;jserial[j] = buf[2*j+i+2]; } @@ -3232,7 +3242,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) for (i = 0; i < eeprom_size/2-1; i++) { - if ((ftdi->type == TYPE_230X) && (i == 0x12)) { + if ((ftdi->type == TYPE_230X) && (i == 0x12)) + { /* FT230X has a user section in the MTP which is not part of the checksum */ i = 0x40; } @@ -3353,7 +3364,8 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) } else if (ftdi->type == TYPE_230X) { - for(i=0; i<4; i++) { + for(i=0; i<4; i++) + { eeprom->cbus_function[i] = buf[0x1a + i] & 0xFF; } eeprom->group0_drive = buf[0x0c] & 0x03; @@ -3395,7 +3407,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) { if(ftdi->type >= TYPE_232H) fprintf(stdout,"Enter low power state on ACBUS7\n"); - } + } if (eeprom->remote_wakeup) fprintf(stdout, "Enable Remote Wake Up\n"); fprintf(stdout, "PNP: %d\n",(eeprom->is_not_pnp)?0:1); @@ -3410,7 +3422,7 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) (eeprom->clock_polarity)?"HIGH":"LOW", (eeprom->data_order)?"LSB":"MSB", (eeprom->flow_control)?"":"No "); - } + } if ((ftdi->type >= TYPE_2232C) && (ftdi->type != TYPE_R) && (ftdi->type != TYPE_232H)) fprintf(stdout,"Channel B has Mode %s%s%s\n", channel_mode[eeprom->channel_b_type], @@ -3447,9 +3459,9 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) { int i; char *cbush_mux[] = {"TRISTATE","RXLED","TXLED", "TXRXLED","PWREN", - "SLEEP","DRIVE_0","DRIVE_1","IOMODE","TXDEN", - "CLK30","CLK15","CLK7_5" - }; + "SLEEP","DRIVE_0","DRIVE_1","IOMODE","TXDEN", + "CLK30","CLK15","CLK7_5" + }; fprintf(stdout,"ACBUS has %d mA drive%s%s\n", (eeprom->group0_drive+1) *4, (eeprom->group0_schmitt)?" Schmitt Input":"", @@ -3469,11 +3481,11 @@ int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose) { int i; char *cbush_mux[] = {"TRISTATE","RXLED","TXLED", "TXRXLED","PWREN", - "SLEEP","DRIVE_0","DRIVE_1","IOMODE","TXDEN", - "CLK24","CLK12","CLK6","BAT_DETECT","BAT_DETECT#", - "I2C_TXE#", "I2C_RXF#", "VBUS_SENSE", "BB_WR#", - "BBRD#", "TIME_STAMP", "AWAKE#", - }; + "SLEEP","DRIVE_0","DRIVE_1","IOMODE","TXDEN", + "CLK24","CLK12","CLK6","BAT_DETECT","BAT_DETECT#", + "I2C_TXE#", "I2C_RXF#", "VBUS_SENSE", "BB_WR#", + "BBRD#", "TIME_STAMP", "AWAKE#", + }; fprintf(stdout,"IOBUS has %d mA drive%s%s\n", (eeprom->group0_drive+1) *4, (eeprom->group0_schmitt)?" Schmitt Input":"", @@ -3691,19 +3703,19 @@ int ftdi_get_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu case GROUP3_SLEW: *value = ftdi->eeprom->group3_slew; break; - case POWER_SAVE: + case POWER_SAVE: *value = ftdi->eeprom->powersave; break; - case CLOCK_POLARITY: + case CLOCK_POLARITY: *value = ftdi->eeprom->clock_polarity; break; - case DATA_ORDER: + case DATA_ORDER: *value = ftdi->eeprom->data_order; break; - case FLOW_CONTROL: + case FLOW_CONTROL: *value = ftdi->eeprom->flow_control; break; - case CHIP_TYPE: + case CHIP_TYPE: *value = ftdi->eeprom->chip; break; case CHIP_SIZE: @@ -3884,16 +3896,16 @@ int ftdi_set_eeprom_value(struct ftdi_context *ftdi, enum ftdi_eeprom_value valu case CHIP_TYPE: ftdi->eeprom->chip = value; break; - case POWER_SAVE: + case POWER_SAVE: ftdi->eeprom->powersave = value; break; - case CLOCK_POLARITY: + case CLOCK_POLARITY: ftdi->eeprom->clock_polarity = value; break; - case DATA_ORDER: + case DATA_ORDER: ftdi->eeprom->data_order = value; break; - case FLOW_CONTROL: + case FLOW_CONTROL: ftdi->eeprom->flow_control = value; break; case CHIP_SIZE: @@ -4164,7 +4176,8 @@ int ftdi_write_eeprom(struct ftdi_context *ftdi) for (i = 0; i < ftdi->eeprom->size/2; i++) { /* Do not try to write to reserved area */ - if ((ftdi->type == TYPE_230X) && (i == 0x40)) { + if ((ftdi->type == TYPE_230X) && (i == 0x40)) + { i = 0x50; } usb_val = eeprom[i*2]; diff --git a/src/ftdi.h b/src/ftdi.h index 8f03679..15067c7 100644 --- a/src/ftdi.h +++ b/src/ftdi.h @@ -21,7 +21,8 @@ #include /** FTDI chip type */ -enum ftdi_chip_type { +enum ftdi_chip_type +{ TYPE_AM=0, TYPE_BM=1, TYPE_2232C=2, @@ -48,7 +49,7 @@ enum ftdi_mpsse_mode BITMODE_MPSSE = 0x02, /**< MPSSE mode, available on 2232x chips */ BITMODE_SYNCBB = 0x04, /**< synchronous bitbang mode, available on 2232x and R-type chips */ BITMODE_MCU = 0x08, /**< MCU Host Bus Emulation mode, available on 2232x chips */ - /* CPU-style fifo mode gets set via EEPROM */ + /* CPU-style fifo mode gets set via EEPROM */ BITMODE_OPTO = 0x10, /**< Fast Opto-Isolated Serial Interface Mode, available on 2232x chips */ BITMODE_CBUS = 0x20, /**< Bitbang on CBUS pins of R-type chips, configure in EEPROM before */ BITMODE_SYNCFF = 0x40, /**< Single Channel Synchronous FIFO mode, available on 2232H chips */ @@ -180,12 +181,12 @@ enum ftdi_module_detach_mode #define FTDI_URB_USERCONTEXT_COOKIE ((void *)0x1) #ifdef __GNUC__ - #define DEPRECATED(func) func __attribute__ ((deprecated)) +#define DEPRECATED(func) func __attribute__ ((deprecated)) #elif defined(_MSC_VER) - #define DEPRECATED(func) __declspec(deprecated) func +#define DEPRECATED(func) __declspec(deprecated) func #else - #pragma message("WARNING: You need to implement DEPRECATED for this compiler") - #define DEPRECATED(func) func +#pragma message("WARNING: You need to implement DEPRECATED for this compiler") +#define DEPRECATED(func) func #endif struct ftdi_transfer_control @@ -337,17 +338,21 @@ struct ftdi_device_list #define POWER_SAVE_DISABLE_H 0x80 #define USE_SERIAL_NUM 0x08 -enum ftdi_cbus_func {/* FIXME: Recheck value, especially the last */ +enum ftdi_cbus_func /* FIXME: Recheck value, especially the last */ +{ CBUS_TXDEN = 0, CBUS_PWREN = 1, CBUS_RXLED = 2, CBUS_TXLED = 3, CBUS_TXRXLED = 4, CBUS_SLEEP = 5, CBUS_CLK48 = 6, CBUS_CLK24 = 7, CBUS_CLK12 = 8, CBUS_CLK6 = 9, - CBUS_IOMODE = 0xa, CBUS_BB_WR = 0xb, CBUS_BB_RD = 0xc, CBUS_BB = 0xd}; + CBUS_IOMODE = 0xa, CBUS_BB_WR = 0xb, CBUS_BB_RD = 0xc, CBUS_BB = 0xd +}; -enum ftdi_cbush_func {/* FIXME: Recheck value, especially the last */ +enum ftdi_cbush_func /* FIXME: Recheck value, especially the last */ +{ CBUSH_TRISTATE = 0, CBUSH_RXLED = 1, CBUSH_TXLED = 2, CBUSH_TXRXLED = 3, CBUSH_PWREN = 4, CBUSH_SLEEP = 5, CBUSH_DRIVE_0 = 6, CBUSG_DRIVE1 = 7, CBUSH_IOMODE = 8, CBUSH_TXDEN = 9, CBUSH_CLK30 = 10, CBUSH_CLK15 = 11, CBUSH_CLK7_5 = 12, CBUSH_BAT_DETECT = 13, CBUSH_BAT_DETECT_NEG = 14, CBUSH_I2C_TXE = 15, CBUSH_I2C_RXF = 16, CBUSH_VBUS_SENSE = 17, - CBUSH_BB_WR = 18, CBUSH_BB_RD = 19, CBUSH_TIME_STAMP = 20, CBUSH_AWAKE = 21,}; + CBUSH_BB_WR = 18, CBUSH_BB_RD = 19, CBUSH_TIME_STAMP = 20, CBUSH_AWAKE = 21, +}; /** Invert TXD# */ #define INVERT_TXD 0x01 @@ -399,8 +404,8 @@ enum ftdi_cbush_func {/* FIXME: Recheck value, especially the last */ */ struct size_and_time { - uint64_t totalBytes; - struct timeval time; + uint64_t totalBytes; + struct timeval time; }; typedef struct @@ -458,13 +463,13 @@ extern "C" char * description, int desc_len, char * serial, int serial_len); int ftdi_eeprom_set_strings(struct ftdi_context *ftdi, char * manufacturer, - char * product, char * serial); + char * product, char * serial); int ftdi_usb_open(struct ftdi_context *ftdi, int vendor, int product); int ftdi_usb_open_desc(struct ftdi_context *ftdi, int vendor, int product, const char* description, const char* serial); int ftdi_usb_open_desc_index(struct ftdi_context *ftdi, int vendor, int product, - const char* description, const char* serial, unsigned int index); + const char* description, const char* serial, unsigned int index); int ftdi_usb_open_dev(struct ftdi_context *ftdi, struct libusb_device *dev); int ftdi_usb_open_string(struct ftdi_context *ftdi, const char* description); @@ -515,9 +520,9 @@ extern "C" int ftdi_set_error_char(struct ftdi_context *ftdi, unsigned char errorch, unsigned char enable); /* init eeprom for the given FTDI type */ - int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, - char * manufacturer, char *product, - char * serial); + int ftdi_eeprom_initdefaults(struct ftdi_context *ftdi, + char * manufacturer, char *product, + char * serial); int ftdi_eeprom_build(struct ftdi_context *ftdi); int ftdi_eeprom_decode(struct ftdi_context *ftdi, int verbose); diff --git a/src/ftdi_i.h b/src/ftdi_i.h index b973680..f8868d9 100644 --- a/src/ftdi_i.h +++ b/src/ftdi_i.h @@ -61,7 +61,7 @@ struct ftdi_eeprom int usb_version; /** Use usb version on FT2232 devices*/ int use_usb_version; - /** maximum power */ + /** maximum power */ int max_power; /** manufacturer name */ @@ -72,7 +72,7 @@ struct ftdi_eeprom char *serial; /* 2232D/H specific */ - /* Hardware type, 0 = RS232 Uart, 1 = 245 FIFO, 2 = CPU FIFO, + /* Hardware type, 0 = RS232 Uart, 1 = 245 FIFO, 2 = CPU FIFO, 4 = OPTO Isolate */ int channel_a_type; int channel_b_type; diff --git a/src/ftdi_stream.c b/src/ftdi_stream.c index cf3acf5..2180672 100644 --- a/src/ftdi_stream.c +++ b/src/ftdi_stream.c @@ -4,7 +4,7 @@ copyright : (C) 2009 Micah Dowty 2010 Uwe Bonnes email : opensource@intra2net.com ***************************************************************************/ - + /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * @@ -13,7 +13,7 @@ * * ***************************************************************************/ -/* Adapted from +/* Adapted from * fastftdi.c - A minimal FTDI FT232H interface for which supports bit-bang * mode, but focuses on very high-performance support for * synchronous FIFO mode. Requires libusb-1.0 @@ -56,59 +56,59 @@ typedef struct } FTDIStreamState; /* Handle callbacks - * + * * With Exit request, free memory and release the transfer * - * state->result is only set when some error happens + * state->result is only set when some error happens */ static void ftdi_readstream_cb(struct libusb_transfer *transfer) { - FTDIStreamState *state = transfer->user_data; - int packet_size = state->packetsize; - - state->activity++; - if (transfer->status == LIBUSB_TRANSFER_COMPLETED) - { - int i; - uint8_t *ptr = transfer->buffer; - int length = transfer->actual_length; - int numPackets = (length + packet_size - 1) / packet_size; - int res = 0; - - for (i = 0; i < numPackets; i++) - { - int payloadLen; - int packetLen = length; - - if (packetLen > packet_size) - packetLen = packet_size; - - payloadLen = packetLen - 2; - state->progress.current.totalBytes += payloadLen; - - res = state->callback(ptr + 2, payloadLen, - NULL, state->userdata); - - ptr += packetLen; - length -= packetLen; - } - if (res) - { - free(transfer->buffer); - libusb_free_transfer(transfer); - } - else - { - transfer->status = -1; - state->result = libusb_submit_transfer(transfer); - } - } - else - { - fprintf(stderr, "unknown status %d\n",transfer->status); - state->result = LIBUSB_ERROR_IO; - } + FTDIStreamState *state = transfer->user_data; + int packet_size = state->packetsize; + + state->activity++; + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) + { + int i; + uint8_t *ptr = transfer->buffer; + int length = transfer->actual_length; + int numPackets = (length + packet_size - 1) / packet_size; + int res = 0; + + for (i = 0; i < numPackets; i++) + { + int payloadLen; + int packetLen = length; + + if (packetLen > packet_size) + packetLen = packet_size; + + payloadLen = packetLen - 2; + state->progress.current.totalBytes += payloadLen; + + res = state->callback(ptr + 2, payloadLen, + NULL, state->userdata); + + ptr += packetLen; + length -= packetLen; + } + if (res) + { + free(transfer->buffer); + libusb_free_transfer(transfer); + } + else + { + transfer->status = -1; + state->result = libusb_submit_transfer(transfer); + } + } + else + { + fprintf(stderr, "unknown status %d\n",transfer->status); + state->result = LIBUSB_ERROR_IO; + } } /** @@ -120,12 +120,12 @@ ftdi_readstream_cb(struct libusb_transfer *transfer) static double TimevalDiff(const struct timeval *a, const struct timeval *b) { - return (a->tv_sec - b->tv_sec) + 1e-6 * (a->tv_usec - b->tv_usec); + return (a->tv_sec - b->tv_sec) + 1e-6 * (a->tv_usec - b->tv_usec); } /** Streaming reading of data from the device - + Use asynchronous transfers in libusb-1.0 for high-performance streaming of data from a device interface back to the PC. This function continuously transfers data until either an error occurs @@ -145,8 +145,8 @@ TimevalDiff(const struct timeval *a, const struct timeval *b) int ftdi_readstream(struct ftdi_context *ftdi, - FTDIStreamCallback *callback, void *userdata, - int packetsPerTransfer, int numTransfers) + FTDIStreamCallback *callback, void *userdata, + int packetsPerTransfer, int numTransfers) { struct libusb_transfer **transfers; FTDIStreamState state = { callback, userdata, ftdi->max_packet_size, 1 }; @@ -160,14 +160,14 @@ ftdi_readstream(struct ftdi_context *ftdi, fprintf(stderr,"Device doesn't support synchronous FIFO mode\n"); return 1; } - + /* We don't know in what state we are, switch to reset*/ if (ftdi_set_bitmode(ftdi, 0xff, BITMODE_RESET) < 0) { fprintf(stderr,"Can't reset mode\n"); return 1; } - + /* Purge anything remaining in the buffers*/ if (ftdi_usb_purge_buffers(ftdi) < 0) { @@ -178,34 +178,37 @@ ftdi_readstream(struct ftdi_context *ftdi, /* * Set up all transfers */ - + transfers = calloc(numTransfers, sizeof *transfers); - if (!transfers) { + if (!transfers) + { err = LIBUSB_ERROR_NO_MEM; goto cleanup; } - + for (xferIndex = 0; xferIndex < numTransfers; xferIndex++) { struct libusb_transfer *transfer; - + transfer = libusb_alloc_transfer(0); transfers[xferIndex] = transfer; - if (!transfer) { + if (!transfer) + { err = LIBUSB_ERROR_NO_MEM; goto cleanup; } - + libusb_fill_bulk_transfer(transfer, ftdi->usb_dev, ftdi->out_ep, - malloc(bufferSize), bufferSize, - ftdi_readstream_cb, + malloc(bufferSize), bufferSize, + ftdi_readstream_cb, &state, 0); - - if (!transfer->buffer) { + + if (!transfer->buffer) + { err = LIBUSB_ERROR_NO_MEM; goto cleanup; } - + transfer->status = -1; err = libusb_submit_transfer(transfer); if (err) @@ -213,8 +216,8 @@ ftdi_readstream(struct ftdi_context *ftdi, } /* Start the transfers only when everything has been set up. - * Otherwise the transfers start stuttering and the PC not - * fetching data for several to several ten milliseconds + * Otherwise the transfers start stuttering and the PC not + * fetching data for several to several ten milliseconds * and we skip blocks */ if (ftdi_set_bitmode(ftdi, 0xff, BITMODE_SYNCFF) < 0) @@ -227,20 +230,20 @@ ftdi_readstream(struct ftdi_context *ftdi, /* * Run the transfers, and periodically assess progress. */ - + gettimeofday(&state.progress.first.time, NULL); - + do { FTDIProgressInfo *progress = &state.progress; const double progressInterval = 1.0; struct timeval timeout = { 0, ftdi->usb_read_timeout }; struct timeval now; - + int err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout); if (err == LIBUSB_ERROR_INTERRUPTED) /* restart interrupted events */ - err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout); + err = libusb_handle_events_timeout(ftdi->usb_ctx, &timeout); if (!state.result) { state.result = err; @@ -249,7 +252,7 @@ ftdi_readstream(struct ftdi_context *ftdi, state.result = 1; else state.activity = 0; - + // If enough time has elapsed, update the progress gettimeofday(&now, NULL); if (TimevalDiff(&now, &progress->current.time) >= progressInterval) @@ -257,37 +260,37 @@ ftdi_readstream(struct ftdi_context *ftdi, progress->current.time = now; progress->totalTime = TimevalDiff(&progress->current.time, &progress->first.time); - + if (progress->prev.totalBytes) { // We have enough information to calculate rates - + double currentTime; - + currentTime = TimevalDiff(&progress->current.time, &progress->prev.time); - - progress->totalRate = - progress->current.totalBytes /progress->totalTime; - progress->currentRate = - (progress->current.totalBytes - - progress->prev.totalBytes) / currentTime; + + progress->totalRate = + progress->current.totalBytes /progress->totalTime; + progress->currentRate = + (progress->current.totalBytes - + progress->prev.totalBytes) / currentTime; } - + state.callback(NULL, 0, progress, state.userdata); progress->prev = progress->current; - + } } while (!state.result); - + /* * Cancel any outstanding transfers, and free memory. */ - - cleanup: + +cleanup: fprintf(stderr, "cleanup\n"); if (transfers) - free(transfers); + free(transfers); if (err) return err; else -- 1.7.1