2021-03-17
关键字:移远EC204G模组、Linux平台的4G模块移植
移远EC20是一款4G模组,支持基于普通手机卡的2G、3G及4G网络。
这款模组在Linux系统中最终是以USB协议通信的,因此在适配之前必须保证Linux系统的USB驱动功能完好。
适配的过程虽然主要围绕着Quectel官方给出的指导文档来进行,但对于仅仅是想使用这款模组实现简单的上网功能需求而言,官方指导文档中有些步骤是会使人confused且又完全可以跳过的。因此写下这篇博文,记载笔者在适配过程中的关键步骤并给出相关文件以期能帮助到有需要的同学。
另外,这篇博文是基于Linux内核版本为3.10及以上的系统环境讲解的,如果您的内核版本较低,请自行参阅官方指导文档,该文档会在文末给出。
1、概述
总体而言,整个适配过程可以概括为两步:
1、驱动
2、拨号
这两个环节几乎都是《Quectel_WCDMA<E_Linux_USB_Driver_User_Guide_V1.8.pdf》文档中的内容,以下是整个过程的详细步骤。
2、驱动
因为模组是通过USB协议与Linux通信的,因此这里假定我们的嵌入式Linux系统USB功能都是完好的。
模组驱动适配的原理无非就是使Linux中的USB子系统能够识别到这款设备,并将它注册为字符型设备节点。
整个驱动适配过程又可以大致分为在内核代码中添加设备信息以及在menuconfig中开启配置选项两步。
另外,以下提到的信息请务必完整添加。
以上两个步骤完成后即可以在 /dev 目录下看到 ttyUSB0 ~ ttyUSB3 四个字符型设备节点了。如下所示:
crw------- 1 root root 188, 0 Mar 16 15:07 ttyUSB0 crw------- 1 root root 188, 1 Mar 16 15:07 ttyUSB1 crw------- 1 root root 188, 2 Mar 16 15:07 ttyUSB2 crw------- 1 root root 188, 3 Mar 16 15:07 ttyUSB3
首先,我们打开文件:
drivers/usb/serial/option.c
在 option_ids[] 结构体数组中添加模组的PID和VID信息,如下图所示:
要添加的信息如下:
#if 1 //Added by Quectel { USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */ { USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */ { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25 */ { USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */ { USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */ { USB_DEVICE(0x2C7C, 0x0191) }, /* Quectel EG91 */ { USB_DEVICE(0x2C7C, 0x0195) }, /* Quectel EG95 */ { USB_DEVICE(0x2C7C, 0x0306) }, /* Quectel EG06/EP06/EM06 */ { USB_DEVICE(0x2C7C, 0x0296) }, /* Quectel BG96 */ { USB_DEVICE(0x2C7C, 0x0435) }, /* Quectel AG35 */ #endif
PID/VID是用于描述USB设备的,任何想要使用USB协议通信的设备都必须要有一个明确的PID/VID。
然后同样在option.c中option_1port_device结构体初始化中添加如下图所示信息:
这段信息的作用是唤醒休眠状态下的模组的,对于有节能需求的产品来说才会有用。
其次打开文件:
drivers/usb/serial/qcserial.c
如果这个文件中有如下所示信息,则删除它:
{USB_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
再打开文件:
drivers/net/usb/qmi_wwan.c
如果这个文件有如下所示信息,同样删除它:
{QMI_GOBI_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */
然后我们打开文件:
drivers/usb/serial/usb_wwan.c
在 usb_wwan_setup_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(0x05C6) && desc->idProduct == cpu_to_le16(0x9090)) urb->transfer_flags |= URB_ZERO_PACKET; if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9003)) urb->transfer_flags |= URB_ZERO_PACKET; if (desc->idVendor == cpu_to_le16(0x05C6) && desc->idProduct == cpu_to_le16(0x9215)) urb->transfer_flags |= URB_ZERO_PACKET; if (desc->idVendor == cpu_to_le16(0x2C7C)) urb->transfer_flags |= URB_ZERO_PACKET; } #endif
至此,驱动代码部分的修改就完成了。官方文档后还有关于 GobiNet 与 QMI WWAN 的配置步骤,这两个东西都是拨号相关的,GobiNet 会包含 QMI WWAN 的东西,但我们其实完全不需要做这些配置,我们的拨号是直接使用 pppd 和 chat 程序做的。
接下来还需要开启相关配置项。
USB相关的配置项这里就不说了。
打开内核的menuconfig配置菜单,进入到以下层级
Device Drivers
Network device support
将ppp功能打开,如下图所示:
再进入到以下层级
Device Drivers
Network device support
USB Network Adapter
将USBNET功能打开,如下图所示:
至此,我们便完成了Quectel EC20的驱动适配,此时重新编译内核再烧进开发板,即可以看到几个 ttyUSB 设备节点的了。模组节点识别到时的内核打印信息如下所示:
usb 1-1.2: new high-speed USB device number 4 using rtl819x-ehci usb 1-1.2: New USB device found, idVendor=2c7c, idProduct=0125 usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0 usb 1-1.2: Product: Android usb 1-1.2: Manufacturer: Android option 1-1.2:1.0: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0 option 1-1.2:1.1: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1 option 1-1.2:1.2: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2 option 1-1.2:1.3: GSM modem (1-port) converter detected usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB3
在几个 ttyUSB 节点中,ttyUSB2 是模拟出来的串口通信节点,ttyUSB3 则是用于拨号上网使用的。我们完全可以开启两个命令行终端来读写 ttyUSB2,如通过AT指令控制模组:
# echo AT > /dev/ttyUSB2 # -------------------------------- # cat /dev/ttyUSB2 OK
3、拨号
拨号其实比驱动适配要简单的多,我们仅需将Quectel官方提供的几个拨号脚本预置进 /etc 目录即可。
这几个拨号脚本如下图所示:
其中,必须要预置进 /etc 的文件为:1、ip-up;2、quectel-chat-connect;3、quectel-chat-disconnect;4、quectel-ppp。
至于如何预置这些文件本文不作讨论,不同平台可能有不同的操作方法。只需要按照以下位置预置即可:
1、ip-up 预置进 /etc/ppp 目录;
2、其它三个文件预置进 /etc/ppp/peers 目录。
尽管 readme 文件中有讲到需要填写APN、用户名及密码信息,但实际上至少在我们国家完全可以忽略,直接用默认的信息预置即可。
一切准备妥当后即可以使用以下命令拨号上网了:
pppd call quectel-ppp &
当然,这里前提条件是你的系统要有 pppd 以及 chat 两个程序。quectel-ppp 直接填写即可,pppd 会自动补全路径前缀 /etc/ppp/peers 。
如果有的同学出现错误提示:无法找到 /etc_ro/ppp/peers/quectel-ppp 错误的话,请去 pppd 的源码目录修改默认目录前缀配置:
./pppd/pathnames.h
将 #define _ROOT_PATH “/etc_ro” 修改为 #define _ROOT_PATH “/etc” 即可。
正常拨号以后会出现如下网卡信息:
至此,Quectel EC20在嵌入式Linux平台的适配过程就完成了。
4、其它
官方指导文档第4章是电源管理,对于不需要考虑节能的同学来说跳过这章即可。
第5章是测试,里面提到的通过 microcom 来测试模组的步骤如果无法得到文档所示的结果,或者说执行了那条命令后卡死不动的话完全不用担心,无所谓的。至于5.2节的PPP拨号流程倒是有一定的参考价值。
链接: https://pan.baidu.com/s/1S8noViDPhO64_L7IB6uCCw
提取码: fk4r
+++