Skip to content

M.2 Modem

The RB400 Advance has one M.2 3042 key B socket for a modem with nano-SIM support. This single M.2 socket can be populated either with a USB-based modem or with a PCIe-based module; only one M.2 device can be installed at a time.

Important Safety Notice – M.2 Slot Usage

The M.2 slot on Pigeon computers does not support hot-plug or hot-swap functionality.
Connecting or disconnecting an M.2 module while the system is powered on may result in:

  • permanent damage to the M.2 device or the system board,
  • electrical hazards to the user,
  • system instability or malfunction.

Always power off and fully disconnect the system before installing or removing M.2 modules.

This limitation stems from the M.2 standard itself, which lacks support for hot-plug detection and controlled power sequencing. The connector is intended for fixed, cold-insertion configurations only.

M.2 control signals

The M.2 power supply is controlled via dedicated GPIO signals, as listed in Table 1.
The default state of the M.2 power control signal is disabled (logic low).

Table 1. M.2 control signals

GPIO Description Default
GPIO28 M.2 POWER:

1 – ON,
0 – OFF
OFF
GPIO26 M.2 MODEM RESET:

1 – Active,
0 – Inactive
Inactive

M.2 power on:

$ gpioset -t 0 -c gpiochip0 28=1

M.2 power off:

$ gpioset -t 0 -c gpiochip0 28=0

M.2 modem reset active:

$ gpioset -t 0 -c gpiochip0 26=1

M.2 modem reset inactive:

$ gpioset -t 0 -c gpiochip0 26=0

Enable M.2 Power at Boot

If you want the M.2 connector power to be enabled automatically at system startup, modify the following line in the file:

/boot/firmware/config.txt

Change:

gpio=28=op,pd,dl

to:

gpio=28=op,pd,dh

This configuration sets GPIO 28 to output, pull-down, and drives it high at boot, enabling power on the M.2 connector immediately after startup.

Using M.2 Modems under Linux

Linux supports many M.2 modems, so usually no additional drivers are needed. M.2 modems typically provide a few serial ports (appearing as /dev/ttyUSBx or /dev/ttyACMx) for communicating with the modem via AT commands. The MODEM LED (blue) indicates the state of the modem. Modem control signals are presented in Table 1.

The Sierra Wireless EM7455 module will be used to demonstrate communication with the modem. To check if the modem is properly connected, use the command:

$ lsusb 
Bus 001 Device 007: ID 1199:9079 Sierra Wireless, Inc. EM7455 

Example AT Commands

Accessing the modem with picocom:

$ sudo apt-get install -y picocom
$ picocom -b 115200 /dev/ttyUSB6

ate1
OK

at+gmi
Sierra Wireless, Incorporated

OK
at+gmm
EM7455

OK
at!entercnd="A710"
OK
at!custom="UIM2ENABLE",1
OK
at!custom?
!CUSTOM:
GPSENABLE 0x01
GPSSEL 0x01
IPV6ENABLE 0x01
UIM2ENABLE 0x01
SIMLPM 0x01
USBSERIALENABLE 0x01
FASTENUMEN 0x01
SINGLEAPNSWITCH 0x01

OK
at!uims=0
OK
at!uims?
!UIMS: 0

OK
at+cpin?
+CPIN: READY

OK
at!uims=1
OK
at!uims?
!UIMS: 1

OK
at+cpin?
+CPIN: READY

OK

To exit, use Ctrl-a, Ctrl-x.

NetworkManager

NetworkManager is a system network service that manages your network devices and connections, attempting to maintain active network connectivity when available. The goal of NetworkManager is to make networking configuration and setup as painless and automatic as possible.

$ sudo apt-get install network-manager
...
$ reboot
...
$ systemctl status NetworkManager
...
$ sudo mmcli --scan-modems
successfully requested to scan devices
$ mmcli --list-modems
/org/freedesktop/ModemManager1/Modem/0 [Sierra Wireless, Incorporated] Sierra Wireless EM7455 Qualcomm Snapdragon X7 LTE-A
$ mmcli --modem=0
  ----------------------------------
  General  |                   path: /org/freedesktop/ModemManager1/Modem/0
           |              device id: d6534e1d1678756439d72fa4a718d174e938795b
  ----------------------------------
  Hardware |           manufacturer: Sierra Wireless, Incorporated
           |                  model: EM7455
           |      firmware revision: SWI9X30C_02.33.03.00 r8209 CARMD-EV-FRMWR2 2019/08/28 20:59:30
           |         carrier config: default
           |           h/w revision: 1.0
           |              supported: gsm-umts, lte
           |                current: gsm-umts, lte
           |           equipment id: 014582003243871
  ----------------------------------
  System   |                 device: /sys/devices/platform/scb/fe9c0000.xhci/usb1/1-1/1-1.2
           |                drivers: qmi_wwan, qcserial
           |                 plugin: sierra
           |           primary port: cdc-wdm0
           |                  ports: cdc-wdm0 (qmi), ttyUSB4 (qcdm), ttyUSB6 (at), wwan0 (net)
  ----------------------------------
  Status   |                   lock: sim-pin2
           |         unlock retries: sim-pin (3), sim-puk (10), sim-pin2 (3), sim-puk2 (10)
           |                  state: connected
           |            power state: on
           |            access tech: lte
           |         signal quality: 52% (recent)
  ----------------------------------
  Modes    |              supported: allowed: 3g; preferred: none
           |                         allowed: 4g; preferred: none
           |                         allowed: 3g, 4g; preferred: 4g
           |                         allowed: 3g, 4g; preferred: 3g
           |                current: allowed: 3g, 4g; preferred: 4g
  ----------------------------------
  Bands    |              supported: utran-1, utran-3, utran-4, utran-5, utran-8, utran-2,
           |                         eutran-1, eutran-2, eutran-3, eutran-4, eutran-5, eutran-7, eutran-8,
           |                         eutran-12, eutran-13, eutran-20, eutran-25, eutran-26, eutran-41
           |                current: utran-1, utran-3, utran-4, utran-5, utran-8, utran-2,
           |                         eutran-1, eutran-2, eutran-3, eutran-4, eutran-5, eutran-7, eutran-8,
           |                         eutran-12, eutran-13, eutran-20, eutran-25, eutran-26, eutran-41
  ----------------------------------
  IP       |              supported: ipv4, ipv6, ipv4v6
  ----------------------------------
  3GPP     |                   imei: *************
           |          enabled locks: fixed-dialing
           |            operator id: 26006
           |          operator name: Play
           |           registration: home
           |   packet service state: attached
           |                    pco: 0: (complete) '27078000000300F000'

  ----------------------------------
  3GPP EPS |   ue mode of operation: csps-2
           |    initial bearer path: /org/freedesktop/ModemManager1/Bearer/0
           |     initial bearer apn: internet
           | initial bearer ip type: ipv4v6
  ----------------------------------
  SIM      |       primary sim path: /org/freedesktop/ModemManager1/SIM/0
           |         sim slot paths: slot 1: /org/freedesktop/ModemManager1/SIM/0 (active)
           |                         slot 2: none
  ----------------------------------
  Bearer   |                  paths: /org/freedesktop/ModemManager1/Bearer/1

3GPP networks scan

$ sudo mmcli -m 0 --3gpp-scan --timeout=300
  ---------------------
  3GPP scan | networks: 26003 - Play (Orange (lte, available)
            |           26003 - Play (Orange (umts, available)
            |           26001 - Plus (lte, available)
            |           26001 - Plus (umts, available)
            |           26002 - Play (T-Mobile (lte, available)
            |           26006 - Play (lte, current)

Checking SIM Card Information

You can retrieve SIM card details and configure which SIM slot is active using mmcli.

View SIM card information

To display information about the currently active SIM card:

$ mmcli -i 0

Managing SMS Messages

Creating a new SMS message and sending it

$ sudo mmcli -m 0 --messaging-create-sms="text='Pigeon send SMS test',number='+48*********'"
Successfully created new SMS: /org/freedesktop/ModemManager1/SMS/0
$ sudo mmcli -s 0 --send
successfully sent the SMS
$ mmcli -s 0
  -------------------------------
  General    |              path: /org/freedesktop/ModemManager1/SMS/0
  -------------------------------
  Content    |            number: +48*********
             |              text: Pigeon send SMS test
  -------------------------------
  Properties |          pdu type: submit
             |             state: sent
             |   delivery report: not requested
             | message reference: 1

Receiving SMS

$ mmcli -m 0 --messaging-list-sms
    /org/freedesktop/ModemManager1/SMS/2 (received)
    /org/freedesktop/ModemManager1/SMS/1 (received)
    /org/freedesktop/ModemManager1/SMS/0 (sent)


$ mmcli -s 2
  -----------------------
  General    |      path: /org/freedesktop/ModemManager1/SMS/2
  -----------------------
  Content    |    number: +48**********
             |      text: OK
  -----------------------
  Properties |  pdu type: deliver
             |     state: received
             |   storage: sm
             |      smsc: +48***********
             | timestamp: 2025-06-04T11:12:53+02

Deleting SMS

$ sudo mmcli -m 0 --messaging-delete-sms=/org/freedesktop/ModemManager1/SMS/2
successfully deleted SMS from modem

Connecting to the Internet via Modem

The following steps describe how to manually establish a cellular connection using a modem.

Configure and connect the modem

$ sudo mmcli -m 0 --simple-connect="apn=internet"
$ mmcli -b 0

This command connects the modem using the specified APN. The correct APN value depends on your mobile network operator and must be configured accordingly.

mmcli -b 0 will show the bearer status, including assigned IP, gateway, and DNS.

Assign IP address and bring up the interface

$ sudo ip addr add <IP>/24 dev wwan0
$ sudo ip link set wwan0 up

Replace the IP address and subnet mask with those received from the modem (mmcli -b 0 output).

Set the default route

$ sudo ip route add default via <GATEWAY_IP> dev wwan0

Replace the gateway IP with the one from mmcli -b 0.

Test the connection

$ ping -I wwan0 8.8.8.8
$ ping -I wwan0 google.com

If DNS is not working

Manually edit the resolver configuration:

$ sudo nano /etc/resolv.conf
And add the DNS servers shown in the mmcli -b 0 output:

nameserver <DNS_IP_1>
nameserver <DNS_IP_2>

Checking and Configuring Modem Access Technology

Display supported modes

$ mmcli -m 0 --output-keyvalue | grep modes
modem.generic.supported-modes.value[1]          : allowed: 2g; preferred: none
modem.generic.supported-modes.value[2]          : allowed: 3g; preferred: none
modem.generic.supported-modes.value[3]          : allowed: 4g; preferred: none
modem.generic.supported-modes.value[4]          : allowed: 2g, 3g; preferred: 3g
modem.generic.supported-modes.value[5]          : allowed: 2g, 3g; preferred: 2g
modem.generic.supported-modes.value[6]          : allowed: 2g, 4g; preferred: 4g
modem.generic.supported-modes.value[7]          : allowed: 2g, 4g; preferred: 2g
modem.generic.supported-modes.value[8]          : allowed: 3g, 4g; preferred: 4g
modem.generic.supported-modes.value[9]          : allowed: 3g, 4g; preferred: 3g
modem.generic.supported-modes.value[10]         : allowed: 2g, 3g, 4g; preferred: 4g
modem.generic.supported-modes.value[11]         : allowed: 2g, 3g, 4g; preferred: 3g
modem.generic.supported-modes.value[12]         : allowed: 2g, 3g, 4g; preferred: 2g
modem.generic.current-modes                     : allowed: 4g; preferred: none

Display access technologies

$ mmcli -m 0 --output-keyvalue | grep access-technologies.value
modem.generic.access-technologies.value[1]: lte

Set the modem to use only LTE

$ sudo mmcli -m 0 --set-allowed-modes='4g'
successfully set current modes in the modem

Connecting using MBIM

For details on how to use modems like the EM7455 using MBIM, see the link.

Example commands:

$ sudo apt install libmbim-utils
...
$ service NetworkManager stop
$ mbimcli -d /dev/cdc-wdm0 -p --query-device-caps
[/dev/cdc-wdm0] Device capabilities retrieved:
Device type: 'remote'
Cellular class: 'gsm'
Voice class: 'no-voice'
SIM class: 'removable'
Data class: 'umts, hsdpa, hsupa, lte'
SMS caps: 'pdu-receive, pdu-send'
Ctrl caps: 'reg-manual'
Max sessions: '8'
Custom data class: 'unknown'
Device ID: '015105000453498'
Firmware info: 'SWI9X30C_02.20.03.00'
Hardware info: 'EM7455'

To configure the Sierra Wireless EM7455 modem to operate in QMI mode, follow the steps below.

Install Required Tools

Install the libqmi-utils package, which provides the qmicli command-line utility:

$ sudo apt install -y libqmi-utils

Stop ModemManager (if running)

If ModemManager is active, it may interfere with direct modem access. Stop it temporarily:

$ sudo systemctl stop ModemManager

Configure the USB Composition

If the modem is currently configured for a different USB composition (e.g., MBIM only), switch it to one that includes QMI support. For EM7455, USB composition 6 enables QMI:

$ sudo qmicli -d /dev/cdc-wdm0 --dms-swi-set-usb-composition=6
$ sudo qmicli -d /dev/cdc-wdm0 --dms-set-operating-mode=offline
$ sudo qmicli -d /dev/cdc-wdm0 --dms-set-operating-mode=reset

After the reset, you can verify the currently active and available USB compositions:

$ sudo qmicli -d /dev/cdc-wdm0 --dms-swi-get-usb-composition

Example output:

[/dev/cdc-wdm0] Successfully retrieved USB compositions:
        [*] USB composition 6: DM, NMEA, AT, QMI
            USB composition 8: DM, NMEA, AT, MBIM
            USB composition 9: MBIM
The asterisk [*] indicates the currently active composition.

FCC Unlock (Required for Some Modems)

Some WWAN modems include an FCC lock that blocks network access until explicitly unlocked. ModemManager supports the unlock process, but it must be enabled manually.

To unlock the modem and enable normal radio operation, execute:

$ sudo qmicli -d /dev/cdc-wdm0 --dms-set-fcc-authentication

Note: This unlock must be repeated after every modem power cycle.

Additionally, to enable automatic FCC unlocking via ModemManager, create symbolic links for the unlock profiles:

$ sudo ln -sft /etc/ModemManager/fcc-unlock.d /usr/share/ModemManager/fcc-unlock.available.d/*

This command links all available FCC unlock scripts to the directory used by ModemManager at startup, allowing it to perform the unlock procedure automatically.

For detailed technical information, refer to the official ModemManager FCC unlock documentation.

Notes:

  • Replace /dev/cdc-wdm0 with the correct device path if your system uses a different one,
  • After changing the USB composition, the modem might re-enumerate. You may need to reconnect the USB device or wait for the new interface to appear,
  • You can re-enable ModemManager after the configuration if you intend to use it for further management:
    $ sudo systemctl start ModemManager