news 2026/8/27 12:48:18

OpenBMC:GPIO 控制与状态建模

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenBMC:GPIO 控制与状态建模

OpenBMC:GPIO 控制与状态建模

1. GPIO 在 OpenBMC 中的作用

BMC 通过 GPIO 获取硬件状态或控制外部设备。常见信号包括:

  • 电源按键和复位按键
  • Power Good
  • 电源模块、风扇和扩展板在位状态
  • 主机启动状态
  • 故障告警
  • 机箱入侵
  • LED 控制
  • 芯片复位和使能

完整链路为:

硬件 GPIO 信号 ↓ GPIO 控制器 ↓ Linux gpiolib ↓ GPIO 使用者或监控服务 ↓ D-Bus 状态对象 ↓ Redfish / IPMI / WebUI

2. Linux GPIO 模型

Linux 使用 GPIO Controller 和 GPIO Line 描述 GPIO。

GPIO Controller ├── GPIO Line 0 ├── GPIO Line 1 ├── GPIO Line 2 └── GPIO Line N

GPIO 驱动向内核注册gpiochip,其他驱动通过 GPIO Descriptor 使用具体信号。

新代码通常使用 Descriptor 接口:

gpiod_get() gpiod_set_value() gpiod_get_value()

用户空间推荐通过libgpiod使用 GPIO。旧版 sysfs GPIO 接口已不适合作为新平台的首选方案。


3. 设备树中的 GPIO 描述

设备树需要描述 GPIO 控制器、引脚编号和有效电平。

power-controller { compatible = "example,power-controller"; power-button-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; reset-button-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>; power-good-gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>; };

其中:

&gpio0 GPIO 控制器 10、11、12 GPIO Line 编号 GPIO_ACTIVE_LOW 低电平有效 GPIO_ACTIVE_HIGH 高电平有效

驱动按照逻辑值使用 GPIO,不需要再次硬编码有效电平。

GPIO 还可以通过gpio-line-names定义具有硬件含义的名称:

&gpio0 { gpio-line-names = "POWER_BUTTON", "RESET_BUTTON", "POWER_GOOD", "FAN0_PRESENT"; };

4. 输入和输出控制

GPIO 输入

输入 GPIO 用于读取硬件状态:

Power Good 风扇在位 电源模块在位 故障告警 机箱入侵

状态变化可以通过轮询或中断检测:

GPIO 电平变化 ↓ GPIO 中断 ↓ 内核或用户空间服务接收事件 ↓ 更新 D-Bus 属性

GPIO 输出

输出 GPIO用于:

模拟电源按键 触发主机复位 控制设备复位 使能电源 控制 LED

控制链路如下:

Redfish / IPMI 请求 ↓ OpenBMC 控制服务 ↓ GPIO Descriptor ↓ GPIO 控制器 ↓ 硬件信号变化

对于脉冲信号,还需要定义有效时间和释放顺序。


5. GPIO 状态建模

OpenBMC 通常不会把 GPIO 编号直接暴露给 Redfish,而是将其转换为带有业务含义的 D-Bus 状态。

例如:

GPIO FAN0_PRESENT = 有效 ↓ Inventory.Present = true ↓ Redfish State = Enabled

其他常见映射包括:

GPIO 含义D-Bus 建模
Power GoodChassis PowerState
风扇在位Inventory Item Present
故障信号OperationalStatus Functional
机箱入侵Chassis Intrusion Status
电源模块在位PSU Inventory Present

不同平台可能由 GPIO 监控服务、电源控制服务、风扇服务或平台定制服务完成状态转换。


6. GPIO 事件处理

输入信号可能发生抖动,不能在首次电平变化时立即认定状态已经改变。

常见处理流程:

检测 GPIO 边沿 ↓ 启动防抖定时器 ↓ 再次读取 GPIO ↓ 确认稳定状态 ↓ 更新 D-Bus ↓ 按需生成事件日志

GPIO 状态建模还需要明确:

  • 上升沿或下降沿触发
  • 有效电平
  • 防抖时间
  • BMC 启动时的初始值
  • 主机关机后是否仍然有效
  • 信号丢失时的默认状态

7. 总结

OpenBMC GPIO 适配包含三个层次:

设备树:描述 GPIO 连接和有效电平 内核驱动:提供统一 GPIO 接口 用户空间:将 GPIO 转换为设备状态和控制动作

GPIO 编号属于底层实现,D-Bus 和 Redfish 应使用电源、在位、故障等业务语义描述硬件状态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 12:47:21

选择困难症的面试官也就只能是我了

前言 首先声明&#xff0c;本人不是什么大牛&#xff0c;没有多牛逼的技术&#xff0c;只是公司扩招团队&#xff0c;然后我的那个面试官朋友有点破事没时间面试&#xff0c;就让我帮忙面试。我对面试这种事情本身自己就很讨厌&#xff0c;是的&#xff1b;我觉得没人会喜欢面试…

作者头像 李华
网站建设 2026/8/27 12:42:18

【单片机课设毕设项目】基于矩阵键盘输入的单片机蓝牙智能开锁装置设计 软硬件结合的单片机蓝牙密码门禁权限管理系统设计(025804)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/8/27 12:41:23

【单片机课程设计/毕业设计】基于 STM32/51 单片机的噪声实时检测与 LCD 显示系统设计 基于 STM32/51 单片机的可调阈值噪声声光预警设备设计(025704)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机&#xff0c;Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/8/27 12:40:57

最可怕的是,那些同级Android程序员比你还努力啊

前言 有人说这几年是计算机寒冬&#xff1b; 有人说金九银十没有了只剩下铜三铁四&#xff1b; 还有人是今年市场环境就是依托答辩&#xff1b;更多的人愁容满面担心被裁。 最近总能听到身边的程序员朋友离职的消息&#xff0c;有2&#xff0c;3年的初级程序员&#xff0c;也有…

作者头像 李华
网站建设 2026/8/27 12:40:46

openeuler22.09安装samba设置共享文件

openeuler22.09安装及配置SAMBA 共享 确认软件源是否安装成功 dnf search samba安装samba服务&#xff0c;及其相关组件 dnf -y install samba samba-common samba-client启动samba服务&#xff0c;并设置为开机启动 systemctl start smb; systemctl enable smb查看samba运行状…

作者头像 李华
网站建设 2026/8/27 12:40:08

请收下这些Kotlin开发必知必会的编码实践方式

任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员编写出人类可以理解的代码。— 马丁福勒 目前来说&#xff0c;作为Kotlin开发者想必对一些常见的比较优秀的编程实践方式已经耳熟能详了吧&#xff1b;下面让我们&#xff0c;一起来巩固下日常开发中常见的Kotlin编码实践…

作者头像 李华