X-Git-Url: http://developer.intra2net.com/git/?a=blobdiff_plain;f=src%2Fftdi.c;h=de5ded1722198098a6bc826923cf5af83dd72f63;hb=92cbae17a56ce3c6e5f01ea89dafaec75d865be7;hp=66c159e08bbd3b5fcb4f3456a8b6cbb0ea5852c7;hpb=f15786e4a4fdb935f639e16ab69d717f3d29bd2b;p=libftdi diff --git a/src/ftdi.c b/src/ftdi.c index 66c159e..de5ded1 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -35,6 +35,7 @@ #include #include "ftdi.h" +#include "ftdi_version_i.h" #define ftdi_error_return(code, str) do { \ ftdi->error_str = str; \ @@ -257,6 +258,23 @@ void ftdi_set_usbdev (struct ftdi_context *ftdi, libusb_device_handle *usb) ftdi->usb_dev = usb; } +/** + * @brief Get libftdi library version + * + * @return ftdi_version_info Library version information + **/ +struct ftdi_version_info ftdi_get_library_version() +{ + struct ftdi_version_info ver; + + ver.major = FTDI_MAJOR_VERSION; + ver.minor = FTDI_MINOR_VERSION; + ver.micro = FTDI_MICRO_VERSION; + ver.version_str = FTDI_VERSION_STRING; + ver.snapshot_str = FTDI_SNAPSHOT_VERSION; + + return ver; +} /** Finds all ftdi devices with given VID:PID on the usb bus. Creates a new @@ -1069,6 +1087,18 @@ static int ftdi_to_clkbits_AM(int baudrate, unsigned long *encoded_divisor) clk/2 -> 2 From /2, 0.125 steps may be taken. The fractional part has frac_code encoding + + value[13:0] of value is the divisor + index[9] mean 12 MHz Base(120 MHz/10) rate versus 3 MHz (48 MHz/16) else + + 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 + {index[0],value[15:14]} is the encoded subdivisor + + AM Type chips have only four fractional subdivisors at value[15:14] + for subdivisors 0, 0.5, 0.25, 0.125 */ static int ftdi_to_clkbits(int baudrate, unsigned int clk, int clk_div, unsigned long *encoded_divisor) { @@ -1100,7 +1130,11 @@ static int ftdi_to_clkbits(int baudrate, unsigned int clk, int clk_div, unsigned best_divisor = divisor/2; if(best_divisor > 0x20000) best_divisor = 0x1ffff; - best_baud = clk*8/clk_div/best_divisor; + best_baud = clk*16/clk_div/best_divisor; + if (best_baud & 1) /* Decide if to round up or down*/ + best_baud = best_baud /2 +1; + else + best_baud = best_baud /2; *encoded_divisor = (best_divisor >> 3) | (frac_code[best_divisor & 0x7] << 14); } return best_baud; @@ -1149,7 +1183,7 @@ static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi, } // Split into "value" and "index" values *value = (unsigned short)(encoded_divisor & 0xFFFF); - if (ftdi->type == TYPE_2232C || ftdi->type == TYPE_2232H || + if (ftdi->type == TYPE_2232H || ftdi->type == TYPE_4232H || ftdi->type == TYPE_232H ) { *index = (unsigned short)(encoded_divisor >> 8);