* [v2] USB: serial: ftdi_sio: Improve the accuracy of the baud rate generator by using round-to-closest instead of truncating when calculating baud rate divisors.
@ 2018-11-16 21:44 Nikolaj Fogh
0 siblings, 0 replies; 2+ messages in thread
From: Nikolaj Fogh @ 2018-11-16 21:44 UTC (permalink / raw)
To: Johan Hovold; +Cc: linux-usb
Improve baud-rate generation by using rounding-to-closest instead of
truncation in divisor calculation.
Results have been verified by logic analyzer on an FT232RT (232BM) chip.
The following table shows the wanted baud rate, the baud rate obtained
with the old method (truncation), with the new method (rounding) and the
baud rate generated by the windows 10 driver. The numbers in parentheses
is the error.
+- Wanted --+------ Old -------+------ New -------+------ Win -------+
| 9600 | 9600 (0.00%) | 9604 (0.05%) | 9605 (0.05%) |
| 19200 | 19200 (0.00%) | 19199 (0.01%) | 19198 (0.01%) |
| 38400 | 38395 (0.01%) | 38431 (0.08%) | 38394 (0.02%) |
| 57600 | 57725 (0.22%) | 57540 (0.10%) | 57673 (0.13%) |
| 115200 | 115307 (0.09%) | 115330 (0.11%) | 115320 (0.10%) |
| 921600 | 919963 (0.18%) | 920386 (0.13%) | 920810 (0.09%) |
| 961200 | 996512 (3.67%) | 956480 (0.49%) | 956937 (0.44%) |
+-----------+------------------+------------------+------------------+
The error due to noise in the measurements is in the order of a few
tenths of a %. As can be seen, the baud rate for 961200 is significantly
improved for some rates, and corresponds to the output given by the
windows driver.
The theoretical baud rate has been calculated for all baud rates from 1
to 3M, and as expected, the error is centered around 0, with a triangle
shape instead of a sawtooth, so the maximum error is decreased to half.
Signed-off-by: Nikolaj Fogh <nikolajfogh@gmail.com>
---
drivers/usb/serial/ftdi_sio.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
divisor = divisor3 >> 3;
@@ -1156,7 +1156,7 @@ static u32 ftdi_232bm_baud_base_to_divisor(int
baud, int base)
static const unsigned char divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
u32 divisor;
/* divisor shifted 3 bits to the left */
- int divisor3 = base / 2 / baud;
+ int divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud);
divisor = divisor3 >> 3;
divisor |= (u32)divfrac[divisor3 & 0x7] << 14;
/* Deal with special cases for highest baud rates. */
@@ -1179,7 +1179,7 @@ static u32 ftdi_2232h_baud_base_to_divisor(int
baud, int base)
int divisor3;
/* hi-speed baud rate is 10-bit sampling instead of 16-bit */
- divisor3 = base * 8 / (baud * 10);
+ divisor3 = DIV_ROUND_CLOSEST(base * 8, baud * 10);
divisor = divisor3 >> 3;
divisor |= (u32)divfrac[divisor3 & 0x7] << 14;
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 609198d9594c..0edbd3427548 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -1130,7 +1130,7 @@ static unsigned short int
ftdi_232am_baud_base_to_divisor(int baud, int base)
{
unsigned short int divisor;
/* divisor shifted 3 bits to the left */
- int divisor3 = base / 2 / baud;
+ int divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud);
if ((divisor3 & 0x7) == 7)
divisor3++; /* round x.7/8 up to x+1 */
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [v2] USB: serial: ftdi_sio: Improve the accuracy of the baud rate generator by using round-to-closest instead of truncating when calculating baud rate divisors.
@ 2018-11-20 16:55 Johan Hovold
0 siblings, 0 replies; 2+ messages in thread
From: Johan Hovold @ 2018-11-20 16:55 UTC (permalink / raw)
To: Nikolaj Fogh; +Cc: Johan Hovold, linux-usb
On Fri, Nov 16, 2018 at 10:44:21PM +0100, Nikolaj Fogh wrote:
> Improve baud-rate generation by using rounding-to-closest instead of
> truncation in divisor calculation.
>
> Results have been verified by logic analyzer on an FT232RT (232BM) chip.
> The following table shows the wanted baud rate, the baud rate obtained
> with the old method (truncation), with the new method (rounding) and the
> baud rate generated by the windows 10 driver. The numbers in parentheses
> is the error.
>
> +- Wanted --+------ Old -------+------ New -------+------ Win -------+
> | 9600 | 9600 (0.00%) | 9604 (0.05%) | 9605 (0.05%) |
> | 19200 | 19200 (0.00%) | 19199 (0.01%) | 19198 (0.01%) |
> | 38400 | 38395 (0.01%) | 38431 (0.08%) | 38394 (0.02%) |
> | 57600 | 57725 (0.22%) | 57540 (0.10%) | 57673 (0.13%) |
> | 115200 | 115307 (0.09%) | 115330 (0.11%) | 115320 (0.10%) |
> | 921600 | 919963 (0.18%) | 920386 (0.13%) | 920810 (0.09%) |
> | 961200 | 996512 (3.67%) | 956480 (0.49%) | 956937 (0.44%) |
> +-----------+------------------+------------------+------------------+
>
> The error due to noise in the measurements is in the order of a few
> tenths of a %. As can be seen, the baud rate for 961200 is significantly
> improved for some rates, and corresponds to the output given by the
> windows driver.
>
> The theoretical baud rate has been calculated for all baud rates from 1
> to 3M, and as expected, the error is centered around 0, with a triangle
> shape instead of a sawtooth, so the maximum error is decreased to half.
>
> Signed-off-by: Nikolaj Fogh <nikolajfogh@gmail.com>
Thanks for updated commit message. I was just about to apply it, but
checkpatch reported that the Signed-off address doesn't match the author
address (From). Would you mind fixing that up?
Also, please use a less verbose subject (patch summary), try to make it
fit within 72 cols or so.
Thanks,
Johan
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-11-20 16:55 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-20 16:55 [v2] USB: serial: ftdi_sio: Improve the accuracy of the baud rate generator by using round-to-closest instead of truncating when calculating baud rate divisors Johan Hovold
-- strict thread matches above, loose matches on Subject: below --
2018-11-16 21:44 Nikolaj Fogh
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).