将移远通信的EC20驱动移植到NUC972上

根据公司明年的开发计划,下面的项目可能会用到4G传输,所以在某宝上买了一个4G模块,上海移远通信的EC20系列,经过几天的研究,基本上搞明白了这玩意儿是怎么用的,下面分享一下过程,难度不是特别大。

首先咱们来看一下我买的这个EC20模块的具体信息:

从上面的图可以看出来,EC20系列模块是基于高通平台的一个通信模组,该有的外围接口都有了,如果有需要的话,完全可以基于这个模块做主控平台,做类似于4G网关的东西,当然,这需要使用移远的SDK支持,我这次主要还是作为一个USB从设备接到我的CPU上进行4G通信的,所以现在不考虑这种情况。所以咱们再来看一下EC20模块的EC20_R2.1_Mini_PCIe-C版本:

我购买的是mini pcie接口的成品,上面1路UART、1路USB2.0和1路模拟音频接口,而且支持GPS、北斗等定位信息。我目前只用数据传输,所以不考虑模拟音频接口,如果需要打电话的功能,这个模拟音频接口是必须的,还有一路UART接口,这个串口是为了使用MCU的串口发送和接口AT指令通过EC20进行数据传输的,UART的优点是通用性强,使用简单方便,缺点是传输速率不高,不能充分发挥4G的作用,在这里我是使用USB接口与NUC972进行连接的,目的是NUC972通过USB接口将EC20模块挂载到linux系统上,将EC20模拟成一个网络设备和4个USB串口设备,串口设备的作用是对模块进行一些初始化操作、错误检测、读取定位信息等,网络设备的作用是将EC20作为一个通用的网卡设备,供上层socket调用。要达到这些目的,需要做以下几项工作:1、移植EC20的相关驱动;2、配置内核的相关内容;3、使用拨号上网工具进行拨号上网。

咱们先来看一下驱动移植,其实具体的移植过程在移远的技术文档里面说的已经很清楚了,不过官方的文档是直接集成到内核里面的,我这次是将EC20的驱动编译成一个模块动态插入的。根据官方文档说明,我使用的EC20需要安装USB Serial Driver和GobiNet Driver,其他的驱动可以直接pass掉。首先说明一下这两种驱动的作用,USB串口驱动的作用是在内核中虚拟出四个串口,CPU通过这几个串口对模块进行初始化操作、获得定位信息、获得错误诊断报告等。GobiNet驱动的作用是为应用层提供GobiNet通信接口(按照我的理解,GobiNet协议是高通的一套比ppp协议更方便的拨号协议,我咨询过别人,说是使用GobiNet传输速率快,没有考证过,如果哪位清楚,可以给我留言,教教我)。具体的移植过程可以参考移远的官方文档,在这里就不粘了。

再来看一下内核需要配置的地方,内核配置其实也是将和网络相关的驱动编译到内核,还是驱动,只不过是内核自带的通用性驱动,主要有三个地方:

1、选中支持GSM和CDMA模块的USB转串口驱动,如下图所示:

这个驱动的作用就是在内核中虚拟出/dev/ttyUSB0、/dev/ttyUSB1、/dev/ttyUSB2、/dev/ttyUSB3这几个串口,他们的作用分别是错误诊断、gps信息接口、模块的的通信接口。根据我的测试ttyUSB2和ttyUSB3的功能貌似一样。

2、选中支持USB网络设备驱动,如下图所示:

这个驱动的作用就是内核支持USB网络设备,如果使用ppp拨号工具或者GobiNet工具拨号后,能在系统中虚拟出一个网络设备,供上层socket操作。

3、选中ppp拨号工具驱动,如下图所示:

这个驱动的作用就是支持ppp拨号工具,在应用层使用ppp拨号脚本进行拨号上网。

说到这里,内核需要配置的地方已经完成了。

下面来看一下具体的ppp上网的shell脚本文件,我的卡是中国移动的,所以具体说说中国移动拨号上网的流程:

脚本文件主要有四个文件:

/etc/ppp/ip-up

这个文件是通过ppp拨号连接成功后,系统自动调用,主要是为了记录一下域名服务器地址,并将这个地址写到linux的DNS客户端解析文件resolv.conf中。

/etc/ppp/peers/chat-cmnet-connect

这个文件是使用ppp建立连接的脚本,具体的过程如下图所示:

每一行指令的后半部分是通过串口发送的指令,前半部分是期待模块的回复信息。

/etc/ppp/peers/chat-cmnet-disconnect 

这个文件是使用ppp注销连接的脚本,具体的内容如下:

/etc/ppp/peers/cmnet

这个文件是对ppp操作的各种配置,具体内容如下:

从上面的信息可以看出来,主要是配置debug信息、拨号时使用的串口名称、波特率、拨号上网的用户名、建立网络连接时使用的脚本文件、注销连接时使用的脚本文件等。

说到这里,ppp拨号的脚本文件基本上就说完了,当然了,这几个文件的名字出来ip-up,其他的文件名称是可以任意起的。下面就可以使用ppp工具拨号了。

首先查看现在系统上的网络设备信息:

可以看出来,我的系统上目前有三个网络设备,一个wan口设备、一个本地设备、一个ra0(USB-WIFI)设备。现在使用pppd call cmnet & (注意要使用后台运行),输出了一大堆东西后,看到这个东西就算拨号上网成功了:

从上图可以看出来,本地的ip、远程ip、DNS和备用DNS都有了,注意,对于普通的4G卡,这些东西每次都是随机的,都是有基站动态分配的。

现在再查看一下系统中的网络设备:

从上面的图可以看出来,现在系统上多了一个ppp0网络设备,这个就是通过PPP拨号建立链接后系统虚拟出来的一个网络设备。现在就可以使用ppp0来PING公网上的地址,在这之前,要配置一下系统默认的网络设备,先使用route命令查看一下系统目前的默认网卡:

从上图可以看出来,现在系统默认的是ra0,使用route del default和route add default ppp0将ppp0设置成默认网卡:

从上图可以看出来,已经切换成功了,现在就可以通过4G来ping百度了:

看到这些,就证明EC20通过PPP拨号已经成功了。

EC20处理支持PPP拨号上网,还支持通过GobiNet上网,下面来分析一下这种上网的方法。其实这种建立链接的方法和ppp的方法差不多,不过没有通用的工具,不过移远的官方已经给了我们一段代码,交叉编译后可以直接应用,编译后的程序名称默认叫quectel-CM,在系统中可以直接调用,不过在调用之前,要把ppp0关掉:

从上图可以看出来,GobiNet已经拨号成功了。

再查看系统内的网络设备:

eth1就是在系统上虚拟出的4G网络设备,ping一下百度:

从图上可以看的出来,已经成功ping通百度,说到这里,用EC20接到NUC972上进行上网的功能已经实现,现在来总结一下。首先是需要将EC20的usb转串口的驱动安装,在系统中虚拟出串口,以备NUC972对EC20进行初始化;其次是需要在内核里面配置支持USB转串口的驱动、USB网络设备的驱动、PPP拨号的驱动,使用ppp脚本命令进行拨号上网。如果不需要GobiNet拨号上网,这两步就可以了,如果还需要GobiNet拨号,还需要安装GobiNet驱动;最后,安装GobiNet驱动后,就可以使用移远官方提供的应用层代码进行GobiNet拨号了。

好了,移远通信的4G模块EC20的使用方法就说到这里,如果哪地方说的有错误,可以第一时间给我留言,谢谢!

猜你喜欢

转载自blog.csdn.net/b7376811/article/details/86707528