歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 嵌入式Linux下使用3G卡上網

嵌入式Linux下使用3G卡上網

日期:2017/2/28 16:25:10   编辑:Linux教程

嵌入式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[]的數組中添加{ USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2746) },完成後,重新編譯即可。 將生成的/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.linuxidc.com,連通的話,證明已經在網上了。但是你會發現網速並沒有達到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上測試正常,其它的網卡應該也可以,只是要注意修改相應的設備描述符即可。

Copyright © Linux教程網 All Rights Reserved