最近看好多人因?yàn)閜cie這個(gè)問(wèn)題困擾,遂再更一版關(guān)于pcie調(diào)試的文章。
在嵌入式開(kāi)發(fā)中,PCIE接口的SSD因高速讀寫(xiě)特性,常作為RK(瑞芯微)平臺(tái)的核心存儲(chǔ)方案。但調(diào)試時(shí)難免遇到“詭異”問(wèn)題——比如插入SSD時(shí)一切正常,不插SSD系統(tǒng)就直接起不來(lái),甚至改了配置后還偶發(fā)啟動(dòng)失敗。
今天結(jié)合實(shí)際調(diào)試文檔,拆解這兩個(gè)典型坑的排查過(guò)程與解決方案,幫你避開(kāi)PCIe SSD調(diào)試的“隱形陷阱”。
一、初始坑:不插SSD,系統(tǒng)直接“罷工”

1.現(xiàn)象:插與不插,兩種命運(yùn)
?正常場(chǎng)景:插入SSD后,系統(tǒng)啟動(dòng)流暢,SSD能被正確識(shí)別并正常讀寫(xiě);
?異常場(chǎng)景:拔掉SSD,系統(tǒng)卡在啟動(dòng)階段,無(wú)報(bào)錯(cuò)日志,直接“死機(jī)”。
2.排查:從“時(shí)鐘”定位到“引腳配置”
一開(kāi)始懷疑電源或PCIe鏈路問(wèn)題,逐一排查后發(fā)現(xiàn)關(guān)鍵線索:
?測(cè)量PCIe相關(guān)電壓(如vpcie3v3):無(wú)論是否插SSD,電壓均穩(wěn)定在3.3V,排除電源故障;
?用示波器測(cè)PCIe時(shí)鐘信號(hào):不插SSD時(shí),時(shí)鐘引腳無(wú)輸出,插入后時(shí)鐘恢復(fù)正常——問(wèn)題出在時(shí)鐘使能的控制邏輯。
進(jìn)一步核對(duì)DTS(設(shè)備樹(shù))配置,發(fā)現(xiàn)核心控制引腳PCIE30X4_CLKREQn_M1(對(duì)應(yīng)GPIO4 RK_PB4)的配置存在問(wèn)題:
|
//初始錯(cuò)誤配置
pcie20x1_0_clkreqn_m1: pcie20x1-0-clkreqn-m1 {
rockchip,pins = <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>; //浮空狀態(tài)
};
|
&pcfg_pull_none表示引腳處于浮空狀態(tài):插入SSD時(shí),SSD會(huì)主動(dòng)拉低該引腳觸發(fā)時(shí)鐘輸出;不插SSD時(shí),引腳電平懸空,無(wú)法觸發(fā)時(shí)鐘,導(dǎo)致系統(tǒng)啟動(dòng)卡住。
3.解決方案:浮空→下拉,讓引腳“有個(gè)準(zhǔn)信”
只需修改引腳的拉取狀態(tài),將“浮空”改為“下拉”,確保即使不插SSD,引腳也能維持穩(wěn)定電平以觸發(fā)時(shí)鐘:
|
//修改后正確配置
pcie20x1_0_clkreqn_m1: pcie20x1-0-clkreqn-m1 {
rockchip,pins = <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_down>; //下拉狀態(tài)
};
|
重新編譯燒錄后測(cè)試:不插SSD時(shí),時(shí)鐘信號(hào)正常輸出,系統(tǒng)順利啟動(dòng)——第一個(gè)坑解決!
二、二次坑:改了下拉,仍偶發(fā)“死機(jī)”
1.新現(xiàn)象:偶爾啟動(dòng)失敗,無(wú)規(guī)律可循
解決初始問(wèn)題后,測(cè)試中發(fā)現(xiàn)新情況:系統(tǒng)約有10%概率啟動(dòng)失敗,重啟幾次又能恢復(fù),無(wú)固定觸發(fā)條件,排查難度更高。
2.根因:驅(qū)動(dòng)加載“干擾”引腳電平
再次核對(duì)DTS,發(fā)現(xiàn)&pcie3x4(PCIe控制器節(jié)點(diǎn))中,將之前修改的引腳配置關(guān)聯(lián)到了驅(qū)動(dòng):
|
//存在問(wèn)題的PCIe控制器配置
&pcie3x4 {
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
pinctrl-names = "default";
pinctrl-0 = <&pcie20x1_0_clkreqn_m1>; //引腳關(guān)聯(lián)驅(qū)動(dòng)
status = "okay";
};
|
問(wèn)題在于:驅(qū)動(dòng)加載時(shí),會(huì)動(dòng)態(tài)調(diào)整關(guān)聯(lián)引腳的電平,導(dǎo)致PCIE30X4_CLKREQn_M1引腳有時(shí)高、有時(shí)低,電平不確定性觸發(fā)PCIe鏈路初始化失敗——這也是啟動(dòng)失敗“無(wú)規(guī)律”的原因。
查閱RK官方原理圖與配置說(shuō)明后確認(rèn):該引腳無(wú)需關(guān)聯(lián)PCIe驅(qū)動(dòng),需獨(dú)立控制以保證電平穩(wěn)定。
3.終局解決方案:刪關(guān)聯(lián)+獨(dú)立配置,徹底穩(wěn)電平
分兩步修改,徹底隔絕驅(qū)動(dòng)對(duì)引腳的干擾:
步驟1:刪除PCIe驅(qū)動(dòng)與引腳的關(guān)聯(lián)
修改&pcie3x4節(jié)點(diǎn),注釋或刪除pinctrl-0配置,斷開(kāi)驅(qū)動(dòng)與引腳的綁定:
|
//修改后的PCIe控制器配置
&pcie3x4 {
reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&vcc3v3_pcie30>;
pinctrl-names = "default";
//注釋關(guān)聯(lián)配置:避免驅(qū)動(dòng)干擾引腳電平
// pinctrl-0 = <&pcie20x1_0_clkreqn_m1>;
status = "okay";
};
|
步驟2:?jiǎn)为?dú)配置引腳為“固定電平調(diào)節(jié)器”
新增pcie3x4_clkreqn_m1節(jié)點(diǎn),將引腳配置為regulator-fixed(固定調(diào)節(jié)器)類(lèi)型,強(qiáng)制拉低并確保啟動(dòng)階段穩(wěn)定:
|
//獨(dú)立引腳配置(關(guān)鍵)
pcie3x4_clkreqn_m1: pcie3x4-clkreqn-m1{
compatible = "regulator-fixed"; //固定電平類(lèi)型
gpio = <&gpio4 RK_PB4 GPIO_ACTIVE_LOW>; //低電平有效
pinctrl-names = "default";
pinctrl-0 = <&pcie20x1_0_clkreqn_m1>; //引用下拉配置
regulator-name = "pcie3x4_clkreqn_m1";
enable-active-low; //使能信號(hào)低電平有效
start-delays-us = <5000>; //啟動(dòng)延遲5000微秒(避免沖擊)
off-on-delay-us = <5000>; //切換延遲5000微秒
regulator-always-on; //引腳始終保持使能
regulator-boot-on; //系統(tǒng)啟動(dòng)階段即開(kāi)啟
};
|
?start-delays-us與off-on-delay-us:避免引腳電平突變導(dǎo)致的鏈路誤判;
?regulator-always-on與regulator-boot-on:確保從系統(tǒng)上電到啟動(dòng)完成,引腳始終維持穩(wěn)定低電平。
修改后經(jīng)過(guò)百次啟動(dòng)測(cè)試:無(wú)論是否插SSD,系統(tǒng)均100%正常啟動(dòng),偶發(fā)故障徹底解決!
三、調(diào)試核心要點(diǎn):3個(gè)“避坑準(zhǔn)則”
1.引腳拉取狀態(tài):拒絕浮空,優(yōu)先下拉
PCIe的CLKREQn類(lèi)控制引腳(如本文的GPIO4 RK_PB4),需避免&pcfg_pull_none(浮空),不插設(shè)備時(shí)會(huì)因電平不確定斷時(shí)鐘,下拉(&pcfg_pull_down)是更安全的選擇。
2.驅(qū)動(dòng)關(guān)聯(lián):控制引腳別綁驅(qū)動(dòng)
非PCIe核心數(shù)據(jù)引腳(如時(shí)鐘控制、復(fù)位),無(wú)需在&pcie3x4等控制器節(jié)點(diǎn)中通過(guò)pinctrl-0關(guān)聯(lián)驅(qū)動(dòng),否則驅(qū)動(dòng)加載會(huì)干擾電平穩(wěn)定性。
3.獨(dú)立配置:用regulator-fixed穩(wěn)電平
關(guān)鍵控制引腳建議按“固定調(diào)節(jié)器”配置,加上延遲參數(shù)(如5000us)和“始終開(kāi)啟”屬性,從硬件層面杜絕電平波動(dòng)。
結(jié)尾
PCIe調(diào)試常因“引腳電平”“驅(qū)動(dòng)關(guān)聯(lián)”這類(lèi)細(xì)節(jié)卡殼,看似詭異的故障,往往藏在DTS的幾行配置里。你在RK平臺(tái)調(diào)試PCIe設(shè)備時(shí),還遇到過(guò)哪些“坑”?歡迎在評(píng)論區(qū)分享,一起避坑提效!
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20440瀏覽量
333957 -
SSD
+關(guān)注
關(guān)注
21文章
3108瀏覽量
122221 -
引腳
+關(guān)注
關(guān)注
16文章
2111瀏覽量
55680 -
RK3588
+關(guān)注
關(guān)注
8文章
556瀏覽量
7318
發(fā)布評(píng)論請(qǐng)先 登錄
RK3588編解碼盒子之RTL8211FS-CG光口調(diào)試
求一種基于RK3588實(shí)現(xiàn)SPI-NOR大容量存儲(chǔ)方案
ROC-RK3588S-PC開(kāi)發(fā)板支持SATA協(xié)議的SSD使用
RK3588S(Android 12) M.2接口的配置與使用手冊(cè)指南
RK3588與RK3399的區(qū)別
Banana Pi BPI-W3 RK3588平臺(tái)驅(qū)動(dòng)調(diào)試篇 [ PCIE篇一 ] - PCIE的開(kāi)發(fā)指南
Banana Pi BPI-W3 RK3588平臺(tái)驅(qū)動(dòng)調(diào)試篇 [ PCIE篇二 ] - PCIE的開(kāi)發(fā)指南
RK3588 PCIe設(shè)備識(shí)別失敗?一招避坑“非法Class”陷阱
開(kāi)發(fā)者必備,10 分鐘搞定 RK3588 PCIE 拆分!
RK3588平臺(tái)雙存儲(chǔ)(SPI+PCIE)OTA升級(jí)方案教學(xué)文檔
一文搞懂?RK3588 PCIe:從硬件資源到拆分配置?+?避坑指南(含腦圖)
實(shí)戰(zhàn)復(fù)盤(pán):RK3588 SPI+PCIe3x4方案啟動(dòng)修復(fù),從節(jié)點(diǎn)配置到驅(qū)動(dòng)適配全解析
保姆級(jí)教程!RK3588 Linux6.1?固件簽名完整實(shí)現(xiàn)方案(不含rootfs)
RK3588平臺(tái)SSD PCIE調(diào)試踩坑記:不插SSD就死機(jī)??jī)刹礁愣ㄒ_與驅(qū)動(dòng)配置
評(píng)論