海思3G模块开发
一、開發環境
| 環境 | 詳細 |
| 3G模塊 | ZTE?MF190(中興) |
| SIM卡 | 中國聯通3G卡 |
| 嵌入式Linux內核? | Linux?(none)?3.0.8 |
| 開發環境 | Ubuntu10.10 |
二、開發步驟
| 修改內核配置,并重新編譯 | 內核配置增加usb轉串口的驅動,配置成模塊。 內核配置增加ppp協議支持 重新編譯燒寫內核 |
| 編譯usb_modeswitch | 交叉編譯usb_modeswitch,并把可執行文件和配置文件拷貝到開發板上 |
| 編譯ppp和編譯撥號腳本文件 | 交叉編譯ppp,并把可執行文件和配置文件拷貝到開發板上 |
| 驗證usb轉串口是否成功 | 這部很關鍵,如果轉串口沒有成功或者使用的不是ttyUSB0會使后面的ppp撥號不成功。 |
| 運行pppd | pppd?call?wcdma-call |
三、詳細開發步驟?
1、內核中增加usb轉串口的驅動,配置成模塊。增加ppp協議支持。重新交叉編譯并下載到開發板上。
1.1?增加ppp協議支持
??清除內核配置文件:make?ARCH=arm?CROSS_COMPILE=arm-linux-?clean
CROSS_COMPILE=arm-linux-?這個要根據自己arm編譯器的名字
??配置內核:make?ARCH=arm?CROSS_COMPILE=arm-linux-?menuconfig
進入Device?Drivers-->
Network?device?support-->
<*>PPP?(point-to-point?protocol)?support
選擇所有的PPP協議
?
ppp協議配置完成
1.2、增加usb轉串口的驅動模塊,編譯為模塊
使其選中對USB轉串口的支持
進入Device?Drivers-->USB?support-->USB?Serial?Converter?support?選中USB?Deiver?for?GSM?and?CDMA?Modems
?
?
到此3G卡驅動已經添加完。
注:本人這里把USB轉串口驅動配置成模塊,看個人需求也可配置成編譯到內核中。
?
接著要修改option.c文件,在linux-3.0.y/drivers/usb/serial目錄下,然后找到
static?const?struct?usb_device_id?option_ids[]?=?{
}向這里面增加我們的3G模塊設備信息,(有可能你的設備信息已經存在)
本人的3G設備信息添加如下:
#define ZTE_VENDOR_ID 0x19d2 //代碼中已經定義 廠家ID #define ZTE_PRODUCT_MF190 0x2000 //本人3G模塊的設備ID { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF190) },解釋這兩個參數的意義:
?ZTE_VENDOR_ID:廠家ID(這是中興廠家的ID號)
?ZTE_PRODUCT_MF190:本人3G模塊設備ID號
那么如何得知這兩個ID號呢?
把3G設備插入開發板上使用?lsusb?命令就可看到兩個ID號
#?lsusb
Bus?001?Device?001:?ID?1d6b:0002
Bus?002?Device?001:?ID?1d6b:0001
Bus?001?Device?002:?ID?19d2:2000
?
到這里所有內核的配置都完成。
重新編譯內核:make?ARCH=arm?CROSS_COMPILE=arm-linux-?uImage
編譯模塊:make?ARCH=arm?CROSS_COMPILE=arm-linux-?modules?
//因為本人把驅動配置成模塊所以這里需要編譯模塊。在linux-3.0.y/drivers/usb/seria目錄下會出現三個驅動模塊
?
把這三個驅動復制到開發板上,本人復制開發板路徑/lib/modules/3.0.8/serial下
在系統啟動腳本中添加驅動加載,在/etc/init.d/rcS中添加下面幾行
insmod /lib/modules/3.0.8/seria/usbserial.ko maxRSize=16384 maxWSize=512 maxISize=64 ##設置緩沖大小,挺高速度。 nsmod /lib/modules/3.0.8/seria/usb_wwan.ko nsmod /lib/modules/3.0.8/seria/option.ko
加載完驅動后/dev目錄下出現ttyUSB0?ttyUSB1?ttyUSB2那么恭喜你usb轉串口已經成功。
?
問題:
(1)、加載完驅動后/dev目錄下沒有出現ttyUSB0?ttyUSB1?ttyUSB2
查看設備:
cat /proc/devices?
如果沒有ttyUSB那么加載驅動有問題,查看option.c文件添加的設備ID是否有錯誤
如果有ttyUSB跳到(問題解決一)
2、測試轉出的串口是否可用
使用Linux串口代碼進行測試。本人測試代碼鏈接:http://download.csdn.net/detail/lin_jianbin/8339773
分別打開串口ttyUSB0?ttyUSB1?ttyUSB2
發送字符串數據“AT\r\n” ?或者十六進制數據?0x41?0x54?0x0D?0x0A?如果接收到數據為OK表示成功
測試出成功的設備比如ttyUSB0?后面配置需要使用到。(不是所有的設備都是使用ttyUSB0發送和接收數據的)所以這需要測試。
?
3、交叉編譯pppd,移植
下載路徑:ftp://ftp.samba.org/pub/ppp/
本人下載的是ppp-2.4.5.tar.gz
解壓:tar?-zvxf?ppp-2.4.5.tar.gz
進目錄:cd?ppp-2.4.5
配置:./configure????????生成Makefile文件
編譯:make?CC=arm-liunx-gcc?AR=arm-liunx-ar?LD=arm-liunx-ld?STRIP=arm-liunx-strip
成功后會在pppd目錄下生成可執行文件pppd,chat目錄下生成可執行文件chat
?
創建撥號的配置文件
在/etc.ppp/目錄下創建文件?wcdma-chat?內容如下:
TIMEOUT?15
ABORT?'NO?CARRIER'
ABORT?'ERROR'
ABORT?'NO?DIALTONE'
ABORT?'BUSY'
ABORT?'NO?ANSWER'
""?'AT'
OK?'ATDT*99#'
CONNECT
?
在/etc.ppp/目錄下創建文件?disconnect-chat?內容如下:
ABORT?"BUSY"
ABORT?"ERROR"
ABORT?"NO?DIALTONE"
SAY?"/nSending?break?to?the?modem/n"
''?"/K"
''?"+++ATH"
SAY?"/nGoodbye/n"
?
在/etc.ppp/目錄下創建文件?wcdma-call?內容如下:
debug
lock
nodetach
/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?-v?-t3?-f?/etc/ppp/chat/wcdma-connect'
disconnect?'/usr/sbin/chat?-s?-v?-f?/etc/ppp/chat/disconnect'
pppd配置參數可參考:
http://blog.csdn.net/hens007/article/details/7255455
這里的配置文件是針對聯通3G卡的,如果需要支持其他的SIM卡可更改這些配置。
?
移植:
/pppd/pppd??拷貝到開發板?/usr/sbin
/chat/chat???拷貝到開發板?/usr/sbin
/etc.ppp/目錄下的文件?chap-secrets??options?pap-secrets?拷貝到開發板?/etc/ppp目錄下
/etc.ppp/目錄下的文件?wcdma-chat?disconnect-chat??拷貝到開發板?/etc/ppp/chat目錄下
/etc.ppp/目錄下的文件?wcdma-call??拷貝到開發板?/etc/ppp/peers目錄下
?
到這里開發板移植完畢可到開發板上進行撥號:
#pppd call wcdma-callScript?/usr/sbin/chat?-v?-t3?-f?/etc/ppp/chat/wcdma-connect?finished?(pid?891),?status?=?0x0
Serial?connection?established.
using?channel?1
Using?interface?ppp0
Connect:?ppp0?<-->?/dev/ttyUSB2
sent?[LCP?ConfReq?id=0x1?<asyncmap?0x0>?<magic?0xfd880529>?<pcomp>?<accomp>]
rcvd?[LCP?ConfReq?id=0x0?<asyncmap?0x0>?<auth?chap?MD5>?<magic?0x2bdc467>?<pcomp>?<accomp>]
sent?[LCP?ConfAck?id=0x0?<asyncmap?0x0>?<auth?chap?MD5>?<magic?0x2bdc467>?<pcomp>?<accomp>]
rcvd?[LCP?ConfAck?id=0x1?<asyncmap?0x0>?<magic?0xfd880529>?<pcomp>?<accomp>]
sent?[LCP?EchoReq?id=0x0?magic=0xfd880529]
rcvd?[LCP?DiscReq?id=0x1?magicdc467]
rcvd?[CHAP?Challenge?id=0x1?<ca68bc26a4b9831b18cc10657e6fc731>,?name?=?"UMTS_CHAP_SRVR"]
sent?[CHAP?Response?id=0x1?<606f317e42edafc7e3653ea6b>,?name?=?"card"]
rcvd?[LCP?EchoRep?id=0x0?magic=0x2bdc467?fd?88?05?29]
rcvd?[CHAP?Success?id=0x1?""]
CHAP?authentication?succeeded
CHAP?authentication?succeeded
sent?[IPCP?ConfReq?id=0x1?<addr?0.0.0.0>?<ms-dns1?0.0.0.0>?<ms-dns2?0.0.0.0>]
rcvd?[IPCP?ConfNak?id=0x1?<ms-dns1?10.11.12.13>?<ms-dns2?10.11.12.14>?<ms-wins?10.11.12.13>?<ms-wins?10.11.12.14>]
sent?[IPCP?ConfReq?id=0x2?<addr?0.0.0.0>?<ms-dns1?10.11.12.13>?<ms-dns2?10.11.12.14>?<ms-wins?10.11.?<ms-wins?10.11.12.14>]
rcvd?[IPCP?ConfReq?id=0x0]
sent?[IPCP?ConfNak?id=0x0?<addr?0.0.0.0>]
rcvd?[IPCP?ConfRej?id=0x2?<ms-wins?10.11.12.13>?<ms-wins?12.14>]
sent?[IPCP?ConfReq?id=0x3?<addr?0.0.0.0>?<ms-dns1?10.11.12.13>?<ms-dns2?10.11.12.14>]
rcvd?[IPCP?ConfReq?id=0x1]
sent?[IPCP?ConfAck?id=0x1]
rcvd?[IPCP?ConfNak?id=0x3?<addr?10.30.208.139>?<ms-dns1?218.104.128.106>?<ms-dns66>]
sent?[IPCP?ConfReq?id=0x4?<addr?10.30.208.139>?<ms-dns1?218.104.128.106>?<ms-dns2?58.22.96.66>]
rcvd?[IPCP?ConfAck?id=0x4?<addr?10.30.208.139>?<ms-dns1?218.104.128.106>?<ms-dns2?58.22.96.66>]
Could?not?determine?remote?IP?address:?defaulting?to?10.64.64.64
Cannot?determine?ethernet?addresxy?ARP
local??IP?address?10.30.208.139
remote?IP?address?10.64.64.64
primary???DNS?address?218.104.128.106
secondary?DNS?address?58.22.96.66
?
撥號成功
?
問題解決一
方法一:手動創建設備結點
mknod?/dev/ttyUSB0?c?188?0????
//188即使主設備號?如上的cat?/proc/devices?可以得知。0?為次設備號。
mknod?/dev/ttyUSB1?c?188?1????
mknod?/dev/ttyUSB2?c?188?2????
測試創建的設備結點是否可用:
這種方法只能實現簡單的測試,更為準確的測試最好用自己寫的串口代碼測試。
#?cat?/dev/ttyUSB0????
cat:?can't?open?'ttyUSB0':?No?such?device?//表示設備結點不可用?只能用方法二。
?
方法二:使用usb_modeswitch
usb_modeswitch是對USB設備的工作模式進行轉換,usb工作模式:usb存儲模式,usb?serial模式。
我們要把3G模塊轉為usb?serial模式。
參考文章:http://blog.csdn.net/lin_jianbin/article/details/42520419
總結
- 上一篇: 简支梁挠度计算公式推导_简支梁的最大挠度
- 下一篇: js实现农历时间代码