中興AC2746 usb介面的3G上網絡卡

2021-05-23 11:16:04 字數 4676 閱讀 3723

嵌入式linux是2.6.24版的。主機是at9261(arm926ej-s核心)的開發板。

買是市面上常見的中興ac2746 usb介面的3g上網絡卡。在windows下使用極方便,可是在linux下使用就麻煩了。

首先,要確認你的嵌入式linux系統是可以支援熱插拔的系統。(我用的是mdev方式支援熱插拔)

然後,是驅動的安裝。ac2746沒有專門linux下的驅動。不過,它的usb口在windows系統中實際是用usb轉串列埠的方式轉為串列埠工作的。那麼,在linux下同樣也可以用usb轉串列埠的方式來使用。linux核心自帶了usb轉串列埠的驅動。在核心的編譯選擇中,選中

device drivers  ---> [*] usb support  ---> usb serial converter support  --->  usb serial converter support

再選中其下的usb driver for gsm and cdma modems 的選項即可。要注意的是,編譯方式一定要選為模組化編譯。

選定這兩項後,執行make modules命令,會編譯原始碼中/driver/usb/serial/目錄下的usb-serial.c和option.c兩個檔案及其它一些相關檔案。

在option.c中,可以看到已經定義了很多裝置的描述符,但沒有定義ac2746的描述符。我們自已定義一下即可。方法是,在原始碼中,新增

#define    zte_vendor_id        0x19d2

#define    zte_product_ac2746    0xfff1

在option_ids的陣列中新增 ,

完成後,重新編譯即可。 將生成的/driver/usb/serial/usbserial.ko,option.ko拷貝到嵌入式linux根檔案系統的/lib/modules/2.6.24目錄下。

執行insmod /lib/modules/2.6.24/usbserial.ko

insmod /lib/modules/2.6.24/option.ko

插入ac2746,通常系統會認為是cdrom和usb stroage裝置插入,並會生成/dev/sr0檔案(我用的mdev方式生成裝置檔案,如果你用的是其它方式,可能裝置名會不一樣)。這時,輸入eject /dev/sr0命令,則系統會自動刪除/sr0,並重新確認ac2746,這時,就會認出它是乙個cdma資料卡,並自動生成/dev/ttyusb0,/dev/ttyusb1,

/dev/ttyusb2,/dev/ttyusb3,/dev/ttyusb4,共5個序列口。這一步是最容易出錯的,現象是沒有生成這幾個裝置檔案。出錯的原因主要是裝置描述符沒有在驅動程式中定義,檢視一下你的cdma卡的裝置描述符。方法是,把cdma資料卡插到桌面版的linux下,執行lsusb命令即可檢視到,然後修改option.c中的裝置描述符。有了這幾個裝置,就成功了一大半。

接下來,是安裝pppd撥號軟體。網上有很多相關資料,我不多說了。安裝好後,要寫兩個指令碼。乙個是在/etc/ppp/peers/evdo檔案。內容如下

# usage: root>pppd call evdo

# privied by hugerat

/dev/ttyusb0

921600

crtscts

modem

debug

nodetach

usepeerdns

noipdefault

defaultroute

user

[email protected]

password vnet.mobi

0.0.0.0:0.0.0.0

connect '/usr/sbin/chat -s -v -f /etc/ppp/evdo-connect-chat'

其中,user和password項可能會因為地區不同而不同(這兩項是南京地區的)

再建立/etc/ppp/evdo-connect-chat檔案,檔案內容如下:

#/etc/ppp/evdo-connect-chat

# chat script for china telecom, used ac2746.

# privided by hugerat

timeout 15

abort "delayed"

abort "busy"

abort "error"

abort "no dialtone"

abort "no carrier"

timeout 15

"" at

ok ate0

ok at/^prefmode=8

ok atdt#777

connect

要說明的一項是at/^prefmode=8,這個是設定模組工作模式的。2表示用cdma 1x模式。4表示evdo模式,8表示混和模式。模組預設是用2,即cdma 1x模式。如果你要使用evdo高速上網就要設為4或8。

執行pppd call evdo&,順利的話,撥號就會成功,並會獲得dns伺服器位址。ping

www.google.com.hk

,連通的話,證明已經在網上了。

但是你會發現網速並沒有達到evdo的正常速度。這是因為,usb-serial.c並不是為高速外設設計的,它的快取開的太小,要把快取開大。方法如下。

建立乙個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");

這個檔案是我在網上找到的,並不是2.6.24版的,不能直接為usb-serial.c打上補丁,不過,沒關係,你可以手工新增帶「+」號的資訊到指定的位置即可。

完成後,重新編譯生成usbserial.ko檔案。

insmod /lib/modules/2.6.24/usbserial.ko命令改為如下

insmod /lib/modules/2.6.24/usbserial.ko maxrsize=4096 maxwsize=1024

這樣,再試試網速吧,一切正常了。

上述方法在ac2746上測試正常,其它的網絡卡應該也可以,只是要注意修改相應的裝置描述符即可。

windows遮蔽USB介面的指令碼

本指令碼在win10電腦測試通過 新建乙個檔案enableusb.reg 這個是開啟usb介面 windows registry editor version 5.00 hkey local machine system currentcontrolset services usbstor star...

5 30 USB介面的定義 10分

30 usb介面的定義 10分 定義乙個usb介面,並通過mouse和u盤類實現它,具體要求是 1.介面名字為usb,裡面包括兩個抽象方法 void work 描述可以工作 void stop 描述停止工作 2.完成類mouse,實現介面usb,實現兩個方法 work方法輸出 我點點點 stop方法...

如何正確判斷USB等介面的接線順序

如何正確判斷usb等介面的接線順序 機器更換了主機板,或者在檢修過程中需要取出主機板,而你自己又沒有細心記住這些線的連線,這時你該如何正確連線這些連線呢?我們在安裝新機器的時候,usb線的連線,音訊線的安裝只要參照主機板說明書,不需花太多時間就可以搞定。不過,如果你修的是舊機器或者是一些品牌機時,這...