在Open-Wrt上驱动上海贝尔T930s G3上网卡

假期为了上网方便购买了一个移动G3 USB上网卡,型号是上海贝尔T930s。它在Windows上使用很正常,而在Linux或者是Open-Wrt下却无法使用。因为我想制作一个能方便带出去随时随地可以提供网络接入的设备,就打算使用支持USB 3G网卡和USB供电的WR720N迷你无线3G路由来实现。

实际在使用Open-Wrt的WR720N插上网卡后,第一步就遇到了问题:使用usb_modeswitch工具切换到modem状态失败。从网上搜索,除了求救贴,没有任何关于T930s的有效信息。没办法,求人不如求己。根据usb_modeswitch官网文档提供的Hack实例,配合官方配置参考提供的配置文件参数,使用Device Monitoring Studio在Vmware下抓取USB网卡的URB数据包,通过分析信息,得知这个T930s设备(Vid=04cc,Pid=225c)从USB驱动盘模式切换到modem模式并不需要发送什么初始化字符串,而是通过Select Configuration操作,选择第二个Configuration来实现切换。因此我就把/etc/usb_modeswitch.conf的内容更改为:

然后执行

就切换到了modem模式

新的问题出现了,/dev下依旧没有出现ttyACM或者ttyUSB之类的设备。寻找原因后发现是linux并没有识别这个usb modem设备。搜索方案提供商ST-Ericsson只提供了M6718的少量信息,不提供驱动,上海贝尔的网站也不提供支持。没办法,自己来修改一下驱动吧。经过查看usb信息,得知这个M6718实现了CDC Modem,并且通讯的类非常标准,所以准备修改linux的option模块的源代码,重新编译生成支持3g modem的option模块并加载来驱动

从linux源代码包中的usb driver所在的目录中复制出option.c,usb_wwan.h,usb_wwan.c三个文件,然后编辑option.c文件,找到

这一行,在下面插入新的一行,输入

并保存,手动添加一个Makefile文件,内容如下:

使用这个Makefile编译生成option.ko

先使用rmmod option命令卸载旧的option模块,再使用insmod命令加载编译好的option.ko模块。插入USB modem,执行usb_modeswitch,再执行ls /dev/ | grep ttyUSB 命令,发现出现了ttyUSB0到ttyUSB5这6个设备,自此,成功在linux下驱动T930s

后面就是使用wvdial来进行拨号了。按照默认的设置,是无法进行拨号的,因为modem需要使用额外的AT命令进行初始化。这个命令在windows下是由G3随e行这个软件来完成的。由于都是使用USB通信,因此再次使用Device Monitoring Studio监控CMCC AT Interface这个COM口的通讯信息,不过这次使用Line View来查看信息。通过监控,得到了初始化命令,修改/etc/wvdial.conf的内容如下:

修改后保存,执行wvdial,终于查看到了成功获取的IP和DNS,打开浏览器,进行测试,页面正常显示~

在电脑上驱动成功后,接下来通过svn下载opne-wrt的源码包,配置好config文件,编译好toolchain,并修改好驱动源码,编译生成新的option.ko,然后使用scp传送到open-wrt上,也同时编辑好usb_modeswitch.conf和wvdial.conf,成功在WR720N上驱动T930s~