目前4G模块应用已经非常普及,跟之前的3G不同,3G基本使用ppp拨号,usbserial驱动,Linux内核自带支持,此应用非常简单。
4G模块由于速率较高,usbserial驱动性能满足不了,因此4G的拨号方式就发生了变化。基本方式有,PPP,NDIS,QMI等。
此文介绍QMI方式,所谓QMI即Qualcomm Message Interface,因此只限于使用高通芯片的4G模块。
工作主要分为三个方面:Kernel驱动适配,应用层拨号程序,Openwrt拨号适配脚本。
首选,介绍Kernel驱动适配:
主要就是按照EC20官方文档来修改几个地方,interface屏蔽以及RAW IP。
建议在Openwrt中修改,做成patch方式,便于管理。以下是我做好的patch,可直接使用。
--- a/drivers/net/usb/qmi_wwan.c 2018-08-16 00:13:02.000000000 +0800
+++ b/drivers/net/usb/qmi_wwan.c 2019-01-22 10:59:14.000000000 +0800
@@ -76,6 +76,25 @@ struct qmimux_priv {
u8 mux_id;
};
+#if 1 //Added by Quectel
+#include <linux/etherdevice.h>
+struct sk_buff *qmi_wwan_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
+{
+ if (dev->udev->descriptor.idVendor != cpu_to_le16(0x2C7C))
+ return skb;
+ // Skip Ethernet header from message
+ if (skb_pull(skb, ETH_HLEN)) {
+ return skb;
+ } else {
+ dev_err(&dev->intf->dev, "Packet Dropped ");
+ }
+ // Filter the packet out, release it
+ dev_kfree_skb_any(skb);
+ return NULL;
+}
+#endif
+
+
static int qmimux_open(struct net_device *dev)
{
struct qmimux_priv *priv = netdev_priv(dev);
@@ -740,6 +759,23 @@ static int qmi_wwan_bind(struct usbnet *
}
dev->net->netdev_ops = &qmi_wwan_netdev_ops;
dev->net->sysfs_groups[0] = &qmi_wwan_sysfs_attr_group;
+
+#if 1 //Added by Quectel
+ if (dev->udev->descriptor.idV