[PATCH 6/8] port-serial: new method to explicitly set flow control settings
Aleksander Morgado
aleksander at aleksander.es
Sat Mar 25 18:32:15 UTC 2017
---
src/mm-port-serial.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/mm-port-serial.h | 5 +++++
2 files changed, 55 insertions(+)
diff --git a/src/mm-port-serial.c b/src/mm-port-serial.c
index f2b97a02..e55f9062 100644
--- a/src/mm-port-serial.c
+++ b/src/mm-port-serial.c
@@ -1778,6 +1778,56 @@ mm_port_serial_flash (MMPortSerial *self,
/*****************************************************************************/
+gboolean
+mm_port_serial_set_flow_control (MMPortSerial *self,
+ MMFlowControl flow_control,
+ GError **error)
+{
+ struct termios options;
+ gboolean had_xon_xoff;
+ gboolean had_rts_cts;
+
+ /* retrieve current settings */
+ memset (&options, 0, sizeof (struct termios));
+ if (tcgetattr (self->priv->fd, &options) != 0) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "couldn't get serial port attributes: %s", g_strerror (errno));
+ return FALSE;
+ }
+
+ /* clear all flow control flags */
+
+ had_xon_xoff = !!(options.c_iflag & (IXON | IXOFF));
+ options.c_iflag &= ~(IXON | IXOFF | IXANY);
+
+ had_rts_cts = !!(options.c_cflag & (CRTSCTS));
+ options.c_cflag &= ~(CRTSCTS);
+
+ /* setup the requested flags */
+ switch (flow_control) {
+ case MM_FLOW_CONTROL_XON_XOFF:
+ mm_dbg ("(%s): enabling XON/XOFF flow control", mm_port_get_device (MM_PORT (self)));
+ options.c_iflag |= (IXON | IXOFF | IXANY);
+ break;
+ case MM_FLOW_CONTROL_RTS_CTS:
+ mm_dbg ("(%s): enabling RTS/CTS flow control", mm_port_get_device (MM_PORT (self)));
+ options.c_cflag |= (CRTSCTS);
+ break;
+ case MM_FLOW_CONTROL_NONE:
+ if (had_xon_xoff)
+ mm_dbg ("(%s): disabling XON/XOFF flow control", mm_port_get_device (MM_PORT (self)));
+ if (had_rts_cts)
+ mm_dbg ("(%s): disabling RTS/CTS flow control", mm_port_get_device (MM_PORT (self)));
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ return internal_tcsetattr (self, self->priv->fd, &options, error);
+}
+
+/*****************************************************************************/
+
MMPortSerial *
mm_port_serial_new (const char *name, MMPortType ptype)
{
diff --git a/src/mm-port-serial.h b/src/mm-port-serial.h
index 708e3912..223b9ce1 100644
--- a/src/mm-port-serial.h
+++ b/src/mm-port-serial.h
@@ -21,6 +21,7 @@
#include <glib-object.h>
#include <gio/gio.h>
+#include "mm-modem-helpers.h"
#include "mm-port.h"
#define MM_TYPE_PORT_SERIAL (mm_port_serial_get_type ())
@@ -150,4 +151,8 @@ GByteArray *mm_port_serial_command_finish (MMPortSerial *self,
GAsyncResult *res,
GError **error);
+gboolean mm_port_serial_set_flow_control (MMPortSerial *self,
+ MMFlowControl flow_control,
+ GError **error);
+
#endif /* MM_PORT_SERIAL_H */
--
2.12.0
More information about the ModemManager-devel
mailing list