[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