[PATCH] serial: allow specifying baudrate to use via udev tags

Dan Williams dcbw at redhat.com
Tue Mar 21 21:09:10 UTC 2017


On Sat, 2017-03-11 at 13:15 +0100, Aleksander Morgado wrote:
> A new 'ID_MM_TTY_BAUDRATE' per-port udev tag is introduced, which
> allows specifying the baudrate that will be used when opening a
> specific serial port.
> 
> E.g.:
> 
>     ACTION!="add|change|move", GOTO="mm_my_modem_end"
>     DEVPATH=="/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1.3/*",
> ENV{ID_MM_TTY_BAUDRATE}="115200"
>     LABEL="mm_my_modem_end"
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=100158

LGTM.

Dan

> ---
> 
> Hey,
> 
> How about this patch? It really is a nice thing to have when
> integrating non-USB RS232 modems, as we avoid requiring to stick to
> 57600bps when the device can work perfectly with a much higher
> baudrate.
> 
> ---
>  src/mm-base-modem.c  |   6 +++
>  src/mm-port-probe.c  |  10 +++++
>  src/mm-port-serial.c | 118 ++++++++++-------------------------------
> ----------
>  3 files changed, 39 insertions(+), 95 deletions(-)
> 
> diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c
> index 50717471..430ce59d 100644
> --- a/src/mm-base-modem.c
> +++ b/src/mm-base-modem.c
> @@ -219,6 +219,12 @@ mm_base_modem_grab_port
> (MMBaseModem         *self,
>                            "timed-out",
>                            G_CALLBACK (serial_port_timed_out_cb),
>                            self);
> +
> +        /* For serial ports, optionally use a specific baudrate */
> +        if (mm_kernel_device_has_property (kernel_device,
> "ID_MM_TTY_BAUDRATE"))
> +            g_object_set (port,
> +                          MM_PORT_SERIAL_BAUD,
> mm_kernel_device_get_property_as_int (kernel_device,
> "ID_MM_TTY_BAUDRATE"),
> +                          NULL);
>      }
>      /* Net ports... */
>      else if (g_str_equal (subsys, "net")) {
> diff --git a/src/mm-port-probe.c b/src/mm-port-probe.c
> index f5dc90d2..c6c5897f 100644
> --- a/src/mm-port-probe.c
> +++ b/src/mm-port-probe.c
> @@ -712,6 +712,11 @@ serial_probe_qcdm (MMPortProbe *self)
>          return G_SOURCE_REMOVE;
>      }
> 
> +    if (mm_kernel_device_has_property (self->priv->port,
> "ID_MM_TTY_BAUDRATE"))
> +        g_object_set (ctx->serial,
> +                      MM_PORT_SERIAL_BAUD,
> mm_kernel_device_get_property_as_int (self->priv->port,
> "ID_MM_TTY_BAUDRATE"),
> +                      NULL);
> +
>      /* Try to open the port */
>      if (!mm_port_serial_open (ctx->serial, &error)) {
>          port_probe_task_return_error (self,
> @@ -1220,6 +1225,11 @@ serial_open_at (MMPortProbe *self)
>                        MM_PORT_SERIAL_AT_SEND_LF,     ctx-
> >at_send_lf,
>                        NULL);
> 
> +        if (mm_kernel_device_has_property (self->priv->port,
> "ID_MM_TTY_BAUDRATE"))
> +            g_object_set (ctx->serial,
> +                          MM_PORT_SERIAL_BAUD,
> mm_kernel_device_get_property_as_int (self->priv->port,
> "ID_MM_TTY_BAUDRATE"),
> +                          NULL);
> +
>          parser = mm_serial_parser_v1_new ();
>          mm_serial_parser_v1_add_filter (parser,
>                                          serial_parser_filter_cb,
> diff --git a/src/mm-port-serial.c b/src/mm-port-serial.c
> index 470de031..2b6b92d3 100644
> --- a/src/mm-port-serial.c
> +++ b/src/mm-port-serial.c
> @@ -210,95 +210,13 @@ mm_port_serial_command (MMPortSerial *self,
> 
>  /*******************************************************************
> **********/
> 
> -#if 0
> -static const char *
> -baud_to_string (int baud)
> -{
> -    const char *speed = NULL;
> -
> -    switch (baud) {
> -    case B0:
> -        speed = "0";
> -        break;
> -    case B50:
> -        speed = "50";
> -        break;
> -    case B75:
> -        speed = "75";
> -        break;
> -    case B110:
> -        speed = "110";
> -        break;
> -    case B150:
> -        speed = "150";
> -        break;
> -    case B300:
> -        speed = "300";
> -        break;
> -    case B600:
> -        speed = "600";
> -        break;
> -    case B1200:
> -        speed = "1200";
> -        break;
> -    case B2400:
> -        speed = "2400";
> -        break;
> -    case B4800:
> -        speed = "4800";
> -        break;
> -    case B9600:
> -        speed = "9600";
> -        break;
> -    case B19200:
> -        speed = "19200";
> -        break;
> -    case B38400:
> -        speed = "38400";
> -        break;
> -    case B57600:
> -        speed = "57600";
> -        break;
> -    case B115200:
> -        speed = "115200";
> -        break;
> -    case B460800:
> -        speed = "460800";
> -        break;
> -    default:
> -        break;
> -    }
> -
> -    return speed;
> -}
> -
> -void
> -mm_port_serial_print_config (MMPortSerial *port,
> -                             const char *detail)
> -{
> -    struct termios stbuf;
> -    int err;
> -
> -    err = tcgetattr (self->priv->fd, &stbuf);
> -    if (err) {
> -        mm_warn ("*** %s (%s): (%s) tcgetattr() error %d",
> -                 __func__, detail, mm_port_get_device (MM_PORT
> (port)), errno);
> -        return;
> -    }
> -
> -    mm_info ("(%s): (%s) baud rate: %d (%s)",
> -             detail, mm_port_get_device (MM_PORT (port)),
> -             stbuf.c_cflag & CBAUD,
> -             baud_to_string (stbuf.c_cflag & CBAUD));
> -}
> -#endif
> -
> -static int
> -parse_baudrate (guint i)
> +static gboolean
> +parse_baudrate (guint  baudrate_num,
> +                guint *out_baudrate_speed)
>  {
> -    int speed;
> +    guint speed;
> 
> -    switch (i) {
> +    switch (baudrate_num) {
>      case 0:
>          speed = B0;
>          break;
> @@ -348,11 +266,12 @@ parse_baudrate (guint i)
>          speed = B460800;
>          break;
>      default:
> -        mm_warn ("Invalid baudrate '%d'", i);
> -        speed = B9600;
> +        return FALSE;
>      }
> 
> -    return speed;
> +    if (out_baudrate_speed)
> +        *out_baudrate_speed = speed;
> +    return TRUE;
>  }
> 
>  static int
> @@ -431,16 +350,25 @@ static gboolean
>  real_config_fd (MMPortSerial *self, int fd, GError **error)
>  {
>      struct termios stbuf, other;
> -    int speed;
> -    int bits;
> -    int parity;
> -    int stopbits;
> +    guint speed;
> +    gint bits;
> +    gint parity;
> +    gint stopbits;
> 
>      /* No setup if not a tty */
>      if (mm_port_get_subsys (MM_PORT (self)) != MM_PORT_SUBSYS_TTY)
>          return TRUE;
> 
> -    speed = parse_baudrate (self->priv->baud);
> +    mm_dbg ("(%s): setting up baudrate: %u",
> +            mm_port_get_device (MM_PORT (self)),
> +            self->priv->baud);
> +    if (!parse_baudrate (self->priv->baud, &speed) || speed == B0) {
> +        mm_warn ("(%s): baudrate invalid: %u; defaulting to 57600",
> +                 mm_port_get_device (MM_PORT (self)),
> +                 self->priv->baud);
> +        speed = B57600;
> +    }
> +
>      bits = parse_bits (self->priv->bits);
>      parity = parse_parity (self->priv->parity);
>      stopbits = parse_stopbits (self->priv->stopbits);
> --
> 2.12.0
> _______________________________________________
> ModemManager-devel mailing list
> ModemManager-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


More information about the ModemManager-devel mailing list