虚拟温度传感器驱动开发

项目概述

本项目旨在创建一个虚拟温度传感器驱动,该驱动模拟一个硬件温度传感器,但其返回值可以通过sysfs接口进行动态设置。这种类型的驱动在嵌入式系统开发和测试中非常有用,特别是在使用QEMU等虚拟化环境进行内核驱动开发和调试时。

用户空间 sysfs接口 内核空间 虚拟温度传感器驱动

驱动功能特性

系统架构

用户应用程序 (通过sysfs交互) Linux内核空间 Sysfs接口 虚拟温度传感器驱动

关键数据结构

struct virtual_temp_sensor {
    struct device *dev;
    int current_temp;      // 当前温度值
    struct mutex lock;     // 互斥锁,保护数据访问
};

驱动实现代码

模块初始化和退出

static int __init virtual_temp_init(void)
{
    int ret;
    
    // 分配设备结构
    sensor_data = kzalloc(sizeof(struct virtual_temp_sensor), GFP_KERNEL);
    if (!sensor_data)
        return -ENOMEM;
    
    mutex_init(&sensor_data->lock);
    sensor_data->current_temp = 25000; // 默认25摄氏度
    
    // 创建设备类和设备节点
    ret = create_sysfs_interface();
    if (ret) {
        kfree(sensor_data);
        return ret;
    }
    
    pr_info("虚拟温度传感器驱动加载成功\n");
    return 0;
}

static void __exit virtual_temp_exit(void)
{
    remove_sysfs_interface();
    kfree(sensor_data);
    pr_info("虚拟温度传感器驱动卸载成功\n");
}

module_init(virtual_temp_init);
module_exit(virtual_temp_exit);

Sysfs接口实现

// 显示温度值
static ssize_t temp_show(struct device *dev, 
                        struct device_attribute *attr, char *buf)
{
    struct virtual_temp_sensor *sensor = dev_get_drvdata(dev);
    int temp;
    
    mutex_lock(&sensor->lock);
    temp = sensor->current_temp;
    mutex_unlock(&sensor->lock);
    
    return sprintf(buf, "%d\n", temp);
}

// 设置温度值
static ssize_t temp_store(struct device *dev, 
                         struct device_attribute *attr,
                         const char *buf, size_t count)
{
    struct virtual_temp_sensor *sensor = dev_get_drvdata(dev);
    int temp, ret;
    
    ret = kstrtoint(buf, 10, &temp);
    if (ret)
        return ret;
    
    mutex_lock(&sensor->lock);
    sensor->current_temp = temp;
    mutex_unlock(&sensor->lock);
    
    return count;
}

// 定义设备属性
static DEVICE_ATTR_RW(temp);

Sysfs操作示例

操作 命令 描述
读取温度 cat /sys/class/virtual_temp/temp_sensor/temp 显示当前温度值(单位为毫摄氏度)
设置温度 echo 30000 > /sys/class/virtual_temp/temp_sensor/temp 设置温度为30摄氏度(30000毫摄氏度)

测试方法

  1. 编译并加载驱动模块
  2. 检查sysfs接口是否创建成功
  3. 使用echo命令设置温度值
  4. 使用cat命令读取温度值验证设置
  5. 尝试设置边界值测试错误处理
注意:在实际硬件上运行时,需要确保有适当的权限访问sysfs文件。在QEMU虚拟环境中,可以安全地进行测试和调试。

应用场景