一、开发环境
环境
详细
3G
模块
ZTE MF190
(中兴)
SIM
卡
中国联通
3G卡
嵌入式
Linux内核
Linux (none) 3.0.8
开发环境
Ubuntu10.10
二、开发步骤
修改内核配置,并重新编译
内核配置增加
usb转串口的驱动,配置成模块。
内核配置增加
ppp协议支持
重新编译烧写内核
编译
usb_modeswitch
交叉编译
usb_modeswitch,并把可执行文件和配置文件拷贝到开发板上
编译
ppp和编译拨号脚本文件
交叉编译
ppp,并把可执行文件和配置文件拷贝到开发板上
验证
usb转串口是否成功
这部很关键,如果转串口没有成功或者使用的不是
ttyUSB0会使后面的ppp拨号不成功。
运行
pppd
pppd call wcdma-call
三、详细开发步骤
1、内核中增加usb转串口的驱动,配置成模块。增加ppp协议支持。重新交叉编译并下载到开发板上。
1.1 增加ppp协议支持
清除内核配置文件:
make ARCH=arm CROSS_COMPILE=arm-linux- clean
CROSS_COMPILE=arm-linux- 这个要根据自己arm编译器的名字
配置内核:
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
进入
Device Drivers-->
Network device support-->
<*>PPP (point-to-point protocol) support
选择所有的PPP
协议
ppp
协议配置完成
1.2、增加usb转串口的驱动模块,编译为模块
使其选中对
USB转串口的支持
进入
Device Drivers-->USB support-->USB Serial Converter support 选中USB Deiver for GSM and CDMA Modems
到此
3G卡驱动已经添加完。
注:本人这里把USB转串口驱动配置成模块,看个人需求也可配置成编译到内核中。
接着要修改
option.c文件,在linux-3.0.y/drivers/usb/serial目录下,然后找到
static const struct usb_device_id option_ids[] = {
}
向这里面增加我们的3G模块设备信息,(有可能你的设备信息已经存在)
本人的
3G设备信息添加如下:
#define ZTE_VENDOR_ID 0x19d2 //代码中已经定义 厂家ID
#define ZTE_PRODUCT_MF190 0x2000 //本人3G模块的设备ID
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF190) },
解释这两个参数的意义:
ZTE_VENDOR_ID
:厂家ID(这是中兴厂家的ID号)
ZTE_PRODUCT_MF190
:本人3G模块设备ID号
那么如何得知这两个ID号呢?
把
3G设备插入开发板上使用 lsusb 命令就可看到两个ID号
# lsusb
Bus 001 Device 001: ID 1d6b:0002
Bus 002 Device 001: ID 1d6b:0001
Bus 001 Device 002: ID 19d2:2000
到这里所有内核的配置都完成。
重新编译内核:make ARCH=arm CROSS_COMPILE=arm-linux- uImage
编译模块:make ARCH=arm CROSS_COMPILE=arm-linux- modules
//因为本人把驱动配置成模块所以这里需要编译模块。在linux-3.0.y/drivers/usb/seria目录下会出现三个驱动模块
把这三个驱动复制到开发板上,本人复制开发板路径
/lib/modules/3.0.8/serial下
在系统启动脚本中添加驱动加载,在/etc/init.d/rcS中添加下面几行
insmod /lib/modules/3.0.8/seria/usbserial.ko maxRSize=16384 maxWSize=512 maxISize=64 ##设置缓冲大小,挺高速度。
nsmod /lib/modules/3.0.8/seria/usb_wwan.ko
nsmod /lib/modules/3.0.8/seria/option.ko
加载完驱动后
/dev目录下出现ttyUSB0 ttyUSB1 ttyUSB2那么恭喜你usb转串口已经成功。
问题:
(1)、加载完驱动后
/dev目录下没有出现ttyUSB0 ttyUSB1 ttyUSB2
查看设备:
cat /proc/devices
如果没有ttyUSB
那么加载驱动有问题,查看option.c
文件添加的设备ID是否有错误
如果有
ttyUSB跳到(
问题解决一)
2、测试转出的串口是否可用
使用
Linux串口代码进行测试。本人测试代码链接:http://download.csdn.net/detail/lin_jianbin/8339773
分别打开串口ttyUSB0 ttyUSB1 ttyUSB2
发送字符串数据“
AT
” 或者十六进制数据 0x41 0x54 0x0D 0x0A 如果接收到数据为OK表示成功
测试出成功的设备比如ttyUSB0
后面配置需要使用到。(不是所有的设备都是使用ttyUSB0发送和接收数据的)所以这需要测试。
3、交叉编译pppd,移植
下载路径:
ftp://ftp.samba.org/pub/ppp/
本人下载的是ppp-2.4.5.tar.gz
解压:tar -zvxf ppp-2.4.5.tar.gz
进目录:cd ppp-2.4.5
配置:./configure 生成Makefile
文件
编译:
make CC=arm-liunx-gcc AR=arm-liunx-ar LD=arm-liunx-ld STRIP=arm-liunx-strip
成功后会在
pppd目录下生成可执行文件pppd,chat目录下生成可执行文件chat
创建拨号的配置文件
在
/etc.ppp/目录下创建文件 wcdma-chat 内容如下:
TIMEOUT 15
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
"" 'AT'
OK 'ATDT*99#'
CONNECT
在
/etc.ppp/目录下创建文件 disconnect-chat 内容如下:
ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "/nSending break to the modem/n"
'' "/K"
'' "+++ATH"
SAY "/nGoodbye/n"
在
/etc.ppp/目录下创建文件 wcdma-call 内容如下:
debug
lock
nodetach
/dev/ttyUSB0 ###
这个要根据第二步测试成功的设备结点
115200
user "card"
password "card"
crtscts
show-password
usepeerdns
noauth
noipdefault
novj
novjccomp
noccp
defaultroute
ipcp-accept-local
ipcp-accept-remote
connect '/usr/sbin/chat -v -t3 -f /etc/ppp/chat/wcdma-connect'
disconnect '/usr/sbin/chat -s -v -f /etc/ppp/chat/disconnect'
pppd
配置参数可参考:
http://blog.csdn.net/hens007/article/details/7255455
这里的配置文件是针对联通
3G卡的,如果需要支持其他的SIM卡可更改这些配置。
移植:
/pppd/pppd
拷贝到开发板 /usr/sbin
/chat/chat
拷贝到开发板 /usr/sbin
/etc.ppp/
目录下的文件 chap-secrets options pap-secrets 拷贝到开发板 /etc/ppp目录下
/etc.ppp/
目录下的文件 wcdma-chat disconnect-chat 拷贝到开发板
/etc/ppp/chat目录下
/etc.ppp/
目录下的文件 wcdma-call 拷贝到开发板
/etc/ppp/peers目录下
到这里开发板移植完毕可到开发板上进行拨号:
#pppd call wcdma-call
Script /usr/sbin/chat -v -t3 -f /etc/ppp/chat/wcdma-connect finished (pid 891), status = 0x0
Serial connection established.
using channel 1
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB2
sent [LCP ConfReq id=0x1
]
rcvd [LCP ConfReq id=0x0 ]
sent [LCP ConfAck id=0x0 ]
rcvd [LCP ConfAck id=0x1 ]
sent [LCP EchoReq id=0x0 magic=0xfd880529]
rcvd [LCP DiscReq id=0x1 magicdc467]
rcvd [CHAP Challenge id=0x1 , name = "UMTS_CHAP_SRVR"]
sent [CHAP Response id=0x1 <606f317e42edafc7e3653ea6b>, name = "card"]
rcvd [LCP EchoRep id=0x0 magic=0x2bdc467 fd 88 05 29]
rcvd [CHAP Success id=0x1 ""]
CHAP authentication succeeded
CHAP authentication succeeded
sent [IPCP ConfReq id=0x1 ]
rcvd [IPCP ConfNak id=0x1 ]
sent [IPCP ConfReq id=0x2 ]
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 ]
rcvd [IPCP ConfRej id=0x2 ]
sent [IPCP ConfReq id=0x3 ]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfNak id=0x3 ]
sent [IPCP ConfReq id=0x4 ]
rcvd [IPCP ConfAck id=0x4 ]
Could not determine remote IP address: defaulting to 10.64.64.64
Cannot determine ethernet addresxy ARP
local IP address 10.30.208.139
remote IP address 10.64.64.64
primary DNS address 218.104.128.106
secondary DNS address 58.22.96.66
拨号成功
问题解决一
方法一:手动创建设备结点
mknod /dev/ttyUSB0 c 188 0
//188即使主设备号 如上的cat /proc/devices 可以得知。0 为次设备号。
mknod /dev/ttyUSB1 c 188 1
mknod /dev/ttyUSB2 c 188 2
测试创建的设备结点是否可用:
这种方法只能实现简单的测试,更为准确的测试最好用自己写的串口代码测试。
# cat /dev/ttyUSB0
cat: can't open 'ttyUSB0': No such device //表示设备结点不可用 只能用方法二。
方法二:使用usb_modeswitch
usb_modeswitch是对USB设备的工作模式进行转换,usb工作模式:usb存储模式,usb serial模式。
我们要把3G模块转为usb serial模式。
参考文章:http://blog.csdn.net/lin_jianbin/article/details/42520419