[PATCH] serial: allow specifying baudrate to use via udev tags
Jan Graczyk
JanG at nytec.com
Tue Mar 21 22:16:52 UTC 2017
Hello Dan,
I have tried running ModemManager with /dev/ttymxc2 port set to 57600 baud rate. It looks like as I can see from ModemManager debug logging the QUECTEL UC20 device is not recognized. I have looked into the ModemManager supported devices website https://www.freedesktop.org/wiki/Software/ModemManager/SupportedDevices/#index2h1 and there is no support for this device. I would need to create a new plugin for this device.
Best Regards,
Jan Graczyk
This email message may contain confidential and privileged information. Any unauthorized use is prohibited. If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message.
-----Original Message-----
From: ModemManager-devel [mailto:modemmanager-devel-bounces at lists.freedesktop.org] On Behalf Of Dan Williams
Sent: Tuesday, March 21, 2017 2:09 PM
To: Aleksander Morgado <aleksander at aleksander.es>
Cc: modemmanager-devel at lists.freedesktop.org
Subject: Re: [PATCH] serial: allow specifying baudrate to use via udev tags
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
_______________________________________________
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