一、嵌入式系统环境及硬件
1、内核:Linux-2.6.10
2、板块自带USB接口:USB2.0
3、3G网卡:华为E1750 (当然还需要去联通办USIM卡,大概是200块钱,每月80元/1G)
二、所需软件包
1、usb-modeswitch-1.1.2.tar.bz2
usb-modeswitch-1.1.2.tar.bz2是对USB设备的工作模式进行转换一种万能工具,因为一般的3G网卡都不附带Linux的驱动,所有要用其进行转换。
2、libusb-0.1.12.tar.gz
libusb提供给usb_modeswitch一套系统API
3、ppp-2.4.4.tar.gz
这个软件包是拨号工具
三、交叉编译usb-modeswitch
1、首先交叉编译libusb
解压并进入libusb-1.0.12目录,建立子目录install用于存放最后生存的库文件与头文件。
[[email protected]]# mkdir install
[[email protected]]# ./configure --build=i686-linux --host=arm-linux --prefix=/home/libusb-0.1.12/install
[[email protected]]# make
[[email protected]]# make install
2、设置PKG_CONFIG_PATH环境变量,以使我们后面的编译能够顺利找到libusb库
[[email protected]]# export
PKG_CONFIG_PATH=/home/userfordm355/libusb-0.1.12/install/lib/pkgconfig:$PKG_CONFIG_PATH
查看是否设置正确(这一步看你的libusb-1.0.12所在的目录,安装自己的目录修改)
[[email protected]]# echo $PKG_CONFIG_PATH
3、 交叉编译usb_modeswitch
(1)、修改Makefile文件
CC = arm_v5t_le-gcc
(2)、在Makefile文件里直接加上编译选项指令库的路径即可如下:
$(PROG):&(OBJS)
&(CC) –o $(PROG) &(OBJS) &(CFLAGS) –I /home/libusb-0.1.12/install/include –L /home/libusb-0.1.12/install/lib
(3)、make
4、编辑usb_modeswitch-1.1.2目录下的usb_modeswitch.setup文件
# Huawei E1750
#
# Contributor: Anders Blomdell, Ahmed Soliman
DefaultVendor= 0x12d1
DefaultProduct= 0x1446
TargetVendor= 0x12d1
TargetProduct= 0x1001
# only for reference and 0.x versions
MessageEndpoint=0x01
MessageContent="55534243123456780000000000000011060000000000000000000000000000"
HuaweiMode=0
(原来文件这个位置每句话前面是有“;”号的,去掉即可,可参考其自带的帮助文件)
5、将上面生成的libusb动态库拷贝到开发板的库目录下,将上面生成的usb_modeswitch可执行程序和usb_modeswitch.setup拷贝到文件系统目录下。
四、交叉编译3G卡片驱动
在2.6.10内核源码中没有专门的3G驱动文件,我们在/driver/usb/serial/pl2303.c中加入3G卡片的ID信息:
{USB_DEVICE(HUAWEI_VENDOR_ID),HUAWEI_PRODUCT_ID)}
在/driver/usb/serial/pl2303.h中加入:
#define HUAWEI_VENDOR_ID 0x12d1
#define HUAWEI_PRODUCT_ID 0x1001
Make menuconfig 选中相关选项,make uImage 即可。(注意如果此处就编译内核的话最好把内核中的有关ppp的选项也编译进内核,免得内核不支持ppp。等到编译ppp的时候就应该知道这步的作用了) 五、利用usb_modeswitch进行模式转换
在/dev目录下建立字符节点
mknod /dev/ttyUSB0 c 188 0
mknod /dev/ttyUSB1 c 188 1
mknod /dev/ttyUSB2 c 188 2
运行 ./usb_modeswitch 切换3G卡片的模式。此时会出现一些信息,你会看到转换成3G模式后的几个串口信息,ttyUSB0, ttyUSB1, ttyUSB2,如下:
pl2303 1-1:1.0: PL-2303 converter detected
usb 1-1: PL-2303 converter now attached to ttyUSB0
pl2303 1-1:1.1: PL-2303 converter detected
usb 1-1: PL-2303 converter now attached to ttyUSB1
pl2303 1-1:1.2: PL-2303 converter detected
usb 1-1: PL-2303 converter now attached to ttyUSB2
如果出现了这些信息,说明驱动编译成功了。
六、交叉编译pppd拨号工具,并编写拨号脚本
驱动编译好了就需要对pppd拨号工具进行编译了.
tar zxvf ppp-2.4.4.tar.gz
cd ppp-2.4.4
./configure
make CC=arm_v5t_le-gcc
编译好后,将pppd目录下的pppd可执行文件和chat目录下的chat可执行文件复制到开发板根目录下/usr/sbin/目录下。(如果上次编译内核,你没有将ppp支持编译入内核,那么很遗憾,得重新再编译一次,添加对ppp的支持。)
pppd编译好了,那么要编写拨号脚本了:(有3个)
1、wcdma:(命名为wcdma)
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:(命名为chat-wcdma-connect)
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:(命名为chat-wcdma-disconnect)
ABORT "ERROR"
ABORT "NO DIALTONE"
SAY "/nSending break to the modem/n"
'' "/K"
'' "+++ATH"
SAY "/nGoodbay/n"
将wcdma放在开发板的跟目录下/etc/ppp/peers,剩下两个文件放在根目录下/etc/ppp下
修改/etc/resolv.conf文件添加DNS号
nameserver 8.8.8.8
nameserver 8.8.4.4
(以上为Google的公共DNS服务)(如果该处出现问题,可能无法解析域名,ping的时候会报错)
七、开始拨号
[email protected]:/opt# pppd call wcdma&
拨号成功后会获得自动分配的IP地址
Serial connection established.
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB0
CHAP authentication succeeded
Could not determine remote IP address: defaulting to 10.64.64.64
Cannot determine ethernet address for proxy ARP
local IP address 172.20.196.53
remote IP address 10.64.64.64
primary DNS address 202.99.160.68
secondary DNS address 202.99.166.4
ping www.baidu.com 如能ping通,则说明移植成功。
[email protected]:/opt# ping www.baidu.com
PING www.a.shifen.com (220.181.6.175) 56(84) bytes of data.
64 bytes from 220.181.6.175: icmp_seq=1 ttl=49 time=116 ms
64 bytes from 220.181.6.175: icmp_seq=2 ttl=49 time=110 ms
64 bytes from 220.181.6.175: icmp_seq=3 ttl=49 time=110 ms
64 bytes from 220.181.6.175: icmp_seq=4 ttl=49 time=110 ms
64 bytes from 220.181.6.175: icmp_seq=5 ttl=49 time=110 ms
64 bytes from 220.181.6.175: icmp_seq=6 ttl=49 time=110 ms
64 bytes from 220.181.6.175: icmp_seq=7 ttl=49 time=110 ms
64 bytes from 220.181.6.175: icmp_seq=8 ttl=49 time=110 ms
64 bytes from 220.181.6.175: icmp_seq=9 ttl=49 time=120 ms
到此说明移植成功了。
八、存在的问题
1、我建的ttyUSB0/ttyUSB1/ttyUSB2,保存不了,每次重启都需要重新建立
2、不知道怎么断开网络,每次我都是用的 ps查询PID,然后kill掉。
在此过程中 得到了许多朋友的帮助,特别是邓凌峰,在此对他们表示我最真诚的感谢!
参考:
1、叶磊 华为E1750在MD6440上移植,http://blog.csdn.net/yel617/archive/2010/05/18/5602934.aspx
2、邓凌峰 华为EC122在HiSi3110E上移植 http://blog.csdn.net/linfeng999/archive/2010/08/28/5846474.aspx