From: Johan Hovold <johan@kernel.org>
To: Nikolaj Fogh <nfogh@vectory.com>
Cc: Johan Hovold <johan@kernel.org>,
Nikolaj Fogh <nikolajfogh@gmail.com>,
linux-usb@vger.kernel.org
Subject: Improve the accuracy of the baud rate generator by using round-to-closest instead of truncating when calculating baud rate divisors.
Date: Fri, 16 Nov 2018 10:33:18 +0100 [thread overview]
Message-ID: <20181116093318.GM19900@localhost> (raw)
On Thu, Nov 15, 2018 at 03:16:04PM +0100, Nikolaj Fogh wrote:
> On 11/15/18 9:24 AM, Johan Hovold wrote:
> > On Tue, Nov 13, 2018 at 08:19:44PM +0100, Nikolaj Fogh wrote:
> >> On 11/12/18 10:54 AM, Johan Hovold wrote:
> >>> On Wed, Oct 31, 2018 at 09:16:48PM +0100, Nikolaj Fogh wrote:
> >>>> I have experienced that the ftdi_sio driver gives less-than-optimal
> >>>> baud rates as the driver truncates instead of rounds to nearest
> >>>> during baud rate divisor calculation.
> >>>> This patch improves on the baud rate generation. The generated baud
> >>>> rate corresponds to the optimal baud rate achievable with the chip.
> >>>> This is what the windows driver gives as well.
> >>> How did you verify this? Did you trace and compare the divisors
> >>> actually requested by the Windows driver, or did you measure the
> >>> resulting rates using a scope?
> >> I verified it by scope. Granted, I only verified it for one baud rate
> >> (961200). Whether it gives the same as the Windows driver in general,
> >> I'm not sure. However, I would think that rounding instead of flooring
> >> would always yield the most accurate result.
> > I'm not so sure in this case. The driver uses "sub-integer" divisors and
> > looks like it depends on truncation rather than rounding. Some
> > background here:
> >
> > https://www.ftdichip.com/Support/Knowledgebase/index.html?whatbaudratesareachieveabl.htm
> I have had a closer look at this (and the driver code), and it seemsthat
> each bit in the divisorcorresponds to 1/8th (0.125) in the calculation.
>
> It is shuffled around a bit in the code (for legacy reasons I expect), and
> put in the higher order bits, but prior to that, I see no reason that
> rounding should not be used instead of truncating. I don't see how it
> "depends" on truncation.
As I mentioned in my follow-up mail, I agree with that; your proposed
change looks correct.
> > If you want to change these calculations you need to make a stronger
> > case for it and verify that we don't mess up some other rate
> > inadvertently.
> I have done a calculation which compares the error of the baud rate
> calculation going all the way from 1 to 3MBaud where it can be seen that
> the rounding (as expected) halves the maximum error. Whereas the old method
> went up to 12% baud rate error, the new method reaches 6%, so the range
> of baud rates where communication will be successful should increase. Also,
> the new method is always better or as-accurate as the old.
Excellent, thanks for confirming. Just mention something about that in
the commit message too.
> I guess that image attachments are not welcome in the mailing list, so
> I will refrain from attaching it. Let me know if I should send it to
> you.
Sure, if you want too that'd be great.
> I am using it in a system which uses a baud rate of 961200 (and not
> the standard 921600). Here the old calculation gave an error of 4.03%
> and the new gave 0.12% error.
Also good to have in the commit message.
> I will try to verify the numbers I have calculated with a logic analyzer to
> make sure that it corresponds with the real world. I can also try to compare
> it to the windows driver outputs.
That would be really good, at least for a few rates.
> As I only have a FT232RT (232bm) to test with, the patch should probably be
> limited to the changes in the ftdi_232bm_baud_base_to_divisor() function.
No, as long as you mention which device you used for testing, and the
numbers for the other other types looks similar, I think we can go ahead
and round those divisions too.
Thanks for doing this!
Johan
next reply other threads:[~2018-11-16 9:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-16 9:33 Johan Hovold [this message]
-- strict thread matches above, loose matches on Subject: below --
2018-11-15 14:16 Improve the accuracy of the baud rate generator by using round-to-closest instead of truncating when calculating baud rate divisors Nikolaj Fogh
2018-11-15 12:46 Johan Hovold
2018-11-15 8:24 Johan Hovold
2018-11-13 19:19 Nikolaj Fogh
2018-11-12 9:54 Johan Hovold
2018-10-31 20:16 Nikolaj Fogh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181116093318.GM19900@localhost \
--to=johan@kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=nfogh@vectory.com \
--cc=nikolajfogh@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).