Linux hwmon 子系统分析之三 新版本hwmon子系统说明

      上一篇文章我们实现了一个模拟的hwmon device,且针对该hwmon device的属性访问操作均是借助sysfs file(我们创建了4个通道温度的sysfs文件temp1_input、temp2_input…),而sysfs file则是我们的虚拟驱动程序借助我们创建device_attribute实现的,然后进行了hwmon_device的注册,相对而言hwmon子系统倒没有提供太多的帮助,而在linux 4.x的版本(4.14已经支持)中,则对hwmon子系统中进行了丰富,针对temp、fan、power、curr等设备的属性访问进行了整合,针对上一篇文章创建的虚拟hwmon device,若使用新的hwmon子系统接口,则无需我们创建device_attribute及其对应的show/store访问接口,只需要实现hwmon_ops接口即可。下面我们分析下新版本的hwmon子系统。本篇文章的内容如下:

一、新版hwmon子系统内容介绍

二、基于新版hwmon子系统的hwmon device实现

 

 

新版hwmon子系统内容介绍

     在linux4.x版本(应该是4.4以后),hwmon子系统的内容渐渐丰富起来,而不再只做对device_register的包裹,其提供了通用硬件监控参数的抽象,主要提供了接口hwmon_attr_show、hwmon_attr_store,同时抽象了针对温度芯片、风扇芯片、电源芯片等硬件监控芯片相关参数的支持,即温度芯片、风扇芯片、电源芯片等硬件监控芯片相关参数的访问接口,均会在接口hwmon_attr_show、hwmon_attr_store中被统一调用,而温度芯片、风扇芯片、电源芯片等硬件监控芯片只需要实现hwmon_ops类型函数指针即可。调用关系如下所示,其中,HWMON子系统层则为hwmon子层抽象的部分,而最下层则由具体的hwmon 设备驱动实现即可。如下即是新版hwmon子系统的框架图。其中hwmon子系统提供统一的创建device_attribute操作,且提供相应的访问接口(hwmon_attr_store、hwmon_attr_show),而具体的hwmon device driver则只需要提供struct hwmon_ops类型的变量即可,基于新版的hwmon子系统,基于各硬件芯片的属性做了定义与抽象,并提供抽象层,至此hwmon子系统总算对得起“hwmon子系统”的称号了。

 

 

相关数据结构说明

        针对新版hwmon,多了如下几个数据结构(struct hwmon_chip_info、struct hwmon_ops、hwmon_channel_info),主要为了让hwmon子系统可通过hwmon device driver传递的hwmon_device->chip变量,创建对应的属性文件,以便应用程序可通过该sysfs 属性文件访问hwmon monitor。

如下即为hwmon子系统相关数据结构的关联图,下面我们详细说明:

  1. hwmon_chip_info数据结构用于描述hwmon device driver传递的芯片参数,该芯片参数包括支持哪些设备类型(temp、fan、power等)、每一个设备类型支持访问的属性参数(如针对温度传感器,包括temp_input、temp_max、temp__min、temp_max_alarm、temp_min_alarm等);
  2. hwmon_ops表示该hwmon device driver提供的读写接口,主要供hwmon_attr_store、hwmon_attr_show调用;
  3. struct hwmon_channel_info 表示hwmon monitor的一个通道的参数信息,包括该通道的监控类型(temp、fan、power等)、该通道支持的属性参数(如针对温度传感器,包括temp_input、temp_max、temp__min、temp_max_alarm、temp_min_alarm等);同时也提供了该通道的通道号;
  4. 上述所说的hwmon_chip_info、hwmon_ops、hwmon_channel_info主要由hwmon device driver实现,用于说明该hwmon device 支持的通道数、每一个通道的属性参数等;
  5. 而hwmon 子系统的hwmon_device_register_with_info/devm_hwmon_device_register_with_info接口,在完成hwmon device注册的过程中,则根据hwmon device driver设定的通道数、通道属性参数,创建对应hwmon_device_attribute,从而完成针对每一个属性参数创建文件的功能(sysfs 文件的创建由sysfs实现,有兴趣的读者可参考我之前写的sysfs以及设备驱动模型的文章);
  6. 若hwmon device driver没有设置hwmon_chip_info,则仍可以由hwmon device driver自行实现device_attribute;若hwmon device driver设置hwmon_chip_info,则hwmon子系统创建的attribute则是在hwmon_device->groups[0]。下图是按照hwmon device driver设置了hwmon_chip_info类型变量。

 

 

 

      针对新版的hwmon,只要熟悉了上述两个图,基本上也就知道了hwmon子系统的实现逻辑,而devm_hwmon_device_register_with_info接口主要用于实现上述的数据结构间的关联图,此处不再细述。(如果要完全搞懂hwmon子系统,则主要涉及vfs、sysfs、device设备驱动模型这几个子系统,需要详细了解这几个子系统的童鞋请参考我之前的文章)。

二、基于新版hwmon子系统的hwmon device实现

针对新版的hwmon子系统,实现一个hwmon device driver则更简单了,只需要实现如下两步:

  1. 针对该hwmon device每个通道的主要参数(如温度传感器的当前温度、最大温度、最小温度、最大报警温度、最小报警温度等),实现struct hwmon_chip_info、struct hwmon_ops、struct hwmon_channel_info类型变量即可;
  2. 调用devm_hwmon_device_register_with_info,即完成hwmon device的注册。

      实现以上两步即可完成hwmon device driver的实现,后面我将根据新版hwmon子系统实现的虚拟设备驱动放上来,由于我目前使用的ubuntu16.04内核版本是4.4的,尚不支持新版hwmon子系统接口,待我安装新版的linux内核,并调试完成基于新版hwmon子系统的虚拟设备驱动后,即将代码放在码云上,届时将把链接路径放出来。

 

 

 

   以上即为本章的主要内容,也是hwmon子系统的最后一篇文章,针对hwmon 子系统,还有一个基于hwmon子系统实现的pmbus driver,pmbus主要是针对电源管理芯片的,而这个电源管理芯片又集成了温度传感器、风扇等多个传感器。而pmbus也是属于一个hwmon device,但其底层是通过smbus总线与cpu进行通信的,针对pmbus driver,此处就不再介绍了,有兴趣的童鞋可以看下,pmbus有一整套协议,pmbus代码的难点不在代码实现,而在于对pmbu协议的理解。

 

本篇文章对应的链接地址为:https://gitee.com/jerry_chg/virt_hwmon_v2.0

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值