上週末的 COSCUP 2008,由於第一天現場網路斷線,臨時跟幾位長輩借用了 3G SIM Card/Modem/AP 來擋一下。感謝 Custom Wu, ik, in2, Kinght Feng, Lloyd Hung (sort by letters) 的大德大力相挺。
為了能夠讓 3G 轉成無線網路 (802.11b/g) 訊號,連忙將有 USB Ports 的 ASUS WL-HDD2.5 與 FON2202 改裝含撥接工具新的 OpenWrt 版本。特意將先前未安裝的 kmod-usb-serial、kmod-ppp、comgt 等套件再補裝進新編譯的軔體。
華為 (Huawei) 的 E220 先前曾經試用過,這張卡的行為頗為詭異,它會提供 Virtual CD 與 USB serial 介面,Virtual CD 裡面擺的是驅動程式、手冊、設定檔 (for Windows) 等。
麻煩的是,大約是 Hotplug 或某種 race condition 的問題,有時 Linux 不會偵測到 serial interface,有時可抓到介面,可是在卸載 Virtual CD 前是無法使用的,很多時候就算卸載或不載入 Virtual CD 也無法使用! 所幸 bobovsky 做了一個初始化程式,執行後可以確保 USB Modem 被正確啟用。(顯然是用 USB sniffer 之類的工具做出來的)
因此我唯一需要做的是將程式編譯成 MIPS (LSB) 給 WL-HDD2.5, MIPS (MSB) 給 FON2202,丟到機器上並稍加設定。
必須先為系統添加一組 hotplug script /etc/hotplug.d/usb/20-usg-3g,目的在於判斷 E220 被插入時,自動執行初始化指令,讓 Modem 變成可撥接的狀態。
#!/bin/sh # Copyright (C) 2006 OpenWrt.org case "$ACTION" in remove) [ ${PRODUCT} == "12d1/1003/0" ] && { ifdown wan echo 1 > /proc/diagled/usb } ;; add) [ ${PRODUCT} == "12d1/1003/0" ] && { /bin/huaweiAktBbo echo 0 > /proc/diag/led/usb } ;; esac
另外,由於 usbserial 還不認得 E220,因此必須將 vendor/product id 先餵給它,如此插入設備時就可以自動產生 device file 等。作法是更改 /etc/modules.d/60-usb-serial
usbserial vendor=0x12d1 product=0x1003 maxSize=4096
上述是將硬體驅動的方法,此外就是要加入撥接工具。這件事情 comgt 可以代勞,OpenWrt 已經整合好相關的 Script,只要利用 UCI (Unified Configuration Interface) 對 /etc/config/network 進行更改如下即可
#### 3G config interface wan option device "/dev/usb/tts/0" option proto "3g" option apn "internet" option service "hsdpa" # or cdma, evdo, umts_only, or gprs_only # option pincode "0000" option mtu "1492"
由於大家的 SIM Card 都關掉了 PIN Code 檢驗機制,為了避免系統對 Modem 輸出錯誤 PIN Code 而鎖死 SIM Card,我也稍加更改了 /lib/network/3g.sh,避免系統在初始化時試圖對 Modem 設定 PIN Code.
--- ../../package/comgt/files/3g.sh 2008-04-17 09:29:56.000000000 +0800 +++ lib/network/3g.sh 2000-01-01 08:23:32.000000000 +0800 @@ -73,10 +73,12 @@ fi # Don't assume Option to be default as it breaks with Huawei Cards/Sticks - PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || { - echo "$cfg(3g): Failed to set the PIN code." - set_3g_led 0 0 0 - return 1 + test -z "$pincode" || { + PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || { + echo "$cfg(3g): Failed to set the PIN code." + set_3g_led 0 0 0 + return 1 + } } test -z "$mode" || { MODE="$mode" gcom -d "$device" -s /etc/gcom/setmode.gcom
只要將上述所需的套件都編譯、選定,在稍加修改特定幾個 Scripts 後,就可以利用方便的 ImageBuilder 產出所需的軔體了。本次也借用了 Knight 的 BandLuxe C120,基本用法是一樣的。