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