From johanngerbhoff at tutamail.com Sun May 4 14:22:23 2025 From: johanngerbhoff at tutamail.com (johanngerbhoff at tutamail.com) Date: Sun, 4 May 2025 16:22:23 +0200 (CEST) Subject: Support for the Dell DW5825e / Fibocom FM101 (Qualcomm X12 chipset) - what am I missing? Message-ID: Hi everyone, I hope this is the right place to post this request for help. If not, I apologise in advance. 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 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)?? 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 ? ? ??? ? ? ??? ? --> 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 # # 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. -------------- next part -------------- An HTML attachment was scrubbed... URL: