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).
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);
}