主题 : 移植wvdail到arm-linux問題集? 复制链接 | 浏览器收藏 | 打印
级别: 圣骑士
UID: 44407
精华: 0
发帖: 386
金钱: 1945 两
威望: 389 点
贡献值: 0 点
综合积分: 772 分
注册时间: 2011-04-25
最后登录: 2014-08-25
楼主  发表于: 2012-03-19 10:23

 移植wvdail到arm-linux問題集?

移植wvdial



wvdial是linux下的智能化撥號工具,利用wvdial和ppp可以實現linux下的輕鬆上網。在整個過程中wvdial的作用是撥號並等待提示,並根據提示輸入相應的用戶名和密碼等認證信息;ppp的作用是與撥入方協商傳輸數據的方法並維持該連接。

wvdial及其相關配置
wvdial的功能很強大,會試探著去猜測如何撥號及登錄到服務器,同時它還會對常見的錯誤智能的進行處理,不像chat一樣,要求你去寫登錄腳本。wvdial只有一個配置文件 /etc/wvdial.conf。wvdial的啟動過程是這樣的:首先載入wvdial.conf配置文件,然後再初始化modem並撥號,撥號後等待撥入方的響應,收到撥入方響應後則啟動pppd。

可以用wvdialconf程序自動生成wvdial.conf配置文件,自行該程序的格式為:
wvdialconf /etc/wvdial.conf
在執行該程序的過程中,程序會自動檢測你的modem的相關配置,包括可用的設備文件名,modem的波特率,初始化字符等等相關的撥號信息,並根據這些信息自動生成wvdial.conf配置文件。如果/etc/wvdial.conf文件已經存在時,再次執行該命令只會改變其中的 Modem、Band、Init等選項。一個典型的自動生成的配置文件可能是這樣的:

[Dialer Defaults]

Modem = /dev/ttyS1
Baud = 115200

Init1 = ATZ

Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 S11=55 +FCLASS=0

;Phone =

;Username =

;Password =

wvdial的執行格式為:
wvdial --help | --version | section
相關的說明如下:
--help:顯示簡單的幫助信息
--version:顯示wvdial的版本號
section:這裡的section有點像windows裡的ini文件,一個wvdial.conf配置文件可以有好多個section,每一個section由一些變量組成,即由 變量=值 的語句組成,如上所示。使用wvdialconf自動生成配置文件時將會自動生成一些常用的變量說明如下:

Inherits=InheritedSection:
使用wvdialconf自動生成配置文件時將會自動生成[Dialer Defaults],除此之外,你還 可以自定義你自己的section。程序運行時,首先載入[Dialer Defaults],然後再用指 定的section的相應選項覆蓋[Dialer Defaults]的相應選項。比如,我們在 wvdial.conf中還有[Dialer Tom],假如我們運行wvdail Tom,則系統將先讀入[Dialer Defaults],然後再用[Dialer Tom]覆蓋[Dialer Defaults]的相應選項。如果除了以上 的section之外還有[Dialer 169]並且內容如下:
[Dialer Tom]
Username=tom
Password=xxx
Inherits=169
[Dialer 169]
Phone=169
如果這時候我們執行wvdial Tom則系統將先讀入[Dialer Defaults],然後再用[Dialer Tom]覆蓋[Dialer Defaults]的相應選項,最後再用[Dialer 169]的相應選項來覆蓋前二者的相應選項。由此可見,利用wvdial,我們可以很方便地在不同的ISP或modem之間來回移動(假如你有幾個ISP或medom的話)。

Medom=/dev/ttySx:用於指定是用的medom,缺省的為/dev/medom。當然,在這裡我們的medom是由wvdialconf自動檢測並配置的,所以我們可以忽略該變量。

Band=57600:wvdial與modem通信的波特率,同上可以忽略。

Area Code=xxxx : 設置區號

Dial Prefix=x: 假如你正在使用分機,撥外線需撥9時,可設該值為9。

Username=xxxx:登錄時的用戶名

Passwd=xxxxxx:登錄密碼

Phone=xxxxx: 所撥的號碼

PPPP Path=:設置pppd所在的路徑,缺省為/usr/sbin/pppd

Force Address=x.x.x.x :設置靜態ip,一般的isp都會為你分配動態的ip地址。

New PPPD= 1 or 0: pppd 2.3.0及其以上版本需要/etc/ppp/peers/wvdial文件,如果你的pppd是2.3.0以上版本請設為1.

Auto Reconnect=on :斷線時是否自動重新連接,缺省設為是。

以上只是wvdial.conf中的常用選項,具體情參考wvdial手冊。


一、開發環境

編譯系統:Linux12/kernel 2.6.32.24
開發板:Mini6410(nand 1024M,SDRAM 64M)
交叉編譯工具:arm-linux-gcc-4.5.1


因wvdial工具依賴於 wvstreams函式庫,而此庫又依賴於openssl和zlib函式庫

1.zlib-1.2.5.tar.bz2
2.openssl-0.9.8n.tar.gz, openssl-0.9.8n-fix_manpages-1.patch
3.wvstreams-4.6.1.tar.gz,wvstreams-4.6.1-uclibc_compat.patch
4.wvdial-1.61.tar.gz


二、移植wvdial

1.移植準備
  a. zlib-1.2.5.tar.bz2
  b.openssl-0.9.8n.tar.gz, openssl-0.9.8n-fix_manpages-1.patch
  c.wvstreams-4.6.1.tar.gz
  d.wvdial-1.61.tar.gz

2.編譯zlib
      #./configure –prefix=$PWD/../_install --static
      #  make CC=arm-linux-gcc
      #  make CC=arm-linux-gcc install
3. 編譯openssl
      # patch -Np1 -i ../openssl-0.9.8n-fix_manpages-1.patch
      # ./Configure --prefix=$PWD/../_install os/compiler:arm-linux-gcc
      #  make CC=arm-linux-gcc
      #  make CC=arm-linux-gcc install
4.編譯wvstreams
      #  修改./configure中的”with_zlib”及”with_openssl”
           with_zlib=no改成with_zlib=yes
           with_openssl =no改成with_openssl =yes
      如果不先配置./configure,否則會有錯誤(問題可見config.log)
      # ./configure --prefix=$PWD/../_install --host=arm-linux \
        CPPFLAGS=-I$PWD/../_install/include LDFLAGS=-L$PWD/../_install/lib \
        CFLAGS=-I$PWD/../_install/include --with-zlib=$PWD/../zlib-1.2.5 \
        --with-openssl=$PWD/../openssl-0.9.8n \
        --without-dbus --with-pam=no --with-tcl=no --with-qt=no --without-valgrind

 解決arm下getcontext 調用失敗問題: utils/wvtask.cc:202: WvTaskMan::WvTaskMan(): Assertion `getcontext(&get_stack_return) == 0' failed.

[ 解決辦法 ]
修改源碼,用jmp_buf代替ucontext_t的相關實現,具體見下邊;
改完後重編庫文件
      #  patch -Np1 -i ../wvstreams-4.6.1-uclibc_compat.patch
      #  make CC=arm-linux-gcc
      #  make CC=arm-linux-gcc install

      產生所需:
      libwvbase.so
      libwvstreams.so
      libwvutils.so
5.編譯wvdial
      # ./configure(產生Makefile)      
      # 編輯Makefile

      prefix=/usr/local→prefix=${PWD}/../_install
      PPPDIR=/etc/ppp/peers→PPPDIR=${prefix}/etc/ppp/peers
      PC_CFLAGS=$(shell pkg-config --cflags libwvstreams)→PC_CFLAGS=-I${PWD}/../_install/include/wvstreams
      PC_LIBS=$(shell pkg-config --libs libwvstreams)→PC_LIBS=-L${PWD}/../_install/lib -lwvstreams -lwvutils -lwvbase -lz
      
      # 編輯wvrules.mk
            WVLINK_CC = gcc (如果沒有此句則直接添加)
            改為
            WVLINK_CC = arm-linux-g++
            CC = arm-linux-g++
            CXX = arm-linux-g++

      #  make CC=arm-linux-gcc
      #  make CC=arm-linux-gcc install

[ 此帖被kazaya在2012-03-21 16:42重新编辑 ]
级别: 圣骑士
UID: 44407
精华: 0
发帖: 386
金钱: 1945 两
威望: 389 点
贡献值: 0 点
综合积分: 772 分
注册时间: 2011-04-25
最后登录: 2014-08-25
1楼  发表于: 2012-03-19 16:42
參考:嵌入式linux 下3G模塊的驅動和應用文檔發現


./wvdial

arm下getcontext调用失败问题

--> Modem initialized.
wvdial: utils/wvtask.cc:202: WvTaskMan::WvTaskMan(): Assertion `getcontext(&get_
stack_return) == 0' failed.

上patch已解決了getcontext调用失败问题

目前:出現Segmentation fault

--> WvDial: Internet dialer version 1.61
--> Cannot set 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
--> Sending: ATM0
ATM0
OK
--> Modem initialized.
Segmentation fault
[ 此帖被kazaya在2012-03-21 16:35重新编辑 ]
级别: 圣骑士
UID: 44407
精华: 0
发帖: 386
金钱: 1945 两
威望: 389 点
贡献值: 0 点
综合积分: 772 分
注册时间: 2011-04-25
最后登录: 2014-08-25
2楼  发表于: 2012-03-27 10:16
最後是用pppd完成3G tether

目前tether皆用命令模式,希望能有人告知如何用UI方式.....

實現3G modem,要以下著手:
1. Kernel支持 ppp協議及usb serial converter
2. User Mode支持Usb_modeswitch配置命令
3. libusb提供usb_modeswitch一套系統API(新版usb-modeswitch內含libusb函式庫)
4. User Mode支持撥接命令(pppd+chat或wvdial目前仍有問題)





1.重新編譯kernel

a.把 iptables/netfilter選項開啟,並停用bridge

-> Networking support
   -> Networking options
        -> Network packet filtering framework(Netfilter)
            -> Network packet filtering debugging
         -> Advaned netfilter configuration
                Core Netfilter Configuration
                -> Netfilter NFQUEUE over NFNETLINK interface
                -> Netfilter connection tracking support
                -> Netbios name service protocal support(new)
                -> Netfilter Xtables support (required for ip_tables)
                   -> multiport Multiple port match support
                   -> owner match support
                   -> state match support
                 IP: Netfilter Configuration
                  -> IPv4 connection tracking support (require for NAT)
                  ->    proc/sysctl compatibility with old connection tracking
                  -> IP tables support (required for filtering/masq/NAT)
                  -> Packet filtering
                  ->  REJECT target support
                  -> Full NAT
                   -> MASQUERADE target support
                   -> REDIRECT target support

b.支持 ppp協議及usb serial converter

-> Device Drivers---→(USB Converter)
       USB support---→
          <*>USB SerialConverter support--→
          [*]USB Generic Serial Driver
          <*>USB driver for GSM and CDMA modems’

-> Device Drivers--→(pppd)
       Network device support---→
          <*> PPP (point-to-point protocol) support  
           [*]   PPP multilink support (EXPERIMENTAL)    
           <*>   PPP support for async serial ports      
           <*>   PPP support for sync tty ports          
           <*>   PPP Deflate compression                
           <*>   PPP BSD-Compress compression


2.編譯ar6000.ko
3.hostapd及dnsmasq
4.撰寫/data/misc/wifi/hostapd.conf 、 /etc/resolv.conf

     /data/misc/wifi/hostapd.conf

       interface=wlan0
       ctrl_interface=wlan0
       ssid=AR6003AP
       channel=1
       max_num_sta=8
       beacon_int=100
       dtim_period=1
       #hw_mode=g
       #bridge=br0
       #driver=nl80211
       #dtim_period=1
       #rts_threshold=2347
       #fragm_threshold=2346
       #macaddr_acl=0
       #auth_algs=3
       #ieee80211n=0
       #ignore_broadcast_ssid=0
       wpa=2
       wpa_passphrase=12345678
       wpa_key_mgmt=WPA-PSK
       wpa_pairwise=TKIP CCMP

     /etc/resolv.conf

       #nameserver 8.8.8.8
       #nameserver 4.4.4.4
       nameserver 218.30.19.50
       nameserver 61.134.1.5

5.撰寫/etc/ppp/peer/wcdma、wcdma-chat-connect及wcdma-chat-disconnect

     /etc/ppp/peer/wcdma
       #/etc/ppp/peers/cdma
       # This is pppd script for China liantong
       # Usage:   root>pppd call cdma
       hide-password
       noauth
       connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-connect'
       disconnect '/usr/sbin/chat -s -v -f /etc/ppp/peers/wcdma-chat-disconnect'
       debug
       /dev/ttyUSB0
       #115200
       460800
       defaultroute
       noipdefault
       novj
       novjccomp
       noccp
       ipcp-accept-local
       ipcp-accept-remote
       local
       lock
       dump
       nodetach
       user "vibo"
       password "vibo"
       crtscts
       remotename 3gppp
       ipparam 3gppp
       usepeerdns
       debug

     /etc/ppp/peer/wcdma-chat-connect

       ABORT "BUSY"
       ABORT "NO CARRIER"
       ABORT "NO DIALTONE"
       ABORT "ERROR"
       ABORT "NO ANSWER"
       TIMEOUT 120
       "" AT
       OK \rATZ
       #OK \rAT+CGDCONT=1,"IP","3gnet",,0,0
       OK \rAT+CGDCONT=1,"IP","vibo",,0,0
       OK-AT-OK ATDT*99#
       CONNECT \d\c


     /etc/ppp/peer/wcdma-chat-disconnect
       ABORT "ERROR"
       ABORT "NO DIALTONE"
       SAY "\NSending break to the modem\n"
       ""\k"
       ""+++ATH"
       SAY "\nGood bay\n"

busybox ifconfig eth0 up
busybox route -n
netcfg eth0 dhcp
insmod /system/wifi/ar6000.ko
busybox ifconfig wlan0 192.168.11.1 up
/system/bin/hostapd -B /data/misc/wifi/hostapd.conf
pppd file /etc/pppd/peer/wcdma


sysctl -w net.ipv4.ip_forward=1
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables --append FORWARD --in-interface wlan0 -o eth0 -j ACCEPT
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE

dnsmasq -z -i wlan0 -F 192.168.11.100,192.168.11.200,12h
[ 此帖被kazaya在2012-03-27 10:32重新编辑 ]