android 3G移植

案头见蠹鱼,犹胜凡俦侣。这篇文章主要讲述android 3G移植相关的知识,希望能为你提供帮助。
本文转载自:http://blog.csdn.net/hanmengaidudu/article/details/17028383
一 开发环境简介

内容                                              
                    说明
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模块驱动
android 3G移植

文章图片
                                        图 1
如图1首先选择Device Drivers
 
android 3G移植

文章图片
android 3G移植

文章图片

                      图2
如图2进入USB support
android 3G移植

文章图片
android 3G移植

文章图片

                      图 3
进入USB support之后一直往下直到找到图3并选择USB转串口
android 3G移植

文章图片

                      图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界面
android 3G移植

文章图片

                          图5
首先同样也是进入驱动配置界面Device Drivers
android 3G移植

文章图片
android 3G移植

文章图片

                          图6
如图6选择网络设备支持
android 3G移植

文章图片
android 3G移植

文章图片

                          图7
如图7选择ppp
到这一步驱动和协议就都已经配置成功了接下来就是编译下载到板子
登入到linux, dmesg查看内核打印信息
android 3G移植

文章图片
android 3G移植

文章图片

                          图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
拨号成功会出现如下图所示打印
android 3G移植

文章图片
android 3G移植

文章图片

                                                        图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调用失败
[email  protected]:~# pppd call wcdma&
timeout set to 5 seconds
abort on (NO CARRIER)
abort on (ERROR)
abort on (NO DIALTONE)
【android 3G移植】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慢半拍
android 3G移植

文章图片

                                    图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的,这肯定不通啊
 
六 注释
android 3G移植

文章图片
android 3G移植

文章图片
android 3G移植

文章图片

    推荐阅读