嵌入式開發中,單路I2C總線往往無法滿足多外設的掛載需求,NXP的PCA9548(8通道I2C Switch)是解決該問題的常用方案,尤其在RK3576等嵌入式平臺的攝像頭、VCM等多I2C外設場景中廣泛應用。本文結合實際設備樹配置,從配置解析、生效全流程、開發關鍵要點三個維度,講透PCA9548在Linux系統中的落地實現,嵌入式開發人員可直接對標實操。
一、先看懂:PCA9548核心設備樹配置解析
本文以RK3576平臺I2C0掛載PCA9548,通道0/1掛載攝像頭(gc05a2/sc4336/imx415)、VCM(dw9714)的實際配置為例,拆解核心節點與屬性的作用,所有配置均圍繞Linux I2C子系統+PCA9548驅動的適配規則編寫。
核心配置拓撲
&i2c0(物理I2C控制器)→tca9548a@70(PCA9548設備)→channel@x(PCA9548子通道)→外設節點(攝像頭/VCM)
關鍵節點/屬性詳解
| 節點/屬性 | 核心作用 | 實操要點 |
| &i2c0 | 引用RK3576物理I2C0控制器,開啟總線并綁定引腳 | 需配置pinctrl和status = "okay" |
| tca9548a@70 | PCA9548設備主節點,與內核驅動匹配 | 核心屬性缺一不可 |
| compatible = "nxp,pca9548" | 匹配Linux內核i2c-mux-pca954x.c驅動,是驅動加載的關鍵 | 必須與驅動of_match_table一致 |
| reg = <0x70> | PCA9548在I2C0總線上的硬件從地址,由硬件焊接的A0-A2引腳決定 | 與實際硬件一致,常見0x70/0x71 |
|
#address-cells/ |
定義子節點的尋址規則,固定為<1>/<0>(子節點僅用1個值表示編號) | 子通道/外設節點需繼承該規則 |
| channel@0/1/7 | PCA9548的子通道節點,對應硬件的0~7通道 | reg值為實際通道號 |
| 外設節點(如dw9714-1@c) | 掛載在子通道的I2C設備,如VCM、攝像頭 | reg為外設在子總線的從地址 |
| port/endpoint | 攝像頭專屬,建立MIPI DPHY數據鏈路,關聯SOC的MIPI接收端 | 需與SOC側節點remote-endpoint匹配 |
核心特點:不同子通道的外設可使用相同的I2C從地址(如通道0/1的gc05a2均為0x37),因各通道對應獨立的虛擬I2C總線,物理上不會產生地址沖突。
二、核心重點:PCA9548配置生效全流程
PCA9548的配置能正常生效,本質是Linux設備樹解析+I2C子系統+PCA9548專用驅動的協同工作,整個流程從內核啟動開始,到外設可正常訪問結束,共6個核心步驟,配套生效流程圖更易理解。

PCA9548配置生效流程圖
各階段核心動作拆解
階段1:設備樹解析(內核啟動初期)
內核執行unflatten_device_tree,將設備樹的樹形配置轉換為內核可識別的device_node結構體,完整記錄I2C0引腳/時鐘、PCA9548從地址/兼容屬性、子通道外設的硬件參數(電源/時鐘/地址),為后續驅動匹配提供數據基礎。
階段2:I2C0控制器初始化
RK3576的I2C控制器專用驅動(i2c-rockchip.c)完成初始化,創建物理I2C適配器(對應系統節點/sys/bus/i2c/devices/i2c-0),該適配器是PCA9548與SOC通信的物理載體。
階段3:PCA9548驅動匹配
Linux I2C子系統遍歷I2C0總線上的所有設備樹節點,讀取tca9548a@70的compatible = "nxp,pca9548",與i2c-mux-pca954x.c驅動中的pca954x_of_match匹配表比對,找到PCA9548對應的芯片描述符(8通道Switch、無中斷、無使能位),完成驅動匹配。
階段4:PCA9548 probe初始化(最核心)
驅動匹配成功后,執行pca954x_probe函數,完成PCA9548的硬件初始化與虛擬總線創建,核心動作:
1.合法性檢查:驗證I2C0適配器支持PCA9548通信所需的I2C_FUNC_SMBUS_BYTE功能;
2.內存分配:創建驅動私有數據(記錄通道狀態、空閑策略等);
3.硬件初始化:向PCA9548的0x70地址寫入初始寄存器值,默認斷開所有通道;
4.創建虛擬I2C適配器:為設備樹中配置的channel@0/1/7分別創建獨立的虛擬I2C適配器(如通道0→i2c-1、通道1→i2c-2),每個虛擬適配器綁定通道選擇/空閑處理函數;
5.創建設備節點:在系統中生成PCA9548設備節點/sys/bus/i2c/devices/0-0070,并提供idle_statesysfs接口,用于運行時修改空閑策略。
階段5:子外設枚舉與驅動綁定
PCA9548的虛擬I2C適配器創建完成后,I2C子系統自動遍歷各通道下的外設節點:
1.以通道0為例,虛擬適配器i2c-1遍歷其下的dw9714、gc05a2、sc4336等節點;
2.讀取外設的compatible屬性,匹配對應的外設驅動(如dongwoon,dw9714匹配VCM驅動,galaxycore,gc05a2匹配攝像頭驅動);
3.執行外設驅動的probe函數,完成時鐘配置、電源使能、引腳綁定、MIPI鏈路建立等操作,外設正式注冊為系統可用設備。
階段6:運行時通道切換(透明化操作)
開發人員訪問外設(如讀寫攝像頭寄存器)時,無需手動切換PCA9548通道,驅動會自動完成:
1.觸發PCA9548驅動的pca954x_select_chan函數,對比當前通道與目標通道,若不同則向PCA9548寄存器寫入對應通道的位掩碼(8通道Switch為1<<通道號);
2.完成I2C讀寫后,執行pca954x_deselect_mux函數,根據空閑策略處理通道狀態(默認保持當前通道);
3.通道切換全程由驅動完成,對應用層和外設層完全透明。
三、開發避坑:關鍵要點與實用技巧
在RK3576平臺調試PCA9548時,很多問題源于對驅動特性和硬件規則的忽略,以下4個關鍵要點能有效避坑:
1.地址沖突:子通道可復用I2C從地址
PCA9548是Switch(開關)而非MUX(多路復用器),每個通道對應獨立的虛擬I2C總線,因此不同通道的外設可使用相同的I2C從地址(如通道0/1的gc05a2均為0x37),這是嵌入式開發中解決I2C地址沖突的常用方法。
2.空閑狀態:可運行時配置,適配不同場景
PCA9548驅動提供了idle_statesysfs接口(/sys/bus/i2c/devices/0-0070/idle_state),支持三種空閑策略,可根據場景動態修改:
?MUX_IDLE_AS_IS(默認):訪問外設后保持當前通道;
?MUX_IDLE_DISCONNECT:訪問完成后斷開所有通道,降低功耗;
?數字(如0/1/7):訪問完成后自動切換到指定通道。
3.驅動差異:區分Switch與MUX的適配邏輯
PCA9548屬于Switch,支持同時選中多個通道,但Linux內核的i2c-mux-pca954x.c驅動為了簡化邏輯,仍按單通道切換實現,通道選擇時僅寫入單個通道的位掩碼,若需多通道同時開啟,可修改驅動的pca954x_regval函數。
4.外設依賴:電源/時鐘必須提前配置
攝像頭、VCM等外設的avdd-supply(電源)、clocks(時鐘)、power-domains(電源域)必須在設備樹中提前定義并使能,否則外設驅動的probe函數會執行失敗,常見問題如REF_CLK1_OUT_PLL未配置24MHz時鐘、vcc_mipicsi1電源未使能。
四、快速排錯:常見問題與解決方法
調試中若PCA9548配置不生效,可按以下步驟排查,90%的問題都能解決:
1.PCA9548驅動未加載:檢查compatible屬性是否為nxp,pca9548,I2C0是否開啟(status = "okay"),執行lsmod | grep pca954x驗證驅動是否加載;
2.虛擬I2C適配器未創建:檢查PCA9548的硬件從地址(reg)是否與實際焊接一致,執行i2cdetect -y 0驗證PCA9548是否能被檢測到;
3.外設probe失敗:檢查外設的電源、時鐘、引腳配置是否正確,執行dmesg | grep 外設兼容屬性查看失敗原因;
4.無法訪問外設:檢查PCA9548的通道號是否配置正確,執行cat /sys/bus/i2c/devices/0-0070/idle_state驗證空閑策略是否合理。
五、總結
PCA9548在RK3576平臺的配置與生效,核心是用設備樹描述硬件拓撲,用專用驅動實現硬件操作,Linux的I2C子系統完成了中間的適配與調度,讓開發人員無需關注底層的通道切換邏輯。
核心收獲:
1.設備樹配置的關鍵是compatible屬性(驅動匹配)和reg屬性(硬件地址),拓撲需嚴格遵循物理I2C→PCA9548→子通道→外設;
2.配置生效的核心是PCA9548驅動的probe函數,其會為子通道創建獨立的虛擬I2C適配器,從根本上解決地址沖突問題;
3.調試時優先排查驅動匹配、硬件地址、電源時鐘三大點,能快速定位90%的問題。
掌握本文的配置方法和生效邏輯,不僅能在RK3576平臺落地PCA9548,還能遷移到其他ARM嵌入式平臺(如RK3399、IMX6ULL),因為Linux的I2C子系統和PCA9548驅動的設計邏輯是通用的。
審核編輯 黃宇
-
I2C
+關注
關注
28文章
1556瀏覽量
131225 -
rk3576
+關注
關注
1文章
266瀏覽量
1546
發布評論請先 登錄
PCA9545A/45B/45C:4通道I2C總線開關的深度解析
RK3576基于UVC協議USB攝像頭配置指南,手把手教你搞定
支持復位的 TCA9548A-Q1 汽車 8 通道 I2C 開關:設計與應用全解析
基于米爾RK3576的環視實時性方案解析
【作品合集】米爾RK3576開發板測評
瑞芯微RK3576平臺FFmpeg硬件編解碼移植及性能測試實戰攻略 觸覺智能RK3576開發板演示
瑞芯微RK3576與RK3576S有什么區別,性能參數配置與型號差異解析
RK3576平臺PCA9548 I2C開關設備樹配置與生效全解析
評論