Linux hwmon子系统分析之二 hwmon driver开发实践

在上一篇文章中,我们分析了hwmon子系统框架。针对hwmon子系统而言,在linux内核4.4及之前

 

版本中,hwmon子系统核心功能并不多,仅仅是创建一个device类型的变量,并加入到class hwmon中,而linux 内核4.14及之后版本,针对hwmon子系统做了很多的强化,定义了统一的show/store接口,而具体的hwmon driver只需要实现hwmon_chip_info、hwmon_channel_info、hwmon_ops类型的变量,并实现对应的read/write接口,即可完成temp、fan、curr等芯片属性操作的sysfs文件的注册。而本章主要介绍内核4.4及之前版本hwmon子系统的内容,并实现一个虚拟的温度传感器驱动。本章的内容如下:

一、简要说明linux4.4及之前版本hwmon 子系统的框架;

二、hwmon driver开发流程说明

三、实现一个虚拟的温度传感器驱动

 

 

linux4.4及之前版本hwmon 子系统的框架

针对4.4及(4.5-4.14的内核版本我没有下载,不确定4.5-4.14版本中哪一个版本对hwmon子系统做

了优化),hwmon子系统的架构如下,主要借助sysfs文件系统及相关接口、设备驱动模型中class、device相关的接口,实现了针对hwmon芯片各主要参数的访问。如下图所示,针对hwmon子系统驱动而言,需要做的内容如下:

  1. 针对每一个hwmon芯片的参数,均实现struct sensor_device_attribute或sensor_device_attribute类型的变量(包括index、struct device_attribute类型变量(主要实现读写访问接口))

 

hwmon driver开发流程说明

针对hwmon driver的开发流程,其实现步骤大致如下:

  1. 为该hwmon的主要参数(如温度传感器的当前温度、最大温度、最小温度、最大报警温度、最小报警温度等),均实现struct sensor_device_attribute或sensor_device_attribute类型的变量,并提供针对该参数的读写方法(show、store);
  2. 调用devm_hwmon_device_register_with_groups,完成hwmon device的注册。

 

实现以上两步就完成了hwmon driver的开发,相对来书hwmon driver的开发真容易。

 

 

实现一个虚拟的温度传感器驱动

纸上得来终觉浅,因此我们还是要练习一下的。此处练习并不需要硬件开发板,便可以完成hwon

driver的实现。

所需环境:一台运行linux系统的PC。

 

温度传感器通信方式及寄存器定义

既然我们要模拟一个温度传感器,还是需要对温度传感器做简要说明的。

我们的虚拟传感器是一个i2c设备,该温度传感器支持4路温度采集

该温度传感器的寄存器定义如下:

0x00 表示转换寄存器,用于进行温度转换,该寄存器值为16bit;

0x01 表示配置寄存器,用于配置当前进行哪一路温度采集及转换,其中0x0001表示第一路温度采集及转换;0x0002表示第二路温度采集及转换;0x0004表示第三路温度采集及转换;0x0008表示第四路温度采集及转换;

0x02 表示状态寄存器,用于表示温度转换是否完成,其中0x0001表示处于温度转换中;0x0000表示温度转换完成。

该温度传感器的地址为0x30(7bit)

读取温度流程:

  1. 向转换配置寄存器配置温度采集通道;
  2. 设置要读取的寄存器地址(谢日寄存器值0x00)
  3. 进行温度的读取操作

因为是模拟温度传感器,此处即模拟了温度采集,而没有模拟

max_temp、min_temp、max_alarm_temp、min_alarm_temp、alarm_temp,请读者自行增加完成。

 

 

代码实现知识说明

本次驱动开发涉及以下知识点,如对以下知识点不熟悉,请参考我之前的专栏文档。

  1. 实现一个虚拟的i2c总线控制器;
  2. 实现一个虚拟的i2c设备,用于模拟温度传感器,主要用于提供转换寄存器、配置寄存器,主要提供四路温度。
  3. 实现一个虚拟的i2c驱动,用于和模拟温度传感器通信,主要实现配置温度采集及转换的channel、读取温度;
  4. 实现一个虚拟的hwmon driver,该driver实现了四路温度的采集,实现temp_input,并实现show接口,而在show接口中,通过与模拟温度传感器通信,完成温度的采集等功能。
  5. 通过实现platform device、platform driver,实现i2c adapter的注册操作。

 

 

数据结构说明

定义vir0511h_data_t结构体,其中包含了i2c_client,该i2c_client即为模拟的温度传感器;

而valid表示temp_code中的值是否有效;

last_updated用于表示上一次更新的时间,temp_code的更新周期为jiffes;

temp_code用于存储读取的四路温度;

update_lock用于对temp_code的同步。

 

模拟的i2c总线控制器驱动

针对模拟的i2c总线控制器驱动,之前已经实现,此处不再细说,以免喧宾夺主,模拟i2c总线及i2c设备的数据结构定义如下:

    针对每一个模拟的温度传感器,其支持16个寄存器,每一个寄存器的值用16bit表示,而last_access_reg记录上一次访问的寄存器地址,主要用于标记读取数据时,读取哪一个寄存器的值;而node则实现将该i2c client链接至模拟的i2c总线控制器;

     而模拟的i2c总线控制器,则主要链接所有注册到控制器的i2c client的私有数据,当i2c总线控制器接收到某一个i2c client访问请求后,则将读或写反应至每一个虚拟的i2c client的私有数据上。

代码实现如下:

     首先借助platform device、platform driver,完成模拟 i2c adapter的注册,从而保证在platform driver的probe接口中,完成i2c adapter的注册

 

I2c adapter的注册代码如下:

  1. 该i2c adapter的算法接口为virtual_i2c_algo;
  2. 调用i2c_add_adapter完成模拟i2c 总线控制器的注册;
  3. 调用i2c_new_device,完成模拟温度传感器的注册。

 

 

模拟温度传感器驱动

 

因为模拟温度传感器是一个i2c设备,因此模拟温度传感器驱动则是一个i2c驱动,定义如下:

  1. 该i2c driver支持的i2c设备的id为“vir0511h”,和上面注册i2c client的type值是一致的;
  2. 在i2c driver的probe接口vir0511h_ctl_probe中,完成hwmon device的注册
  3. 调用i2c_add_driver,完成i2c driver的注册

vir0511h_ctl_probe接口的定义

     该接口主要调用devm_hwmon_device_register_with_groups,完成hwmon device的注册,并根据传入的vir0511h_groups,实现温度参数对应sysfs文件的创建操作。

 

模拟HWMON驱动

     主要是完成sensor_device_attribute类型变量的定义,主要定义了四个温度参数,包括temp1_input、temp2_input、temp3_input、temp4_input,而vir0511h_update_client则主要用于更新四路温度参数(更新周期为jiffes),该函数由show_temp调用,而show_temp根据sensor_device_attribute类型变量变量中的index成员,确定获取哪一个通道的温度。

 

 

测试验证

  1. insmod virtual_i2c_controller.ko,完成i2c adapter、i2c client驱动的insmod;
  2. insmod vir0511h.ko,完成i2c driver、hwmon device驱动的insmod;

完成以上步骤后,则在/sys/class/hwmon上即可查看我们注册的hwmon device,如下所示

已经完成了四路温度参数获取的文件:temp1_input…

查询下温度:

 

以下是打开四个文件依次获取温度的测试:

 

 

   以上便是本篇文章的主要内容,本章主要实现了一个虚拟的温度传感器驱动,主要涉及hwmon driver、 i2c driver、 i2c adapter、 platform device等子系统模块,也算是对i2c、hwmon、platform驱动模型的开发流程实现。

 

 

本篇文章相关的测试代码已在ubuntu1604上完成验证,地址如下:

https://gitee.com/jerry_chg/virt_hwmon

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值