Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Unified Diff: device/serial/serial_io_handler_posix.cc

Issue 1131953003: Use Linux custom baud rate selection based on struct termios2. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/serial/serial_io_handler_posix.cc
diff --git a/device/serial/serial_io_handler_posix.cc b/device/serial/serial_io_handler_posix.cc
index 471b0b8191999d71dd811a56e2e399920b5fb798..52aad173d397064ef9d9ddf6c54d76d8524b0a3e 100644
--- a/device/serial/serial_io_handler_posix.cc
+++ b/device/serial/serial_io_handler_posix.cc
@@ -17,6 +17,22 @@
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/permission_broker_client.h"
#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)
namespace {
@@ -45,7 +61,7 @@ bool BitrateToSpeedConstant(int bitrate, speed_t* speed) {
BITRATE_TO_SPEED_CASE(9600)
BITRATE_TO_SPEED_CASE(19200)
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(115200)
BITRATE_TO_SPEED_CASE(230400)
@@ -83,7 +99,7 @@ bool SpeedConstantToBitrate(speed_t speed, int* bitrate) {
SPEED_TO_BITRATE_CASE(9600)
SPEED_TO_BITRATE_CASE(19200)
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(115200)
SPEED_TO_BITRATE_CASE(230400)
@@ -101,18 +117,20 @@ bool SetCustomBitrate(base::PlatformFile file,
struct termios* config,
int bitrate) {
#if defined(OS_LINUX)
- struct serial_struct serial;
- if (ioctl(file, TIOCGSERIAL, &serial) < 0) {
+ struct termios2 tio;
+ if (ioctl(file, TCGETS2, &tio) < 0) {
+ VPLOG(1) << "Failed to get parameters to set custom bitrate";
return false;
}
- serial.flags = (serial.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;
- serial.custom_divisor = serial.baud_base / bitrate;
- if (serial.custom_divisor < 1) {
- serial.custom_divisor = 1;
+ tio.c_cflag &= ~CBAUD;
+ tio.c_cflag |= CBAUDEX;
+ tio.c_ispeed = bitrate;
+ tio.c_ospeed = bitrate;
+ if (ioctl(file, TCSETS2, &tio) < 0) {
+ VPLOG(1) << "Failed to set custom bitrate";
+ return false;
}
- cfsetispeed(config, B38400);
- cfsetospeed(config, B38400);
- return ioctl(file, TIOCSSERIAL, &serial) >= 0;
+ return true;
#elif defined(OS_MACOSX)
speed_t speed = static_cast<speed_t>(bitrate);
cfsetispeed(config, speed);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698