前言:在 RK3588 平臺(tái)開發(fā)過程中,你是否遇到過這樣的窘境:明明 PCIe 總線上掛好了網(wǎng)卡模塊,lspci 能識(shí)別到芯片,可驅(qū)動(dòng)就是加載失敗,排查半天找不到關(guān)鍵問題?別慌!本文將帶你一步步解決這個(gè)棘手問題。
一、案例背景
使用眺望電子 RK3588核心板的PCIE20_0/1/2接口掛載裕太微yt6801芯片擴(kuò)展網(wǎng)卡為例,看看問題到底有多棘手。
通過lspci命令查看設(shè)備狀態(tài)時(shí),能清晰看到 yt6801 芯片的存在,三個(gè)網(wǎng)卡設(shè)備均顯示為 “Ethernet controller: Device 1f0a:6801 (rev 01)”,從表面看似乎一切正常。
可當(dāng)執(zhí)行insmod yt6801.ko加載驅(qū)動(dòng)時(shí),報(bào)錯(cuò)信息卻接連彈出驅(qū)動(dòng)加載直接失敗,網(wǎng)卡根本無法使用。
明明硬件連接沒問題,設(shè)備也能被識(shí)別,為什么驅(qū)動(dòng)就是 “不聽話”?這背后肯定藏著我們沒注意到的關(guān)鍵細(xì)節(jié)。
二、根源分析
問題不能看表面,深入日志查原因
查看系統(tǒng)日志時(shí)發(fā)現(xiàn),出問題的 PCIe 設(shè)備與正常設(shè)備的 class 類型截然不同。正常工作的兩個(gè) PCIe 設(shè)備(000200.0 和 000100.0),class 類型均為 0x060400;而加載驅(qū)動(dòng)失敗的 PCIe 設(shè)備(000400.0),class 類型卻顯示為 0x000000。
在SDK/kernel/include/linux/pci_ids.h文件中定義了不同class類別。其中0x000000為PCI_CLASS_NOT_DEFINED,即為未定義;而0x060400為PCI_CLASS_BRIDGE_PCI,即為PCIe橋。只有正確識(shí)別設(shè)備類型,內(nèi)核才能進(jìn)行后續(xù)的資源分配和驅(qū)動(dòng)加載。
由于該 PCIe 設(shè)備的 class 類型非法(未定義),系統(tǒng)無法正確識(shí)別其功能屬性,導(dǎo)致 Memory BAR 資源分配異常(lspci 中 BAR 資源會(huì)顯示 unassigned 狀態(tài)),最終造成網(wǎng)卡驅(qū)動(dòng)加載失敗。
找到根源后,解決問題就有了明確方向。
三、解決方案
想要解決這個(gè)問題,最根本的方式是聯(lián)系模塊供應(yīng)商,讓其對(duì)模塊的 class 類型進(jìn)行正確配置。但如果遇到無法修改硬件配置,或需要臨時(shí)應(yīng)急的情況,可以參考下文嘗試對(duì)模塊的class類型進(jìn)行軟件修復(fù),具體只需如下3步:
3.1定位修改文件
打開RK3588的SDK,找到內(nèi)核中的kernel/drivers/pci/quirks.c文件。該文件主要用于處理 PCI 設(shè)備的特殊配置和兼容性問題,是我們進(jìn)行軟件修復(fù)的關(guān)鍵位置。
3.2添加修復(fù)代碼
在quirks.c文件中,新增以下兩段代碼:
1.定義 class 類型修復(fù)函數(shù)
staticvoidquirk_class_id_fixup(struct pci_dev *dev){ dev->class=0x060400;// 將class類型設(shè)置為標(biāo)準(zhǔn)PCIe橋類型}
2.注冊(cè)修復(fù)邏輯
DECLARE_PCI_FIXUP_CLASS_EARLY(0x1d87,0x3588, PCI_CLASS_NOT_DEFINED,8, quirk_class_id_fixup);
這里需要注意:0x1d87是 RK3588 的 Vendor ID(廠商 ID),0x3588是對(duì)應(yīng)的 Device ID(設(shè)備 ID),PCI_CLASS_NOT_DEFINED指定針對(duì)未定義 class 類型的設(shè)備進(jìn)行修復(fù),0x060400則是我們要修復(fù)到的正確 class 類型。
3.3加修復(fù)代碼
代碼添加完成后,重新編譯內(nèi)核鏡像,將編譯好的鏡像燒錄到 RK3588 核心板中,通過命令驗(yàn)證修復(fù)效果:
1、執(zhí)行l(wèi)spci命令,已正確顯示為 “PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3588 (rev 01)”,class 類型修復(fù)成功。
2、執(zhí)行insmod yt6801.ko加載驅(qū)動(dòng),此時(shí)不再出現(xiàn)報(bào)錯(cuò)信息,驅(qū)動(dòng)加載成功。
3、執(zhí)行ifconfig命令,能看到新增的網(wǎng)卡接口(如 enP4p65s0),且接口狀態(tài)正常,支持 UP、BROADCAST、MULTICAST 等模式,說明網(wǎng)卡已能正常工作。
至此,RK3588 PCIe 非法class類型導(dǎo)致的網(wǎng)卡驅(qū)動(dòng)無法加載問題,已完全解決。
四、小結(jié)
本文提供的解決方案基于特定硬件平臺(tái)驗(yàn)證,實(shí)際應(yīng)用中需根據(jù)具體設(shè)備調(diào)整VID/PID及class類型參數(shù)。如果你在 RK3588 平臺(tái)或者我司核心板開發(fā)中還遇到過其他 PCIe 相關(guān)難題,請(qǐng)關(guān)注眺望電子公眾號(hào)或在評(píng)論區(qū)留言分享,我們一起交流探討!
-
PCIe
+關(guān)注
關(guān)注
16文章
1403瀏覽量
86920 -
Class
+關(guān)注
關(guān)注
0文章
54瀏覽量
20299 -
RK3588
+關(guān)注
關(guān)注
8文章
459瀏覽量
6750
發(fā)布評(píng)論請(qǐng)先 登錄
實(shí)戰(zhàn)案例 | RK3588 CAN通信BUG避坑指南

瑞芯微RK3588開發(fā)板RK3588 EVB和RK3588S EVB解讀

評(píng)論