嵌入式Linux下3G模块的驱动和应用由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“嵌入式linux教程驱动”。
嵌入式Linux下3G模块的驱动和应用
1、开发资源 1.1、硬件资源:
ZTE-mf637u(中国联通)ZTE-mu351(中国移动)
1.2、软件资源:
1.2.1、usb-modeswitch-1.1.3 libusb-0.1.12.tar.gz usb-modeswitch-1.1.3.tar.bz2
1.2.2、ppp-2.4.4 libpcap-0.9.8.tar.gz ppp-2.4.4.tar.gz
1.2.3、wvdial 1.2.3.1、wvdial-1.54.0(arm-linux-gcc 3.4.1)zlib-1.2.5.tar.bz2 openl-0.9.7g.tar.gz openl-0.9.7g-fix_manpages-1.patch wvstreams-4.0.1.tar.bz2
wvstreams-4.0.1-tcl84-1.patch wvdial-1.54.0.tar.gz 1.2.3.2、wvdial_1.60.4(arm-linux-gcc 4.2.2)zlib-1.2.5.tar.bz2 openl-0.9.8n.tar.gz openl-0.9.8n-fix_manpages-1.patch wvstreams-4.6.1.tar.gz wvdial_1.60.4.tar.gz
2、Linux开发环境 2.1、主机环境 2.1.1、主机linux系统
Fedora Core 6
2.1.2、主机编译环境 2.1.2.1、gcc-v Using built-in specs.Target: i386-redhat-linux Configured with:../configure--prefix=/usr--mandir=/usr/share/man--infodir=/usr/share/info--enable-shared--enable-threads=posix--enable-checking=release--with-system-zlib--enable-__cxa_atexit--disable-libunwind-exceptions--enable-libgcj-multifile
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada--enable-java-awt=gtk--disable-di--enable-plugin--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre--with-cpu=generic--host=i386-redhat-linux Thread model: posix gcc version 4.1.1 20061011(Red Hat 4.1.1-30)
2.1.2.2、/usr/local/arm/3.4.1/bin/arm-linux-gcc-v Reading specs from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/specs Configured with: /work/crotool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure--target=arm-linux--host=i686-host_pc-linux-gnu--prefix=/usr/local/arm/3.4.1--with-headers=/usr/local/arm/3.4.1/arm-linux/include--with-local-prefix=/usr/local/arm/3.4.1/arm-linux--disable-nls--enable-threads=posix--enable-symvers=gnu--enable-__cxa_atexit--enable-languages=c,c++--enable-shared--enable-c99--enable-long-long Thread model: posix gcc version 3.4.1
2.1.2.3、/usr/local/arm/4.2.2/usr/bin/arm-linux-gcc-v Using built-in specs.Target: arm-unknown-linux-gnueabi Configured with: /home/scsuh/workplace/coffee/buildroot-20071011/toolchain_build_arm/gcc-4.2.2/configure--prefix=/usr--build=i386-pc-linux-gnu--host=i386-pc-linux-gnu--target=arm-unknown-linux-gnueabi--enable-languages=c,c++--with-sysroot=/usr/local/arm/4.2.2-eabi/
--with-build-time-tools=/usr/local/arm/4.2.2-eabi//usr/arm-unknown-linux-gnueabi/bin--disable-__cxa_atexit--enable-target-optspace--with-gnu-ld--enable-shared--with-gmp=/usr/local/arm/4.2.2-eabi//gmp--with-mpfr=/usr/local/arm/4.2.2-eabi//mpfr--disable-nls--enable-threads--disable-multilib--disable-largefile--with-arch=armv4t--with-float=soft--enable-cxx-flags=-msoft-float Thread model: posix gcc version 4.2.2
2.2、开发板环境
2.2.1、CES-6410开发平台
Samsung S3C6410X, ARM1176JZF-S 128MB, Mobile DDR SDRAM USB HOST:一个USB HOST 接口,USB2.0全速(12Mbits/s)
3、Linux应用软件的编译 3.1、usb-modeswitch-1.1.3 [root@localhost cdma]# tar xzf libusb-0.1.12.tar.gz [root@localhost cdma]# cp libusb-0.1.12 libusb-0.1.12-arm [root@localhost cdma]# cd libusb-0.1.12-arm [root@localhost libusb-0.1.12-arm]#./configure--prefix=/works/cdma/install--host=arm-linux CC=arm-linux-gcc CXX=arm-linux-g++ [root@localhost libusb-0.1.12-arm]# make [root@localhost libusb-0.1.12-arm]# make install
[root@localhost libusb-0.1.12-arm]# cd..[root@localhost cdma]# tar xjf usb-modeswitch-1.1.3.tar.bz2 [root@localhost cdma]# cp usb-modeswitch-1.1.3 usb-modeswitch-1.1.3-arm [root@localhost cdma]# cd usb-modeswitch-1.1.3-arm [root@localhost usb-modeswitch-1.1.3-arm]# 修改Makefile CC = gcc 改为
CC = arm-linux-gcc CFLAGS +=-Wall-l usb 改为
CFLAGS +=-Wall-l usb-I/works/cdma/install/include-L/works/cdma/install/lib 修改usb_modeswitch.c // readConfigFile(“/etc/usb_modeswitch.setup”);改为
readConfigFile(“/etc/usb_modeswitch.setup”);[root@localhost usb-modeswitch-1.1.3-arm]# make [root@localhost usb-modeswitch-1.1.3-arm]# make install [root@localhost usb-modeswitch-1.1.3-arm]# cd..[root@localhost cdma]#
3.2、ppp-2.4.4 [root@localhost cdma]# tar xzf libpcap-0.9.8.tar.gz [root@localhost cdma]# cp libpcap-0.9.8 libpcap-0.9.8-arm [root@localhost libpcap-0.9.8-arm]#./configure--prefix=/works/cdma/install--host=arm-linux--with-pcap make: *** No rule to make target `pcap-yes.o', needed by `libpcap.a'.Stop.修改Makefile PSRC = pcap-yes.c 改为
PSRC = pcap-linux.c [root@localhost libpcap-0.9.8-arm]# make [root@localhost libpcap-0.9.8-arm]# make install [root@localhost libpcap-0.9.8-arm]# cd..[root@localhost cdma]# tar xzvf ppp-2.4.4.tar.gz [root@localhost cdma]# cd ppp-2.4.4 [root@localhost ppp-2.4.4]#./configure--host=arm-linux vi pppd/Makefile
LIBS +=-lpcap
CFLAGS +=-DPPP_FILTER 改为
LIBS +=-lpcap-L../../libpcap-0.9.8 CFLAGS +=-DPPP_FILTER-I../../libpcap-0.9.8
[root@localhost ppp-2.4.4]# make CC=arm-linux-gcc
3.3、wvdial 3.3.1、wvdial-1.54.0 [root@localhost wvdial-1.54.0]# export PATH=/usr/local/arm/3.4.1/bin:$PATH [root@localhost wvdial-1.54.0]# tar xjf zlib-1.2.5.tar.bz2 [root@localhost wvdial-1.54.0]# cd zlib-1.2.5 [root@localhost zlib-1.2.5]#./configure--prefix=/works/wvdial-1.54.0/install 修改Makefile CC = arm-linux-gcc CPP=arm-linux-gcc-E AR=arm-linux-ar rc RANLIB=arm-linux-ranlib [root@localhost zlib-1.2.5]# make [root@localhost zlib-1.2.5]# make install
[root@localhost wvdial-1.54.0]# tar xzf openl-0.9.7g.tar.gz [root@localhost wvdial-1.54.0]# cd openl-0.9.7g [root@localhost openl-0.9.7g]# patch-Np1-i../openl-0.9.7g-fix_manpages-1.patch
[root@localhost openl-0.9.7g]#./Configure--prefix=/works/wvdial-1.54.0/install os/compiler:arm-linux-gcc [root@localhost openl-0.9.7g]# make [root@localhost openl-0.9.7g]# make install [root@localhost openl-0.9.7g]# cd..[root@localhost wvdial-1.54.0]# tar xjf wvstreams-4.0.1.tar.bz2 [root@localhost wvdial-1.54.0]# cd wvstreams-4.0.1 [root@localhost wvstreams-4.0.1]# patch-Np1-i../wvstreams-4.0.1-tcl84-1.patch 修改configure with_openl=no 改为
with_openl=yes(有两处)
[root@localhost wvstreams-4.0.1]#./configure--prefix=/works/wvdial-1.54.0/install--host=arm-linux CFLAGS=-I/works/cdma/install/include LDFLAGS=-L/works/cdma/install/lib/--with-zlib=/works/cdma/zlib-1.2.5--with-openl=/works/cdma/openl-0.9.8n--without-dbus--with-pam=no--with-tcl=no--with-qt=no
[root@localhost wvstreams-4.0.1]# make linking libwvutils.so.../usr/lib/libz.so: could not read symbols: Invalid operation collect2: ld returned 1 exit status make: *** [libwvutils.so] Error 1 [root@localhost wvstreams-4.0.1]# arm-linux-gcc-L./xplc-L/works/cdma/install/lib/-L./xplc-L.-g-Wl,-soname,libwvutils.so.4.0-shared-o libwvutils.so utils/strcrypt.o utils/verstring.o utils/wvaudioencoder.o utils/wvbase64.o utils/wvbdbhash.o utils/wvcrash.o utils/wvdiriter.o utils/wvgzip.o utils/wvhashtable.o utils/wvhex.o utils/wvmagiccircle.o utils/wvmatrix.o utils/wvqdbmhash.o utils/wvrateadjust.o utils/wvserialize.o utils/wvshmzone.o utils/wvstringtable.o utils/wvsubproc.o utils/wvtest.o utils/wvwordwrap.o libwvbase.so-lsupc++-lgcc_eh [root@localhost wvstreams-4.0.1]# make [root@localhost wvstreams-4.0.1]# vi wvrules.mk XX_LIBS := $(XX_LIBS)$(shell $(CC)-lsupc++-lgcc_eh 2>&1 | grep-q “undefined reference” && echo “-lsupc++-lgcc_eh”)改为
XX_LIBS := $(XX_LIBS)$(shell $(CC)-lsupc++-lgcc_eh 2>&1 | grep-q “undefined reference” && echo “-lz-lcrypt-lsupc++-lgcc_eh”)[root@localhost wvstreams-4.0.1]# make compiling crypto/wvtripledes.o...crypto/wvtripledes.cc: In member function `virtual bool WvTripleDESEncoder::_encode(WvBuf&, WvBuf&, bool)': crypto/wvtripledes.cc:108: error: cannot convert `const unsigned char*' to `
unsigned char(*)[8]' for argument `1' to `void DES_ecb3_encrypt(unsigned
char(*)[8], unsigned char(*)[8], DES_key_schedule*, DES_key_schedule*,DES_key_schedule*, int)' make: *** [crypto/wvtripledes.o] Error 1 解决方法:
crypto/wvtripledes.cc 修改
#if OPENSSL_VERSION_NUMBER >= 0x0090705FL 改为 #if 0
compiling crypto/wvx509.o...crypto/wvx509.cc: In member function `WvString WvX509Mgr::get_extension(int)': crypto/wvx509.cc:1168: error: invalid conversion from `unsigned char**' to ` const unsigned char**' crypto/wvx509.cc:1171: error: invalid conversion from `unsigned char**' to ` const unsigned char**' make: *** [crypto/wvx509.o] Error 1 解决方法: crypto/wvx509.cc if(method->it)
ext_data = ASN1_item_d2i(NULL, &ext->value->data, ext->value->length, ASN1_ITEM_ptr(method->it));else ext_data = method->d2i(NULL, &ext->value->data, ext->value->length);改为
if(method->it)ext_data = ASN1_item_d2i(NULL,(const unsigned char **)&ext->value->data, ext->value->length, ASN1_ITEM_ptr(method->it));else ext_data = method->d2i(NULL,(const unsigned char **)&ext->value->data, ext->value->length);
compiling streams/wvpam.o...streams/wvpam.cc: In member function `bool WvPam::authenticate(const
WvFastString&, const WvFastString&, const WvFastString&)': streams/wvpam.cc:71: error: `fail' undeclared(first use this function)streams/wvpam.cc:71: error:(Each undeclared identifier is reported only once
for each function it appears in.)make: *** [streams/wvpam.o] Error 1 解决方法:
return fail;改为
return false;
[root@localhost wvstreams-4.0.1]# make install [root@localhost wvstreams-4.0.1]# cp libwvutils.so../install/lib/libwvutils.so.4.0-a [root@localhost wvstreams-4.0.1]# cd..[root@localhost wvdial-1.54.0]# tar xzf wvdial-1.54.0.tar.gz [root@localhost wvdial-1.54.0]# cd wvdial-1.54.0 [root@localhost wvdial-1.54.0]# cp /works/wvdial-1.54.0/install/include/wvstreams/*.h.[root@localhost wvdial-1.54.0]# vi Makefile PREFIX=/usr/local 改为
PREFIX=/works/wvdial-1.54.0/install
PPPDIR=/etc/ppp/peers
改为
PPPDIR=${PREFIX}/etc/ppp/peers
XPATH=..../wvstreams/include $(PKGINC)改为
XPATH=/works/wvdial-1.54.0/install/include/wvstreams
LIBS +=-L../wvstreams-lwvutils-lwvstreams 改为
LIBS +=-L/works/wvdial-1.54.0/install/lib-lwvutils-lwvstreams-lwvbase-lz
[root@localhost wvdial-1.54.0]# vi wvrules.mk 增加
CC = arm-linux-g++ CXX = arm-linux-g++ [root@localhost wvdial-1.54.0]# make [root@localhost wvdial-1.54.0]# make install
3.3.2、wvdial-1.60.4 export PATH=/usr/local/arm/4.2.2-eabi/usr/bin:$PATH tar xjf zlib-1.2.5.tar.bz2
cd zlib-1.2.5./configure--prefix=/works/cdma/install-4.2.2 修改Makefile CC = arm-linux-gcc CPP=arm-linux-gcc-E AR=arm-linux-ar rc LDSHARED=arm-linux-gcc....RANLIB=arm-linux-ranlib make make install
openl-0.9.8n patch-N-p 1-i../openl-0.9.8n-fix_manpages-1.patch
./Configure--prefix=/works/cdma/install-4.2.2 os/compiler:arm-linux-gcc make make install
wvstreams-4.6.1 修改configure
with_zlib=no 改为
with_zlib=yes(有两处)
with_openl=no 改为
with_openl=yes(有两处)
./configure--prefix=/works/cdma/install-4.2.2--host=arm-linux CPPFLAGS=-I/works/cdma/install-4.2.2/include LDFLAGS=-L/works/cdma/zlib-1.2.5-4.2.2 CFLAGS=-I/works/cdma/zlib-1.2.5-4.2.2--with-zlib=/works/cdma/zlib-1.2.5-4.2.2/--with-openl=/works/cdma/openl-0.9.8n-4.2.2--without-dbus--with-pam=no--with-tcl=no--with-qt=no--without-valgrind make 如果出现 undefined reference to “EVP_MD_size”错误
将出现错误的语句 return EVP_MD_size((evp_md_st *)evpmd;改成 return((evp_md_st *)evpmd)->md_size;即可
make install
wvdial-1.60.4 修改Makefile prefix=/usr/local 改为
prefix=/works/cdma/install-4.2.2
PPPDIR=/etc/ppp/peers 改为
PPPDIR=${prefix}/etc/ppp/peers
PC_CFLAGS=$(shell pkg-config--cflags libwvstreams)改为
PC_CFLAGS=-I/works/cdma/install-4.2.2/include/wvstreams
PC_LIBS=$(shell pkg-config--libs libwvstreams)PC_LIBS=-L/works/cdma/install-4.2.2/lib-lwvstreams-lwvutils-lwvbase
修改wvrules.mk WVLINK_CC = gcc
改为
WVLINK_CC = arm-linux-g++ CC = arm-linux-g++ CXX = arm-linux-g++ make make install
4、Linux内核的配置与修改 4.1、linux内核配置 make menuconfig Device Drivers--->
[*] Network device support---> PPP(point-to-point protocol)support [*] PPP multilink support(EXPERIMENTAL)[*] PPP filtering PPP support for async serial ports PPP support for sync tty ports PPP Deflate compreion PPP MPPE compreion(encryption)(EXPERIMENTAL)PPP over Ethernet(EXPERIMENTAL)
[*] USB support---> USB Modem(CDC ACM)support USB Serial Converter support---> USB driver for GSM and CDMA modems
4.2、linux内核修改 drivers/usb/serial/option.c static struct usb_device_id option_ids[] = { … };在这个数组中添加两项
{ USB_DEVICE(0x19d2, 0x0031)}, { USB_DEVICE(0x19d2, 0x0034)}, 4.3、linux内核编译 make zImage make modules 5、3G模块的使用 5.1、加载内核模块 insmod option.ko insmod cdc-acm.ko
insmod slhc.ko insmod ppp_generic.ko insmod pppox.ko insmod pppoe.ko insmod ppp_synctty.ko insmod ppp_deflate.ko insmod crc-ccitt.ko insmod ppp_async.ko insmod sha1_generic.ko insmod ppp_mppe.ko
5.2、加载USB文件系统
mount-t usbfs usbfs /proc/bus/usb
5.3、ZTE-mf637u(中国联通)的使用 5.3.1、配置文件/etc/usb_modeswitch.setup # Configuration for the usb-modeswitch package, a mode switching tool for # USB devices providing multiple states or modes # # This file is evaluated by the wrapper script “usb_modeswitch” in /lib/udev # To enable an option, set it to “1”, “yes” or “true”(case doesn't matter)
# Everything else counts as “disable”
# Disable automatic mode switching globally(e.g.to acce the original # install storage)
DisableSwitching=0
# Enable logging(results in a extensive report file in /var/log, named # “usb_modeswitch_”
EnableLogging=0
# ZTE MF622(aka “Onda MDC502HS”)# ZTE MF626 # ZTE MF628+(tested version from Telia / Sweden)# ZTE MF633 # ZTE MF636(aka “Telstra / BigPond 7.2 Mobile Card”)# ZTE MF637
# # Contributor: Joakim Wennergren and others
DefaultVendor= 0x19d2 DefaultProduct= 0x2000
TargetVendor= 0x19d2 TargetProduct= 0x0031
MeageContent=“******1b******” MeageContent2=“******1b******”
NeedResponse=1
5.3.2、配置文件/etc/wvdial.conf [Dialer Defaults]
Modem = /dev/ttyUSB2
Init1 = ATZ
Init3 = ATE0V1
Init5 = ATS0=0
Init6 = AT+CGDCONT=1,“IP”,“uninet”
Init7 = AT+CFUN=1
Modem Type = USB Modem
Baud = 460800
New PPPD = yes ISDN = 0
Phone = *99***1#
Paword = any
Username = any
Stupid Mode = 1
5.3.3 ZTE-mf637u(中国联通)的操作步骤 5.3.3.1、设置环境变量
export PATH= /works/wvdial-1.54.0/install/bin: /works/cdma/install/bin :$PATH export LD_LIBRARY_PATH= /works/wvdial-1.54.0/install/lib: /works/cdma/install/lib:$LD_LIBRARY_PATH 5.3.3.2、插入ZTE-mf637u(中国联通)无线网卡 5.3.3.3、等待5秒钟左右、运行usb-modeswitch-W 5.3.3.4、运行wvdial--> WvDial: Internet dialer version 1.54.0--> Cannot open /dev/ttyUSB2: Cannot get information for serial port.--> Cannot open /dev/ttyUSB2: Cannot get information for serial port.--> Cannot open /dev/ttyUSB2: Cannot get information for serial port.解决:(两种方法)5.3.3.4.1将wvstreams-4.0.1/streams/wvmodem.cc #if HAVE_LINUX_SERIAL_H 改为
#if 0
5.3.3.4.2.wvstreams-4.0.1的配置命令增加ac_cv_header_linux_serial_h=no 即./configure--prefix=/works/wvdial-1.54.0/install--host=arm-linux CFLAGS=-I/works/cdma/install/include LDFLAGS=-L/works/cdma/install/lib/--with-zlib=/works/cdma/zlib-1.2.5--with-openl=/works/cdma/openl-0.9.8n--without-dbus--with-pam=no--with-tcl=no--with-qt=no ac_cv_header_linux_serial_h=no 重新编译。
5.4、ZTE-mu351(中国移动)的使用 5.4.1、配置文件/etc/wvdial.conf Modem = /dev/ttyACM2 Init1 = ATZ Init3 = ATE0V1 Init5 = ATS0=0 Init6 = AT+CGDCONT=1,“IP”,“cmnet” Init7 = AT+CFUN=1 Modem Type = USB Modem Baud = 460800 New PPPD = yes ISDN = 0 Phone = *99***1#
Paword = any Username = any Stupid Mode = 1 5.4.2、ZTE-mu351(中国移动)的操作步骤 5.4.2.1、设置环境变量
export PATH=/root/cdma:$PATH export LD_LIBRARY_PATH=/root/cdma:$LD_LIBRARY_PATH 5.4.2.2、插入ZTE-mu351(中国移动)无线网卡
5.4.2.3、等待5秒钟左右、运行eject /dev/sr0。(5.3.3.3也可以使用此方法)5.4.2.4、运行wvdial--> WvDial: Internet dialer version 1.54.0--> Initializing modem.--> Sending: ATZ ATZ OK--> Sending: ATE0V1 ATE0V1 OK--> Sending: ATS0=0 OK--> Sending: AT+CGDCONT=1,“IP”,“cmnet”
OK--> Sending: AT+CFUN=1 OK--> Modem initialized.--> Sending: ATDT*99***1#--> Waiting for carrier.NO CARRIER--> No Carrier!Trying again.--> Sending: ATDT*99***1#--> Waiting for carrier.NO CARRIER--> No Carrier!Trying again.--> Sending: ATDT*99***1#--> Waiting for carrier.NO CARRIER--> No Carrier!Trying again.--> Sending: ATDT*99***1#--> Waiting for carrier.NO CARRIER--> No Carrier!Trying again.--> Sending: ATDT*99***1#
--> Waiting for carrier.^MODE: 15 CONNECT 2800000--> Carrier detected.Starting PPP immediately.--> Starting pppd at Mon Aug 16 16:17:15 2010--> pid of pppd: 1364--> Using interface ppp0--> local IP addre 10.67.54.108--> remote IP addre 192.200.1.21--> primary DNS addre 211.136.20.203--> secondary DNS addre 211.136.17.107
6、参考资料
http://sourceforge.net/projects/libusb/files/libusb-1.0/ http://www.daodoc.com/ http://www.daodoc.com/#ppp
http://code.google.com/p/wvstreams/downloads/detail?name=wvstreams-4.6.1.tar.gz&can=2&q= http://code.google.com/p/wvstreams/downloads/list
http://ftp.debian.org/debian/pool/main/w/wvdial/ http://code.google.com/p/wvstreams/downloads/list