:RMII時鐘方向與DTS配置實戰(zhàn)排查)
講真調(diào)了這么多年網(wǎng)口這次RK3566配YT8512C還是讓我折騰了整整一個周末。板子是自己畫的底板核心板用的RK3566PHY選了裕太微的YT8512C想著百兆嘛RMII一接DTS一配半小時就能搞定。結(jié)果通電那一刻ifconfig -a 里只有 lodmesg 里連PHY的影子都看不到。這種“看起來簡單、實際上到處是坑”的事情放在嵌入式Linux開發(fā)里真是再常見不過了。這篇文章就把這個完整過程記錄下來從硬件連接到RMII接口設(shè)計從DTS配置到時鐘方向選擇從PHY ID讀取到驅(qū)動匹配最后到網(wǎng)絡(luò)性能驗證。每講一個關(guān)鍵點我都會說明“我當(dāng)時是怎么排查的”“為什么這一步這么設(shè)計”“哪些坑是數(shù)據(jù)手冊里不會明寫但實際一定會踩的”。不管你是剛接觸RK3566的新手還是被國產(chǎn)PHY芯片折騰到頭大的老工程師這篇文章應(yīng)該都能給你一些參考。1. 選型與硬件設(shè)計為什么是YT8512CRMII接口有哪些容易忽略的信號約束1.1 在一堆PHY里挑中YT8512C的理由說實話做產(chǎn)品的選型和做開發(fā)板的選型邏輯差別挺大的。如果是學(xué)習(xí)或者快速驗證很多人會直接上RTL8211F、AR8035這類資料多、用的人多的芯片。但我這塊板子是要走量、有成本壓力的方案所以當(dāng)時對PHY的要求比較明確只要百兆、價格要低、供貨要穩(wěn)、最好國產(chǎn)。YT8512C就是在這個背景下被選中的。它是裕太微電子的一款10/100M自適應(yīng)以太網(wǎng)PHY芯片支持RMII接口內(nèi)部集成LDO外圍電路簡單功耗也不高在成本敏感的物聯(lián)網(wǎng)網(wǎng)關(guān)、工業(yè)控制板、邊緣計算盒子上用得非常多。和千兆PHY相比它在百兆場景下性價比確實高而且國內(nèi)貨源穩(wěn)定。不過選型歸選型真正讓項目卡殼的是后面的調(diào)試。YT8512C的資料開放程度、參考設(shè)計的完善程度和Broadcom、Realtek這些老牌廠商比還是有差距的。很多細節(jié)藏在datasheet的字里行間不親自踩一遍很難發(fā)現(xiàn)。1.2 RMII接口的信號構(gòu)成比RGMII少一半線但坑并沒有少RMIIReduced Media Independent Interface是專為10/100M以太網(wǎng)設(shè)計的簡化接口它把數(shù)據(jù)線從RGMII的12根縮減到了7根。我先把RK3566 GMAC和YT8512C之間的RMII信號列一下方便后面講問題信號方向MAC視角功能說明TXD[1:0]輸出發(fā)送數(shù)據(jù)TX_EN輸出發(fā)送使能RXD[1:0]輸入接收數(shù)據(jù)CRS_DV輸入載波偵聽/數(shù)據(jù)有效REF_CLK輸入/輸出50MHz參考時鐘MDC輸出管理接口時鐘MDIO雙向管理接口數(shù)據(jù)數(shù)據(jù)線從RGMII的8根減到4根但時鐘方案反而更講究。RGMII的125MHz TX_CLK/RX_CLK是由PHY提供的方向很明確而RMII的REF_CLK必須由某一方主動提供50MHz——要么MAC給PHY要么PHY給MAC兩邊都覺得自己應(yīng)該是輸出方的時候板子就徹底沉默了。這個時鐘方向問題就是后面最大的坑。1.3 原理圖階段必須確定的三個點晶振、復(fù)位、LED原理圖設(shè)計階段有幾個點如果沒提前確認后面調(diào)試就是給自己挖坑。第一是晶振或者時鐘輸入。YT8512C可以用25MHz晶振也可以由外部直接輸入50MHz參考時鐘。RMII規(guī)范要求MAC和PHY共用同一個50MHz參考源最省事的做法是給PHY配一個25MHz晶振讓PHY內(nèi)部PLL倍頻到50MHz再把50MHz時鐘輸出給MAC的REF_CLK。這樣整個系統(tǒng)只有一個晶振源相位一致性好也不容易出EMI問題。第二是復(fù)位電路。PHY的復(fù)位腳建議用GPIO控制不要直接接RC上電復(fù)位。原因有兩個一是MAC和PHY的上電時序未必一致如果MAC已經(jīng)初始化完了PHY才剛復(fù)位完MDIO通信就會失敗二是調(diào)試期間你會發(fā)現(xiàn)需要軟復(fù)位PHY的場景非常多用GPIO控制復(fù)位腳一條命令就能搞定不用反復(fù)斷電。我在DTS里配置的就是RK3566的一個普通GPIO來做復(fù)位控制。第三是LED指示燈。YT8512C的LED引腳能反映link狀態(tài)和活動狀態(tài)畫板時一定要預(yù)留出來哪怕不接燈也要引測試點。很多時候網(wǎng)口“沒通”其實只是鏈路沒協(xié)商上看一眼PHY的LED狀態(tài)就能判斷是硬件問題還是軟件問題能省下大量抓日志的時間。2. 上電即失敗日志、波形與MDIO的第一輪排查2.1 第一現(xiàn)場dmesg里根本看不到PHY板子第一次上電我用串口調(diào)試助手打開內(nèi)核日志啟動完成后執(zhí)行 ifconfig -a結(jié)果是只有 lo連 eth0 都沒有。再查 dmesg關(guān)于 GMAC 的日志只有一條rockchip-gmac fe010000.ethernet: no phy found當(dāng)時我就知道問題不簡單。這個日志的意思是MDIO總線上沒讀到PHY。但到底是PHY沒上電、MDIO通信有問題、PHY地址不對、還是PHY本身就沒有正常復(fù)位日志里完全看不出來。皮層之下還有很多可能性必須一層一層剝開。2.2 先量時鐘50MHz到底有沒有排查網(wǎng)絡(luò)問題我習(xí)慣遵循信號鏈路順序先電源再時鐘再復(fù)位再MDIO最后才看數(shù)據(jù)線。這個習(xí)慣救了我很多次因為很多“軟件問題”最后都證明是硬件信號沒到位。示波器先測YT8512C的XI引腳能看到25MHz晶振波形說明PHY的時鐘源工作正常。接著測PHY輸出的50MHz REF_CLK這里出了問題——完全沒有波形。也就是說PHY要么沒有完成初始化要么復(fù)位一直被拉低要么PHY芯片根本沒正常工作。順著這個思路又測了復(fù)位腳的電壓發(fā)現(xiàn)復(fù)位腳確實是高電平不是被拉低的狀態(tài)。電源方面1.1V數(shù)字核心電壓、2.5V模擬電壓、3.3V IO電壓都在規(guī)格書范圍內(nèi)。那問題就變得奇怪了有電源、時鐘正常、復(fù)位正常為什么PHY沒有輸出50MHz2.3 換一塊板子試出來的重大發(fā)現(xiàn)我在實驗室又拿了兩塊一樣的底板測試結(jié)果第一塊能正常出50MHz時鐘第二塊不行。這就排除了芯片本身的問題指向了焊接或者物料問題。用放大鏡檢查YT8512C的引腳發(fā)現(xiàn)其中一個引腳有輕微的空焊——典型的手工回流焊溫度曲線沒控制好導(dǎo)致的虛焊。補焊之后50MHz時鐘立即出來了。所以第一個教訓(xùn)是國產(chǎn)PHY芯片引腳間距通常比較密手工焊接后最好用萬用表蜂鳴檔把每個電源、地、時鐘引腳都通斷量一遍。很多所謂“PHY怎么調(diào)都不通”的情況最后查出來都是焊接問題。2.4 MDIO總線手動探測讀不到ID就先別談DTS時鐘正常之后再次上電dmesg里依然報 no phy found。但這次我心里的預(yù)期變了問題可能出在DTS配置或者MDIO總線的地址匹配上。在繼續(xù)改DTS之前先用mdio-tools這個工具手動掃描總線上到底有沒有PHY響應(yīng)。在RK3566上如果系統(tǒng)里沒有現(xiàn)成的mdio-netlink工具可以交叉編譯一個mdio-tools扔到板子里跑。mdio scan如果掃描結(jié)果為空說明內(nèi)核MDIO總線上根本沒發(fā)現(xiàn)設(shè)備。這時候再用示波器抓MDC和MDIO兩個引腳的波形看內(nèi)核有沒有發(fā)MDIO讀命令、PHY有沒有回應(yīng)。我當(dāng)時抓到的現(xiàn)象是MDC波形正常MDIO在寫地址階段正常但讀數(shù)據(jù)階段整條線一直為高——PHY沒有應(yīng)答。這時候才把目光回到DTS上。因為RK3566的MDIO是復(fù)用引腳如果引腳的復(fù)用功能沒有配置對GPIO被其他外設(shè)占用了MDIO命令就發(fā)不出去或者PHY收到但回應(yīng)回不來。改到這一步才真正進入DTS配置的核心戰(zhàn)場。3. DTS從零改到通RMII模式、時鐘方向與引腳復(fù)用的完整配置3.1 能直接用的完整DTS配置先放出來后面經(jīng)過反復(fù)修改這個配置在我這塊板子上是穩(wěn)定工作的。不同SDK版本的字段名可能略有差異但整體邏輯一致可以直接參考gmac { status okay; phy-mode rmii; clock_in_out output; snps,reset-gpio gpio3 RK_PB5 GPIO_ACTIVE_LOW; snps,reset-active-low; snps,reset-delays-us 0 10000 80000; assigned-clocks cru CLK_MAC_2PHY, cru CLK_MAC_PHY_2MAC; assigned-clock-parents cru CLK_MAC_2PHY_SEL, cru CLK_MAC_PHY_2MAC_SEL; assigned-clock-rates 50000000, 50000000; pinctrl-names default; pinctrl-0 rmiim0_pins; phy-handle phy0; }; mdio { status okay; phy0: ethernet-phy0 { reg 0; clocks cru CLK_REF_MAC_PHY; reset-gpios gpio3 RK_PB5 GPIO_ACTIVE_LOW; reset-assert-us 10000; reset-deassert-us 80000; }; };先別急著照抄這里每一個字段背后都有說道尤其是 clock_in_out、pinctrl-0 和 reset-gpios 這三個地方。下面的內(nèi)容才是這篇文章真正值錢的部分。3.2 phy-mode rmii為什么不能寫成rgmiiRK3566的GMAC控制器本身同時支持RGMII和RMII模式默認的設(shè)備樹模板里通常寫的是 rgmii。如果你只改了phy-mode忘了改其他依賴字段后面會遇到速率上不去、協(xié)商失敗這類問題。百兆網(wǎng)卡在RMII模式下TXD/RXD各只有2根線2bit在一個時鐘周期內(nèi)傳輸50MHz時鐘剛好能跑到100Mbps50M x 2bit 100Mbps。而RGMII是4bit DDR傳輸頻率是125MHz跑千兆的。如果DTS里phy-mode還是rgmii而PHY實際工作在RMII模式時鐘和數(shù)據(jù)寬度的匹配就全亂了。所以第一步確認PHY硬件接法按硬件原理圖決定phy-mode。YT8512C是百兆PHY硬件上只支持RMII或者MII不可能支持RGMII。這里必須寫rgmii還是rmii完全取決于你的原理圖我這塊板子接的是RMII所以配置為 rmii。3.3 clock_in_out 與 assigned-clock-rates方向錯了時鐘就沒了這是我這次調(diào)試踩得最深的一個坑單獨拿出來講。RK3566的GMAC有一組時鐘樹關(guān)鍵節(jié)點有兩個CLK_MAC_2PHY 和 CLK_MAC_PHY_2MAC。字面意思很好理解一個是MAC發(fā)給PHY的時鐘一個是PHY發(fā)給MAC的時鐘。RMII模式下只有一方會真正使用這50MHz。clock_in_out 這個字段決定了GMAC控制器的工作方向clock_in_out inputMAC作為從模式REF_CLK由外部PHY提供PHY方向為主。clock_in_out outputMAC作為主模式REF_CLK由MAC內(nèi)部產(chǎn)生并輸出給PHYPHY方向為從。我原理圖上設(shè)計的是YT8512C用25MHz晶振內(nèi)部PLL倍頻出50MHz然后通過REF_CLK引腳輸出給RK3566的GMAC。也就是說PHY是時鐘主、MAC是時鐘從DTS里應(yīng)該配 clock_in_out input。結(jié)果我最初配的是 output等于讓MAC也輸出時鐘PHY也輸出時鐘兩個輸出源互相懟REF_CLK線上根本不是穩(wěn)定的50MHz方波PHY自然起不來。正確配置下的時鐘關(guān)系是這樣的25MHz晶振 --- YT8512C PLL --- 50MHz REF_CLK --- RK3566 GMAC反過來如果你的硬件設(shè)計是用RK3566的REF_CLK_OUT引腳輸出50MHz給PHY那就要配 output。這個方向必須和原理圖嚴格對應(yīng)沒有任何“兩頭都行”的余地。為了保證時鐘頻率準(zhǔn)確assigned-clock-rates 里兩個值我都寫了 5000000050MHzassigned-clock-parents 選了對應(yīng)的時鐘源。某些SDK里如果你用了組播時鐘源甚至需要查一下當(dāng)前PLL的輸出頻率是不是剛好能被50MHz整除不然會出現(xiàn)時鐘頻率漂移網(wǎng)絡(luò)時通時不通。3.4 pinctrl-0 rmiim0_pins引腳復(fù)用選哪個mux要看原理圖RK3566的GMAC引腳有多組復(fù)用選項比如 rmiim0_pins、rmiim1_pins區(qū)別在于TXD、RXD、TX_EN、CRS_DV這些信號被分配到哪一組物理引腳上。這塊最忌諱的就是想當(dāng)然。我在第一版DTS里用的是 rmiim1_pins因為芯片參考設(shè)計里好像用的是m1組但實際我原理圖里把RMII信號接到了m0組對應(yīng)的引腳結(jié)果MDIO能通、數(shù)據(jù)線完全不對link根本建不起來。正確做法是在拿到原理圖后對照RK3566的datasheet里的引腳復(fù)用表把你實際用到的TXD0、TXD1、RXD0、RXD1、TX_EN、CRS_DV、MDC、MDIO、REF_CLK這些信號對應(yīng)的mux組找出來再去SDK的dtsi里確認這個組對應(yīng)的 pinctrl 節(jié)點是怎么命名的。改完之后強烈建議查看一下實際生效的引腳復(fù)用cat /sys/kernel/debug/pinctrl/pinctrl-handles或者讀一下pinmux寄存器確認你配置的引腳組和原理圖是匹配的。這一步如果錯了前面配置再對也沒用。3.5 reset-gpios 和 reset-assert-us/release-us時序是解決問題的關(guān)鍵RESET引腳如果只在PHY上電時靠RC電路復(fù)位可能存在一種情況MAC驅(qū)動初始化先于PHY復(fù)位完成導(dǎo)致MDIO掃描時PHY還沒準(zhǔn)備好后續(xù)驅(qū)動重試機制不強的話就永遠處于 no phy found 狀態(tài)。RK3566的GMAC驅(qū)動支持 DTS 里的 reset-gpios 和對應(yīng)的延時參數(shù)reset-assert-us復(fù)位信號拉低持續(xù)時間reset-deassert-us復(fù)位釋放后等待PHY ready的時間我配置的復(fù)位低電平保持10msreset-assert-us 10000釋放后等待80msreset-deassert-us 80000。這個80ms是給YT8512C完成內(nèi)部校準(zhǔn)、鎖相環(huán)穩(wěn)定的時間。第一次調(diào)試的時候我給的值太小只有10ms結(jié)果PHY的PLL還沒鎖住MDIO掃描照樣失敗。后來加長到80ms就穩(wěn)定了。這里有個小經(jīng)驗PHY的復(fù)位釋放等待時間寧長勿短。很多PHY芯片的上電初始化時間都在50ms以上尤其是帶內(nèi)部PLL的RMII芯片。如果系統(tǒng)啟動時PHY還沒ready有些驅(qū)動會反復(fù)重試但有的不會。自己加一個長延時是成本最低的解法。3.6 mdio子節(jié)點里的PHY地址reg為什么要從0開始YT8512C的PHY地址由硬件引腳決定常見的是把PHYAD[2:0]或者PHYAD[4:0]拉高或拉低來配置。我板子上把所有PHY地址引腳都接地了地址就是0。所以在mdio子節(jié)點里寫的是 reg 0。如果這里寫的地址和硬件不匹配MDIO總線自然找不到PHY。判斷方法很簡單用mdio-tools掃描總線看看哪個地址有回應(yīng)mdio scan掃描結(jié)果會列出所有能通信的PHY地址。把掃描到的地址填進reg再把對應(yīng)的PHY節(jié)點加上去驅(qū)動就能識別到了。3.7 compatible字段要不要寫怎么寫在PHY子節(jié)點里經(jīng)常能看到類似這樣的寫法compatible ethernet-phy-id0044.1792, ethernet-phy-ieee802.15-c22;這個寫法是把讀取到的PHY ID直接用compatible指定給驅(qū)動。但YT8512C大多數(shù)情況下不需要特意指定compatibleLinux的phylib會通過MDIO讀取PHY ID然后自動匹配通用的Generic PHY驅(qū)動。那什么時候需要指定呢當(dāng)你需要調(diào)用芯片專用驅(qū)動的特定功能時比如某些廠商PHY的省電模式、EEE、特定寄存器初始化Generic驅(qū)動不會做這些事。如果你只是要一個能跑通的百兆網(wǎng)口通用驅(qū)動就夠了。我實際調(diào)試中先用mdio read命令把PHY ID讀出來mdio read 0 2 mdio read 0 3能讀到非全F、非全0的ID值說明MDIO通信正常剩下的交給phylib自動匹配。如果讀出來是0xffffffff說明PHY地址不對或者PHY根本沒起來如果讀出來是0x00000000說明PHY處于復(fù)位狀態(tài)或者電源沒到位。這一步能非??焖俚貐^(qū)分硬件問題和配置問題。4. 驅(qū)動匹配、自協(xié)商與網(wǎng)絡(luò)性能驗證4.1 從no phy found到eth0出現(xiàn)哪些日志說明驅(qū)動已經(jīng)正常工作DTS改對之后再次開機dmesg里不再是 no phy found而是類似這樣的日志rk_gmac-dwmac fe010000.ethernet: 100Mbps, full duplex, link up同時 ifconfig -a 里也出現(xiàn)了 eth0。這說明從PHY硬件、MDIO管理通道到GMAC控制器已經(jīng)全部打通了。這個時候先別急著高興網(wǎng)口能link上只是第一步。我還遇到過link正常、但是ping不通的情況那問題就出在數(shù)據(jù)通路或者DMA配置上。先測一下驅(qū)動有沒有報錯dmesg | grep -i gmac\|eth0\|phy重點看有沒有DMA相關(guān)的錯誤、描述符錯誤。RK3566的GMAC在DTS里還涉及dma-coherent、tx-fifo-depth這些參數(shù)一般SDK默認配置是沒問題的但如果自己改過內(nèi)存或DMA配置就要小心。4.2 自協(xié)商過程百兆全雙工到底協(xié)商上沒YT8512C上電后默認開啟自協(xié)商與對端交換機/router協(xié)商速率和雙工模式。確認當(dāng)前協(xié)商結(jié)果ethtool eth0輸出里會包含 Speed: 100Mb/s 和 Duplex: Full。如果顯示 10Mb/s 或者 Half即使link是up的實際網(wǎng)絡(luò)性能也會非常差。當(dāng)時我遇到過一次協(xié)商成10M Half的情況原因是網(wǎng)線用了劣質(zhì)線RMII信號質(zhì)量差導(dǎo)致協(xié)商降級。換了一根好的網(wǎng)線立即恢復(fù)到100M Full。所以如果遇到協(xié)商速率不對先換線、換對端設(shè)備不要急著懷疑DTS。如果對端設(shè)備固定了速率和雙工也可以在PHY節(jié)點里配置fixed-link { speed 100; full-duplex; };但一般情況下不建議用fixed-link因為會失去自協(xié)商的靈活性。只有在對端設(shè)備不支持自協(xié)商或者做工業(yè)設(shè)備互聯(lián)時才會用到。4.3 用iperf3驗證真實吞吐量百兆跑滿該是多少很多人在這一步喜歡用ping大包來判斷“網(wǎng)口通沒通”但我的建議是ping通了之后再用iperf3測一下實際吞吐因為ping小包只是確認通路存在吞吐率才是性能真實指標(biāo)。在RK3566板子上跑iperf3服務(wù)端PC上跑客戶端iperf3 -s # 板子側(cè) iperf3 -c 192.168.1.100 -t 30 # PC側(cè)百兆網(wǎng)口的理論極限大約是94-95Mbps因為以太網(wǎng)報頭、幀間隙這些協(xié)議開銷最多只能到線速的94%左右。如果實測能達到85Mbps以上基本可以認為性能正常。如果只有幾十Mbps就要查是不是中斷處理、DMA緩沖、CPU負載的問題。我這個板子最終測下來的結(jié)果是92Mbps左右接近線速說明RMII數(shù)據(jù)通路的DMA搬移和中斷處理沒有明顯瓶頸。另外多線程模式可以再加一層驗證iperf3 -c 192.168.1.100 -t 30 -P 4多線程打流能夠暴露單線程TCP處理能力的上限如果多線程時吞吐明顯高于單線程說明瓶頸在協(xié)議?;蛘逤PU單核處理能力而不是物理鏈路。4.4 UDP方向容易忽視的問題丟包率和實時性TCP有重傳機制即使鏈路質(zhì)量一般TCP吞吐看起來也還湊合。但很多實際項目比如用UDP做實時控制、Modbus TCP轉(zhuǎn)UDP透傳、視頻流傳輸對UDP丟包率非常敏感。驗證UDP丟包可以用iperf3iperf3 -c 192.168.1.100 -u -b 80M -t 30-U方向測的是發(fā)送如果想測接收要在服務(wù)端加 -u 參數(shù)。如果板子是作為UDP服務(wù)端接收數(shù)據(jù)就在板子上跑 iperf3 -s -uPC端跑 iperf3 -c 板子IP -u -b 80M -t 30。實測下來如果丟包率在0.1%以內(nèi)對大多數(shù)應(yīng)用都是可以接受的。如果丟包率很高優(yōu)先檢查RMII信號完整性、時鐘抖動和PHY的接收電平配置。RMII模式對布線要求雖然比RGMII低但也不是完全無所謂。REF_CLK的走線盡量短別靠近電源和高速開關(guān)信號不然EMI會直接影響PHY的接收靈敏度。5. 復(fù)盤這張板子上最深的幾個坑與實用工具鏈5.1 我踩過的坑整理成一張表為了讓你少走彎路我把這次調(diào)試中遇到的所有問題和最終原因整理成了一張表按“癥狀-根因-解決方案”列出來癥狀根因解決方案dmesg報no phy foundYT8512C虛焊無法正常初始化補焊檢查電源、時鐘、復(fù)位引腳MDIO掃描無回應(yīng)PHY芯片沒有輸出50MHz時鐘確認晶振、PLL、時鐘方向配置MDIO掃描無回應(yīng)DTS中clock_in_out方向錯誤根據(jù)硬件原理圖配置input或outputlink up但ping不通pinctrl選錯mux組數(shù)據(jù)線復(fù)用錯誤對照原理圖選擇正確的rmiim0/rmiim1link時通時不通reset-deassert-us太短PHY未就緒加長復(fù)位釋放等待時間到80msPHY地址不匹配PHYAD引腳配置與DTS reg不一致用mdio scan掃描實際地址并在DTS中修正協(xié)商速率降到10M網(wǎng)線質(zhì)量差或信號完整性差更換網(wǎng)線檢查REF_CLK走線、地平面這張表看起來像是事后總結(jié)但每一項都是我實際花費時間驗證過的。尤其是 clock_in_out 方向和 pinctrl mux組選擇這兩個問題占了整個調(diào)試周期的一大半。如果從一開始就能確認這兩個配置可能當(dāng)天就能跑通。5.2 調(diào)試工具鏈串口、MDIO、ethtool、iperf3的組合拳嵌入式網(wǎng)絡(luò)調(diào)試不是碰運氣而是有一套工具鏈配合使用。我在這次項目里最常用的組合是串口調(diào)試助手 dmesg看內(nèi)核日志確認驅(qū)動執(zhí)行到了哪一步。RK3566開發(fā)板上一般要用USB轉(zhuǎn)串口模塊連接調(diào)試串口波特率通常是1500000具體以你的SDK配置為準(zhǔn)。mdio/mdio-tools直接讀寫PHY寄存器判斷PHY地址、PHY ID、link狀態(tài)寄存器。比如讀寄存器1MII status看link狀態(tài)讀寄存器0看速率和雙工配置。ethtool查看和配置MAC側(cè)的網(wǎng)絡(luò)狀態(tài)確認協(xié)商結(jié)果、環(huán)回測試是否正常。iperf3測試實際吞吐和UDP丟包率判斷性能瓶頸。網(wǎng)絡(luò)調(diào)試助手驗證UDP/TCP應(yīng)用層通信是否正常。調(diào)試以太網(wǎng)透傳或者Modbus TCP這類應(yīng)用時直接用現(xiàn)成的網(wǎng)絡(luò)調(diào)試工具發(fā)報文比寫腳本要直觀得多。另外一個非常實用的命令是 ethtool -S eth0可以查看PHY層面的錯誤計數(shù)比如rx_crc_errors、rx_error_packets。如果CRC錯誤很多基本可以斷定信號完整性有問題優(yōu)先查時鐘和布線而不是繼續(xù)調(diào)軟件。5.3 給后來人的幾個建議量產(chǎn)板驗證與復(fù)位時序最后再說幾個這次項目結(jié)束后我對量產(chǎn)板驗證和后續(xù)維護的經(jīng)驗。第一批量打板回來不要直接上系統(tǒng)先寫一個簡單的GPIO測試固件把所有PHY引腳的復(fù)用都釋放掉然后逐一遍歷PHY地址讀取ID。這個步驟能快速過濾掉一部分焊接問題比直接刷系統(tǒng)、看dmesg要快得多。當(dāng)時我第二塊板子出問題就是靠著這個流程才定位到虛焊的。第二注意復(fù)位時序。RC復(fù)位電路在量產(chǎn)板上的表現(xiàn)和工程樣板可能不一樣因為不同批次電容的容差會導(dǎo)致復(fù)位時間不同。強烈建議量產(chǎn)方案里用GPIO復(fù)位并且在DTS里把reset-assert-us和reset-deassert-us設(shè)置得充足一些寧可多等幾十毫秒不要賭那幾毫秒。第三如果你的產(chǎn)品要做寬溫測試YT8512C這類PHY芯片在低溫下的PLL鎖定時間可能會變長。我建議在低溫環(huán)境下做一次啟動測試確認50MHz時鐘在低溫下能正常起振。如果發(fā)現(xiàn)低溫啟動偶爾失敗把reset-deassert-us再加大或者在系統(tǒng)啟動腳本里延時后再讓網(wǎng)絡(luò)服務(wù)自動拉起。5.4 一個提高效率的小技巧把調(diào)試命令寫成腳本調(diào)試到后期我發(fā)現(xiàn)自己反復(fù)在敲同一組命令于是把它們寫成了一個一鍵腳本扔到板子上直接跑#!/bin/bash echo PHY ID mdio read 0 2 mdio read 0 3 echo Link State ethtool eth0 echo MAC Statistics ethtool -S eth0 echo Interrupt Status cat /proc/interrupts | grep -i eth這個腳本雖然簡單但每次改完DTS后重啟板子執(zhí)行一次基本上能第一時間判斷出問題出在哪一層。網(wǎng)絡(luò)調(diào)試很多時候就是在和時間賽跑能少敲一條命令就少一分煩躁?;剡^頭來看RK3566 YT8512C這套組合本身并不復(fù)雜真正的復(fù)雜度來自“你以為它是標(biāo)準(zhǔn)配置實際上每個芯片都有自己的脾氣”。RMII時鐘方向、引腳復(fù)用、復(fù)位時序這三個地方只要有一個沒整對整個網(wǎng)口就起不來。希望這篇記錄能幫你把那一個周末省下來用到更有價值的事情上。