Commit 3ecad604 authored by reillyg's avatar reillyg Committed by Commit bot

Use Linux custom baud rate selection based on struct termios2.

This new mechanism is preferred as it is supported by newer Linux serial
UART drivers such as TI OMAP.

BUG=422165
TEST=Wired together FTDI and CP2102 USB serial adapters and tried standard and non-standard bitrates.

Review URL: https://codereview.chromium.org/1131953003

Cr-Commit-Position: refs/heads/master@{#329016}
parent 1700960f
...@@ -17,6 +17,22 @@ ...@@ -17,6 +17,22 @@
#include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/permission_broker_client.h" #include "chromeos/dbus/permission_broker_client.h"
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
// The definition of struct termios2 is copied from asm-generic/termbits.h
// because including that header directly conflicts with termios.h.
extern "C" {
struct termios2 {
tcflag_t c_iflag; // input mode flags
tcflag_t c_oflag; // output mode flags
tcflag_t c_cflag; // control mode flags
tcflag_t c_lflag; // local mode flags
cc_t c_line; // line discipline
cc_t c_cc[19]; // control characters
speed_t c_ispeed; // input speed
speed_t c_ospeed; // output speed
};
}
#endif // defined(OS_LINUX) #endif // defined(OS_LINUX)
namespace { namespace {
...@@ -45,7 +61,7 @@ bool BitrateToSpeedConstant(int bitrate, speed_t* speed) { ...@@ -45,7 +61,7 @@ bool BitrateToSpeedConstant(int bitrate, speed_t* speed) {
BITRATE_TO_SPEED_CASE(9600) BITRATE_TO_SPEED_CASE(9600)
BITRATE_TO_SPEED_CASE(19200) BITRATE_TO_SPEED_CASE(19200)
BITRATE_TO_SPEED_CASE(38400) BITRATE_TO_SPEED_CASE(38400)
#if defined(OS_POSIX) && !defined(OS_MACOSX) #if !defined(OS_MACOSX)
BITRATE_TO_SPEED_CASE(57600) BITRATE_TO_SPEED_CASE(57600)
BITRATE_TO_SPEED_CASE(115200) BITRATE_TO_SPEED_CASE(115200)
BITRATE_TO_SPEED_CASE(230400) BITRATE_TO_SPEED_CASE(230400)
...@@ -83,7 +99,7 @@ bool SpeedConstantToBitrate(speed_t speed, int* bitrate) { ...@@ -83,7 +99,7 @@ bool SpeedConstantToBitrate(speed_t speed, int* bitrate) {
SPEED_TO_BITRATE_CASE(9600) SPEED_TO_BITRATE_CASE(9600)
SPEED_TO_BITRATE_CASE(19200) SPEED_TO_BITRATE_CASE(19200)
SPEED_TO_BITRATE_CASE(38400) SPEED_TO_BITRATE_CASE(38400)
#if defined(OS_POSIX) && !defined(OS_MACOSX) #if !defined(OS_MACOSX)
SPEED_TO_BITRATE_CASE(57600) SPEED_TO_BITRATE_CASE(57600)
SPEED_TO_BITRATE_CASE(115200) SPEED_TO_BITRATE_CASE(115200)
SPEED_TO_BITRATE_CASE(230400) SPEED_TO_BITRATE_CASE(230400)
...@@ -101,18 +117,20 @@ bool SetCustomBitrate(base::PlatformFile file, ...@@ -101,18 +117,20 @@ bool SetCustomBitrate(base::PlatformFile file,
struct termios* config, struct termios* config,
int bitrate) { int bitrate) {
#if defined(OS_LINUX) #if defined(OS_LINUX)
struct serial_struct serial; struct termios2 tio;
if (ioctl(file, TIOCGSERIAL, &serial) < 0) { if (ioctl(file, TCGETS2, &tio) < 0) {
VPLOG(1) << "Failed to get parameters to set custom bitrate";
return false; return false;
} }
serial.flags = (serial.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST; tio.c_cflag &= ~CBAUD;
serial.custom_divisor = serial.baud_base / bitrate; tio.c_cflag |= CBAUDEX;
if (serial.custom_divisor < 1) { tio.c_ispeed = bitrate;
serial.custom_divisor = 1; tio.c_ospeed = bitrate;
if (ioctl(file, TCSETS2, &tio) < 0) {
VPLOG(1) << "Failed to set custom bitrate";
return false;
} }
cfsetispeed(config, B38400); return true;
cfsetospeed(config, B38400);
return ioctl(file, TIOCSSERIAL, &serial) >= 0;
#elif defined(OS_MACOSX) #elif defined(OS_MACOSX)
speed_t speed = static_cast<speed_t>(bitrate); speed_t speed = static_cast<speed_t>(bitrate);
cfsetispeed(config, speed); cfsetispeed(config, speed);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment