假期为了上网方便购买了一个移动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的内容更改为:
1 2 3 |
DefaultVendor = 0x04cc DefaultProduct = 0x225c Configuration = 0x02 |
然后执行
1 |
usb_modeswitch -c /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文件,找到
1 |
static const struct usb_device_id option_ids[] = { |
这一行,在下面插入新的一行,输入
1 |
{ USB_DEVICE(0x4cc, 0x225c) }, /* T930s */ |
并保存,手动添加一个Makefile文件,内容如下:
1 2 3 4 5 |
obj-m := option.o module-objs := usb-wwan.o usb_wwan.o KERNELBUILD :=/lib/modules/$(shell uname -r)/build default: make -C $(KERNELBUILD) M=$(shell pwd) modules |
使用这个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的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[Dialer Defaults] Init1 = AT Init2 = ATE0 Init3 = AT+CIMI Init4 = AT^CARDMODE Init5 = AT+CREG=1 Init6 = AT+CREG=1 Init7 = AT+CRSM=176,12258,0,0,10 Init8 = AT+CFUN=1 Init9 = AT+CMEE=1 Modem Type = USB Modem Baud = 460800 New PPPD = yes Modem = /dev/ttyUSB0 ISDN = 0 Phone = *99***1# Password = any Username = any Stupid Mode = 1 |
修改后保存,执行wvdial,终于查看到了成功获取的IP和DNS,打开浏览器,进行测试,页面正常显示~
在电脑上驱动成功后,接下来通过svn下载opne-wrt的源码包,配置好config文件,编译好toolchain,并修改好驱动源码,编译生成新的option.ko,然后使用scp传送到open-wrt上,也同时编辑好usb_modeswitch.conf和wvdial.conf,成功在WR720N上驱动T930s~