[PATCH 6/8] port-serial: new method to explicitly set flow control settings
Aleksander Morgado
aleksander at aleksander.es
Tue Apr 18 17:10:22 UTC 2017
On 25/03/17 19:32, Aleksander Morgado wrote:
> ---
> src/mm-port-serial.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> src/mm-port-serial.h | 5 +++++
> 2 files changed, 55 insertions(+)
>
This has been merged to git master.
> 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 */
>
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list