Support for the Dell DW5825e / Fibocom FM101 (Qualcomm X12 chipset) - what am I missing?
johanngerbhoff at tutamail.com
johanngerbhoff at tutamail.com
Sun May 4 14:22:23 UTC 2025
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
<!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 <sinaro at 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/modemmanager-devel/attachments/20250504/7708eb33/attachment-0001.htm>
More information about the ModemManager-devel
mailing list