On Sun, 2025-05-04 at 16:22 +0200, johanngerbh...@tutamail.com wrote: > > Hi everyone, > > I hope this is the right place to post this request for help. If not, > I apologise in advance
It definitely is. > My Dell Latitude 5550 comes with a DW5825e LTE modem which actually > is a Fibocom FM101R-GL card with a Qualcomm Snapdragon X12 chipset. > The corresponding VID/PID is 413c:8213. > The modem seems to be somewhat new / obscure as I couldn't find any > online discussions on getting it to work on Linux at all. > > I've confirmed this modem working out of the box with Dell's OEM > Ubuntu 22.04 image but not any other current Linux distribution. > I've tried to find out how Dell manages to get it to work and think > I've actually found the unlocking mechanism of action. I've re-built > the required Fibocom tools for OpenSUSE Tumbleweed but I can't get > the modem to connect. > The actual unlock and mmcli --enable command seems to succeed but it > will time out when connecting to the network. I can see some errors Does the modem actually get registered with the network, or does it completely fail to communicate with it? By "connecting" I'm not sure if you mean a data connection or just registering. > when checking the systemd log of Fibocom's fibo_helper service which > seems to be responsible for dbus communication, indicating GPIO and > bus problems: > > Mai 04 11:01:13 localhost helper[1210]: [Critical]: > fibocom_get_skuid:186: get_skuid_cmd == 0CB9 > Mai 04 11:01:13 localhost helper[1210]: [Warning]: > fibocom_hwreset_gpio_init_sub:254: /sys/class/gpio/export exists. > Mai 04 11:01:13 localhost helper[1210]: [Error]: bus_name_lost:663: > bus_name_lost !!!! > Mai 04 11:01:13 localhost helper[1210]: [Error]: > fibo_adapter_control_mbim_init:1444: Found cellular FM101-GL-00 > added! > Mai 04 11:01:13 localhost helper[1210]: [Error]: > fibo_helper_device_check:1218: variable is NULL, don't send cellular > info signal! > > My questions now are twofold: > 1: Is it somehow possible to snoop the correct sequence of AT > commands to get the DW5825e to fcc unlock via a "vanilla" > ModemManager without resorting to Fibocom's tools (as those seem to > be not quite trivial to build for current Linux distributions except > Ubuntu)? It may not even use AT commands; it might be running through an MBIM service instead. At the moment I'm not sure of any unlock procedure for the Fibcom Qualcomm-based devices other than their binary tools. I've run into some trouble with their unlock tools too :( Haven't had the time to dig into it, so thanks for trying with your setup. Hopefully somebody else knows more? Dan > I know that this has been done for the Intel XMM7560 where the AT > commands necessary have been found out, as seen > here: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/ > merge_requests/1141 > I'm not the most proficient when it comes to hardware hacking but I'm > grateful for any pointers. > Fibocom's fibo_ma tool seems to be responsible for the actual > unlocking magic, unfortunately it is closed-source. I've tried to > snoop around the binary with Ghidra to see if my untrained eye can > detect the necessary functions - unfortunately I can only see that > some SHA256 shenanigans are going on and lack the knowledge to > investigate further. > > 2: Could someone with more knowledge than me regarding modems please > check in on my build process for Fibocom's tools and the mechanism of > action and maybe point out something I've missed? I'd appreciate any > help a lot. > I'll type out my build notes below. Any steps taken after the build > process are based on Fibocom's CMake install script but adapted for > OpenSUSE file locations. I'm unsure whether I've found out the right > location for the dbus config though. > > Fibocom FM101 / Dell DW5825e OpenSUSE Build: > > ### Source: ### > https://github.com/fibocom-pc/linux_apps_opensource > > ### How it works ### > ModemManager calls fibo_ma (via the fcc unlock script corresponding > to the modem's hardware id) which performs the necessary magic for a > FCC unlock. > The closed-source fibo_ma calls fibo_helper.service which provides a > dbus interface for comms with the modem. > > fibo_flash.service is used to flash the firmware to the modem -> > needs the OEM FwFlashSrv firmware file from Dell. > fibo_config.service applies config settings from a provided > fbwwanConfig.ini to the modem. The file provided by Dell is the same > one as the one in the Fibocom Github repo. > > fibo_ma seems to check via dmidecode whether the modem and chassis > are Dell devices and refuses to fcc unlock the modem if this check > fails. > > ### Files needed from Dell Ubuntu 22.04 OEM Install ### > /opt/fibocom/fibo_flash_service/FwFlashSrv (Firmware) > /opt/fibocom/fibo_ma_service/fcc-unlock.d (ModemManager FCCUnlock > files) > --> only 413c:8213 is needed but copy the other hw ids for future use > as well > --> needs to be made available to ModemManager in OpenSuse: Should be > linked to /usr/lib64/ModemManager/fcc-unlock.d > > ### Libraries & Tools: ### > cmake > dmidecode > gcc > gcc-c++ > pkgconf-pkg-config > glib2 > glib2-devel > libxml2 > libxml2-devel > libmbim > libmbim-devel > libqmi-glib5 > libqmi-tools > libdbus-glib-1-2 > ModemManager > ModemManager-devel > systemd-devel > > libudev0-shim (OpenSuse only ships with libudev1) > --> compile from > https://archlinux.org/packages/extra/x86_64/libudev0-shim/ > --> set libdir in Makefile to lib64 > --> make install > --> create symlink to /usr/lib64/libudev.so !!!messy!!! > ---> ln -s /usr/lib64/libudev.so.0.13.9999 /usr/lib64/libudev.so > > libdbus-glib-1-2 > --> create symlink from libdbus-1.so.3 to /usr/lib64/libdbus-1.so > !!!messy!!! > ---> sudo ln -s /usr/lib64/libdbus-1.so.3 /usr/lib64/libdbus-1.so > > ### Build ### > cd to linux_apps_opensource directory > cmake -S . -B build > cmake --build build > > --> Create dbus config for fibocom helper: /usr/share/dbus- > 1/com.fibocom.helper.conf > <!DOCTYPE busconfig PUBLIC > "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" > "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> > <busconfig> > <!-- This config allows anyone to control mcdm --> > > <policy context="default"> > <allow send_destination="com.fibocom.helper"/> > </policy> > > <policy user="root"> > <allow own="com.fibocom.helper"/> > </policy> > </busconfig> > > > --> Create fibo_config service > /etc/systemd/system/fibo_config.service > [Unit] > Description=Firmware Config Service > After=ModemManager.service fibo_helper.service > > [Service] > EnvironmentFile=/lib/systemd/system/fibo_config.d/env.conf > ExecStart=/opt/fibocom/fibo_config_service/fibo_config > ExecReload=/bin/kill -HUP \$MAINPID > Restart=on-abort > Type=simple > Restart=on-abort > User=root > > [Install] > WantedBy=multi-user.target > > --> Create fibo_flash service /etc/systemd/system/fibo_flash.service > [Unit] > Description=Firmware Flash Service > After=ModemManager.service fibo_helper.service > > [Service] > EnvironmentFile=/lib/systemd/system/fibo_flash.d/env.conf > ExecStart=/opt/fibocom/fibo_flash_service/fibo_flash > ExecReload=/bin/kill -HUP \$MAINPID > Restart=on-abort > Type=simple > Restart=on-abort > User=root > > [Install] > WantedBy=multi-user.target > > --> Create fibo_helper service > /etc/systemd/system/fibo_helper.service > [Unit] > Description=Firmware Helper Service > After=ModemManager.service > > [Service] > EnvironmentFile=/lib/systemd/system/fibo_helper.d/env.conf > ExecStart=/opt/fibocom/fibo_helper_service/fibo_helperd > ExecReload=/bin/kill -HUP \$MAINPID > Restart=on-abort > Type=simple > Restart=on-abort > User=root > > [Install] > WantedBy=multi-user.target > > --> Create fibo_helper_mbim service > /etc/systemd/system/fibo_helper_mbim.service > [Unit] > Description=Firmware Helper Service > After=ModemManager.service fibo_helper.service > > [Service] > EnvironmentFile=/lib/systemd/system/fibo_helper.d/env.conf > ExecStart=/opt/fibocom/fibo_helper_service/fibo_helperm > ExecReload=/bin/kill -HUP \$MAINPID > Restart=on-abort > Type=simple > Restart=on-abort > User=root > > [Install] > WantedBy=multi-user.target > > --> Create systemd directories for environment files > sudo mkdir /lib/systemd/system/fibo_config.d/ > sudo mkdir /lib/systemd/system/fibo_flash.d/ > sudo mkdir /lib/systemd/system/fibo_helper.d/ > > --> Create environment files (as root) > echo "LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib64" > > /lib/systemd/system/fibo_config.d/env.conf > echo "LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib64" > > /lib/systemd/system/fibo_flash.d/env.conf > echo "LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib64" > > /lib/systemd/system/fibo_helper.d/env.conf > > --> Create the following udev rule: /etc/udev/rules.d/76-mm-fibocom- > linux-apps-port-types.rules > --> Without this rule, the modem is visible to ModemManageron > OpenSUSE but doesn't connect. > --> With this rule, the modem is invisible to ModemManager and still > doesn't connect. > --> Why is this rule in the Fibocom install script? It's also present > on Ubuntu 22.04 but there the modem is visible with the rule. > # do not edit this file, it will be overwritten on update > ACTION!="add|change|move|bind", > GOTO="mm_fibocom_linux_apps_port_types_end" > SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="?*", > ENV{.MM_USBIFNUM}="$attr{bInterfaceNumber}" > > ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="01a2", > ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_IGNORE}="1" > ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="01a2", > ENV{.MM_USBIFNUM}=="03", SUBSYSTEM=="tty", ENV{ID_MM_PORT_IGNORE}="1" > ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="01a2", > ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_IGNORE}="1" > ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="01a2", > ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_IGNORE}="1" > > ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8213", > ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_IGNORE}="1" > ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8215", > ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_IGNORE}="1" > > LABEL="mm_fibocom_linux_apps_port_types_end" > > > --> Create fcc unlock script for the DW5825e (413c:8213) as > /usr/share/ModemManager/fcc-unlock.available.d/413c:8213 > #!/bin/sh > > # SPDX-License-Identifier: CC0-1.0 > # 2023 Nero zhang <sin...@sinaro.es> > # > # Fibocom FM101 FCC unlock mechanism > # > > # run fcc-unlock binary > /opt/fibocom/fibo_ma_service/fibo_ma > exit $? > > --> Tell ModemManager to automatically activate available fcc unlocks > ln -sft /usr/lib64/ModemManager/fcc-unlock.d > /usr/share/ModemManager/fcc-unlock.available.d/* > > --> reload systemd to make fibocom services available > systemctl daemon-reload > > --> activate fibocom services > sudo systemctl enable fibo_helper.service > sudo systemctl enable fibo_helper_mbim.service > sudo systemctl enable fibo_flash.service > sudo systemctl enable fibo_config.service > > > --> Result: > ---> actual unlock works (when udev rule is not set) > ---> no connection > ---> errors in the logs of fibo_helper > > ### Directory structure after build ### > /opt/fibocom/ > |--> fibo_config_service > |--> fibo_flash_service > |--> fibo_helper_service > |--> fibo_ma_service > > Thank you and best, > Jo. >