LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 5341|回复: 10

Debian下成功使用中兴3G无线网卡(ZTE AC2726)拔号上网

[复制链接]
发表于 2009-5-9 23:41:02 | 显示全部楼层 |阅读模式
五一在电信办了个3G上网业务(CDMA2000 EVDO RevA),1800包年,每月限时150小时,由于是在推广期间,给冲了2000元,另送一个中兴的无线网卡,型号是AC2726。桂林城市小,价格竟然还要贵些,好像北京160元能包300小时呢。

     现在大多数高速无线上网卡都内置存储空间,用于存储驱动程序和拨号软件等。当首次将这种设备插入USB接口时,该设备被识别为CD-ROM,驱动程序和拨号软件就在其中。当安装完网卡的驱动程序后,再次将其插入时,则被识别为Modem等设备,我的这个网卡还可以插Micro-SD卡,同时作U盘用。以上这些好像称为ZeroCD技术。

    很遗憾,内置的驱动和拨号软件都是for windows的。在Debian下插入网卡,只能被识别为CD-ROM,无法识别成Modem。usb-modeswitch是一个用来切换这种使用了ZeroCD技术的无线网卡工作模式的程序(参考www.draisberghof.de/usb_modeswitch),让它能够在Linux下被识别成Modem。可是无论我怎么配置也无法让我的AC2726工作在Modem模式下,此时网卡的ID号是0x19d2:0xfff5,而它工作在Modem模式下的ID号是0x19d2:0xfff1(在windows下的设备管理器里可察看)。网上切换成功的也都是中兴以MF开头的型号,AC2726是最近新出的,可能使用了某种新的手段吧,使得usb-modeswitch无法正确工作。

Google一番后,发现TuXHaT成功在Linux下使用中兴AC8710的无线网卡(参考www.tuxhat.com/linux/reliance-netconnect-broadband-on-linux/),AC8710被识别为CD-ROM时的ID号是0x19d2:0xfff6, Modem时的ID号是0x19d2:0xfff1,跟我的差不多,我的应该也可以。在中兴网站下载了AC8700 Linux驱动的DEB包(www.ztemt.com.cn/ennewzte/service/ziliao.action)(中文页面并没有提供),安装时提示无法载入ztemt.ko模块,根据TuXHaT所说,该模块与Linux自带USB串口驱动usbserial.ko差不多,因此我直接使用了usbserial.ko,这样的话,只需将DEB包中的ztemtEVDO.sh,10-ztemtEVDO.rules,ztemtvcdromd分别copy到/lib/udev/,/etc/udev/rules/,/sbin下即可,DEB包中大部分是一个拨号程序。(PS:DEB包中包含ztemt.ko模块的源代码,也可以自己重新编译,这样可能会避免因速度限制需重新编译usbserial.ko模块这一步,请读到这篇文章的朋友一试)。以root身份运行ztemtvcdromd,然后插入网卡,这时网卡已被正确的识别为Modem,ID号显示的是0x19d2:0xfff1(lsusb可察看) ,再modprobe usbserial vendor=0x19d2 product=0xfff1,dmesg信息:
[  492.101466] usbserial_generic 4-1:1.0: generic converter detected
[  492.101554] usb 4-1: generic converter now attached to ttyUSB0
[  492.104567] usbserial_generic 4-1:1.1: generic converter detected
[  492.104626] usb 4-1: generic converter now attached to ttyUSB1
[  492.106513] usbserial_generic 4-1:1.2: generic converter detected
[  492.106574] usb 4-1: generic converter now attached to ttyUSB2
[  492.108543] usbserial_generic 4-1:1.3: generic converter detected
[  492.108608] usb 4-1: generic converter now attached to ttyUSB3
[  492.110521] usbserial_generic 4-1:1.4: generic converter detected
[  492.110583] usb 4-1: generic converter now attached to ttyUSB4
[  492.112530] usbserial_generic 4-1:1.5: generic converter detected
[  492.112594] usb 4-1: generic converter now attached to ttyUSB5
[  492.112778] usb 4-1: New USB device found, idVendor=19d2, idProduct=fff1
[  492.112782] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  492.112786] usb 4-1: Product: ZTE CDMA Tech
[  492.112789] usb 4-1: Manufacturer: ZTE, Incorporated
Modem对应的设备为/dev/ttyUSB0。接下来就可以使用wvdial拔号了,下面是我的wvdial.conf:
[Modem0]
Modem=/dev/ttyUSB0
Baud=921600
SetVolume=0
Dial Command=ATDT
Init1=ATZ
FlowControl=Hardware(CRTS CTS)
[Dialer 3g]
Username=ctnet@mycdma.cn
Password=vnet.mobi
Phone=#777
Stupid Mode=1
Inherits=Modem0

执行wvdial 3g,这时已可成功拔号上网了,但是在上网的过程中,会出现速度无法超过62KB的问题,又Google一番后,原来使用的usbserial是针对低速的设备设计的,使用的缓冲区很小,并没考虑现在这种高速上网设备,因此造成网速有限制。可以通过修改usbserial的源代码,使其具有大小可变的缓冲区(参考www.evdoforums.com/thread4381.html),其步骤如下:
1、下载安装内核源码。

2、copy当前内核配置文件至内核源代码目录下,
   cp /boot/config-$(uname -r) /usr/src/linux-2.6.28/.config

3、cd到内核源码目录,为编译模块创建配置文件。
   cd /usr/src/linux-source-2.6.24/ && make menuconfig

4、创建一个usbserial.c的补丁文件/root/usbserial.c.patch,内容如下:

--- linuxold/drivers/usb/serial/usb-serial.c   2006-12-31 17:40:28.000000000 -0600
+++ linux/drivers/usb/serial/usb-serial.c   2009-05-02 23:55:08.000000000 -0600
@@ -58,4 +58,5 @@
*/
+static ushort maxRSize, maxWSize, maxISize;
static int debug;
static struct usb_serial *serial_table[SERIAL_TTY_MINORS];   /* initially all NULL */
@@ -817,4 +818,6 @@
       }
       buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
+      if (buffer_size < maxRSize)
+         buffer_size = maxRSize;
       port->bulk_in_size = buffer_size;
       port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
@@ -841,4 +844,6 @@
       }
       buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
+      if (buffer_size < maxWSize)
+         buffer_size = maxWSize;
       port->bulk_out_size = buffer_size;
       port->bulk_out_endpointAddress = endpoint->bEndpointAddress;
@@ -866,4 +871,6 @@
          }
          buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
+         if (buffer_size < maxISize)
+            buffer_size = maxISize;
          port->interrupt_in_endpointAddress = endpoint->bEndpointAddress;
          port->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
@@ -1191,2 +1198,8 @@
module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Debug enabled or not");
+module_param(maxRSize, ushort, 0);
+MODULE_PARM_DESC(maxRSize, "User specified USB input buffer size");
+module_param(maxWSize, ushort, 0);
+MODULE_PARM_DESC(maxWSize, "User specified USB output buffer size");
+module_param(maxISize, ushort, 0);
+MODULE_PARM_DESC(maxISize, "User specified USB interrupt buffer size");

4、对内核源码中的usbserial.c应用补丁文件
   cd /usr/src/linux-2.6.28 && patch -Np0 -i /root/usbserial.c.patch
   如果未能运行成功,也可以手工对usbserial.c进行修改,只要把以上标有“+”的行加入usbserial.c中相应位置即可。

5、编译修改后的模块(这里实际上编译了所有的USB串口模块,但至少比编译整个内核快得多)
make -C /lib/modules/$(uname -r)/build M=/usr/src/linux-2.6.28/drivers/usb/serial

6、备份当前使用的usbserial.ko,然后将上步生成的usbserial.ko copy到/lib/modules/kernel/drivers/usb/serial/

7、卸载掉旧的usbserial(rmmod usbserial),然后载入新的usbserial,现在我们可以分别指定usbserial使用的接收与发送缓冲区的大小了,modprobe usbserial vendor=0x19d2 product=0xfff1 maxRSize=4096 maxWSize=1024

重新拨号上网,网速已和在windows下没有什么区别了,至此,AC2726已经能够很正常地运行在我的Debian下了。(PS:可以把ztemtvcdromd和modprobe usbserial vendor=0x19d2 product=0xfff1 maxRSize=4096 maxWSize=1024这两个命令加入到/etc/init.d/rc.local,免得每次都要手工输入)。

我现在使用KPPP拨号,方便计时。EVDO的速度还不错,峰值飙到过300多,平常也能经常上到一两百K,帖一张截图吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2009-5-10 00:02:52 | 显示全部楼层
俺们小地方还没 3g ,只羡慕的份了
回复 支持 反对

使用道具 举报

发表于 2009-5-10 07:57:29 | 显示全部楼层
3G没进如我的计划,可是还是很欣喜的看到linux内核的支持能力,
回复 支持 反对

使用道具 举报

发表于 2009-5-10 08:04:04 | 显示全部楼层
Post by dammmm;1985454
俺们小地方还没 3g ,只羡慕的份了


呵呵,俺们这虽然有,但是俺们穷人也只有羡慕的份了!
回复 支持 反对

使用道具 举报

发表于 2009-5-12 16:40:35 | 显示全部楼层
cool ,支持一下,Y的那些设备制造商为什么那么势利,不能提供官方的解决方案?
回复 支持 反对

使用道具 举报

发表于 2009-5-13 10:02:13 | 显示全部楼层
先收藏了,需要的时候在看。
回复 支持 反对

使用道具 举报

发表于 2009-5-14 10:34:29 | 显示全部楼层
Mark之,以备不时之需。
回复 支持 反对

使用道具 举报

发表于 2009-5-14 19:27:57 | 显示全部楼层
到此一游:cool:
回复 支持 反对

使用道具 举报

发表于 2009-5-14 20:38:41 | 显示全部楼层
真复杂阿……
回复 支持 反对

使用道具 举报

发表于 2009-5-16 16:11:05 | 显示全部楼层
如果3g上网本需要使用linux为操作系统的话,支持linux下拨号应该很快会出来的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表