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

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

3天内不再提示

驱动之路#22:reset-gpios参数能随便写吗?

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

扫码添加小助手

加入工程师交流群

正文

刚开始在配置reset-gpios = <&gpio2 RK_PB4 GPIO_ACTIVE_HIGH>时,我会疑惑:GPIO_ACTIVE_HIGH只是个“标记”吗?能不能随便写成GPIO_ACTIVE_LOW,或者干脆不写?

wKgZO2nm0MKAbQaoAABMSDI-XDs564.png

答案是:绝对不能随便写!它直接决定驱动对GPIO的控制逻辑,写错会导致设备功能异常

GPIO_ACTIVE_HIGH不是“随便的标记”

GPIO_ACTIVE_HIGH(或GPIO_ACTIVE_LOW)是Linux设备树中定义的GPIO有效电平标识,本质是告诉内核和驱动:这个GPIO在什么电平状态下代表“有效”(比如复位触发、使能激活)

  • GPIO_ACTIVE_HIGH:高电平有效;
  • GPIO_ACTIVE_LOW:低电平有效。

它不是“可有可无的参数”,而是DTS与驱动之间的**“约定规则”**——驱动会根据这个标识,决定如何控制GPIO电平,实现对应的硬件功能。

决定驱动的控制逻辑

驱动在获取reset-gpios对应的GPIO后,会严格遵循GPIO_ACTIVE_HIGH/LOW的约定来操作GPIO,具体影响体现在3个方面:

1. 驱动对“有效状态”的判断逻辑

驱动中通常会用“逻辑值1代表有效,0代表无效”来编写代码,而GPIO_ACTIVE_HIGH/LOW会决定“逻辑值1”对应实际的高电平还是低电平。

大致过程是这样的:GPIO_ACTIVE_HIGH/LOW会被内核解析并存储在gpio_desc中,驱动调用 gpiod_set_value() 时:若配置为GPIO_ACTIVE_HIGH,驱动传入1则内核设置 GPIO 为高电平,传入0为低电平;若配置为GPIO_ACTIVE_LOW,驱动传入1则内核自动设置为低电平(有效电平),传入0为高电平。驱动无需关心 “有效电平是高还是低”,只需按 “逻辑值”(1 = 有效,0 = 无效)调用接口,内核会自动完成电平转换。换言之,gpiod_set_value() 设置的是“逻辑值”而非“物理值”。

简单说:驱动只关心“逻辑上是否有效”,而GPIO_ACTIVE_HIGH/LOW会把“逻辑有效”转换成“实际电平”,驱动无需硬编码电平高低,实现了“逻辑与硬件的解耦”。

2. 驱动对GPIO初始状态的设置

驱动在申请GPIO时,会结合GPIO_ACTIVE_HIGH/LOW设置初始电平,避免设备上电后处于异常状态:

比如某设备要求“复位引脚默认拉高(无效),需要复位时拉低(有效)”,若DTS配置reset-gpios = <&gpio2 RK_PB4 GPIO_ACTIVE_LOW>,驱动申请GPIO时会:

#GPIOD_OUT_HIGH → 初始输出高电平(无效状态),符合设备要求reset_gpio= devm_gpiod_get(dev,"reset", GPIOD_OUT_HIGH);

若误将DTS写成GPIO_ACTIVE_HIGH,驱动会初始输出低电平(有效状态),导致设备上电后一直处于复位状态,无法正常启动。

3. 驱动对中断触发方式的适配(若GPIO用作中断)

如果GPIO不仅是复位控制,还兼作中断引脚(比如设备复位完成后触发中断),GPIO_ACTIVE_HIGH/LOW会影响驱动对中断触发边沿的配置:

  • GPIO_ACTIVE_HIGH→ 驱动可能配置“上升沿触发中断”(有效电平到来时触发);
  • GPIO_ACTIVE_LOW→ 驱动可能配置“下降沿触发中断”。

写错会导致中断无法触发,驱动收不到设备的状态反馈。

写错有什么后果?

GPIO_ACTIVE_HIGH/LOW配置错误,不是“小问题”,而是会直接导致设备故障,常见后果有3种:

1. 设备无法正常复位/启动

比如某设备的复位逻辑是“低电平复位,高电平工作”(即GPIO_ACTIVE_LOW),若DTS写成GPIO_ACTIVE_HIGH

  • 驱动触发复位时会输出高电平 → 设备无法进入复位状态;
  • 驱动释放复位时输出低电平 → 设备一直被复位,无法启动。

2. 设备功能异常

比如某传感器的使能引脚是“高电平使能(GPIO_ACTIVE_HIGH)”,若DTS写成GPIO_ACTIVE_LOW

  • 驱动想“使能传感器”(逻辑值1)→ 实际输出低电平 → 传感器未被使能,无法采集数据;
  • 驱动想“关闭传感器”(逻辑值0)→ 实际输出高电平 → 传感器一直工作,耗电增加甚至数据错乱。

3. 硬件损坏(极端情况)

部分设备对复位/使能电平的时序和极性要求严格,比如电源芯片的使能引脚若长期处于错误电平,可能导致芯片过流、烧毁;电机驱动的使能引脚错误,可能导致电机误启动,引发机械故障。

如何正确配置?

GPIO_ACTIVE_HIGH/LOW的配置不能凭“感觉”,必须严格匹配硬件手册和设备逻辑,步骤如下:

1. 查硬件手册:确认设备的有效电平

这是最核心的一步!打开设备的datasheet(比如传感器、芯片的手册),找到复位/使能引脚的描述:

  • 比如手册写“Reset pin: Active Low” → 必须配置GPIO_ACTIVE_LOW
  • 若写“Enable pin: High level enable” → 配置GPIO_ACTIVE_HIGH

2. 确认GPIO与设备的电路连接

即使设备手册要求“低电平复位”,若硬件电路中GPIO与设备复位引脚之间加了反向器(比如GPIO输出高电平时,设备复位引脚实际是低电平),则需反向配置:

  • 设备要求低电平复位 + 反向器 → DTS配置GPIO_ACTIVE_HIGH(GPIO拉高=设备复位)。

3. 驱动中验证:通过接口读取有效电平配置

驱动中可通过gpiod_is_active_low()接口,验证DTS配置的有效电平是否正确:

if(gpiod_is_active_low(reset_gpio)) {  dev_info(dev,"Reset GPIO is active lown");}else{  dev_info(dev,"Reset GPIO is active highn");}

若打印信息与硬件逻辑不符,说明DTS配置错误,需修正。

总结

GPIO_ACTIVE_HIGH不是“随便填的参数”,而是DTS、驱动、硬件三者之间的“电平约定”

  • 对DTS来说,它是硬件逻辑的“文字描述”;
  • 对驱动来说,它是控制GPIO的“逻辑依据”;
  • 对硬件来说,它是确保功能正常的“电平规则”。

(完)


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

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

    关注

    5209

    文章

    20678

    浏览量

    337188
  • 驱动
    +关注

    关注

    12

    文章

    1994

    浏览量

    88714
  • GPIO
    +关注

    关注

    16

    文章

    1334

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何在 Yocto 中集成由 HID 设备控制的 I2C 触摸驱动程序?

    ;amp;ft260_gpio>; 中断 = IRQ_TYPE_EDGE_FALLING>; reset-gpios = <&ft260_gpio 2 GPIO_ACTIVE_LOW>; 状态 = “ok”; }; };
    发表于 04-23 07:22

    驱动之路#21:一行 reset-gpios驱动为何就能用 GPIO?

    这行代码不是给 CPU 看的,而是给内核和驱动的 “约定说明书”,每一部分都有明确含义: reset-gpios:是 “属性名”,遵循 Linux 设备树的 GPIO 属性命名规范(后缀-gpios
    的头像 发表于 04-14 09:20 5833次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#21:一行 <b class='flag-5'>reset-gpios</b>,<b class='flag-5'>驱动</b>为何就能用 GPIO?

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

     欢迎关注,每周更新!☞ 本合集分享的是,我当初学习Linux驱动的来时路——《《驱动之路》开篇:自序pinctrl节点下(rk3576-pinctrl.dtsi),定义具体的引脚配置(复用
    的头像 发表于 04-07 21:18 487次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#20:Pinctrl 在手,引脚复用很顺手

    伺服驱动器增益参数的调整方法

    。   方法一:高效便捷的自动调整 这是现代伺服驱动器的首选入门方法。调整工具会分析负载特性,自动计算并设定最佳参数应对多数常规负载,省时省力。部分先进驱动器还支持更智能的方式:
    的头像 发表于 03-19 12:10 432次阅读

    云台电机驱动系统载波参数配置与调试

    载波参数是云台电机驱动板 系统的核心控制变量,其配置合理性直接影响电机运行平滑性、定位精度、噪声水平与效表现。本文针对永磁同步电机(PMSM)与无刷直流电机(BLDC)云台驱动场景,
    的头像 发表于 03-06 15:11 344次阅读

    驱动之路#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 2593次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>之路</b>#03:LCD 时序<b class='flag-5'>参数</b>分析

    【瑞萨FPB-RA6E2试用】【瑞萨RA × Zephyr开发板评测】FPB-RAE62 SPI驱动 SSD1306显示花屏问题解决

    ;ioport1 10 GPIO_ACTIVE_HIGH>; reset-gpios = <&ioport2 8 GPIO_ACTIVE_LOW>
    发表于 01-16 20:10

    电子工程师必备:SN65LVDS22和SN65LVDM22的技术解析

    SN65LVDS22和SN65LVDM22是采用LVDS技术的差分线路驱动器和接收器,能够实现高达400 Mbps的信号传输速率。通过复用器控
    的头像 发表于 01-04 10:55 319次阅读

    深入解析RL78/G22微控制器:特性、电气参数与应用要点

    深入解析RL78/G22微控制器:特性、电气参数与应用要点 一、引言 在当今的电子设计领域,微控制器的性能和特性对于产品的成功至关重要。Renesas的RL78/G22微控制器以其超低功耗、丰富
    的头像 发表于 12-29 15:15 496次阅读

    揭秘RESET复位键:引脚设计如何支撑硬件系统的重启通路

    协同:复位引脚需明确电平阈值、响应时长等参数,同时与电源模块、芯片组的引脚形成稳定通路,确保复位信号精准传递至CPU、PCI插槽等关键组件,避免因信号干扰或延迟导致复位失败,保障硬件系统的稳定性与可恢复性。 这个小小的引
    的头像 发表于 11-28 15:18 492次阅读
    揭秘<b class='flag-5'>RESET</b>复位键:引脚设计如何支撑硬件系统的重启通路

    RGB接口的RESET的接法

    图片接口定义的RESET脚到底要不要接?怎么接?求大神解答
    发表于 09-26 12:08

    FLASH烧/编程白皮书

    白皮书:如何烧Flash——不同场景不同需求下的选择认识Flash NAND vs. NOR如何烧/编程不同方案比较
    发表于 07-28 16:05 0次下载

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

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

    CYW20704数据表中的 VDDC RESET 是否指的是 RST_N?

    你好 IFX, 数据表中的 VDDC RESET 是否指的是 RST_N?
    发表于 07-07 07:43