Linux内核v6.6中如何替代of_get_named_gpio_flags设置GPIO电平
替代
of_get_named_gpio_flags实现GPIO初始电平配置(Linux内核v6.6) Linux内核v6.6中,旧的of_get_named_gpio系列API已被基于gpio_desc的新接口取代,要实现从设备树读取GPIO并按配置设置初始电平,可按以下方式处理:
1. 使用gpiod_get_index()获取GPIO描述符
gpiod_get_index可以一次性完成GPIO描述符的获取,并自动解析设备树中的标志配置,替代原有的of_get_named_gpio和of_get_named_gpio_flags组合。示例代码:
struct gpio_desc *gpiod; // 按设备树配置获取GPIO并应用初始电平 gpiod = gpiod_get_index(np, "my-gpio", 0, GPIOD_ASIS); if (IS_ERR(gpiod)) { // 错误处理,返回对应错误码 return PTR_ERR(gpiod); }
2. 设备树参数对应关系
你的设备树定义my-gpio = <&gpio4 20 0>;中,第三个数值0对应GPIO的极性标志:
0代表GPIO_ACTIVE_HIGH,初始电平为高- 若为
1则代表GPIO_ACTIVE_LOW,初始电平为低
3. 手动控制电平的写法
如果需要显式获取标志并设置电平,可先以GPIOD_ASIS获取描述符,再提取标志:
struct gpio_desc *gpiod; enum gpiod_flags flags; gpiod = gpiod_get_index(np, "my-gpio", 0, GPIOD_ASIS); if (IS_ERR(gpiod)) { return PTR_ERR(gpiod); } flags = gpiod_get_flags(gpiod); // 根据标志设置电平,例如判断是否为ACTIVE_HIGH后调用gpiod_set_value gpiod_set_value(gpiod, !(flags & GPIOD_FLAGS_ACTIVE_LOW));
注意事项
- 使用完毕后需调用
gpiod_put(gpiod)释放GPIO资源 - 新的
gpiod接口支持GPIO动态管理与上下文跟踪,安全性优于旧的gpio_*系列函数,建议全面替换
内容的提问来源于stack exchange,提问作者Chris Liu
相关产品推荐
相关产品推荐

