更換 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