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

答案是:绝对不能随便写!它直接决定驱动对GPIO的控制逻辑,写错会导致设备功能异常。
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代表有效,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会把“逻辑有效”转换成“实际电平”,驱动无需硬编码电平高低,实现了“逻辑与硬件的解耦”。
驱动在申请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,驱动会初始输出低电平(有效状态),导致设备上电后一直处于复位状态,无法正常启动。
如果GPIO不仅是复位控制,还兼作中断引脚(比如设备复位完成后触发中断),GPIO_ACTIVE_HIGH/LOW会影响驱动对中断触发边沿的配置:
GPIO_ACTIVE_HIGH → 驱动可能配置“上升沿触发中断”(有效电平到来时触发);GPIO_ACTIVE_LOW → 驱动可能配置“下降沿触发中断”。写错会导致中断无法触发,驱动收不到设备的状态反馈。
GPIO_ACTIVE_HIGH/LOW配置错误,不是“小问题”,而是会直接导致设备故障,常见后果有3种:
比如某设备的复位逻辑是“低电平复位,高电平工作”(即GPIO_ACTIVE_LOW),若DTS写成GPIO_ACTIVE_HIGH:
比如某传感器的使能引脚是“高电平使能(GPIO_ACTIVE_HIGH)”,若DTS写成GPIO_ACTIVE_LOW:
部分设备对复位/使能电平的时序和极性要求严格,比如电源芯片的使能引脚若长期处于错误电平,可能导致芯片过流、烧毁;电机驱动的使能引脚错误,可能导致电机误启动,引发机械故障。
GPIO_ACTIVE_HIGH/LOW的配置不能凭“感觉”,必须严格匹配硬件手册和设备逻辑,步骤如下:
这是最核心的一步!打开设备的datasheet(比如传感器、芯片的手册),找到复位/使能引脚的描述:
GPIO_ACTIVE_LOW;GPIO_ACTIVE_HIGH。
即使设备手册要求“低电平复位”,若硬件电路中GPIO与设备复位引脚之间加了反向器(比如GPIO输出高电平时,设备复位引脚实际是低电平),则需反向配置:
GPIO_ACTIVE_HIGH(GPIO拉高=设备复位)。
驱动中可通过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、驱动、硬件三者之间的“电平约定”。
(完)
本人专注 Linux 驱动 & Linux/Android BSP 开发调试,可接外包项目/技术支持/问题定位。有需求或交个朋友可加微信:【Chen_WeChat2025】。
全部0条评论
快来发表一下你的评论吧 !