迅为IMX6ULL开发板Linux 4G通信实验
前面的章节中学习了如何使用有线网络或者使用 wifi,但是使用无线网络或者 wifi 有许多环境限制,这种时候就可以使用 4G 模块来上网。在本章中学习一下如何使用 4G 模块实现上网功能。
56.1 4G 网络连接
对于嵌入式 Linux 而言,4G 网络连接是一个比较容易实现的功能,大多数的 4G 模块接口都是 MiniPCIE接口,但是深入了解一下就会发现,4G 模块的通信接口都是 USB,所以 4G 模块的驱动就是 USB 驱动,只要 USB 驱动正常,4G 模块在硬件上就能正常通信。下面看一下 4G 模块的硬件原理图:
在原理图中,U25 是 4G 模块的 MiniPCIE 接口,然后通信引脚会接到 U15 的 HUB 芯片上,所以 4G 模块会被识别成 USB 设备,CON5 是 SIM 卡接口,在使用 4G 模块时,需要先插入 SIM 卡。在 i.MX6UL 终结者开发板上使用的 EC20 4G 模块,如图 56.1.3 所示:
56.2 EC20 4G 模块配置
56.2.1 添加 USB 设备信息
要使用 EC20 4G 模块首先需要在 Linux 内核中添加 EC20 的 USB 信息,这样内核启动后,才能正确识别
EC20 4G 模块。打开 Linux 内核下的 drivers/usb/serial/option.c 文件,添加如下信息:
1809 /* add support EC220 4G Module */
1810 { USB_DEVICE(0x05C6, 0x9090) }, /* Quectel UC15 */
1811 { USB_DEVICE(0x05C6, 0x9003) }, /* Quectel UC20 */
1812 { USB_DEVICE(0x05C6, 0x9215) }, /* Quectel EC20 */
1813 { USB_DEVICE(0x2C7C, 0x0125) }, /* Quectel EC25/EC20 R2.0 */
1814 { USB_DEVICE(0x2C7C, 0x0121) }, /* Quectel EC21 */
1815 /* end add */
其中第 1813 行是 EC20 4G 模块的 USB 信息。
56.2.2 Linux 内核配置
添加完 EC20 4G 模块的 USB 信息后,需要修改 Linux 内核配置来支持 USBNET 功能。具体配置如下:
Device Drivers --->
Network device support --->
<*> USB Network Adapters --->
<*> Multi-purpose USB Networking Framework
配置如图 56.2.2.1 所示:
接下来我们还需要使能 USB 串口 GSM、CDMA 驱动,配置路径如下:
Device Drivers --->
USB support --->
<*> USB Serial Converter support --->
<*> USB driver for GSM and CDMA modems
配置如图 56.2.2.2 所示:
然后配置 ppp,配置路径如下:
Device Drivers --->
Network device support --->
<*> PPP (point-to-point protocol) support
<*> PPP BSD-Compress compression
<*> PPP Deflate compression
PPP filtering
<*> PPP MPPE compression (encryption)
PPP multilink support
<*> PPP over Ethernet
<*> PPP support for async serial ports
<*> PPP support for sync tty ports
配置如图 56.2.2.3 所示:
配置完成后,重新编译内核,然后使用新的内核启动开发板。如果配置成功开发板启动后会有如图56.2.2.4 信息打印:
可以看出 EC20 4G 模块识别成功,并且虚拟出 5 个 USB 设备,分别为 ttyUSB0~ttyUSB4。
56.3 EC20 4G 模块联网测试
56.3.1 PPP 软件包编译
首先拷贝 ppp-2.4.4.tar.gz 到 Ubuntu 下,然后执行下面的命令解压:
tar -xvf ppp-2.4.4.tar.gz
解压完成得到 ppp-2.4.4 目录,进入 ppp-2.4.4 目录如图 56.3.1.1 所示:
使用 configure 进行配置,命令如下:
./configure
结果如图 56.3.1.2 所示:
配置完成后,使用下面的命令进行编译:
make CC=arm-linux-gnueabihf-gcc
“CC=arm-linux-gnueabihf-gcc”指定编译器,和开发板 Linux 内核使用同一个编译器。
编译完成如图 56.3.1.3 所示:
编译完成后,分别在 chat、pppd、pppdump、pppstats 四个目录下生成 chat、pppd、pppdump、pppstats可执行文件,用于后面的 4G 模块联网测试。
56.3.2 EC20 4G 模块联网测试
首先安装好 EC20 4G 模块、天线和 SIM 卡,如图 56.3.2.1 所示:
开发板准备好后启动 Linux 系统,待系统启动后,进入/etc 目录,然后创建 ppp 目录,具体命令如下:
cd /etc //进入 etc 目录
mkdir ppp //创建 ppp 目录
目录创建完后,使用 U 盘将上一节编译的 chat、pppd、pppdump、pppstats 四个可执行文件拷贝到/etc/ppp目录下,如图 56.3.2.2 所示:
<ignore_js_op>
然后在/etc/ppp 目录下创建 pap-secrets 文件,使用下面命令:
touch pap-secrets //创建 pap-secrets 文件
vi pap-secrets //打开 pap-secrets 文件
输入如下内容:
# Secrets for authentication using PAP
# client server secret IP addresses
card * card *
在 4G 信号在通信时候有一个密码的比对,密码对了就可以通信了。上面显示用户是 card,密码是 card。
然后创建新文件夹 peers,命令“mkdir peers”。
进入 peers 文件夹,创建 wcdma 文件,命令如下:
touch wcdma
vi wcdma
输入如下内容:
# /etc/ppp/peers/wcdma
# This is pppd script for China liantong
# Usage: root>pppd call wcdma
hide-password
noauth
connect '/etc/ppp/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect'
disconnect '/etc/ppp/chat -s -v -f /etc/ppp/peers/wcdma-chat-disconnect'
debug
/dev/ttyUSB2
115200
defaultroute
noipdefault
novj
novjccomp
noccp
ipcp-accept-local
ipcp-accept-remote
local
lock
dump
nodetach
user "card"
password "card"
crtscts
remotename 3gppp
ipparam 3gppp
usepeerdns
需要注意的是使用/dev/ttyUSB2 设备节点文件。
“user "card"”和“password "card"”对应了 pap-secrets 文件中的用户名和密码。
创建 wcdma-chat-connect 文件:
touch wcdma-chat-connect
vi wcdma-chat-connect
内容如下:
ABORT "BUSY"
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
TIMEOUT 120
"" AT
OK \rATZ
OK \rAT+CGDCONT=1,"IP","3gnet",,0,0
OK-AT-OK ATDT*99#
CONNECT \d\c
在这里 OK \rAT+CGDCONT=1,"IP","3gnet",,0,0
OK-AT-OK ATDT*99#
这两句话会根据移动联通或者是电信而变化,这里用的是移动 4G。
创建 wcdma-chat-disconnect 文件:
touch wcdma-chat-disconnect
vi wcdma-chat-disconnect
内容如下:
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "INSending break to the modem\n"
""\k"
""+++ATH"
SAY "\nGood bye\n"
所需文件创建完成后,就可以进行联网测试了。
首先关闭 eth0 设备,因为和 EC20 4G 模块有冲突,同时只能使用一个设备。命令如下:
ifconfig eth0 down
然后在/etc/ppp 目录下输入指令:
./pppd call wcdma &
结果如图 56.3.2.3 所示:
上图表示联网成功后的 IP 地址为 10.47.135.182,使用 ifconfig 命令查看结果如图 56.3.2.4:
这时使用 ping 命令查看能够 ping 通外网,命令如下:
ping 202.108.22.5 -c 4
“-c”选项指定 ping 网络的次数。“202.108.22.5”是百度的 IP 地址,结果如图 56.3.2.5:
发现不能 ping 通外网,愿意是因为 DNS 没有设置对,在 etc 下有一个文件 resolv.conf 。这个文件是用来放 DNS 的。就是这个里面的域名没有设置对。然而在 eth0 的运行脚本里强制性的把这个文件复制为了192.168.1.1 。这就造成即便在这里文件里设置上正确的 DNS,再开机后也会发现这个文件里已经是192.168.1.1 了。这是因为 eth0,是开机自启动的。
我们在/etc 目录下新建一个文件 resolv.conf_back:
touch resolv.conf_back
vi resolv.conf_back
输入如下内容:
nameserver 202.99.160.68
nameserver 221.130.33.52
nameserver 221.130.33.60
nameserver 192.168.1.1
然后在新建一个脚本文件 ppp0:
touch ppp0
vi ppp0
输入如下内容:
#!/bin/sh
ifconfig eth0 down
cp /etc/resolv.conf_back /etc/resolv.conf
/etc/ppp/pppd call wcdma&
修改 ppp0 文件的执行权限:
chmod 777 ppp0
这里第一步是将 eth0 关掉,第二步将我们的 DNS 文件覆盖到 resolv.conf 上,第三步运行。然后重新开机,执行 ppp0 脚本,命令如下:
/etc/ppp0
脚本执行成功后,重新使用 ping 命令,结果如图 56.3.2.6 所示:
图片显示可以正常 ping 通百度的 IP 地址。至此 EC20 4G 模块就可以正常使用了。