linux驱动 — switch_dev类设备的使用

前言

在项目中碰到有人用switch_dev_register注册了switch_dev类设备,并且应用层能读到它的状态信息,感觉挺好奇,于是网上搜了些资料,自个又琢磨了一下,算是理解了,现在整理一下。

switch_dev是一个开关设备类,跟其它很多类一样的,像misc类,都是对一类设备的总称,使用起来很简单,大部分工作内核已经给你干了,通过switch_dev_register函数注册switch_dev类之后,系统会自动在/sys/class下生成你定义的文件夹,可以进入/sys/class/switch查看:
在这里插入图片描述
实际是链接到了/sys/device/virtual/switch/目录,都包含了name/power/state/subsystem/uevent,其中name是驱动中可以修改的设备名称,state是驱动中提供给用户空间的状态值。
在这里插入图片描述
驱动中可以直接调用switch_set_state来设置不同的状态值。对应地,应用层读取这个文件就可以实现状态获取。

代码实例

#include <linux/init.h>
#include <linux/module.h>
#include <linux/switch.h>
 
struct switch_dev sdev;
 
static int touch_switch(void)
{
    int state, ret;
    sdev.name = "touch";//注册之后就会在/sys/class/switch下生成相应名字命名的文件
	sdev.state = 0;
	sdev.index = 0;
	//注册switch_dev类设备
    ret = switch_dev_register(&sdev);
    if (ret < 0)
        return ret;
    state = 1;
    sdev.name = "hello";//这里改变的是switch文件下name的值,cat name可以看到
	//向用户态传递消息,应用层读取这个就能够实现状态获取。
    switch_set_state(&sdev, state);
    return 0;
}
 
static int touch_init(void)
{
	printk(KERN_ALERT "touch_init\n");
    if(touch_switch()) {
        printk(KERN_ERR "failed to create touch switch\n");
        return -ENODEV;
    }
	return 0;
}
 
static void touch_exit(void)
{
	printk(KERN_ALERT "exit\n");
}

module_init(touch_init);
module_exit(touch_exit);

MODULE_AUTHOR("mstar");
MODULE_DESCRIPTION("touch");
MODULE_LICENSE("GPL");

编译进内核,烧录程序后验证如下:
在这里插入图片描述

参考文献:
https://blog.csdn.net/kangear/article/details/37961151

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东皇※太一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值