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
大致分为几步

  1. 修改[KERNEL]/drivers/usb/serial下与USB虚拟串口相关的内容
  2. 修改[KERNEL]/drivers/net/usb下与USB网卡相关的内容
  3. 测试USB驱动是否正常工作
  4. 拷贝微调PPP脚本
  5. 修改启动脚本使开机配置ppp网卡
  6. 开机运行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

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值