4G通信
使用有线网络或者 WIFI 有很多限制,因为要布线,即使是 WIFI 也得先布线,然后接个路由器。因此在不方便布线的场合,就可以通过 4G 连接到网络。下面介绍如何在 I.MX6U-ALPHA 开发板中使用 4G 来实现联网功能
一、4G网络连接
4G 模块一般都是 MiniPCIE 接口的,虽然用了 MiniPCIE 接口,但是实际上的通信接口都是 USB,所以 4G 模块的驱动就转换为了 USB 驱动。4G 模块厂商都提供了详细的文档讲解如何在 Linux 下使用 4G 模块,以及如何修改 Linux 内核加入 4G 模块驱动。
I.MX6U-ALPHA 开发板也有一个 MiniPCIE 形式的 4G 模块接口,虽然外形是 MiniPCIE 的,但是内心却是 USB 的。I.MX6U-ALPHA 开发板的 4G 模块原理图如下图所示:
由上图可以看出,U8 就是 MiniPCIE 接口,MiniPCIE 接口连接到了 GL850 这个 HUB 芯片的 DP2 和 DM2,也就是 GL850 的 USB2 接口上,U11 是 Nano SIM 接口
二、4G模块介绍
ME3630 4G 模块是深圳高新兴物联(前身是中兴物联)出品的 4G LTE 模块,是一款 LTE Cat.4 七模全网通 4G 模块,在 LTE 模式下可以提供 50Mbps 上行速率以及 150Mbps 的下行速率,并支持回退到 3G 或 2G 网络。其特性如下:
– 一路 USB2.0 接口
– 一路 UART 接口
– SIM 卡接口支持 1.8/3.0V
– 内置 TCP、 UDP、 FTP 和 HTTP 等协议
– 支持 RAS/ECM/NDIS
– 支持 AT 指令
ME3630 4G 模块有多种配置,这里主要使用到 ME3630 的数据通信功能,在使用 ME3630 4G 模块之前,需先将其插入到开发板的 MiniPCIE 座上、上紧螺、插入 Nano SIM 卡、接上天线,如下图:
三、4G模块实验
3.1 模块驱动修改
- 添加 USB 设备信息:Linux 源码的 drivers/usb/serial/option.c 文件中 option_ids 数组里添加 ME3630 的 PID 和 VID
{ USB_DEVICE(0x19d2, 0x0117) }, /* ME3630*/
{ USB_DEVICE(0x19d2, 0x0199) },
{ USB_DEVICE(0x19d2, 0x1476) },
- 添加 ECM 支持程序:支持 ECM 接口,可以通过该接口轻松联网。在 drivers/usb/serial/option.c 文件 option_probe 函数里面添加如下内容
/* EM3630 */
if (serial->dev->descriptor.idVendor == 0x19d2 &&
serial->dev->descriptor.idProduct == 0x1476 &&
serial->interface->cur_altsetting->desc. bInterfaceNumber == 3)
return -ENODEV;
if (serial->dev->descriptor.idVendor == 0x19d2 &&
serial->dev->descriptor.idProduct == 0x1476 &&
serial->interface->cur_altsetting->desc. bInterfaceNumber == 4)
return -ENODEV;
if (serial->dev->descriptor.idVendor == 0x19d2 &&
serial->dev->descriptor.idProduct == 0x1509 &&
serial->interface->cur_altsetting->desc. bInterfaceNumber == 4)
return -ENODEV;
if (serial->dev->descriptor.idVendor == 0x19d2 &&
serial->dev->descriptor.idProduct == 0x1509 &&
serial->interface->cur_altsetting->desc. bInterfaceNumber == 5)
return -ENODEV;
- 配置 Linux 内核:
使能 USBNET 功能
-> Device Drivers
-> -*- Network device support
-> USB Network Adapters
-> -*- Multi-purpose USB Networking Framework
使能 USB 串口 GSM、 CDMA 驱动
-> Device Drivers
-> [*] USB support
-> <*> USB Serial Converter support
-> <*> USB driver for GSM and CDMA modems
使能 USB 的 CDC ACM 模式
-> Device Drivers
-> [*] USB support
-> <*> Support for Host-side USB
-> <*> USB Modem (CDC ACM) support
- 编译 Linux 内核,然后使用新的 zImage 启动开发板。如果 ME3630 已经插上的话,系统启动以后就会输出如下信息
以上可见,ME3630 虚拟出了 3 个 USB 设备,分别为 ttyUSB0~ttyUSB2。ECM 模式下,可以通过运行
ifconfig -a
命令查看对应的网卡,名字可能为usbX/ecmX/ethX 等,如果存在的话就说明 ECM 接口驱动加载成功
3.2 PPP联网测试
- 使能 Linux 内核 ppp 功能:支持 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
- 移植 pppd 软件:通过 pppd 软件来实现 ppp 拨号上网
移植之前先删除掉/usr/sbin/chat 这个软件(Busybox制作根文件系统的时候生成的),因为移植pppd也会编译出 chat 软件,不删除的话会出错
将源码 ppp-2.4.7.tar.gz 拷贝到 Ubuntu 下并解压,进入解压后的文件夹进行配置编译
cd ppp-2.4.7/
./configure //配置
make CC=arm-linux-gnueabihf-gcc //编译
/************************************************/
/*若提示bison和flex "not found" 的话就安装这两个库*/
sudo apt-get install bison
sudo apt-get install flex
编译完成后会在当前目录下生成 chat/chat、pppd/pppd、pppdump/pppdump 和
pppstats/pppstats 这四个文件,将四个文件拷贝到开发板根文件系统中 /usr/bin 目录下
sudo cp chat/chat /home/andyxi/linux/nfs/rootfs/usr/bin/ -f
sudo cp pppd/pppd /home/andyxi/linux/nfs/rootfs/usr/bin/ -f
sudo cp pppdump/pppdump /home/andyxi/linux/nfs/rootfs/usr/bin/ -f
sudo cp pppstats/pppstats /home/andyxi/linux/nfs/rootfs/usr/bin/ -f
完成以后输入“pppd -v”查看版本号,如果 pppd 版本号显示正常就说明 pppd 移植成功
- ppp 上网测试
使用 pppd 进行拨号上网之前要先创建 4 个文件,这 4 个文件须放到同一个目录下。在开发板根文件系统下创建 /etc/gosuncn 目录
在 /etc/gosuncn 目录下,创建名为 “ppp-on” 的shell 脚本文件
#!/bin/sh
clear
OPTION_FILE="gosuncn_options"
DIALER_SCRIPT=$(pwd)/gosuncn_ppp_dialer
exec pppd file $OPTION_FILE connect "chat -v -f ${DIALER_SCRIPT}"
在 /etc/gosuncn 目录下,创建名为 “gosuncn_options” 的文件
/dev/ttyUSB2 //联通或移动卡用ttyUSB2,电信卡用ttyUSB0
115200
crtscts
modem
persist
lock
noauth
noipdefault
debug
nodetach
user Anyname //电信卡,要改为"user card"
password Anypassword //电信卡,要改为"password card"
ipcp-accept-local
ipcp-accept-remote
defaultroute
usepeerdns
noccp
nobsdcomp
novj
dump
在 /etc/gosuncn 目录下,创建名为 “gosuncn_ppp_dialer” 的文件
ABORT "NO CARRIER"
ABORT "ERROR"
TIMEOUT 120
"" ATE
SAY "ATE"
ECHO ON
OK ATH
OK ATP
//"3GNET"是联通卡的APN码,移动卡的话要改为"CMNET"
//若是电信卡,下面行要改为 OK "AT+ZCAPN=card,card"
OK AT+CGDCONT=1,\"IP\",\"3GNET\"
OK ATD*99# //电信卡,要改为"ATD#777"
CONNECT
在 /etc/gosuncn 目录下,创建名为 “disconnect” 的脚本文件
#!/bin/sh
killall pppd
最后还要给予 ppp-on 和 disconnect 这两个文件可执行权限
chmod 777 ppp-on disconnect
使用
./ppp-on &
命令连接 4G 网络,可能会出现如下问题
#提示不能创建“Can't create lock file /var/lock/LCK..ttyUSB2”
#检查根文件系统是否存在/var/run 和/var/lock,没有的话就创建这两个文件夹
mkdir /var/run //创建/var/run 文件夹
mkdir /var/lock //创建/var/lock 文件夹
#使用`./ppp-on &`命令重连后
#提示找不到“/etc/ppp/resolv.conf”这个文件,到相关目录下手动创建该文件
touch resolv.conf
创建完成后重启开发板!进入到/etc/gosuncn 目录,使用
./ppp-on &
命令完成拨号上网。成功后会生成名为“ppp0”的网卡
4G 网络测试需要关闭其他网卡,否则可能会有问题,但现在是通过网络启动的系统,且通过 NFS 挂载的根文件系统,因此无法关闭其他的网卡。为了解决这个问提,只能将 uboot、 Linux kernel、 .dtb 设备树和根文件系统都烧写到板子的EMMC 或 NAND 上,然后直接启动 EMMC 或 NAND 上的系统即可,这样就不需要其他网卡工作了。烧写方法请参考系统烧写一文。
系统烧写完成后设置开发板从 EMMC 启动,启动后按照前面的步骤先让 4G 模块连接上网络。确保当前开发板只有一个 ME3630 对应的 ppp0 网卡,最后直接 ping 百度官网即可,结果如下图示
3.3 ECM联网测试
对于支持 ECM 接口的模块可以直接通过 ECM 上网, ME3630 模块支持 ECM 接口,重启开发板,输入“ifconfig -a”命令可以看到有一个名为“usb0”的网卡,这个 usb0 网卡就是 ECM 接口对应的网卡
使用 minicom 输入AT 指令,先用 minicom 打开 ttyUSB1, ttyUSB1 就是 ME3630 的 AT 指令串口,波特率设置为 115200,然后依次输入如下指令:
输入 AT 指令:如果模块已经设置为 ECM 模式,则此不需要此步骤
AT+ZSWITCH=L
使用 AT 指令+CGDCONT 来设置数据参数
//联通卡的 APN 为 3GNET
//电信卡的 APN 为 CTNET
//移动卡的 APN 为 CMNET
AT+CGDCONT=1, "IP" , "CMNET"
发送连接 AT 命令
AT+ZECMCALL=1
连接成功以后打开 usb0 网卡,并获取 IP 地址
ifconfig usb0 up //打开 usb0 网卡
udhcpc -i usb0 //获取 IP 地址
IP 地址获取成功后,ping 一下百度官网,如果能 ping 通说明 ME3630 的 ECM 接口联网成功。如果提示“ bad address ‘www.baidu.com’”,可以检查一下 DNS 服务器地址设置是否正确,打开/etc/resolv.conf 文件,加入“nameserver 114.114.114.114”即可
3.4 GNSS定位测试
GNSS 功能,也就是 GPS 定位,在上面移植 ME3630 驱动时我们知道最终会出现3个 ttyUSB 设备,分别为 ttyUSB0~ttyUSB2,其中 ttyUSB1 为 GNSS 接口。 GPS 模块是串口输出的,因此可以直接使用 minicom 来查看 ttyUSB1 输出的 GNSS 信息。minicom配置如下:
minicom 打开串口时,有时会提示"/dev/ttyUSB1 is locked"的错误,是由于上次没有正确关闭 minicom,导致在 /var/lock 目录下存在LCK…XXX 文件 (XXX 就是具体的串口设备文件名,比如 ttyUSB1),进入"/var/lock" 下,删除该文件即可
ME3630 默认关闭 GNSS 定位输出功能的,必须先使用 AT 指令配置,minicom 打开串口后,输入如下AT指令进行配置:
ATI //查看固件信息
Manufacturer: GOSUNCNWELINK
Model: ME3630-W
Revision: ME3630C3CV1.0B03
IMEI: 864863045876287
OK
AT+ZGINIT //初始化 GPS
OK
AT+ZGPSEVENT=1 //使能 GPS 事件上报
OK
AT+ZGMODE=3 //设置定位模式
OK
AT+ZGPORT=0 //定位信息从 AT、 MODEM、 UART 三个口同时上报
OK
AT+ZGNMEA=31 //设置 GPS 数据为 NMEA 格式
OK
AT+ZGPSR=1 //使能 ZGPSR 数据
OK
AT+ZGRUN=2 //连续定位模式
OK
以上 AT 指令配置完成后 ME3630 就会开始搜星,注意: GPS 天线一定要放到室外! ME3630 搜星结束以后就会输出 NEMA 格式的定位信息