linux下s3c2440–i2c驱动学习之三"深入i2c,virt_hwmon: linux 虚拟hwmon 驱动实现,用于无开发板学习linux hwmon 子系统的驱动开发,涉及hwmon、i2...

virt_hwmon

介绍

linux 虚拟hwmon 驱动实现,用于无开发板学习linux hwmon 子系统的驱动开发,涉及hwmon、i2c、platform等驱动知识点

软件架构

软件架构说明

主要是借助linux hwmon子系统提供的接口,完成虚拟温度传感器驱动的创建(该虚拟温度传感器是一个i2c设备),因此该驱动的实现

主要包括如下几方面的内容:

1. 实现一个虚拟的i2c总线控制器;

2. 实现一个虚拟的i2c设备,用于模拟温度传感器,主要用于提供转换寄存器、配置寄存器,主要提供四路温度。

3. 实现一个虚拟的i2c驱动,用于和模拟温度传感器通信,主要实现配置温度采集及转换的channel、读取温度;

4. 实现一个虚拟的hwmon driver,该driver实现了四路温度的采集,实现temp_input,并实现show接口,而在show接口中,

通过与模拟温度传感器通信,完成温度的采集等功能。

5.通过实现platform device、platform driver,实现i2c adapter的注册操作。

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

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

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

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

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

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

0x0004表示第三路温度采集及转换;0x0008表示第四路温度采集及转换;

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

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

读取温度流程:

1. 向转换配置寄存器配置温度采集通道;

2. 设置要读取的寄存器地址(谢日寄存器值0x00)

3. 进行温度的读取操作

因为是模拟温度传感器,此处即模拟了温度采集,而没有模拟max_temp、min_temp、max_alarm_temp、min_alarm_temp、alarm_temp。

主要的数据结构如下:

typedef struct vir0511h_data_s

{

struct i2c_client *client;

struct mutex update_lock;

char valid;

unsigned long last_updated;

uint16_t temp_code[MAX_TEMP_NUM];

}vir0511h_data_t;

安装教程

在顶层目录执行make;make install命令,即可在./images中查看生成的驱动及应用程序

使用说明

在ubuntu16.04测试通过

install virtual_i2c_controller.ko

install vir0511h.ko

执行以上两步,即可在/sys/class/hwmon/下查找到对应的设备,名称为vir0511h

参与贡献

码云特技

使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md

GVP 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值