上次我们讲了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

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

四、生成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 &

最终显示已获取IP地址即成功。
2、回到路由器的Luci界面,在 “Network – Interfaces” 添加新网络 wwan,接口为 wwan0,协议选 dhcp client,firewall选与 wan、wan6一样,就能获得连通的信息了:

3、其它设置,如quectel-CM自启动、mwan3等就不在这里展开说明了。
今天涉及的内容较多,大家如果没时间实际操作,也可以到下载中心直接下载相关的文件,百度网盘提取码为:lyzt