OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "device/serial/serial_io_handler_posix.h" | 5 #include "device/serial/serial_io_handler_posix.h" |
6 | 6 |
7 #include <sys/ioctl.h> | 7 #include <sys/ioctl.h> |
8 #include <termios.h> | 8 #include <termios.h> |
9 | 9 |
10 #include "base/posix/eintr_wrapper.h" | 10 #include "base/posix/eintr_wrapper.h" |
11 | 11 |
12 #if defined(OS_LINUX) | 12 #if defined(OS_LINUX) |
13 #include <linux/serial.h> | 13 #include <linux/serial.h> |
14 #if defined(OS_CHROMEOS) | 14 #if defined(OS_CHROMEOS) |
15 #include "base/bind.h" | 15 #include "base/bind.h" |
16 #include "base/sys_info.h" | 16 #include "base/sys_info.h" |
17 #include "chromeos/dbus/dbus_thread_manager.h" | 17 #include "chromeos/dbus/dbus_thread_manager.h" |
18 #include "chromeos/dbus/permission_broker_client.h" | 18 #include "chromeos/dbus/permission_broker_client.h" |
19 #endif // defined(OS_CHROMEOS) | 19 #endif // defined(OS_CHROMEOS) |
| 20 |
| 21 // The definition of struct termios2 is copied from asm-generic/termbits.h |
| 22 // because including that header directly conflicts with termios.h. |
| 23 extern "C" { |
| 24 struct termios2 { |
| 25 tcflag_t c_iflag; // input mode flags |
| 26 tcflag_t c_oflag; // output mode flags |
| 27 tcflag_t c_cflag; // control mode flags |
| 28 tcflag_t c_lflag; // local mode flags |
| 29 cc_t c_line; // line discipline |
| 30 cc_t c_cc[19]; // control characters |
| 31 speed_t c_ispeed; // input speed |
| 32 speed_t c_ospeed; // output speed |
| 33 }; |
| 34 } |
| 35 |
20 #endif // defined(OS_LINUX) | 36 #endif // defined(OS_LINUX) |
21 | 37 |
22 namespace { | 38 namespace { |
23 | 39 |
24 // Convert an integral bit rate to a nominal one. Returns |true| | 40 // Convert an integral bit rate to a nominal one. Returns |true| |
25 // if the conversion was successful and |false| otherwise. | 41 // if the conversion was successful and |false| otherwise. |
26 bool BitrateToSpeedConstant(int bitrate, speed_t* speed) { | 42 bool BitrateToSpeedConstant(int bitrate, speed_t* speed) { |
27 #define BITRATE_TO_SPEED_CASE(x) \ | 43 #define BITRATE_TO_SPEED_CASE(x) \ |
28 case x: \ | 44 case x: \ |
29 *speed = B##x; \ | 45 *speed = B##x; \ |
30 return true; | 46 return true; |
31 switch (bitrate) { | 47 switch (bitrate) { |
32 BITRATE_TO_SPEED_CASE(0) | 48 BITRATE_TO_SPEED_CASE(0) |
33 BITRATE_TO_SPEED_CASE(50) | 49 BITRATE_TO_SPEED_CASE(50) |
34 BITRATE_TO_SPEED_CASE(75) | 50 BITRATE_TO_SPEED_CASE(75) |
35 BITRATE_TO_SPEED_CASE(110) | 51 BITRATE_TO_SPEED_CASE(110) |
36 BITRATE_TO_SPEED_CASE(134) | 52 BITRATE_TO_SPEED_CASE(134) |
37 BITRATE_TO_SPEED_CASE(150) | 53 BITRATE_TO_SPEED_CASE(150) |
38 BITRATE_TO_SPEED_CASE(200) | 54 BITRATE_TO_SPEED_CASE(200) |
39 BITRATE_TO_SPEED_CASE(300) | 55 BITRATE_TO_SPEED_CASE(300) |
40 BITRATE_TO_SPEED_CASE(600) | 56 BITRATE_TO_SPEED_CASE(600) |
41 BITRATE_TO_SPEED_CASE(1200) | 57 BITRATE_TO_SPEED_CASE(1200) |
42 BITRATE_TO_SPEED_CASE(1800) | 58 BITRATE_TO_SPEED_CASE(1800) |
43 BITRATE_TO_SPEED_CASE(2400) | 59 BITRATE_TO_SPEED_CASE(2400) |
44 BITRATE_TO_SPEED_CASE(4800) | 60 BITRATE_TO_SPEED_CASE(4800) |
45 BITRATE_TO_SPEED_CASE(9600) | 61 BITRATE_TO_SPEED_CASE(9600) |
46 BITRATE_TO_SPEED_CASE(19200) | 62 BITRATE_TO_SPEED_CASE(19200) |
47 BITRATE_TO_SPEED_CASE(38400) | 63 BITRATE_TO_SPEED_CASE(38400) |
48 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 64 #if !defined(OS_MACOSX) |
49 BITRATE_TO_SPEED_CASE(57600) | 65 BITRATE_TO_SPEED_CASE(57600) |
50 BITRATE_TO_SPEED_CASE(115200) | 66 BITRATE_TO_SPEED_CASE(115200) |
51 BITRATE_TO_SPEED_CASE(230400) | 67 BITRATE_TO_SPEED_CASE(230400) |
52 BITRATE_TO_SPEED_CASE(460800) | 68 BITRATE_TO_SPEED_CASE(460800) |
53 BITRATE_TO_SPEED_CASE(576000) | 69 BITRATE_TO_SPEED_CASE(576000) |
54 BITRATE_TO_SPEED_CASE(921600) | 70 BITRATE_TO_SPEED_CASE(921600) |
55 #endif | 71 #endif |
56 default: | 72 default: |
57 return false; | 73 return false; |
58 } | 74 } |
(...skipping 17 matching lines...) Expand all Loading... |
76 SPEED_TO_BITRATE_CASE(200) | 92 SPEED_TO_BITRATE_CASE(200) |
77 SPEED_TO_BITRATE_CASE(300) | 93 SPEED_TO_BITRATE_CASE(300) |
78 SPEED_TO_BITRATE_CASE(600) | 94 SPEED_TO_BITRATE_CASE(600) |
79 SPEED_TO_BITRATE_CASE(1200) | 95 SPEED_TO_BITRATE_CASE(1200) |
80 SPEED_TO_BITRATE_CASE(1800) | 96 SPEED_TO_BITRATE_CASE(1800) |
81 SPEED_TO_BITRATE_CASE(2400) | 97 SPEED_TO_BITRATE_CASE(2400) |
82 SPEED_TO_BITRATE_CASE(4800) | 98 SPEED_TO_BITRATE_CASE(4800) |
83 SPEED_TO_BITRATE_CASE(9600) | 99 SPEED_TO_BITRATE_CASE(9600) |
84 SPEED_TO_BITRATE_CASE(19200) | 100 SPEED_TO_BITRATE_CASE(19200) |
85 SPEED_TO_BITRATE_CASE(38400) | 101 SPEED_TO_BITRATE_CASE(38400) |
86 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 102 #if !defined(OS_MACOSX) |
87 SPEED_TO_BITRATE_CASE(57600) | 103 SPEED_TO_BITRATE_CASE(57600) |
88 SPEED_TO_BITRATE_CASE(115200) | 104 SPEED_TO_BITRATE_CASE(115200) |
89 SPEED_TO_BITRATE_CASE(230400) | 105 SPEED_TO_BITRATE_CASE(230400) |
90 SPEED_TO_BITRATE_CASE(460800) | 106 SPEED_TO_BITRATE_CASE(460800) |
91 SPEED_TO_BITRATE_CASE(576000) | 107 SPEED_TO_BITRATE_CASE(576000) |
92 SPEED_TO_BITRATE_CASE(921600) | 108 SPEED_TO_BITRATE_CASE(921600) |
93 #endif | 109 #endif |
94 default: | 110 default: |
95 return false; | 111 return false; |
96 } | 112 } |
97 #undef SPEED_TO_BITRATE_CASE | 113 #undef SPEED_TO_BITRATE_CASE |
98 } | 114 } |
99 | 115 |
100 bool SetCustomBitrate(base::PlatformFile file, | 116 bool SetCustomBitrate(base::PlatformFile file, |
101 struct termios* config, | 117 struct termios* config, |
102 int bitrate) { | 118 int bitrate) { |
103 #if defined(OS_LINUX) | 119 #if defined(OS_LINUX) |
104 struct serial_struct serial; | 120 struct termios2 tio; |
105 if (ioctl(file, TIOCGSERIAL, &serial) < 0) { | 121 if (ioctl(file, TCGETS2, &tio) < 0) { |
| 122 VPLOG(1) << "Failed to get parameters to set custom bitrate"; |
106 return false; | 123 return false; |
107 } | 124 } |
108 serial.flags = (serial.flags & ~ASYNC_SPD_MASK) | ASYNC_SPD_CUST; | 125 tio.c_cflag &= ~CBAUD; |
109 serial.custom_divisor = serial.baud_base / bitrate; | 126 tio.c_cflag |= CBAUDEX; |
110 if (serial.custom_divisor < 1) { | 127 tio.c_ispeed = bitrate; |
111 serial.custom_divisor = 1; | 128 tio.c_ospeed = bitrate; |
| 129 if (ioctl(file, TCSETS2, &tio) < 0) { |
| 130 VPLOG(1) << "Failed to set custom bitrate"; |
| 131 return false; |
112 } | 132 } |
113 cfsetispeed(config, B38400); | 133 return true; |
114 cfsetospeed(config, B38400); | |
115 return ioctl(file, TIOCSSERIAL, &serial) >= 0; | |
116 #elif defined(OS_MACOSX) | 134 #elif defined(OS_MACOSX) |
117 speed_t speed = static_cast<speed_t>(bitrate); | 135 speed_t speed = static_cast<speed_t>(bitrate); |
118 cfsetispeed(config, speed); | 136 cfsetispeed(config, speed); |
119 cfsetospeed(config, speed); | 137 cfsetospeed(config, speed); |
120 return true; | 138 return true; |
121 #else | 139 #else |
122 return false; | 140 return false; |
123 #endif | 141 #endif |
124 } | 142 } |
125 | 143 |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 (config.c_cflag & CSTOPB) ? serial::STOP_BITS_TWO : serial::STOP_BITS_ONE; | 470 (config.c_cflag & CSTOPB) ? serial::STOP_BITS_TWO : serial::STOP_BITS_ONE; |
453 info->cts_flow_control = (config.c_cflag & CRTSCTS) != 0; | 471 info->cts_flow_control = (config.c_cflag & CRTSCTS) != 0; |
454 return info.Pass(); | 472 return info.Pass(); |
455 } | 473 } |
456 | 474 |
457 std::string SerialIoHandler::MaybeFixUpPortName(const std::string& port_name) { | 475 std::string SerialIoHandler::MaybeFixUpPortName(const std::string& port_name) { |
458 return port_name; | 476 return port_name; |
459 } | 477 } |
460 | 478 |
461 } // namespace device | 479 } // namespace device |
OLD | NEW |