[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