斐訊 K3 上車,開啓 Telnet、刷已 Root 版官方固件和 Merlin

Posted on

斐訊的車越開越猛,而且「新」品 K3 的 AC3167 能力,起碼聽起來是很誘惑的,並且硬體規格也不錯,沒有明顯短板。但是因爲不想投太大的本金,所以京東上車,白條 12 期。事前專門資訊了客服京東是否可以參加 K 碼反現,客服非常果斷地表示沒問題。這樣膽子就大了。

上車

等了兩天降價一點點,果斷下單了。雖然事前就知道這孩子特別大隻,但是到手之後還是覺得包裹有些過於龐大了…

盒子被 JD 弄彎了一個角…總的來說,外觀設計上很大氣,並且也努力想要做出質感來了,但是最後還是敗在了卡紙的成本上。由於包裝設計的原因,拿出路由器非常好拿。

配件給得很小氣,全部的配件只有一個電源適配器,壓在路由器的包裝下,還有一本小小的快速安裝指南和一張下車指南小卡片。

K3 整體的設計來說,雖然不是淺羽的風格,但是還是好看的。弧線的曲率很舒服,設計感滿滿,更給人一種摩天大廈的感覺。頂部有一塊 3.5 吋熒幕,是老喬說的「最合適的熒幕尺寸」,並且配有三個觸摸鍵。背面有一個 USB 3.0(儘管是黑色的),一個 WAN 口和 3 個 LAN 口,均爲千兆網口,另外還有一個電源鍵。底部是裝置訊息,還有反現的重點 K 碼。另外電源適配器是一個 38W 的適配器,插頭不可摺疊,就沒有拍照了。

以上開箱完成,簡單測過硬體沒有大問題之後,兌換了 K 碼,開始折騰。

打開 Telnet 並備份韌體

到手韌體版本已經是 V21.5.39.260 了,屬於一個比較新的版本,不能直接刷所謂的「過渡固件」了。CFE 版本也已經更新,不能透過訪問 HTTP 執行指令。於是通過 phitools 大的工具打開 Telent。順便吐槽,現在的百度網盤幾乎都下不動了,所以淺羽也上載到了櫻川存儲,可以快速下載。使用工具打開 Telnet 之後就可以直接連上了,不需要任何認證。插上一個 U 盤,接着可以備份固件了:

# cd /tmp/share/sda1
# cat /dev/mtd0 > boot.bin
# cat /dev/mtd1 > nvram.bin
# cat /dev/mtd2 > nvram_back.bin
# cat /dev/mtd3 > res_info.bin
# cat /dev/mtd4 > pro_info.bin
# cat /dev/mtd5 > dev_info.bin
# cat /dev/mtd6 > linux.bin
# cat /dev/mtd7 > rootfs.bin
# cat /dev/mtd8 > brcmnand.bin

或者簡單地寫個循環就好了。這些備份可以再用 Telnet 或者 SSH 寫回去,也可以在舊版的 CFE 下直接刷回去。

刷官改固件(Root 版官方韌體)

直接在 Telnet 下,cat/dev/mtdblock6 就可以:

# cat 21.6.8.46_tb.bin > /dev/mtdblock6 && reboot

刷完之後,熒幕會提示「固件升級中」,耐心等待它更新完成自動重啓即可。

降級 CFE

新版(據說就是 V21.5.39.260 之後)的 CFE 更新了,不能再通過訪問 HTTP 執行寫入指令,因此需要先降級 CFE。CFE 其實就在 /dev/mtdblock0 中,有一個 Windows Only 的工具可以幫忙從備份的 CFE 裏生成降級的 CFE 並且保留 MAC 地址等資料。生成之後,拷貝回 U 盤裏,寫回 /dev/mtdblock0 重啓就可以了。這個工具同樣可以從櫻川存儲下載

尝试 Merlin

Merlin 是高貴的阿蘇斯華碩路由器官方固件的改版,之前在 R6300V2 和 R7000 上用過,還是比較喜歡的。雖然功能不如 OpenWRT 那麼強大,但是穩定性也是不錯的,並且設定上更簡單。考慮到淺羽主要把 K3 用作 AP,於是就刷個 Merlin 吧。

從 CFE 刷 Merlin(及其他韌體)

首先給 PC 設定好 IP 位置爲 192.168.2.2/24,然後開始 ping 192.168.2.1。

保持電源關閉。找一根細小的物體(比如淺羽用的杜邦線),按下 Reset 並保持,同時打開電源。大約 3~5 秒後,可以看到 ping 的返回資料中,TTL=100,這時候訪問 http://192.168.2.1,應該就可以看到 CFE 的介面了。這時候上載資料多半是過不了校驗的,需要本地開好個 TFTP 伺服器,然後訪問 HTTP 執行指令:

http://[Router IP Addr]/do.htm?cmd=flash+-noheader+[PC IP Addr]:/[Firmware Filename]+nflash0.trx

雖然訪問之後是無法打開,但是可以看到 TFTP 伺服器在往路由器發送資料了。發送完成之後,在 CFE 的 Web UI 下選擇 Restore defualt NVRAM vaules. ,然後關閉電源重啓即可進入 Merlin。此方法原則上可以刷大部分韌體,包括但不限於官改、Merlin、OpenWRT。

另外刷了 Merlin 之後可以順帶看一眼自己的的閃存,在 ssh 下看 dmesg

# dmesg | grep -A6 NAND

發現自己還真是三星閃存的…據說會有壞塊,而且在 Merlin 下會不停地擴大,可以說是很頹唐了…不過也有 Workaround,就是用一個隨身碟替代 jffs。某個版本的 Merlin 提供了一個 usbjffs 指令可以簡單完成這件事。只作爲 AP 的話,也可以學習淺羽不使用 jffs。不過想了想,如果涼了,大概還可以找 JD?不過設定好 usbjffs 後,即使是 Samsung 閃存的 K3 也是一樣可以使用熒幕的部分功能的,實測第一屏(版本信息)、第三屏(無線接入信息)、第四屏(天氣)、第五屏(SSID 與密碼)與第六屏(接入裝置詳細資料)的部分功能是可用的,最少也可以超時候關閉熒幕了。

Merlin 的小坑

有的時候 Web UI 會莫名爆炸。重啓 httpd 就可以了:

# serivce restart_httpd

另外,在刷 Merlin 之後要進入 CFE,操作也是相同的,但是路由器的地址在 Merlin 爲預設參數的情況下變爲了 192.168.50.1。如果此地址不能工作,那麼可以嘗試 Merlin 中設定的路由器地址,或者恢復 Merlin 的出廠設定。

最後,千萬不要嘗試在 Merlin 中直接更新韌體,哪怕是更新新版 Merlin 都不可以。必須使用 CFE + TFTP 方式。

據說原廠分區是這樣的:

0x000000000000-0x000000080000 : "boot" 512K
0x000000080000-0x000000180000 : "nvram" 1024
0x000000180000-0x000000280000 : "nvram_back" 1024
0x000000280000-0x0000002c0000 : "res_info" 256
0x0000002c0000-0x000000300000 : "1" 256
0x000000300000-0x000000320000 : "pro_info" 128
0x000000320000-0x000000380000 : "2" 384
0x000000380000-0x0000003a0000 : "dev_info" 128
0x0000003a0000-0x000000400000 : "3" 384
0x000000400000-0x000003000000 : "linux" 2C00000 44M
0x00000061e258-0x000003000000 : "rootfs"
0x000003000000-0x000008000000 : "brcmnand" 5000000 80M

而刷完 Merlin 之後,分區變成了 4 個,mtdblock3、4、5、7、8 都被「破壞」了:

dev:    size   erasesize  name
mtd0: 00080000 00020000 "boot"
mtd1: 00100000 00020000 "nvram"
mtd2: 00100000 00020000 "nvram_back" # 全空
mtd3: 00040000 00020000 "res_info"
mtd4: 00020000 00020000 "pro_info"
mtd5: 00020000 00020000 "dev_info"
mtd6: 02c00000 00020000 "linux"
mtd7: 029e1f7c 00020000 "rootfs"
mtd8: 05000000 00020000 "brcmnand" # 全空

具體的待考證…

關於使用感想

這孩子的信號還是不錯的。只是刷完 Merlin 之後,還沒有仔細設定,導致原本配合 Linksys WRT1900AC v1 能夠工作在 1167Mbps 的某水果,現在回到了 867Mbps。另外,自身體積在那,發熱也不算嚴重。耗電量沒有測試,據說正常在 5W~15W 之間波動,我只想說之前裝的迷你伺服器在跑 3 個 VM 的情況下大約 17W…

最後,這孩子真的太大了…幸好設計的造型是直立放置的,否則這個櫃子其實本身都沒辦法讓 WRT1900AC 正面朝外橫向擺放,K3 更是放不下了。

同場加映:關於熒幕

目前的情況看,熒幕並不是由 BCM 的 SoC 直接控制的,而是通過 SPI 連接,由單獨的一片 PIC32MZ1024ECG100 去控制。官方韌體中,有 uhmiuhmiMsg 兩個可執行檔去管理熒幕,其中前者用於對熒幕的韌體進行操作或者 Debug,後者用於與熒幕通訊,傳送需要顯示的資料。比如可以查看通訊資料以調試:

# uhmi -d 0xffffffff -D both

也可以手工地設定成某一個熒幕狀態,比如設定成重啓中:

# uhmiMsg reboot

猜測邏輯是,上電之後 PIC32 開始顯示開機動畫,同時監聽 SPI;一旦系統初始化完成並初始化 SPI 發送數據後(uhmiMsg runapp),PIC32 停止顯示開機動畫,並且開始顯示 SPI 數據指定的介面。另外根據 @updateing,

0. MCU 和路由器通过串口和 GPIO 连接。MCU 的 ROM 中应该有一个写死的 bootloader,每次更新只更新 app 部分,这样就不需要用 PIC 的 SPI 去更新了,直接用自己的协议通过串口更新就好。MCU 也不会重启掉固件。
1. 不改 MCU 程序的情况下屏幕内容的大体框架不能修改,只能填字。
2. SoC 有三个串口,ChipCommon A 有两个,ChipCommon B 有一个,其中 ChipCommon A 的第一个串口是控制台 / TTL,第二个接了屏幕。ChipCommon B 上好像没接东西。
3. 据我所知,现在除 K3 官方内核以外没有哪个内核正确初始化了所需要的串口,所以直接写数据十有八九是没反应的。并且就类似机型开源的代码来看,通常是在内核里在做这方面的初始化,从 userspace 并不容易做。

所以暫時來看,還是直接透過 uhmiMsg 提供資料給 PIC32 顯示比較現實。


This site uses Akismet to reduce spam. Learn how your comment data is processed.