Zephyr modem驱动概览

本文简要说明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

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

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中可以看到

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

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