器實(shí)戰(zhàn))
1. 從一塊閑置盒子說(shuō)起S905M2-B為什么值得折騰手頭攢了好幾個(gè)運(yùn)營(yíng)商退下來(lái)的電視盒子拆開(kāi)一看主控清一色印著Amlogic的標(biāo)型號(hào)五花八門(mén)——S905L、S905L3、S905M2-B后綴差一個(gè)字母命運(yùn)就完全不同。有人把這類(lèi)盒子當(dāng)電子垃圾論斤賣(mài)也有人專(zhuān)門(mén)盯著S905M2-B這個(gè)型號(hào)收原因很簡(jiǎn)單它在Armbian社區(qū)里的適配成熟度比同代不少兄弟型號(hào)要友好得多。先把概念理清楚。晶晨AmlogicS905M2-B屬于S905家族里的一個(gè)細(xì)分型號(hào)四核Cortex-A53架構(gòu)主頻通常在1.5GHz上下集成Mali-450級(jí)別的GPU定位是入門(mén)級(jí)4K解碼SoC。它大量出現(xiàn)在2016到2018年之間的運(yùn)營(yíng)商定制盒子里比如某些省市的IPTV終端。這類(lèi)芯片本身是給Android定制的官方從不提供Linux主線支持所以想讓它跑Armbian本質(zhì)上是一場(chǎng)硬件層面的逆向適配——社區(qū)開(kāi)發(fā)者靠逆向、靠試錯(cuò)、靠一堆補(bǔ)丁硬生生把主線內(nèi)核和uboot移植上去。那為什么偏偏是S905M2-B被盯上我自己的觀察是三個(gè)因素疊加一是存量巨大運(yùn)營(yíng)商集采的盒子保有量高二手市場(chǎng)幾十塊就能收到二是硬件規(guī)格相對(duì)規(guī)整DDR3內(nèi)存、eMMC存儲(chǔ)、千兆或百兆網(wǎng)口、USB2.0沒(méi)有太多奇奇怪怪的定制外設(shè)降低了適配難度三是社區(qū)有人啃過(guò)Armbian論壇和GitHub上有針對(duì)性的dtb文件和uboot分支后來(lái)者能站在前人的肩膀上。這篇文章適合誰(shuí)看如果你手里正好有一臺(tái)S905M2-B的盒子想把它改造成低功耗的Linux小服務(wù)器——跑個(gè)下載機(jī)、做個(gè)輕量NAS、掛個(gè)內(nèi)網(wǎng)服務(wù)——那這篇內(nèi)容能幫你少走彎路。如果你只是對(duì)芯片適配這件事本身好奇想知道一個(gè)封閉的Android SoC是怎么被撬開(kāi)跑Linux的那也能從里面看到硬件破解的完整思路。我不打算寫(xiě)成一份冷冰冰的刷機(jī)說(shuō)明書(shū)而是把為什么這么做、坑在哪里、怎么判斷自己有沒(méi)有走錯(cuò)路講透。需要提前說(shuō)明的是S905M2-B的適配資料散落在各個(gè)論壇帖、GitHub issue和零散的commit里沒(méi)有一份官方權(quán)威文檔。下面所有內(nèi)容一部分來(lái)自我自己反復(fù)刷機(jī)踩出來(lái)的經(jīng)驗(yàn)一部分是基于社區(qū)常見(jiàn)實(shí)踐的合理歸納。具體到某一臺(tái)盒子硬件版本、內(nèi)存顆粒、eMMC型號(hào)都可能不同務(wù)必以實(shí)測(cè)為準(zhǔn)。2. 拆開(kāi)看門(mén)道S905M2-B的硬件底子與適配難點(diǎn)2.1 這顆SoC到底給了什么資源要理解適配的難度得先知道S905M2-B手里有什么牌。它基于ARM Cortex-A53四核屬于ARMv8-A架構(gòu)支持64位指令集但很多盒子的Android固件是32位的這給后來(lái)跑64位Armbian埋了個(gè)伏筆。GPU是Mali-450 MP主頻不高跑桌面環(huán)境會(huì)卡但做無(wú)頭服務(wù)器完全夠用。內(nèi)存控制器支持DDR3/DDR3L/LPDDR3實(shí)際盒子上常見(jiàn)1GB或2GB DDR3頻率多在912MHz到1066MHz之間。存儲(chǔ)方面盒子通常配8GB eMMC走的是eMMC 5.0接口速度一般但比SD卡穩(wěn)。網(wǎng)絡(luò)部分差異最大有的盒子是百兆網(wǎng)口RTL8201或類(lèi)似PHY有的是千兆R(shí)TL8211還有的干脆只有WiFi沒(méi)有網(wǎng)口。這一點(diǎn)直接決定了你刷完Armbian后網(wǎng)絡(luò)能不能用因?yàn)椴煌琍HY芯片需要不同的dtb配置。USB方面一般是兩個(gè)USB2.0口其中一個(gè)可能是OTG口這個(gè)OTG口在刷機(jī)階段極其關(guān)鍵——它是進(jìn)入U(xiǎn)SB Burning模式的入口。視頻輸出是HDMI 2.0支持4K解碼但Linux下驅(qū)動(dòng)支持有限別指望跑圖形界面流暢。2.2 適配難在哪三個(gè)繞不開(kāi)的坎第一個(gè)坎是uboot。晶晨的SoC用的是自家定制的ubootAndroid固件里的uboot是閉源的不提供Linux啟動(dòng)所需的完整環(huán)境。社區(qū)的做法是替換成開(kāi)源的uboot分支比如基于mainline uboot的amlogic分支但這個(gè)uboot需要針對(duì)具體板子的DDR時(shí)序、eMMC參數(shù)做適配。DDR時(shí)序配錯(cuò)了板子直接起不來(lái)表現(xiàn)為上電無(wú)輸出或者卡在串口某一行。第二個(gè)坎是dtb設(shè)備樹(shù)。Linux內(nèi)核靠設(shè)備樹(shù)來(lái)識(shí)別硬件S905M2-B沒(méi)有官方dtb社區(qū)里能用的dtb往往是從相近型號(hào)比如S905X、S905W改過(guò)來(lái)的。改dtb的核心工作是把CPU頻率、內(nèi)存大小、eMMC節(jié)點(diǎn)、網(wǎng)口PHY、USB控制器、GPIO定義這些參數(shù)對(duì)齊到實(shí)際硬件。網(wǎng)口PHY型號(hào)對(duì)不上網(wǎng)口就不通eMMC節(jié)點(diǎn)寫(xiě)錯(cuò)系統(tǒng)就找不到存儲(chǔ)。第三個(gè)坎是啟動(dòng)鏈。Android盒子的啟動(dòng)流程是BootROM → 預(yù)loader → uboot → kernel → Android。刷Armbian要替換掉中間好幾環(huán)同時(shí)保留BootROM能識(shí)別的引導(dǎo)頭。晶晨的BootROM只認(rèn)特定格式的引導(dǎo)鏡像帶Amlogic簽名的BL2/BL3所以刷機(jī)工具比如USB Burning Tool和鏡像打包方式都有講究。2.3 為什么說(shuō)這是硬件破解而不是軟件安裝很多人第一次接觸會(huì)覺(jué)得不就是刷個(gè)系統(tǒng)嗎跟手機(jī)刷機(jī)有什么區(qū)別區(qū)別大了。手機(jī)刷機(jī)是在廠商提供的框架內(nèi)換系統(tǒng)bootloader、分區(qū)表、驅(qū)動(dòng)都是現(xiàn)成的。而S905M2-B跑Armbian是在一個(gè)從沒(méi)打算讓你跑Linux的封閉平臺(tái)上從零搭建啟動(dòng)環(huán)境。你得自己解決uboot、自己配dtb、自己處理分區(qū)甚至要飛線接串口看啟動(dòng)日志。這個(gè)過(guò)程更接近嵌入式開(kāi)發(fā)的板級(jí)移植而不是普通用戶理解的刷機(jī)。我個(gè)人的經(jīng)驗(yàn)是串口是必備的。沒(méi)有串口你只能靠HDMI輸出和網(wǎng)口燈來(lái)判斷啟動(dòng)狀態(tài)效率極低。接上UART通常是板子上的TX/RX/GND三個(gè)焊點(diǎn)波特率115200你能看到uboot的每一行輸出卡在哪一步一目了然。這個(gè)投入非常值得。3. 動(dòng)手前的準(zhǔn)備工具、鏡像與風(fēng)險(xiǎn)清單3.1 硬件工具別省刷S905M2-B工具準(zhǔn)備直接決定成功率。下面這張表是我實(shí)際用下來(lái)覺(jué)得必要的清單工具作用備注USB雙公頭線連接盒子OTG口與電腦進(jìn)入刷機(jī)模式質(zhì)量差的線會(huì)導(dǎo)致刷機(jī)中斷UART轉(zhuǎn)USB模塊接串口看啟動(dòng)日志CH340或CP2102都行3.3V電平鑷子或短接線短接eMMC或特定焊點(diǎn)進(jìn)入刷機(jī)模式部分盒子需要短接才能進(jìn)USB Burning拆機(jī)工具打開(kāi)盒子外殼塑料撬棒十字螺絲刀備用電源盒子供電5V/2A供電不足會(huì)導(dǎo)致刷機(jī)失敗USB雙公頭線這個(gè)坑我踩過(guò)。第一次用了一根便宜線刷到一半電腦提示設(shè)備斷開(kāi)盒子變磚只能重新短接進(jìn)模式。后來(lái)?yè)Q了根帶屏蔽的粗線一次成功。刷機(jī)過(guò)程中供電和USB連接穩(wěn)定性比什么都重要。3.2 軟件與鏡像來(lái)源軟件側(cè)需要三樣?xùn)|西晶晨USB Burning ToolWindows下的刷機(jī)工具負(fù)責(zé)把鏡像寫(xiě)進(jìn)eMMC、Armbian鏡像針對(duì)amlogic的社區(qū)構(gòu)建版本、dtb和uboot文件通常打包在鏡像里或單獨(dú)提供。Armbian鏡像建議從Armbian官方或社區(qū)維護(hù)的amlogic分支獲取注意區(qū)分meson-gxbb、meson-gxl、meson-gxm這些內(nèi)核平臺(tái)代號(hào)——S905M2-B屬于GXL平臺(tái)S905系列選錯(cuò)平臺(tái)鏡像直接不啟動(dòng)。鏡像一般提供.img格式可以直接被USB Burning Tool識(shí)別也有.img.xz壓縮版需要先解壓。dtb文件是重頭戲。社區(qū)里常見(jiàn)的做法是用meson-gxl-s905x-*.dtb作為基礎(chǔ)然后根據(jù)自己盒子的實(shí)際硬件改。如果你運(yùn)氣好能找到和你盒子型號(hào)完全一致的dtb那省事很多。找不到就得自己改改dtb需要dtc工具把dtb反編譯成dts改完再編譯回去。3.3 風(fēng)險(xiǎn)清單變磚了怎么辦必須說(shuō)清楚風(fēng)險(xiǎn)。刷S905M2-B有變磚的可能但晶晨的BootROM是只讀的理論上永遠(yuǎn)能通過(guò)短接進(jìn)入U(xiǎn)SB Burning模式救回來(lái)這是它比很多其他平臺(tái)友好的地方。真正救不回來(lái)的情況極少通常是硬件損壞比如短接時(shí)手抖燒了元件。常見(jiàn)風(fēng)險(xiǎn)和對(duì)策刷錯(cuò)鏡像導(dǎo)致不啟動(dòng)重新短接進(jìn)USB Burning模式刷回正確的鏡像或原廠固件。uboot刷壞同樣靠USB Burning模式重刷BootROM不依賴(lài)uboot。eMMC被寫(xiě)壞極端情況下需要短接eMMC的CLK和GND強(qiáng)制進(jìn)入模式或者用SD卡啟動(dòng)繞過(guò)eMMC。供電不足刷機(jī)中斷換電源重刷。提示動(dòng)手前先用USB Burning Tool把原廠固件完整備份一份如果工具支持讀取或者至少記下原廠固件版本方便回退。4. 刷機(jī)全流程從短接到第一次點(diǎn)亮4.1 進(jìn)入U(xiǎn)SB Burning模式的兩種姿勢(shì)晶晨盒子進(jìn)刷機(jī)模式有兩種常見(jiàn)方式。第一種是軟件觸發(fā)盒子正常開(kāi)機(jī)進(jìn)Android用ADB執(zhí)行reboot update命令盒子會(huì)重啟進(jìn)入刷機(jī)模式。這種方式最省事但前提是Android還能正常啟動(dòng)。第二種是硬件短接拆開(kāi)盒子找到eMMC芯片或者板子上標(biāo)注的短接點(diǎn)用鑷子短接的同時(shí)上電BootROM會(huì)檢測(cè)到強(qiáng)制進(jìn)入U(xiǎn)SB Burning模式。不同盒子的短接點(diǎn)位置不同有的在eMMC的特定引腳有的有專(zhuān)門(mén)的測(cè)試點(diǎn)。短接的時(shí)機(jī)很關(guān)鍵——先短接再插USB線最后上電順序錯(cuò)了進(jìn)不去。我自己的盒子是軟件觸發(fā)進(jìn)不去的Android已經(jīng)刷壞只能短接。第一次短接找不準(zhǔn)點(diǎn)試了七八次才成功。經(jīng)驗(yàn)是用萬(wàn)用表確認(rèn)短接點(diǎn)別瞎試短錯(cuò)引腳可能損壞芯片。4.2 USB Burning Tool的正確用法打開(kāi)USB Burning Tool導(dǎo)入Armbian鏡像.img文件工具會(huì)自動(dòng)解析分區(qū)。關(guān)鍵設(shè)置有幾個(gè)擦除flash勾選擦除所有還是擦除bootloader取決于你是否要保留原uboot。刷Armbian一般選擦除全部。擦除bootloader如果鏡像里自帶uboot勾選這個(gè)如果打算單獨(dú)刷uboot先不勾。覆蓋密鑰一般不需要勾。點(diǎn)開(kāi)始后工具會(huì)等待設(shè)備連接。此時(shí)給盒子上電已短接工具識(shí)別到設(shè)備后開(kāi)始寫(xiě)入。寫(xiě)入過(guò)程中絕對(duì)不能斷電或拔線進(jìn)度條走完提示燒錄成功才算完。刷完后拔掉USB線接HDMI和網(wǎng)線上電。如果一切正常盒子會(huì)從eMMC啟動(dòng)Armbian串口能看到內(nèi)核日志滾動(dòng)網(wǎng)口燈亮起路由器里能看到新設(shè)備。4.3 第一次啟動(dòng)后的必做配置Armbian首次啟動(dòng)會(huì)要求設(shè)置root密碼、創(chuàng)建用戶、選擇時(shí)區(qū)。這些跟著提示走就行。之后有幾件事必須做第一確認(rèn)網(wǎng)絡(luò)。ip a看網(wǎng)口有沒(méi)有拿到IP。如果網(wǎng)口不通多半是dtb里PHY配置不對(duì)需要換dtb或改dts。第二擴(kuò)展根分區(qū)。Armbian鏡像默認(rèn)分區(qū)可能沒(méi)占滿eMMC用armbian-resize-filesystem或resize2fs把根分區(qū)擴(kuò)到最大。第三更新系統(tǒng)。apt update apt upgrade把內(nèi)核和軟件包更新到最新。注意amlogic平臺(tái)的內(nèi)核更新有時(shí)會(huì)覆蓋dtb更新前備份/boot/dtb。第四裝溫度監(jiān)控。S905M2-B沒(méi)有主動(dòng)散熱長(zhǎng)時(shí)間跑負(fù)載會(huì)熱裝lm-sensors或者直接讀/sys/class/thermal/thermal_zone0/temp監(jiān)控溫度。我實(shí)測(cè)滿載能到70度以上建議加個(gè)小散熱片。5. 適配深水區(qū)dtb、uboot與網(wǎng)口的那些坑5.1 dtb改不對(duì)網(wǎng)口就是不通網(wǎng)口不通是S905M2-B刷Armbian后最常見(jiàn)的問(wèn)題。根因幾乎都在dtb的以太網(wǎng)節(jié)點(diǎn)。GXL平臺(tái)的以太網(wǎng)控制器是內(nèi)置的但外接PHY芯片型號(hào)各異。dtb里需要正確聲明PHY的地址、復(fù)位GPIO、時(shí)鐘。排查思路串口啟動(dòng)日志里搜eth0或ethernet看內(nèi)核有沒(méi)有識(shí)別到PHY。如果提示no PHY found或者PHY not ready基本就是dtb配置問(wèn)題。解決辦法是找到你盒子實(shí)際用的PHY型號(hào)看板子上的芯片絲印常見(jiàn)RTL8211、RTL8201然后在dts里改phy-mode和phy-handle。我遇到過(guò)一臺(tái)盒子dtb用的是千兆PHY配置但實(shí)際板子是百兆PHY結(jié)果網(wǎng)口死活不通。改成百兆配置后立刻正常。所以拆機(jī)看PHY絲印這一步不能省。5.2 uboot的DDR時(shí)序起不來(lái)的元兇如果刷完uboot后盒子完全沒(méi)反應(yīng)串口也沒(méi)輸出八成是DDR時(shí)序不對(duì)。DDR時(shí)序參數(shù)時(shí)序表、驅(qū)動(dòng)強(qiáng)度、ODT設(shè)置是板級(jí)相關(guān)的不同內(nèi)存顆粒需要不同參數(shù)。社區(qū)uboot一般內(nèi)置了幾套常見(jiàn)配置但你的盒子可能不在其中。解決路徑有兩條一是找到和你盒子內(nèi)存顆粒一致的uboot配置看內(nèi)存顆粒絲印比如三星、海力士、鎂光二是自己調(diào)時(shí)序參數(shù)。后者難度高需要參考顆粒的datasheet一般玩家不建議碰。更實(shí)際的做法是換一個(gè)已知能用的uboot版本或者用SD卡啟動(dòng)繞過(guò)eMMC里的uboot。5.3 從SD卡啟動(dòng)降低變磚風(fēng)險(xiǎn)的技巧一個(gè)很實(shí)用的技巧是先用SD卡跑Armbian確認(rèn)硬件都能驅(qū)動(dòng)起來(lái)再?zèng)Q定要不要刷進(jìn)eMMC。晶晨的BootROM支持從SD卡啟動(dòng)前提是uboot支持把Armbian鏡像寫(xiě)到SD卡插上盒子短接或按特定按鍵進(jìn)入SD啟動(dòng)模式。SD卡啟動(dòng)的好處是不碰eMMC刷壞了拔卡就行風(fēng)險(xiǎn)極低。確認(rèn)網(wǎng)口、USB、溫度都正常后再用armbian-install把系統(tǒng)裝進(jìn)eMMC。這個(gè)流程我強(qiáng)烈推薦給第一次折騰的人。6. 刷完之后這臺(tái)小機(jī)器能干什么6.1 低功耗內(nèi)網(wǎng)服務(wù)的幾個(gè)實(shí)用方向S905M2-B跑Armbian后功耗大概3到5瓦24小時(shí)開(kāi)機(jī)一年電費(fèi)可以忽略。適合干這些活輕量下載機(jī)裝transmission或aria2掛PT或者下大文件。內(nèi)網(wǎng)文件共享samba或nfs把USB口接個(gè)硬盤(pán)當(dāng)簡(jiǎn)易NAS。注意USB2.0速度有限別指望跑滿千兆。內(nèi)網(wǎng)穿透輔助節(jié)點(diǎn)裝zerotier或tailscale把內(nèi)網(wǎng)服務(wù)暴露到自己的虛擬局域網(wǎng)里方便遠(yuǎn)程訪問(wèn)。這類(lèi)工具在ARM64上都有現(xiàn)成包。DNS和廣告過(guò)濾adguardhome或pihole給全家網(wǎng)絡(luò)做DNS過(guò)濾。輕量容器宿主裝docker跑幾個(gè)小容器比如nginx、watchtower。內(nèi)存1GB的話別跑太多。6.2 性能邊界在哪別對(duì)它期望過(guò)高得實(shí)話實(shí)說(shuō)S905M2-B的性能天花板不高。四核A53在ARM64里屬于入門(mén)水平單核性能大概相當(dāng)于樹(shù)莓派3的水平。跑無(wú)頭服務(wù)沒(méi)問(wèn)題跑桌面環(huán)境會(huì)卡。USB2.0接口限制了外接存儲(chǔ)速度eMMC寫(xiě)入速度也就幾十MB/s。把它定位成低功耗常駐小服務(wù)器是合理的想當(dāng)主力NAS或者跑重負(fù)載服務(wù)不現(xiàn)實(shí)。溫度也是限制因素。沒(méi)有風(fēng)扇的情況下持續(xù)滿載編譯或者轉(zhuǎn)碼溫度會(huì)飆到80度以上觸發(fā)降頻。加個(gè)散熱片或者小風(fēng)扇能明顯改善。6.3 系統(tǒng)維護(hù)的幾個(gè)習(xí)慣跑Armbian的盒子建議養(yǎng)成幾個(gè)習(xí)慣定期apt upgrade但升級(jí)前備份/boot用armbian-config管理網(wǎng)絡(luò)和時(shí)區(qū)開(kāi)ssh密鑰登錄關(guān)掉密碼登錄裝log2ram減少eMMC寫(xiě)入延長(zhǎng)壽命。eMMC的寫(xiě)入壽命有限頻繁寫(xiě)日志會(huì)加速磨損log2ram把日志放內(nèi)存里定期同步能明顯延長(zhǎng)eMMC壽命。7. 一些踩坑之后的個(gè)人體會(huì)折騰S905M2-B這段時(shí)間最大的感受是這類(lèi)適配工作的成敗八成取決于前期信息收集兩成才是動(dòng)手。找到對(duì)的dtb、對(duì)的uboot、對(duì)的鏡像刷機(jī)就是十分鐘的事找不到可能折騰一星期還在原地打轉(zhuǎn)。所以我的建議是動(dòng)手前先花時(shí)間在社區(qū)里搜你的盒子型號(hào)看有沒(méi)有人成功過(guò)用的什么dtb、什么uboot版本直接抄作業(yè)比自己摸索快得多。另一個(gè)體會(huì)是串口真的不能省。我一開(kāi)始圖省事不接串口靠HDMI和網(wǎng)口燈判斷結(jié)果盒子不啟動(dòng)完全不知道卡在哪。接了串口之后uboot輸出、內(nèi)核日志一目了然排查效率提升十倍不止。幾十塊錢(qián)的UART模塊是這類(lèi)折騰里性?xún)r(jià)比最高的投入。還有一點(diǎn)別怕變磚。晶晨的BootROM機(jī)制決定了它很難真正刷死短接進(jìn)USB Burning模式基本都能救回來(lái)。心態(tài)放平多試幾次大部分問(wèn)題都能解決。真正需要謹(jǐn)慎的是短接操作本身別短錯(cuò)引腳燒硬件。最后說(shuō)個(gè)細(xì)節(jié)不同批次的S905M2-B盒子哪怕型號(hào)一樣內(nèi)部硬件也可能有差異。別人能用的dtb你未必能用。遇到問(wèn)題先懷疑硬件差異再懷疑操作。這個(gè)思路能幫你少走很多冤枉路。