Cellular modem

Browse source code on GitHub

Overview

This sample consists of a simple application which powers on the modem, brings up the net interface, then sends a packet with pseudo random data to the endpoint test-endpoint.com, which is a publicly hosted server which runs the Python script found in the server folder. DNS is used to look up the IP of test-endpoint.com.

Notes

This sample uses the devicetree alias modem to identify the modem instance to use. The sample also presumes that the modem driver creates the only PPP network interface.

Setup

Start by setting up the devicetree with the required devicetree node:

/dts-v1/;

/ {
        aliases {
                modem = &modem;
        };
};

&usart2 {
        pinctrl-0 = <&usart2_tx_pa2 &usart2_rx_pa3 &usart2_rts_pa1 &usart2_cts_pa0>;
        pinctrl-names = "default";
        current-speed = <115200>;
        hw-flow-control;
        status = "okay";

        modem: modem {
                compatible = "quectel,bg9x";
                mdm-power-gpios = <&gpioe 2 GPIO_ACTIVE_HIGH>;
                mdm-reset-gpios = <&gpioe 3 GPIO_ACTIVE_HIGH>;
                status = "okay";
        };
};

Next, the UART API must be specified using CONFIG_UART_INTERRUPT_DRIVEN=y or CONFIG_UART_ASYNC_API=y. The driver doesn’t support UART polling.

Lastly, the APN must be configured using CONFIG_MODEM_CELLULAR_APN="".

Shell commands

The sample enables CONFIG_MODEM_CELLULAR_SHELL, which adds a modem_cellular shell command for runtime control of the cellular_modem driver’s periodic chat script:

modem_cellular pause <device>
modem_cellular resume <device>

Use modem_cellular pause to suppress the periodic CSQ/CREG poll while running a long AT operation on the command channel (firmware update, eSIM provisioning, factory test). modem_cellular resume re-enables it; the next periodic invocation fires immediately if a scheduled run was skipped while paused. Pausing while already paused, or resuming while not paused, returns -EINVAL.

Server setup

Deploy the server on a publicly accessible host, then set the CONFIG_SAMPLE_CELLULAR_MODEM_ENDPOINT_HOSTNAME variable in prj.conf to the server’s hostname.

git clone --depth=1 https://github.com/zephyrproject-rtos/zephyr.git
cd zephyr/samples/net/cellular_modem/server
python te.py