1.实验目的:
实现4G模块EC20在linux系统下的拨号上网(Linux最小系统)
2.实验平台:
迅为4412开发板。EC20带有UART和USB接口,向linux内核添加4G模块的驱动和PPP协议的支持,然后编译内核并下载到开发板。
3.实验流程:
(1)驱动实现:主要就是模块的 USB VID和PID,这个我是把模块插到开发板上,使用lsusb得到:
a.把它加到Linux源码的drivers/usb/serial/option.c文件里,
#define EC20_VID 0x1E0E
#define EC20_PID 0x9001
b.在 option_ids 列表中增加
{ USB_DEVICE(EC20_VID, EC20_PID)},
c.make menuconfig 配置:
USB相关:
[*] Device Drivers →
[*] USB Support →
[*] USB Serial Converter support →
[*] USB driver for GSM and CDMA modems
PPP相关:(和PPP相关的,我都选上了)
[*] Device Drivers →
[*] Network device support →
[*] PPP (point-to-point protocol) support
……….
d.保存退出,执行make
在arch/arm/boot目录下得到zImage文件,烧写到开发板
4.调试
a.插上模块,在/dev/目录下可以看到映射出来的虚拟串口,证明驱动已经起作用了
b.用at指令测试
先执行:cat /dev/ttyUSB2 & (后台将AT测试口打开)
下面测试:发送AT,返回OK,模块响应
测试信号强度:发送AT_CSQ,返回的信号正常
c.拨号
1.拨号上网脚本wcdma:
#/etc/ppp/peers/wcdma
# Usage:root>pppd call wcdma
# Hide password in debug messages
hide-password
# The phone is not required to authenticate
noauth
# The chat script (be sure to edit that file,too!)
connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect' #制定了要使用的chat脚本的位置。加上参数-v 告诉 chat命令将其所有的输出/入拷贝到系统记录里(通常是 /var/log/messages)。
# The close script(be sure to edit that file,too!)
disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-disconnect'
# Debug info from pppd
debug #加入调试信息
# Serial Device to which the HSPDA phone is connected
/dev/ttyUSB3 #指定连接使用的设备
# Serial port line speed
115200 #设置连接使用的控制字符传输速率
# If you want to use the HSDPA link as your gateway
defaultroute #使用默认线路
# pppd must not propose any IP address to the peer
noipdefault #不使用默认IP就可以加入参数noipdefault
# No ppp compression
novj
novjccomp
noccp
ipcp-accept-local #要求peer也就是isp给自己分配动态的IP地址
ipcp-accept-remote
local
# For sanity, keep a lock on the serial line
lock #则创建一个锁定文件,其他程序在发现存在这个文件后,就能得知相应的串口已经被使用。
dump
# Keep pppd attached to the terminal
# Comment this to get daemon mode pppd
nodetach
user
password
# Hardware flow control
crtscts #告诉ppp使用modem的硬件流量控制
remotename 3gppp
ipparam 3gppp
# Ask the peer for up to 2 DNS server addresses
usepeerdns #使用服务器端协商的DNS
2.chat脚本 (wcdma-chat-connect)
ABORT "BUSY"
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
TIMEOUT 120
"" AT
OK \rATZ
# Connection to the network
OK \rAT+CGDCONT=1,"IP","3gnet",,0,0
# Dial the number
OK-AT-OK ATDT*99#
CONNECT \d\c
3.断开连接(wcdma-chat-disconnect)
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\NSending break to the modem\n"
""\k"
""+++ATH"
SAY "\nGood bay\n"
将以上三个脚本放到/etc/ppp/peers 目录下
d.与拨号相关的chat 和 pppd 命令
通过下载ppp源码编译得到(见我的SIM7100C的拨号上网),我直接拿过来用了,没问题。
e.执行pppd call wcdma & 后台运行拨号
现象:(拨号成功反馈的信息)
[root@iTOP-4412]# pppd call wcdma &
[2]- Done(8) pppd call wcdma
[root@iTOP-4412]# pppd options in effect:
debug # (from /etc/ppp/peers/wcdma)
nodetach # (from /etc/ppp/peers/wcdma)
dump # (from /etc/ppp/peers/wcdma)
noauth # (from /etc/ppp/peers/wcdma)
user password # (from /etc/ppp/peers/wcdma)
remotename 3gppp # (from /etc/ppp/peers/wcdma)
/dev/ttyUSB3 # (from /etc/ppp/peers/wcdma)
115200 # (from /etc/ppp/peers/wcdma)
lock # (from /etc/ppp/peers/wcdma)
connect /usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect # (from /etc/ppp/peers/wc[ 1940.106179] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
disconnect /usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-disconnect # (from /etc/ppp/peers/wcdma)
crtscts # (from /etc/ppp/peers/wcdma)
local # (from /etc/ppp/peers/wcdma)
hide-password # (from /etc/ppp/peers/wcdma)
novj # (from /etc/ppp/peers/wcdma)
novjccomp # (from /etc/ppp/[ 1940.138165] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
peers/wcdma)
ipcp-accept-local # (from /etc/ppp/peers/wcdma)
ipcp-accept-remote # (from /etc/ppp/peers/wcdma)
ipparam 3gppp # (from /etc/ppp/peers/wcdma)
noipdefault # (from /etc/ppp/peers/wcdma)
defaultroute # (from /etc/ppp/peers/wcdma)
usepeerdns # (from /etc/ppp/peers/wcdma)
n[ 1940.170197] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
occp # (from /etc/ppp/peers/wcdma)
abort on (BUSY)
abort on (NO CARRIER)
abort on (NO DIALTONE)
abort on (ERROR)
abort on (NO ANSWER)
timeout set to 120 seconds
send (AT^M)
expect (OK)
AT^M^M
OK
-- got it
send (^MATZ^M)
expect (OK)
^M
ATZ^M^M
OK
-- got it
send (^MAT+CGDCONT=1,"IP","3gnet",,0,0^M)
[ 1940.234165] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
[ 1940.266165] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
expect (OK)
^M
AT+CGDCONT=1,"IP","3gnet",,0,0^M^M
OK
-- got it
send (ATDT*99#^M)
[ 1940.586185] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
expect (CONNECT)
^M
ATDT*99#^M^M
CONNECT
-- got it
send (\d)[ 1940.682171] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
[ 1940.714162] option_instat_callback: line=1423(status OK).161, 32, 0, 3, 2
Script /usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect finished (pid 18383), status = 0x0
Serial connection established.
using channel 2
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB3
sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0x41dfbd79> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x3 <asyncmap 0x0> <auth chap MD5> <magic 0x4579c9d9> <pcomp> <accomp>]
No auth is possible
sent [LCP ConfRej id=0x3 <auth chap MD5>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0x41dfbd79> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x4 <asyncmap 0x0> <magic 0x4579c9d9> <pcomp> <accomp>]
sent [LCP ConfAck id=0x4 <asyncmap 0x0> <magic 0x4579c9d9> <pcomp> <accomp>]
sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [LCP DiscReq id=0x5 magic=0x4579c9d9]
rcvd [IPCP ConfReq id=0x2]
sent [IPCP ConfNak id=0x2 <addr 0.0.0.0>]
rcvd [IPCP ConfNak id=0x1 <addr 10.50.224.88> <ms-dns1 123.123.123.123> <ms-dns2 123.123.123.124>]
sent [IPCP ConfReq id=0x2 <addr 10.50.224.88> <ms-dns1 123.123.123.123> <ms-dns2 123.123.123.124>]
rcvd [IPCP ConfReq id=0x3]
sent [IPCP ConfAck id=0x3]
rcvd [IPCP ConfAck id=0x2 <addr 10.50.224.88> <ms-dns1 123.123.123.123> <ms-dns2 123.123.123.124>]
Could not determine remote IP address: defaulting to 10.64.64.64
not replacing existing default route via 192.168.1.1
local IP address 10.50.224.88
remote IP address 10.64.64.64
primary DNS address 123.123.123.123
secondary DNS address 123.123.123.124
f.[root@iTOP-4412]# ifconfig (查看网络IP)
g.下面要ping 通IP和域名还需相关设置(这部分也见SIM7100C在Linux的拨号上网,配置是一样的)。
到此,Linux下的拨号测试就成功了。
================================================================
在ARM平台上实现4G模块的PPP拨号上网,参考网上的资料和自己的理解,从一无所知到开发完成花了一周多。最后看到ARM板ping通www.baidu.com时甚是高兴,现将此过程整理如下。当然,除此之外要做的工作还有很多。
4G模块使用的SIMTECH 的SIM7100C,SIM7100C带有UART和USB接口,在考虑速度上我们使用USB接口和ARM进行通信。所以向linux内核添加3G模块的驱动(USB转串口驱动)和PPP协议的支持,然后编译内核并下载到开发板。
1. 编译内核
◇ 大容量存储驱动
> Device Drivers > USB support
make ARCH=arm menuconfig配置USB驱动:
<*> USB Mass Storage support
[*] USB Mass Storage verbose debug
<*> Realtek Card Reader support
[*] Realtek Card Reader autosuspend support
<*> Datafab Compact Flash Reader support
◇ USB驱动
> Device Drivers > USB support
<*> Inventra Highspeed Dual Role Controller (TI, ADI, ...)
MUSB Mode Selection (Dual Role mode) --->
<*> Platform Glue Layer (TI DSPS platforms) --->
MUSB DMA mode (Disable DMA (always use PIO)) --->
<*> USB Serial Converter support --->
[*] USBGeneric Serial Driver
<*> USBdriver for GSM and CDMA modems
◇ 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
<*> SLIP (serial line) support
[*] CSLIP compressed headers
2. 交叉编译libusb
下载usblib库和libusb-compat
https://sourceforge.net/projects/libusb/files/
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# mkdir install
configure: error: "udev support requested but libudev not installed"(解决:添加--disable-udev)
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# ./configure --host=arm-none-linux-gnueabi --prefix=/opt/usb-tools/libusb-1.0.20/install --disable-udev
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# make
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# make install
添加环境变量 http://www.linuxidc.com/Linux/2011-03/33432.htm(PKG_CONFIG_PATH设置)
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# export PKG_CONFIG_PATH=/opt/usb-tools/libusb-1.0.20/install/lib/pkgconfig:$PKG_CONFIG_PATH
root@zhaoxc-VBox:/opt/usb-tools/libusb-1.0.20# echo $PKG_CONFIG_PATH
编译libusb-compat:
root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.5# ./configure --host=arm-none-linux-gnueabi --prefix=/opt/usb-tools/libusb-compat-0.1.5/install
root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.5# make
root@zhaoxc-VBox:/opt/usb-tools/libusb-compat-0.1.5# make install
将生成的libusb-1.0.20和libusb-compat-0.1.5下的库文件复制到ARM板上的linux的/lib下面即可。
3. 交叉编译4G模块驱动
交叉编译GobiSerial.c(ARCH=arm CC=arm-none-linux-gnueabi-gcc),得到GobiSerial.ko。复制到ARM板安装驱动
#insmod GobiSerial.ko
4. 查看驱动运行状况
插上4G模块,虚拟出6个ttyUSB,它们分别是:
root@am335x-evm:/# ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3 /dev/ttyUSB4 /dev/ttyUSB5
1) /dev/ttyUSB0-diag port for output developing messages
2) /dev/ttyUSB1- NMEA port for GPS NMEA data output
3) /dev/ttyUSB2-AT port for AT commands
4) /dev/ttyUSB3-Modem port for ppp-dial
5) /dev/ttyUSB4-audio port
6) /dev/ttyUSB5-Virtual Net card
插上U盘,提示设备运行:
[75097.986054] usb 2-1: New USB device found, idVendor=058f, idProduct=6387
[75097.993167] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[75098.000689] usb 2-1: Product: Mass Storage
[75098.004995] usb 2-1: Manufacturer: Generic
[75098.009342] usb 2-1: SerialNumber: AC3DF2EE
[75098.024341] usb-storage 2-1:1.0: USB Mass Storage device detected
[75098.049922] scsi0 : usb-storage 2-1:1.0
lsusb命令查看结果:
Bus 001 Device 002: ID 1e0e:9001
Bus 002 Device 002: ID 058f:6387
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 001: ID 1d6b:0002
5. 交叉编译PPP
参见:http://blog.sina.com.cn/s/blog_7880d3350102wb3e.html
6. 拨号脚本设置
root@am335x-evm:/etc/ppp# vi gprs-connect-chat
#Chat script for China Mobile, used SIMCOM sim4100 TD module.
TIMEOUT 15
ABORT "DELAYED"
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
ABORT "NO CARRIER"
TIMEOUT 40
'' \rAT
OK ATS0=0
OK ATE0V1
OK AT+CGDCONT=1,"IP","CMNET"
OK AT+CGEQREQ=1,2,128,384,,,0,,,,,,
OK ATDT*99*1#
CONNECT
root@am335x-evm:/etc/ppp/peers# vi gprsdial
#/etc/ppp/peers/gprsdial
# This is pppd script for China Mobile, used SIMCOM SIM7100 Module
# Usage: root>pppd call gprs
#Interface should be used is the interface which connects physics interface of S
/dev/ttyUSB3
115200
crtscts
modem
#noauth
debug
nodetach
#hide-password
usepeerdns
noipdefault
defaultroute
user "cmnet"
0.0.0.0:0.0.0.0
#ipcp-accept-local
#ipcp-accept-remote
#lcp-echo-failure 12
#lcp-echo-interval 3
#noccp
#novj
#novjccomp
#persist
connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat'
#disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'
6. 拨号
root@am335x-evm: pppd call gprsdial
6. 测试
拨号之后进行测试,发现可以ping通ip但是无法ping通域名。这需要设置/etc/resolv.conf来添加DNS解析服务器的地址
文件/etc/resolv.conf配置DNS客户,它包含了主机的域名搜索顺序和DNS服务器的地址,每一行应包含一个关键字和一个或多个的由空格隔开的参数。下面是一个例子文件:
domain test.com
search www.test.com test.com
nameserver 202.96.128.86
nameserver 202.96.128.166
nameserver #定义DNS服务器的IP地址
domain #定义本地域名
search #定义域名的搜索列表
sortlist #对返回的域名进行排序
主要是nameserver关键字,如果没指定nameserver就找不到DNS服务器,其它关键字是可选的。
我这里只设置了两个DNS,如下:
ameserver 114.114.114.114
nameserver 8.8.8.8
参考文档:
How to use the SIM7100 module in Linux.pdf
http://blog.csdn.net/hanmengaidudu/article/details/17099737
http://www.linuxidc.com/Linux/2011-03/33430p2.htm
http://www.linuxidc.com/Linux/2011-03/33430.htm
------------------------------------------我是分割线---------------------------------------------
2016.11.25对以上部分脚本进行了补充注释,更方便理解【作者:从入门到放弃】
PPP协议的三组件包括PPP协议的封装方式、LCP协议和NCP协议。拨号成功需要一个建立过程,需要拨号双方根据协议规则进行的多个交互过程。
PPP介绍参考文章:http://blog.sina.com.cn/s/blog_7880d3350102wr3z.html
拨号配置的注释如下:
#/etc/ppp/peers/gprsdial
# This is pppd script for China Mobile, used SIMCOM SIM7100 Module
# Usage: root>pppd call gprs
#Interface should be used is the interface which connects physics interface of SIM7100 Module.
/dev/ttyUSB3 //Modem port for ppp-dial
115200 //通信波特率
crtscts //接口带硬件流控
modem //使用数据机控制线路。这个选项是默认的。硬体流控,pppd将等待CD信号。
#noauth //不需要对方验证自己
debug //把调试信息输出到/var/log/messages
nodetach //不后台运行,默认是后台运行的
#hide-password //写log内容时不包括密码字符串,这个参数是默认的
usepeerdns //选中这个选项,从对方请求两个DNS地址. 对方提供的地址传给文件/etc/ppp/ip-up中的环境变量DNS1和DNS2,将环境变量USEPEERDNS设置成1. 而且pppd将创建一个文件/etc/ppp/resolv.conf file,其中一个或两个服务器行包括由对方提供的地址。
noipdefault //关闭在没有指定本地IP位址时所进行的预设动作,这是用来由从主机名称决定(如果可能的话)本地IP位址。加上这个选项的话,彼端将必须在进行IPCP协商时(除非在指令行或在选项档中明确地指定它)提供本地的IP地址。
defaultroute //当 IPCP 协商完全成功时, 增加一个预设递送路径到系统的递送表,将彼端当作闸道器使用。这个项目在 ppp 连线中断後会移除。
user "cmnet" //设置由对方验证本地系统的用户名。
0.0.0.0:0.0.0.0
#ipcp-accept-local //加上这个选项的话,pppd将会接受彼端对於本地IP位址的意见,即使本地的IP位址已经在某个选项中指定。
#ipcp-accept-remote //加上这个选项的话,pppd将会接受彼端对於它的IP位址的意见,即使远端的IP位址已经在某个选项中指定。
#lcp-echo-failure 12 //如果有给这个选项,那麽如果传送n个LCP回应要求没有接收到有效的LCP回应回覆的话pppd将会推测彼端是死掉的。如果发生这种情形,pppd将会终结该连线。这个选项的使用要求一个非零的lcp-echo-interval参数值。这个选项可以用在硬体数据机控制线路无法使用的情况下当实际连线被中断之後(e.g.,数据机已经挂断)终结 pppd的执行。
#lcp-echo-interval 3 //如果有给这个选项,pppd每秒将会送出一个LCP回应要求(echo-request)封包(frame)给彼端。在Linux系统下,回应要求在n秒内没有从彼端接收到封包时会被送出。一般彼端应该以传送一个回应回覆(echo-reply)来反应该回应要求。这个选项可以与lcp-echo-failure选项一起使用来侦测不再连线的彼端。
#noccp //关闭压缩控制协议协商。若对方有漏洞会被来自PPPD的压缩控制协议协商请求干扰的情况下,需要设置该选项。
#novj //选中这个选项,将关闭双方的Van Jacobson形式TCP/IP报文头压缩
#novjccomp //选中这个选项,将关闭Van Jacobson形式TCP/IP报文头压缩中的连接ID压缩。Pppd将忽略来自Van Jacobson形式压缩TCP/IP报文头中的连接ID字节,也不要求对方这样作。
#persist //连接中断后不退出,而是重新打开连接。
connect '/usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat' //[博文作者:从入门到放弃]
#disconnect '/bin/chat -v -f /etc/ppp/gprs-disconnect-chat'
正常拨号的过程打印输出:
timeout set to 15 seconds
abort on (DELAYED)
abort on (BUSY)
abort on (ERROR)
abort on (NO DIALTONE)
abort on (NO CARRIER)
timeout set to 40 seconds
send (^MAT^M)
expect (OK)
AT^M^M
OK
-- got it
send (ATS0=0^M)
expect (OK)
^M
ATS0=0^M^M
OK
-- got it
send (ATE0V1^M)
expect (OK)
^M
ATE0V1^M^M
OK
-- got it
send (AT+CGDCONT=1,"IP","CMNET"^M)
expect (OK)
^M
^M
OK
-- got it
send (AT+CGEQREQ=1,2,128,384,,,0,,,,,,^M)
expect (OK)
^M
^M
OK
-- got it
send (ATDT*99*1#^M)
expect (CONNECT)
^M
^M
CONNECT
-- got it
Script /usr/sbin/chat -s -v -f /etc/ppp/gprs-connect-chat finished (pid 1633), status = 0x0
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB3
Warning - secret file /etc/ppp/pap-secrets has world and/or group access
sent [LCP ConfReq id=0x1 ]
rcvd [LCP ConfReq id=0x0 ]
No auth is possible
sent [LCP ConfRej id=0x0 ]
rcvd [LCP ConfAck id=0x1 ]
rcvd [LCP ConfReq id=0x1 ]
sent [LCP ConfAck id=0x1 ]
sent [CCP ConfReq id=0x1 ]
sent [IPCP ConfReq id=0x1 ]
rcvd [LCP DiscReq id=0x2 magic=0x451b7dc9]
rcvd [LCP ProtRej id=0x3 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
Protocol-Reject for 'Compression Control Protocol' (0x80fd) received
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 ]
rcvd [IPCP ConfRej id=0x1 ]
sent [IPCP ConfReq id=0x2 ]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfNak id=0x2 ]
sent [IPCP ConfReq id=0x3 ]
rcvd [IPCP ConfAck id=0x3 ]
Could not determine remote IP address: defaulting to 10.64.64.64
local IP address 10.19.25.49
remote IP address 10.64.64.64
primary DNS address 211.136.112.50
secondary DNS address 211.136.150.66
Script /etc/ppp/ip-up started (pid 1639)
Script /etc/ppp/ip-up finished (pid 1639), status = 0xff
================================================================
一 开发环境简介
内核版本 3.19.5、3.15(这2个我都试过)
编译环境 Ubuntu 12.04
3g模块 华为MU709s
SIM卡 联通
二 主要步骤
向linux内核中添加3G模块驱动(USB转串口的option驱动)和ppp网络协议的支持
交叉编译ppp-2.4.2源代码
将拨号上网所需的两个应用程序pppd和chat拷贝到开发板/usr/sbin文件夹下,
编写ppp拨号脚本wcdma、wcdma-chat-connect、wcdma-chat-disconnect并存放在/etc/ppp/peers目录下。将DNS写入到/etc/resolv.conf文件中
执行“pppd call wcdma”命令进行拨号
三 配置3G模块驱动和ppp网络协议栈
可参考资源文档,华为模块Linux内核驱动集成指导-(V100R001_V2.0, Chinese) .pdf
也可按照以下步骤操作
首先进入make menuconfig界面
1 配置3G模块驱动
图 1
如图1首先选择Device Drivers
图2
如图2进入USB support
图 3
进入USB support之后一直往下直到找到图3并选择USB转串口
图4
最后选择USB driver for GSM and CDMA modems到此3G卡驱动已经添加完毕
主要是添加了driver/usb/serial/option.c和driver/usb/serial/usb_wwan.c
两个文件,尽管驱动添加了,但是这仅仅只是一个usb转串口驱动,并不能作为网络设备直接使用,此时就需要ppp网络协议的支持,他将ttyUSB*等设备模拟成网络设备使用也即(/dev/ttyUSB0<---->ppp0)
2 添加ppp协议
同样也是进入make menuconfig界面
图5
首先同样也是进入驱动配置界面Device Drivers
图6
如图6选择网络设备支持
如图7选择ppp
到这一步驱动和协议就都已经配置成功了接下来就是编译下载到板子
查看开发板Dev目录
[root@gooagoo ~]# ls /dev/ttyUSB
ttyUSB0 ttyUSB1 ttyUSB2 ttyUSB3
四 编写ppp拨号脚本
由于该拨号脚本需要使用chat,pppd,等命令,所以需要下载ppp-2.4.4
下载成功之后首先便是编译
1 编译 ppp-2.4.4
一般都很好编过,只是可能会依赖libpcap-1.6.2.tar.gz 这个库,zlib 库。编译过程中如果出现 关于libcrypt.so这样的错误,就把你的编译工具目录下的/usr/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/libcrypt.so 这个库复制到 /usr/local/lib/ 下即可。
编译成功后将编译生成的chat,pppd,等命令拷贝到板子文件系统的/usr/sbin目录下边去
2 编写拨号脚本
在板子文件系统/etc/ppp/peers目录下边创建三个文件如下
wcdma,chat-wcdma-connect,chat-wcdma-disconnect
wcdma配置文件内容
debug
nodetach
/dev/ttyUSB0
115200
usepeerdns
noauth
noipdefault
novj
novjccomp
noccp
defaultroute
ipcp-accept-local
ipcp-accept-remote
connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/chat-wcdma-connect'
disconnect '/usr/sbin/chat -s -v -f/etc/ppp/peers/chat-wcdma-disconnect'
wcdma-chat-connect配置文件内容
TIMEOUT 5
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NODIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' \rAT
OK \rATZ
OK \rAT+CGDCONT=1,"IP","3GNET",,0,0
OK-AT-OK ATDT*99#
CONNECT \d\c
wcdma-chat-disconnect配置文件内容
ABORT"ERROR"
ABORT "NODIALTONE"
SAY"\nSending break to the modem\n"
'' "\K"
''"+++ATH"
SAY"\nGoodbay\n"
创建好拨号脚本之后就是正式拨号了
pppd call wcdma&
加上&符号主要是因为拨号成功后,程序会一直执行不退出,所以采用后台运行的方式执行,pppd call wcdma是作用是建立协议,并生成网络接口ppp0。也可以修改WCDMA脚本#nodetach,再执行命令pppd call wcdma就可以在后台运行了。
如果出现以下现象:
表示拨号成功。
3、测试网络连通情况
Ping -I ppp0 www.baidu.com -c 5 -i 1 出现超时
Route查看路由表
默认网关是eth0,删除默认网关route del deflaut 。添加ppp0为默认网关 route add default dev ppp0。手工添加DNS echo "nameserver 123.123.123.124" > /etc/resolv.conf
Ping -I ppp0 www.baidu.com -c 5 -s 1
网络通信正常
五 、实现自动拨号
在拨号脚本里面添加 persist #--- 永久链接(自动重拨) 配置项,pppd就会自动拨号(前提是pppd这个进程没有死掉)
在pppd源码ipcp.c里面 可以看到
拨号成功会获得2个DNS,
之后拷贝DNS到 /etc/resolv.conf
有时还需要指定默认网关
主要写了2个脚本文件,一个是配置脚本init.sh,内容如下:
route del default
route add default dev ppp0
ifconfig eth0 down
ifconfig eth0 hw ether 00:12:34:56:78:90
ifconfig eth0 up
另一个是自动拨号脚本pp.sh,主要保证拨号进程不会终止。内容如下:
dns1="61.135.169.121" #baidu
dns2="61.135.157.156" #qq
pppd call wcdma &
sleep 12
/root/init.sh
while true
do
ping -s 1 -c 5 $dns1 #¦…去PING第一个DNS
if [ "$?" != "0" ] #€¦…假如PING不通
then
ping -s 1 -c 2 $dns2 #…去PING第二个DNS
if [ "$?" != "0" ] #¦…假如PING不通
then
killall pppd #¦…结束PPPD进程
pppd call wcdma & #…再去拨号
sleep 12 #€¦…等2s
else
sleep 5 ’
fi
else
sleep 120 # )
fi
done
有了这个脚本,就可以放心的上网了。
有些人还想实时获取拨号上网的信号强度。这里有2种方法。
1、通过microcom -s 115200 /dev/ttyUSB0 这种方式要用 Ctrl+x 来退出!
输入 at+csq
at+csq
+CSQ: 11,99
OK
可以看到信号强度是11。
2、还可以写个程序,通过ttyUSB2来发送 at+csq命令,注意这个命令要以\r\n结束,如下所示: