ZTE AD3812 3G模块在linux 2.6.34 内核的开发板上的支持方法

  先说段废话,话说在linux 2.6.34 下,好多比较新的3G网卡及3G模块都没有很好的支持。如果想支持的这些3G网卡/3G模块呢,基本上有两种方式:

    1.使用该3G模块的 linux 下的驱动,交叉编译为*.ko ,然后放到开发板下,insmod 进去。然后接入3G模块,ls /dev/下,会发现3G驱动接口ttyUSB0--3 生成。然后想这些ttyUSB*接口发送AT指令,即可拨号上网。具体的拨号方式网上有很多,这里不赘述。

    2.使用usb_modeswitch -c /etc/usb_modeswitch.d/* 的配置文件,来进行转换。将初步识别为存储模块,转换为3G modem。然后也会在/dev目录下生成ttyUSB*的接口,其他内容与 1中相似。

 

  再说道AD3812 , 该3G模块由ZTE公司发行, 貌似也是市场上比较火的一个3G模组。他在linux 内核版本为3.0.1以上时,内核中就包含该模块的驱动(貌似),无需其他转换,插入即可使用。但是在2.6.34 或以下的版本中没有很好的支持。如果使用usb_modeswitch 的方法,需要它的转换配置文件19d2:ffeb,而这个配置文件官方以及相关论坛(http://www.draisberghof.de/usb_modeswitch/)中也没有提供。而LZ试着使用windows下的usb检测工具检测以下转换过程来获取 其 转换文件需要的内容时,也没有正确的获取的到(比较笨~_~).后来看到linux 3.0.1 以后的版本也不是通过usb_modeswitch 来进行转换的,那极有可能就是内置了该3G模块的相关驱动。所以我也想从这入手。

 

  从网上下载到AD3812 的Linux下的驱动http://wwstrong.com/download.php?downloadSearch=ad3812&SearchTypeSystem (非广告),下载完后解压,咦?怎么只有2.6.11 到 2.6.32的驱动?没有2.6.34 的驱动,怎么办,代理商们给的解释就是,参照所给驱动,自己修改。  - -!我了个去,那就改吧!

 

  刚开始我是按照2.6.32的驱动修改的,但是一对比文件感觉有好多的差别,不知道是否全部需要修改,也试了好多次,也可以成功编译出ztemt.ko这个驱动模块,但是插入时,总会提示:

insmod ztemt.ko 
insmod: cannot insert 'ztemt.ko': invalid module format

那就说明其编译的模块,不适用与该内核。后来一个一个内核驱动的试了一下,最后,使用2.6.31 这个里面的驱动,最终插入驱动模块成功。不过2.6.31里面的bus.c文件在编译时可能会提示错误。

/home/driver3g/2.6.31/src/bus.c: In function 'free_dynids':
/homedriver3g/2.6.31/src/bus.c:143: error: implicit declaration of function 'kfree'

我们进入bus.c这个文件,跳到143行,将kfree(dynid); 这段代码注释掉,然后编译,即可通过并生成ztemt.ko 模块,放到开发板上,可以顺利的插入成功啦!然后插入AD3812模块,在/dev目录下可以生成ttyUSB0--3的相关接口。使用pppd拨号即可成功上网啦! 

  

  忙活了3天左右,大致的解决问题的路程是这样的。现在可以成功加载到开发板中,并能够使用AD3812模块,但是不知道注释掉的kfree(dynid); 会不会有其他影响。暂时做一个笔记。

 

下面是pppd 拨号脚本的代码, /etc/ppp/peers/unicom

# /etc/ppp/peers/unicom
# this is ppp script for use chinaunicom's CDMA data service
#
#gsmmodem 
ttyUSB3  
115200 
crtscts                                            
connect '/usr/sbin/chat -v -f /etc/ppp/chat/unicom'
debug    
#nodetach  
noipdefault
usepeerdns       
ipcp-accept-local 
ipcp-accept-remote
#defaultroute
user card
unit 5001

  注:unit 5001 , 如果拨号成功,ifconfig 查看,会生成ppp5001的接口,如果没有这段,默认生成ppp0接口。

  下面是/etc/ppp/chat/unicom 的内容

# /etc/ppp/chat/unicom
# this is the chat script for unicom
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "BUSY"
TIMEOUT 10
"" at
OK AT+CGDCONT=1,"IP","3gnet",,0,0
OK atdt*99#
CONNECT

将这两个文件分别放置对应的目录 ,使用命令 pppd call unicom 即可拨号,如果成功,ifconfig会查看到ppp相关的接口, 使用命令 ping 8.8.8.8 如果有回复,证明开发即可以上网。想访问网站的话,别忘记了在/etc/resolv.conf 加入DNS地址 nameserver 8.8.8.8 (或其他的DNS解析地址)。 整个3G驱动支持 完成。

 

  还有一句话就是:做事情的要专心,如果自己没有其他的办法时,可以让周围的同事或同学给提供一点思路。自己一个人很容易行程思维定式,钻进死胡同地。

posted @ 2013-08-30 10:59  wanhl  阅读(803)  评论(0编辑  收藏  举报