十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

i2c/pmbus

i2c/pmbus 名词缩写pmbus初始化源码路径初始化代码pmbus框架流程流程图pmbus_driver_info结构体解析pmbus_sensor_classes结构体解析pmbus_init_commonPMBUS_STATUS_WORDPMBUS_CAPABILITYPMBUS_WRITE_PROTECTPMBUS_VOUT_MODEpmbus_find_attributespmbus_add_sensor函数pmbus_sensor_attr结构体解析voltage_attributesPMBUS_READ_VINPMBUS_VIRT_READ_VMONPMBUS_READ_VCAPPMBUS_READ_VOUTcurrent_attributesPMBUS_READ_IINPMBUS_READ_IOUTPMBUS_READ_TEMPERATURE_1/2/3PMBUS_STATUS_TEMPERATUREPMBUS_UT_WARN_LIMITPMBUS_UT_FAULT_LIMITPMBUS_OT_WARN_LIMITPMBUS_OT_FAULT_LIMITPMBUS_VIRT_READ_TEMP_MINPMBUS_VIRT_READ_TEMP_AVGPMBUS_VIRT_READ_TEMP_MAXPMBUS_VIRT_RESET_TEMP_HISTORYPMBUS_MFR_MAX_TEMP_1pmbus_init_debugfspec节点status节点statusx_vout节点statusx_iout节点statusx_input节点statusx_temp节点statusx_cml节点statusx_other节点statusx_mfr节点statusx_fan12节点statusx_fan34节点pmbus总结遥测监控故障与告警管理参数配置多相/多页管理pmbus在linux内核的实现名词缩写PMBus : Power Management BusPEC : Packet Error Checking是 PMBus 协议中用于检测数据传输错误的一种校验机制。它基于 SMBus 的 PEC 功能通过 CRC-8 算法为每个事务添加一个校验字节以提高总线通信的可靠性。SMBus : System Management Bus系统管理总线,是基于 I2C 协议发展而来的一种总线标准SMBALERT# : 从设备用于通知主机发生故障的硬件中断线。主机收到后读取状态寄存器确定故障类型并通过 ARAAlert Response Address警报响应地址 识别是哪个从设备触发了告警PAGE : PMBus 的逻辑寻址空间用于选择设备内的不同电源轨或输出通道。多页设备通过 PAGE 命令切换访问目标PHASE : 多相控制器中单个功率级Power Stage的标识。PHASE 命令设置相位地址需与 PAGE 配合使用用于读取特定相位的电流或温度Linear11L11: PMBus 定义的 16 位浮点格式用于非输出电压的遥测值电流、温度、输入电压等。公式X Y × 2^N其中 Y 为 11 位有符号尾数N 为 5 位有符号指数Linear16 / VOUT_MODE : 输出电压专用的数据格式由 VOUT_MODE 命令 决定。该 8 位寄存器的高 3 位定义模式线性/VID/直接低 5 位给出指数参数Direct Format : 自定义数据格式公式X (1/m) × (Y × 10^(-R) - b)。系数 m、b、R 通过 COEFFICIENTS 命令读取或从芯片手册获取。可表示宽范围值且读数与设定值精确对应CLEAR_FAULTS : 清除所有锁存状态位的命令。部分状态位也可通过向其写入 1b 单独清除RW1C 机制pmbus初始化源码路径kernel/drivers/hwmon/pmbus/pmbus_core.c初始化代码staticint__initpmbus_core_init(void){pmbus_debugfs_dirdebugfs_create_dir(pmbus,NULL);if(IS_ERR(pmbus_debugfs_dir))pmbus_debugfs_dirNULL;return0;}staticvoid__exitpmbus_core_exit(void){debugfs_remove_recursive(pmbus_debugfs_dir);}module_init(pmbus_core_init);module_exit(pmbus_core_exit);其核心作用PMBus 核心初始化时被创建通常挂载在 /sys/kernel/debug/pmbus/ 下导出状态寄存器它主要用于暴露 PMBus 设备的状态寄存器特别是对于那些多页multi-page设备用户空间直接通过 I2C 访问容易破坏 PMBus 内部的页计数逻辑而通过 debugfs 访问则安全得多按设备组织每个探测成功的 PMBus 设备都会在这个全局目录下创建一个以 hwmon 设备名命名的子目录避免了名称冲突.pmbus框架流程pmbus_driver_info结构体解析structpmbus_driver_info{intpages;/* Total number of pages */u8 phases[PMBUS_PAGES];/* Number of phases per page */enumpmbus_data_formatformat[PSC_NUM_CLASSES];enumvrm_versionvrm_version[PMBUS_PAGES];/* vrm version per page */intm[PSC_NUM_CLASSES];/* mantissa for direct data format */intb[PSC_NUM_CLASSES];/* offset */intR[PSC_NUM_CLASSES];/* exponent */u32 func[PMBUS_PAGES];/* Functionality, per page */u32 pfunc[PMBUS_PHASES];/* Functionality, per phase */int(*read_byte_data)(structi2c_client*client,intpage,intreg);int(*read_word_data)(structi2c_client*client,intpage,intphase,intreg);int(*write_word_data)(structi2c_client*client,intpage,intreg,u16 word);int(*write_byte)(structi2c_client*client,intpage,u8 value);int(*identify)(structi2c_client*client,structpmbus_driver_info*info);intnum_regulators;conststructregulator_desc*reg_desc;conststructattribute_group**groups;};pmbus_sensor_classes结构体解析enumpmbus_sensor_classes{PSC_VOLTAGE_IN0,PSC_VOLTAGE_OUT,PSC_CURRENT_IN,PSC_CURRENT_OUT,PSC_POWER,PSC_TEMPERATURE,PSC_FAN,PSC_PWM,PSC_NUM_CLASSES/* Number of power sensor classes */};其对应的解释如下:PSC_VOLTAGE_IN 输入电压。PSC_VOLTAGE_OUT 输出电压。PSC_CURRENT_IN 输入电流。PSC_CURRENT_OUT 输出电流。PSC_POWER 功率。PSC_TEMPERATURE 温度。PSC_FAN 风扇转速。PSC_PWM PWM 控制值流程图pmbus_init_common此函数主要作为是初始化并检测几个必须寄的存器状态。PMBUS_STATUS_WORDPMBUS_STATUS_WORD : 是 PMBus 协议中一个标准的 2 字节状态寄存器命令码 0x79用于提供设备整体状态的摘要信息,各个bit代表的信息发下:内核优 注意:内核会先使用 PMBUS_STATUS_WORD 来获取状态信息。但部分芯片不支持该命令核心会回退到 PMBUS_STATUS_BYTE。如果两者都不支持初始化会失败因为状态寄存器对芯片操作至关重要PMBUS_CAPABILITYPMBUS_CAPABILITY : 是 PMBus 协议中一个标准的只读命令命令码为 0x19。它的核心作用是让主机Host通过读取一个字节的数据来了解该 PMBus 设备所支持的关键通信能力.各个bit代表的信息发下:PMBUS_WRITE_PROTECTPMBUS_WRITE_PROTECT : 是 PMBus 协议中用于控制设备写保护状态的标准命令命令码 0x10. PMBus 核心驱动在初始化时会读取这个寄存器以判断设备是否处于写保护状态据此调整后续行为。各个bit位代表的含义如下PMBUS_VOUT_MODEPMBUS_VOUT_MODE : 是 PMBus 协议中用于定义输出电压相关数据格式的命令命令码为 0x20。它告诉主机如何解读芯片返回的电压值如 VOUT_COMMAND、READ_VOUT是线性格式Linear还是直接格式Direct等。各个bit位代表的含义如下pmbus_find_attributes此函数主要是添加各种属性为上层访问提供支持本函数只是将各种属性添加到属性数组。但不会在此函数里面产生device呈现这些属性下面将详细逻辑这些属性对应的寄存器含义pmbus_add_sensor函数大体调用流程为staticintpmbus_add_attribute(structpmbus_data*data,structattribute*attr){if(data-num_attributesdata-max_attributes-1){intnew_max_attrsdata-max_attributesPMBUS_ATTR_ALLOC_SIZE;void*new_attrsdevm_krealloc(data-dev,data-group.attrs,new_max_attrs*sizeof(void*),GFP_KERNEL);if(!new_attrs)return-ENOMEM;data-group.attrsnew_attrs;data-max_attributesnew_max_attrs;}data-group.attrs[data-num_attributes]attr;data-group.attrs[data-num_attributes]NULL;return0;}pmbus_sensor_attr结构体解析structpmbus_sensor_attr{u16 reg;/* sensor register */u16 gbit;/* generic status bit */u8 nlimit;/* # of limit registers */enumpmbus_sensor_classesclass;/* sensor class */constchar*label;/* sensor label */bool paged;/* true if paged sensor */bool update;/* true if update needed */bool compare;/* true if compare function needed */u32 func;/* sensor mask */u32 sfunc;/* sensor status mask */intsreg;/* status register */conststructpmbus_limit_attr*limit;/* limit registers */};voltage_attributesPMBUS_READ_VINPMBUS_READ_VIN : 一个标准的 PMBus 只读命令命令码 0x88用于读取电源或控制器测得的输入电压Input Voltage的原始数字值。返回的并不是直接的电压伏特数而是一个需要经过转换的 16 位原始数据。数据来源它返回的是芯片内部模数转换器ADC对输入电压引脚如 VBUS 或 VIN采样后的原始值转换方式要得到实际的电压值必须根据芯片配置的格式Format 和系Coefficients 来换算。常见的格式有线性格式Linear这是最常见的数据包含尾数和指数计算公式为 V 尾数 × 2^指数。直接格式Direct需要根据芯片手册提供的系数m, b, R进行换算公式通常为 V (1/m) × (原始值 × 10^R - b)PMBUS_VIRT_READ_VMONPMBUS_VIRT_READ_VMON 是 Linux PMBus 子系统定义的一个虚拟寄存器常量。它本身并非 PMBus 标准协议中的真实命令码而是内核为了统一暴露芯片上“非标准”或“辅助”电压传感器而引入的一个抽象标识。当 PMBus 芯片有一个额外的电压监测引脚例如辅助电压 VMON但其对应的寄存器命令码是厂商自定义的、不符合 PMBus 标准时内核驱动就会使用这个虚拟常量来“映射”该功能。其工作流程是声明能力驱动在 pmbus_driver_info.func[] 中设置 PMBUS_HAVE_VMON 标志告诉核心该芯片支持 VMON 属性。虚拟映射核心驱动看到这个标志后会生成对应的 hwmon sysfs 属性如 vmon1_input。驱动回填当用户空间读取该属性时核心驱动会向芯片驱动发起PMBUS_VIRT_READ_VMON 请求。芯片驱动在其 read_word_data 回调中将该虚拟请求重定向到芯片真实的非标准寄存器上。PMBUS_READ_VCAPPMBUS_READ_VCAP 是 PMBus 协议中一个标准的只读命令命令码 0x8A用于读取储能电容Energy Storage Capacitor两端的电压值。这个命令专为那些带有储能电容的电源设备设计。PMBUS_READ_VOUTPMBUS_READ_VOUT 是 PMBus 协议中一个标准的只读命令命令码为 0x8B用于读取芯片测得的实际输出电压值。current_attributesPMBUS_READ_IINPMBUS_READ_IIN : 是 PMBus 协议中一个标准的只读命令命令码为 0x89用于读取芯片测得的输入电流Input Current 值PMBUS_READ_IOUTPMBUS_READ_IOUT : 是 PMBus 协议中的一个标准只读命令命令码为 0x8C用于读取芯片测得的输出电流Output Current 值power_attributesPMBUS_READ_PINPMBUS_READ_PIN : 是 PMBus 协议中的一个标准只读命令命令码为 0x97用于读取芯片测得的输入功率Input Power 值PMBUS_READ_POUTPMBUS_READ_POUT 是 PMBus 协议中的一个标准只读命令命令码为 0x96用于读取芯片测得的输出功率Output Power 值temp_attributesPMBUS_READ_TEMPERATURE_1/2/3PMBUS_READ_TEMPERATURE_1/2/3 是 PMBus 协议中三个独立的标准只读命令命令码分别为 0x8D、0x8E、0x8F用于读取芯片不同位置的温度测量值EAD_TEMPERATURE_1 (0x8D)通常用于读取芯片内部Die温度或主功率级温度。READ_TEMPERATURE_2 (0x8E)通常用于读取外部温度传感器或第二路温度。READ_TEMPERATURE_3 (0x8F)通常用于读取第二路外部温度或第三路温度。PMBUS_STATUS_TEMPERATUREPMBUS_STATUS_TEMPERATURE 是 PMBus 协议中一个标准的只读命令命令码为 0x7D用于报告与温度相关的故障和警告标志各个bit信息如下PMBUS_UT_WARN_LIMITPMBUS_UT_WARN_LIMIT 是 PMBus 协议中用于设置欠温警告阈值的标准命令命令码为 0x52。当设备温度低于该阈值时芯片会触发欠温警告PMBUS_UT_FAULT_LIMITPMBUS_UT_FAULT_LIMIT 是 PMBus 协议中用于设置欠温故障Under-Temperature Fault 阈值的标准命令命令码为 0x53。当设备温度低于该阈值时芯片会触发欠温故障。当温度低于 UT_FAULT_LIMIT 时芯片会设置 STATUS_TEMPERATURE 寄存器中的 UTFUndertemperature Fault位并通过 SMBALERT# 通知主机PMBUS_OT_WARN_LIMITPMBUS_OT_WARN_LIMIT 是 PMBus 协议中用于设置过温警告Over-Temperature Warning 阈值的标准命令命令码为 0x51。当设备温度超过该阈值时芯片会触发过温警告。当温度超过 OT_WARN_LIMIT 时芯片会执行以下动作设置 STATUS_BYTE 中的 TEMP 位设置 STATUS_TEMPERATURE 寄存器中的 OTW 位通过 SMBALERT# 通知主机PMBUS_OT_FAULT_LIMITPMBUS_OT_FAULT_LIMIT 是 PMBus 协议中用于设置过温故障Over-Temperature Fault 阈值的标准命令命令码为 0x4F。当设备温度超过该阈值时芯片会触发过温故障。当温度超过 OT_FAULT_LIMIT 时芯片会执行以下动作设置 STATUS_TEMPERATURE 寄存器中的 OTFOvertemperature Fault位通过 SMBALERT# 通知主机PMBUS_VIRT_READ_TEMP_MINPMBUS_VIRT_READ_TEMP_MIN 是 PMBus 驱动中的一个虚拟寄存器用于读取温度传感器记录的历史最低温度值。PMBUS_VIRT_READ_TEMP_AVGPMBUS_VIRT_READ_TEMP_AVG 是 PMBus 驱动中的一个虚拟寄存器用于读取温度传感器记录的历史平均温度值。PMBUS_VIRT_READ_TEMP_MAXPMBUS_VIRT_READ_TEMP_MAX 是 PMBus 驱动中的一个虚拟寄存器用于读取温度传感器记录的历史最高温度值峰值温度。PMBUS_VIRT_RESET_TEMP_HISTORYPMBUS_VIRT_RESET_TEMP_HISTORY 是 PMBus 驱动中的一个虚拟寄存器用于清除温度传感器记录的历史极值最低/最高/平均温度。PMBUS_MFR_MAX_TEMP_1PMBUS_MFR_MAX_TEMP_1 是 PMBus 协议中一个厂商自定义MFR命令命令码为 0xC0用于读取或设置温度传感器的额定最高温度Temperature Ratingdevm_hwmon_device_register_with_groups这个函数是hwmon子系统的标准函数主要作用就是生成hwmon设备并将上述添加的各种属性在设备路径下以属性节点的形式呈现也就是上面pmbus添加的各种属性都是在这里进行的最后一步这里具体的实现可以看hwmon子系统就不专门展开了。pmbus_init_debugfspec节点对应着PMBUS_CAPABILITY寄存器上面有介绍过这个寄存器status节点对应着PMBUS_STATUS_WORD寄存ab器上面有介绍过这个寄存器statusx_vout节点对应着PMBUS_STATUS_VOUT寄存器,其是 PMBus 协议中用于报告输出电压VOUT相关故障和警告的标准只读命令命令码为 0x7A。statusx_iout节点对应着PMBUS_STATUS_IOUT寄存器,其 是 PMBus 协议中用于报告输出电流IOUT相关故障和警告的标准只读命令命令码为 0x7B。它返回一个字节通过位标志指示过流或欠流事件。### statusx_input节点对应着PMBUS_STATUS_INPUT寄存器其是 PMBus 协议中用于报告输入电压、电流及功率相关故障和警告的标准只读命令命令码为 0x7C。它返回一个字节通过位标志汇总输入侧的状态statusx_temp对应着PMBUS_STATUS_TEMPERATURE寄存器上面已经有过介绍statusx_cml对应着PMBUS_STATUS_CML 寄存器其是 PMBus 协议中用于报告通信、逻辑和存储器Communication, Logic, and Memory 相关故障的标准只读命令命令码为 0x7E。它是判断总线通信是否健康的关键寄存器。statusx_other对应着PMBUS_STATUS_OTHER寄存器其是 PMBus 协议中用于报告“其他”类型故障的标准只读命令命令码为 0x7F。它主要承载与 SMBus AlertSMBALERT#相关的状态信息statusx_mfr对应着PMBUS_STATUS_MFR_SPECIFIC寄存器其是 PMBus 协议中一个厂商自定义状态寄存器命令码为 0x80。它的位定义完全由芯片制造商自行决定因此不同芯片的含义差异很大。statusx_fan12对应着PMBUS_STATUS_FAN_12寄存器其是 PMBus 协议中用于报告风扇 1 和风扇 2 状态的标准只读命令命令码为 0x81。它返回一个字节其位定义是固定的。statusx_fan34对应着PMBUS_STATUS_FAN_34寄存器其是 PMBus 协议中用于报告风扇 3 和风扇 4 状态的标准只读命令命令码为 0x82。它的结构与 STATUS_FAN_12 完全对称只是目标风扇编号不同pmbus总结通过上述逻辑的代码概括其核心作用如下1. 遥测监控常用的基本功能如下2. 故障与告警管理PMBus 定义了一套完整的状态寄存器体系STATUS_WORD、STATUS_VOUT、STATUS_IOUT、STATUS_TEMPERATURE 等任何故障或警告都会被锁存到对应位并通过 SMBALERT# 硬件中断线主动通知主机。这使得系统能快速定位电源异常3.参数配置主机可以动态调整电源设备的工作参数设置输出电压/电流的上下限阈值配置过压/欠压/过温的保护点设置上电时序和斜率调整开关频率、相位数量等4. 多相/多页管理现代高性能电源常采用多相Multi-phase拓扑。PMBus 通过页Page 和相位Phase 机制让主机能够分别访问每个输出通道和每个功率级的数据。5.pmbus在linux内核的实现
返回列表