Use BM/R series baud rate computation for FT230X.
authorJoe Zbiciak <intvnut@gmail.com>
Sat, 13 Aug 2016 19:46:16 +0000 (12:46 -0700)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Tue, 16 Aug 2016 12:53:00 +0000 (14:53 +0200)
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).

src/ftdi.c

index 3bfd72f..0b26a7a 100644 (file)
@@ -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);
     }