Ubuntu18.04移植移远EC20驱动(ppp拨号)

提示:如果你的硬件是x86的,那么官方的ubuntu镜像是自带EC20驱动的,直接跳到ppp拨号步骤就可以

1、下载 linux 内核

查看内核版本 uname -r

查找系统可用的 内核 apt search linux-source

选择你和你系统相匹配的内核版本,然后安装内核源码,根据你的系统匹配内核版本 apt install linux-source-4.15.0

下载完成后, 安装的内核 一般在 /usr/src/目录下面

root@ubuntu:~# ls /usr/src/
linux-headers-4.15.0-193  linux-headers-4.15.0-193-generic  linux-source-4.15.0  linux-source-4.15.0.tar.bz2

进入 linux-source-4.15.0 目录,解压内核文件 tar -jxvf linux-source-4.15.0.tar.bz2

cd /usr/src/linux-source-4.15.0
tar -jxvf linux-source-4.15.0.tar.bz2

进入解压好的linux内核源码目录

cd /usr/src/linux-source-4.15.0/linux-source-4.15.0

2、编辑驱动源码

说明:#if 1 #endif内的是添加的代码

2.1、添加 VID 和 PID

在文件/drivers/usb/serial/option.c添加以下内容

static const struct usb_device_id option_ids[] = { 
    #if 1   // EC20 Add
    { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC20 R2.0/EC20 R2.1/EC25/EG25-G/EM05 */
    #endif
    ...
}

示例图:

image-20221013144043197

2.2、解决VID和PID冲突的选项

文件/drivers/usb/serial/qcserial.c,注释掉以下内容

//{USB_DEVICE(0x05c6, 0x9215)}, /* Acer Gobi 2000 Modem device (VP413) */

示例图:

image-20221013144215552

2.3、添加零包机制

在文件/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 *))
{
    ...
    usb_fill_bulk_urb(urb, serial->dev,
              usb_sndbulkpipe(serial->dev, endpoint) | dir,
              buf, len, callback, ctx);

    #if 1   // EC20 Add
    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

    if (intfdata->use_zlp && dir == USB_DIR_OUT)
        urb->transfer_flags |= URB_ZERO_PACKET;

    return urb;
}

示例图:

image-20221013144603352

2.4、添加睡眠重启机制

在文件/drivers/usb/serial/option.c添加以下内容

static struct usb_serial_driver option_1port_device = {
    ...
#ifdef CONFIG_PM
    .suspend           = usb_wwan_suspend,
    .resume            = usb_wwan_resume,
    #if 1   // EC20 Add
    .reset_resume      = usb_wwan_resume,
    #endif
#endif
};

示例图:

image-20221013144809844

3、修改内核配置

先安装make依赖

apt install -y libncurses5-dev libssl-dev libelf-dev

进入内核源码根目录

cd /usr/src/linux-source-4.15.0/linux-source-4.15.0

为make设置配置文件,配置的文件名可以在/arch/x86/configs/下找到

make x86_64_defconfig

3.1、配置内核USB支持

make menuconfig 

菜单路径:Device Drivers => USB Support => USB Serial Converter support => USB driver for GSM and CDMA modems

image-20221010174709728

选择save保存后退出

3.2、配置内核以⽀持 PPP

菜单路径:Device Drivers => Network device support => PPP (point-to-point protocol) support

image-20221012085632499

选择save保存后退出

4、编译并安装内核

4.1、编译

# 编译内核
make -j4
# 编译完成后安装内核
make install
# 安装完成后重启系统
reboot

重启后可能会出现无法直接进入系统的情况,会让你在启动菜单选择要启动的内核

这时我们需要配置默认启动的内核

4.2、修改内核启动顺序

# 查看当前内核的启动顺序
cat /boot/grub/grub.cfg | grep "menuentry 'Ubuntu"
# 编辑grub文件
nano /etc/default/grub

#######################修改##########################
GRUB_DEFAULT=0
修改成
GRUB_DEFAULT="1>2"
1>2中的1指的是主菜单第二个选项
1>2中的2指的是主菜单第二个选项中的第三个启动内核选项
1>2中的>分隔符号前后不能带空格
####################################################

# 应用更改
update-grub
# 重启
reboot

4.2、查看结果

# 查看/dev下的设备
ls /dev/ttyUSB*
# 显示以下4个USB串口就算成功
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3

# 或者使用dmesg
dmesg | grep ttyUSB*
# 显示如下
[    6.312714] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
[    6.313057] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
[    6.315573] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB2
[    6.315817] usb 1-1: GSM modem (1-port) converter now attached to ttyUSB3

# 或者使用lsusb
lsusb
# 显示如下,ID 2c7c:0125 就是EC20
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0bda:b720 Realtek Semiconductor Corp. 
Bus 001 Device 003: ID 0424:2517 Standard Microsystems Corp. Hub
Bus 001 Device 002: ID 2c7c:0125  
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

4.3、AT测试

使用busybox microcom打开串口

# -t 代表5000ms后不操作关闭串口
# -s 代表波特率是115200
busybox microcom -t 5000 -s 115200 /dev/ttyUSB3
# 输入AT,会返回OK

5、PPP拨号

5.1、安装拨号工具

安装智能拨号工具wvdial

apt install -y wvdial

安装完拨号工具,配置文件在/etc/wvdial.conf

5.2、修改配置

修改配置文件为如下:

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"ip","ctnet"
Modem Type = Analog Modem
Baud = 115200
New PPPD = yes
Modem = /dev/ttyUSB3
ISDN = 0
Phone = *99#
Password = card
Username = card
  • Baud 是拨号串口的波特率
  • Modem 是用于拨号的串口
  • Phone 是拨号的号码,#777用于2G3G拨号,*99#用于4G拨号
  • Init3 是命令开始时执行的第3个AT命令,ctnet是电信的APN,联通是uninet,移动是cmnet
  • 更多wvdial.conf配置参考:https://manpages.debian.org/bullseye/wvdial/wvdial.conf.5.en.html

5.3、进行拨号

# 运行wvdial拨号
wvdial Defaults

命令参数Defaults是配置文件的节点名,可以配置多个节点,通过启动不同的节点来更换配置

命令输出如下表示成功

root@ubuntu:~# wvdial Defaults
--> WvDial: Internet dialer version 1.61
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+CGDCONT=1,"ip","ctnet"
AT+CGDCONT=1,"ip","ctnet"
OK
--> Modem initialized.
--> Sending: ATDT*99#
--> Waiting for carrier.
ATDT*99#
CONNECT 150000000
--> Carrier detected.  Waiting for prompt.
--> Don't know what to do!  Starting pppd and hoping for the best.
--> Starting pppd at Thu Oct 13 14:09:48 2022
--> Pid of pppd: 18448
--> Using interface ppp0
--> local  IP address 10.89.53.69
--> remote IP address 10.64.64.64
--> primary   DNS address 219.147.1.66
--> secondary DNS address 219.146.1.66

这时使用ifconfig命令,会发现多了一个名为ppp0的网卡

另起一个终端,测试网络可能会发现不通,这时因为还没配置默认路由

5.4、配置路由

查看路由发现默认路由不是ppp0,而是我的usb wifi

root@ubuntu:~# route
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
default         192.168.200.1   0.0.0.0         UG    600    0        0 wlx200db0286640
10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.200.0   0.0.0.0         255.255.255.0   U     600    0        0 wlx200db0286640

设置ppp0为默认路由

# 添加默认路由
route add default dev ppp0

此时再查看路由表发现ppp0网卡已经排在第一位

root@hyiot:~# route
内核 IP 路由表
目标            网关            子网掩码        标志  跃点   引用  使用 接口
default         0.0.0.0         0.0.0.0         U     0      0        0 ppp0
default         192.168.200.1   0.0.0.0         UG    600    0        0 wlx200db0286640
10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.200.0   0.0.0.0         255.255.255.0   U     600    0        0 wlx200db0286640

设置好路由后再ping baidu.com发现能正常上网了

不需要的时候可以删除ppp0默认路由

# 删除默认路由
route del default dev ppp0

6、常用AT命令

ATI 显示 MT 的 ID 信息

说明

该命令用于提供 MT 的 ID 信息。

命令

image-20221018113740333

参数
<objectID> 字符串类型。设备类型的标识符。
<revision> 字符串类型。MT 固件版本的 ID 信息。
举例
ATI
Quectel
EC200TCN
Revision: EC200TCNDAR01A01M1G
OK

AT+COPS 选择运营商

说明
    该命令用于查询当前运营商及其状态,并允许设置自动或手动网络选择。
    测试命令返回五个参数,分别代表网络中出现的运营商。若有任意参数不可用,则对应取值为空字段。返回运营商列表显示顺序为:归属地网络、(U)SIM 卡推荐网络和其他网络。
    查询命令返回当前找网模式和当前所选运营商。如果未选择任何运营商,则不会返回<format>、<oper>和<AcT>。
    设置命令用于强制选择并注册 GSM/UMTS/LTE 网络运营商,即使所选的网络运营商不可用,也不可选择其他任何运营商(<mode>=4 除外)。所选运营商名称的格式也应适用于查询命令 AT+COPS?。
命令

image-20221018113846910

参数
<stat> 整型。运营商状态。
    0 未知
    1 可用运营商
    2 当前选择的运营商
    3 禁止选择的运营商
<oper> 字符串类型。运营商。<format>表示该字符串采用的格式。
<mode> 整型。网络选择模式。
    0 自动搜网,省略<oper>
    1 手动搜网,<oper>不可省略且<AcT>可选
    2 手动注销网络
    3 仅设置<format>(用于查询命令 AT+COPS?);不进行注册或注销(省略<oper>和<AcT>);该取值不适用于查询命令的返回结果。
    4 手动和自动搜网的组合模式,<oper>字段不可省略。如果手动选择失败,将进入自动选择模式(<mode>=0)。
<format> 整型。<oper>的格式。
    0 长字符串格式,最多 16 个字符
    1 短字符串格式
    2 数字格式,GSM 位置区域识别号码
<AcT> 整型。网络制式。取值 3、4、5 和 6 仅适用于当 MS 处于数据服务状态时查询命令的返回结果,且不可用于设置命令。
    0 GSM
    2 UTRAN
    3 GSM W/EGPRS
    4 UTRAN W/HSDPA
    5 UTRAN W/HSUPA
    6 UTRAN W/HSDPA and HSUPA
    7 E-UTRAN
    8 UTRAN HSPA+
举例
AT+COPS=?       //列举当前所有的网络运营商。 
+COPS: (1,"CHN-UNICOM","UNICOM","46001",2),(1,"CHN-UNICOM","UNICOM","46001",0),(2,"CH N-UNICOM","UNICOM","46001",7),(1, "CHN-CT", "CT","46011",7),(3,"CHINA MOBILE","CMCC","46000",0),,(0,1,2,3,4),(0,1,2) 

OK

AT+COPS?        //查询当前选择的网络运营商。 

+COPS: 0,0,"CHN-UNICOM",7 

OK

AT+CIMI 查询 IMSI

说明

​ 该命令用于查询(U)SIM 卡的国际移动用户识别码(IMSI),IMSI允许TE识别MT中的(U)SIM卡或UICC (GSM 或者(U)SIM)中的活动应用程序。

命令

image-20221018113614995

参数
<IMSI> 字符串类型。国际移动用户识别码(无双引号的字符串)。
<err> 错误码。
举例
AT+CIMI         //查询 ME 中的(U)SIM 卡的 IMSI。

460023210226023

OK

AT+QCCID 查询 ICCID

说明

​ 该命令用于查询(U)SIM 卡的集成电路卡识别码(ICCID)。

命令

image-20221018113944100

参数
参数 说明
ICCID 字符串类型。国际移动用户识别码(无双引号的字符串)。
举例
AT+QCCID        //查询(U)SIM 卡的 ICCID。 

+QCCID: 89860025128306012474 

OK

AT+CSQ 查询信号强度

说明
该命令用于查询当前服务小区接收信号强度<rssi>和信道误码率<ber>。
测试命令返回 TA 支持的值。
执行命令获取 ME 返回的接收信号强度指示<rssi>和信道误码率<ber>。
命令

image-20221018114014591

参数
<rssi> 整型。接收信号强度指示。
    0 小于等于-113 dBm
    1 -111 dBm
    2~30 -109 ~ -53 dBm
    31 大于等于-51 dBm
    99 未知或不可测
    100 小于等于-116 dBm
    101 -115 dBm
    102~190 -114 ~ -26 dBm
    191 大于等于-25 dBm
    199 未知或不可测
    100~199 扩展用于 TD-SCDMA 指示接收信号码功率(RSCP)
<ber> 整型。信道误码率。百分比格式。
    0~7 3GPP TS 45.008 第 8.2.4 章表格中的 RxQual 值。
    99 未知或不可测
<err> 错误码。
举例
AT+CSQ=?
+CSQ: (0-31,99),(0-7,99)
OK
AT+CSQ
+CSQ: 28,99 //查询当前接收信号强度为 28,误码率未知或不可测
OK

AT+QNWINFO 查询网络信息

说明

该命令用于查询网络信息,例如选择的网络制式、运营商以及选择的频段。

命令

image-20221018114046204

参数
<AcT> 字符串类型。选择的网络制式。
    "NONE"
    "GSM"
    "GPRS"
    "EDGE"
    "WCDMA"
    "HSDPA"
    "HSUPA"
    "HSPA+"
    "TDD LTE"
    "FDD LTE"
<oper> 字符串类型。数字格式运营商名称。
<band> 字符串类型。选择的频段。
    "GSM 1800"
    "GSM 900"
    "WCDMA 2100"
    "WCDMA 850"
    "WCDMA 900" 
    "LTE BAND 1"
    "LTE BAND 3"
    "LTE BAND 5"
    "LTE BAND 7"
    "LTE BAND 8"
    "LTE BAND 20"
    "LTE BAND 28"
    "LTE BAND 34"
    "LTE BAND 38"
    "LTE BAND 39"
    "LTE BAND 40’’
    "LTE BAND 41"
<channel> 整型。信道 ID。
举例
AT+QNWINFO=?
OK
AT+QNWINFO
+QNWINFO: "FDD LTE",46001,"LTE BAND 3",1650 
OK

7、参考链接

  1. 移远EC20 4G模块Linux驱动移植和测试_Iflyinsky2013的博客-CSDN博客_ec20 linux驱动
  2. Ubuntu Server 18.04 中 EC20 驱动 移植 Gobinet 拨号_oliver223的博客-CSDN博客
  3. USB-4G/LTE移植 -第4节 USB-4G移植(移远EC20开发-GOBI拨号)_汉尼拔勇闯天涯的博客-CSDN博客
  4. 第五节 树莓派EC20自动拨号脚本编写_哆啦A不做梦的博客-CSDN博客_自动拨号脚本
  5. 第三节 树莓派EC20之PPP拨号上网_哆啦A不做梦的博客-CSDN博客_ppp拨号
  6. Wvdial – Debian Wiki
  7. wvdial.conf(5) — wvdial — Debian bullseye — Debian Manpages
上一篇
下一篇