diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2024-05-09 11:25:15 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2024-05-29 10:14:39 +0000 |
commit | 5ea26af0e48a0347d1c0e3e0f82c6880eca4b439 (patch) | |
tree | 7e24ae083ce1c810a905deb5f7ad39476c4e1a0a | |
parent | 800c2bb02a40e0b437d4b15f16fece41c33e0d25 (diff) |
rolling: new plugin
This plugin provides support for modems from Rolling Wireless. The
current approach is to re-use the AT-based and MBIM-based specific
modem implementations from the Fibocom plugin.
Based on an original implementation from:
vanillan wang <vanillanwang@163.com>
See https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/1170
-rw-r--r-- | meson.build | 1 | ||||
-rw-r--r-- | meson_options.txt | 1 | ||||
-rw-r--r-- | src/plugins/meson.build | 25 | ||||
-rw-r--r-- | src/plugins/mm-builtin-plugins.c | 6 | ||||
-rw-r--r-- | src/plugins/rolling/77-mm-rolling-port-types.rules | 57 | ||||
-rw-r--r-- | src/plugins/rolling/mm-plugin-rolling.c | 118 | ||||
-rw-r--r-- | src/plugins/tests/test-udev-rules.c | 11 |
7 files changed, 216 insertions, 3 deletions
diff --git a/meson.build b/meson.build index 0e3143a2..bc2bb2e2 100644 --- a/meson.build +++ b/meson.build @@ -351,6 +351,7 @@ plugins_options_reqs = { 'pantech': {'available': true, 'shared': []}, 'qcom-soc': {'available': enable_qmi, 'shared': []}, 'quectel': {'available': true, 'shared': []}, + 'rolling': {'available': true, 'shared': ['fibocom']}, 'samsung': {'available': true, 'shared': ['icera']}, 'sierra-legacy': {'available': true, 'shared': ['icera', 'sierra']}, 'sierra': {'available': true, 'shared': ['xmm']}, diff --git a/meson_options.txt b/meson_options.txt index ebd34f70..925b70f6 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -55,6 +55,7 @@ option('plugin_option_hso', type: 'feature', value: 'auto', description: 'enable option('plugin_pantech', type: 'feature', value: 'auto', description: 'enable pantech plugin support') option('plugin_qcom_soc', type: 'feature', value: 'auto', description: 'enable qcom soc plugin support') option('plugin_quectel', type: 'feature', value: 'auto', description: 'enable quectel plugin support') +option('plugin_rolling', type: 'feature', value: 'auto', description: 'enable rolling plugin support') option('plugin_samsung', type: 'feature', value: 'auto', description: 'enable samsung plugin support') option('plugin_sierra_legacy', type: 'feature', value: 'auto', description: 'enable sierra legacy plugin support') option('plugin_sierra', type: 'feature', value: 'auto', description: 'enable sierra plugin support') diff --git a/src/plugins/meson.build b/src/plugins/meson.build index 196dbab6..7cc6ef92 100644 --- a/src/plugins/meson.build +++ b/src/plugins/meson.build @@ -73,12 +73,15 @@ if plugins_shared['fibocom'] c_args = '-DMM_MODULE_NAME="shared-fibocom"' sources = files( + 'fibocom/mm-broadband-bearer-fibocom-ecm.c', + 'fibocom/mm-broadband-modem-fibocom.c', 'fibocom/mm-shared.c', 'fibocom/mm-shared-fibocom.c', ) if enable_mbim sources += files( + 'fibocom/mm-broadband-modem-mbim-fibocom.c', 'fibocom/mm-port-mbim-fibocom.c', ) endif @@ -383,14 +386,11 @@ if plugins_options['fibocom'] incs = plugins_incs + [xmm_inc] + [fibocom_inc] sources = files( - 'fibocom/mm-broadband-bearer-fibocom-ecm.c', - 'fibocom/mm-broadband-modem-fibocom.c', 'fibocom/mm-plugin-fibocom.c', ) if enable_mbim sources += files( 'fibocom/mm-broadband-modem-mbim-xmm-fibocom.c', - 'fibocom/mm-broadband-modem-mbim-fibocom.c', ) endif plugins += {'plugin-fibocom': { @@ -803,6 +803,25 @@ if plugins_options['quectel'] plugins_udev_rules += files('quectel/77-mm-quectel-port-types.rules') endif +# plugin: rolling +if plugins_options['rolling'] + test_udev_rules_dir_c_args = ['-DTESTUDEVRULESDIR_ROLLING="@0@"'.format(plugins_dir / 'rolling')] + plugins_test_udev_rules_dir_c_args += test_udev_rules_dir_c_args + + incs = plugins_incs + [fibocom_inc] + + sources = files( + 'rolling/mm-plugin-rolling.c', + ) + + plugins += {'plugin-rolling': { + 'plugin': true, + 'module': {'sources': sources, 'include_directories': incs, 'c_args': test_udev_rules_dir_c_args + ['-DMM_MODULE_NAME="rolling"']}, + }} + + plugins_udev_rules += files('rolling/77-mm-rolling-port-types.rules') +endif + # plugin: samsung if plugins_options['samsung'] sources = files( diff --git a/src/plugins/mm-builtin-plugins.c b/src/plugins/mm-builtin-plugins.c index 378a7cba..eee5cf92 100644 --- a/src/plugins/mm-builtin-plugins.c +++ b/src/plugins/mm-builtin-plugins.c @@ -103,6 +103,9 @@ MMPlugin *mm_plugin_create_qcom_soc (void); #if defined ENABLE_PLUGIN_QUECTEL MMPlugin *mm_plugin_create_quectel (void); #endif +#if defined ENABLE_PLUGIN_ROLLING +MMPlugin *mm_plugin_create_rolling (void); +#endif #if defined ENABLE_PLUGIN_SAMSUNG MMPlugin *mm_plugin_create_samsung (void); #endif @@ -232,6 +235,9 @@ mm_builtin_plugins_load (void) #if defined ENABLE_PLUGIN_QUECTEL PREPEND_PLUGIN (quectel); #endif +#if defined ENABLE_PLUGIN_ROLLING + PREPEND_PLUGIN (rolling); +#endif #if defined ENABLE_PLUGIN_SAMSUNG PREPEND_PLUGIN (samsung); #endif diff --git a/src/plugins/rolling/77-mm-rolling-port-types.rules b/src/plugins/rolling/77-mm-rolling-port-types.rules new file mode 100644 index 00000000..3ad2a9dc --- /dev/null +++ b/src/plugins/rolling/77-mm-rolling-port-types.rules @@ -0,0 +1,57 @@ +# do not edit this file, it will be overwritten on update +ACTION!="add|change|move|bind", GOTO="mm_rolling_port_types_end" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="33f8", GOTO="mm_rolling_port_types" +GOTO="mm_rolling_port_types_end" + +LABEL="mm_rolling_port_types" + +SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="?*", ENV{.MM_USBIFNUM}="$attr{bInterfaceNumber}" + +# Rolling RW101-GL (QMI in iface #4, ADB in iface #5) +# ttyUSB0 (if #0): QCDM port +# ttyUSB1 (if #1): AT port +# ttyUSB2 (if #2): AT port +# ttyUSB3 (if #3): GNSS data +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="0104", ENV{.MM_USBIFNUM}=="00", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_QCDM}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="0104", ENV{.MM_USBIFNUM}=="01", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="0104", ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="0104", ENV{.MM_USBIFNUM}=="03", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_GPS}="1" +# No ID_MM_FIBOCOM_FASTBOOT because there is no custom QMI modem implementation using it. + +# Rolling RW101-GL (MBIM in iface #0, 2 AT ports) +# ttyUSB0 (if #2): AT port +# ttyUSB1 (if #3): AT port +# ttyUSB2 (if #4): QCDM port +# ttyUSB3 (if #5): GNSS data +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a2", ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a2", ENV{.MM_USBIFNUM}=="03", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a2", ENV{.MM_USBIFNUM}=="04", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_QCDM}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a2", ENV{.MM_USBIFNUM}=="05", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_GPS}="1" +# Firmware interface implementation comes from the Fibocom shared utils. +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a2", ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_FIBOCOM_FASTBOOT}="1" + +# Rolling RW101-GL (MBIM in iface #0) +# ttyUSB0 (if #2): GNSS data +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a3", ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_GPS}="1" + +# Rolling RW101-GL (MBIM in iface #0, ADB in iface #4) +# ttyUSB0 (if #2): QCDM port +# ttyUSB1 (if #3): AT port +# ttyUSB2 (if #5): GNSS data +# ttyUSB3 (if #6): GNSS data +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a4", ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_QCDM}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a4", ENV{.MM_USBIFNUM}=="03", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a4", ENV{.MM_USBIFNUM}=="05", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_GPS}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a4", ENV{.MM_USBIFNUM}=="06", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_GPS}="1" +# Firmware interface implementation comes from the Fibocom shared utils. +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="01a4", ENV{.MM_USBIFNUM}=="03", SUBSYSTEM=="tty", ENV{ID_MM_FIBOCOM_FASTBOOT}="1" + +# Rolling RW135 (MBIM in iface #0, ADB in iface #5) +# ttyUSB0 (if #2): QCDM port. +# ttyUSB1 (if #3): AT port +# ttyUSB2 (if #4): GNSS data +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="0115", ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_QCDM}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="0115", ENV{.MM_USBIFNUM}=="03", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1" +ATTRS{idVendor}=="33f8", ATTRS{idProduct}=="0115", ENV{.MM_USBIFNUM}=="04", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_GPS}="1" + +LABEL="mm_rolling_port_types_end" diff --git a/src/plugins/rolling/mm-plugin-rolling.c b/src/plugins/rolling/mm-plugin-rolling.c new file mode 100644 index 00000000..fa70c5c2 --- /dev/null +++ b/src/plugins/rolling/mm-plugin-rolling.c @@ -0,0 +1,118 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details: + * + * Copyright (C) 2024 Rolling Wireless S.a.r.l. + * Copyright (C) 2024 Google, Inc. + */ + +#include <stdlib.h> +#include <gmodule.h> + +#define _LIBMM_INSIDE_MM +#include <libmm-glib.h> + +#include "mm-log-object.h" +#include "mm-plugin-common.h" +#include "mm-broadband-modem.h" + +/* From the Fibocom shared utils */ +#include "mm-broadband-modem-fibocom.h" +#if defined WITH_MBIM +#include "mm-broadband-modem-mbim-fibocom.h" +#endif + +#if defined WITH_QMI +#include "mm-broadband-modem-qmi.h" +#endif + +#define MM_TYPE_PLUGIN_ROLLING mm_plugin_rolling_get_type () +MM_DEFINE_PLUGIN (ROLLING, rolling, Rolling) + +/*****************************************************************************/ + +static MMBaseModem * +create_modem (MMPlugin *self, + const gchar *uid, + const gchar *physdev, + const gchar **drivers, + guint16 vendor, + guint16 product, + guint16 subsystem_vendor, + GList *probes, + GError **error) +{ +#if defined WITH_MBIM + if (mm_port_probe_list_has_mbim_port (probes)) { + /* For the MBIM-based modem we fully rely on the Fibocom implementation */ + mm_obj_dbg (self, "MBIM-powered Rolling modem found..."); + return MM_BASE_MODEM (mm_broadband_modem_mbim_fibocom_new (uid, + physdev, + drivers, + mm_plugin_get_name (self), + vendor, + product)); + } +#endif + +#if defined WITH_QMI + if (mm_port_probe_list_has_qmi_port (probes)) { + mm_obj_dbg (self, "QMI-powered Rolling modem found..."); + return MM_BASE_MODEM (mm_broadband_modem_qmi_new (uid, + physdev, + drivers, + mm_plugin_get_name (self), + vendor, + product)); + } +#endif + + /* For the generic AT-based modem we fully rely on the Fibocom implementation */ + mm_obj_dbg (self, "Rolling modem found..."); + return MM_BASE_MODEM (mm_broadband_modem_fibocom_new (uid, + physdev, + drivers, + mm_plugin_get_name (self), + vendor, + product)); +} + +/*****************************************************************************/ + +MM_PLUGIN_NAMED_CREATOR_SCOPE MMPlugin * +mm_plugin_create_rolling (void) +{ + static const gchar *subsystems[] = { "tty", "net", "usbmisc", NULL }; + static const guint16 vendor_ids[] = { 0x33f8, 0 }; + + return MM_PLUGIN ( + g_object_new (MM_TYPE_PLUGIN_ROLLING, + MM_PLUGIN_NAME, MM_MODULE_NAME, + MM_PLUGIN_ALLOWED_SUBSYSTEMS, subsystems, + MM_PLUGIN_ALLOWED_VENDOR_IDS, vendor_ids, + MM_PLUGIN_ALLOWED_AT, TRUE, + MM_PLUGIN_ALLOWED_MBIM, TRUE, + MM_PLUGIN_ALLOWED_QMI, TRUE, + NULL)); +} + +static void +mm_plugin_rolling_init (MMPluginRolling *self) +{ +} + +static void +mm_plugin_rolling_class_init (MMPluginRollingClass *klass) +{ + MMPluginClass *plugin_class = MM_PLUGIN_CLASS (klass); + + plugin_class->create_modem = create_modem; +} diff --git a/src/plugins/tests/test-udev-rules.c b/src/plugins/tests/test-udev-rules.c index 5df65872..3f7be0ee 100644 --- a/src/plugins/tests/test-udev-rules.c +++ b/src/plugins/tests/test-udev-rules.c @@ -192,6 +192,14 @@ test_linktop (void) } #endif +#if defined ENABLE_PLUGIN_ROLLING +static void +test_rolling (void) +{ + common_test (TESTUDEVRULESDIR_ROLLING); +} +#endif + /************************************************************/ int main (int argc, char **argv) @@ -253,6 +261,9 @@ int main (int argc, char **argv) #if defined ENABLE_PLUGIN_LINKTOP g_test_add_func ("/MM/test-udev-rules/linktop", test_linktop); #endif +#if defined ENABLE_PLUGIN_ROLLING + g_test_add_func ("/MM/test-udev-rules/rolling", test_rolling); +#endif return g_test_run (); } |