硬件平台:
海思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 */”之前)添加三行:
解释一下什么意思,这个就是添加一下我所用到的三种3G模块的设备信息,不然插上3G模块,系统无法识别,首先要保证系统识别才能进行后面的操作,在USB_DEVICE(0x12d1,0x1404)中,0x12d1是厂商ID,0x1404是设备模块的ID,这两个参数需要你参考你所使用的模块的datasheet文档了,因为我用的是这三个模块,所以填入对应的值就可以了。
添加完之后,就可以重新编译内核,并把内核烧写到板子中,这里烧写过程不赘述。
3、在系统启动脚本中添加驱动加载,在/etc/init.d/rcS中添加下面几行,其中usbserial.ko和option.ko的路径根据在开发板中的具体位置而定
4、在系统/var/目录下创建2个文件夹:(注意,这一步很关键,不然在进行拨号时会报Can't create lock file /var/lock/LCK..ttyUSB0: No such file or directory的错误)
5、重头戏,移植pppd,我用的是ppp-2.4.5,大家可以从ftp://ftp.samba.org/pub/ppp/这里进行下载。
这里和以往的交叉编译有些不同,以往的交叉编译中,都是在运行./configure的时候,同时制定CC,AR,LD,STRIP等参数,然后再make一下就完了。但是编译这个的时候,要注意,在运行./configure的时候配置上述参数根本不起作用,我当时就按照以往的习惯编译了一遍,结果也没有报错,但是实际上使用的PC本身的gcc编译的,并非交叉编译,这里一定要注意。
在make的同时指定CC等编译参数,命令如下:
因为我的交叉编译器路径保存到了/opt/hisi-linux/x86-arm/gcc-3.4.3-uClibc-0.9.28/bin路径下,大家可根据实际情况修改。
6、编译完成之后,拷贝编译后的文件:
其中/usr/local/build这个目录是我把最终需要拷贝的都放在这个目录下,到时候将这个目录下的文件统统拷贝到开发板中的/usr/目录下
回到ppp-2.4.5目录中:
好了,现在我们所需要移植的文件都在build文件中了,其中pppd chat pppdump pppstats这几个文件还有pap-secrets和chap-secrets是最主要的,其他的文件都不太重要,如果板子空间不够,可以不复制。
7、将build文件夹中的lib和sbin目录复制到开发板的/usr/下面,将etc目录复制到根目录/下。
8、一切就绪之后,开始拨号吧,看一下/dev目录下应该有ttyUSB0等设备,这些就是3G模块已经加载了,如果你的板子没有,那么请检查驱动是否弄正确了,而且不要忘了mount一下。来到开发板中,先创建文件夹:
如果有了就不用创建了。然后在/etc/ppp/chat/目录下创建4个文件:
第一个文件:wcdma-connect-chat,内容如下:
第二个文件:evdo-connect-chat,内容如下
第三个文件:td-connect-chat,内容如下
第四个文件:disconnect-chat,内容如下
然后再在peers目录中,同样创建3个文件,这三个文件和刚才的那三个文件是分别对应3中制式的不同模块的拨号方式
第一个文件:evdo-dailer,内容如下
第二个文件:wcdma-dailer,内容如下
第三个文件:td-dailer,内容如下
对于上面的这些参数解释一下
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目录中进行)
其中联通和电信的我已经自己测试成功,移动的没有测试,大家自己测测吧。在拨通了之后,会打印出类似如下消息,
cript /etc/ppp/ip-up finished (pid 1763), status = 0x0
这时代表已经拨号成功,通过ifconfig命令可以看到有个ppp0,说明大功告成了。
另外转载别人几篇类似的博文,
首先必须让开发板识别上网卡,因此,要修改usb_modeswitch.conf,但usb_modeswitch并没有带有E1750的配置文件,不像EC169那么方便 #E1750 TargetVendor= 0x12d1 然后是ppp拨号下的配置 /nfs/etc/ppp/peers/wcdma ttyUSB0 接着是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用于存放最后生存的库文件与头文件。 [[email protected]]# mkdir install B. 配置并生成Makefile文件 [[email protected]]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-1.0.6/install C. [[email protected]]#make D. [[email protected]]# make install 2. 设置PKG_CONFIG_PATH环境变量,以使我们后面的编译能够顺利找到libusb库 A.设置环境变量 [[email protected]]# export PKG_CONFIG_PATH=/home/Anson/libusb-1.0.6/install/lib/pkgconfig:$PKG_CONFIG_PATH B.查看是否设置正确 [[email protected]]#echo $PKG_CONFIG_PATH 3. 交叉编译lib_compat 与上面编译libusb的方法类似: A.[[email protected]]#.mkdir install B . [[email protected]]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-compat-0.1.3/install C. [[email protected]]#make D. [[email protected]]#make install
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
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 如果没有使用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
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"
(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'
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
ABORT "ERROR" ABORT "NO DIALTONE" SAY "\nSending break to the modem\n" '' "\K" '' "+++ATH" SAY "\nGoodbay\n"
(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'
ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' \rATZ OK-AT-OK ATD#777 CONNECT \d\c
ABORT "ERROR" ABORT "NO DIALTONE" SAY "\nSending break to the modem\n" '' "\K" '' "+++ATH" SAY "\nGoodbay\n"
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内核)的开发板。
一、环境
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用于存放最后生存的库文件与头文件。
[[email protected]]# mkdir install
配置并生成Makefile文件
[[email protected]]# ./configure --host=arm-uclibc-linux --test=arm-uclibc-linux --prefix=/root/libusb-0.1.12/install
[[email protected]]# make
[[email protected]]# 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用于存放最后生存的库文件与头文件。
[[email protected]]# mkdir install
B. 配置并生成Makefile文件
[[email protected]]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-1.0.6/install
C. [[email protected]]#make
D. [[email protected]]# make install
2. 设置PKG_CONFIG_PATH环境变量,以使我们后面的编译能够顺利找到libusb库
A.设置环境变量
[[email protected]]# export PKG_CONFIG_PATH=/home/Anson/libusb-1.0.6/install/lib/pkgconfig:$PKG_CONFIG_PATH
B.查看是否设置正确
[[email protected]]#echo $PKG_CONFIG_PATH
3. 交叉编译lib_compat
与上面编译libusb的方法类似:
A.[[email protected]]#.mkdir install
B . [[email protected]]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-compat-0.1.3/install
C. [[email protected]]#make
D. [[email protected]]#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”命令进行拨号 |
首先进入make menuconfig界面
图 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)
同样也是进入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模块
由于该拨号脚本需要使用chat,pppd,等命令,所以需要下载ppp-2.4.4
下载成功之后首先便是编译
./configure
Make CC=arm-none-linux-gnueabi-gcc
编译成功后将编译生成的chat,pppd,pppdump等命令拷贝到板子文件系统的/usr/sbin目录下边去
在板子文件系统/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卡驱动已经移植完毕
在移植该驱动时候出现过诸多问题
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进行测试,发现网络不通
哎 问题挺多
网络不通的问题从一开始就觉得肯定与卡没有关系了,很有可能是网络本身的问题,为了排除以太网口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的,这肯定不通啊