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

答案是:绝对不能随便写!它直接决定驱动对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 触摸驱动程序?
驱动之路#21:一行 reset-gpios,驱动为何就能用 GPIO?
驱动之路#20:Pinctrl 在手,引脚复用很顺手
伺服驱动器增益参数的调整方法
云台电机驱动系统载波参数配置与调试
驱动之路#04:LCD 驱动程序分析(基于RK3576)
驱动之路#03:LCD 时序参数分析
【瑞萨FPB-RA6E2试用】【瑞萨RA × Zephyr开发板评测】FPB-RAE62 SPI驱动 SSD1306显示花屏问题解决
电子工程师必备:SN65LVDS22和SN65LVDM22的技术解析
深入解析RL78/G22微控制器:特性、电气参数与应用要点
揭秘RESET复位键:引脚设计如何支撑硬件系统的重启通路
驱动之路#22:reset-gpios参数能随便写吗?
评论