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.
>  

Reply via email to