本项目旨在创建一个虚拟温度传感器驱动,该驱动模拟一个硬件温度传感器,但其返回值可以通过sysfs接口进行动态设置。这种类型的驱动在嵌入式系统开发和测试中非常有用,特别是在使用QEMU等虚拟化环境进行内核驱动开发和调试时。
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);
// 显示温度值
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);
操作 | 命令 | 描述 |
---|---|---|
读取温度 | cat /sys/class/virtual_temp/temp_sensor/temp |
显示当前温度值(单位为毫摄氏度) |
设置温度 | echo 30000 > /sys/class/virtual_temp/temp_sensor/temp |
设置温度为30摄氏度(30000毫摄氏度) |