Zephyr modem驱动概览

Creative Commons
本作品采用知识共享署名

本文简要说明modem驱动的框架结构。

Zephyr提供的GSM modem驱动让Zephyr可以通过GSM moden设备连接入移动运营商的蜂窝网,通过GPRS进行上网。Zephyr支持通过PPP和AT与GSM Modem通信。Modem驱动中的AT框架也可以用于其它AT通信设备的驱动。
本文涉及网络offload概念请参考Zephyr网络传输Offloading–概览

框架结构

下图展示了Modem中各个文件模块之间的关系.

两条红线中间的这一层是moden driver的内容,moden driver使用uart driver和gpio driver和GSM modem设备通信。应用可以通过ppp和offload socket/net使用GSM modem。

CONTEXT和RECEIVER

目前GSM moden对对不同的设备使用两种不同的方式支持通信,其中CONTEXT目前还是实验性的功能。二者的主要差别是在AT的处理上。

RECEIVER

modem_receiver对uart驱动进行封装,不提供任何AT的处理。GSM modem的设备驱动从modem_receiver拿到的是uart的raw data,AT指令的解析需要驱动自己处理,另外AT指令的处理没有固定模式,由驱动代码自己规定。
GSM modem的设备驱动直接通过gpio驱动控制设备。
hl7800和wncm14a2a两种设备使用RECEIVER方式。这两种设备驱动都是以net offload的方式集成进Zephyr的网络子系统内。
当配置选择这两种驱动时会默认开启MODEM_RECEIVER,例如HL7800

1
2
3
4
5
6
7
8
menuconfig MODEM_HL7800
bool "Enable Sierra Wireless HL7800 modem driver"
select MODEM_RECEIVER
select NET_OFFLOAD
imply GPIO
help
Choose this setting to enable
Sierra Wireless HL7800 LTE-M/NB-IoT modem driver.

CONTEXT

CONTEXT的方式主要由下面几部分组成
是modem_iface_uart和modem_pin对uart/gpio驱动进行封装,提供uart raw data和统一的控制接口。
modem_cmd_handler是核心内容,提供了AT命令的处理框架,用户按照固定的模式注册AT指令和处理函数,当modem_cmd_handler从modem_iface_uart收到数据时会自动解析匹配并调用处理函数。modem_cmd_handler还提供发送AT指令的API,同时可以指定发送AT指令响应的函数。
Moden驱动内部提供的CONTEXT方式的GSM modem设备驱动有以socket offload的方式集成进Zephyr的网络子系统内,因此有一个modem_socket提供socket的管理。
modem_context 是一个管理器,将modem_iface_uart/modem_pin/modem_cmd_handler/modem_socket以及用户和网络数据组织在一起进行管理。
gsm_ppp是以ppp的方式集成进Zephyr的网络子系统,quectel-bg9x和ublox-sara-r4是以socket offload的方式集成进Zephyr的网络子系统。当配置这三种驱动时会默认开启MODEM_CONTEXT和相关模块配置,例如ublox-sara-r4

1
2
3
4
5
6
7
8
9
10
11
12
config MODEM_UBLOX_SARA
bool "Enable u-blox SARA modem driver"
select MODEM_CONTEXT
select MODEM_CMD_HANDLER
select MODEM_IFACE_UART
select MODEM_SOCKET
select NET_OFFLOAD
select NET_SOCKETS_OFFLOAD
imply GPIO
help
Choose this setting to enable u-blox SARA-R4 LTE-CatM1/NB-IoT modem
driver.

AT Driver

modem_cmd_handler提供了一个非常好的AT处理框架,凡是使用AT通信的设备都可以使用该框架来完成设备驱动,例如wifi/esp就是使用该框架来完成的,kconfig.esp中可以看到

1
2
3
4
5
6
7
8
menuconfig WIFI_ESP
bool "Espressif ESP8266 and ESP32 support"
select MODEM
select MODEM_CONTEXT
select MODEM_CMD_HANDLER
select MODEM_IFACE_UART
select NET_L2_WIFI_MGMT
select WIFI_OFFLOAD

另外modem_cmd_handler数据通信接口是被抽象为modem_iface

1
2
3
4
5
6
7
8
9
10
struct modem_iface {
const struct device *dev;

int (*read)(struct modem_iface *iface, uint8_t *buf, size_t size,
size_t *bytes_read);
int (*write)(struct modem_iface *iface, const uint8_t *buf, size_t size);

/* implementation data */
void *iface_data;
};

因此向下对接的除了uart也可以是其它通信接口,例如spi,i2c等。让modem_cmd_handler的灵活性更高。
后续会有文章分析modem_cmd_handler的使用和原理,本文就不再展开了。

参考

https://docs.zephyrproject.org/latest/reference/networking/gsm_modem.html
https://docs.zephyrproject.org/latest/samples/net/gsm_modem/README.html