若你照著前幾篇文章,不小心真的把 WL-700gE 刷成 OpenWrt。一時後悔想換回來的話,這裡是一些技巧與方法。不過既然刷成功了,能夠享用更多的「自由」,何必後悔
😉

首先,機器上的 Reset 鈕是沒有用的。請不要浪費時間照的手冊試圖 “Reset” 你的機器。凡是透過 tftp 上傳軔體到 CFE 上,你就已經蓋掉官方軔體。既然都已經覆蓋了,就沒有 Reset 的可能性。

要復原軔體最簡單的作法莫過於直接使用 ASUS 所提供的 Firmware Restoration Tool 來重裝所有的軔體。

但是 Firmware Restoration Tool 只能在 Windows 上使用,若你像我一樣只使用 Linux,以下是復原的程序。

WL-700gE 的軔體分成兩個部份,一部分是給 flash 所使用的核心與基本的開機設定工具,一部分則是存在 IDE 硬碟的應用軟體與檔案系統。你在官方網站所下載的軔體都會包含這兩部份。

首先,你該做的是先 flash 部份的軔體從下載的 NAS 軔體檔案中抽出。你需要 nasunpack (uasunpack.exe) 或社群所開發的 AsusTrxExtract (AsusTrxExtract_1.0.0.1.zip),這些工具可以讓你將軔體解出。其中 AsusTrxExtract 是使用 C# 所開發,作者尚提供了原始碼,你可以於網路上搜尋下載。而 nasunacpk 則內含於 ASUS 所提供下載的 GPL 檔案中。

nasunacpk 使用方式很簡單,除了用 nasunpack 解開外,你尚必須去除檔案中的標頭,最後取出的檔案才是我們所需的原始檔

$ nasunpack --sections WL700gE_1.0.7.8.nas
section headers ---
00: type = 0x15 (BRCM_NAS_SECTION_TYPE_TAG  ), length =      126 bytes
01: type = 0x12 (BRCM_NAS_SECTION_TYPE_FLASH), length =  1691648 bytes
02: type = 0x13 (BRCM_NAS_SECTION_TYPE_DISK ), length = 16560128 bytes
$ nasunpack --extract=0,tag WL700gE_1.0.7.8.nas
dumping section 0 into tag...
$ cat tag
BroadNAS System Software
Version: 2.2.1
unknown
Build date: 三  7月 25 15:30:01 CST 2007
Build by: [email protected]
$ nasunpack --extract=1,flash WL700gE_1.0.7.8.nas
dumping section 1 into flash...
$ dd if=flash of=piggy.gz bs=1 skip=28
1691620+0 records in
1691620+0 records out
1691620 bytes (1.7 MB) copied, 8.40643 seconds, 201 kB/s
$ file piggy.gz
piggy.gz: gzip compressed data, was "piggy", from Unix, last modified: Wed Jun 27 21:42:29 2007, max compression
$ nasunpack --extract=2,disk WL700gE_1.0.7.8.nas
dumping section 2 into disk...
$ dd if=disk of=crom bs=1 skip=28
16560100+0 records in
16560100+0 records out
16560100 bytes (17 MB) copied, 81.0496 seconds, 204 kB/s
$ file crom
crom: Linux Compressed ROM File System data, little endian size 65536 CRC 0x911b22f7, edition -1278167390, 138541296 blocks, 1226466058 files

其中 crom 是 WL-700gE 會安裝於 disk 上得應用軟體,若你想研究內含的軟體,可以用 mount -o loop 將檔案掛載起來查看。而 piggy.gz 就是我們所需的 Linux kernel 核心檔案,接下來可以利用重新開機並按下 “Ez Button” 的方式,透過 CFE 重新燒錄舊版軔體。細節請參考 Wl-700gE Reflash HowTo

燒錄好原本的核心後,另外一個麻煩的是要重建原本存在 IDE 硬碟的應用軟體。若你沒有手賤的去亂刪除 /dev/mtdblock/2 的資料,核心應該在重新開機後會載入存於 /dev/mtdblock/2 (/dev/mtdblock/2 只是另外一個 MTD block) 的基本工具,其中包含了復原與重新格式化硬碟的機制。

第二個階段是比較妙的,由於 WL-700gE 在接受第二階段的 disk image 上傳時,會作檢驗,系統必須接受某種 UDP 的認證協定後,才會接受新的 disk image. 因此你沒辦法單純的用 tftp 上傳,這時可以用 nasload (一樣內含於 ASUS 所提供下載的 GPL 檔案中) 使用檔案進行上傳。

用法如下

$ nasload /U /P /a /1 /f WL700gE_1.0.7.8.nas

如此就可以將 WL-700gE 完全復原到出廠的狀態了!

在安裝過 OpenWrt 到 WL-700gE 上後,你得作個抉擇。是要持續使用 OpenWrt,或者選用其他的自由軟體套件系統,如 Debian GNU/Linux。若要繼續使用 OpenWrt,你可以將裝好的 OpenWrt Image 再倒入硬碟中,之後就可以以 ipkg 的機制安裝軟體。

也可以選擇安裝其他的套件系統,如已經被移植數千種軟體的 Debian 系統。且 Debian 是少數支援 mipsel 的套件系統之一。

安裝方式很簡單,你可以利用 cdebootstrap 造一個給 mipsel 使用的基礎系統 (base system),操作方式如下

# cdebootstrap -v --foreign --arch=mipsel lenny debian-distro http://ftp.tw.debian.org/debian
P: Retrieving Release
P: Retrieving Release.gpg
P: Validating Release
I: Good signature from "Debian Archive Automatic Signing Key (4.0/etch) <[email protected]>"
P: Parsing Release
P: Validating Packages.gz
P: Parsing Packages
P: Validating gcc-4.3-base
P: Validating libgcc1
...
...
...
P: Writing hosts
P: Writing resolv.conf
W: Creation of /dev/console failed
I: Second stage installer is available as /sbin/cdebootstrap-foreign or /sbin/init

上述指令,會為你建立一個 lenny 版本的 Debian 系統。若想擺入核心或其他套件的話,可加入額外參數如 –include=linux-image-2.6-sb1a-bcm91480b

你可以將上述 debian-distro 目錄壓縮後,丟到 WL-700gE 上再解到 IDE 硬碟的分割區中。然後透過修改 flash 中的 OpenWrt 之 preinit 等指令,預先載入該分割區,並利用 pivot_root 或 chroot 來更換系統目錄。待正確切換入系統後,再以 root 執行 /sbin/cdebootstrap-foreign 即可完成所有安裝程序。

開機的流程將會是 CFE -> OpenWrt -> Debian. 不過若使用 pivot_root 或 chroot 都會使系統使用 OpenWrt 的核心系統。

若想於 Debian 中使用不同的核心,不妨使用 kexec ,mipsel 平台的版本也已經被移植好。當然,你也得修改 OpenWrt 軔體中的 /sbin/init,讓系統自動搜尋你想使用的核心,並透過 kexec 線上重新載入新的核心系統。目前這個技術尚未有標準的設定檔作法或範例,戲法巧妙不同,就看你如何應用了。

更換 WL-700gE 軔體的方法相當容易,不過還是花了些時間測試。

剛取得機器的時候,透過出廠內建的 Bootloader CFE,在開機時按下 ezsetup 鈕,即可讓 CFE 進入 ‘Rescue mode‘ 接受 TFTP 上傳新的軔體,並自動燒入 nvram 中。

只要正確設定上傳方的 IP 與使用 TFTP Client,就可輕易的將軔體換成其他版本,細節可參考 OpenWrt Wiki 上的 HowTo。燒錄過程相當迅速,稍微計算一下,Flash 寫入 1.6M 的軔體,大約只需要 16 秒。

製作給 ASUS WL-700gE 的 OpenWrt 軔體也相當容易,由於開發者已經寫好 WL-700gE 的 Profile,你可以在 make menuconfig 時,直接選用 Broadcom BCM947xx/953xx [2.4],Profile 選 WL-700gE 即可。OpenWrt Buildroot 會為你建一個基本的軔體出來。

之所以選擇 2.4 核心的原因,是 WL-700gE 的無線網路驅動程式 broadcom-wl 目前只能在 2.4 上跑。而另外一組開放原碼的 b43 目前暫時只有 STA 模式,由於 mac80211 與 hostapd 的支援問題,Access Point mode 還無法使用。

困難的地方在於一開始測試時,並沒有外接 Console。於是時常碰到燒入後無法開機,或者開機後可使用,卻在一段時間或重開機後就無法連接的問題。

瞎子摸象了一段時間後,認命的參考 Adding a Serial Console to an Asus WL-700gE 一文,把機器拆解,拔掉內建的變壓器,並接上 Serial Console。拔除時,發現變壓器外裝只是用紙片隔離,感覺實在有點簡陋。

上圖腳位由上而下順序是 VCC(?), TX, RX, GND,電壓是 3.3V,終端機設定為 115200 bps 8N1。如此,就可以讀到所有的 Console Messages, 包含 CFE  等開機訊息

CFE version 1.0.37 for BCM947XX (32bit,SP,LE
Build Date: 四 12月 29 20:36:58 CST 2005 ([email protected]
Copyright (C) 2000,2001,2002,2003 Broadcom Corporation.

Initializing Arena
Initializing Devices.
et0: Broadcom BCM47xx 10/100 Mbps Ethernet Controller 3.90.23.0
rndis0: Broadcom USB RNDIS Network Adapter (P-t-P)
CPU type 0x29006: 264MHz
Total memory: 67108864 KBytes

Total memory used by CFE:  0x80800000 - 0x8089BA00 (637440)
Initialized Data:          0x80831B70 - 0x80834250 (9952)
BSS Area:                  0x80834250 - 0x80835A00 (6064)
Local Heap:                0x80835A00 - 0x80899A00 (409600)
Stack Area:                0x80899A00 - 0x8089BA00 (8192)
Text (code) segment:       0x80800000 - 0x80831B70 (203632)
Boot area (physical):      0x0089C000 - 0x008DC000
Relocation Factor:         I:00000000 - D:00000000

Device eth0:  hwaddr 00-17-31-A4-22-59, ipaddr 192.168.1.1, mask 255.255.255.0
 gateway not set, nameserver not set
Null Rescue Flag.
Null Rescue Flag.
10 seconds to Rescue mode...
Null Rescue Flag.

於是,終於讀到幾個小問題。這些問題是 OpenWrt 並未處理或提醒的

第一個編譯出來的 openwrt-brcm-2.4-squashfs.trx 必須小於 1802240 bytes。由於 WL-700gE 的 Flash 只有 2M,加上留給 CFE, configs 的空間。若超過大小,CFE 就會拒絕接受,下次重新開機會自動進到 Rescue mode

另外一個問題在於,squashfs 格式軔體,預設會試著找出 Flash 中的空餘空間,並利用 mini_fo 格式化為 jffs2、載入給系統使用。這在 Flash 夠大的機器上相當好用,因為你可以保持原本的軔體檔案,所有的設定修改都會被另存到額外的空間。

但是由於 WL-700gE 的 Flash 太小, 所以 mini_fo 根本沒有足夠的空間無法正確初始。以至於系統因此停滯/當機。系統會出現如下的錯誤訊息

mini_fo: build_sto_structure: failed to create storage dir [1].
mini_fo: get_neg_sto_dentry: ERROR building sto structure.

解法是關掉 firstboot / preinit / mount_root 中初始化 mini_fo/jffs2 的相關指令。

另外一個問題是 IDE 硬碟的初始化問題,由於 WL-700gE 的硬碟必須透過 GPIO 驅動,因此你必須先載入 diag.o 模組後,才能載入 IDE 相關模組與掛載檔案系統。這些也必須透過調整模組載入的優先值來修正問題。

最後是由於 Flash 根本太小,所以你得把主程式裝進硬碟中,並在 preinit 中作檔案系統掛載,並利用 pivot_root 或 chroot 來切換系統目錄。

當你都解決以上問題後,就終於可以開始使用 OpenWrt 了。:D

話說知名製作人阿怪 (aguai)兄前陣子拿了一台 ASUS WL-700gE,說是閒置著所以打算刷成其他版本的軔體,借給我一段時間研究。謝阿怪恩准玩弄他的寶貝。

事先調查在 OpenWrt Wiki 及阿怪的機器上調查了硬體規格,WL-700gE 的 SoC 速度是 BCM3302 v0.6 at 266 MHz, 2M flash 以及 64MB DDR-SDRAM。除了內建 IDE controller 與硬碟外,還有三個 USB 2.0 接頭 (VIA Vectro VT6212)。若想玩硬體修改,板子尚留有一個 Mini PCI 腳位,只要再想辦法焊接接頭即可。不愧是當動物園養寵物的好物。

剛拿到的時候,自然先從它的官方軔體研究起。阿怪機器的出廠值是 1.0.4.6,內建的 udhcpc 0.9.8 有點老舊,以至於與某些 DHCP Server 有些相容的問題。(像是我家的小 ISP,就一直無法取得 IP。)

於是就換到 ASUS 官方下載頁面的最新版軔體,1.0.7.8。udhcpc 還是基於 0.9.8,不過原始碼中倒是加了 patch (by Arthur, Chan-I, Joey, JYWeng ?) 來修正相容的問題,於是總算可以連上網路沒問題。

ASUS 的官方軔體中,我比較感興趣的是它所提供的網路攝影機與 P2P 下載功能,以及較少人使用的 DAAPDLNA Digital Media Server 功能。

網路攝影機的部份,ASUS 只載入了兩個驅動程式,分別是 ov51x v1.65-1.10-mark 與 pwc 8.11,若要測試相機功能,必須找到相容的硬體才行。我的 Webcam 是 UVC 介面,無法在 WL-700gE 上使用。

至於 P2P,WL-700gE 內建了 ctorrent (ctorrent-1.3.4.700gE.3.3, ctorrnet 已停止維護,新版可於 dholmes 的網站下載)。據我所知,ctorrent 1.3.4 尚未支援 Super-seeding, DHT, Peer exchangeEncryption特色,這些缺乏的功能將會嚴重影響上、下傳效能。

ASUS 倒是為 ctorrent 補強些功能,最明顯的是加了檔名的多國語言處理 (雖然只是用 /shares/bin/iconv 來轉),因此就算下載內含不同編碼方式的檔案,儲存後也不會變成亂碼,WL-700gE 仍然可以正確儲存讓使用者存取使用。

不過 ASUS 並未釋出修改過後的 ctorrent 原始碼,而只提供了二進位檔案。由於 ctorrnet 是 GPLv2 授權,說起來是 ASUS 違反了 GPL 授權。除了可以下載 BitTorrent 外,ASUS 還擺了 giFT 0.11.8.1,giFT 是支援數種不同的 Peer to Peer 檔案分享協定的軟體,包含了 FastTrack, OpenFTGnutella 等數種不同的協定。giFT 這麼好用的東西也是採用 GPLv2 授權,ASUS 當然也沒有提供原始碼。

DAAP 的功能,則是用以將硬碟中的音樂檔案分享給 iTunes,在 WL-700gE 是採用 mt-daapd 0.2.4 (現稱為 Firefly Media Server), ASUS 並未釋出相容是 GPLv2 授權的原始碼。至於 Digital Media Server 則是採用 Intel® Digital Home Device Code Wizard (原 Intel® Authoring Tools for UPnP Technologies) 的 SDK,採 Intel 私有授權。

雖說上述幾個 GPL 授權軟體,ASUS 並未釋出原始碼。但是 ASUS 其實已經在網頁上提供了 GPL 相關授權的壓縮檔,可以讓使用者自行下載。相較於行為更某些糟糕的廠商,ASUS 已經相當有誠意的放出了大部分的程式碼,包含用以編譯系統的原始碼(Build system and Makefile),甚至連私有軟體都放出函式庫或執行檔,包含了網頁管理介面所使用的函式庫。因此使用者有機會可以自行重新編譯與官方相同的軔體。就誠意來講,應該大大鼓勵。

之所以說有機會可以自行編譯,是因為 ASUS 送出的檔案似乎曾經受過某些工程師的無意修改,因此不少 Makefile 都必須再稍加調整後才能正確編譯。我稍微修改了一版 1.0.7.8 可完全編譯的版本。尚需找個地方擺原始碼才行。

不過非常可惜的是,ASUS 刻意保留了部份加強過的 GPL 軟體原始碼,雖說應該是商業上的考量,但是還是違反了授權。不管你是自有品牌、或 OEM/ODM 硬體廠,若使用 GPL 授權之相關軟體, 建議出貨前應該參考GPL 軟體授權適法訣竅檢查一遍為妥。

另外一個值得一提的是,這兩版軔體預設都開啟了 utelnetd,於是你可以直接連入一探究竟。若你對官方軔體的內容感興趣,相關軔體版本都可於官方下載。此外,這是 1.0.4.6 的 (disk) 軔體檔案列表,1.0.7.8 的列表於

另外,網路上也有人提到 ASUS 無意中於 www.asus.ru 釋出的 2.0.0.7 版本。功能似乎類似,但是網頁管理介面倒是用 Java Script 加強了不少,外觀看起來先進多了啊。

(本文是事後才整理,由於記憶不佳及缺乏測試,某些資訊可能有誤)

上週末的 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,基本用法是一樣的。

上週末的 COSCUP 2008 終於結束了。報名人數超過四百餘人 (且還有眾多人員向隅),報名踴躍與出席狀況都相當良好,活動算是大成功阿。特別是今年第一個晚上的 BoF ,開了五個議程,每場都有同好參加,是第一次台灣社群活動所謂 BoF 成功的例子阿∼ 成功的會議要感謝主辦團隊跟各社群協調者的大力支持、配合。

這次活動,兼任了場地的無線網路佈建跟最後一場主持人,順便分享了一場年初到目前為止的無線網路佈建經驗。簡報檔案可於COSCUP 2008 網站上下載。


感謝 cocakl 攝影

講題的部份,由於時間只有二十分鐘,有許多東西其實沒辦法深入解釋說明,光是講到頭幾頁介紹 OpenWrt 8.08 就已經花了十五分鐘。很多可以詳細說明的細節只好略過不提,像是天線的配置與選擇技巧,以及 802.11 b/g 所使用的 DSSS, OFDM特性差異,特別是投影片的最後幾張政見宣導沒有機會講。投影片中的許多細節可以於先前 Blog 過的文章中找到深入說明。去年的簡報也可於下載。

本次活動的網路實在是非常囧。早在一個月前就已經去場勘,原則上除了需要先註冊欲使用的設備 MAC Address 外,網路直接使用台灣大學應用力學研究所的區網應該可以非常順暢。沒想到活動前一天才知道,8/23 整天台灣大學因為網路設備升級會斷線!

當下重新為 ASUS WL-HDD25 與 FON2202 重新編譯了一版可以接取 Huawei E220 的 OpenWrt Trunk 版本。前一晚幾乎都在編譯加上測試。雖然當天借用到了四、五個 3G SIM/Modem,沒想到還是不敵場內 GSM/3G 訊號不良,對外頻寬比小便撥接還慢。虧我還帶了一台 EEEPC + USB Hub 要當 Multipath-routing Gateway (後來才知道原來大廳可以收到好訊號,應該要另外想辦法弄幾台 Repeater 出來打進室內才對)

週六傍晚與週日雖然對外恢復,但是台大對外路由一直頗怪,像是接到中華電信或國外某些網段都會嚴重掉封包。且台灣大學內部的名稱伺服器反應特慢,所以大家使用大約也會感受到鈍鈍。(大家倒是很給面子的沒有嫌棄阿,感恩)

連續幾次佈建都不甚順利,下次真的要買綠色乖乖來祭拜宅神 (地基主) 了啊。