EC200S 4GCat.1模组OpenWRT驱动的移植
EC200S 4GCat.1模组OpenWRT驱动的移植
参考信息
移远驱动手册:Quectel_EC200T_Linux_USB_Driver_User_Guide_V1.0.pdf
移远驱动源码:Quectel_Linux_USB_Serial_Option_Driver_V1.0.zip
移远PPP拨号脚本:Quectel_Linux_PPP_Script_V1.0.0.tgz
移植说明:KBA_EC200&UC200_Linux&Android_USB_driver_移植说明.docx
openwrt 挂载cat1,使用ppp拨号上网:https://blog.csdn.net/xiaohu1996/article/details/108190209
OpenWRT使用4G模块上网和发送短信:https://blog.csdn.net/ypbsyy/article/details/80750024
OpenWrt 4G网卡拨号配置:https://blog.csdn.net/qianguozheng/article/details/50543704
移远相关资料及修改好的文件见文末。
更新日志
2020-09-25
:创建文档,记录移植过程,EC200S Cat.1模组验证通过。by.Ryan
1 说明
硬件使用widora bit5.1,芯片为MT7688,内核版本3.18.29
SDK路径:openwrt_widora
内核文件在SDK中的位置:openwrt_widora/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7688/linux-3.18.29
大致分为几步:
- 修改[KERNEL]/drivers/usb/serial下与USB虚拟串口相关的内容
- 修改[KERNEL]/drivers/net/usb下与USB网卡相关的内容
- 测试USB驱动是否正常工作
- 拷贝微调PPP脚本
- 修改启动脚本使开机配置ppp网卡
- 开机运行ppp脚本
2 USB Serial源码修改
2.1 添加VID与PID
在 [KERNEL]/drivers/usb/serial/option.c中添加如下内容。其中《移远驱动源码》中提供的没有EC200S的PID“0x2C7C, 0x6002”,我们手动添加进去。
static const struct usb_device_id option_ids[] = {
#if 1 //Added by Quectel
{ USB_DEVICE(0x2C7C, 0x6026) }, /* Quectel EC200 */
{ USB_DEVICE(0x2C7C, 0x6120) }, /* Quectel UC200 */
{ USB_DEVICE(0x2C7C, 0x6000) }, /* Quectel EC200/UC200 */
{ USB_DEVICE(0x2C7C, 0x6002) }, /* Quectel EC200S */
#endif
2.2 添加零数据包机制
内核版本高于2.6.34的在[KERNEL]/drivers/usb/serial/usb_wwan.c下添加如下内容,低与这个版本的参考《移远驱动手册》
static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port,
int endpoint,
int dir, void *ctx, char *buf, int len,
void (*callback) (struct urb *))
{
......
#if 1 //Added by Quectel for Zero Packet
if (dir == USB_DIR_OUT) {
struct usb_device_descriptor *desc = &serial->dev->descriptor;
if (desc->idVendor == cpu_to_le16(0x2C7C))
urb->transfer_flags |= URB_ZERO_PACKET;
}
#endif
2.3 添加重置恢复机制
内核版本高于3.4的在[KERNEL]/drivers/usb/serial/option.c添加如下内容
static struct usb_serial_driver option_1port_device = {
......
.resume = usb_wwan_resume,
#if 1 //Added by Quectel
.reset_resume = usb_wwan_resume,
#endif
#endif
};
内核版本低于2.6.29的还需要增加大量URB的数量和容量,参考《移远驱动手册》3.2.4章节
2.4 使用ECM或RNDIS
内核版本高于2.6.30的在[KERNEL]/drivers/usb/serial/option.c中添加如下内容
static int option_probe(struct usb_serial *serial,
const struct usb_device_id *id)
{
struct usb_interface_descriptor *iface_desc =
&serial->interface->cur_altsetting->desc;
struct usb_device_descriptor *dev_desc = &serial->dev->descriptor;
#if 1 //Added by Quectel
if (serial->dev->descriptor.idVendor == cpu_to_le16(0x2C7C)) {
__u16 idProduct = le16_to_cpu(serial->dev->descriptor.idProduct);
//Quectel EC200T's interface 0 can be used as USB Network device (ecm, rndis)
if (serial->interface->cur_altsetting->desc.bInterfaceClass != 0xFF)
return -ENODEV;
}
#endif
3 Net USB驱动源码修改
3.1 添加VID与PID
在 [KERNEL]/drivers/net/usb/qmi_wwan.c中添加如下内容
static const struct usb_device_id products[] = {
#if 1 //Added by Quectel
{QMI_FIXED_INTF(0x2C7C, 0x6026, 4)}, /* Quectel EC200 */
{QMI_FIXED_INTF(0x2C7C, 0x6000, 4)}, /* Quectel EC200T */
{QMI_FIXED_INTF(0x2C7C, 0x6002, 4)}, /* Quectel EC200S */
#endif
4 修改编译配置选项
进入SDK路径openwrt_widora下
make menuconfig
需要开启的配置如下
Kernel modules --->
USB Support --->
-*- kmod-usb-core
-*- kmod-usb-net
-*- kmod-usb-net-cdc-ether
<*> kmod-usb-net-cdc-mbim
-*- kmod-usb-net-cdc-ncm
<*> kmod-usb-net-cdc-subset
-*- kmod-usb-net-qmi-wwan
<*> kmod-usb-net-rndis
<*> kmod-usb-ohci
<*> kmod-usb-serial
<*> kmod-usb-serial-option
-*- kmod-usb-serial-wwan
<*> kmod-usb-uhci
<*> kmod-usb2
Network --->
-*- chat
<*> ppp
<*> ppp-mod-pppoa
<*> ppp-mod-pppoe
<*> ppp-mod-pppol2tp
<*> ppp-mod-pptp
<*> ppp-mod-radius
<*> ppp-multilink
<*> pppdump
<*> pppstats
<*> ser2net
<*> uqmi
-*- wwan
Utilities --->
<*> usb-modeswitch
5 编译下载测试驱动
5.1 USB端口识别
修改完源码后可以 make -j8 V=s编译,编译完成下载到板子上则可以测试是否可以识别到USB。
插入USB连接上EC200S,查看内核打印信息:
[69572.640000] usb 1-1: new high-speed USB device number 84 using ehci-platform
[69573.050000] usb 2-1: new full-speed USB device number 4 using ohci-platform
[69573.260000] usb 2-1: not running at top speed; connect to a high speed hub
[69573.290000] cdc_ether 2-1:1.0 usb0: register 'cdc_ether' at usb-101c1000.ohci-1, CDC Ethernet Device, ae:0c:29:a3:9b:6d
[69573.310000] option 2-1:1.2: GSM modem (1-port) converter detected
[69573.310000] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB0
[69573.320000] option 2-1:1.3: GSM modem (1-port) converter detected
[69573.330000] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB1
[69573.340000] qmi_wwan 2-1:1.4: bogus CDC Union: master=0, slave=0
[69573.340000] qmi_wwan: probe of 2-1:1.4 failed with error -1
[69573.350000] option 2-1:1.4: GSM modem (1-port) converter detected
[69573.360000] usb 2-1: GSM modem (1-port) converter now attached to ttyUSB2
ls /dev 可以看到 ttyUSB0/ttyUSB1/ttyUSB2三个USB虚拟串口则代表USB端口识别成功了。其中ttyUSB0是调试串口,ttyUSB1是AT指令串口,ttyUSB2是ppp拨号端口。
root@syniot:/opt/syniot# ls /dev
.......
ttyUSB0
ttyUSB1
ttyUSB2
......
如果只识别到了ttyUSB0、ttyUSB1,没有出现ttyUSB2则可能是因为完全使用了《移远驱动源码》中的驱动,其中有EC20/EC25的代码,会导致UC200&EC200的PPP口识别不到。所以建议完全安装本说明中的代码修改重新移植一次。
5.2 AT指令测试
可以使用microcom来连接ttyUSB1端口来测试AT指令。
如果你的OpenWrt系统中没有microcom指令,则可以在编译OpenWrt系统时打开microcom的编译选项,BusyBox已经提供了microcom的编译。开启后重新编译即可拥有microcom,位置在make menuconfig中的:
Base system --->
<*> busybox
Miscellaneous Utilities --->
[*] microcom
使用microcom连接串口ttyUSB1:
microcom /dev/ttyUSB1
输入测试AT指令:
ATI
AT+CSQ
AT+CGREG?
AT+CPIN?
AT+QNWINFO
AT+CGDCONT?
正常的返回类似下面:
root@syniot:/dev# microcom /dev/ttyUSB1
ATI
Quectel
EC200S
Revision: EC200SCNAAR01A06M16
OK
AT+CGREG?
+CGREG: 0,1
OK
AT+CPIN?
+CPIN: READY
OK
AT+QNWINFO
+QNWINFO: "FDD LTE","46000","LTE BAND 3",1300
OK
AT+CGDCONT?
+CGDCONT: 1,"IP","3gnet","0.0.0.0",0,0,0,0,0,0
OK
6 拷贝与修改ppp拨号脚本
6.1 ppp脚本说明
原PPP脚本在参考信息中《移远PPP拨号脚本》中。
注意不要在 windows 下编辑该目录下的文件、否则会使得这些文件变成 dos 格式。windows 的 dos 格式是指文件的每行以 \r\n 结尾,而 linux 的文件默认是以 \n 结尾的。pppd 和 chat 不能解析 dos 格式的文件。工具 dos2unix 可以把 dos 格式的文件转成 linux 格式。
有2种方法启动ppp拨号
- 方式1: 拷贝 quectel-chat-connect quectel-chat-disconnect quectel-ppp 到 /etc/ppp/peers 目录下。
并在 quectel-ppp 里修改你的串口设备名,pppd 拨号使用的 username,password。
在 quectel-chat-connect 里修改你的 APN。APN/username/password 是从你的网络提供商那里获取的。
然后使用下面的命令启动 ppp 拨号, 命令最后的 & 可以让 pppd 后台运行
pppd call quectel-ppp & - 方式2:使用quectel-pppd.sh 拨号,命令形式如下:
./quectel-pppd.sh
ip-up:pppd 在获取 ip 和 dns 之后,会自动调用这个脚本文件来设置系统的 DNS。嵌入式系统一般需要拷贝这个文件到 /etc/ppp 目录下。请确保该文件在你的系统里有可执行权限。
quectel-ppp-kill:用来挂断拨号的,pppd必须被正常的挂断,否则可能会导致你下次ppp拨号失败。
使用下面方式来调用这个脚本
./quectel-ppp-kill
6.2 ppp脚本移植与修改
我们直接拷贝到镜像的文件系统中
拷贝ip-up到openwrt_widora/package/base-files/files/etc/ppp下
拷贝quectel-chat-connect、quectel-chat-disconnect、quectel-ppp、quectel-pppd.sh、quectel-ppp-kill到openwrt_widora/package/base-files/files/etc/ppp/peers
赋予执行权限
cd openwrt_widora/package/base-files/files/etc/ppp/peers
chmod +x quectel-chat-connect quectel-chat-disconnect quectel-ppp quectel-pppd.sh quectel-ppp-kill
脚本默认ppp端口为ttyUSB3,EC200系列使用的是ttyUSB2,修改默认串口。
修改运营商APN设置,移动为cmnet、联通为3gnet、电信为ctnet。user与password为空
# /etc/ppp/peers/quectel-ppp
#Modem path, like /dev/ttyUSB3,/dev/ttyACM0, depend on your module, default path is /dev/ttyUSB3
/dev/ttyUSB2 115200
#Insert the username and password for authentication, default user and password are test
user "" password ""
# /etc/ppp/peers/quectel-pppd.sh
QL_DEVNAME=/dev/ttyUSB2
QL_APN=cmnet
QL_USER=
QL_PASSWORD=
# /etc/ppp/peers/quectel-chat-connect
# OK AT+CGDCONT=1,"IP","3gnet",,0,0 修改为
OK AT+CGDCONT=1,"IP","cmnet"
6.3 添加ppp0网络节点
调试的时候手动添加网络节点:
# etc/config/network 添加
config interface 'ppp0'
option ifname 'ppp0'
option proto '4g'
option apn 'cmnet'
option service 'umts'
option dialnumber '*99#'
option device '/dev/ttyUSB2'
注:联通apn:3gnet 电信apn:ctnet 移动apn:cmnet/cmwap
联通dialnumber:3G为99# 电信:3G为#777 移动为:99*1# LTE为:*99#
实际量产中还有其他方法添加网络节点,我这里只是手动用脚本追加到了"etc/config/network"文件中,配置启动执行这个脚本后重启。
#!/bin/sh
#自己的脚本/opt/ppp0cfg.sh,配置启动执行一次(/etc/init/d),配置方法自行百度
sleep 10s
result=`cat /etc/config/network | grep ppp0`
if [ -z "$result" ]
then
echo "config interface 'ppp0'" >> /etc/config/network
echo " option ifname 'ppp0'" >> /etc/config/network
echo " option proto '4g'" >> /etc/config/network
echo " option apn 'cmnet'" >> /etc/config/network
echo " option service 'umts'" >> /etc/config/network
echo " option dialnumber '*99#'" >> /etc/config/network
echo " option device '/dev/ttyUSB2'" >> /etc/config/network
else
echo "ppp0 Already"
fi
sleep 5s
pppd call quectel-ppp & #启动自动连接
6.4 PPP拨号测试
编译打包OpenWrt下载到开发板测试PPP拨号。首先连接4G模组EC200S,进入mt7688的OpenWrt系统中,以root权限运行:
pppd call quectel-ppp
过一会可以ppp进程的运行及网卡IP信息则可以认为联网成功了
# 查看进程运行
root@syniot:/opt# ps | grep ppp
1819 root 1600 S pppd call quectel-ppp
1958 root 1488 S grep ppp
# 查看网卡状态
root@syniot:/opt# ifconfig
.......
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.34.130.232 P-t-P:10.64.64.64 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:52 (52.0 B) TX bytes:58 (58.0 B)
.......
看到了网卡的信息及IP状态,可以ping一下百度试试了,大功告成。
相关资源下载
EC200S驱动移植移远官方资料:
https://download.csdn.net/download/xiaokang_rays/13638039
EC200S/EC200T修改好的内核驱动文件:https://download.csdn.net/download/xiaokang_rays/13637571