0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

驱动之路#20:Pinctrl 在手,引脚复用很顺手

BSP调试从0到1 来源:嵌入式分享 作者:嵌入式分享 2026-04-07 21:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

欢迎关注,每周更新!☞

本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序&前言》。

正文

嵌入式 Linux 开发中,你是否遇到过这些困惑:

为什么同样一个 GPIO引脚,既能做普通输入输出,又能做 I2CSDA、SPI 的 CS 等功能?

驱动中没写引脚配置代码,芯片却能自动切换引脚功能,底层是怎么实现的?

设备树中pinctrl-0 pinctrl-names这些属性到底有什么用?

这一切的答案,都藏在 Linux 内核的Pinctrl 子系统里。它是管理芯片引脚的 “总管家”,负责引脚的复用配置、电气属性设置,让驱动开发者彻底摆脱 “寄存器操作引脚” 的繁琐。

1 为什么需要 Pinctrl 子系统?

如果没有 Pinctrl 子系统,嵌入式引脚配置全靠 “硬编码”,痛点极其明显:

(1)引脚复用冲突

芯片的引脚资源有限,一个引脚往往对应多种功能(如 GPIO、I2C、UART、SPI)。比如 RK3576 的GPIO2_PB4,支持如下功能复用。

wKgZPGnVBIKABAtIAAGAIr8UqrE187.png

如果驱动直接操作寄存器配置功能,很容易出现 “多个驱动抢占同一引脚” 的冲突。

(2)配置繁琐且易出错

引脚配置不仅要选 “功能”,还要设置电气属性:

上拉 / 下拉电阻(如 I2C 引脚需要上拉);

驱动能力(如大电流引脚需要增强驱动能力);

电平标准(如 LVCMOS3.3V、LVDS)。

这些都需要操作复杂的寄存器,不同芯片的寄存器地址还不一样,移植性极差。

(3)驱动与硬件耦合严重

驱动代码中硬编码引脚配置,更换硬件平台或修改引脚时,必须修改驱动代码,违背了 “硬件描述与驱动分离” 的设计思想。

而 Pinctrl 子系统的核心目标,就是解决这些问题:

统一管理引脚:集中处理引脚复用、电气属性配置,避免冲突;

设备树驱动解耦:引脚配置写在设备树中,驱动无需关心硬件细节;

标准化接口:提供统一的内核 API,驱动通过设备树即可获取引脚配置。

2 Pinctrl 的 3 个关键术语

想要理解 Pinctrl,必须先搞懂这 3 个核心概念,否则后续流程会 confusion:

(1)Pin(引脚)

指芯片物理引脚的抽象,每个引脚都有唯一的编号(如 RK3576 的GPIO2_PB4对应引脚编号52)。Pinctrl 子系统通过 “引脚编号” 识别和管理硬件引脚。

(2)Pinmux(引脚复用)

“Pin Multiplexing” 的缩写,核心作用是选择引脚的功能模式。比如:

把GPIO2_PB4配置为 “普通 GPIO 模式”;

把GPIO2_PB4配置为 “UART7_CTSN 模式”;

把GPIO2_PB4配置为 “SPI4_MOSI 模式”。

每个引脚的可用模式,由芯片的 datasheet 明确规定(如瑞芯微提供的 RK3576_PinOut 表格)。

(3)Pinctrl(引脚配置)

“Pin Control” 的缩写,核心作用是设置引脚的电气属性,常见配置包括:

上拉电阻(pull-up):引脚默认拉高,如 I2C、按键引脚;

下拉电阻(pull-down):引脚默认拉低,如复位引脚;

驱动能力(drive strength):引脚输出电流大小,如 LED 引脚需要 10mA 驱动;

电平标准(voltage level):如 LVCMOS3.3V、LVCMOS1.8V;

slew rate(转换速率):引脚电平变化的快慢,高频场景需调整。

简单总结:Pinmux 负责 “引脚做什么功能”,Pinctrl 负责 “引脚的电气特性是什么”,两者结合完成引脚的完整配置。

3 Pinctrl 工作流程

Pinctrl 子系统的工作,本质是 “设备树配置 → 内核解析 → 驱动使用” 的流程。

步骤 1:设备树中定义引脚配置

开发者需要在设备树中,为每个设备(如 I2C、SPI、传感器)定义 “引脚复用 + 电气属性”,核心是 3 类节点:

(1)Pinctrl 控制器节点

描述芯片的引脚控制器硬件信息,由芯片厂商在 dtsi 文件中预定义(无需开发者修改)。例如 RK3576 的 rk3576.dtsi(如下图)。

核心作用:告诉内核 “引脚控制器的硬件位置、支持的功能”,内核通过该节点初始化 Pinctrl 驱动。

wKgZPGnVBIKAVaJSAAGCnl2_t2k195.png

(2)引脚配置子节点

在&pinctrl节点下(rk3576-pinctrl.dtsi),定义具体的引脚配置(复用 + 电气属性),通常以 “功能 + 场景”命名。例如 I2C0 的引脚配置:

wKgZPGnVBIKAEeDhAAC5avd7Anw388.png

(3)设备节点引用引脚配置

在具体设备节点(如 I2C0)中,通过pinctrl-names和pinctrl-0引用上述配置:

wKgZPGnVBIKAO9KgAADERO8Qr_w966.png

步骤 2:内核解析设备树,初始化引脚配置

Linux 内核启动时,Pinctrl 子系统会执行以下操作:

解析&pinctrl控制器节点,加载对应的 Pinctrl 驱动(如drivers/pinctrl/pinctrl-rockchip.c);

解析引脚配置子节点(如i2c0_default),提取pinmux(功能)和pinconf(电气属性)信息;

检查引脚是否被其他设备占用(避免复用冲突);

若引脚空闲,通过 Pinctrl 驱动操作寄存器,配置引脚的复用模式和电气属性;

把配置好的引脚与设备节点(如&i2c0)绑定,等待驱动使用。

步骤 3:驱动匹配成功,直接使用配置好的引脚

当设备节点(如&i2c0)与驱动(如 I2C 驱动)匹配成功后,驱动无需再配置引脚 ——Pinctrl 子系统已提前完成所有工作:

I2C 驱动直接通过 I2C 控制器收发数据,SDA/SCL 引脚已被配置为 I2C 功能,且启用了上拉电阻;

传感器驱动通过devm_gpiod_get获取复位引脚时,该引脚已被配置为 GPIO 功能,无需手动设置复用。

这就是为什么驱动中不用写引脚配置代码 ——Pinctrl 子系统已经 “提前打理好一切”。

总结

Pinctrl 子系统的本质是 “内核提供的引脚管理框架”,核心作用是统一处理引脚复用和电气属性配置,实现 “硬件描述与驱动分离”。

关键要点回顾:

3 个核心概念:Pin(引脚)、Pinmux(复用)、Pinconf(配置);

工作流程:设备树定义配置 → 内核解析初始化 → 驱动直接使用;

开发重点:在设备树中正确定义引脚组、功能、电气属性,并让设备节点引用。

记住:嵌入式 Linux 中,所有引脚的复用和配置,都应该通过 Pinctrl 子系统实现,而非驱动硬编码 —— 这是规范,也是避免踩坑的关键。

(完)

本人专注 Linux 驱动 & Linux/Android BSP 开发调试,可接外包项目/技术支持/问题定位。有需求或交个朋友可加微信:【Chen_WeChat2026】。

更多原创技术文章:《README 2026》。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11807

    浏览量

    219508
  • 引脚
    +关注

    关注

    16

    文章

    2119

    浏览量

    55999
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    驱动之路#04:LCD 驱动程序分析(基于RK3576)

      题图:河北太行山脉,山头密密麻麻都被太阳能板覆盖了。 欢迎关注,每周更新!☞ 本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序      // 通用面板数据结构
    的头像 发表于 02-17 08:20 1w次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#04:LCD <b class='flag-5'>驱动</b>程序分析(基于RK3576)

    驱动之路#03:LCD 时序参数分析

      题图:浙江普陀山客运中心最近获得2021年度凡尔赛建筑奖。 欢迎关注,每周更新!☞ 本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序13 tvb: 垂直上宽/后肩
    的头像 发表于 02-10 08:27 1921次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#03:LCD 时序参数分析

    深入解析RK3568引脚控制核心:rk3568-pinctrl.dtsi文件的作用与实践(可应用rk全系列)

    在嵌入式 Linux 开发中,设备树(Device Tree) 是连接硬件与软件的关键桥梁,而针对 Rockchip RK3568 芯片的rk3568-pinctrl.dtsi文件,更是掌控芯片引脚
    的头像 发表于 02-05 14:01 1032次阅读
    深入解析RK3568<b class='flag-5'>引脚</b>控制核心:rk3568-<b class='flag-5'>pinctrl</b>.dtsi文件的作用与实践(可应用rk全系列)

    CD405xB系列多路复用器与解复用器的技术解析与应用探讨

    的CD4051B、CD4052B和CD4053B这三款CMOS单8通道模拟多路复用器或解复用器。 文件下载: cd4053b.pdf 1. 产品特性亮点 1.1 信号范围广泛 CD405xB系列能够处理宽范围的数字和模拟信号。数字信号范围从3V到
    的头像 发表于 01-16 14:10 362次阅读

    解析TS3DV520E:适用于DVI/HDMI应用的5通道差分10:20多路复用开关

    TS3DV520E是一款20位到10位的复用/解复用数字视频开关,配备单选择(SEL)输入,通过SEL引脚可控制复用/解
    的头像 发表于 01-14 16:15 446次阅读

    高速信号处理利器:TMUXHS4412 4通道 20Gbps差分2:1/1:2复用器/解复用器深度解析

    高速信号处理利器:TMUXHS4412 4通道 20Gbps差分2:1/1:2复用器/解复用器深度解析 在高速电子设计领域,信号的高效传输与处理一直是工程师们关注的焦点。今天,我们要深入探讨
    的头像 发表于 01-13 11:15 435次阅读

    ElfBoard技术贴|如何在【RK3588】ELF 2开发板上进行UART引脚复用配置

    IOMUX(引脚功能复用)是芯片厂商为高效利用有限硬件引脚资源而设计的关键技术,它允许单个物理引脚通过软件配置为多种不同的功能(如GPIO、UART、I2C等)。不同SoC芯片的配置方
    的头像 发表于 11-18 16:54 5686次阅读
    ElfBoard技术贴|如何在【RK3588】ELF 2开发板上进行UART<b class='flag-5'>引脚</b><b class='flag-5'>复用</b>配置

    2025玄奘之路20挑战赛,神眸AI智能影像实现全赛道守护实时直播

    玄奘之路20戈壁挑战赛2025年9月28日-10月4日在甘肃敦煌圆满完赛。5500余名来自全球近百所商学院、知名品牌企业的参赛者齐聚瓜洲。作为戈2AI智能影像战略合作伙伴,在茫茫戈壁无人区,200
    的头像 发表于 10-15 09:16 1024次阅读
    2025玄奘<b class='flag-5'>之路</b>戈<b class='flag-5'>20</b>挑战赛,神眸AI智能影像实现全赛道守护实时直播

    Texas Instruments TDP20MB421四通道DisplayPort 2.1再驱动器数据手册

    Texas Instruments TDP20MB421四通道 DisplayPort 2.1复用器是四通道线性复用器,集成2:1 MUX。这款低功耗、高性能线性再驱动器可支持 Dis
    的头像 发表于 07-23 14:16 889次阅读
    Texas Instruments TDP<b class='flag-5'>20</b>MB421四通道DisplayPort 2.1再<b class='flag-5'>驱动</b>器数据手册

    达实智能分享AI时代的心力驱动之路

    近日,由知名媒体IP《首席访谈》发起成立的企业决策人社群“首席朋友圈”走进达实智能,深入了解达实智能企业创新发展之路,共同探讨企业家的“心力驱动”实践。
    的头像 发表于 07-23 11:23 970次阅读

    Texas Instruments TUSB1021-Q1 10Gbps线性转接驱动器多路复用器和多路解复用器数据手册

    Texas Instruments TUSB1021-Q1 10Gbps线性转接驱动器多路复用器和解复用器是一款线性转接驱动器,具有1:2解复用
    的头像 发表于 07-16 09:47 947次阅读
    Texas Instruments TUSB1021-Q1 10Gbps线性转接<b class='flag-5'>驱动</b>器多路<b class='flag-5'>复用</b>器和多路解<b class='flag-5'>复用</b>器数据手册

    Texas Instruments TMUXHS4512 2:1多路复用器/1:2解复用器开关数据手册

    Texas Instruments TMUXHS4512 2:1多路复用器/1:2解复用器开关是与协议无关的高速双向无源开关,采用复用或解复用两种配置。这些开关具有低导通电阻和低I/O
    的头像 发表于 07-10 09:31 889次阅读
    Texas Instruments TMUXHS4512 2:1多路<b class='flag-5'>复用</b>器/1:2解<b class='flag-5'>复用</b>器开关数据手册

    STM32L433VCT6 LCD复用引脚如何分配?

    背景:使用STM32L433VCT6驱动段码屏,33个段,其中用到一个PC10引脚,使用STM32CubeMX配置,只配置了LCD复用功能,但是用于LCD_SEG40还是LCD_SEG28,没有指定。 数据手册: 问题:如何
    发表于 06-20 08:26

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验
    的头像 发表于 05-23 13:47 1189次阅读
    RK3568<b class='flag-5'>驱动</b>指南|第十二篇 GPIO子系统-第135章 GPIO子系统与<b class='flag-5'>pinctrl</b>子系统相结合实验

    迅为RK3568驱动指南GPIO子系统实战:实现动态切换引脚复用功能

    迅为RK3568驱动指南GPIO子系统实战:实现动态切换引脚复用功能
    的头像 发表于 05-22 14:27 2321次阅读
    迅为RK3568<b class='flag-5'>驱动</b>指南GPIO子系统实战:实现动态切换<b class='flag-5'>引脚</b><b class='flag-5'>复用</b>功能