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 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目