歡迎關(guān)注,每周更新!?
本合集分享的是,我當(dāng)初學(xué)習(xí)Linux驅(qū)動(dòng)的來時(shí)路——《《驅(qū)動(dòng)之路》開篇:自序&前言》。
正文
在嵌入式 Linux 開發(fā)中,你是否遇到過這些困惑:
為什么同樣一個(gè) GPIO引腳,既能做普通輸入輸出,又能做 I2C 的 SDA、SPI 的 CS 等功能?
驅(qū)動(dòng)中沒寫引腳配置代碼,芯片卻能自動(dòng)切換引腳功能,底層是怎么實(shí)現(xiàn)的?
設(shè)備樹中pinctrl-0 pinctrl-names這些屬性到底有什么用?
這一切的答案,都藏在 Linux 內(nèi)核的Pinctrl 子系統(tǒng)里。它是管理芯片引腳的 “總管家”,負(fù)責(zé)引腳的復(fù)用配置、電氣屬性設(shè)置,讓驅(qū)動(dòng)開發(fā)者徹底擺脫 “寄存器操作引腳” 的繁瑣。
1 為什么需要 Pinctrl 子系統(tǒng)?
如果沒有 Pinctrl 子系統(tǒng),嵌入式引腳配置全靠 “硬編碼”,痛點(diǎn)極其明顯:
(1)引腳復(fù)用沖突
芯片的引腳資源有限,一個(gè)引腳往往對(duì)應(yīng)多種功能(如 GPIO、I2C、UART、SPI)。比如 RK3576 的GPIO2_PB4,支持如下功能復(fù)用。

如果驅(qū)動(dòng)直接操作寄存器配置功能,很容易出現(xiàn) “多個(gè)驅(qū)動(dòng)搶占同一引腳” 的沖突。
(2)配置繁瑣且易出錯(cuò)
引腳配置不僅要選 “功能”,還要設(shè)置電氣屬性:
上拉 / 下拉電阻(如 I2C 引腳需要上拉);
驅(qū)動(dòng)能力(如大電流引腳需要增強(qiáng)驅(qū)動(dòng)能力);
電平標(biāo)準(zhǔn)(如 LVCMOS3.3V、LVDS)。
這些都需要操作復(fù)雜的寄存器,不同芯片的寄存器地址還不一樣,移植性極差。
(3)驅(qū)動(dòng)與硬件耦合嚴(yán)重
驅(qū)動(dòng)代碼中硬編碼引腳配置,更換硬件平臺(tái)或修改引腳時(shí),必須修改驅(qū)動(dòng)代碼,違背了 “硬件描述與驅(qū)動(dòng)分離” 的設(shè)計(jì)思想。
而 Pinctrl 子系統(tǒng)的核心目標(biāo),就是解決這些問題:
統(tǒng)一管理引腳:集中處理引腳復(fù)用、電氣屬性配置,避免沖突;
設(shè)備樹驅(qū)動(dòng)解耦:引腳配置寫在設(shè)備樹中,驅(qū)動(dòng)無需關(guān)心硬件細(xì)節(jié);
標(biāo)準(zhǔn)化接口:提供統(tǒng)一的內(nèi)核 API,驅(qū)動(dòng)通過設(shè)備樹即可獲取引腳配置。
2 Pinctrl 的 3 個(gè)關(guān)鍵術(shù)語
想要理解 Pinctrl,必須先搞懂這 3 個(gè)核心概念,否則后續(xù)流程會(huì) confusion:
(1)Pin(引腳)
指芯片物理引腳的抽象,每個(gè)引腳都有唯一的編號(hào)(如 RK3576 的GPIO2_PB4對(duì)應(yīng)引腳編號(hào)52)。Pinctrl 子系統(tǒng)通過 “引腳編號(hào)” 識(shí)別和管理硬件引腳。
(2)Pinmux(引腳復(fù)用)
“Pin Multiplexing” 的縮寫,核心作用是選擇引腳的功能模式。比如:
把GPIO2_PB4配置為 “普通 GPIO 模式”;
把GPIO2_PB4配置為 “UART7_CTSN 模式”;
把GPIO2_PB4配置為 “SPI4_MOSI 模式”。
每個(gè)引腳的可用模式,由芯片的 datasheet 明確規(guī)定(如瑞芯微提供的 RK3576_PinOut 表格)。
(3)Pinctrl(引腳配置)
“Pin Control” 的縮寫,核心作用是設(shè)置引腳的電氣屬性,常見配置包括:
上拉電阻(pull-up):引腳默認(rèn)拉高,如 I2C、按鍵引腳;
下拉電阻(pull-down):引腳默認(rèn)拉低,如復(fù)位引腳;
驅(qū)動(dòng)能力(drive strength):引腳輸出電流大小,如 LED 引腳需要 10mA 驅(qū)動(dòng);
電平標(biāo)準(zhǔn)(voltage level):如 LVCMOS3.3V、LVCMOS1.8V;
slew rate(轉(zhuǎn)換速率):引腳電平變化的快慢,高頻場(chǎng)景需調(diào)整。
簡(jiǎn)單總結(jié):Pinmux 負(fù)責(zé) “引腳做什么功能”,Pinctrl 負(fù)責(zé) “引腳的電氣特性是什么”,兩者結(jié)合完成引腳的完整配置。
3 Pinctrl 工作流程
Pinctrl 子系統(tǒng)的工作,本質(zhì)是 “設(shè)備樹配置 → 內(nèi)核解析 → 驅(qū)動(dòng)使用” 的流程。
步驟 1:設(shè)備樹中定義引腳配置
開發(fā)者需要在設(shè)備樹中,為每個(gè)設(shè)備(如 I2C、SPI、傳感器)定義 “引腳復(fù)用 + 電氣屬性”,核心是 3 類節(jié)點(diǎn):
(1)Pinctrl 控制器節(jié)點(diǎn)
描述芯片的引腳控制器硬件信息,由芯片廠商在 dtsi 文件中預(yù)定義(無需開發(fā)者修改)。例如 RK3576 的 rk3576.dtsi(如下圖)。
核心作用:告訴內(nèi)核 “引腳控制器的硬件位置、支持的功能”,內(nèi)核通過該節(jié)點(diǎn)初始化 Pinctrl 驅(qū)動(dòng)。

(2)引腳配置子節(jié)點(diǎn)
在&pinctrl節(jié)點(diǎn)下(rk3576-pinctrl.dtsi),定義具體的引腳配置(復(fù)用 + 電氣屬性),通常以 “功能 + 場(chǎng)景”命名。例如 I2C0 的引腳配置:

(3)設(shè)備節(jié)點(diǎn)引用引腳配置
在具體設(shè)備節(jié)點(diǎn)(如 I2C0)中,通過pinctrl-names和pinctrl-0引用上述配置:

步驟 2:內(nèi)核解析設(shè)備樹,初始化引腳配置
Linux 內(nèi)核啟動(dòng)時(shí),Pinctrl 子系統(tǒng)會(huì)執(zhí)行以下操作:
解析&pinctrl控制器節(jié)點(diǎn),加載對(duì)應(yīng)的 Pinctrl 驅(qū)動(dòng)(如drivers/pinctrl/pinctrl-rockchip.c);
解析引腳配置子節(jié)點(diǎn)(如i2c0_default),提取pinmux(功能)和pinconf(電氣屬性)信息;
檢查引腳是否被其他設(shè)備占用(避免復(fù)用沖突);
若引腳空閑,通過 Pinctrl 驅(qū)動(dòng)操作寄存器,配置引腳的復(fù)用模式和電氣屬性;
把配置好的引腳與設(shè)備節(jié)點(diǎn)(如&i2c0)綁定,等待驅(qū)動(dòng)使用。
步驟 3:驅(qū)動(dòng)匹配成功,直接使用配置好的引腳
當(dāng)設(shè)備節(jié)點(diǎn)(如&i2c0)與驅(qū)動(dòng)(如 I2C 驅(qū)動(dòng))匹配成功后,驅(qū)動(dòng)無需再配置引腳 ——Pinctrl 子系統(tǒng)已提前完成所有工作:
I2C 驅(qū)動(dòng)直接通過 I2C 控制器收發(fā)數(shù)據(jù),SDA/SCL 引腳已被配置為 I2C 功能,且啟用了上拉電阻;
傳感器驅(qū)動(dòng)通過devm_gpiod_get獲取復(fù)位引腳時(shí),該引腳已被配置為 GPIO 功能,無需手動(dòng)設(shè)置復(fù)用。
這就是為什么驅(qū)動(dòng)中不用寫引腳配置代碼 ——Pinctrl 子系統(tǒng)已經(jīng) “提前打理好一切”。
總結(jié)
Pinctrl 子系統(tǒng)的本質(zhì)是 “內(nèi)核提供的引腳管理框架”,核心作用是統(tǒng)一處理引腳復(fù)用和電氣屬性配置,實(shí)現(xiàn) “硬件描述與驅(qū)動(dòng)分離”。
關(guān)鍵要點(diǎn)回顧:
3 個(gè)核心概念:Pin(引腳)、Pinmux(復(fù)用)、Pinconf(配置);
工作流程:設(shè)備樹定義配置 → 內(nèi)核解析初始化 → 驅(qū)動(dòng)直接使用;
開發(fā)重點(diǎn):在設(shè)備樹中正確定義引腳組、功能、電氣屬性,并讓設(shè)備節(jié)點(diǎn)引用。
記住:嵌入式 Linux 中,所有引腳的復(fù)用和配置,都應(yīng)該通過 Pinctrl 子系統(tǒng)實(shí)現(xiàn),而非驅(qū)動(dòng)硬編碼 —— 這是規(guī)范,也是避免踩坑的關(guān)鍵。
(完)
本人專注 Linux 驅(qū)動(dòng) & Linux/Android BSP 開發(fā)調(diào)試,可接外包項(xiàng)目/技術(shù)支持/問題定位。有需求或交個(gè)朋友可加微信:【Chen_WeChat2026】。
更多原創(chuàng)技術(shù)文章:《README 2026》。
審核編輯 黃宇
-
Linux
+關(guān)注
關(guān)注
88文章
11798瀏覽量
219395 -
引腳
+關(guān)注
關(guān)注
16文章
2116瀏覽量
55959
發(fā)布評(píng)論請(qǐng)先 登錄
驅(qū)動(dòng)之路#04:LCD 驅(qū)動(dòng)程序分析(基于RK3576)
驅(qū)動(dòng)之路#03:LCD 時(shí)序參數(shù)分析
深入解析RK3568引腳控制核心:rk3568-pinctrl.dtsi文件的作用與實(shí)踐(可應(yīng)用rk全系列)
CD405xB系列多路復(fù)用器與解復(fù)用器的技術(shù)解析與應(yīng)用探討
解析TS3DV520E:適用于DVI/HDMI應(yīng)用的5通道差分10:20多路復(fù)用開關(guān)
高速信號(hào)處理利器:TMUXHS4412 4通道 20Gbps差分2:1/1:2復(fù)用器/解復(fù)用器深度解析
ElfBoard技術(shù)貼|如何在【RK3588】ELF 2開發(fā)板上進(jìn)行UART引腳復(fù)用配置
2025玄奘之路戈20挑戰(zhàn)賽,神眸AI智能影像實(shí)現(xiàn)全賽道守護(hù)實(shí)時(shí)直播
Texas Instruments TDP20MB421四通道DisplayPort 2.1再驅(qū)動(dòng)器數(shù)據(jù)手冊(cè)
達(dá)實(shí)智能分享AI時(shí)代的心力驅(qū)動(dòng)之路
Texas Instruments TUSB1021-Q1 10Gbps線性轉(zhuǎn)接驅(qū)動(dòng)器多路復(fù)用器和多路解復(fù)用器數(shù)據(jù)手冊(cè)
Texas Instruments TMUXHS4512 2:1多路復(fù)用器/1:2解復(fù)用器開關(guān)數(shù)據(jù)手冊(cè)
STM32L433VCT6 LCD復(fù)用引腳如何分配?
RK3568驅(qū)動(dòng)指南|第十二篇 GPIO子系統(tǒng)-第135章 GPIO子系統(tǒng)與pinctrl子系統(tǒng)相結(jié)合實(shí)驗(yàn)
迅為RK3568驅(qū)動(dòng)指南GPIO子系統(tǒng)實(shí)戰(zhàn):實(shí)現(xiàn)動(dòng)態(tài)切換引腳復(fù)用功能
驅(qū)動(dòng)之路#20:Pinctrl 在手,引腳復(fù)用很順手
評(píng)論