TS-UART low latency patch
Problem: when receiving small
amounts of data, such as only a byte or two at a time, the latency
between read() calls (which can be 10-20ms) is much greater than the
time it takes to receive the data, resulting in poor performance.
Solution: Use the setserial
command with the "low_latency" option to configure the port.
From the man page of
setserial for this option:
Minimize the receive latency of the
serial device at the cost of
greater CPU utilization. (Normally
there is an average of
5-10ms latency before characters are handed off to the line dis-
cipline to minimize overhead.) This
is off by default, but
certain real-time applications may find this useful.
However, we discovered that the TS-UART driver did not appear to
support this option. Further analysis provided a fix which
results in the low_latency option to setserial working correctly.
However, some boards as shipped do not have this patched driver
installed. If you need this option and find that you
receive an error message from setserial when trying to use it with a
TS-UART, it is likely that you will need to update your TS-UART
core driver (tsuart0 for Linux 2.4 and tsuart1 for Linux 2.6).
There are several ways to upgrade the TS-UART core driver.
- Re-compile from source using the latest source files:
- Patch your existing source files and re-compile. This option is
useful if you do not want or need any other driver changes that may be
present.
- Use the pre-compiled binary
The latest source files (as of 5/7/2009) can be downloaded here:
Linux 2.4
tsuart0.c
(md5sum 0553956c7909b8249c4f9bd007dd0589)
tsuart.h
(md5sum 96e531830e98847ed0c75bf795606285)
Linux 2.6
tsuart1.c
(md5sum 44df8a7af9522f15cfc191c110deee8b)
tsuart1.h
(md5sum 219fc3cb3b917d815b3168da3eb86a6b)
To patch your existing driver file (either Linux version), add the
following lines of code to the function tsuart_verify_port() in
the main code path before the final return statement:
if (ser->baud_base < 9600) {
ser->baud_base = 115200; // required to allow ioctl to set low_latency
}
The pre-compiled binary (as of 5/7/2009) can be downloaded here:
Linux 2.4
tsuart0.o
(md5sum cbd608377548b952efce84e85a3d71b8)
Linux 2.6
tsuart1.ko
(md5sum 33a440b515c6ed4bcfaf7c25dd626703)
Initial version: 5/7/2009
4:44
p.m. MST