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'
Commands Related to the Operating Mode of the EM7455 Modem
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-wdm0with 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