Linux下使用電信3G CDMA上網卡

來源:互聯網
上載者:User

    第一個任務是在小板子上驅動電信的3G上網卡,新事物,在PC上先得跑通。隨卡帶的驅動是不可能有linux版的,所以接下來就有兩個辦法,一個是google一下有沒有這個卡的linux開源版驅動,太新,沒有;另一個就是看看kernel是否本身可以支援。後來得到確認,修改kernel的usb-serial部分是可以驅動的。

    這是個CDMA的卡,所以在drivers/usb/serial下搜一下有沒有和cdma modem有關的東西,還真有,一個叫option.c的檔案。實際上這就是usb cdma gsm modem的通用驅動,卻用了這麼一個福士化的名字,直接把這個卡的兩個ID加到了這個檔案裡。重編譯kernel,重啟機器。再插卡,就出現了/dev/ttyUSB0-2三個modem。

    接下來就簡單了,wvdialconf自動設定,然後再wvdial撥號。
$ sudo wvdialconf
$ sudo vi /etc/wvdial.conf
$ sudo wvdial

    sudo是必要的,因為要自動修改一些/etc下的設定檔,而且運行pppd也需要高許可權。很順利的就撥通了。wvdial和rp-pppoe都是pppd的前端程式。只是分工不同,wvdial負責通過modem撥號連線互連網,rp-pppoe負責通過網線撥號連線。核心其實都是pppd,只是pppd的配置忒複雜,才出現了這麼很多以它為後段的前端。

    那麼接下來就是往小板子上弄了。先修改kernel重編譯,很順利(只添一行,不順利才怪)。然後把卡插到板子上看看。沒反應,嵌入式系統一般不會有裝置自動添加這樣的東西的。。所以只能手動添加裝置檔案。
$ mknod /dev/ttyUSB0 c 188 0
$ mknod /dev/ttyUSB1 c 188 1
$ mknod /dev/ttyUSB2 c 188 2

    測一下這幾個裝置是否真的存在,很簡單的命令。
$ echo ATZ >/dev/ttyUSB0
$ echo ATZ >/dev/ttyUSB1
$ echo ATZ >/dev/ttyUSB2

    如果沒有任何錯誤輸出就對了,如果提示No such device,那就是kernel沒搞對。

    接下來就該移植那堆撥號軟體了,首先是pppd(ppp-2.x.x.tar.gz),以前弄過,這個包的configure是個假configure指令碼,只負責複製了一下Makefile。所以需要手工修改Makefile,不用編譯所有模組,只需要編譯pppd目錄和chat目錄即可。基本上是在Makefile裡添加CC的定義就ok了。

    順利編出pppd後,開始移植wvdial,就是這個東西讓我卡了殼——看到C++寫的就頭大。不僅僅如此,並不複雜的wvdial依賴於一個相當複雜的C++類庫wvstreams。wvstreams是個automake的工程,但即使如此也是需要改一堆東西,屏蔽幾十行代碼或幫忙實現點空函數才能編譯通過。這樣弄過去估計也不太可用。事實證明,wvdial雖然可以運行,卻對幾個modem裝置視而不見。

    為了證明modem是ok的,我專門寫了一個串口測試程式來測試modem。通過發送ATZ返回OK,ATI0返回一堆裝置資訊,ATDT#888返回CONNECT,可以確定裝置完好,沒有正常啟動並執行是wvdial。放棄wvdial,改用ppp-2.x.x內建的撥號指令碼,沒有成功,在PC都沒有成功,何況小板子上。

    以前在搞pppoe的時候,pppd可以正常工作,應該可以說明pppd是ok的。那麼關鍵就是怎麼使用pppd來撥號的問題。自己感覺用指令碼來做是個正途,參考了一些,都不好用。突然想到,既然wvdial可以跑,我抄它的pppd參數不就成了。wvdial是自己初始化modem,我用chat來初始化modem。以下就是我的撥號指令碼:

#! /bin/sh
MODEM=$1
SPEED=$2
TELNUMBER=$3
USER=$4
PWD=$5

if [ -z $MODEM ];
then
    MODEM=/dev/ttyUSB1
fi
if [ -z $SPEED ];
then
    SPEED=115200
fi
if [ -z $TELNUMBER ];
then
    TELNUMBER=#777
fi
if [ -z $USER ];
then
    USER=CARD
fi
if [ -z $PWD ];
then
    PWD=CARD
fi

CHATFILE=/etc/ppp/mychat
OPTFILE=/etc/ppp/options
PAPFILE=/etc/ppp/pap-secrets

#make chat script /etc/ppp/mychat
echo ABORT \"BUSY\" >$CHATFILE
echo ABORT \"NO CARRIER\" >>$CHATFILE
echo ABORT \"NO DIALTONE\" >>$CHATFILE
echo TIMEOUT 30 >>$CHATFILE
echo \"\" >>$CHATFILE
echo ATZ OK >>$CHATFILE
echo \"ATQ0 V1 E1 S0=0 \&C1 \&D2 +FCLASS=0\" OK >>$CHATFILE
echo \"ATDT$TELNUMBER\" CONNECT >>$CHATFILE
chmod +x $CHATFILE

#update options file
mv $OPTFILE $OPTFILE.bak
echo lock >$OPTFILE
echo modem >>$OPTFILE
echo crtscts >>$OPTFILE
echo defaultroute >>$OPTFILE
echo usehostname >>$OPTFILE
echo \-detach >>$OPTFILE
echo user $USER >>$OPTFILE
echo noipdefault >>$OPTFILE
#echo remotename ppp0 >>$OPTFILE
echo debug >>$OPTFILE
echo idle 0 >>$OPTFILE
echo connect \"chat -v -s -f $CHATFILE\" >>$OPTFILE
#echo demand >>$OPTFILE
echo usepeerdns >>$OPTFILE
#echo persist >>$OPTFILE
echo kdebug 1 >>$OPTFILE
echo $SPEED >>$OPTFILE

#update pap-secrets
mv $PAPFILE $PAPFILE.bak
cat $PAPFILE | grep -v "^${USER}" > $PAPFILE.new
echo "${USER} * ${PWD}" >> $PAPFILE.new
mv $PAPFILE.new $PAPFILE

#dialup
killall -9 pppd
killall -9 chat
mkdir -p /var/lock
mkdir -p /var/log
pppd $MODEM $SPEED

斷開直接kill pppd就可以了,不過注意是kill -15,發送SIGTERM訊號。
$ killall -15 pppd

目前仍然存在的問題是斷開之後無法再次撥號,必須拔掉卡重插一下才行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.