[SeaBIOS] [PATCH] Extend tools/readserial.py to support serial port timing calibration.
Kevin O'Connor
kevin at koconnor.net
Sun Jul 10 01:01:00 CEST 2011
On Sat, Jul 09, 2011 at 03:44:50PM -0500, Scott Duplichan wrote:
> Kevin O'Connor wrote:
>
> ]Some serial ports have slightly different timing. These timing
> ]variations result in less accurate boot time reporting. So, add a
> ]calibration mechanism to the tool so that one can determine how much
> ]time a specific machine's serial port uses.
>
> Hello Kevin,
>
> A while back I noticed both SeaBIOS and coreboot poll for TEMP (line status
> register bit for transmitter empty) before transmitting a character. An
> alternative is to poll THRE (transmitter holding register empty) instead.
>
> Polling TEMP forces the code to wait until the final stop bit time period is
> complete before it can load the next character. It is understandable that on
> some implementations this will cause one idle bit time to pass before
> transmission of the next character starts.
>
> When THRE is polled, the code has a period of nearly 10 bit times where the
> next character can be loaded such that it will transmit without any unneeded
> idle time between characters.
Thanks Scott, in some of my recent tests I noticed that in the SeaBIOS
code as well. I just sent a patch in a separate email.
Unfortunately, I didn't see an improvement in the timing accuracy even
after I made that change. Maybe I've missed something else.
> Here is the result of a transmit test using both methods on ASRock E350M1.
> The test works by timing a 5 second transmit:
>
> TX baud rate test, TEMP method (SeaBIOS and coreboot)
> selected Measured Percent Error
> 110 100 9
> 300 273 9
> 600 546 9
> 1200 1092 9
> 2400 2185 8
> 4800 4370 8
> 9600 8742 8
> 19200 17484 8
> 28800 26225 8
> 38400 34967 8
> 57600 52451 8
> 115200 104899 8
I'm seeing something very similar when running timing tests under
Linux. I get ~93.9us per char instead of the 86.8us per character at
115200 baud - a difference of 8%. This was under Linux though.
Oddly, under Linux, if I use bigger transmissions (eg, 10K) instead of
just 4000 byte transmissions I get much better timings - as little as
88.1us. Maybe Linux is using the fifos when the transmission is large
enough.
> TX baud rate test, THRE method
> selected Measured Percent Error
> 110 110 0
> 300 300 0
> 600 600 0
> 1200 1201 0
> 2400 2403 0
> 4800 4807 0
> 9600 9615 0
> 19200 19232 0
> 28800 28848 0
> 38400 38464 0
> 57600 57697 0
> 115200 115394 0
>
> I also noticed coreboot enables the uart fifos. This is not beneficial
> because the simple polling logic used by coreboot and SeaBIOS cannot utilize
> the transmit fifo.
Could the fifos being enabled be the cause of the slow down even after
the SeaBIOS serial polling fix?
-Kevin
More information about the SeaBIOS
mailing list