wvdial arm移植笔记
来源:互联网 发布:欧元 石油 知乎 编辑:程序博客网 时间:2024/06/08 08:09
1.
1.1.
1.2.
1.3.
1.4.
1.4.1.
1.4.2.
2.
2.1.
2.2.
2.3.
2.3.1.
2.3.2.
2.4.
2.4.1.
2.4.2.
2.5.
2.5.1.
2.5.2.
2.5.3.
2.6.
3.
3.1.
3.1.1.
3.1.2.
3.2.
3.2.1.
3.2.2.
3.2.3.
3.2.4.
1. 引言
1.1. 目的
最近在做ARM上支持3G拨号的相关预研,其中涉及到了对linux下拨号工具的研究,最终测试通过了两种可行的3G 拨号(3G USB上网卡)方案:
1>
2>
两种方式各有利弊,对于方案一基本没有花费太多时间就测试通过,但对于方案二,几乎可用坎坷和一言难尽来形容;
究其原因,一方面由于网上有关ARM下的3G开发资料较少且大多不完整;另一方面很多遇到了即使移植通过但运行出错的问题且未能解决的情况;当然这与我在此方面的开发经验少可能有更大的关系;
总之是走了不少弯路,故整理此文,给后续有此开发需求的童鞋借鉴。
1.2. 术语解释
[ wvdial ]
[ 3G 拨号]
1.3. 主要内容
对于内核支持3G USB网卡的编译选项不再此文列出;
对于3G/USB的相关驱动及转换等不再此文列出;
仅对wvdial的ARM移植过程/运行使用及遇到的问题做下记录说明,总体分两方面阐述:
1>
2>
1.4. 开发环境
1.4.1. 交叉编译环境
[arm-linux-gcc -v]
Reading specs from /arm/ToolSet/tools.Linux/hard_fp/bin/../lib/gcc-lib/armv5-linux/3.3.1/specs
Configured with: /opt/mcs1000/tools/src/gcc-3.3.1/configure --target=armv5-linux --build=i686-pc-linux-gnu --prefix=/home/prj/scp/tools/hard_fp --program-pr
efix=arm-linux- --with-libraries=/home/prj/scp/tools/hard_fp/lib --enable-languages=c,c++
Thread model: posix
gcc version 3.3.1
[uname -a]
Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux
1.4.2. 目标机环境
Processor :
Kernel
2. 交叉编译
2.1. 所需开发包
因wvdial工具依赖于 wvstreams库,而此库又依赖于openssl和zlib库
1>
2>
3>
4>
2.2. 注意事项
交叉编译一些工具时,我们经常遇到明明网上有时有基本的步骤的,但按步骤下来到自己这还是编不过,就我遇到的问题来讲,大多与不同的交叉编译工具链有关,如:
1>
2>
3>
发现以及解决这些问题,我的经验是:
1>
2>
另外,编译前请记得将你的交叉编译器的路径加入到PATH环境变量中,除非默认的PATH就可以找到它,如export PATH=$PATH:your-arm-gcc-path
特别注意,交叉编译环境上对于安装路径的配置,由于各代码的Makefile可能对install采取的策略不同,因此并不是所有的地方都可以通过./configure --prefix=your-install-path, 在没有设置好之前就make install,有可能覆盖你原编译主机的东西,为安全,最好在执行make install之前,使用make -n install检查下安装路由是否符合预期
2.3. zlib
2.3.1. 小结
只要不是你当前的编译环境上的ARM工具链不完整,基本上zlib和openssl都会很成功
2.3.2. 具体步骤
tar xjf zlib-1.2.5.tar.bz2
cd zlib-1.2.5
./configure --prefix=$PWD/../_install
修改Makefile
make
make install
2.4. opensll
2.4.1. 小结
2.4.2. 具体步骤
tar xzf openssl-0.9.8n.tar.gz
cd openssl-0.9.8n
patch -Np1 -i ../openssl-0.9.8n-fix_manpages-1.patch
./Configure --prefix=$PWD/../install os/compiler:arm-linux-gcc
make
make install
2.5. wvstreams
2.5.1. 小结
这是最关键的一步,会产生我们所需要的:
libwvbase.so
libwvstreams.so
libwvutils.so
此库的编译过程中,我遇到了不少问题,也耗了我比较多时间,主要:
1>
2>
2.5.2. 具体步骤
tar xzf wvstreams-4.6.1.tar.gz
cd wvstreams-4.6.1
修改configure ##这步记得一定要做,否则在configure时会有错误
./configure --prefix=$PWD/../_install --host=arm-linux \
make
make install
这步的关键是configure那步,只要过了基本后边是没有问题的,比如我遇到的检测说boost/***找不到,重新安装了下boost库至交叉编译工具链路径
2.5.3. 解决arm下getcontext调用失败问题
第一次编译时,基本上没想到会有在arm下还存在某些不支持的调用的情况,所以解决完所有问题编过后便很是happy;
后来在遇到运行出错时很是郁闷,网上能搜到的讨论基本全英文的,且都说没有解决办法,曾一度想要否定此方案,不过最终感谢强大的google以及某某不知名的大侠,修改源码后顺利解决,hoho~
[ 问题 ]
-----------
wvdial evdo
-----------
以标红处的关键字来搜,会发现很多评论,且结论是没办法解决的,如:
https://bugs.launchpad.net/ubuntu/+source/wvstreams/+bug/383978
[ 解决办法 ]
修改源码,用jmp_buf代替ucontext_t的相关实现,具体见下边;
改完后重编2.5.2重编库文件
--- include/wvtask.h.orig Mon Jul 14 13:11:35 2008
+++ include/wvtask.h Mon Nov 23 13:10:28 2009
@@ -50,12 +50,10 @@
int tid;
size_t stacksize;
bool running, recycled;
- ucontext_t mystate; // used for resuming the task
TaskFunc *func;
void *userdata;
@@ -91,16 +89,15 @@
static WvTask *current_task;
- static ucontext_t toplevel;
WvTaskMan *WvTaskMan::singleton;
@@ -198,9 +194,7 @@
if (!old_task)
@@ -315,18 +303,13 @@
@@ -340,39 +323,14 @@
void WvTaskMan::get_stack(WvTask &task, size_t size)
@@ -439,6 +389,7 @@
// allocate the stack area so we never use it again
-void WvTaskMan::do_task()
{
#ifdef HAVE_LIBC_STACK_END
extern const void *__libc_stack_end;
- if (use_shared_stack() || current_task == NULL)
return __libc_stack_end;
- else
- return (const char *)current_task->stack + current_task-
>stacksize;
#else
return 0;
#endif
@@ -553,16 +468,7 @@
size_t WvTaskMan::current_stacksize_limit()
{
- if (use_shared_stack() || current_task == NULL)
- {
- struct rlimit rl;
- if (getrlimit(RLIMIT_STACK, &rl) == 0)
- return size_t(rl.rlim_cur);
- else
return 0;
- }
- else
- return size_t(current_task->stacksize);
}
2.6. wvdial
tar xzf wvdial-1.61.tar.gz
cd wvdial-1.61
./configure #会生成Makefile
修改Makefile
修改wvrules.mk
make
make install
3. 运行测试
3.1. 安装
3.1.1. 目标文件
最后检查_install目录下的所有东西,我的安装目录如下:
[SCP_LINUX_HFP: wvdial ]$ ls _install/*
_install/bin:
c_rehash
_install/etc:
ppp
_install/include:
openssl
_install/lib:
engines
libcrypto.a
_install/sbin:
uniconfd
_install/share:
man
_install/ssl:
certs
_install/var:
lib
3.1.2. 整理
_install目录下产生的库及文件等都是没有strip和去掉静态链接库的,为节省空间,去掉运行环境上不需要的文件及库,最终生成如下:
[SCP_LINUX_HFP: _install_arm ]$ ls ./*
./bin:
c_rehash
./etc:
ppp
./lib:
libuniconf.so
libuniconf.so.4.6
libwvbase.so
libwvbase.so.4.6
./sbin:
uniconfd
压缩再解压至目标运行机即可
3.2. 配置并拨号
3.2.1. 生成默认配置
运行wvdialconf,可自动生成默认配置/etc/wvdial.conf,我的板子上输出如下
/usr/sbin # wvdialconf
Editing `/etc/wvdial.conf'.
Scanning your serial ports for a modem.
WvModem<*1>: Cannot get information for serial port.
ttyUSB0<*1>: ATQ0 V1 E1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 Z -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB0<*1>: Modem Identifier: ATI -- Manufacturer: +GMI: HUAWEI TECHNOLOGIES CO., LTD
ttyUSB0<*1>: Speed 4800: AT -- OK
ttyUSB0<*1>: Speed 9600: AT -- OK
ttyUSB0<*1>: Speed 19200: AT -- OK
ttyUSB0<*1>: Speed 38400: AT -- OK
ttyUSB0<*1>: Speed 57600: AT -- OK
ttyUSB0<*1>: Speed 115200: AT -- OK
ttyUSB0<*1>: Speed 230400: AT -- OK
ttyUSB0<*1>: Speed 460800: AT -- OK
ttyUSB0<*1>: Max speed is 460800; that should be safe.
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
Found a modem on /dev/ttyUSB0.
Modem configuration written to /etc/wvdial.conf.
ttyUSB0<Info>: Speed 460800; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
3.2.2. 调整配置
需要注意的是,对于波特率,此出测出的是460800,但实测发现460800对比上网速度不如115200,因此不要太迷信其测试结果,具体的参数还需要自己来调整配置
附我的配置文件:
[Dialer Defaults]
Modem Type = USB Modem
ISDN = 0
Init1 = ATZ
Modem = /dev/ttyUSB0
;Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Baud = 115200
[Dialer evdo]
Phone = #777
Username = card
Password = card
Carrier Check = on
Check Def Route = on
Dial Attempts = 1
Auto Reconnect = on
Abort on Busy = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = on
Idle Seconds = 0
Auto DNS = on
3.2.3. 拨号
开始拨号:
/usr/sbin # wvdial evdo
--> WvDial: Internet dialer version 1.61
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Modem initialized.
--> Sending: ATDT#777
--> Waiting for carrier.
ATDT#777
CONNECT
--> Carrier detected.
--> Starting pppd at Fri Mar 25 12:57:39 2011
--> Pid of pppd: 24546
--> Using interface ppp0
--> local
--> remote IP address 115.168.82.68
--> primary
--> secondary DNS address 220.192.32.103
停止拨号:ctrl+c即可
Caught signal 2:
--> Terminating on signal 15
--> Connect time 0.2 minutes.
--> Disconnecting at Fri Mar 25 12:57:51 2011
3.2.4. 遗留问题
1.
2.
当存在一台机有其它类型拨号时,需注意测试是否会有影响
3.
建议借助/etc/ppp/ip-up(pppd拨上号会回调此脚本)/ip-down来实现动态修改
- wvdial arm移植笔记
- wvdial移植ARM平台
- 运行移植的wvdial出错
- arm+系统移植笔记
- UCOS-II移植ARM的笔记
- UCOS-II移植ARM的笔记
- UCOS-II移植ARM的笔记
- arm平台gdb移植实践笔记
- uboot移植到Keil(mdk-arm)笔记
- UCOS-II移植ARM的笔记
- libmxml (Mini-XML) arm-linux 移植笔记
- UCOS-II移植ARM的笔记
- UCOS-II移植ARM的笔记
- libmxml (Mini-XML) arm-linux 移植笔记
- 基于arm架构的pppoe的终极移植笔记
- 激光雷达学习笔记(六)ARM-Linux平台算法移植
- 移植boa 服务器到arm开发板笔记
- s3c2440 arm+linux 开发板移植rt3070驱动笔记
- linux console using skill
- 60佳灵感来自大自然的网页设计作品欣赏
- “Golden Lessons From Steve Jobs / 史蒂夫·乔布斯的10句金玉良言”
- Ubuntu安装denyhosts防止暴力破解远程SSH
- sf上的SIMD的程序库
- wvdial arm移植笔记
- 星型打印(for 嵌套循环)
- 百万级访问网站前期的技术准备
- CSS中设置表格TD宽度的问题
- maven将lib的依赖包也打进jar中
- Isap 的 CPP 模板
- Histograms of Oriented Gradients (HOG)理解和源码
- jQuery UI教程
- Kernel中如何使用高精度timer(hrtimer)