嵌入式Linux下3G無線上網路卡的驅動

科技小能手發表於2017-11-12

核心:需要有以下模組:option usbserial usbstorage

主要是要在編譯核心的時候選中

[*] Network device support  —>

       <*>   PPP (point-to-point protocol) support

       <*>     PPP BSD-Compress compression

        <*>     PPP Deflate compression

       [*]     PPP filtering

       <*>     PPP MPPE compression (encryption)

       [*]     PPP multilink support

       <*>     PPP over Ethernet

       <*>     PPP support for async serial ports

       <*>     PPP support for sync tty ports

[*] USB support  —>

       <*>     USB Modem (CDC ACM) support

[*] USB support  —>

    <*>   USB Serial Converter support  —>

              <*>   USB driver for GSM and CDMA modems

修改linux-2.6.21.x/drivers/usb/serial/option.c

#define HUAWEI_WENDIR_ID 0x12d1

#define HUAWEI_PRODUCT_ECxx 0x14ef

{USB_DEVICE(HUAWEI_WENDIR_ID,HUAWEI_PRODUCT_ECxx)} /*HUAWEI  xxx*/

#make modules                       //編譯外掛模組

#make modules_install            //安裝模組

#usbserial.ko,option.ko

模組編譯完後應將其複製到開發板上,並執行以下命令,否則會報找不到modules.dep

#depmod –a                    //建立模組的連結

#modprobe usbserial.ko

# modprobe option.ko

軟體4個:libusb、usb_modeswitch、pppd、usb-modeswitch-data(交叉編譯)

#lsusb、usb_modeswitch、(lib資料夾)、chat、pppd等移植到開發板。

這個資料包包含了usb_modeswitch所有支援的3G上網路卡的配置檔案。

1.在開發板上USB口插入3G上網路卡。

2.在開發板上輸入lsusb會出現以下結果,說明開發板與3G上網路卡硬體物理上連線成功,記下12d1:14ef這個數字,後邊用。

# lsusb

Bus 004 Device 002: ID 12d1:14ef HUAWEI XXXX(省略若干)

這裡若無lsusb命令,可以檢視/proc/bus/usb/devices下的響應裝置資訊。其中:

#cat /proc/bus/usb/devices

Vendor=12d1 ProdID=14ef

3.編輯usb_modeswitch目錄下的usb_modeswitch.conf檔案

# T-Mobile NL (Huawei xxx)

#

# Contributor: Alex Hermann

DefaultVendor= 0x12d1

DefaultProduct=0x14ef

TargetVendor= 0x12d1

TargetProduct= 0x1506

MessageContent=”55534243123456780000000000000011062000000100000000000000000000″

CheckSuccess=5

4.執行usb_modeswitch將3G上網路卡U盤模式轉換為modem模式

#./usb_modeswitch -c /etc/usb_modeswitch/usb_modeswitch.conf

Looking for target devices …

 No devices in target mode or class found

Looking for default devices …

   found matching product ID

   adding device

 Found device in default mode, class or configuration (1)

Accessing device 003 on bus 001 …

Getting the current device configuration …

 OK, got current device configuration (1)

Using first interface: 0x00

Using endpoints 0x08 (out) and 0x87 (in)

Inquiring device details; driver will be detached …

Looking for active driver …

 OK, driver found (“usb-storage”)

 OK, driver “usb-storage” detached

SCSI inquiry data (for identification)

————————-

  Vendor String: HUAWEI  

  Model String: Mass Storage    

  Revision String: 2.31

————————-

USB description data (for identification)

————————-

  Manufacturer: HUAEI TECHNOLOGIES

  Product: HUAWEI Mobile

  Serial No.: not provided

————————-

Setting up communication with interface 0

Using endpoint 0x08 for message sending …

Trying to send message 1 to endpoint 0x08 …

 OK, message successfully sent

Resetting response endpoint 0x87

 Could not reset endpoint (probably harmless): -145

Resetting message endpoint 0x08

 Could not reset endpoint (probably harmless): -19

 Device is gone, skipping any further commands

Checking for mode switch (max. 20 times, once per second) …

 Searching for target devices …

Found target device, now opening

 Found correct target device

Mode switch succeeded. Bye.


螢幕會顯示一堆模式轉換資訊,之後會顯示成功

檢查是否轉換成功,執行lsusb,發現14ef變為1506,表示轉換成功。

5.檢視/dev下是否有一下裝置節點

#ls /dev/ttyUSB*

#/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3 /dev/ttyUSB4

這裡根據切換後的提醒,建立相應的裝置節點。

6.硬體問題都解決了,開始撥號吧:(電信的撥號指令碼,聯通、移動的應該會變化,請google)

第一個檔案:wcdma (路徑/etc/ppp/peer/)

/dev/ttyUSB0  

115200  

nodetach  

user “card”  

password “card”  

crtscts  

show-password  

usepeerdns  

noauth  

noipdefault  

novj  

novjccomp  

noccp  

defaultroute  

ipcp-accept-local  

ipcp-accept-remote  

connect `chat -s -v -f /etc_ro/ppp/chat/wcdma-connect-chat`

disconnect `chat -s -v -f /etc_ro/ppp/chat/disconnect-chat`

第二個檔案:wcdma-connect-chat (路徑/etc/ppp/chat/)

ABORT `NO CARRIER`

ABORT `ERROR`

ABORT `NO DIALTONE`

ABORT `BUSY`

ABORT `NO ANSWER`


AT

OK
ATZ

OK
AT+CGDCONT=1,”IP”,”cmnet”,,0,0

OK-AT-OK ATDT*99***1#

CONNECT dc

電信指令碼

TIMEOUT 5

ABORT “DELAYED”

ABORT “BUSY”

ABORT “ERROR”

ABORT “NO DIALTONE”

ABORT “NO CARRIER”

“”   AT

“OK-+++c-OK” ATH0

TIMEOUT 40

“”   AT

OK  ATDT#777

CONNECT “”

第三個檔案:disconnect-chat

ABORT “BUSY”  

ABORT “ERROR”  

ABORT “NO DIALTONE”  

SAY “/nSending break to the modem/n”  

“ “/K”  

“ “+++ATH”  

SAY “/nGoodbye/n”

執行指令碼撥號測試

#pppd call   gprs

abort on (NO CARRIER)

abort on (ERROR)

abort on (NO DIALTONE)

abort on (BUSY)

abort on (NO ANSWER)

send (^MAT^M)

expect (OK)

^MT^M^M

OK

 — got it


send (^MATZ^M)

expect (OK)

^M

^MATZ^M^M

OK

 — got it


send (^MAT+CGDCONT=1,”IP”,”cmnet”,,0,0^M)

expect (OK)

^M

^MAT+CGDCONT=1,”IP”,”cmnet”,,0,0^M^M

OK

 — got it


send (ATDT*99***1#^M)

expect (CONNECT)

^M

ATDT*99***1#^M^M

CONNECT

 — got it


send (d)

Serial connection established.

Using interface ppp0

Connect: ppp0 <–> /dev/ttyUSB0

CHAP authentication succeeded: Welcome!!

CHAP authentication succeeded

Could not determine remote IP address: defaulting to 10.64.64.64

local  IP address 10.109.28.39

remote IP address 10.64.64.64

primary   DNS address 211.137.130.18

secondary DNS address 211.137.130.20

這時代表已經撥號成功,通過ifconfig命令可以看到有個ppp0,說明大功告成了

嘗試ping www.baidu.com,應該就通了。

7.PPPD指令碼分享

1. CHAT指令碼

一個簡單的chat指令碼有下面的結構:

“” AT

OK ATDT dialnumber

CONNECT “”

一個chat指令碼都是由字串對來組成的。前面的字串都是期望獲取的串,緊跟的是傳送的字串。這個指令碼每一項的具體含義是這樣的:

1)   MODEM期望空字串。這句話的意思直接理解就是MODEM不管收到什麼字串,先發出字串AT;

2)   期望收到“OK”字串,然後傳送字串“ATDT dialnumber”

3)   如果收到“CONNECT”,就不再傳送,認為資料鏈路已建立連線。

這樣的chat指令碼是最簡單的,如果需要進行超時控制,就可以加入如下欄位:

TIMEOUT 10

如果要增加對特殊情況的處理,就加入下面欄位:

ABORT BUSY   

ABORT NO ANSWER

ABORT RINGING

這三行語句的意思是:如果收到字串“BUSY”、“NO ANSWER”、“RINGING”就退出執行。

所以在考慮到各種特殊情況下,配置一個PPP連線的CHAT指令碼就可以像下面這樣:

TIMEOUT 30

ABORT BUSY   

ABORT NO ANSWER

ABORT RINGING

“” AT

OK ATDT dialnumber

CONNECT “”


2.OPTIONS指令碼

OPTIONS指令碼的內容,為PPP連線指定了連線使用的裝置、使用的控制字元傳輸速率、指定了硬體加速、溢位控制等。

例如下面的options指令碼:

ttyS0 —- 指定連線使用的裝置,例如:ttyS0、ttyS1等

57600 —- 設定連線使用的控制字元傳輸速率,可以設定為57600、115200等

debug —- 如果需要加入除錯資訊,就加入引數debug

logfile /var/ ppplog —- 將連線過程中的資訊輸入到某個檔案中

mtu 1500

-detach

noipdefault —- 不使用預設IP就可以加入引數noipdefault

defaultroute

usepeerdns —- 使用伺服器端協商的DNS就可以設定引數usepeerdns

lcp-echo-failure 4 —- 當連續4次沒有收到發出的LCP回聲請求時,就認為伺服器端已不再響應,就退出執行。這裡的失敗次數可以靈活來決定。

-ccp —- 不使用壓縮控制協議

-vj —- 關掉式IP頭壓縮

-chap —- 不使用chap鑑權

-mschap-v2 —- 不使用mschap鑑權

user

hide-password

connect “/usr/bin/chat -v -t6 -f /var/ chat” —- 制定了要使用的chat指令碼的位置。加上引數-v 告訴 chat命令將其所有的輸出/入拷貝到系統記錄裡(通常是 /var/log/messages)。-t 6 指定了執行chat該命令的時間為6s。chat指令碼的位置可以位於/etc/目錄下,也可以位於/var下,這個可以更加需要靈活設定。

persist — 永久連結(自動重撥)

crtscts — 告訴ppp使用modem的硬體流量控制

modem — 使ppp使用DCD訊號來判斷連線是否正常,有無掉線現象

deflate — 使pppd使用defalte壓縮方式

idle — 設定了一個時間限制,當在300秒的時間內沒有資料傳送,就斷開連線

lock — 則建立一個鎖定檔案,其他程式在發現存在這個檔案後,就能得知相應的串列埠已經被使用。

demond — 引數告訴pppd停留在後臺,監視網路資料,一旦有要求就立即進行連網,超時後就斷開連線,但pppd仍然停留在後臺等待下次資料傳送


本文轉自 Linux_woniu 51CTO部落格,原文連結:http://blog.51cto.com/linuxcgi/1965298


相關文章