原文地址::http://blog.csdn.net/ipromiseu/article/details/5154004
3G卡片在開發板上的詳細解決方案(適用於大多數3G卡片)
Anson Luo /Gray Luo(羅國輝)
一. 環境
1. 開發板核心:linux kernel 2.6.14
2. 3G卡片:HUAWEI E1750
二. 相關工具與庫檔案下載
1. usb_modeswitch-1.0.6.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)
建議下載較新版本,如果怕麻煩就下載與我一樣的版本,下同。
Usb_modeswitch是對USB裝置的工作模式進行轉換一種萬能工具,當然這種寶貝,只有在linux下才能體現其巨大的作用。隨著移動通訊,無線通訊的發展,越來越多的裝置被製作成USB介面,像一些無線網卡,3G數據卡等等。這些裝置的廠家一般都會提供windows 下驅動,這些裝置在第一次插上機子的時候,它們處於CDROM+快閃記憶體模式,可以從中提供驅動程式安裝驅動,在驅動程式安裝完成後,驅動會轉換成3G模式,此時就會出現usb modem裝置,目前的3G卡片全都是這樣,這就是所謂的“ZeroCD”。
而在linux下我們可沒有那麼好的待遇,廠家一般不會給我們提供linux下面的驅動,而目前的核心還不能自動識別並驅動。所以我們需要用usb_modeswitch這個工具來進行模式轉換,裝置模式依賴usb-storage和usbserial模式,所以,在開發板上需要有這兩種模組的支援,裝置並能夠正常工作於這兩種模式下。
2.usb_modeswitch-current_data.tar.bz2(http://www.draisberghof.de/usb_modeswitch/)
這個包裡包括提供給UDEV的驅動裝置資訊,和很多裝置使用usb_mdoeswitch進行轉換模式時需要配置的參數。下載它用於參考。
3. libusb-1.0.6.tar.bz2 (http://sourceforge.net/projects/libusb/files/libusb-1.0/)
Libusb才是我們的真正骨幹力量,提供給usb_modeswitch一套系統API,所以,自然usb_modeswitch這個包工頭要想工作,肯定不能離開libusb這個工人為其服務。
4.libusb-compat-0.1.3.tar.bz2 (http://www.linuxfromscratch.org/blfs/view/svn/general/libusb-compat.html)
libusb分為0.1和1.0兩年版本,而1.0版本與0.1有較大的不同,並不向下相容,必須依賴libusb-compat。
三. 交叉編譯usb_modeswitch
1. 交叉編譯 libusb
A. 解壓並進入libusb-1.0.6目錄,建立子目錄install用於存放最後生存的庫檔案與標頭檔。
[Anson@libusb-1.0.6]# mkdir install
B. 配置並產生Makefile檔案
[Anson@libusb-1.0.6]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-1.0.6/install
C. [Anson@libusb-1.0.6]#make
D. [Anson@libusb-1.0.6]# make install
2. 設定PKG_CONFIG_PATH環境變數,以使我們後面的編譯能夠順利找到libusb庫
A.設定環境變數
[Anson@libusb-1.0.6]# export PKG_CONFIG_PATH=/home/Anson/libusb-1.0.6/install/lib/pkgconfig:$PKG_CONFIG_PATH
B.查看是否設定正確
[Anson@libusb-1.0.6]#echo $PKG_CONFIG_PATH
3. 交叉編譯lib_compat
與上面編譯libusb的方法類似:
A.[Anson@libusb-compat-0.1.3]#.mkdir install
B . [Anson@libusb-compat-0.1.3]#./configure --build=i686-linux --host=arm-linux --prefix=/home/Anson/libusb-compat-0.1.3/install
C. [Anson@libusb-compat-0.1.3]#make
D. [Anson@libusb-compat-0.1.3]#make install
說明:如果此時出現"-Wno-pointer-sign"、"-fvisibility=hidden"這類錯誤,則是由於編譯器版本過低不支援導致的,可以直接在Makefile和libusb/Makefile檔案中刪除這些編譯選項即可。
4. 交叉編譯usb_modeswitch
A.修改Makefile檔案
修改STRIP和CC選項為:
STRIP = arm-xxx-linux-strip
CC = arm-xxx-linux-gcc
B. 可以將上面的libusb和libusb-compat的庫和標頭檔拷貝到交叉編譯器的lib和include目錄下,或者直接加上編譯選項指令庫的路徑即可如下:
INCLUDEDIR = /home/anson//libusb-1.0.6/install/include/libusb-1.0
LIBDIR = /home/anson/libusb-1.0.6/install/lib
$(PROG): $(OBJS)
$(CC) $(CCFLAGS) -I $(INCLUDEDIR) -L $(LIBDIR) -o $(PROG) $(OBJS)
這裡的usb.h就是libusb-compat目錄下的,如果沒有usb.h,usb_modeswitch是編譯不過去的。
C. make
5. 編輯usb_modeswitch目錄下的usb_modeswitch.conf檔案,加入以下內容:
DefaultVendor= 0x12d1 DefaultProduct= 0x1446 TargetVendor = 0x12d1 TargetProduct= 0x1001 MessageContent="55534243000000000000000000000011060000000000000000000000000000" MessageEndpoint=0x01 CheckSuccess=5 HuaweiMode=0 (特別注意這個參數,我在開發板上的麻煩就出在這個參數上面) |
6. 將上面產生的libusb動態庫拷貝到開發板的庫目錄下,將上面產生的usb_modeswitch可執行程式和usb_modeswitch.conf設定檔下載到開發板某目錄下。
四. 交叉編譯3G卡片驅動
1. 編譯 3G模組的驅動option.ko
在核心源碼包中找到usb的3G驅動檔案 driver//usb/serial/option.c在其中加入3G卡片的 HUAWEI_VENDOR_ID 0x12D1和HUAWEI_PRODUCT_E1750 0x1446。然後修改Kconfig將option編譯成模組。將編譯產生的option.ko下載到開發板中並使用insmod載入。
五. 載入驅動
1. 掛載usb虛擬檔案系統:mount -t usbfs usbfs /proc/bus/usb/
2. 彈出3G卡片的cdrom: eject /dev/cdroms/cdrom0
3. 現在就可以使用usb_modeswitch –W –c ~/usb_modeswitch.conf切換3G卡片的模式了。此時會出現一些資訊,你會看到轉換成3G模式後的幾個串口資訊,ttyUSB0, ttyUSB1, ttyUSB2,如下:
option 1-1:1.0: Option 3G data card converter detected
usb 1-1: Option 3G data card converter now attached to ttyUSB0
option 1-1:1.1: Option 3G data card converter detected
usb 1-1: Option 3G data card converter now attached to ttyUSB1
option 1-1:1.2: Option 3G data card converter detected
usb 1-1: Option 3G data card converter now attached to ttyUSB2
如果沒有使用udev,就不會自動產生這些結點,所以需要手動建立這些字元節點。
mknod /dev/usb/ttyUSB0 c 188 0
mknod /dev/usb/ttyUSB1 c 188 1
mknod /dev/usb/ttyUSB2 c 188 2
此時你可以在/dev/usb/tts下面找到產生了3個節點1,2,3.如果在PC上面使用發行版,一般都會使用udev做/dev下面的節點,這樣子就可以直接在/etc/udev/rules.d/下面添加相應的裝置資訊和處理就可以了,但是由於開發板上並沒有udev,它會生態太多裝置節點,對嵌入式開發資源有較大浪費,這裡,根據提示資訊說明driver在X1地址處找到了Y1裝置,它在/dev下面的節點叫Z1,所以此時我們需要手動建立。我的意思就是說這個節點本身已經註冊了相應的ioctl了,只是裝置節點沒有產生而以,所以這時手動建立是完全沒有問題的。
4. 使用串口的測試載入器發送AT指令測試幾個串口是否可用。
六. 交叉編譯pppd撥號工具,並編寫撥號指令碼
1. 交叉編譯pppd撥號工具(這裡不詳細講解,可參考後續文章的詳細說明)
2. 編寫撥號指令碼,與GPRS的撥號指令碼類似。
A. 聯通WCDMA-HSDPA:
(1)wcdma:
debug nodetach lock /dev/ttyUSB0 115200 user "card" password "card" crtscts show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote connect '/usr/sbin/chat -s -v -f chat-wcdma-connect' disconnect '/usr/sbin/chat -s -v -f chat-wcdma-disconnect' |
(2) chat-wcdma-connect:
TIMEOUT 5 ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' /rAT OK /rATZ OK /rAT+CGDCONT=1,"IP","3gnet",,0,0 OK-AT-OK ATDT*99# CONNECT /d/c |
(3) chat-wcdma-disconnect
ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY "/nSending break to the modem/n" '' "/K" '' "+++ATH" SAY "/nGoodbay/n" |
B. 移動TD-CDMA
(1)td:
debug logfile /var/log/pppd.log lock /dev/ttyUSB0 115200 user "card" password "card" crtscts connect '/usr/sbin/chat -v -t3 -f td-connect-chat' disconnect '/usr/sbin/chat -s -v -f td-disconnect-chat' show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote |
(2) td-connect-chat:
ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' /rATZ OK-AT-OK ATD#777 CONNECT /d/c |
(3) td-disconnect-chat:
ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY "/nSending break to the modem/n" '' "/K" '' "+++ATH" SAY "/nGoodbay/n" |
C. 電信CDMA1x
(1) cdma1x:
debug nodetach lock /dev/ttyUSB0 115200 user "card" password "card" crtscts show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote connect '/usr/sbin/chat -s -v -f cdma1x-connect-chat' disconnect '/usr/sbin/chat -s -v -f cdma1x-disconnect-chat' |
(2) cdma1x-connect-chat:
TIMEOUT 5 ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' /rATZ OK /rAT/^PREFMODE=2 OK-AT-OK ATD#777 CONNECT /d/c |
(3) cdma1x-disconnect-chat:
ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY "/nSending break to the modem/n" '' "/K" '' "+++ATH" SAY "/nGoodbay/n" |
D. 電信CDMA2000-EVDO
(1) evdo:
debug nodetach lock /dev/ttyUSB0 115200 user "card" password "card" crtscts show-password usepeerdns noauth noipdefault novj novjccomp noccp defaultroute ipcp-accept-local ipcp-accept-remote connect '/usr/sbin/chat -s -v -f evdo-connect-chat' disconnect '/usr/sbin/chat -s -v -f evdo-disconnect-chat' |
(2)evdo-connect-chat:
TIMEOUT 5 ABORT 'NO CARRIER' ABORT 'ERROR' ABORT 'NO DIALTONE' ABORT 'BUSY' ABORT 'NO ANSWER' '' /rATZ OK-AT-OK ATD#777 CONNECT /d/c |
(3)evdo-disconnect-chat:
ABORT "BUSY" ABORT "ERROR" ABORT "NO DIALTONE" SAY "/nSending break to the modem/n" '' "/K" '' "+++ATH" SAY "/nGoodbay/n" |
3. 使用pppd撥號 :pppd file td(wcdma/evdo/cdma1x)
4. 此時將會使用指令碼中設定的連接埠進行撥號,如果成功後會獲得IP地址,電信的3G卡片擷取的是外網IP地址,而其它則是擷取的一個內網IP,將擷取到的DNS添加到/etc/resolv.conf.中,並使用route添加一條預設路由,ping一下外網的地址,如果能夠ping通,則說明完成了本篇的工作了,電信,移動,聯通有的網路會禁ping,所以ping不通,所以這果,就需要使用自己的測試載入器,發送tcp/udp包,確定是否成功完成本篇工作。
七. 可參考文章:
1. http://blog.chinaunix.net/u3/106318/showart_2110454.html
2. http://blog.chinaunix.net/u3/106318/showart_2102540.html
後記:很多朋友給我發郵件討論一些問題,但是很多網友根本沒有嚴格按照我文中講的方法進行一步一步的操作,有的跳過了一些步驟,有些使用了軟體的最新版本,這裡我說明一下,我上面使用方法都是只限於我使用的軟體版本,如果你使用最新的版本,可能你需要自己進行調試,本文只能作為參考 ,對於最新的版本我沒有測試過,所以如果你想節約時間,請嚴格使用我文章各軟體版本。當你的工作陷入問題的時候,請不要急於找人協助,而是先確定問題,然後再重新仔細地讀我的文章,如果你完全按照我的文章來做,不應該會出現一些問題的。在此謝謝大家的關注!