Debian下成功使用中兴3G无线网卡(ZTE AC2726)拔号上网
五一在电信办了个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技术的无线网卡工作模式的程序(参考),
让它能够在Linux下被识别成Modem。可是无论我怎么配置也无法让我的AC2726工作在Modem模式下,此时网卡的ID号是
0x19d2:0xfff5,而它工作在
Modem模式下的ID号是0x19d2:0xfff1(在windows下的设备管理器里可察看)。网上切换成功的也都是中兴以MF开头的型
号,AC2726是最近新出的,可能使用了某种新的手段吧,使得usb-modeswitch无法正确工作。
Google一番后,发现TuXHaT成功在Linux下使用中兴AC8710的无线网卡(参考
/reliance-netconnect-broadband-on-linux/),AC8710被识别为CD-ROM时的ID号是
0x19d2:0xfff6, Modem时的ID号是0x19d2:0xfff1,跟我的差不多,我的应该也可以。在中兴网站下载了AC8700
Linux驱动的DEB包()
(中文页面并没有提供),安装时提示无法载入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的源代码,使其具有大小可变的缓冲
区(参考),其步骤如下:
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,帖一张截图吧。