嵌入式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
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線的連線,音訊線的安裝只要參照主機板說明書,不需花太多時間就可以搞定。不過,如果你修的是舊機器或者是一些品牌機時,這...