一、开发环境
环境 | 详细 |
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.youkuaiyun.com/detail/lin_jianbin/8339773
分别打开串口ttyUSB0 ttyUSB1 ttyUSB2
发送字符串数据“AT\r\n” 或者十六进制数据 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.youkuaiyun.com/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 <asyncmap 0x0> <magic 0xfd880529> <pcomp> <accomp>]
rcvd [LCP ConfReq id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0x2bdc467> <pcomp> <accomp>]
sent [LCP ConfAck id=0x0 <asyncmap 0x0> <auth chap MD5> <magic 0x2bdc467> <pcomp> <accomp>]
rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0xfd880529> <pcomp> <accomp>]
sent [LCP EchoReq id=0x0 magic=0xfd880529]
rcvd [LCP DiscReq id=0x1 magicdc467]
rcvd [CHAP Challenge id=0x1 <ca68bc26a4b9831b18cc10657e6fc731>, 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 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
rcvd [IPCP ConfNak id=0x1 <ms-dns1 10.11.12.13> <ms-dns2 10.11.12.14> <ms-wins 10.11.12.13> <ms-wins 10.11.12.14>]
sent [IPCP ConfReq id=0x2 <addr 0.0.0.0> <ms-dns1 10.11.12.13> <ms-dns2 10.11.12.14> <ms-wins 10.11. <ms-wins 10.11.12.14>]
rcvd [IPCP ConfReq id=0x0]
sent [IPCP ConfNak id=0x0 <addr 0.0.0.0>]
rcvd [IPCP ConfRej id=0x2 <ms-wins 10.11.12.13> <ms-wins 12.14>]
sent [IPCP ConfReq id=0x3 <addr 0.0.0.0> <ms-dns1 10.11.12.13> <ms-dns2 10.11.12.14>]
rcvd [IPCP ConfReq id=0x1]
sent [IPCP ConfAck id=0x1]
rcvd [IPCP ConfNak id=0x3 <addr 10.30.208.139> <ms-dns1 218.104.128.106> <ms-dns66>]
sent [IPCP ConfReq id=0x4 <addr 10.30.208.139> <ms-dns1 218.104.128.106> <ms-dns2 58.22.96.66>]
rcvd [IPCP ConfAck id=0x4 <addr 10.30.208.139> <ms-dns1 218.104.128.106> <ms-dns2 58.22.96.66>]
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.youkuaiyun.com/lin_jianbin/article/details/42520419