4G模块EC20在TL-WR720N路由器上的应用

上次我们讲了BM806U在WR720N上的应用,这次我们要来讲解4G模块EC20在TL-WR720N路由器上的应用。与BM806U不同的是,OpenWrt官方提供的uqmi拨号工具对移远EC20来说并不适用的,因此我们必须采用自编译的方法:对qmi_wwan.c源程序进行修改,同时采用EC20自己的拨号程序。

编译环境:OpenWrt官方源码、19.07.7版本、采用TL-WR710N-V1基础固件进行二次编译

一、生成基础编译环境
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git checkout v19.07.7
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

选择TL-WR710N-V1,同时添加如下支持:

kmod-usb-core
kmod-usb-ohci
kmod-usb-uhci
kmod-usb2
usbutitls
usb-modeswitch
kmod-mii
kmod-usb-net
kmod-usb-wdm
kmod-usb-net-qmi-wwan
uqmi
luci

编译

make -j1 V=s
二、修改qmi_wwan.c文件,添加交叉编译工具后重新编译

1、修改文件:/home/hzshw/openwrt/build_dir/target-mips_24kc_musl/linux-ar71xx_generic/linux-4.14.221/drivers/net/usb/qmi_wwan.c

因为修改的内容较多,这里采用patch文件来展示不同点:

--- qmi_wwan.c	2021-02-10 08:12:10.000000000 +0000
+++ qmi_wwan-1.c	2021-04-20 07:31:24.000000000 +0000
@@ -478,6 +478,21 @@
  * to 00:a0:c6:00:00:00 despite the host address being different.
  * This function will also fixup such packets.
  */
+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;
+}
+
 static int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
 {
 	struct qmi_wwan_state *info = (void *)&dev->data;
@@ -752,6 +767,22 @@
 	}
 	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.idVendor == cpu_to_le16(0x2C7C)) {
+            dev_info(&intf->dev, "Quectel EC25&EC21&EG91&EG95&EG06&EP06&EM06&BG96&AG35 work on RawIP mode\n");
+            dev->net->flags |= IFF_NOARP;
+            usb_control_msg(
+                interface_to_usbdev(intf),
+                usb_sndctrlpipe(interface_to_usbdev(intf), 0),
+                0x22, //USB_CDC_REQ_SET_CONTROL_LINE_STATE
+                0x21, //USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE
+                1, //active CDC DTR
+                intf->cur_altsetting->desc.bInterfaceNumber,
+                NULL, 0, 100);
+        }
+        #endif
+
 err:
 	return status;
 }
@@ -842,6 +873,7 @@
 	.bind		= qmi_wwan_bind,
 	.unbind		= qmi_wwan_unbind,
 	.manage_power	= qmi_wwan_manage_power,
+        .tx_fixup       = qmi_wwan_tx_fixup,
 	.rx_fixup       = qmi_wwan_rx_fixup,
 };
 
@@ -851,6 +883,7 @@
 	.bind		= qmi_wwan_bind,
 	.unbind		= qmi_wwan_unbind,
 	.manage_power	= qmi_wwan_manage_power,
+        .tx_fixup       = qmi_wwan_tx_fixup,
 	.rx_fixup       = qmi_wwan_rx_fixup,
 	.data           = QMI_WWAN_QUIRK_DTR,
 };

2、保存新修改的文件,并删除同目录下已生成的中间文件

qmi_wwan.ko
qmi_wwan.mod.c
qmi_wwan.mod.o
qmi_wwan.o

3、重新配置,添加生成交叉编译工具链

make menuconfig

4G模块EC20在TL-WR720N路由器上的应用-1

4、编译

make -j8 V=s

编译完成后,在 ~/bin/targets/ar71xx/generic 目录下就会发现二次编译生成的固件及交叉编译工具包文件:

openwrt-ar71xx-generic-tl-wr710n-v1-squashfs-factory.bin

openwrt-toolchain-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64.tar.bz2

三、刷入新固件并检查驱动是否工作正常

将新生成的固件,通过Breed写入TL-WR720N路由器中。

然后检查驱动安装是否正常,等4G usb模块插入后,通过winscp连接路由器,再输入如下命令:

lsusb -t
或
ls /dev

4G模块EC20在TL-WR720N路由器上的应用-2

四、生成EC20在OpenWrt系统下运行的拨号程序

1、配置交叉编译工具链环境
1)先拷贝openwrt-toolchain-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64.tar.bz2到指定目录下,例如:/home/hzshw;
2)解压并删除压缩包文件

tar -jxvf openwrt-toolchain-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64.tar.bz2
rm openwrt-toolchain-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64.tar.bz2

3)将交叉编译执行文件所在目录添加到$PATH

sudo vim /etc/bash.bashrc

在打开的文件末尾添加:

export PATH=/home/hzshw/openwrt-toolchain-ar71xx-generic_gcc-7.5.0_musl.Linux-x86_64/toolchain-mips_24kc_gcc-7.5.0_musl/bin/:$PATH
export STAGING_DIR=/home/hzshw/openwrt/staging_dir/

再将PATH值导入系统:

source /etc/bash.bashrc

4)测试是否安装成功

在任何路径下输入下面的命令,若能成功获取gcc版本信息即可(注:其它还有一些提示信息可以不用管它):

mips-openwrt-linux-gcc -v

2、编译拨号程序
将下载的移远源程序解压,放置在任何路径下,例如目录:~/quectel-cm-master

cd quectel-cm-master
mips-openwrt-linux-gcc *.c -o quectel-CM -lpthread -ldl

新生成的quectel-CM程序就在 ~/quectel-cm-master 目录下

五、运行拨号程序并创建新网络

1、可以先用uqmi命令检查连接状态,测试一下直接用uqmi连接会返回错误信息,必须采用EC20的自拨号程序:

将quectel-CM拷贝到路由器的/usr/bin目录下,然后添加可执行属性后后台执行:

chmod 777 quectel-CM
quectel-CM &

4G模块EC20在TL-WR720N路由器上的应用-3

最终显示已获取IP地址即成功。

2、回到路由器的Luci界面,在 “Network – Interfaces” 添加新网络 wwan,接口为 wwan0,协议选 dhcp client,firewall选与 wan、wan6一样,就能获得连通的信息了:

4G模块EC20在TL-WR720N路由器上的应用-4

3、其它设置,如quectel-CM自启动、mwan3等就不在这里展开说明了。

今天涉及的内容较多,大家如果没时间实际操作,也可以到下载中心直接下载相关的文件,百度网盘提取码为:lyzt