海思3G模块开发
一、開發(fā)環(huán)境
| 環(huán)境 | 詳細(xì) |
| 3G模塊 | ZTE?MF190(中興) |
| SIM卡 | 中國(guó)聯(lián)通3G卡 |
| 嵌入式Linux內(nèi)核? | Linux?(none)?3.0.8 |
| 開發(fā)環(huán)境 | Ubuntu10.10 |
二、開發(fā)步驟
| 修改內(nèi)核配置,并重新編譯 | 內(nèi)核配置增加usb轉(zhuǎn)串口的驅(qū)動(dòng),配置成模塊。 內(nèi)核配置增加ppp協(xié)議支持 重新編譯燒寫內(nèi)核 |
| 編譯usb_modeswitch | 交叉編譯usb_modeswitch,并把可執(zhí)行文件和配置文件拷貝到開發(fā)板上 |
| 編譯ppp和編譯撥號(hào)腳本文件 | 交叉編譯ppp,并把可執(zhí)行文件和配置文件拷貝到開發(fā)板上 |
| 驗(yàn)證usb轉(zhuǎn)串口是否成功 | 這部很關(guān)鍵,如果轉(zhuǎn)串口沒有成功或者使用的不是ttyUSB0會(huì)使后面的ppp撥號(hào)不成功。 |
| 運(yùn)行pppd | pppd?call?wcdma-call |
三、詳細(xì)開發(fā)步驟?
1、內(nèi)核中增加usb轉(zhuǎn)串口的驅(qū)動(dòng),配置成模塊。增加ppp協(xié)議支持。重新交叉編譯并下載到開發(fā)板上。
1.1?增加ppp協(xié)議支持
??清除內(nèi)核配置文件:make?ARCH=arm?CROSS_COMPILE=arm-linux-?clean
CROSS_COMPILE=arm-linux-?這個(gè)要根據(jù)自己arm編譯器的名字
??配置內(nèi)核:make?ARCH=arm?CROSS_COMPILE=arm-linux-?menuconfig
進(jìn)入Device?Drivers-->
Network?device?support-->
<*>PPP?(point-to-point?protocol)?support
選擇所有的PPP協(xié)議
?
ppp協(xié)議配置完成
1.2、增加usb轉(zhuǎn)串口的驅(qū)動(dòng)模塊,編譯為模塊
使其選中對(duì)USB轉(zhuǎn)串口的支持
進(jìn)入Device?Drivers-->USB?support-->USB?Serial?Converter?support?選中USB?Deiver?for?GSM?and?CDMA?Modems
?
?
到此3G卡驅(qū)動(dòng)已經(jīng)添加完。
注:本人這里把USB轉(zhuǎn)串口驅(qū)動(dòng)配置成模塊,看個(gè)人需求也可配置成編譯到內(nèi)核中。
?
接著要修改option.c文件,在linux-3.0.y/drivers/usb/serial目錄下,然后找到
static?const?struct?usb_device_id?option_ids[]?=?{
}向這里面增加我們的3G模塊設(shè)備信息,(有可能你的設(shè)備信息已經(jīng)存在)
本人的3G設(shè)備信息添加如下:
#define ZTE_VENDOR_ID 0x19d2 //代碼中已經(jīng)定義 廠家ID #define ZTE_PRODUCT_MF190 0x2000 //本人3G模塊的設(shè)備ID { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF190) },解釋這兩個(gè)參數(shù)的意義:
?ZTE_VENDOR_ID:廠家ID(這是中興廠家的ID號(hào))
?ZTE_PRODUCT_MF190:本人3G模塊設(shè)備ID號(hào)
那么如何得知這兩個(gè)ID號(hào)呢?
把3G設(shè)備插入開發(fā)板上使用?lsusb?命令就可看到兩個(gè)ID號(hào)
#?lsusb
Bus?001?Device?001:?ID?1d6b:0002
Bus?002?Device?001:?ID?1d6b:0001
Bus?001?Device?002:?ID?19d2:2000
?
到這里所有內(nèi)核的配置都完成。
重新編譯內(nèi)核:make?ARCH=arm?CROSS_COMPILE=arm-linux-?uImage
編譯模塊:make?ARCH=arm?CROSS_COMPILE=arm-linux-?modules?
//因?yàn)楸救税羊?qū)動(dòng)配置成模塊所以這里需要編譯模塊。在linux-3.0.y/drivers/usb/seria目錄下會(huì)出現(xiàn)三個(gè)驅(qū)動(dòng)模塊
?
把這三個(gè)驅(qū)動(dòng)復(fù)制到開發(fā)板上,本人復(fù)制開發(fā)板路徑/lib/modules/3.0.8/serial下
在系統(tǒng)啟動(dòng)腳本中添加驅(qū)動(dòng)加載,在/etc/init.d/rcS中添加下面幾行
insmod /lib/modules/3.0.8/seria/usbserial.ko maxRSize=16384 maxWSize=512 maxISize=64 ##設(shè)置緩沖大小,挺高速度。 nsmod /lib/modules/3.0.8/seria/usb_wwan.ko nsmod /lib/modules/3.0.8/seria/option.ko
加載完驅(qū)動(dòng)后/dev目錄下出現(xiàn)ttyUSB0?ttyUSB1?ttyUSB2那么恭喜你usb轉(zhuǎn)串口已經(jīng)成功。
?
問題:
(1)、加載完驅(qū)動(dòng)后/dev目錄下沒有出現(xiàn)ttyUSB0?ttyUSB1?ttyUSB2
查看設(shè)備:
cat /proc/devices?
如果沒有ttyUSB那么加載驅(qū)動(dòng)有問題,查看option.c文件添加的設(shè)備ID是否有錯(cuò)誤
如果有ttyUSB跳到(問題解決一)
2、測(cè)試轉(zhuǎn)出的串口是否可用
使用Linux串口代碼進(jìn)行測(cè)試。本人測(cè)試代碼鏈接:http://download.csdn.net/detail/lin_jianbin/8339773
分別打開串口ttyUSB0?ttyUSB1?ttyUSB2
發(fā)送字符串?dāng)?shù)據(jù)“AT\r\n” ?或者十六進(jìn)制數(shù)據(jù)?0x41?0x54?0x0D?0x0A?如果接收到數(shù)據(jù)為OK表示成功
測(cè)試出成功的設(shè)備比如ttyUSB0?后面配置需要使用到。(不是所有的設(shè)備都是使用ttyUSB0發(fā)送和接收數(shù)據(jù)的)所以這需要測(cè)試。
?
3、交叉編譯pppd,移植
下載路徑:ftp://ftp.samba.org/pub/ppp/
本人下載的是ppp-2.4.5.tar.gz
解壓:tar?-zvxf?ppp-2.4.5.tar.gz
進(jìn)目錄:cd?ppp-2.4.5
配置:./configure????????生成Makefile文件
編譯:make?CC=arm-liunx-gcc?AR=arm-liunx-ar?LD=arm-liunx-ld?STRIP=arm-liunx-strip
成功后會(huì)在pppd目錄下生成可執(zhí)行文件pppd,chat目錄下生成可執(zhí)行文件chat
?
創(chuàng)建撥號(hào)的配置文件
在/etc.ppp/目錄下創(chuàng)建文件?wcdma-chat?內(nèi)容如下:
TIMEOUT?15
ABORT?'NO?CARRIER'
ABORT?'ERROR'
ABORT?'NO?DIALTONE'
ABORT?'BUSY'
ABORT?'NO?ANSWER'
""?'AT'
OK?'ATDT*99#'
CONNECT
?
在/etc.ppp/目錄下創(chuàng)建文件?disconnect-chat?內(nèi)容如下:
ABORT?"BUSY"
ABORT?"ERROR"
ABORT?"NO?DIALTONE"
SAY?"/nSending?break?to?the?modem/n"
''?"/K"
''?"+++ATH"
SAY?"/nGoodbye/n"
?
在/etc.ppp/目錄下創(chuàng)建文件?wcdma-call?內(nèi)容如下:
debug
lock
nodetach
/dev/ttyUSB0??###?這個(gè)要根據(jù)第二步測(cè)試成功的設(shè)備結(jié)點(diǎn)
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配置參數(shù)可參考:
http://blog.csdn.net/hens007/article/details/7255455
這里的配置文件是針對(duì)聯(lián)通3G卡的,如果需要支持其他的SIM卡可更改這些配置。
?
移植:
/pppd/pppd??拷貝到開發(fā)板?/usr/sbin
/chat/chat???拷貝到開發(fā)板?/usr/sbin
/etc.ppp/目錄下的文件?chap-secrets??options?pap-secrets?拷貝到開發(fā)板?/etc/ppp目錄下
/etc.ppp/目錄下的文件?wcdma-chat?disconnect-chat??拷貝到開發(fā)板?/etc/ppp/chat目錄下
/etc.ppp/目錄下的文件?wcdma-call??拷貝到開發(fā)板?/etc/ppp/peers目錄下
?
到這里開發(fā)板移植完畢可到開發(fā)板上進(jìn)行撥號(hào):
#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
?
撥號(hào)成功
?
問題解決一
方法一:手動(dòng)創(chuàng)建設(shè)備結(jié)點(diǎn)
mknod?/dev/ttyUSB0?c?188?0????
//188即使主設(shè)備號(hào)?如上的cat?/proc/devices?可以得知。0?為次設(shè)備號(hào)。
mknod?/dev/ttyUSB1?c?188?1????
mknod?/dev/ttyUSB2?c?188?2????
測(cè)試創(chuàng)建的設(shè)備結(jié)點(diǎn)是否可用:
這種方法只能實(shí)現(xiàn)簡(jiǎn)單的測(cè)試,更為準(zhǔn)確的測(cè)試最好用自己寫的串口代碼測(cè)試。
#?cat?/dev/ttyUSB0????
cat:?can't?open?'ttyUSB0':?No?such?device?//表示設(shè)備結(jié)點(diǎn)不可用?只能用方法二。
?
方法二:使用usb_modeswitch
usb_modeswitch是對(duì)USB設(shè)備的工作模式進(jìn)行轉(zhuǎn)換,usb工作模式:usb存儲(chǔ)模式,usb?serial模式。
我們要把3G模塊轉(zhuǎn)為usb?serial模式。
參考文章:http://blog.csdn.net/lin_jianbin/article/details/42520419
總結(jié)
- 上一篇: 简支梁挠度计算公式推导_简支梁的最大挠度
- 下一篇: js实现农历时间代码