您的位置:首页 > 其它

HI3515海思开发板移植3G模块笔记

2017-01-18 16:19 791 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[-]
linux WCDMA的资料       
华为EC122在HiSi3110E上移植
一 开发环境简介
二 主要步骤
三 配置3G模块驱动和ppp网络协议栈
配置3G模块驱动
添加ppp协议

四 编写ppp拨号脚本
编译 ppp-244
编写拨号脚本

五 调试

pppd call wcdma调用失败
网络不通

六 注释

硬件平台:

海思Hi3515 Linux

3G模块:

1、移动模块:ZTE M305(TD-SCDMA)

2、联通模块:HUAWEI EM770W(WCDMA)

3、电信模块:HUAWEI EM660(CDMA2000-EVDO)

开始工作:

1、在编译内核时,通过make menuconfig打开模块加载选项,因为调用3G需要用到pppd服务,所以找到pppd服务的,全部启用。

2、修改串口驱动,在内核文件中找到option.c文件,在linux-2.6.24\drivers\usb\serial目录下,然后找到option_ids这个设备枚举变量的定义,大概是在134行的位置,然后在这个定义的最后面(“{ } /* Terminating entry */”之前)添加三行:

[cpp] view
plain copy

{ USB_DEVICE(0x12d1,0x1404) },/* HUAWEI EM770 */  

{ USB_DEVICE(0x12d1,0x1001) },/* HUAWEI EM660 */  

{ USB_DEVICE(0x19d2,0x1303) },/* ZTE M305 */  

解释一下什么意思,这个就是添加一下我所用到的三种3G模块的设备信息,不然插上3G模块,系统无法识别,首先要保证系统识别才能进行后面的操作,在USB_DEVICE(0x12d1,0x1404)中,0x12d1是厂商ID,0x1404是设备模块的ID,这两个参数需要你参考你所使用的模块的datasheet文档了,因为我用的是这三个模块,所以填入对应的值就可以了。

  添加完之后,就可以重新编译内核,并把内核烧写到板子中,这里烧写过程不赘述。

3、在系统启动脚本中添加驱动加载,在/etc/init.d/rcS中添加下面几行,其中usbserial.ko和option.ko的路径根据在开发板中的具体位置而定

[html] view
plain copy

insmod /lib/modules/2.6.24-rt1-hi3515v100/kernel/drive
24000
rs/usb/serial/usbserial.ko maxRSize=16384 maxWSize=512 maxISize=64  

insmod /lib/modules/2.6.24-rt1-hi3515v100/kernel/drivers/usb/serial/option.ko  

mount -t tmpfs tmpfs /etc/ppp  

mount -t usbfs none /proc/bus/usb   

4、在系统/var/目录下创建2个文件夹:(注意,这一步很关键,不然在进行拨号时会报Can't create lock file /var/lock/LCK..ttyUSB0: No such file or directory的错误)

[html] view
plain copy

mkdir /var/run -p  

mkdir /var/lock -p  

5、重头戏,移植pppd,我用的是ppp-2.4.5,大家可以从ftp://ftp.samba.org/pub/ppp/这里进行下载。

[html] view
plain copy

#tar -zvxf ppp-2.4.5.tar.gz 解压文件  

#cd ppp-2.4.5  

#./configure    生成Makefile  

这里和以往的交叉编译有些不同,以往的交叉编译中,都是在运行./configure的时候,同时制定CC,AR,LD,STRIP等参数,然后再make一下就完了。但是编译这个的时候,要注意,在运行./configure的时候配置上述参数根本不起作用,我当时就按照以往的习惯编译了一遍,结果也没有报错,但是实际上使用的PC本身的gcc编译的,并非交叉编译,这里一定要注意。

  在make的同时指定CC等编译参数,命令如下:

[html] view
plain copy

#make CC=/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/bin/arm-hisi-linux-gcc AR=/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/bin/arm-hisi-linux-ar LD=/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/bin/arm-hisi-linux-ld STRIP=/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/bin/arm-hisi-linux-strip  

因为我的交叉编译器路径保存到了/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/bin路径下,大家可根据实际情况修改。

6、编译完成之后,拷贝编译后的文件:

[html] view
plain copy

#mkdir /usr/local/build/lib/pppd/2.4.5  

其中/usr/local/build这个目录是我把最终需要拷贝的都放在这个目录下,到时候将这个目录下的文件统统拷贝到开发板中的/usr/目录下

回到ppp-2.4.5目录中:

[html] view
plain copy

#cd ppp-2.4.5  

#cp pppd/plugins/minconn.so pppd/plugins/passprompt.so pppd/plugins/passwordfd.so pppd/plugins/winbind.so /usr/local/build/lib/pppd/2.4.5  

#cp pppd/plugins/rp-pppoe/rp-pppoe.so /usr/local/build/lib/pppd/2.4.5  

#cp pppd/plugins/rp-pppoe/pppoe-discovery /usr/local/build/sbin  注意,目录不存在的,自己创建一下,最终build中应该有2个文件夹lib,etc和sbin  

#cp pppd/plugins/pppoatm/pppoatm.so /usr/local/build/lib/pppd/2.4.5  

#cp pppd/plugins/radius/radius.so pppd/plugins/radius/radattr.so pppd/plugins/radius/radrealms.so /usr/local/build/lib/pppd/2.4.5  

#cp pppd/pppd /usr/local/build/sbin  

#cp pppstatus/pppstatus /usr/local/build/sbin  

#cp pppdump/pppdump /usr/local/build/sbin  

#cp chat/chat /usr/local/build/sbin  

#cp etc.ppp/chap-secrets etc.ppp/pap-secrets etc.ppp/options /usr/local/build/etc/ppp  

好了,现在我们所需要移植的文件都在build文件中了,其中pppd chat pppdump pppstats这几个文件还有pap-secrets和chap-secrets是最主要的,其他的文件都不太重要,如果板子空间不够,可以不复制。

7、将build文件夹中的lib和sbin目录复制到开发板的/usr/下面,将etc目录复制到根目录/下。

8、一切就绪之后,开始拨号吧,看一下/dev目录下应该有ttyUSB0等设备,这些就是3G模块已经加载了,如果你的板子没有,那么请检查驱动是否弄正确了,而且不要忘了mount一下。来到开发板中,先创建文件夹:

[html] view
plain copy

#mkdir /etc/ppp/peers  

#mkdir /etc/ppp/chat  

如果有了就不用创建了。然后在/etc/ppp/chat/目录下创建4个文件:

第一个文件:wcdma-connect-chat,内容如下:

[html] view
plain copy

TIMEOUT 15  

ABORT 'NO CARRIER'  

ABORT 'ERROR'  

ABORT 'NO DIALTONE'  

ABORT 'BUSY'  

ABORT 'NO ANSWER'  

"" 'AT'  

OK 'ATDT*99#'  

CONNECT  

第二个文件:evdo-connect-chat,内容如下

[html] view
plain copy

TIMEOUT 15  

ABORT 'NO CARRIER'  

ABORT 'ERROR'  

ABORT 'NO DIALTONE'  

ABORT 'BUSY'  

ABORT 'NO ANSWER'  

"" 'AT'  

OK 'ATDT#777'  

CONNECT  

第三个文件:td-connect-chat,内容如下

[html] view
plain copy

TIMEOUT 15  

ABORT 'NO CARRIER'  

ABORT 'ERROR'  

ABORT 'NO DIALTONE'  

ABORT 'BUSY'  

ABORT 'NO ANSWER'  

"" 'AT'  

OK 'ATDT*99***1#'  

CONNECT  

第四个文件:disconnect-chat,内容如下

[html] view
plain copy

ABORT "BUSY"  

ABORT "ERROR"  

ABORT "NO DIALTONE"  

SAY "/nSending break to the modem/n"  

'' "/K"  

'' "+++ATH"  

SAY "/nGoodbye/n"  

然后再在peers目录中,同样创建3个文件,这三个文件和刚才的那三个文件是分别对应3中制式的不同模块的拨号方式

第一个文件:evdo-dailer,内容如下

[html] view
plain copy

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 -s -v -f evdo-connect-chat'  

disconnect '/usr/sbin/chat -s -v -f disconnect-chat'  

第二个文件:wcdma-dailer,内容如下

[html] view
plain copy

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 -s -v -f wcdma-connect-chat'  

disconnect '/usr/sbin/chat -s -v -f disconnect-chat'  

第三个文件:td-dailer,内容如下

[html] view
plain copy

debug  

logfile /var/log/pppd.log  

lock  

/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 td-connect-chat'  

disconnect '/usr/sbin/chat -s -v -f disconnect-chat'  

对于上面的这些参数解释一下

  ttyUSB0 表示 CDMA modem 连接到串口 /dev/ttyUSB0 上; 

  115200表示 串口波特率; 

  crtscts 表示采用 modem 的 rts 和 cts 信号线用于流控; 

  connect '/usr/sbin/chat -v -f /etc/ppp/chat/td-connect-chat' 表示用 chat 程序完成连接建立的会话过程,会话过程通过 /etc/ppp/chat/td-connect-chat 文件控制

  debug 表示令 pppd 工作在调试模式 

  nodetach 表 示不要让 pppd 启动之 后转为后台进程 

  ipcp-accept-local 表示接受服务器分配的本机 IP 地址 

  ipcp-accept-remote 表示接受服务器指定的服务器 IP 地址 

  defaultroute 表示把服务器指定的服务器 IP 地址作为默认路由 

  user "card"   表示认证时的用户为 "card" , pppd 据此从 /etc/ppp/pap-secrets 或者 /etc/ppp/chap-secrets 文件 中取得 "card"用户对应的口令

9、文件都创建完了,就可以进行拨号了,插上SIM卡,然后通过如下命令进行拨号:(注意:这一步要在chat目录中进行)

[html] view
plain copy

#pppd call wcdma-dailer  这个是调用联通3G的模块的命令  

#pppd call evdo-dailer  这个是调用电信3G的模块的命令  

#pppd call td-dailer  这个是调用移动3G的模块的命令  

其中联通和电信的我已经自己测试成功,移动的没有测试,大家自己测测吧。在拨通了之后,会打印出类似如下消息,

 cript /etc/ppp/ip-up finished (pid 1763), status = 0x0

 这时代表已经拨号成功,通过ifconfig命令可以看到有个ppp0,说明大功告成了。

另外转载别人几篇类似的博文,

linux
WCDMA的资料       

分类: LINUX2012-12-12
17:17333人阅读评论(0)收藏举报

首先必须让开发板识别上网卡,因此,要修改usb_modeswitch.conf,但usb_modeswitch并没有带有E1750的配置文件,不像EC169那么方便
#E1750

DefaultVendor= 0x12d1;

DefaultProduct= 0x1446
TargetVendor= 0x12d1

TargetProduct= 0x1001

MessageContent="55534243000000000000000000000011060000000000000000000000000000"

MessageEndpoint=0x01

CheckSuccess=5
然后是ppp拨号下的配置
/nfs/etc/ppp/peers/wcdma
ttyUSB0 

460800

connect '/usr/sbin/chat -v -f /etc/ppp/wcdma-chat'

noauth

nodetach

ipcp-accept-local

ipcp-accept-remote

usepeerdns

noipdefault

defaultroute
接着是chat
ECHO ON
ABORT "BUSY"
ABORT "NO ANSWER"
ABORT "ERROR"
TIMEOUT 20
"" AT
OK AT+CGDCONT=1,"IP","3gnet",,0,0
OK ATDT*99#
CONNECT
折腾了一番通过几种USB上网卡在Linux下上WCDMA,在此记录一下: 

通用配置文件:

/etc/ppp/peers/wcdma :

/dev/ttyACM0

460800

connect '/etc/ppp/chat-wcdma'

noauth

usepeerdns

noipdefault

defaultroute

----

注意,其中的/dev/ttyACM0 是串口设备,后面描述。

/etc/ppp/chat-wcdma

#!/bin/sh

#

# This is part 2 of the ppp-on script. It will perform the connection

# protocol for the desired connection.

#

exec /usr/sbin/chat -v \

ECHO ON \

ABORT 'BUSY' \

ABORT 'NO ANSWER' \

ABORT 'ERROR' \

TIMEOUT 20 \

'' 'AT' \

OK AT+CFUN=6 \

        OK              'AT+CGDCONT=1,"IP","3gnet",,0,0' \

OK 'ATDT*99#' \

CONNECT 

其中的3gnet 就是联通WCDMA上网需要的APN啦。 CFUN=6是让索爱MD-400只工作在WCDMA网络下。相应地CFUN=5就只工作再GSM/GPRS/EDGE下, CFUN=1就是全自动选择

拨号连接时,用

              pppd call wcdma 

即可。你可以自己设置IP伪装NAT等等事宜。

以上是用索尼爱立信MD-400上网卡设置的,如果你用的是华为E1750, 那么设备名就换成/dev/ttyUSB0 即可。

无论是索爱MD400还是华为E1750, 都需要小工具 usb_modeswitch 1.0.2 切换其倒霉的USB工作状态,详细的介绍和下载可以去这里看看: http://www.draisberghof.de/usb_modeswitch/
如果是电信的天翼CDMA2000 EV-DO 3G, 测试了一下华为EC1260,基本区别不大,注意以下几点:

1, 2.6.19之后的核心有专门对付EC1260的代码, 插进去直接就令其工作在Modem模式,你会看到有/dev/ttyUSB0设备,可以不需要usb_modeswitch的帮助。低版本核心可能还离不开。

2, EVDO没有APN的概念,上面的/etc/ppp/chat-wcdma 脚本改成这样即可:

[root@pxi4g ppp]# cat chat-evdo 

#!/bin/sh

#

# This is part 2 of the ppp-on script. It will perform the connection

# protocol for the desired connection.

#

exec /usr/sbin/chat -v \

ECHO ON \

ABORT 'BUSY' \

ABORT 'NO ANSWER' \

ABORT 'ERROR' \

TIMEOUT 20 \

'' 'AT' \

OK 'ATDT#777' \

CONNECT 

也就是说,直接拨特殊号码#777即可。 peers/wcdma文件可以不改。


3G卡片在开发板上的详细解决方法(适用于大多数3G卡片)
Anson Luo(罗国辉)
一. 环境
1. 开发板内核:linux kernel 2.6.14
2. 3G卡片:HUAWEI E1750
二. 相关工具与库文件下载
1. usb_modeswitch-1.0.6.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)
建议下载较新版本,如果怕麻烦就下载与我一样的版本,下同。
Usb_modeswitch是对USB设备的工作模式进行转换一种万能工具,当然这种宝贝,只有在linux下才能体现其巨大的作用。随着移动通信,无线通信的发展,越来越多的设备被制作成USB接口,像一些无线网卡,3G数据卡等等。这些设备的厂家一般都会提供windows 下驱动,这些设备在第一次插上机子的时候,它们处于CDROM+闪存模式,可以从中提供驱动程序安装驱动,在驱动程序安装完成后,驱动会转换成3G模式,此时就会出现usb modem设备,目前的3G卡片全都是这样,这就是所谓的“ZeroCD”。
而在linux下我们可没有那么好的待遇,厂家一般不会给我们提供linux下面的驱动,而目前的内核还不能自动识别并驱动。所以我们需要用usb_modeswitch这个工具来进行模式转换,设备模式依赖usb-storage和usbserial模式,所以,在开发板上需要有这两种模块的支持,设备并能够正常工作于这两种模式下。
2.usb_modeswitch-current_data.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)
这个包里包括提供给UDEV的驱动设备信息,和很多设备使用usb_mdoeswitch进行转换模式时需要配置的参数。下载它用于参考。
3. libusb-1.0.6.tar.bz2 (http://sourceforge.net/projects/libusb/files/libusb-1.0/)
Libusb才是我们的真正骨干力量,提供给usb_modeswitch一套系统API,所以,自然usb_modeswitch这个包工头要想工作,肯定不能离开libusb这个工人为其服务。
4.libusb-compat-0.1.3.tar.bz2 (http://www.linuxfromscratch.org/blfs/view/svn/general/libusb-compat.html
libusb分为0.1和1.0两年版本,而1.0版本与0.1有较大的不同,并不向下兼容,必须依赖libusb-compat。
三. 交叉编译usb_modeswitch
1. 交叉编译 libusb
A. 解压并进入libusb-1.0.6目录,建立子目录install用于存放最后生存的库文件与头文件。
[Anson@libusb-1.0.6]# mkdir install
B. 配置并生成Makefile文件
[Anson@libusb-1.0.6]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-1.0.6/install
C. [Anson@libusb-1.0.6]#make
D. [Anson@libusb-1.0.6]# make install
2. 设置PKG_CONFIG_PATH环境变量,以使我们后面的编译能够顺利找到libusb库
A.设置环境变量
[Anson@libusb-1.0.6]# export PKG_CONFIG_PATH=/home/Anson/libusb-1.0.6/install/lib/pkgconfig:$PKG_CONFIG_PATH
B.查看是否设置正确
[Anson@libusb-1.0.6]#echo $PKG_CONFIG_PATH
3. 交叉编译lib_compat
与上面编译libusb的方法类似:
A.[Anson@libusb-compat-0.1.3]#.mkdir install
B . [Anson@libusb-compat-0.1.3]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-compat-0.1.3/install
C. [Anson@libusb-compat-0.1.3]#make
D. [Anson@libusb-compat-0.1.3]#make install

说明:如果此时出现"-Wno-pointer-sign"、"-fvisibility=hidden"这类错误,则是由于编译器版本过低不支持导致的,可以直接在Makefile和libusb/Makefile文件中删除这些编译选项即可。

4. 交叉编译usb_modeswitch
A.修改Makefile文件
修改STRIP和CC选项为:
STRIP = arm-xxx-linux-strip
CC = arm-xxx-linux-gcc
B. 可以将上面的libusb和libusb-compat的库和头文件拷贝到交叉编译器的lib和include目录下,或者直接加上编译选项指令库的路径即可如下:
INCLUDEDIR = /home/anson//libusb-1.0.6/install/include/libusb-1.0
LIBDIR = /home/anson/libusb-1.0.6/install/lib
$(PROG): $(OBJS)
$(CC) $(CCFLAGS) -I $(INCLUDEDIR) -L $(LIBDIR) -o $(PROG) $(OBJS)
这里的usb.h就是libusb-compat目录下的,如果没有usb.h,usb_modeswitch是编译不过去的。
C. make

5. 编辑usb_modeswitch目录下的usb_modeswitch.conf文件,加入以下内容:
DefaultVendor= 0x12d1
DefaultProduct= 0x1446
TargetVendor = 0x12d1
TargetProduct= 0x1001
MessageContent="55534243000000000000000000000011060000000000000000000000000000"
MessageEndpoint=0x01
CheckSuccess=5
HuaweiMode=0 (特别注意这个参数,我在开发板上的麻烦就出在这个参数上面)

6. 将上面生成的libusb动态库拷贝到开发板的库目录下,将上面生成的usb_modeswitch可执行程序和usb_modeswitch.conf配置文件下载到开发板某目录下。
四. 交叉编译3G卡片驱动
1. 编译 3G模块的驱动option.ko
在内核源码包中找到usb的3G驱动文件 driver//usb/serial/option.c在其中加入3G卡片的 HUAWEI_VENDOR_ID 0x12D1和HUAWEI_PRODUCT_E1750 0x1446。然后修改Kconfig将option编译成模块。将编译生成的option.ko下载到开发板中并使用insmod加载。
五. 加载驱动
1. 挂载usb虚拟文件系统:mount -t usbfs usbfs /proc/bus/usb/
2. 弹出3G卡片的cdrom: eject /dev/cdroms/cdrom0
3. 现在就可以使用usb_modeswitch –W –c ~/usb_modeswitch.conf切换3G卡片的模式了。此时会出现一些信息,你会看到转换成3G模式后的几个串口信息,ttyUSB0, ttyUSB1, ttyUSB2,如下:
option 1-1:1.0: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB0

option 1-1:1.1: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB1

option 1-1:1.2: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB2
如果没有使用udev,就不会自动生成这些结点,所以需要手动创建这些字符节点。
mknod /dev/usb/ttyUSB0 c 188 0
mknod /dev/usb/ttyUSB1 c 188 1
mknod /dev/usb/ttyUSB2 c 188 2
此时你可以在/dev/usb/tts下面找到生成了3个节点1,2,3.如果在PC上面使用发行版,一般都会使用udev做/dev下面的节点,这样子就可以直接在/etc/udev/rules.d/下面添加相应的设备信息和处理就可以了,但是由于开发板上并没有udev,它会生态太多设备节点,对嵌入式开发资源有较大浪费,这里,根据提示信息说明driver在X1地址处找到了Y1设备,它在/dev下面的节点叫Z1,所以此时我们需要手动创建。我的意思就是说这个节点本身已经注册了相应的ioctl了,只是设备节点没有生成而以,所以这时手动创建是完全没有问题的。
4. 使用串口的测试工具发送AT指令测试几个串口是否可用。
六. 交叉编译pppd拨号工具,并编写拨号脚本
1. 交叉编译pppd拨号工具(这里不详细讲解,可参考后续文章的详细说明)
2. 编写拨号脚本,与GPRS的拨号脚本类似。
A. 联通WCDMA-HSDPA:
(1)wcdma: debug
nodetach
lock
/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 -s -v -f chat-wcdma-connect'
disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect'

(2) chat-wcdma-connect: TIMEOUT 5
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' \rAT
OK \rATZ
OK \rAT+CGDCONT=1,"IP","3gnet",,0,0
OK-AT-OK ATDT*99#
CONNECT \d\c

(3) chat-wcdma-disconnect ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\nSending break to the modem\n"
'' "\K"
'' "+++ATH"
SAY "\nGoodbay\n"

B. 移动TD-CDMA
(1)td: debug
logfile /var/log/pppd.log
lock
/dev/ttyUSB0
115200
user "card"
password "card"
crtscts
connect '/usr/sbin/chat -v -t3 -f td-connect-chat'
disconnect '/usr/sbin/chat -s -v -f td-disconnect-chat'
show-password
usepeerdns
noauth
noipdefault
novj
novjccomp
noccp
defaultroute
ipcp-accept-local
ipcp-accept-remote

(2) td-connect-chat: ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' \rATZ
OK-AT-OK ATD#777
CONNECT \d\c

(3) td-disconnect-chat: ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\nSending break to the modem\n"
'' "\K"
'' "+++ATH"
SAY "\nGoodbay\n"

C. 电信CDMA1x
(1) cdma1x: debug
nodetach
lock
/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 -s -v -f cdma1x-connect-chat'
disconnect '/usr/sbin/chat -s -v -f cdma1x-disconnect-chat'

(2) cdma1x-connect-chat: TIMEOUT 5
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' \rATZ
OK \rAT\^PREFMODE=2
OK-AT-OK ATD#777
CONNECT \d\c

(3) cdma1x-disconnect-chat: ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\nSending break to the modem\n"
'' "\K"
'' "+++ATH"
SAY "\nGoodbay\n"

D. 电信CDMA2000-EVDO
(1) evdo: debug
nodetach
lock
/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 -s -v -f evdo-connect-chat'
disconnect '/usr/sbin/chat -s -v -f evdo-disconnect-chat'

(2)evdo-connect-chat: TIMEOUT 5
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' \rATZ
OK-AT-OK ATD#777
CONNECT \d\c

(3)evdo-disconnect-chat: ABORT "BUSY"
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "\nSending break to the modem\n"
'' "\K"
'' "+++ATH"
SAY "\nGoodbay\n"

3. 使用pppd拨号 :pppd file td(wcdma/evdo/cdma1x)
4. 此时将会使用脚本中设置的端口进行拨号,如果成功后会获得IP地址,电信的3G卡片获取的是外网IP地址,而其它则是获取的一个内网IP,将获取到的DNS添加到/etc/resolv.conf.中,并使用route添加一条默认路由,ping一下外网的地址,如果能够ping通,则说明完成了本篇的工作了,电信,移动,联通有的网络会禁ping,所以ping不通,所以这果,就需要使用自己的测试工具,发送tcp/udp包,确定是否成功完成本篇工作。
七. 可参考文章:
1. http://blog.chinaunix.net/u3/106318/showart_2110454.html
2. http://blog.chinaunix.net/u3/106318/showart_2102540.html
3.http://topic.csdn.NET/u/20100513/15/dd3a4f01-e361-4e78-837e-c158b70b0214.html
4.http://blog.csdn.Net/seven407/archive/2009/12/01/4904877.aspx

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ipromiseu/archive/2010/01/07/5154004.aspx
嵌入式linux下使用3G卡上网

嵌入式linux是2.6.24版的。主机是AT9261(arm926ej-s内核)的开发板。

买是市面上常见的中兴AC2746 usb接口的3G上网卡。在windows下使用极方便,可是在linux下使用就麻烦了。

首先,要确认你的嵌入式linux系统是可以支持热插拔的系统。(我用的是mdev方式支持热插拔)
然后,是驱动的安装。AC2746没有专门linux下的驱动。不过,它的usb口在windows系统中实际是用usb转串口的方式转为串口工作的。那么,在linux下同样也可以用usb转串口的方式来使用。linux内核自带了usb转串口的驱动。在内核的编译选择中,选中

Device Drivers  ---> [*] USB support  ---> USB Serial Converter support  --->  USB Serial Converter support

再选中其下的USB driver for GSM and CDMA modems 的选项即可。要注意的是,编译方式一定要选为模块化编译。

选定这两项后,执行make modules命令,会编译源码中/driver/usb/serial/目录下的usb-serial.c和option.c两个文件及其它一些相关文件。
在option.c中,可以看到已经定义了很多设备的描述符,但没有定义AC2746的描述符。我们自已定义一下即可。方法是,在源码中,添加
#define    ZTE_VENDOR_ID        0x19d2

#define    ZTE_PRODUCT_AC2746    0xfff1



option_ids[]的数组中添加
{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2746) },
完成后,重新编译即可。 将生成的/driver/usb/serial/usbserial.ko,option.ko拷贝到嵌入式linux根文件系统的/lib/modules/2.6.24目录下。

执行

insmod /lib/modules/2.6.24/usbserial.ko

insmod /lib/modules/2.6.24/option.ko
插入AC2746,通常系统会认为是cdrom和usb stroage设备插入,并会生成/dev/sr0文件(我用的mdev方式生成设备文件,如果你用的是其它方式,可能设备名会不一样)。这时,输入eject /dev/sr0命令,则系统会自动删除/sr0,并重新确认AC2746,这时,就会认出它是一个cdma数据卡,并自动生成/dev/ttyUSB0,/dev/ttyUSB1,

/dev/ttyUSB2,/dev/ttyUSB3,/dev/ttyUSB4,共5个串行口。这一步是最容易出错的,现象是没有生成这几个设备文件。出错的原因主要是设备描述符没有在驱动程序中定义,查看一下你的CDMA卡的设备描述符。方法是,把CDMA数据卡插到桌面版的linux下,执行lsusb命令即可查看到,然后修改option.c中的设备描述符。有了这几个设备,就成功了一大半。
接下来,是安装pppd拨号软件。网上有很多相关资料,我不多说了。安装好后,要写两个脚本。一个是在/etc/ppp/peers/evdo文件。内容如下
# Usage: root>pppd call evdo

# Privied by hugerat

/dev/ttyUSB0

921600

crtscts

modem

debug

nodetach

usepeerdns

noipdefault

defaultroute

user ctnet@mycdma.cn
password vnet.mobi

0.0.0.0:0.0.0.0

connect '/usr/sbin/chat -s -v -f /etc/ppp/evdo-connect-chat'
其中,user和password项可能会因为地区不同而不同(这两项是南京地区的)

再建立/etc/ppp/evdo-connect-chat文件,文件内容如下:

#/etc/ppp/evdo-connect-chat

# chat script for China telecom, used AC2746.

# Privided by hugerat

TIMEOUT 15

ABORT "DELAYED"

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

ABORT "NO CARRIER"

TIMEOUT 15

"" AT

OK ATE0

OK AT\^PREFMODE=8

OK ATDT#777

CONNECT
要说明的一项是AT\^PREFMODE=8,这个是设置模块工作模式的。2表示用CDMA 1X模式。4表示EVDO模式,8表示混和模式。模块默认是用2,即CDMA 1X模式。如果你要使用EVDO高速上网就要设为4或8。
执行pppd call evdo&,顺利的话,拨号就会成功,并会获得dns服务器地址。pingwww.google.com.hk,连通的话,证明已经在网上了。
但是你会发现网速并没有达到evdo的正常速度。这是因为,usb-serial.c并不是为高速外设设计的,它的缓存开的太小,要把缓存开大。方法如下。
创建一个usbserial.c的补丁文件/root/usbserial.c.patch,内容如下:
--- linuxold/drivers/usb/serial/usb-serial.c 2006-12-31 17:40:28.000000000 -0600

+++ linux/drivers/usb/serial/usb-serial.c 2009-05-02 23:55:08.000000000 -0600

@@ -58,4 +58,5 @@

*/

+static ushort maxRSize, maxWSize, maxISize;

static int debug;

static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */

@@ -817,4 +818,6 @@

}

buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);

+ if (buffer_size < maxRSize)

+ buffer_size = maxRSize;

port->bulk_in_size = buffer_size;

port->bulk_in_endpointAddress = endpoint->bEndpointAddress;

@@ -841,4 +844,6 @@

}

buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);

+ if (buffer_size < maxWSize)

+ buffer_size = maxWSize;

port->bulk_out_size = buffer_size;

port->bulk_out_endpointAddress = endpoint->bEndpointAddress;

@@ -866,4 +871,6 @@

}

buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);

+ if (buffer_size < maxISize)

+ buffer_size = maxISize;

port->interrupt_in_endpointAddress = endpoint->bEndpointAddress;

port->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL);

@@ -1191,2 +1198,8 @@

module_param(debug, bool, S_IRUGO | S_IWUSR);

MODULE_PARM_DESC(debug, "Debug enabled or not");

+module_param(maxRSize, ushort, 0);

+MODULE_PARM_DESC(maxRSize, "User specified USB input buffer size");

+module_param(maxWSize, ushort, 0);

+MODULE_PARM_DESC(maxWSize, "User specified USB output buffer size");

+module_param(maxISize, ushort, 0);

+MODULE_PARM_DESC(maxISize, "User specified USB interrupt buffer size");
这个文件是我在网上找到的,并不是2.6.24版的,不能直接为usb-serial.c打上补丁,不过,没关系,你可以手工添加带“+”号的信息到指定的位置即可。
完成后,重新编译生成usbserial.ko文件。
insmod /lib/modules/2.6.24/usbserial.ko命令改为如下
insmod /lib/modules/2.6.24/usbserial.ko maxRSize=4096 maxWSize=1024
这样,再试试网速吧,一切正常了。

上述方法在AC2746上测试正常,其它的网卡应该也可以,只是要注意修改相应的设备描述符即可。
 

 


华为EC122在HiSi3110E上移植

分类: 3g网络2011-02-24
22:06 905人阅读 评论(9) 收藏 举报
华为makefile工具filekilllinux

一、环境

1、  开发板内核:linux kernel 2.6.14

2、  3G卡片:华为EC122

二、相关工具

1、  usb-modeswitch-1.0.2.tar.bz2

Usb_modeswitch是对USB设备的工作模式进行转换一种万能工具,在Linux下我们需要用usb_modeswitch这个工具来进行模式转换,设备模式依赖usbserial模式,所以,在开发板上需要有这种模块的支持,设备并能够正常工作于这两种模式下。

2、  libusb-0.1.12.tar.gz

libusb提供给usb_modeswitch一套系统API

三、交叉编译usb_modeswitch

1、交叉编译libusb

解压并进入libusb-0.1.12目录,建立子目录install用于存放最后生存的库文件与头文件。

[root@libusb-0.1.12]# mkdir install

配置并生成Makefile文件

[root@libusb-0.1.12]# ./configure  --host=arm-uclibc-linux --test=arm-uclibc-linux --prefix=/root/libusb-0.1.12/install

 [root@libusb-0.1.12]# make

[root@libusb-0.1.12]# make install

这样生成一些lib 与include文件

2、 交叉编译usb_modeswitch

(1)、修改Makefile文件

STRIP     = arm-uclibc-linux-strip

CC          = arm-uclibc-linux-gcc

CCFLAGS     = -I /root/libusb-0.1.12/install/include -L  /root/libusb-0.1.12/install/lib -l usb

(2)、make

4、编辑usb_modeswitch-1.1.2目录下的usb_modeswitch.conf文件

# Huawei EC122

#

# Contributor: Anders Blomdell, Ahmed Soliman

DefaultVendor= 0x12d1

DefaultProduct= 0x1446

TargetVendor= 0x12d1

TargetProduct= 0x140c

MessageContent="55534243123456780000000000000011060000000000000000000000000000"

5、将上面生成的libusb动态库拷贝到开发板的库目录下,将上面生成的usb_modeswitch可执行程序和usb_modeswitch.conf拷贝到文件系统目录下。

四、交叉编译3G卡片驱动

在2.6.10内核源码中没有专门的3G驱动文件,我们在/driver/usb/serial/pl2303.c中加入3G卡片的ID信息:

{USB_DEVICE(HUAWEI_VENDOR_ID),HUAWEI_PRODUCT_ID)}

在/driver/usb/serial/pl2303.h中加入:

#define HUAWEI_VENDOR_ID 0x12d1

#define HUAWEI_PRODUCT_ID 0x140c

Make menuconfig 选中相关选项,可以选择成模块,也可以选择直接编译到内核里,

make内核即可。

五、利用usb_modeswitch进行模式转换

       运行 ./usb_modeswitch -W 切换3G卡片的模式。此时会出现一些信息,这时到/dev/usb/tts/ 下面查看转换后的通道,在这下面会出现 0 1 2 3 4  ttyUSB通道。

六、交叉编译pppd拨号工具,并编写拨号脚本

    由于板卡上已移植了pppd拨号工具,在内核里将相关的选项选上即可。下面介绍拨号脚本的编写:

vedo:

debug

nodetach

lock

/dev/usb/tts/0

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 -s -v -f /etc/ppp/evdo-connect-chat'

evdo-connect-chat:

TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rATZ

OK-AT-OK ATD#777

CONNECT /d/c

ppp-off:

#/etc/ppp/ppp-off

#!/bin/sh

######################################################################

#

# Determine the device to be terminated.

#

if [ "$1" = "" ]; then

 DEVICE=ppp0

 else

  DEVICE=$1

  fi

  ######################################################################

  #

  # If the ppp0 pid file is present then the program is running. Stop it.

  if [ -r /var/run/$DEVICE.pid ]; then

          kill -INT `cat /var/run/$DEVICE.pid`

          #

          # If the kill did not work then there is no process running for this

          # pid. It may also mean that the lock file will be left. You may wish

          # to delete the lock file at the same time.

                  if [ ! "$?" = "0" ]; then

                                  rm -f /var/run/$DEVICE.pid

                                                  echo "ERROR: Removed stale pid file"

                                                                  exit 1

                                                                          fi

                                                                          #

                                                                          # Success. Let pppd clean up its own junk.

                                                                                  echo "PPP link to $DEVICE terminated."

                                                                                          exit 0

                                                                                          fi

                                                                                          #

                                                                                          # The ppp process is not running for ppp0

                                                                                          echo "ERROR: PPP link is not active on $DEVICE"

                                                                                          exit 1

将vedo 文件拷贝到文件系统/etc/ppp/peer/目录下vedo-connect-chat、ppp-off两个个文件拷贝到

文件系统/etc/ppp/目录下,在/etc/resolv.conf中添加DNS号

nameserver 219.141.136.10

由于所用的开发板,文件系统挂载在一个服务器上,其所用的网关,被当做了默认的网关,故拨号后会ping不通网络。

终端查看路由:

# route

Kernel IP routing table

Destination  Gateway       Genmask     Flags  Metric Ref   Use  Iface

192.168.1.0     *        255.255.255.0   U     0      0      0   eth0

default    192.168.1.3      0.0.0.0        UG    0      0      0   eth0

修改默认网关

# route del default

 #route add default ppp0

拨号后可查看

# route

Kernel IP routing table

Destination   Gateway     Genmask     Flags  Metric  Ref  Use  Iface

localhost       *       255.255.255.255 UH      0      0    0    ppp0

192.168.1.0    *        255.255.255.0   U      0      0    0    eth0

default        localhost      0.0.0.0      UG     0      0    0    ppp0

开始拨号

# pppd call evdo&

拨号成功后会获得自动分配的IP地址

查看拨号是否成功

#ifconfig ppp0

如果能分配到IP地址,则拨号成功。

ping www.baidu.com 如能ping通,则说明移植成功。

注:挂在usb设备mount -t usbfs none /proc/bus/usb

在这过程中,感谢一个哥们的大力支持,

参考了叶磊的华为E1750在MD6440上移植文章,http://blog.csdn.net/yel617/archive/2010/05/18/5602934.aspx

 根据这个方法 华为 E1750 在HS3110E我也成功了。

 

3G卡片在开发板上的详细解决方法(适用于大多数3G卡片)
Anson Luo(罗国辉)
一. 环境

1. 开发板内核:linux kernel 2.6.14

2. 3G卡片:HUAWEI E1750

二. 相关工具与库文件下载

1. usb_modeswitch-1.0.6.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)

建议下载较新版本,如果怕麻烦就下载与我一样的版本,下同。

Usb_modeswitch是对USB设备的工作模式进行转换一种万能工具,当然这种宝贝,只有在linux下才能体现其巨大的作用。随着移动通信,无线通信的发展,越来越多的设备被制作成USB接口,像一些无线网卡,3G数据卡等等。这些设备的厂家一般都会提供windows 下驱动,这些设备在第一次插上机子的时候,它们处于CDROM+闪存模式,可以从中提供驱动程序安装驱动,在驱动程序安装完成后,驱动会转换成3G模式,此时就会出现usb modem设备,目前的3G卡片全都是这样,这就是所谓的“ZeroCD”。

而在linux下我们可没有那么好的待遇,厂家一般不会给我们提供linux下面的驱动,而目前的内核还不能自动识别并驱动。所以我们需要用 usb_modeswitch这个工具来进行模式转换,设备模式依赖usb-storage和usbserial模式,所以,在开发板上需要有这两种模块的支持,设备并能够正常工作于这两种模式下。

2.usb_modeswitch-current_data.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)

这个包里包括提供给UDEV的驱动设备信息,和很多设备使用usb_mdoeswitch进行转换模式时需要配置的参数。下载它用于参考。

3. libusb-1.0.6.tar.bz2 (http://sourceforge.net/projects/libusb/files/libusb-1.0/)

Libusb才是我们的真正骨干力量,提供给usb_modeswitch一套系统API,所以,自然usb_modeswitch这个包工头要想工作,肯定不能离开libusb这个工人为其服务。

4.libusb-compat-0.1.3.tar.bz2 (http://www.linuxfromscratch.org/blfs/view/svn/general/libusb-compat.html

libusb分为0.1和1.0两年版本,而1.0版本与0.1有较大的不同,并不向下兼容,必须依赖libusb-compat。

三. 交叉编译usb_modeswitch

1. 交叉编译 libusb

A. 解压并进入libusb-1.0.6目录,建立子目录install用于存放最后生存的库文件与头文件。

[Anson@libusb-1.0.6]# mkdir install

B. 配置并生成Makefile文件

[Anson@libusb-1.0.6]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-1.0.6/install

C. [Anson@libusb-1.0.6]#make

D. [Anson@libusb-1.0.6]# make install

2. 设置PKG_CONFIG_PATH环境变量,以使我们后面的编译能够顺利找到libusb库

A.设置环境变量

[Anson@libusb-1.0.6]# export PKG_CONFIG_PATH=/home/Anson/libusb-1.0.6/install/lib/pkgconfig:$PKG_CONFIG_PATH

B.查看是否设置正确

[Anson@libusb-1.0.6]#echo $PKG_CONFIG_PATH

3. 交叉编译lib_compat

与上面编译libusb的方法类似:

A.[Anson@libusb-compat-0.1.3]#.mkdir install

B . [Anson@libusb-compat-0.1.3]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-compat-0.1.3/install

C. [Anson@libusb-compat-0.1.3]#make

D. [Anson@libusb-compat-0.1.3]#make install

说明:如果此时出现"-Wno-pointer-sign"、"-fvisibility=hidden"这类错误,则是由于编译器版本过低不支持导致的,可以直接在Makefile和libusb/Makefile文件中删除这些编译选项即可。

4. 交叉编译usb_modeswitch

A.修改Makefile文件

修改STRIP和CC选项为:

STRIP = arm-xxx-linux-strip

CC = arm-xxx-linux-gcc

B. 可以将上面的libusb和libusb-compat的库和头文件拷贝到交叉编译器的lib和include目录下,或者直接加上编译选项指令库的路径即可如下:

INCLUDEDIR = /home/anson//libusb-1.0.6/install/include/libusb-1.0

LIBDIR = /home/anson/libusb-1.0.6/install/lib

$(PROG): $(OBJS)

$(CC) $(CCFLAGS) -I $(INCLUDEDIR) -L $(LIBDIR) -o $(PROG) $(OBJS)

这里的usb.h就是libusb-compat目录下的,如果没有usb.h,usb_modeswitch是编译不过去的。

C. make

5. 编辑usb_modeswitch目录下的usb_modeswitch.conf文件,加入以下内容:

 

DefaultVendor= 0x12d1

DefaultProduct= 0x1446

TargetVendor = 0x12d1

TargetProduct= 0x1001

MessageContent="55534243000000000000000000000011060000000000000000000000000000"

MessageEndpoint=0x01

CheckSuccess=5

HuaweiMode=0 (特别注意这个参数,我在开发板上的麻烦就出在这个参数上面)
6. 将上面生成的libusb动态库拷贝到开发板的库目录下,将上面生成的usb_modeswitch可执行程序和usb_modeswitch.conf配置文件下载到开发板某目录下。

四. 交叉编译3G卡片驱动

1. 编译 3G模块的驱动option.ko

在内核源码包中找到usb的3G驱动文件 driver//usb/serial/option.c在其中加入3G卡片的 HUAWEI_VENDOR_ID 0x12D1和HUAWEI_PRODUCT_E1750 0x1446。然后修改Kconfig将option编译成模块。将编译生成的option.ko下载到开发板中并使用insmod加载。

五. 加载驱动

1. 挂载usb虚拟文件系统:mount -t usbfs usbfs /proc/bus/usb/

2. 弹出3G卡片的cdrom: eject /dev/cdroms/cdrom0

3. 现在就可以使用usb_modeswitch –W –c ~/usb_modeswitch.conf切换3G卡片的模式了。此时会出现一些信息,你会看到转换成3G模式后的几个串口信息,ttyUSB0, ttyUSB1, ttyUSB2,如下:

option 1-1:1.0: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB0

option 1-1:1.1: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB1

option 1-1:1.2: Option 3G data card converter detected

usb 1-1: Option 3G data card converter now attached to ttyUSB2

如果没有使用udev,就不会自动生成这些结点,所以需要手动创建这些字符节点。

mknod /dev/usb/ttyUSB0 c 188 0

mknod /dev/usb/ttyUSB1 c 188 1

mknod /dev/usb/ttyUSB2 c 188 2

此时你可以在/dev/usb/tts下面找到生成了3个节点1,2,3.如果在PC上面使用发行版,一般都会使用udev做/dev下面的节点,这样子就可以直接在/etc/udev/rules.d/下面添加相应的设备信息和处理就可以了,但是由于开发板上并没有udev,它会生态太多设备节点,对嵌入式开发资源有较大浪费,这里,根据提示信息说明driver在X1地址处找到了Y1设备,它在/dev下面的节点叫Z1,所以此时我们需要手动创建。我的意思就是说这个节点本身已经注册了相应的ioctl了,只是设备节点没有生成而以,所以这时手动创建是完全没有问题的。

4. 使用串口的测试工具发送AT指令测试几个串口是否可用。

六. 交叉编译pppd拨号工具,并编写拨号脚本

1. 交叉编译pppd拨号工具(这里不详细讲解,可参考后续文章的详细说明)

2. 编写拨号脚本,与GPRS的拨号脚本类似。

A. 联通WCDMA-HSDPA:

(1)wcdma:

 

debug

nodetach

lock

/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 -s -v -f chat-wcdma-connect'

disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect'
(2) chat-wcdma-connect:

 

TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rAT

OK /rATZ

OK /rAT+CGDCONT=1,"IP","3gnet",,0,0

OK-AT-OK ATDT*99#

CONNECT /d/c
(3) chat-wcdma-disconnect

 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"
B. 移动TD-CDMA

(1)td:

 

debug

logfile /var/log/pppd.log

lock

/dev/ttyUSB0

115200

user "card"

password "card"

crtscts

connect '/usr/sbin/chat -v -t3 -f td-connect-chat'

disconnect '/usr/sbin/chat -s -v -f td-disconnect-chat'

show-password

usepeerdns

noauth

noipdefault

novj

novjccomp

noccp

defaultroute

ipcp-accept-local

ipcp-accept-remote
(2) td-connect-chat:

 

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rATZ

OK-AT-OK ATD#777

CONNECT /d/c
(3) td-disconnect-chat:

 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"
C. 电信CDMA1x

(1) cdma1x:

 

debug

nodetach

lock

/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 -s -v -f cdma1x-connect-chat'

disconnect '/usr/sbin/chat -s -v -f cdma1x-disconnect-chat'
(2) cdma1x-connect-chat:

 

TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rATZ

OK /rAT/^PREFMODE=2

OK-AT-OK ATD#777

CONNECT /d/c
(3) cdma1x-disconnect-chat:

 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"
D. 电信CDMA2000-EVDO

(1) evdo:

 

debug

nodetach

lock

/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 -s -v -f evdo-connect-chat'

disconnect '/usr/sbin/chat -s -v -f evdo-disconnect-chat'
(2)evdo-connect-chat:

 

TIMEOUT 5

ABORT 'NO CARRIER'

ABORT 'ERROR'

ABORT 'NO DIALTONE'

ABORT 'BUSY'

ABORT 'NO ANSWER'

'' /rATZ

OK-AT-OK ATD#777

CONNECT /d/c
(3)evdo-disconnect-chat:

 

ABORT "BUSY"

ABORT "ERROR"

ABORT "NO DIALTONE"

SAY "/nSending break to the modem/n"

'' "/K"

'' "+++ATH"

SAY "/nGoodbay/n"
3. 使用pppd拨号 :pppd file td(wcdma/evdo/cdma1x)

4. 此时将会使用脚本中设置的端口进行拨号,如果成功后会获得IP地址,电信的3G卡片获取的是外网IP地址,而其它则是获取的一个内网IP,将获取到的DNS添加到/etc/resolv.conf.中,并使用route添加一条默认路由,ping一下外网的地址,如果能够ping通,则说明完成了本篇的工作了,电信,移动,联通有的网络会禁ping,所以ping不通,所以这果,就需要使用自己的测试工具,发送tcp/udp包,确定是否成功完成本篇工作。

七. 可参考文章:

1. http://blog.chinaunix.net/u3/106318/showart_2110454.html

2. http://blog.chinaunix.net/u3/106318/showart_2102540.html


开发环境简介

内容                                             

                    说明

3G模块

             华为EM820W(WCDMA)

3G SIM卡

             中国联通3G卡

嵌入式linux版本

             Linux-2.6.37

主机开发环境

             Ubutun 10.04


主要步骤

1
向linux内核中添加3G模块驱动(USB转串口的option驱动)和ppp网络协议的支持

                                                                   2                                                                                                                                         
交叉编译ppp-2.4.4源代码

将拨号上网所需的两个应用程序pppd和chat拷贝到开发板/usr/sbin文件夹下,

编写ppp拨号脚本wcdma、wcdma-chat-connect、wcdma-chat-disconnect并存放在/etc/ppp/peers目录下。将DNS写入到/etc/resolv.conf文件中

3
执行“pppd call wcdma”命令进行拨号


配置3G模块驱动和ppp网络协议栈

首先进入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

如图7选择ppp

到这一步驱动和协议就都已经配置成功了接下来就是编译下载到板子

登入到linux, dmesg查看内核打印信息



                         图8

同时查看/dev/目录下已经创建了

/dev/ttyUSB0,/dev/ttyUSB1,/dev/ttyUSB2,/dev/ttyUSB3,/dev/ttyUSB4,/dev/ttyUSB5

/dev/ppp等7个设备文件表明内核正确识别了EM820W3G模块


编写ppp拨号脚本

由于该拨号脚本需要使用chat,pppd,等命令,所以需要下载ppp-2.4.4

下载成功之后首先便是编译

1
编译 ppp-2.4.4

./configure

Make CC=arm-none-linux-gnueabi-gcc

编译成功后将编译生成的chat,pppd,pppdump等命令拷贝到板子文件系统的/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&

(加上&符号主要是因为拨号成功后,程序会一直执行不退出,所以采用后台运行的方式执行,假如有多个3G卡可能就会产生多个ttyUSB*的设备文件,同时会需要多个wcdma文件此时可以采用pppd call wcdma1来为3G模块1进行ppp拨号),pppd call wcdma是作用是建立协议,并生成网络接口ppp0

拨号成功会出现如下图所示打印





                                                        图9

出现上图9的打印后在/etc/resocv.conf中间添加DNS地址vi /etc/resolv.conf,加入内容:
nameserver 202.99.160.68
nameserver 202.99.166.4
使用ifconfig –a查看是否有ppp0的网络设备
最后测试ppp0网络设备是否能够使用
Ping –I ppp0 www.baidu.com
能够ping通就表示3G卡移植驱动成功
到此阶段3G卡驱动已经移植完毕


调试

在移植该驱动时候出现过诸多问题

1 pppd call wcdma调用失败

root@cz:~# pppd call wcdma&

timeout set to 5 seconds

abort on (NO CARRIER)

abort on (ERROR)

abort on (NO DIALTONE)

abort on (BUSY)

abort on (NO ANSWER)

send (^MAT^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)

expect (OK)

^M

AT+CGDCONT=1,"IP","3GNET",,0,0^M^M

ERROR

-- failed

Failed (ERROR)

Connect script failed

调用AT+CGDCONT=1,"IP","3GNET",,0,0^M^M

这个指令失败,为了测试串口(命令发送通道)能否正常使用

在chat-wcdma-connect中间添加几个其他的AT命令

比如 OK \rAT+CGMI (厂家认证请求,返回模块厂家信息)

     OK \rAT+CGSN (查看产品 IMEI 序列号)

然后在调用pppd call wcdma&发现加上去的那几条AT命令都能正常执行

这说明很可能是EM820W模块没有正确识别SIM卡

后来我又添加了OK \rAT+CSQ指令(查看网络信号质量)发现会调用失败

得出初步结论凡是涉及到SIM卡相关的AT指令都会调用失败,相反其他都能成功执行,这说明板子与EM820W模块之间是能够正确交互数据的,

同时由于EM820W没能识别SIM卡导致相关指令执行失败

后来请教了相关人员,说我的测试方法不正确,我是利用pppd程序来判断某些命令是否能够正常执行,这样就不能排除pppd程序是否能够解析该命令所带来的干扰,所以改为使用一个更为纯粹的办法来进行测试了

Cat/dev/ttyUSB0&

echo “AT+CGSN”> /dev/ttyUSB0

echo “AT+CGMI”> /dev/ttyUSB0

echo “AT+CSQ”  > /dev/ttyUSB0

观察串口得到的response与pppd call wcdma一样

所以还是觉得EM820W没能正确识别SIM卡(不过以后测试还是需要选用正确的方法)

测试SIM卡电路的5根信号线不管是否有SIM卡,5根线各自表现都是一样的,这说明却是没有识别SIM卡,而且SIM_VCC和SIM_RESET的时序一样,这和网上贴出的时序不一样如下图所示,很明显复位信号要比VCC慢半拍



                                   图10

                            图10

硬件工程师此时修改了电路,在SIM_RESET线上加了一个大电容,增加了些许延时

然后调用ppd call wcdma&

发现拨号成功了,同时使用ifconfig –a 命令出现了一个ppp0的网络设备

接着使用ping –I  ppp0 www.baidu.com进行测试,发现网络不通

哎 问题挺多

2
网络不通

网络不通的问题从一开始就觉得肯定与卡没有关系了,很有可能是网络本身的问题,为了排除以太网口eth0的干扰我进行了如下测试

Ifconfig eth0 down

pppd call wcdma&

Ifconfig eth0 up

Ping –I www.baidu.com

经过上面的折腾居然网络也通了,神奇。

上网查询说是双网卡造成的路由问题

果然在ppp0不通的时候route命令发现路由表如下

# route
     Kernel IP routing table
        Destination    Gateway        Genmask           Flags Metric Ref    UseIface
        10.64.64.64    *                255.255.255.255  UH     0     0        0 ppp0
        192.168.7.0    *                255.255.255.0     U       0     0        0 eth0
        default        192.168.7.1    0.0.0.0              UG     0     0        0 eth0

ppp0通的时候路由表如下

# route
       Kernel IProuting table
      Destination    Gateway        Genmask           Flags Metric Ref    Use Iface
      10.64.64.64      *                255.255.255.255   UH   0      0        0ppp0
      192.168.7.0      *                255.255.255.0      U      0     0        0 eth0
      default             *                0.0.0.0             U      0     0        0 ppp0

由上面可以知道ppp0不通因为默认的路由是eth0的,这肯定不通啊


注释







 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: