从本章开始,我们进行hwmon子系统的分析,hwmon即hardware monitoring framework,硬件监视框架,包括温度传感器、风扇、电源等器件驱动的框架。hwmon子系统主要借助sysfs提供的api接口,实现对硬件监控器件的通信,也就是借助sysfs的文件创建的机制实现应用程序与hwmon器件的通信操作。
本章的主要内容如下:
一、说明sysfs中文件操作接口的简要说明,以及sysfs下文件的创建等;
二、linux hwmon子系统架构及不同内核版本下的架构优化。
一、sysfs相关简要说明
在之前的文章中,我们已经介绍了sysfs相关的框架,此处主要说明sysfs文件系统下文件访问的框架,如下图所示:
- 应用程序通过系统调用接口调用vfs接口,而vfs则调用sysfs文件系统注册的文件操作接口,如下图所示,主要为sysfs_open_file、sysfs_read_file、sysfs_write_file、sysfs_poll、generic_file_llseek、sysfs_release接口。
- 针对调用device_register接口注册的struct device类型的变量,其struct kobj_type类型变量为device_ktype,其操作接口指针为dev_sysfs_ops,主要用于读取和写入操作(dev_attr_show对应为读取、dev_attr_store为写操作),而在dev_attr_show、dev_attr_store中,则会通过文件的属性变量,获取到具体的store和show接口。而关于sysfs相关的数据结构间的关联,可参考我之前写的sysfs专栏和设备驱动模型专栏相关的文档。
- 另外sysfs是支持poll接口的,即sysfs_poll接口。若属性文件需要支持poll接口,则调用函数sysfs_notify即可。
而hwmon子系统则主要借助sysfs、设备驱动模块中设备创建和注册以及属性创建,完成属性的创建,从而完成在sysfs中创建文件,供应用程序对硬件监视器芯片的访问(如在sysfs中完成对温度传感器当前温度的读取等)
二、linux hwmon子系统架构及不同内核版本下的架构优化
在hwmon子系统中,主要即借助设备驱动模型中设备的注册以及设备属性的创建,即可针对一个硬件监视器芯片创建多个属性文件,从而应用程序即可在/sys目录下实现对文件的访问。
如下图所示,通过访问/sys/class/hwmon/hwmon0目录下的属性文件,即可对相关属性进行访问,此处主要查看当前温度内容。
Linux3.10的内核hwmon子系统实现
在linux3.10及之前的版本中,hwmon子系统实现的内容不是太多,也就是实现了一个hwmon class,然后提供了一个hwmon的注册接口hwmon_device_register(也就是对device_register的包裹),而各hwmon驱动,在调用hwmon_device_register注册之前调用sysfs_create_group完成属性参数的注册,并提供属性的store、show接口。此时的hwmon子系统略显单薄;
Linux4.x及之后版本的hwmon子系统实现
在之后的版本中,hwmon子系统的内容渐渐丰富起来,而不再只做对device_register的包裹,其提供了通用硬件监控参数的抽象,主要提供了接口hwmon_attr_show、hwmon_attr_store,同时抽象了针对温度芯片、风扇芯片、电源芯片等硬件监控芯片相关参数的支持,即温度芯片、风扇芯片、电源芯片等硬件监控芯片相关参数的访问接口,均会在接口hwmon_attr_show、hwmon_attr_store中被统一调用,而温度芯片、风扇芯片、电源芯片等硬件监控芯片只需要实现hwmon_ops类型函数指针即可。调用关系如下所示,其中,HWMON子系统层则为hwmon子层抽象的部分,而最下层则由具体的hwmon 设备驱动实现即可。
以上即为本章的内容,hwmon子系统的功能还是比较明确的。通过上面两幅图可以大致理解hwmon的实现流程。当然了,我们实现其他的设备驱动也可以借助设备驱动模型、sysfs提供的接口,在sysfs下创建属性文件及其操作接口,实现在sysfs目录下访问具体设备。