From: Joe Zbiciak Date: Sat, 13 Aug 2016 19:46:16 +0000 (-0700) Subject: Use BM/R series baud rate computation for FT230X. X-Git-Tag: v1.4rc1~14 X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=commitdiff_plain;h=913ca54fbf3175575cb2f1e9780e18ee6f4b991a;hp=6f3b2133e6de5a38502d93278bacd7a1759f703f Use BM/R series baud rate computation for FT230X. The current code uses the AM series baud rate computation for FT230X, and this results in incorrect divisor calculation for high baud rates. Use the BM/R series logic instead. This matches the corresponding code paths in the Linux kernel ftdi_sio driver. See ftdi_sio.c:1323 here: http://lxr.free-electrons.com/source/drivers/usb/serial/ftdi_sio.c#L1323 Specifically attempts to set 2000000 on an FT230X fail currently due to the if-statement at ftdi.c:1106. The computed divisor (12) gets clamped to 16, and thus the for-loop it's in doesn't converge on a usable divisor. The if-statement at ftdi.c:1152 never fires, as the if-statement at ftdi.c:1106 in the for-loop precludes a divisor of 12 (which is required for *encoded_divisor to become 0x4001). --- diff --git a/src/ftdi.c b/src/ftdi.c index 3bfd72f..0b26a7a 100644 --- a/src/ftdi.c +++ b/src/ftdi.c @@ -1253,7 +1253,7 @@ static int ftdi_convert_baudrate(int baudrate, struct ftdi_context *ftdi, else best_baud = ftdi_to_clkbits(baudrate, C_CLK, 16, &encoded_divisor); } - else if ((ftdi->type == TYPE_BM) || (ftdi->type == TYPE_2232C) || (ftdi->type == TYPE_R )) + else if ((ftdi->type == TYPE_BM) || (ftdi->type == TYPE_2232C) || (ftdi->type == TYPE_R) || (ftdi->type == TYPE_230X)) { best_baud = ftdi_to_clkbits(baudrate, C_CLK, 16, &encoded_divisor); }